GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
141 KB
52 KB
|
119ms
103ms
|
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
|
8ms
8ms
|
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
|
8ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
8ms
5ms
|
Script
application/javascript |
151.101.14.217
Fastly
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-173ae7134f.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
10ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-5871470d6d.css
www.giga.de/static-local/dist/assets/css/
|
356 KB
49 KB
|
11ms
9ms
|
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
|
38ms
15ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.f1bbc04dfb148c8496847212fb317059.js
Show response
js.stroeermediabrands.de/
|
257 KB
62 KB
|
34ms
12ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
28ms
12ms
|
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/
|
96 KB
35 KB
|
20ms
17ms
|
Script
text/javascript |
2a00:1450:4001:824::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:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 9bd30b1e43178f3f44cea73f2c0a38523a0f68d791c37f9a152fa15f56dd302f
- 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
|
15ms
13ms
|
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
|
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
|
16 KB
17 KB
|
21ms
18ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.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
- a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
- 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
|
21ms
19ms
|
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
|
AnyDesk-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2017/10/
|
6 KB
6 KB
|
14ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2017/10/AnyDesk-Artikelbild-rcm200x113.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
- 38306a61050b744f5681bff474aebdff051ae5682ddb4e84b414b56abd4c2ee2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
FreeFileSync-rcm200x113.jpg
static.giga.de/wp-content/uploads/2018/03/
|
7 KB
8 KB
|
9ms
7ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2018/03/FreeFileSync-rcm200x113.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
- c7e6b1dcc86227fc39b041454dbe6fbbab2efee73f711d5c9e9e420f605d9415
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
CrystalDiskInfo-Artikelbild-1-rcm200x113.jpg
static.giga.de/wp-content/uploads/2018/08/
|
7 KB
8 KB
|
15ms
13ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2018/08/CrystalDiskInfo-Artikelbild-1-rcm200x113.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
- d6cbd7921bed348f24d7aed7d9b3c0f1b63c160b79a120a67bd03a9e9fba0dd1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
|
6 KB
6 KB
|
14ms
13ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
27 KB
10 KB
|
23ms
1ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
11ms
11ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
323 B
|
18ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
201 B
|
18ms
7ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tag.min.js
Show response
get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/
|
70 KB
16 KB
|
49ms
7ms
|
Script
text/javascript |
2600:9000:2057:4600:1f:287:d20a:ce1
Amazon.com
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-173ae7134f.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
75 KB
22 KB
|
7ms
6ms
|
Script
application/javascript |
143.204.211.231
Amazon.com
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
918 B
|
39ms
25ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
36ms
15ms
|
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.35431883175537715
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000c&i2=000cfc637ad275a515d7b5536&ep=1593875152&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000c&i2=000cfc637ad275a515d7b5536&ep=1593875152&vr=415&i...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
11ms
10ms
|
Image
image/gif |
91.215.103.65
INFONLINE-AS
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
9 KB
10 KB
|
8ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 4364
|
9 KB
3 KB
|
43ms
24ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
8ms
7ms
|
XHR
application/javascript |
143.204.211.231
Amazon.com
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
10ms
10ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
85 KB
28 KB
|
24ms
24ms
|
Script
application/javascript |
2a00:1450:4001:825::200e
Google LLC
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
31ms
6ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.3505313714111349
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 8295
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
16ms
16ms
|
Document
text/html |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
40 KB
13 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- Requested by
- Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.f1bbc04dfb148c8496847212fb317059.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e1ba287125c479a4febea7faddf96e9c99c7f6f54aaea9e1780852cf8af9611c
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
505 B
|
94ms
94ms
|
XHR
text/javascript |
143.204.211.231
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=9143160348451568363830852&cb=3482161168721568363830955&ws=1600x1200&v=7.36.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.211.231
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-211-231.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 3320fb56f2fec9e760965a2ac7eb6bc6914270c6b7440cfcd0b652bbbab6d46c
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
269 KB
84 KB
|
49ms
8ms
|
Script
application/javascript |
143.204.214.51
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
24ms
11ms
|
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
597 B
|
41ms
36ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
rc
Show response
si.nuggad.net/
|
2 KB
1 KB
|
130ms
25ms
|
Script
text/javascript |
80.82.201.88
UNBELIEVABLE-AS
|
|
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
138 B
449 B
|
85ms
33ms
|
Image
image/png |
18.195.39.206
Amazon.com
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
14ms
14ms
|
Script
application/javascript |
2a00:1450:4001:824::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:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:818::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:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/
|
222 KB
82 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 794fe0486515f44881ce168acf0fb4ba478b6971fe3448ae96176f50075fadca
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/
Frame 9627
|
222 KB
82 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 794fe0486515f44881ce168acf0fb4ba478b6971fe3448ae96176f50075fadca
- 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/r20190911/r20190131/
Frame F5F0
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20190911/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:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
post-4c71d5d921.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
9ms
9ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-6b59f15322.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
10ms
10ms
|
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
9ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
beacon.min.js
Show response
beacon.s-onetag.com/
|
18 KB
6 KB
|
65ms
7ms
|
Script
application/javascript |
2600:9000:20bb:5200:5:9a4c:9b00:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
fpi.js
Show response
ap.lijit.com/www/delivery/
Frame C71B
|
5 KB
3 KB
|
70ms
12ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
- Requested by
- Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 1d620a0f7dc002fca2d94bf2da586b9198b9fa94a3b53e9eeb069833081f119d
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
33ms
33ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
52 KB
17 KB
|
78ms
23ms
|
Script
application/javascript |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
videojs-02e1d46d.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 4364
|
618 KB
206 KB
|
28ms
28ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 4364
|
256 KB
87 KB
|
40ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81a::200a
Google LLC
|
|
|
GET
H2
|
200
|
pubads_impl_2019091201.js
Show response
securepubads.g.doubleclick.net/gpt/
|
157 KB
58 KB
|
42ms
38ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb59.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
12ms
1ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/bb-mx/submit?/J1/wBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSxSBPAAAAAAAAAOAAAAGAAAAAAAZwSxSBBRksFAQtjFVZm9SA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
11ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
10ms
9ms
|
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=1568363831067&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 4364
|
53 KB
15 KB
|
8ms
8ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 4364
|
1015 B
1 KB
|
9ms
8ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
204
|
a
www.googletagmanager.com/
|
0
130 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:819::2008
Google LLC
|
|
General
- Full URL
- https://www.googletagmanager.com/a?id=GTM-KRW4T6J&cv=46&t=ol&g=209&p=ga&l=201&q=117&f=27&e=173&i=35&d=114&c=245&sr=0.050000&ps=0.02079243646442408&cb=1498951813
- 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:819::2008
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Google Tag Manager /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
101 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=152266267&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=1818219464&gjid=1624740779&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=451195333
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=1519997322
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 33CC
|
0
0
|
330ms
330ms
|
Document
text/html |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1568363831&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=1568363830972&bpp=11&bdt=220&fdt=174&idt=174&shv=r20190911&cbv=r20190131&saldr=aa&abxe=1&correlator=415042108830&frm=20&pv=2&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&ga_fc=0&iag=0&icsg=52079358880&dssz=56&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=2707494302&ifi=1&uci=1.41pk08angu7o&fsb=1&xpc=oKXc4IRjQl&p=https%3A//www.giga.de&dtd=188
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
76 KB
28 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:824::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/r20190911/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
38ms
16ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
503 B
|
89ms
88ms
|
XHR
text/javascript |
143.204.211.231
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=9143160348451568363830852&cb=3010321037781568363831202&ws=1600x1200&v=7.36.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.211.231
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-211-231.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- bd18a6f807406f321e7ee81e8e4e19890ebc33df1cd136d46b22d894f0144f6e
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
24 B
900 B
|
102ms
89ms
|
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%2212d554f2258211%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2221eed34d97d9e6%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%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
- a2c366aa8391d21ebef20168baf46a06dda027007d0745cf85741d7318295654
|
GET
H2
|
200
|
ADTECH;apid=1Aae0df374-d601-11e9-b84b-0252ef7879ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;cfp=1;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Aae0df374-d601-11e9-b84b-0252ef7879ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
|
47 B
267 B
|
15ms
14ms
|
XHR
application/json |
152.199.21.32
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Aae0df374-d601-11e9-b84b-0252ef7879ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1568363831211
- 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_256_GCM
- Server
-
152.199.21.32
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- 662831879bdbc4f42424d6f14598e0b8e9a5fe8712514ee52143f3b1ae0d4b27
|
GET
H2
|
200
|
ADTECH;apid=1Aae0e400e-d601-11e9-ae0d-02599a0636ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;cfp=1;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1568363831;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Aae0e400e-d601-11e9-ae0d-02599a0636ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
|
48 B
241 B
|
15ms
15ms
|
XHR
application/json |
152.199.21.32
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Aae0e400e-d601-11e9-ae0d-02599a0636ac;cfp=1;rndc=1568363830;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1568363831211
- 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_256_GCM
- Server
-
152.199.21.32
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- 3b23054f385ff046b52da49f09543ca2a464820efb8f01a8cbbf0d999eaa4460
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
55ms
54ms
|
XHR
application/json |
69.173.144.142
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=1f6e2c9c-5e78-438b-9c1d-6f12845f4a0d&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.47580945317707557
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- e3636151f0d2d72818ea36045a5c802a701eeb257644465d2a4ad70a6305c939
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
49ms
48ms
|
XHR
application/json |
69.173.144.142
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=318ac019-0135-4751-86a7-1ce5ac26d0b0&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.36526899813146785
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- ae71e7fca9bdcd8f67f80101dfb15e325b9f38c43e46de5c28b268268c8feced
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
87ms
57ms
|
XHR
application/json |
69.173.144.142
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=dbb92e08-4259-47b7-b7d3-24f67730f69d&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8570532794895258
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 1cffe994afb339e309c26d549a5672bc88ebb4d0b3389f970be98bf6049f08ed
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
113 B
|
42ms
13ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
30ms
28ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=1f6e2c9c-5e78-438b-9c1d-6f12845f4a0d%2C318ac019-0135-4751-86a7-1ce5ac26d0b0%2Cdbb92e08-4259-47b7-b7d3-24f67730f69d&nocache=1568363831216&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.161.0 /
- Resource Hash
- 92f513cad9ff11510e5454cba0bc05fa7a90cacd8b39f9fb0fd7838605559be5
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
1 KB
2 KB
|
31ms
30ms
|
XHR
application/json |
37.252.173.27
AppNexus
|
|
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
10 B
405 B
|
55ms
54ms
|
XHR
application/json |
37.157.6.253
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTFmNmUyYzljLTVlNzgtNDM4Yi05YzFkLTZmMTI4NDVmNGEwZA%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPWRiYjkyZTA4LTQyNTktNDdiNy1iN2QzLTI0ZjY3NzMwZjY5ZA%3D%3D&pt=gross&stid=a7fc88b5-3fff-4b40-a390-7776267ec22d&fd=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.253
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- s1.adform.net
- Software
-
nginx /
- Resource Hash
- 78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
|
GET
H2
|
200
|
lOyU-OCKINPe2.gif
www.giga.de/imagez/adbanner2/
|
71 B
474 B
|
35ms
35ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame 4EB5
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
|
196ms
195ms
|
Document
text/html |
52.94.218.7
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.218.7
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
platform.js
Show response
apis.google.com/js/
|
43 KB
17 KB
|
44ms
29ms
|
Script
application/javascript |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://apis.google.com/js/platform.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-173ae7134f.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
5ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=874416392
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
9ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=525889190
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=1549785715
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
8ms
8ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1177503448
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1794271327
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
7ms
7ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=2085867066
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1179138585
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 948F
|
0
0
|
29ms
28ms
|
Document
text/html |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1568363831&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=1568363830983&bpp=4&bdt=231&fdt=278&idt=278&shv=r20190911&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=415042108830&frm=20&pv=1&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&ga_fc=0&iag=0&icsg=833269741600&dssz=60&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&osw_key=4077977667&ifi=1&uci=1.vj96d81kc41j&fsb=1&dtd=283
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190911/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:815::200a
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
sync
Show response
ap.lijit.com/
Frame C71B
|
49 KB
16 KB
|
53ms
30ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1100301642
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
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
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
11 KB
5 KB
|
319ms
319ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=413171460903080&correlator=635864758811418&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21064601%2C21063635%2C21063964%2C21064439&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D8%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D562f6e0592a50266d82bbdd8627b2056%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568363831&dt=1568363831323&dlt=1568363830752&idt=551&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=62&icsg=13332315865312&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2dcadfbf3cb2289d13410e259b221f9f7815d2877ef8a4fb271ac5accd6edde2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091201.js
Show response
securepubads.g.doubleclick.net/gpt/
|
62 KB
24 KB
|
39ms
38ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
|
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
293ms
293ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=413171460903080&correlator=635864758811418&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21064601%2C21063635%2C21063964%2C21064439&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&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%3D8%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D562f6e0592a50266d82bbdd8627b2056%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568363831&dt=1568363831336&dlt=1568363830752&idt=551&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=13332315865312&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&fws=640&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 732b00bf442b9e5abd0da8f00874bcf39e8d24487e44754cbcae0a5cd3d0a1fc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 4364
|
30 KB
30 KB
|
37ms
20ms
|
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: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
15 KB
5 KB
|
666ms
666ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=413171460903080&correlator=635864758811418&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21064601%2C21063635%2C21063964%2C21064439&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cfufrad%2Cfloor&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D8%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D562f6e0592a50266d82bbdd8627b2056%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568363831&dt=1568363831381&dlt=1568363830752&idt=551&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1797203554&uci=3&ifi=4&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=13332315865312&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 1f6485f6195ee62977b95b9c83be099fccd1d96b49fe2c745feb18e0e47b7021
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
10 KB
5 KB
|
659ms
659ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=413171460903080&correlator=635864758811418&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21064601%2C21063635%2C21063964%2C21064439&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D8%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D562f6e0592a50266d82bbdd8627b2056%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568363831&dt=1568363831390&dlt=1568363830752&idt=551&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1819065434&uci=4&ifi=5&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=13332315865312&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 6839c2ac75e498a7b30b54255cd82ed3c5ccc05725820a91054365be0b388a5d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
911ms
911ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=413171460903080&correlator=635864758811418&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21064601%2C21063635%2C21063964%2C21064439&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D8%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D562f6e0592a50266d82bbdd8627b2056%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568363831&dt=1568363831397&dlt=1568363830752&idt=551&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3179048887&uci=5&ifi=6&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=13332315865312&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=130780938.1568363831&ga_sid=1568363831&ga_hid=152266267&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 856ec2798ca96e3fccd580167bf40b38a4addaf33d838d7387faa4f60f1e7e42
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
21ms
6ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
16ms
15ms
|
Stylesheet
text/css |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
impl.20190911-24-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
393 KB
111 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
|
7ms
7ms
|
Script
application/x-javascript |
23.43.115.95
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
5ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=922144103
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
59 KB
15 KB
|
23ms
5ms
|
Script
text/javascript |
151.101.113.194
Fastly
|
|
|
GET
BLOB
|
200
OK
|
0c396880-928c-4285-be2c-b006b66cf32f
https://videos.giga.de/
Frame 4364
|
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 4364
|
53 B
642 B
|
31ms
11ms
|
XHR
application/json |
52.219.73.107
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 4364
|
265 B
436 B
|
7ms
7ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
27ms
11ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:2a
Highwinds Network...
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4364
|
653 B
1 KB
|
51ms
7ms
|
XHR
application/json |
143.204.214.42
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
adcfg
Show response
ap.lijit.com/
Frame C71B
|
158 B
566 B
|
36ms
12ms
|
Script
application/x-javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
22ms
22ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n2=3&n3=1&n4=3&n5=3&n6=2&n7=1&n8=1&n9=3&n10=2&n11=1&n12=1&n17=4&n18=2&n20=2&n21=4&n22=4&n39=4&n43=4&n44=3&n46=4&n47=4&n48=4&n55=4&n57=4&n60=3&n67=1&n70=5&n71=1&n75=0&n76=1&n77=0&n78=0&n79=1&n80=0&n81=0&n82=0&n83=0&n84=0&n85=0&n86=0&n87=0&n88=1&n117=4&n118=3&n119=6&n120=2&n121=1&n122=1&n123=2&n127=0&n128=1&n133=1&n95=1&n96=1&n135=9&n15=1&n66=1&n89=1&n90=1&n91=1&n92=3&n93=4&n94=2&n97=1&n98=1&n101=1&n104=1&n106=1&n108=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n148=1&n149=1&n154=1&n155=1&n156=1&n158=1&n159=1&n161=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201908291025/
|
25 KB
10 KB
|
17ms
5ms
|
Script
application/javascript |
151.101.113.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 92f5fdb2be157bac1c050ae74fdd9269b35c817ea16931ae9998c2dc27bfd0c4
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
195ms
194ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=10%3A37%3A11.655<i=deflated&data=%7B%22id%22%3A73%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%3A1568363831603%2C%22cv%22%3A%2220190911-24-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A5187%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%3A3738.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.20190911-24-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
- 442d9d314760bead3211eaafcb93d6ee3fba274c2f2db3f736cb7198a57e287d
|
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=1568363831657&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=1568363831657&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
|
7ms
6ms
|
Image
text/plain |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1568363831657&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
8 KB
2 KB
|
35ms
35ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 4364
|
202 KB
59 KB
|
7ms
6ms
|
XHR
application/javascript |
143.204.214.42
Amazon.com
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 58C0
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssYUb_Erddm4NYiFQwIo7812fseyADUZ2QP3GAk75_Ao1WDVaps-1cfvajhya2tEarzJIH9bvdnCx1PAM-MxxAb19jHBX-tRSguI9DEuX05Yw5cAOxJuGDFoO_rgvKGXIeT5UQt8IiVH...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
36ms
11ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 4E21
|
0
58 B
|
17ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu0-0F3BN77BclM-dgBivrGn8VfsLa45KMLeKaTocXzeMdiAbJsaJONuise0l973XG2SfwTW_HugilBQZP08mAbj8NOYeHYZbJ7mP-xOvqGltb7hi7aLiMDxHzOO-aIpB9_Iisq-9NrjGycJszbx7rljqeJcL8Si3Wk5mBO749mIGXy4EaM6H0aVH4ffaTZWWi8oJvRcM_QAPXDOoJa26Rk7DOOt15MLrYDRIhjM97gi2OMaO7pCHe3jQVm1vWyl3F6A4hV_z4s1syF8MmNukguzQ&sig=Cg0ArKJSzCHu-smAMtB3EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame 4E21
|
108 KB
108 KB
|
26ms
6ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 4E21
|
75 KB
28 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:824::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_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
49 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=800x450%7C580x500%7C580x360%7C42x31&w=800&h=450
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
addelivery
Show response
ap.lijit.com/
Frame C71B
|
4 KB
2 KB
|
60ms
35ms
|
Script
application/x-javascript |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/addelivery?zoneid=600632&tid=m_600632_45532139e81c4e8bbf3679b772028ca8&cb=30159233&mode=1&flv=0.0.0&ifr=true&od=www.giga.de&time=08%3A37%3A11&fd=1&be=sf&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&orig_loc=http%3A%2F%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&abf=true&dpz=false&cv=7a34ad2&dop=0&ndw=1&spif=true&btid=m_600632_45532139e81c4e8bbf3679b772028ca8&iv=sf
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/sync
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5d34aed5d72936e2857c26ca39adaf36b913d9459e489d9b1450036fa34b04cc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 4364
|
202 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
sovrn_standalone_beacon.js
Show response
ap.lijit.com/www/sovrn_beacon_standalone/
Frame C71B
|
4 KB
2 KB
|
37ms
13ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 4E21
|
43 B
400 B
|
7ms
6ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 4E21
|
43 B
400 B
|
12ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 4E21
|
43 B
400 B
|
17ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
603 B
|
90ms
70ms
|
XHR
application/json |
104.111.246.233
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 4E21
|
12 KB
12 KB
|
12ms
7ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg495290235&startmuted=1&cb=0.873889164616702&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 06bb0cf1f50c80214da364e7d78896cafcb1299643cee50320173985b0c81668
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 4E21
|
43 B
307 B
|
10ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 4E21
|
1 KB
1 KB
|
103ms
29ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=6b2231e7ae&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- 3fe01ed3233e7c570a8c116f864cfc8743e8374a2a611f8f72582204976a67e9
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 4E21
|
43 B
400 B
|
5ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.2716835061607694&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
GET
H/1.1
|
200
OK
|
Cookie set
beacon
gslbeacon.lijit.com/
Frame 1826
Redirect Chain
-
https://gslbeacon.lijit.com/beacon?viewId=m_600632_45532139e81c4e8bbf3679b772028ca8&rand=3656&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so...
-
https://gslbeacon.lijit.com/beacon?viewId=m_600632_45532139e81c4e8bbf3679b772028ca8&rand=3656&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so...
|
0
0
|
14ms
14ms
|
Document
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://gslbeacon.lijit.com/beacon?viewId=m_600632_45532139e81c4e8bbf3679b772028ca8&rand=3656&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2&dnr=1
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/sync
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
|
GET
H/1.1
|
200
OK
|
containertag
Show response
ap.lijit.com/
Frame C71B
|
56 KB
7 KB
|
39ms
15ms
|
Script
text/html |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
impression
vap3ams1.lijit.com/addelivery/
Frame C71B
|
43 B
564 B
|
55ms
12ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://vap3ams1.lijit.com/addelivery/impression?bannerid=214932&campaignid=232&cb=30159233&tid=m_600632_45532139e81c4e8bbf3679b772028ca8&zoneid=600632&cids=232&bids=214932&tss=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
fp
vap3ams1.lijit.com/data/
Frame C71B
|
43 B
207 B
|
58ms
12ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://vap3ams1.lijit.com/data/fp?tid=m_600632_45532139e81c4e8bbf3679b772028ca8&zoneid=600632&starttime=1568363831555&adcfg=4&adcfg_response=133&addelivery=136&addelivery_response=234&lgfired=318&beacon=321&container=323&EOL=324&ctstart=321&elapsed_ms=324
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
podlogging
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
30 KB
30 KB
|
360ms
353ms
|
Script
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=13a84ac7-135b-4347-b50f-d0bed2f9ea16-tuct474dab7&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1568363831888&tagid=&cntry=DE&platform=1&sesid=76d184186a161c579b07d3fa834ddb67&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1568363831603&geolat=&geoing=&deviceifa=&appid=&sd=v2_76d184186a161c579b07d3fa834ddb67_13a84ac7-135b-4347-b50f-d0bed2f9ea16-tuct474dab7_1568363831_1568363831_CNawjgYQrMVBGLPCk87SLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=853049b64759fcfbc666f9f8fe58878e&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- ab0acc5efcec79c1da64382dc76b4e651051fcf34aef688d8cd2a7d34eb19f08
|
GET
H2
|
200
|
feed-card-placeholder.20190911-24-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
6ms
6ms
|
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
6ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20190911-24-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 EB20
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=a242b424-6ec4-4b30-a6db-5d104f9a81fd
|
0
168 B
|
67ms
13ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=a242b424-6ec4-4b30-a6db-5d104f9a81fd
- 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 EB20
|
0
239 B
|
12ms
11ms
|
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 EB20
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=MBIlj3p6qopdM6kzsrkZXIMqEESosvsUNnSznO5-oF8%3D
|
45 B
222 B
|
67ms
13ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=MBIlj3p6qopdM6kzsrkZXIMqEESosvsUNnSznO5-oF8%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
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame EB20
|
43 B
691 B
|
27ms
11ms
|
Image
image/gif |
37.252.173.27
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame EB20
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm=&google_sc=&google_tc=
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEOPJBbXA--_rbEDfJ43vtXg&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEOPJBbXA--_rbEDfJ43vtXg&tbid=83b66293-abea-4be0-96bf-a51edb5f6755-tuct474dab8&query=taboola_hm%3DCAESEOPJBbXA--_rbEDfJ43vtXg%26goo...
|
0
76 B
|
54ms
53ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEOPJBbXA--_rbEDfJ43vtXg&tbid=83b66293-abea-4be0-96bf-a51edb5f6755-tuct474dab8&query=taboola_hm%3DCAESEOPJBbXA--_rbEDfJ43vtXg%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 EB20
|
43 B
691 B
|
27ms
11ms
|
Image
image/gif |
37.252.173.27
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame EB20
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=266276d3-c8d0-4a3c-bc9a-e7e3b0f242a0
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=266276d3-c8d0-4a3c-bc9a-e7e3b0f242a0&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3D266276d3-c8d0-4a3c...
|
0
52 B
|
41ms
40ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=266276d3-c8d0-4a3c-bc9a-e7e3b0f242a0&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3D266276d3-c8d0-4a3c-bc9a-e7e3b0f242a0
- 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 EB20
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=13a84ac7-135b-4347-b50f-d0bed2f9ea16-tuct474dab7
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=a9e221a7-adc3-4401-b6f0-ac7bbb25e2d4
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=a9e221a7-adc3-4401-b6f0-ac7bbb25e2d4&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3Da9e221a7-adc3-4401-b6...
|
0
52 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=a9e221a7-adc3-4401-b6f0-ac7bbb25e2d4&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3Da9e221a7-adc3-4401-b6f0-ac7bbb25e2d4
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame EB20
|
35 B
380 B
|
416ms
97ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame EB20
|
0
292 B
|
381ms
160ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame EB20
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola
-
https://x.bidswitch.net/sync?dsp_id=119&user_id=1870471592723090393&expires=30&ssp=taboola
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78033ce9-fc17-471d-b267-a892a027f645
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=78033ce9-fc17-471d-b267-a892a027f645&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3D78033ce9-fc17-471d-b2...
|
0
52 B
|
28ms
28ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=78033ce9-fc17-471d-b267-a892a027f645&tbid=ee1d4616-c4d6-4f77-9c55-be9d1d78be2b-tuct474dab8&query=taboola_hm%3D78033ce9-fc17-471d-b267-a892a027f645
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
101 B
|
17ms
16ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=152266267&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=669481070&gjid=1484335192&cid=130780938.1568363831&tid=UA-204785-4&_gid=55287414.1568363831&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=107811752
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
3ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wDjNAAKktFLkqFFlqwF23A52AwwA/k0FGEmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx4AyyALlnFBUkzFYBP9LAAAAAAABAgdAPCAAFAAAgdTA5iAPAAAAAAAAABA5iAZBAAOA55A55A85B55A58E55A55AGAxyAw4AzyArA5iASksFSFjAAAAAAAAAAAAEAAAAgdAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAAAAAAAAAAFAAAA5iAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFH/gCUA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
250 B
|
14ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
80 B
|
15ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 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
54 B
|
22ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
30ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/54g3euww/182yo/5ik1s/7p9ts/
|
4 KB
1 KB
|
18ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
b1f3c352-b1b2-43e0-a354-c70ab8fe3440
Show response
t.nativendo.de/cds/tracking/event/
|
0
171 B
|
19ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/b1f3c352-b1b2-43e0-a354-c70ab8fe3440?aid=182yo&floor=YjFmM2MzNTItYjFiMi00MxrgQCH4EWyCLJyTvA&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=1568363832
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
tag.aspx
Show response
ml314.com/
Frame C71B
|
26 KB
12 KB
|
76ms
76ms
|
Script
application/javascript |
34.247.144.106
Amazon.com
|
|
|
GET
H2
|
200
|
ids.js
Show response
cdn.tynt.com/
|
10 KB
4 KB
|
36ms
18ms
|
Script
application/javascript |
104.16.88.26
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
sovrn
Show response
pd.sharethis.com/pd/
Frame C71B
|
0
170 B
|
31ms
7ms
|
Script
application/javascript |
18.194.251.73
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
pixel
Show response
ps.eyeota.net/
Frame C71B
|
0
141 B
|
80ms
58ms
|
Script
text/plain |
18.195.251.148
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
merge
ce.lijit.com/
Frame C71B
|
0
403 B
|
55ms
54ms
|
Image
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ce.lijit.com/merge?pid=5176&3pid=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
validateCookie
segments.company-target.com/
Frame C71B
Redirect Chain
-
https://segments.company-target.com/log?vendor=sovrn&user_id=
-
https://segments.company-target.com/validateCookie?vendor=sovrn&user_id=&verifyHash=4daa1f715e78758d91db6ee0d56237b94dc0407
|
26 B
390 B
|
97ms
96ms
|
Image
image/gif |
143.204.214.111
Amazon.com
|
|
|
GET
H2
|
200
|
/
p.adsymptotic.com/d/px/
Frame C71B
|
43 B
339 B
|
95ms
53ms
|
Image
image/gif |
104.18.100.194
Cloudflare
|
|
General
- Full URL
- https://p.adsymptotic.com/d/px/?_pid=15697&_psign=0a885fb568701ac53478d88866a10345&_pu&_puuid=&_redirect=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5014%263pid%3D${UUID}&_rand=928527
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.18.100.194
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
400
Bad Request
|
collect
dx.bigsea.weborama.com/
Frame C71B
|
61 B
61 B
|
127ms
28ms
|
Image
text/plain |
52.51.225.28
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
ct
ap.lijit.com/data/
Frame C71B
|
43 B
207 B
|
45ms
21ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/data/ct?tid=m_600632_45532139e81c4e8bbf3679b772028ca8&zoneid=600632&cid=18&geo=DE&all_tags=130%2C133%2C134%2C138%2C151%2C174%2C185%2C203%2C205%2C206%2C211%2C234%2C239%2C241%2C248%2C265%2C277%2C309%2C331%2C332%2C333%2C334%2C335%2C336%2C369%2C380%2C381%2C383%2C388%2C396%2C413%2C415%2C417%2C420%2C421%2C423%2C429%2C444%2C450%2C454%2C455%2C460%2C466%2C472&tss=77%2C78%2C79%2C80%2C80%2C81%2C82%2C102&fired_tags=138%2C151%2C234%2C265%2C309%2C369%2C388%2C421&count=8&status=8%2C8%2C8%2C1%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8&elapsed_ms=105
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
podlogging
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
704 B
|
6ms
6ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- 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
-
AmazonS3 /
- Resource Hash
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
H/1.1
|
200
OK
|
vast
Show response
tracking.m6r.eu/sync/
Frame 4E21
|
490 B
735 B
|
103ms
97ms
|
XHR
text/xml |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D6b2231e7ae%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3Da9145aca-d802-42e7-b0df-0dd4b93c7189
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 375d0a37ed1af4a9783323fa1f3760dbdb5a61eea7a349875e317ba2978d4706
|
GET
H2
|
200
|
5002100619
Show response
dfp-gateway.s-onetag.com/1/4444/
|
109 B
576 B
|
47ms
6ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
4482388292
Show response
dfp-gateway.s-onetag.com/1/4444/
|
111 B
578 B
|
47ms
7ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
497d60b6-19f9-4364-826a-4980dffcc58e.jpg
c.nativendo.de/cdn/asset/media/crt/47756/2/3/
|
15 KB
15 KB
|
18ms
18ms
|
Image
image/webp |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
ai.aspx
m.exactag.com/
Redirect Chain
-
https://ad.doubleclick.net/ddm/ad/N32804.1918787SEEDINGALLIANCE/B23123253.254901498;sz=1x1;ord=1568363831;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
-
https://ad.doubleclick.net/ddm/ad/N32804.1918787SEEDINGALLIANCE/B23123253.254901498;dc_pre=CNn948iyzeQCFQ6R3godBg8FdQ;sz=1x1;ord=1568363831;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
-
https://m.exactag.com/ai.aspx?extProvId=8&extPu=64752-dcm&extLi=23123253&extCr=117572826&extPm=254901498
|
43 B
655 B
|
47ms
15ms
|
Image
image/gif |
85.14.248.91
MYLOC-AS
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 9AB9
|
0
61 B
|
18ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuLN_hB3MAKThT_zPniRCpWqEE_xLEgWWwPdQBDTLV4G2eyQliH0JX0zYTGnEL8hSAegc_ebc1hll6S6HrI0rxgZRlZPZai0n-qrXt47Sflkw8ICmZ9_XnCWxPNI6pA0D-TCMjmG3zu8Np_glZizFScNCTgQq24Rdbi9lxWMaozSeJUqoBJRBTlj4lM-6Jec_P0q_s7KHJnUG9-xa9YCu2C5ctbKADaqVz0aYKNk2IQc5JNg6OFxSn__5BZtF2qboMidqgBbltlpXWNOF4xobvqJ8-OiiXb6gcHlh6lQGRz&sig=Cg0ArKJSzA5PFw_-0a9BEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 9AB9
|
75 KB
28 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:824::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_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5136574783
Show response
dfp-gateway.s-onetag.com/1/4444/
|
114 B
579 B
|
31ms
7ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 105C
|
0
61 B
|
16ms
16ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss-p4pQQPWcnyYazM4X423gtr9mj8CCbUt72xjNt70m7K8aYnOfHY3ov4KulNSIRe-APEt0wEHogUtqE8MkmIUjdc1sJpzg0LWXclciKYapBCoYMfvxUGv9aziSveLkS1evyxqK_zbxjoAgafyeSS2K58OSo2whviXTWvq640IIBMf0qex6XrnK2cT1abDZi90bFnv_3wdFjFfyg2bH3O9j8v0r1_Hczt2KF5btMt3E5gyd2bMQO7_3UqgUs76ObJQw_CAjA-zh4WBbccTQgoMG_nX1YNjt9ICnWmebQdHu&sig=Cg0ArKJSzIQThFpJfCSbEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
track.adform.net/adfscript/
Frame 51DE
|
0
0
|
19ms
19ms
|
Document
text/html |
37.157.6.253
ADFORM
|
|
General
- Full URL
- https://track.adform.net/adfscript/?bn=31959167;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssxxd0ex9VU2nZiXVECw1tCaIjvpsIooU8yEzCg4O3ywMIEVj93V9owmVvewRpEljHbvTzecbD89fZm60iH0pZHz8d7y-sZQcazSRfb76DkU8GKRKc_YfARUr_Udp7uGiaU1DDeuMYwndtC1OT6gxmlMFk8_HUsJG-HB9kl0CY_vLkHwkPWujTAjaFlb5BPMp5brDYh9hhDlSaYWDz04Yl8yUHwIQ-gCloSDObmCsUV242ixwM436EP4AWprpwcU278MPzeMug6iMw0lQ&sig=Cg0ArKJSzMNrY3nvtLkIEAE&urlfix=1&adurl=;cpjs=2;ord=2100500192
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.253
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- s1.adform.net
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
/
track.adform.net/adfscript/
Frame 7B9B
|
0
0
|
65ms
59ms
|
Document
text/html |
37.157.6.253
ADFORM
|
|
General
- Full URL
- https://track.adform.net/adfscript/?bn=31959168;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssxxd0ex9VU2nZiXVECw1tCaIjvpsIooU8yEzCg4O3ywMIEVj93V9owmVvewRpEljHbvTzecbD89fZm60iH0pZHz8d7y-sZQcazSRfb76DkU8GKRKc_YfARUr_Udp7uGiaU1DDeuMYwndtC1OT6gxmlMFk8_HUsJG-HB9kl0CY_vLkHwkPWujTAjaFlb5BPMp5brDYh9hhDlSaYWDz04Yl8yUHwIQ-gCloSDObmCsUV242ixwM436EP4AWprpwcU278MPzeMug6iMw0lQ&sig=Cg0ArKJSzMNrY3nvtLkIEAE&urlfix=1&adurl=;cpjs=2;ord=2100500192
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.253
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- s1.adform.net
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 105C
|
75 KB
28 KB
|
20ms
15ms
|
Script
text/javascript |
2a00:1450:4001:824::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_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
546 B
927 B
|
48ms
13ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
b1f3c352-b1b2-43e0-a354-c70ab8fe3440
Show response
t.nativendo.de/cds/tracking/event/
|
0
192 B
|
59ms
59ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/b1f3c352-b1b2-43e0-a354-c70ab8fe3440?noc=54g3euww&aid=182yo&cid=5ik1s&cti=7p9ts&imp=19&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1568363832
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
294 B
|
343ms
113ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
General
- Full URL
- https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568363832155&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
208.100.17.186
Chicago, United States,
ASN32748
(STEADFAST - Steadfast, US),
- Reverse DNS
- ip186.208-100-17.static.steadfastdns.net
- Software
-
nginx/1.14.0 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
3ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wEYRAA/k0FMImvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx4AyyAmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xAw1A00A5xA21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAyxAwwA2xA5mAjpFk9BxzA4yA21Aw1A32Ay0AmzEp6Fl9B4wAw4E01AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9wEvzF0lFyhFkmBhwFj9B1wAwyAxwAw2Ax5AmhEwkF91AwwAyxAwwA2xA5mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx5Ay1ALlnFCUkzFFCPjBAAAAAAABn2RAPDAAFAAn2RThRjAPAAA/EAAKABhRjAZBAAOA55A55A85B55A58E55A55AFA3zAxyA3BErhRjAPuCAAAAAAAPA5iAPAAAAAAAAAIA5iAPAAA/EAAKAHhRjASksFPFjAAAAAAAAAAAAEAAAn2RAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA4wAw4E01AwBEMAxzA4yA21Aw1A32Ay0AGAkpFylFj0FAAAAKAxwA10A05Ax2A11AKA1wAwyAxwAw2Ax5AIAwvFz0FlyFhkFKA1wAwyAxwAw2Ax5AKA1wAwyAxwAw2Ax5AyAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFd/EAAKAxJAAAAFAAAhRjAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFRLURWA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 4E21
|
48 B
567 B
|
141ms
141ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=6b2231e7ae&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=a9145aca-d802-42e7-b0df-0dd4b93c7189
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H2
|
200
|
rum.js
Show response
securepubads.g.doubleclick.net/pagead/js/
Frame 9AB9
|
49 KB
19 KB
|
7ms
5ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
2ms
2ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wF0RAA/k0FGMmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx4AyyAmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xAw1A00A5xA21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAyxAwwA2xA5mAjpFk9BxzA4yA21Aw1A32Ay0AmzEp6Fl9B4wAw4E01AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9wEvzF0lFyhFkmBhwFj9B1wAwyAxwAw2Ax5AmhEwkF91AwwAyxAwwA2xA5mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx5Ay1AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA21A30A34AzmAjpFk9BxzA4yA41Ax0AxwA3zAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AxzA21A30A34AzmAhwFk9B1xAz2A13A03A4zAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAyxA25ALlnFDUkzFYBPDBAAAAAAABCXOAPBAAFAACXOTZyOAPAAAAAAAAABZyOAZAAAOA55A55A85B55A58E55A55AFA14A4xA4BErZyOASksFAFjAAAAAAAAAAAAEAAACXOAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA41Ax0AxwA3zAGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz2A13A03A4zADAzrF5BFKA1xAz2A13A03A4zAKA1xAz2A13A03A4zAtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdAAAAAAAAAAAAFAAAZyOAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFxOAfYA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wG0RAA/k0FHQmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx4AyyAmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xAw1A00A5xA21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAyxAwwA2xA5mAjpFk9BxzA4yA21Aw1A32Ay0AmzEp6Fl9B4wAw4E01AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9wEvzF0lFyhFkmBhwFj9B1wAwyAxwAw2Ax5AmhEwkF91AwwAyxAwwA2xA5mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx5Ay1AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA21A30A34AzmAjpFk9BxzA4yA41Ax0AxwA3zAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AxzA21A30A34AzmAhwFk9B1xAz2A13A03A4zAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAyxA25AmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA21A30A34AzmAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA21A30A34AzmAhwFk9B1xAz2A13A03A4zAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Az2Az4AzyAx5A3BELlnFETkzFARksFAQtjF+DQkYA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wH2RAAUkzFnBPbAAAAAAAABMqoAPBAAFAAMqoTapFAPAAAFAAMqoTBQCAPBAA1IASCABapFAZAAAOA55A55A85B55A58E55A55AGAx2A21A0wArapFASksFjPjAAAAAAAAAAAAEAAAMqoAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA40A4xAx2A42AGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz2A13A03A4zAGAihFuuFlyFKA1xAz2A13A03A4zAKA1xAz2A13A03A4zAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFd1IASCAYLAaBAFAAAapFAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A37AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFz4F4kFwlE45BWVFyuEapFYWFFDF3xB0DFhJFq2FwzFJvFvVF45EF6FDnF0PEz5E3NFJFFWqF5zAW5Bv3FtWF2lF3SFwFFsqFIiF2UF6lFjiFE4B5mEatF2wApIFwwEaIF64Bk3B5tBzaFRjFh6FTSFmiF32AErFV4BHLFSLFjfFZmFBSFVyFfVFkwF31EHpFhVFxEEElF1NFZ3FukF0DFxPEU2Bn4FtsFNGFr4BfIFVzFKHFtIEC5BrsFwDEZfF2MFrIF3rFQXF1qFUBFqhFGsFi1BCQFNwF1iEyEFZoF5oEoEFsTFhZFXEF6wB0ZEs4B5VFI3FJRFtnEDsFvTFEPFitFDzFVWFy0AypE43FN0Bz2AFQF0BEXwFywF3jFVyB34ANQF6lFN1Fn2BpNF3wBsRFmzEpnF9DEnwBByFLKFT6FNOFyZFzuE20FMrFJFFBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9ByxAwwA1wAwxA5yAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjF4bERVA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
b1f3c352-b1b2-43e0-a354-c70ab8fe3440
Show response
t.nativendo.de/cds/tracking/event/
|
0
169 B
|
37ms
37ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/b1f3c352-b1b2-43e0-a354-c70ab8fe3440?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1568363832
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 4364
|
53 B
642 B
|
11ms
10ms
|
XHR
application/json |
52.219.73.107
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=5907392741
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.107
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 4364
|
265 B
436 B
|
6ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=1167050809
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H2
|
200
|
5136574783
Show response
dfp-gateway.s-onetag.com/1/4444/
|
114 B
579 B
|
7ms
7ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
22ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4364
|
653 B
1 KB
|
22ms
8ms
|
XHR
application/json |
143.204.214.42
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1808062474
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.214.42
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-214-42.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
POST
H2
|
204
|
csi
csi.gstatic.com/
Frame 9AB9
|
0
200 B
|
80ms
31ms
|
Other
image/gif |
2a00:1450:4002:807::2003
Google LLC
|
|
General
- Full URL
- https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k0hvbxzi&chm=1&e=21060099&ctx=2&gqid=N1V7XejLGJfWgAfH9ZSgAg&qqid=CL79ssiyzeQCFQqR3god6z0Jag&met.4=fb.3~lb.2w~ol.2w~idt.-3g~dt.-ir&met.3=197.2v~123.2u_2~117.2w~118.3i~118.3i~118.3u~118.3v~113.5q_2~112.5p_3&met.1=1.k0hvbxtt~14.0~15.0~16.0~17.0~18.0~19.0~20.2w~21.2w&met.7=CCIQBBgBIAMoAzAWOBNoBHAVeD2wAQG4AQM~CCoQChgBIAMoAzAWOBM~CCgQChgBIH4ofjDFAThHaL4BcMQBePSVAYABupQBiAHRhAOwAQG4AQM
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/pagead/js/rum.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4002:807::2003
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame BE47
|
0
0
|
79ms
68ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
Frame 3E74
Redirect Chain
-
https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2Fed160f316...
-
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/ed160f316afc4733814b3e362d2e2c6e/ts/1568363832263/v/2/hid/413/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
|
49 B
490 B
|
37ms
26ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
General
- Full URL
- https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/ed160f316afc4733814b3e362d2e2c6e/ts/1568363832263/v/2/hid/413/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.72
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-72.deploy.static.akamaitechnologies.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame 4F46
|
0
0
|
31ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=18978EFCED89549259181089311&cicmp=1657475&cijs=1&dast=V7EXECFgPCRy_OC6aURATCRy_OC6aURAUAAAAGBvQHGzFc7oYrGodFIi5Xo-VkNdwMJrPVYDHZTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDAIqD4Vx368tudLg-L7s_AAAeAkAAAAYUSAAGcJpKACpyDk4AAAAAAAAAAFj-____YwD0iM9kADKUBm8MegAefAAehAAAALKGGtENrdkvlhWIChKLGAEAAABAMrV5HE3qhMqiCgCAIN0K4AoAIKAthVj8LEt3UOItDAAAgGBsgR4Wv9_ssGv8bpcBAAAAAAAAAJj9n_2jCRGNuaUFsRTwqv0CAgCs_QICALCpGwDAWwBc0BG0YjBYnUFMNqPdZHYAAAAAd_____96IDcbOYajxXC2cMwWG9duOTHsRp6Zw7gZjUwW2257wHA9TxFGjWl9I8Iy-30HBeX09JhdBhnLZTKoBbKmyeU3iA8ahuVkEMxvwhaj1WSyWQ5ny8VkMBwNR6P9CdxogBM0HA4Wu8Fit1gMJ4vJaLAcLFAgBhOckOFoM1mNdqvdZDmcjEazzWSDFK1azUabwXA1m8x2u9VwMFyORkjRmsVsMlnMRsvdZrCcjAbDyXCIMLFZGEcLj2-t2KwmbtFmtFtLXIOZW2SYuEyWmXPlcMzWotfHdNqNRg6Lb4uCAUp7EVykE83p8ne5LG_N2-LWOX0Oi1iiOVmkE9ll35uNHMPRYjhbOGaLjWu3nBh2I8_MYdyMRiaLbbdvbBbG0cLjWys2q4lbtBnt1hLXYOYWGSYuk2XmXDkcs7Xo9TGddqORw-LbN1az4Wa2GW4W-8ZqNtzMNsPNYt-hM3xXn7NRedMqPDKhwzXuNmVOg8JlsHh_EtNi2p0dPL_f0alSXTTGhuybUJgNHoNBEUsEp4t0InoZTxexRPK0SCfC1WYwWk5so91qOfPYLB7bbDZzzowzl2s43A1XFrFEabpIJ3rdy-IwHD5_wcN5eJj9oqfh8PkLHs7Dw-wW-31Ou1vzd-tcRtPnrbqb3Jq_W-x3eU5vpdHyFvt9TrtbcPlbzC63y6L-Y0OMRnPdbK4YLOeawSoBAAAAAAAAACxhzrwJAAAAwGkgi8VgslguAIQY6y7Bp1TIoxP4W3HjxxBzuvxdLstb87a4dU6fw8oAEjsF!&excid=22&tst=1&docw=0
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/23_12_2/infra/
|
756 KB
178 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/23_12_2/infra/cmTagFEED_MANAGER.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 517e7d1c064ad5ca2f630bcec7317fed6608bfd1a5b53e645a891ecaad58cc7d
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_12_2/assets/css/
|
34 KB
6 KB
|
6ms
5ms
|
Stylesheet
text/css |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/23_12_2/assets/css/cmOsUnit.css
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 45676a0091b9749d7a5c81a546266569cdbdbfb9bf9e4e6c5c24e5927cf70c21
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/70da51037a6be20b76f65ecb8792dcecfe146d7f/
Frame 4364
|
653 B
1 KB
|
89ms
59ms
|
XHR
application/json |
46.4.116.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/70da51037a6be20b76f65ecb8792dcecfe146d7f/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- 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
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 9BA9
|
0
53 B
|
33ms
32ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvRGxKhtDi0q35rWFDPKJ3s_Q_8l6MbON39w2IFMaQ0YEqH3kSzsl5fQRiguB0FixoDhQWwime89SAWe4-sICccPCRR_iHNlu_Ux9-Y4f5pWff7Xn40cj3Rt6ZPt7dR6-_PowjrEZP1Q5yOVEdaEXlJkxlZ9tRRpusPDi9GG7cWREVaC5yFJZRz6ZQT8KdMPcp5G6Z9WL_X5W2H0wWPbgZQUiuYBs-cK-vanCMzFxUmLCzQ9Zd1o3XS5gSA0fJEXwqRXg1hrgW31F3eipWfn1csIASKM-alyKT6nec7&sig=Cg0ArKJSzEFWLaUcJx5QEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
vpt.js
Show response
static.cliipa.com/basev/
Frame 9BA9
|
38 KB
11 KB
|
71ms
6ms
|
Script
application/javascript |
69.16.175.10
Highwinds Network...
|
|
General
- Full URL
- https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091201.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
69.16.175.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- tlb.hwcdn.net
- Software
-
/
- Resource Hash
- be701739dbd531e7a05df6dea81b4666d177b2ef14503eba47e7bf220959788d
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 9BA9
|
75 KB
28 KB
|
32ms
32ms
|
Script
text/javascript |
2a00:1450:4001:824::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_2019091201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5005878418
Show response
dfp-gateway.s-onetag.com/1/4444/
|
113 B
579 B
|
30ms
30ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
7xA
tracker-adserver.ibillboard.com/error/impid/a9145aca-d802-42e7-b0df-0dd4b93c7189/iid/b2b14a66-7c5e-4010-87ef-151c0212799a/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame 4E21
|
0
272 B
|
99ms
24ms
|
Image
text/plain |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/a9145aca-d802-42e7-b0df-0dd4b93c7189/iid/b2b14a66-7c5e-4010-87ef-151c0212799a/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/7xA?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame 4E21
|
1 KB
827 B
|
21ms
6ms
|
Script
application/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 4364
|
24 B
409 B
|
848ms
1ms
|
XHR
application/octet-stream |
144.76.115.247
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.247
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.247.115.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.1 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 766C
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
extend
Show response
bis.cliipa.com/event/
Frame 9BA9
|
0
438 B
|
97ms
96ms
|
XHR
text/plain |
54.235.243.56
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
json
Show response
server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/
Frame 9BA9
|
5 KB
4 KB
|
401ms
115ms
|
XHR
application/json |
54.243.114.159
Amazon.com
|
|
General
- Full URL
- https://server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/json?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ref=www.giga.de&st=true&cb=1568363832426
- Requested by
- Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.243.114.159
Ashburn, United States,
ASN14618
(AMAZON-AES - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-243-114-159.compute-1.amazonaws.com
- Software
-
Cowboy /
- Resource Hash
- 253a57352ea737e9a370ba2e50c20f70d058a71f6f6d1d11edb6dd53b88bbf75
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
712 KB
186 KB
|
6ms
6ms
|
Script
text/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 9BA9
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
3ms
0ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wI0VAAUkzFBDPBAANUASCABBQCAZAAAOA55A55A85B55A58E55A55AGAx2A21A0wArBQCAPAAAIhBAAAjapFAPAAAAAAAAATapFAPAAAIhBAAAjBQCAPAAAAAAAAATBQCAPAAA1IASCABIhBAPAAAFAAMqoTIhBAPYDANUASCAHBQCAPBAA1IASCAHapFAPAAAAAAAAAIZyOASksFjMdNUASCAgCAYJAFAAABQCAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A47AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFz4F4kFwlE45BWVFyuEapFYWFFDF3xB0DFhJFq2FwzFJvFvVF45EF6FDnF0PEz5E3NFJFFWqF5zAW5Bv3FtWF2lF3SFwFFsqFIiF2UF6lFjiFE4B5mEatF2wApIFwwEaIF64Bk3B5tBzaFRjFh6FTSFmiF32AErFV4BHLFSLFjfFZmFBSFVyFfVFkwF31EHpFhVFxEEElF1NFZ3FukF0DFxPEU2Bn4FtsFNGFr4BfIFVzFKHFtIEC5BrsFwDEZfF2MFrIF3rFQXF1qFUBFqhFGsFi1BCQFNwF1iEyEFZoF5oEoEFsTFhZFXEF6wB0ZEs4B5VFI3FJRFtnEDsFvTFEPFitFDzFVWFy0AypE43FN0Bz2AFQF0BEXwFywF3jFVyB34ANQF6lFN1Fn2BpNF3wBsRFmzEpnF9DEnwBByFLKFT6FNOFyZFzuE20FMrFJFFBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9ByxAwwA1wAwxA5yAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd1IASCA4NAYJAFAAAIhBALAyzAxzAwfE5yAx3AfBFAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFJwetUA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
3ms
1ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wJ0VAA/k0FWUmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx4AyyAmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xAw1A00A5xA21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAyxAwwA2xA5mAjpFk9BxzA4yA21Aw1A32Ay0AmzEp6Fl9B4wAw4E01AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9wEvzF0lFyhFkmBhwFj9B1wAwyAxwAw2Ax5AmhEwkF91AwwAyxAwwA2xA5mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAx5Ay1AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA21A30A34AzmAjpFk9BxzA4yA41Ax0AxwA3zAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AxzA21A30A34AzmAhwFk9B1xAz2A13A03A4zAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAyxA25AmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA21A30A34AzmAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA21A30A34AzmAhwFk9B1xAz2A13A03A4zAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Az2Az4AzyAx5A3mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BxzAxxA12A4xA1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwA14A34A0xA4mAjpFk9BxzA4yA21AwwAz2AyzAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91AwwA14A34A0xA4mAhwFk9B1wAw1A43A40Ax4AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4zA2zA4zAy0A1zATkzFARksFAQtjFOQnNcA
- 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.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
v2
Show response
de.tynt.com/deb/
|
4 B
200 B
|
354ms
119ms
|
Script
application/javascript |
208.100.17.184
Steadfast
|
|
|
GET
H2
|
200
|
5005878418
Show response
dfp-gateway.s-onetag.com/1/4444/
|
113 B
579 B
|
7ms
7ms
|
XHR
application/json |
2600:9000:2057:1a00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 528E
|
0
0
|
20ms
6ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 4722
|
0
0
|
19ms
6ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832519&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832519&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
7ms
6ms
|
Image
image/gif |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832519&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=15891680&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
43ms
29ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
110ms
90ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f11
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
113ms
93ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20tagtype%203
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
43ms
30ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
115ms
95ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f24
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
121ms
101ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-response%200.06
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832536&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832536&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
6ms
6ms
|
Image
image/gif |
104.108.39.228
Akamai Technologies
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568363832536&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=04536766&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.108.39.228
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a104-108-39-228.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
33ms
33ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
108ms
105ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f11
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
91ms
90ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20tagtype%203
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
28ms
28ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
93ms
92ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f24
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
93ms
93ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-response%200.01
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
52ms
52ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=704d2c23-de86-47b8-b354-e7e1f3d0f420&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=103
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
41ms
41ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=704d2c23-de86-47b8-b354-e7e1f3d0f420&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=103
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame D12B
|
0
0
|
39ms
37ms
|
Document
text/html |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=76332&userId=704d2c23-de86-47b8-b354-e7e1f3d0f420&gdprIab={%22status%22:21,%22consent%22:%22%22,%22reason%22:210}&env=js-web&1568363832590
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
96ms
95ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtm%20trl%3D22%20tre%3D25%20frl%3D32%20fre%3D50%20a%3D23%20b%3D2%20d%3D0%20c%3D3%20e%3D4%20f%3D3%20g%3D0%20h%3D44%20i%3D0%20
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
97ms
96ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtpb%20q%3D59%20
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
113ms
113ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
General
- Full URL
- https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568363832155&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
208.100.17.186
Chicago, United States,
ASN32748
(STEADFAST - Steadfast, US),
- Reverse DNS
- ip186.208-100-17.static.steadfastdns.net
- Software
-
nginx/1.14.0 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
91ms
90ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtm%20trl%3D22%20tre%3D25%20frl%3D32%20fre%3D50%20a%3D4%20b%3D2%20d%3D0%20c%3D9%20e%3D5%20f%3D16%20g%3D0%20h%3D55%20i%3D0%20
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
92ms
89ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtpb%20q%3D88%20
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
35ms
32ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
95ms
92ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f41
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
96ms
93ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dac%20l%3D91%20
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
35ms
32ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
98ms
95ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f51
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
113ms
113ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%20106.41
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
113ms
113ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%2095.01
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
112ms
112ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%20108.23
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
113ms
112ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B91%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%2096.61
- 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_ECDSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
Cookie set
beacon
ap.lijit.com/
Frame CF43
|
0
0
|
40ms
13ms
|
Document
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/beacon?informer=13413818&gdpr_consent=
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/www/sovrn_beacon_standalone/sovrn_standalone_beacon.js?iid=13413818
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
119ms
117ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
113ms
112ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
113ms
113ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
113ms
113ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
113ms
113ms
|
Image
text/plain |
208.100.17.186
Steadfast
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/45eae94b4e2051e2c49b4642c3654f4ec5c6830a/
Frame 4364
|
109 B
671 B
|
17ms
5ms
|
XHR
application/json |
46.4.116.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/45eae94b4e2051e2c49b4642c3654f4ec5c6830a/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- 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
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/ab05a2ea95228cec46cc55f77107820124e8db61/
Frame 4364
|
42 B
738 B
|
156ms
145ms
|
XHR
image/gif |
46.4.116.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/ab05a2ea95228cec46cc55f77107820124e8db61/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIE9oamF1ZGlwQWxpZWNhaUo9T2hqYXVkaXBBbGllY2FpSnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5jbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5CdChsKTthLkF0KG0pO2EubXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5IdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXM9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzFdO3RoaXMuZ2o9dGhpcy5hWzddO3RoaXMuRW09dGhpcy5hWzNdO3RoaXMubmo9dGhpcy5hWzEwXTt0aGlzLkRuPXRoaXMuYVszXTt0aGlzLmZrPXRoaXMuYVsxXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkl1PXRoaXMuYVs4XTt0aGlzLlZxPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzNdfWMuY3Q9YjtiLnByb3RvdHlwZT17THM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWGs6dGhpcy5maihhKX0sZmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdqOnRoaXMuRG0oYSl9LApEbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW06dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5qOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ebjp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZms6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9zOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5JdTp0aGlzLlVxKGEpfSxVcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLmN0fHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5Mcyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5jbz0KITE7dGhpcy5TYT0ic2V0dXAiO3RoaXMuS2M9W107dGhpcy5qZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLllzLmJpbmQodGhpcykpO3RoaXMua2I9e307dGhpcy5OZz17fTt0aGlzLmNmPSExfWMuJGo9YjtiLnByb3RvdHlwZT17YnU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5rYltiXSsiXyIpO3JldHVybiBhfSx6YzpmdW5jdGlvbigpe3RoaXMuY2Z8fCh0aGlzLmNmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5jZn0sbGI6ZnVuY3Rpb24oYSl7dGhpcy5rYlthXXx8KHRoaXMua2JbYV09MCk7dGhpcy5rYlthXSs9MTs1PHRoaXMua2JbYV0mJiF0aGlzLk5nW2FdJiYodGhpcy5OZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmJ1KCksITApKX0samU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LApob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGpuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxZczpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5YcyhhLmRhdGEpfSxYczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxiZTpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxsZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5laChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ3E6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGduOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5RcChhKSlyZXR1cm47KGI9dGhpcy5sZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFFwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7CnJldHVybiBifSx0ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sZWI6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx0ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LENnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/CmQ6bnVsbH0sSGg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sV2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxCZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExOwp2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5CZShhLmVsLAphLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoYSl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEpe3ZhciBiPQowLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCUKNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LAp0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQobiw1KSsocCZtfHAmdHxtJnQpK0IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSwKZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxtcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LAp1YzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsCmw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LGFxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy51YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFRhOmZ1bmN0aW9uKCl7dmFyIGE9e1NpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApjajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxQcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxqbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxJbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTW46ZnVuY3Rpb24oKXtyZXR1cm4gYS5TaSgpfHxhLmNqKCl8fGEuUHEoKXx8YS5qbCgpfHxhLkltKCl9fTtyZXR1cm4gYS5NbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxVbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxXdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlNhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuU2E7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHdjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLndjKEEpfSwkczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnFxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpOwpsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkxhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5MYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC5xbygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuaWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLnByKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5nbihjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTGEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LEtyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5laChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLllhKGEsZi5KYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuS3IoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sRXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFBuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxrcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuJGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuWmo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Rcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5kcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnlwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IueHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi4kbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLlV1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuY3M9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuUG89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5UZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuYm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuYW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuZnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5tdj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5SdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmVzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5aanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odT10aGlzLmFbMl07dGhpcy5Iaz10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbOF07dGhpcy5QcD10aGlzLmFbN107dGhpcy5FaT10aGlzLmFbNF07dGhpcy5Gaj10aGlzLmFbMV07dGhpcy52dT10aGlzLmFbNF07dGhpcy5vbD10aGlzLmFbNV07dGhpcy5Mbz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs2XX1jLkFsPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5odTp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGs6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkt1OnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6CnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Gajp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudnU6dGhpcy5ubChhKX0sbmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9sOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuQWx8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW1jLmd1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuYWs9YjtiLnByb3RvdHlwZT17dmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSwKYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxqYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sa3E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sb2Q6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9CmEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5vZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm9kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0saWE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52ZSh0aGlzLmphKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWEoKSsiMiJ9LFRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5rcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5ha3x8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbOV07dGhpcy5xdj10aGlzLmFbMl07dGhpcy5tbz10aGlzLmFbMV07dGhpcy5QdT10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy53az10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlNvPWI7Yi5wcm90b3R5cGU9e2NtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kbTp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucXY6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuT3UoYSl9LE91OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhPwp0aGlzLlB1OnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DaTp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy52ayhhKX0sdms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5Tb3x8bGEsbmM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bmMuY20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT0KdHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmlqPWJ9KShjKTt2YXIgTT1jLmlqfHxNO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVzPXRoaXMuYVs4XTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkJuPQp0aGlzLmFbNV07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5zcz10aGlzLmFbNV07dGhpcy5XdT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLlNrPWI7Yi5wcm90b3R5cGU9e3RzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLnpvKGEpfSx6bzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQW86dGhpcy5oaShhKX0saGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5paTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQm46dGhpcy5TdChhKX0sU3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlR0OnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zczp0aGlzLlZ1KGEpfSxWdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuV3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLlNrfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9b2MudHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5zbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuSz1udWxsO3RoaXMuR2M9MTAwO3RoaXMuRmI9MDt0aGlzLlVhPTE1MDt0aGlzLkhiPTA7dGhpcy5DdChiKX0sZzpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWE/KHRoaXMuRmIrKyx0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKTowPnRoaXMuVWEmJih0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuR2MpKX0sb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYj50aGlzLlVhPyEwOiExfSxhZjpmdW5jdGlvbigpe3RoaXMuRmI9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEN0OmZ1bmN0aW9uKGIpe3RoaXMuSz0KYn0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxQOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5PKCksITApO3RoaXMuTWFbYi5qYSgpXT1iO04mJk4uYWgmJk4uYXUoYil9LCR2OmZ1bmN0aW9uKCl7cmV0dXJuIGUudGUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfSxscjpmdW5jdGlvbihiKXtiPWIuSWEoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLklhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHB3OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBxPWMuc2x8fHE7KGZ1bmN0aW9uKGMpe2MudWw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5HYz0KMTA7dGhpcy5GYj0wO3RoaXMuVWE9NTA7dGhpcy5WPW51bGw7dGhpcy5xYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuemI9IiI7dGhpcy5uZz0hMTt0aGlzLlMoKX0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLklhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LFM6ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxLdDpmdW5jdGlvbihiKXt0aGlzLlY9Yn0sYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WfSxGdDpmdW5jdGlvbihiKXt0aGlzLk1lPWJ9LFp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWV9LExlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5GYjw9dGhpcy5VYSYmKHRoaXMuRmIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwKdGhpcy5HYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLklhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSwKRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxydzpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcSgpfHx0aGlzLmNuKCk7dGhpcy5GZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGNuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmJhKDEwKSl9LEZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxZOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LElhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwfSxIYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sR2U6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQ2g6ZnVuY3Rpb24oYil7dGhpcy56Yj1ifSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpifSx5aDpmdW5jdGlvbigpe3RoaXMuemI9bnVsbH0sZHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLnpiJiYKKGI9ITApO3JldHVybiBifSxsdzpmdW5jdGlvbigpe3RoaXMubmd8fCh0aGlzLm5nPSEwKX0scWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnY6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB1PWMudWx8fHU7KGZ1bmN0aW9uKGMpe2Mubmk9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLks9dGhpcy5wbGF5ZXI9IiI7dGhpcy5KZj0iMSI7dGhpcy5LZj0iMiI7dGhpcy5XbT0iMyI7dGhpcy5QYz0wO3RoaXMuaWg9MzA7dGhpcy5MYj1bXTt0aGlzLmZiPVtdO3RoaXMuaWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWGY9dGhpcy5ZaD0hMTt0aGlzLnN0YXR1cz10aGlzLlBjO3RoaXMuaWQ9ZS5iYSgxMCk7dGhpcy5mZihiKTt0aGlzLkR0KGEpfSwKZzpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt0aGlzLllofHwodGhpcy5ZaD0hMCxlLkplKCkpfSxQZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTygpO1MmJlMuVWImJiFuYSYmKG5hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LGJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmlhKCldfHwod2luZG93W2EuaWEoKV09e30pO3dpbmRvd1thLmlhKCldW2IuamEoKV18fCh3aW5kb3dbYS5pYSgpXVtiLmphKCldPXt9LHdpbmRvd1thLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yPWUuemMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnpjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS56YygpXT0xfSxpcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiYKd2luZG93W2guaWEoKV1bYi5qYSgpXS5pbml0aWF0b3IhPWUuemMoKSYmKHRoaXMuZ2YoKSxhPSExKTtyZXR1cm4gYX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmJyKCk7aWYoIXRoaXMuaXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuZ2YoKTtyZXR1cm59dGhpcy5nZigpO3RoaXMuSyh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuUmgoKTt0aGlzLlhmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnVhKCl8fCh0aGlzLkxiLnB1c2goYiksdGhpcy5mYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkxiJiYwPHRoaXMuTGIubGVuZ3RoJiYodGhpcy5MYj1lLnVuaXF1ZSh0aGlzLkxiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5MYi5qb2luKCIsIikpKTsKaWYodGhpcy5mYil7Zm9yKHZhciBoPTA7aDx0aGlzLmZiLmxlbmd0aDtoKyspdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl09PXRoaXMuaWNbYl0mJmEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksdGhpcy5pY1t0aGlzLmZiW2hdLnJlYXNvbl08dGhpcy5pY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuZmJbaF0uZGV0YWlsKSxiPXRoaXMuZmJbaF0ucmVhc29uKTt0aGlzLmljW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSmZ9LGdmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZn0sSXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldtfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGN9LE9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT0KdGhpcy5KZn0sTXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2Z9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlBjfSxmZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LER0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxpcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LE5yOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5uaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbOV07dGhpcy5CcT10aGlzLmFbNV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5QaT10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbNl07dGhpcy5VbT10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLkVuPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuUHI6dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJxOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50cjp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGk6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkpsKGEpfSxKbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLkVufHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy5Pcig0KTsoZnVuY3Rpb24oYyl7Yy5Paj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy5Panx8cGE7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLk52O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPQohMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy50YSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBxYT1jLlBqfHxxYTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy5Ranx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnR0PXRoaXMuYVs4XTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLkJqPXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVsyXTt0aGlzLmhtPQp0aGlzLmFbMV07dGhpcy5Sbj10aGlzLmFbM107dGhpcy5saj10aGlzLmFbNl07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLkJzPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50dDp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYm06dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJqOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaG06dGhpcy5RbihhKX0sUW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJuOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLmhwKGEpfSxocDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgc2E9Yy5Cc3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuc3QoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt0aGlzLnNnKCk7dGhpcy51ZygpO3RoaXMuT289ITF9LHNnOmZ1bmN0aW9uKCl7dGhpcy5WYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5WYil7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sSGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk1lJiYoMCx0aGlzLk1lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMucWt8fHRhOyhmdW5jdGlvbihjKXtjLnBrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnRiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmloJiYhdGhpcy51YSgpJiYodGhpcy50Yj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5Pbz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlJjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5QZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5TYy5pbmRleE9mKGEpJiZ0aGlzLlNjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLnMoKSl9LE5yOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMubmU/dGhpcy5uZSsrOnRoaXMubmU9MTp0aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkhoKGEudmlkZW9UYWcpP2EuVmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5SY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuVmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy5wa3x8dWE7KGZ1bmN0aW9uKGMpe2Mucms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuZXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5scihoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGVxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS52YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy5ya3x8dmEsd2E9bmV3IHZhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRyPQp0aGlzLmFbM107dGhpcy5Qaz10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMV07dGhpcy5ObD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsxMF19Yy5pbz1iO2IucHJvdG90eXBlPXtDcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHI6dGhpcy5PayhhKX0sT2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBrOnRoaXMucm0oYSl9LHJtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLmlvfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dcig0KTsoZnVuY3Rpb24oYyl7Yy54bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0sQWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7CmlmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLnhtfHx5YTsoZnVuY3Rpb24oYyl7Yy53bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQmM9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm5jPXRoaXMuUWc9ITE7dGhpcy5icyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLm5vKCksdGhpcy5vYigpKX0sYnM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sbnc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5HYT90eXBlb2YgYi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj8KdHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmMpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5CYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5CY30sanI6ZnVuY3Rpb24oKXtpZighdGhpcy5QZyl7dmFyIGI9CnRoaXMud2IoKSxhPXRoaXMuaHIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30saHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLmp0KCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGp0OmZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5UYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMub2M9CiEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm9jPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMub2N8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sV3Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxubzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTsKdGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkthJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmpyKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm5jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLndiKCl9ZWxzZSB0aGlzLlFnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxvbzpmdW5jdGlvbigpe3RoaXMucmN8fCh0aGlzLnJjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5yYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnJjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT0KdGhpcy5yYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnJjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vbygpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuWGgsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LAp0bzpmdW5jdGlvbigpe3RoaXMuZXd8fCgxMDx0aGlzLiR1Pyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuJHUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5udCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5hdil7dGhpcy5hdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLndtfHx6YTsoZnVuY3Rpb24oYyl7Yy55bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5HYyl9fSl9KShjKTt2YXIgQWE9Yy55bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlxPXRoaXMuYVs0XTt0aGlzLiRvPXRoaXMuYVs1XTt0aGlzLnRuPXRoaXMuYVsxMF07dGhpcy5rcD10aGlzLmFbMV07dGhpcy5Kbz10aGlzLmFbNl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsxXX1jLlFyPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55cTp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuJG86dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3A6dGhpcy5JbyhhKX0sSW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Kbzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLlFyfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy54cSg0KTsoZnVuY3Rpb24oYyl7Yy5sbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7CihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxWczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKzsKaWYoMTA8dGhpcy5TZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMubGx8fERhOyhmdW5jdGlvbihjKXtjLmtsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIiwKYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTsKYSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5IcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuSHA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5WcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTsKdmFyIEVhPWMua2x8fEVhOyhmdW5jdGlvbihjKXtjLm1sPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMubWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbOF07dGhpcy5idD10aGlzLmFbN107dGhpcy52bj10aGlzLmFbN107dGhpcy5XaT10aGlzLmFbNV07dGhpcy5Daz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs3XX1jLkp2PWI7Yi5wcm90b3R5cGU9e0xpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NaTp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnQ6CnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV2k6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Kdnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuTGkoNCk7KGZ1bmN0aW9uKGMpe2Mubms9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7dGhpcy5xaD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9CmIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5uZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmQpfSx2YTpmdW5jdGlvbigpe3JldHVybiEwfSxzbzpmdW5jdGlvbigpe2UuV2codGhpcy5uZCk7ZS5CZSh0aGlzLm5kKTsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5ua3x8SWE7KGZ1bmN0aW9uKGMpe2MubWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMubWt8fEphOyhmdW5jdGlvbihjKXtjLm9rPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpO2UuV2coYSkmJihiPW5ldyBJYShiKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBKYShiLHRoaXMuSykpLmcoKSkpO3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLm9rfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnQ9dGhpcy5hWzVdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzhdO3RoaXMuQXM9dGhpcy5hWzRdO3RoaXMuWHA9dGhpcy5hWzNdO3RoaXMuS209dGhpcy5hWzRdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuWG89dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5oaj1iO2IucHJvdG90eXBlPXt1dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnQ6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5qOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuSXY6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuSm4oYSl9LEpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lbjp0aGlzLnpzKGEpfSx6czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQXM6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS206dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ybzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE1hPWMuaGp8fE1hLHVjPW5ldyBNYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQp1Yy51dCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuYms9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sRXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxkbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgeT1jLmJrfHx5OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuYmI9YTt0aGlzLnhnPXRoaXMuZ2k9ITE7dGhpcy5taD1kO3RoaXMuSmg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYmI9bmV3IHkoYSkpO3ZhciBjPXRoaXMucWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fAo0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkZlKHRoaXMuYmIudXJsKSYmbC5OZCl7dmFyIGU9bmV3IHkoYS51cmwpO2UuRXQoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5rYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmNrPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5iYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy54ZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuSmg/dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCExKTp0aGlzLnFiLm9wZW4odGhpcy5iYi5tZXRob2QsdGhpcy5iYi51cmwsITApLHRoaXMuZ2l8fCh0aGlzLnFiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5xYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5xYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuRmUodGhpcy5iYi51cmwpP2wuTmQ/Cmwua2EoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuRmUodGhpcy5iYi51cmwpLHRoaXMubWgmJnRoaXMubWgoKX1yZXR1cm4gdGhpcy5xYn19fSkoYyk7dmFyIE5hPWMuY2t8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5LYT0hMTt0aGlzLnFjPSIiO3RoaXMuZWU9dGhpcy5wYz10aGlzLnViPW51bGw7dGhpcy5Wbz10aGlzLkdiPXRoaXMuZGg9ITE7dGhpcy5KYT0iIjt0aGlzLllnPSExO3RoaXMuRmE9dGhpcy5yZD0iIjt0aGlzLlVnPXRoaXMuWD10aGlzLmlzRW5hYmxlZD10aGlzLlplPSExO3RoaXMuQ2E9W107dGhpcy5LZz10aGlzLlpiPSIiO3RoaXMubGU9ITE7dGhpcy5wZj0wO3RoaXMuRWY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuS2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiOwp0aGlzLmhjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQ09PS0lFQkxPQ0tFUiI7dGhpcy5hYz0iIjt0aGlzLmJjPVtdO3RoaXMuY2M9W107dGhpcy5MZD1bXTt0aGlzLiRiPSIiO3RoaXMucWY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5BYz0hMTt0aGlzLnVvPXRoaXMuT2Q9bnVsbDt0aGlzLkZoPXRoaXMuTmM9dGhpcy5wZz10aGlzLnVmPXRoaXMuTmQ9dGhpcy5nZT10aGlzLlFjPSExO3RoaXMuZ2I9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMudGQ9MDt0aGlzLk1nPSExO3RoaXMuTGc9MUUzO3RoaXMuJGM9ITE7dGhpcy5QYT0xRTM7dGhpcy5NZj0iIn1jLmRrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkthLGFkdGFncGFyYW1ldGVyOnRoaXMucWMsYWR0YWdtb2RpZmllcjp0aGlzLnViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5wYywKYWR0YWdyZWdleDp0aGlzLmVlLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmRoLHNpZGVsb2Fkczp0aGlzLkdiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy5KYSxpc0luaXRpYWxpemVkOnRoaXMuWWcsZ2xvYmFsQ29uZmlnOnRoaXMucmQsY2xpZW50Q29uZmlnOnRoaXMuRmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLlVnLHNlcnZlcjp0aGlzLkNhLHN2bUNvbmZpZzp0aGlzLlpiLGhvbWFkQWRwYXRoOnRoaXMuS2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5sZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5wZixIT01BRF9WRVJJRklFRDp0aGlzLkVmLEhPTUFEX0JMT0NLRUQ6dGhpcy5DZixIT01BRF9OT0JMT0NLRVI6dGhpcy5LYixIT01BRF9BREJMT0NLRVI6dGhpcy5oYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRGYsdGVzdEhpZGU6dGhpcy5hYyx0ZXN0VGFnczp0aGlzLmJjLHRlc3RUYWdzSlM6dGhpcy5jYywKdGVzdFRhZ3NYSFI6dGhpcy5MZCx0ZXN0Q29va2llOnRoaXMuJGIsdGhyb3R0bGU6dGhpcy5xZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkFjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZ2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTmQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5nYixzaXRlQ29uZmlnOnRoaXMuYWIsc2VydmVySWQ6dGhpcy5CaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudmMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuY2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5NZn19LERxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJgoxPT10aGlzLmdiW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGRmOmZ1bmN0aW9uKGEpe3RoaXMuZ2JbYV09ITB9LGZxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmdiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZ2JbYl0mJjE9PXRoaXMuZ2JbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7CnJldHVybiBhPWUuUG4oYSl9LHphOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5LYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5FZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5DYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFjfHx0aGlzLnVifHx0aGlzLnBjfHx0aGlzLmVlKSYmKGc9dGhpcy5XcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmhxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnZiKGcpO2EubWV0aG9kPSJQT1NUIjsKcmV0dXJuIGF9LEVlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5DYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQ2EmJnRoaXMuQ2EubGVuZ3RoJiYwPHRoaXMuQ2EubGVuZ3RoJiYoYj10aGlzLkNhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPQohMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkVlKGEpO3JldHVybiBifSxocTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSmEmJjA8dGhpcy5KYS5sZW5ndGgpcmV0dXJuIHRoaXMuSmE7Zm9yKGQgaW4gdGhpcy5KYSlpZihiPXRoaXMuSmFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5TdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2FbdGhpcy5CaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLApiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sVnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5qaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109CmZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sV3I6ZnVuY3Rpb24oYSl7dGhpcy5xYyYmKGErPXRoaXMucWMpO2lmKHRoaXMudWIpZm9yKHZhciBiIGluIHRoaXMudWIpdGhpcy51Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy51YltiXSkpO3RoaXMucGMmJihhPXRoaXMuVnIoYSx0aGlzLnBjKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLllnPSEwO3RoaXMucmQ9YTt0aGlzLkZhPWI7dGhpcy5aZT1kO3RoaXMuT2Q9Zjt0aGlzLnNjPWM7dGhpcy5hYj1lfHx7fTt0aGlzLkpyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkZhKXRoaXMuSHIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRmEpdHJ5e3RoaXMuRmE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCm5iOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxKcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5yZCt0aGlzLmFlKCJnbG9iYWwiKSksdGhpcy56cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxIcjpmdW5jdGlvbigpe3RoaXMuTGEobmV3IHkodGhpcy5GYSt0aGlzLmFlKCJjbGllbnQiLC0xIT10aGlzLkZhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGFlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRWIoKSk7dGhpcy5hYiYmdGhpcy5hYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuYWImJnRoaXMuYWIubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5nZSl7dGhpcy5nZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5zYz0hMSk7dGhpcy5zYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNjP3RoaXMuc2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlVnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLkNmKSk7CnRoaXMuSWIoKTtlLndjKGsuUXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHpxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5GYXx8dGhpcy5aYnx8dGhpcy5KYXx8dGhpcy5kZCgpOih0aGlzLkthPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5GYX1lbHNlIGE9dGhpcy5GYTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkNhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5DYS5sZW5ndGg7YisrKXRoaXMuQ2FbYl09dGhpcy5DYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5aYj1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuS2c9YS5hZHBhdGh8fCIiO3RoaXMubGU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5CaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5DYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlpiJiZ0aGlzLkphJiZ0aGlzLkNhLmxlbmd0aD90aGlzLkRjKCExKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sRGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5aYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlpiK3RoaXMuYWUoImN1c3RvbWVyIikpO3RoaXMuTGEoYix0aGlzLmR1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjdXN0b21lciIpO2E/dGhpcy5MbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLkxsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5EYyghMCl9LmJpbmQodGhpcyksITApfX0sZHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy5BYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuQWM9ITA7dGhpcy5EYyghMCk7cmV0dXJufX10aGlzLk5kPXRoaXMuZGMoYi5zdHJpY3QpO3RoaXMudWY9dGhpcy5kYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5wZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudmM9dGhpcy5kYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZGMoYi5lbmFibGVkKTt0aGlzLmFjPWIudGVzdGhpZGV8fCIiO3RoaXMuY2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5MZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMucWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy51Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5wYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuZWU9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmRoPWIuanNwb3B1cHN8fCExO3RoaXMuR2I9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5hYi52cGFpZD10aGlzLk5jO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuY2k9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuUGE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5NZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy4kYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5sZSYmKHRoaXMuJGI9bnVsbCk7dGhpcy5xZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkFjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5BYz0hMCx0aGlzLkRjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy55dSgpJiYodGhpcy5hY3x8dGhpcy5jY3x8dGhpcy5iY3x8dGhpcy4kYnx8dGhpcy5MZCk/dGhpcy5aZT8odGhpcy5LYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLmllKCksdGhpcy5JYigpKTp0aGlzLmx1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubXUoKSl9fSxsdTpmdW5jdGlvbigpe3RoaXMua3UoKTt0aGlzLm51KCl9LG51OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In0KdmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSsKYShIKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS52YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnVjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5UYSgpKXtpZih0aGlzLmFiJiZ0aGlzLmFiLnBsYXllciYmdGhpcy5hYi5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTsKcmV0dXJufXRoaXMua2EoImNzcF8iK2IpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LG11OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkthPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYihhKSksdGhpcy5JYigpLHRoaXMuaWUoKSl9LGt1OmZ1bmN0aW9uKCl7aWYodGhpcy5hYyl7dmFyIGE9ZS51YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYmgoKSl0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmFjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuYWMpOwpiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk5oKCl9fWVsc2UgdGhpcy5OaCgpfSxNaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5FYigpKTt0aGlzLnF1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5tZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5iYz10aGlzLkxkKSYmdGhpcy5iYy5sZW5ndGgpe3ZhciBkPXRoaXMuYmMuc2xpY2UoKSxmPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5tZigpfSxxdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5MYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ydShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLmNjJiZ0aGlzLmNjLmxlbmd0aCl7dmFyIGQ9dGhpcy5jYy5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1oKCl9LHJ1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYyl9Y2F0Y2gobCl7ZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLiRiPyh0aGlzLnBmKyssdGhpcy5MYShuZXcgeSh0aGlzLiRiKSx0aGlzLmp1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuS2goKX0sbmY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkRmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sanU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucGY/dGhpcy5tZigpOnRoaXMubmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLktoKCk6dGhpcy5uZigiQUFBIil9LEtoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSk7CnRoaXMuSWIoKTt0aGlzLmllKCl9LGJoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuVGEoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQmEoInQtb25saW5lLmRlIil8fGUuQmEoImdpZ2EuZGUiKXx8ZS5CYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5iaCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5FZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxybzpmdW5jdGlvbigpe2lmKHRoaXMudWYmJgp0aGlzLkRxKCkpe3ZhciBhPXRoaXMuZnEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFJoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuTGcmJiF0aGlzLk1nJiYodGhpcy5NZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuTGcsITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZ2k9ITApO2MmJmUubXIoKSYmKGEueGc9ITApO2cmJihhLkpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGVnOmZ1bmN0aW9uKCl7ZS5UYSgpfHxlLllhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAoiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5DYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMua2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGl1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmNpfSxxbzpmdW5jdGlvbigpe3RoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuemEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApOwphLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkxhKGEsdGhpcy5UdS5iaW5kKHRoaXMpLHRoaXMuU3UuYmluZCh0aGlzKSl9LFR1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5BcCgpfSxTdTpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXtlLndjKGsuenApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGllOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuR2IubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5HYi5sZW5ndGg7YSsrKXt2YXIgYj0KdGhpcy5HYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLllhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucWZ9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxFYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT4KTWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGRjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHZiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuZGt8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlB0PXRoaXMuYVs5XTt0aGlzLk5rPXRoaXMuYVszXTt0aGlzLmZ1PQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLmxuPWI7Yi5wcm90b3R5cGU9e090OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5QdDp0aGlzLk1rKGEpfSxNazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTms6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMubG58fFBhLHZjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXZjLk90KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5PP3RoaXMuWmE9YS5mLk8oKTp0aGlzLlphPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnpkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuemguYmluZCh0aGlzKSwKbXV0ZTp0aGlzLk5lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5oYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7dGhpcy5Mbj0xRTM7dGhpcy5lYT1udWxsO3RoaXMuTD1iO3RoaXMueWE9e307dGhpcy52aWRlbz17fTt0aGlzLkpkPXt9O2UubGIoIm5ld0JpZ0FkSWQiKTt0aGlzLmJvPWUuYmEoMTApO3RoaXMuamY9MDt0aGlzLlhjPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWGM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi51JiYoYT10aGlzLmIuZi51KCkpLHRoaXMuWGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMua249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RZT10aGlzLklkPQohMTt0aGlzLmdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlVoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuVWI9ITE7dGhpcy5Rbz1lLmJhKDEwKTt0aGlzLkRiPWUuYmEoMTApO3RoaXMuQmI9ZS5iYSgxMCk7dGhpcy5HaD1lLmJhKDEwKTt0aGlzLmNvbmY9e307dGhpcy50Yz10aGlzLkNiPSExO3RoaXMub2U9bnVsbDt0aGlzLlJkPXRoaXMuSmI9dGhpcy56ZT10aGlzLlZlPXRoaXMua2U9dGhpcy5qZD10aGlzLmxmPXRoaXMucGI9dGhpcy5nYz10aGlzLm9oPXRoaXMueGM9dGhpcy56dT10aGlzLnNiPSExO3RoaXMubGM9W107dGhpcy5lYz17fTt0aGlzLnJmPSExO3RoaXMuV2I9e307dGhpcy5Hcz0yMDA7dGhpcy5BZj10aGlzLmZpPXRoaXMuZmU9dGhpcy5ZZT0hMX1jLllqPWI7Yi5wcm90b3R5cGU9e3p0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxTaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5TYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5MLlFjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLCIwIik7ZS50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2UudihrLmJuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEllOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMuc2I9ZDt2YXIgbj0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYobj0hMCk7aWYodGhpcy5MLlgpdGhpcy5qZisrLGUubGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5ybygpLGM9bC5nZXRDb25maWcoKSx0aGlzLkwuS2EmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCwKe2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlBhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuU2goKSxuZXcgVCh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5OYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUGEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlFhKCk7ZWxzZXt2YXIgZz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnLkllKGEsYixkKX0sCjUwKX19LFRlOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlFlfHwic3ZtcHJldmlldyIhPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yPyh0aGlzLlJkPXRoaXMuSmI9dGhpcy54Yz0hMSx0aGlzLmM9YSx0aGlzLkx0KHRoaXMuYyksdGhpcy5IZyhhKSx0aGlzLmxjPXRoaXMuemcoYSksdGhpcy5lYz17fSx0aGlzLnJmPSExLHRoaXMuSG8oKSk6dGhpcy5oZCgpfSxIZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5KZD10aGlzLnNxKGEpKSx0aGlzLkhnKGEucGFyZW50KSl9LHpnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9CnRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy4kcChhKSkpO3JldHVybiBjfSwkcDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9CmEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmliKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG9hOmZ1bmN0aW9uKGEpe2EuV2EmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wLGQ9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEubWQmJmEubWQuZXJyb3ImJmEubWQuZXJyb3IuY29kZSYmKGI9YS5tZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk9jLmNvZGU6Yj09CkYuVWQuY29kZT9lLnYoay5udix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkplKCksYj09Ri5IZi5jb2RlJiZlLnYoay5jcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay55cCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuRmYuY29kZTplLnYoay5VdSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuSWYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLnYoay51dix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6ZS52KGsueHYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmRzLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMudGN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWQmJmEuZXJyb3ImJmEuZXJyb3IueGEmJihkKz0iXyIrYS5lcnJvci54YSk7ZS50cmFjayhkLCIiLCEwKTt0aGlzLlFiKGEpO3RoaXMuUWEoKX0sUWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7CnRoaXMuSGUoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LEx0OmZ1bmN0aW9uKGEpe3RoaXMua2U9dGhpcy56ZT10aGlzLlZlPSExO3RoaXMueWE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGQ9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoZCYmZC5lbnZ2YXJzKXRyeXtiPWQuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlllPSEwfWNhdGNoKGMpe319Y2F0Y2goZSl7fWIub3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5rbiYmdGhpcy5wbGF5ZXIucWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyliLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy5lbihiLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMuWWUmJmIubG9hZCgpO2lmKHRoaXMuT2goYikpe3RoaXMuaG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlllPwp0aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuTW8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKSx0aGlzLkp0KCkpOnRoaXMuRGUoKT90aGlzLkRoKCk6dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0sSnQ6ZnVuY3Rpb24oKXt0aGlzLnBiPXRoaXMuZ2M9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihlLnYoay5qZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucGI9ITApO2UuamUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJgplLmpuKHRoaXMuYy5vcmlnaW4uc2EpO2UuZWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnBoKCk7dGhpcy5iLkpjKCk7Zm9yKGE9dGhpcy5iLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5KYygpO3RoaXMuZWE9dGhpcy55YT10aGlzLmIuRzt0aGlzLndmKCJ2cGFpZCIpO2lmKHRoaXMucGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7ZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCk7ZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLkcuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudmEmJnRoaXMuYi5mLnZhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMudXEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkcuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmJlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmxjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuYnYoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5jdigpLHRoaXMuYi5UYighMCksIXRoaXMuSmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuSmI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5UYighMCksdGhpcy5ndigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMua3YoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuanYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5sdigpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5kaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5PYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5pZyx0aGlzLmMuQSwKdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGQpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5maSYmKHRoaXMuQWY9ITEsdGhpcy5ZYigpKSx0aGlzLmV2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnBiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLmJlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5ZZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5nYz0hMH0sZXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZ2M9ITF9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sCmZ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZWIoImltcHJlc3Npb24iKTtlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxrdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5lYigic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnhjPSEwO2UuZWIoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxqdjpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5lYigibWlkcG9pbnQiKTtlLnYoay5SZix0aGlzLmMuQSx0aGlzLmIuZi51KCksCnRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5lYigidGhpcmRRdWFydGlsZSIpO2UudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGh2OmZ1bmN0aW9uKCl7dGhpcy5QZCgpO2UuZWIoImNvbXBsZXRlIil9LGRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZWIoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuamUoKTt0aGlzLkg9ITE7dGhpcy5RYShhKX19LGJ2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsZD0vXGQrL2csYz1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj0KYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5lYigiZXJyIixiKTtlLnYoay5tdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZGkoITApfSxlbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkthJiZiLmlzRW5hYmxlZCYmIWIuQ2MoKSl7dmFyIGQ9Yi5sYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChiLHRoaXMuTCk7Yy5vbmVycm9yPXRoaXMuWXUuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChiLHRoaXMuTCkpfSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LGhuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuUGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuUGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5RZC5iaW5kKHRoaXMpKX0sYWk6ZnVuY3Rpb24oYSl7dGhpcy5QYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBifHx0aGlzLnhmKGEpfS5iaW5kKHRoaXMpLHRoaXMuTG4pKX0seGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWmMmJnRoaXMuT2godGhpcy52aWRlbykmJiF0aGlzLkNiJiYhdGhpcy5QYil7dGhpcy5aYz0hMDt0cnl7aWYoIWUuVGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQ2J8fCh0aGlzLkNiPSEwLHRoaXMuRWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5MLnBnfHx0aGlzLkwua2EoInZpZGVvLW5vb3AiKSk7dGhpcy5RYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLAoiIiwhMCl9dGhpcy5YdSgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLkpjKCk7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLmFnKCk7dGhpcy5iLnBoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLmtmKCl9fSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLmpkKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuc2Q9W107Zm9yKHZhciBiPXRoaXMuYi5HLGQ9MDtkPGIuY2hpbGRyZW4ubGVuZ3RoO2QrKyl0aGlzLnNkLnB1c2goYi5jaGlsZHJlbltkXSksYi5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PSJub25lIjtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtkLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7ZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7ZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGQpO3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuVGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWMpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuVGMoKX1lbHNlIHRoaXMuVGMoKX0sVGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5zZClmb3IodmFyIGI9CjA7Yjx0aGlzLnNkLmxlbmd0aDtiKyspdGhpcy5zZFtiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5qZHx8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuUWEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLk5lKCEwKSx0aGlzLlRjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnplJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5WZT0hMH0uYmluZCh0aGlzKSk7ZGE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLlhiLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMua2YoKSl9LmJpbmQodGhpcyk7dGhpcy5zZSgpLkNoKHRoaXMpfSxQZDpmdW5jdGlvbigpe3RoaXMuTC52YyYmIXRoaXMuQ2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLiRtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5RYSgpfSxRYTpmdW5jdGlvbihhKXtpZighdGhpcy5rZSlpZih0aGlzLmtlPSEwLHRoaXMuUmR8fChlLnYoay5mcyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy5yYnx8dGhpcy5jLmpjKXtlLmxiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmpmKys7dGhpcy5QYj10aGlzLlpjPSExO3RyeXt0aGlzLkVkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5lYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuSWQ9ITE7dHJ5e3RoaXMuYi5XaCgpfWNhdGNoKGcpe310aGlzLmxmPSEwO3RoaXMuYi53ZSgpO3RoaXMuVWI9ITE7dGhpcy5zZSgpLnloKCk7dGhpcy5jLnJiJiZ0aGlzLmMub3JpZ2luLk9lKCk7dGhpcy5jLmpjJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5oZCgpKX1lbHNlIHRoaXMuaGQoKX0sWXU6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuUWQoYSkpfSxRZDpmdW5jdGlvbihhKXt0aGlzLlBiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJgoodGhpcy5EZSgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Y3x8dGhpcy5MLmVnKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLkwuZWcoKSk7dGhpcy5jLm9yaWdpbi5xZyh3LlRkKX0seWY6ZnVuY3Rpb24oKXtpZih0aGlzLnp1KXRoaXMuUWEoKTtlbHNle3RoaXMuVWI9ITA7dGhpcy5iLmYuVmEmJiF0aGlzLmxmJiZ0aGlzLmIuZi5WYSgpJiZlLnYoay5mZCx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5DdShhKTtpZighdGhpcy5KYil7dmFyIGI9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5KYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsuYmksdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuQ2UodGhpcy5KYil9ZD0iIjt0aGlzLmMuaGYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGQ9dGhpcy5jLmhmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLklkfHwodGhpcy5JZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuYy5yYj8odGhpcy5QYj10aGlzLlpjPSExLAp0aGlzLkVkKHRoaXMudmlkZW8pLHRoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy55YS5yZW1vdmVDaGlsZCh0aGlzLmVhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSWQ9ITEsdGhpcy5iLldoKCksdGhpcy5jLm9yaWdpbi5PZSgpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlZjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dGhpcy55YT10aGlzLmIuRzt0aGlzLnlhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy55YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwKImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5iLkY9YTt2YXIgYj10aGlzLmIuRixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmVhPXRoaXMueWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iLkpjKCk7dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy55YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMueWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLiRoLmJpbmQodGhpcyk7dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLlpoKCk7dGhpcy53ZigpO3RoaXMub2U9c2V0SW50ZXJ2YWwodGhpcy5wby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxucTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGQ9MDtkPHRoaXMuYy5NLmxlbmd0aDtkKyspe3ZhciBjPWI9dGhpcy5jLk1bZF0sZTtlPWIudXJsO3ZhciBnPXRoaXMuTDtnLkthJiZnLmlzRW5hYmxlZCYmIWcuQ2MoKSYmKGU9Zy5sYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtjLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LHBvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5vZSksdGhpcy5QZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnlmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm9lKSwKdGhpcy5RZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFRoOmZ1bmN0aW9uKCl7dGhpcy5vaHx8KHRoaXMub2g9ITAsdGhpcy54Y3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LEN1OmZ1bmN0aW9uKGEpe2UudihrLiRkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YT09dGhpcy5VaHx8dGhpcy5DYnx8KDA9PWEmJih0aGlzLnNiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNiKSx0aGlzLnNiPSExKSx0aGlzLlZlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnplPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuVGgoKX0uYmluZCh0aGlzKSksdGhpcy50YyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQ2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlRhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLnYoay5QZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50YyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnZjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy54Yz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLAplLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC52YyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlZmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuVWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQ2Ipe3RyeXtpZih0aGlzLmVjW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuZWMuaW1wcmVzc2lvbiYmdGhpcy5lYy5jb21wbGV0ZSYmIXRoaXMucmYpe3RoaXMucmY9CiEwO3ZhciBkPXRoaXMuZWMuY29tcGxldGUtdGhpcy5lYy5pbXByZXNzaW9uLGM9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLkgmJihjKz0idnBhaWQiKTs1RTM+ZCYmKDEwPmQmJihkPTEwKSwwPmQmJihkPSJuZWdhdGl2ZSIpLGUudHJhY2soYyxkLCEwKSl9fWNhdGNoKGcpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9ZD1bXTt0cnl7ZD10aGlzLnRxKHRoaXMuYy5PYSxhKX1jYXRjaChsKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgbT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMuZmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5KZC5pbXByZXNzaW9ucyYmZS5rcihtLnVybCx0aGlzLkpkLmltcHJlc3Npb25zKT90aGlzLkhlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTsKZS52KGsuYW4sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHthZElkOnRoaXMuSmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkhlKG0udXJsLG0udHlwZSl9Y2F0Y2gocSl7fWlmKCFiKXRyeXt0aGlzLmMuT2E9dGhpcy5Ubyh0aGlzLmMuT2EsYSl9Y2F0Y2gocil7fX19LEhlOmZ1bmN0aW9uKGEsYixkLGMsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnphKGEpLGQmJmIuZG4oZCksY3x8KGM9dGhpcy5vZyksZXx8KGU9dGhpcy5vZyksdGhpcy5mbihhKSx0aGlzLkwuTGEoYixmdW5jdGlvbigpe3RoaXMueGgoYSk7YygpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy54aChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sZm46ZnVuY3Rpb24oYSl7dGhpcy5XYlthXT0ib3BlbiJ9LHhoOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09ImNsb3NlZCJ9LEhvOmZ1bmN0aW9uKCl7dGhpcy5XYj0Ke319LCR0OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuV2IpdGhpcy5XYi5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLldiW2JdJiZhKys7cmV0dXJuIGF9LHRxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVG86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sWHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLiRoLmJpbmQodGhpcykpfSwkaDpmdW5jdGlvbigpe2UuVGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuWWIoKTp0aGlzLmMuT2ImJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwKIXRoaXMueGMmJmUuVGEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuYXEoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS55ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMueGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx4YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Rbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5EYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlFoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5ZYigpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnliKCk7dGhpcy54YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5CdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuR2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuaGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVGEoKXx8KHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpLHRoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5lYS5hcHBlbmRDaGlsZChkKTsKdGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMud2EmJih0aGlzLndhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLndhPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLllmKGZ1bmN0aW9uKGEpe3RoaXMud2Euc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLk5lKCkpO3RoaXMueWIoKX19LHliOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sWWI6ZnVuY3Rpb24oKXt0aGlzLndhJiYiYmxvY2siPT10aGlzLndhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSl9LFFoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5nYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuZ2M9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnliKCksdGhpcy54YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuZ2M9ITApfSx6ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0semg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sQXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5wYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5wYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5wYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxOZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsueGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LEx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sWGI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5YYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuWGIpO3RoaXMuamR8fHRoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfSxoZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS51YygpO2lmKChhfHwhdGhpcy5mZSYmCmIuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFlKXRoaXMuUWU9dGhpcy5maT10aGlzLkFmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy5mZT0hMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuamQ9ITAsdGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksKCJwcmVyb2xsIj09ZS5TYSYmdGhpcy5WY3x8InBvc3Ryb2xsIj09ZS5TYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuU2EpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuSmMoKTsKdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMua2QoKTtlbHNlIHRoaXMua2QoKX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy4kdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuR3MpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5wdCgpLHRoaXMuVWI9ITEsZS52KGsuUG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubGMmJjA8dGhpcy5sYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYm8rCiItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLllqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cz10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLk5pPWI7Yi5wcm90b3R5cGU9e3hzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55czp0aGlzLkZwKGEpfSxGcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuR3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5OaXx8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnhzKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuRWE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5rYz10aGlzLm1jPSExO3RoaXMuc2E9IiI7dGhpcy56Zj0hMTtkJiZkLmVtcHR5P3RoaXMuTXIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy52bT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS51YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLAohMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUubGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuS2QoYSkpKyImdHlwZT1qcyIsYj1sLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwuemEobC5LZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuTGEoYix0aGlzLkxyLmJpbmQodGhpcyksdGhpcy5Jci5iaW5kKHRoaXMpKX0sQWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkVhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5TYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuU2F8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlNhfHx0aGlzLm9yKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLml1KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9yOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sTHI6ZnVuY3Rpb24oYSl7dGhpcy5mdChhKTt0cnl7dGhpcy5FYT1hLnJlc3BvbnNlWE1MLHRoaXMuRWF8fCh0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUmEody5WZCkpfXRoaXMuVz10aGlzLkFnKCk7dGhpcy5tYz10aGlzLm9mKCk7dGhpcy5rYz10aGlzLkxoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkZjKCk6dGhpcy5vYSh0aGlzLlJhKHcuT2Mse2Vycm9yOnRoaXMuemY/Ri5VZDpGLkdmfSkpfSxNcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8Cih0aGlzLkVhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5SYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm1jPXRoaXMub2YoKTt0aGlzLmtjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuRmMoKTp0aGlzLm9hKHRoaXMuUmEody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LElyOmZ1bmN0aW9uKCl7dGhpcy5vYSh0aGlzLlJhKHcuRmYse2RlcHRoOmF9KSl9LEZjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpO3RoaXMucXIoKT90aGlzLnN1KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuSWcoKSxoLHtBZFN5c3RlbTp0aGlzLlpwKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5SYSh3LklmKSk6KGE9MCx0aGlzLlF1KCkmJnRoaXMuVGUodGhpcy5SbygpKSl9LE9lOmZ1bmN0aW9uKCl7dGhpcy5tYz8odGhpcy5tYz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuRmMoKSk6dGhpcy5wYXJlbnQuT2UoKX0sa2g6ZnVuY3Rpb24oKXt0aGlzLmtjPyh0aGlzLmtjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkZjKCkpOnRoaXMucGFyZW50LmtoKCl9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHUoKT90aGlzLm91KCk/ITA6KC0xIT10aGlzLnljKCk/dGhpcy5vYSh0aGlzLlJhKHcuQmYpKTp0aGlzLm9hKHRoaXMuUmEody5qaikpLCExKToodGhpcy5vYSh0aGlzLlJhKHcuT2MsRi5IZikpLCExKX0sVGU6ZnVuY3Rpb24oYSl7dGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5LZSgpKTthLnJiPWEucmI/YS5yYjp0aGlzLm1jO2EuamM9YS5qYz9hLmpjOnRoaXMua2M7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMucGFyZW50LlRlKGEpfSxSbzpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTsKdGhpcy5zYXx8KHRoaXMuc2E9IiIpO2EuZHVyYXRpb249dGhpcy55YygpO2EuTT10aGlzLkZnKCk7YS5PYj10aGlzLmJxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5ZcCgpO2EuaGY9dGhpcy5ycShhLmR1cmF0aW9uKTthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLldhPWIuV2E/Yi5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5PYT1iLmVycm9yLmNvZGUhPXcuQmYuY29kZT9iLk9hLmNvbmNhdCh0aGlzLmNxKCkpOmIuT2EuY29uY2F0KHRoaXMubHEoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5GYygpKToKKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxRYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5RYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUmEoYSxiKSl9LFJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxwdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy55YygpfSxvZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LExoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYKIXRoaXMub2YoKSYmKGE9ITApO3JldHVybiBhfSxmdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0scXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFpwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmUodGhpcy5VLCJBZFN5c3RlbSIpfSxLZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5pYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxUdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5pYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sWXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5pYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxycTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmliKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0saWI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnZtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRyPXRoaXMuYVs1XTt0aGlzLnBpPXRoaXMuYVszXTt0aGlzLkNvPXRoaXMuYVs2XTt0aGlzLmVqPXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVs2XTt0aGlzLnFsPXRoaXMuYVs4XTt0aGlzLktpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnE9YjtiLnByb3RvdHlwZT17WnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRyOnRoaXMub2koYSl9LG9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5waTp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy5kaihhKX0sCmRqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lajp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubm46dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LaTp0aGlzLnppKGEpfSx6aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLk5xfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5acig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmpjPXRoaXMucmI9ITE7dGhpcy54ZT0KdGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMucmw9YjtiLnByb3RvdHlwZT17TW86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sanE6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5qcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LHVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5ybHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudW09dGhpcy5hWzldO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMucXA9dGhpcy5hWzddO3RoaXMubXM9dGhpcy5hWzldO3RoaXMuYWw9dGhpcy5hWzRdO3RoaXMuVnA9dGhpcy5hWzEwXTt0aGlzLmVyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMucmo9YjtiLnByb3RvdHlwZT17dG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuR3EoYSl9LEdxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IcTp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucXA6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hbDoKdGhpcy5VcChhKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZwOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMucmp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLnRtKDQpO3ZhciB3PXtWZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix4YToiWE1MX1BBUlNFX0VSUk9SIn0samo6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHhhOiJEVVJBVElPTl9FUlJPUiJ9LE9jOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIiwKeGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix4YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sS3Y6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIseGE6Ik1FRElBRklMRV9FUlJPUiJ9LEJmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHhhOiJEVU1NWV9BRCJ9fSxGPXtHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHhhOiJOT19BRFMifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIseGE6Ik5PX01FRElBRklMRVMifSxMdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLnJuPWI7Yi5wcm90b3R5cGU9e25zOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdhPWMucm58fFdhLHpjPW5ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXpjLm5zKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuTGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLkxqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbMV07dGhpcy5YcT10aGlzLmFbOV07dGhpcy5Pbj10aGlzLmFbNl07dGhpcy5TcD10aGlzLmFbNV07dGhpcy5Baz10aGlzLmFbOV07dGhpcy5SdD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs3XX1jLmNyPWI7Yi5wcm90b3R5cGU9e0JtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ206dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhxOnRoaXMuTm4oYSl9LE5uOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbjp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy56ayhhKX0sCnprOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bazp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLmNyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5CbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmhiPWEuQmcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPQoiYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj1bXX1jLnFqPWI7Yi5wcm90b3R5cGU9e1RwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuVHAoYSk7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLk9xKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxjdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFdoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpOwplLnYoay5mZCx0aGlzLmYudSgpKX0scHQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5nZCx0aGlzLmYudSgpKSl9LEpjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLmhiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5oYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmhiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpO3RoaXMuZi5IYyYmdGhpcy5mLkhjKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sT3E6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LE1wOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuTXAodGhpcy5oYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy53ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uOwp0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5OYi5sZW5ndGg7YSsrKXRoaXMuTmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5IaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxZZjpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy5OYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTmIucHVzaChhKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5xanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwpPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9ITA7Qy5wdXNoKE8pfXZhciBLPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3A9dGhpcy5hWzhdO3RoaXMubXA9dGhpcy5hWzRdO3RoaXMuYXI9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5ZbD1iO2IucHJvdG90eXBlPXtycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubXA6dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFyOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYT1jLllsfHwkYSxCYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5ycCg0KTsoZnVuY3Rpb24oYyl7Yy5mbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpO3RoaXMubWcoKX0sRmQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LG1nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sCkFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLmZsfHxhYjsoZnVuY3Rpb24oYyl7Yy5kbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUWY9dGhpcy5TZj10aGlzLlJnPXRoaXMuZGE9dGhpcy5zZj0KITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcChhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuc2Y9ITA7dGhpcy5SZyYmdGhpcy5oZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnpiO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUmc9ITA7dGhpcy5oZygpfS5iaW5kKHRoaXMpKTt0aGlzLmNnKCl9LApoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5zZiYmdGhpcy5RZiYmIXRoaXMuU2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxjZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sR2c6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sY2c6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuR2coImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07CnRoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLlJ2fXRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNnKCl9LmJpbmQodGhpcyksMTAwKX0sVXY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuZ3coKTohMX0seWM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnljKCk6LTF9LG1xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElwOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT8odGhpcy53KCksdGhpcy50YSgpKTpiLkFlKCk/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXEoYik/KHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5kbHx8YmI7KGZ1bmN0aW9uKGMpe2MuZ2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxucjpmdW5jdGlvbigpe3dpbmRvdy5PTy52bC5YbS5WbT93aW5kb3cuT08udmwuWG0uVm0uUHYoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9MTUwMDt2YXIgYj0KZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUudGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGFiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBiYihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5nbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVszXTt0aGlzLlJrPXRoaXMuYVsyXTt0aGlzLkRqPXRoaXMuYVs2XTt0aGlzLnl0PXRoaXMuYVs5XTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLkJ2PXRoaXMuYVs5XTt0aGlzLmhrPXRoaXMuYVs3XTt0aGlzLmNsPXRoaXMuYVs1XTsKdGhpcy5BbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLlFrKGEpfSxRazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUms6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRqOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dDp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub206dGhpcy5BdihhKX0sQXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ2OnRoaXMuZ2soYSl9LGdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5oazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2w6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgZWI9Yy5ycnx8ZWIsQ2M9bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MueHIoNCk7KGZ1bmN0aW9uKGMpe2MuYWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMTt0aGlzLkpnKCl9LEpnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CmImJmE/KHRoaXMuWShiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnRoKCl9LHRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuYWp8fGZiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnRhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMudGEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7CmIucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuJGl8fGdiOyhmdW5jdGlvbihjKXtjLmJqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sd2g6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5xYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkZkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkpwfHwodGhpcy5KcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7CmlmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuUigpfX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiLFU9bmV3IGhiKHIpO1UuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ0PXRoaXMuYVs0XTt0aGlzLmlsPXRoaXMuYVs5XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs1XTt0aGlzLkFyPXRoaXMuYVsxMF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5qaz10aGlzLmFbNF07dGhpcy53cT10aGlzLmFbOV07dGhpcy5VaT10aGlzLmFbNF07dGhpcy5Ecz0KdGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOF19Yy5Jaj1iO2IucHJvdG90eXBlPXtxdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnQ6dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlsOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ldDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnE6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFyOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuams6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndxOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRzOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuSWp8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpOyhmdW5jdGlvbihjKXtjLlVsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEhjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5VbHx8VjsoZnVuY3Rpb24oYyl7Yy5UbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LldjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLmhzKGEpfS5iaW5kKHRoaXMpKTsKeC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5DcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy50YSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuVGx8fFc7KGZ1bmN0aW9uKGMpe2MuVmw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMueWQmJihiPWUuVW8oYix0aGlzLnlkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSx0dTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLkVjfHwodGhpcy5FYz1bXSksdGhpcy5FYy5wdXNoKGIpLHRoaXMub3QoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LENxOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylmb3IodmFyIGI9MDtiPHRoaXMuRWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5FY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnR1KGIpfX0pfSkoYyk7dmFyIGpiPWMuVmx8fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGs9dGhpcy5hWzFdO3RoaXMuRXA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5lbz1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTGs6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5lb3x8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMuS2soNCk7CihmdW5jdGlvbihjKXtjLlhpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmCmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5YaXx8bGI7KGZ1bmN0aW9uKGMpe2MuWWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPwoodGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuWWl8fG1iOyhmdW5jdGlvbihjKXtjLlppPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz0KbmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuWml8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNF07dGhpcy50dj10aGlzLmFbMV07dGhpcy5mbT10aGlzLmFbNl07dGhpcy5vcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsyXX1jLndyPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fbzp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnR2OnRoaXMuZW0oYSl9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5mbTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYj1jLndyfHxwYixGYz1uZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5Ebyg0KTsoZnVuY3Rpb24oYyl7Yy5Vaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpOwpiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMuaHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30saHQ6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5wYXVzZSYmdGhpcy5oYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnJlc3VtZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5yZXN1bWUmJnRoaXMuaGEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiYKdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEudW5tdXRlJiZ0aGlzLmhhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sU2c6ZnVuY3Rpb24oYil7dGhpcy5oYT1ifSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Va3x8cWI7KGZ1bmN0aW9uKGMpe2MuVGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmVpPSExfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLmVpJiYodGhpcy5JKCksdGhpcy5laT0hMCx0aGlzLnJhKCkpOwphLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLlRrfHxyYjsoZnVuY3Rpb24oYyl7Yy5Waz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9bmV3IHFiKGJbZF0pLHRoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IHJiKGMsdGhpcy5LKSkuZygpKX19ZWxzZSB0aGlzLlIoKX19KX0pKGMpO3ZhciBzYj1jLlZrfHxzYixYPW5ldyBzYihyKTtYLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueGw9dGhpcy5hWzddO3RoaXMuemo9dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy5Ccj1iO2IucHJvdG90eXBlPXt3bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnpqOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgdGI9Yy5Ccnx8dGIsR2M9bmV3IHRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2Mud2woNCk7KGZ1bmN0aW9uKGMpe2MuR209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuR218fHViOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxndDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuJGF8fCh0aGlzLiRhPVtdKTt0aGlzLiRhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5uYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLmd0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuUmIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5BYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLm5jKXt0aGlzLkkoKTtyZXR1cm59Yj0hMDtpZih0aGlzLiRhJiYKdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuRm18fHZiOyhmdW5jdGlvbihjKXtjLkhtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3RoaXMuVWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgdWIoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlAoYyksCihuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuSG18fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbN107dGhpcy5Vcj10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy52cj10aGlzLmFbOV07dGhpcy5Edj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbMV07dGhpcy5xcz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5Qcz1iO2IucHJvdG90eXBlPXtLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVyOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Hbzp0aGlzLnVyKGEpfSx1cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnI6dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Edjp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem46dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMuUHN8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLktxKDQpOyhmdW5jdGlvbihjKXtjLkhsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuV3MoKX0uYmluZCh0aGlzKSw1MDApfSxXczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuSGx8fHpiOyhmdW5jdGlvbihjKXtjLkdsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5Tcj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy5Tcj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnQoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBBYj1jLkdsfHxBYjsoZnVuY3Rpb24oYyl7Yy5JbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMuSWx8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GbD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbOF19Yy52cD1iO2IucHJvdG90eXBlPQp7RWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgRGI9Yy52cHx8RGIsSWM9bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5DbHx8RWI7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLklhKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5HcigpOnRoaXMuZ2coKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwKMUUzKX0sTm86ZnVuY3Rpb24oKXt0aGlzLk9mKCl8fHRoaXMucyghMCl9LEdyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpOyFiLm5hJiZiLlcmJmIuT3YmJmIuUXYmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxnZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5uaClmb3IodmFyIGI9Cm0ucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLklhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLm5oPWJbY10pO3JldHVybiB0aGlzLm5ofSxodzpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkkoITApOnRoaXMuSSgpOnRoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLkJsfHxGYjsoZnVuY3Rpb24oYyl7Yy5EbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IEZiKGMsdGhpcy5LKSkuZygpKX1yZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIEdiPWMuRGx8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lcD10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbMTBdO3RoaXMuSWk9dGhpcy5hWzZdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMueG49dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5RbD1iO2IucHJvdG90eXBlPXtjcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVwOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5JaTp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5RbHx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuY3AoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sZnc6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPwoodGhpcy5wYXVzZSgpLCEwKTohMX0sTzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSGM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sSWE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuRWt8fFk7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuV2U9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5XZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5XZSYmYiE9dGhpcy5XZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkJhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5rdyksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuRGt8fFo7KGZ1bmN0aW9uKGMpe2MuRms9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5xYT90aGlzLmFmKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuRmt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhwPXRoaXMuYVs1XTt0aGlzLlFtPXRoaXMuYVs3XTt0aGlzLlNtPXRoaXMuYVs0XTt0aGlzLnNpPXRoaXMuYVs5XTt0aGlzLnZqPXRoaXMuYVs4XTt0aGlzLlhsPXRoaXMuYVs5XTt0aGlzLkV1PXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLllvPWI7Yi5wcm90b3R5cGU9e3dwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54cDp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUW06dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc2k6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZqOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuWGw6dGhpcy5EdShhKX0sRHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkV1OnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMuWW98fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLndwKDQpOyhmdW5jdGlvbihjKXtjLk5tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTsKdGhpcy5ZKGEpO3RoaXMuU2Q9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lKXRyeXt3aW5kb3cuREw4X29uQWRDb21wbGV0ZWQoKSx0aGlzLlNkPSExfWNhdGNoKGIpe31pZigiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsd2luZG93LkRMOF9vbkFkU3RhcnRlZCgpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9ZWxzZSB0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxWYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH0sTzpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBNYj1jLk5tfHxNYjsoZnVuY3Rpb24oYyl7Yy5NbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxpdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLApmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSl9LGJkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxMZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7YjwKd2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYmQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxmLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuaXQod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5MZigpfX0pfSkoYyk7dmFyIE5iPWMuTW18fE5iOyhmdW5jdGlvbihjKXtjLk9tPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuT218fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLklzPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVszXTt0aGlzLlpxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzZdfWMuRm49YjtiLnByb3RvdHlwZT17RXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZyOnRoaXMuSHMoYSl9LEhzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Jczp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWG46dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlVqOnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5acTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuRm58fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5Fcig0KTsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuYXM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LApxdzpmdW5jdGlvbigpe30sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLmptfHxQOyhmdW5jdGlvbihjKXtjLmltPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuSXQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuaW18fFE7KGZ1bmN0aW9uKGMpe2Mua209cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMua218fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD0KdGhpcy5hWzFdO3RoaXMuVHE9dGhpcy5hWzRdO3RoaXMuS3M9dGhpcy5hWzFdO3RoaXMuTHA9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemw6dGhpcy5TcShhKX0sU3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRxOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lczp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBUYj1jLkxtfHxUYixNYz1uZXcgVGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LApTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlkoYS5wYXJlbnROb2RlKX0sTzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgYWE9Yy50a3x8YWE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuT2c9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5CYz10aGlzLkFhPXRoaXMuWWM9ITE7dGhpcy52aD1lLkViKDEwKTsKdGhpcy5YZygpfSxYZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMub2IoKSwhMDt0aGlzLk9nKys7aWYoMTA8dGhpcy5PZyl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5zKCEwKTp0aGlzLnMoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhnLmJpbmQodGhpcyksMTAwKSwhMX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksCjIwKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5za3x8YmE7KGZ1bmN0aW9uKGMpe2MudWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7CmlmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBhYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGFhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLnVrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzJdOwp0aGlzLmtzPXRoaXMuYVs5XTt0aGlzLmJwPXRoaXMuYVsxXTt0aGlzLnd2PXRoaXMuYVsxMF07dGhpcy5Kaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Hbj1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnU6dGhpcy5qcyhhKX0sanM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rczp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYnA6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnd2OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Kazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuR258fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpOYy5NdSg0KTsoZnVuY3Rpb24oYyl7Yy5Xaj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLldqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5mZygpfSxmZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwKKGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBZYj1jLlZqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuWGp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuR3Y9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5NcT1iO2IucHJvdG90eXBlPXt3ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueGo6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFvOnRoaXMuRnYoYSl9LEZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBhYz1jLk1xfHxhYyxPYz1uZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy53aig0KTsoZnVuY3Rpb24oYyl7Yy5raT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMua2l8fGJjOyhmdW5jdGlvbihjKXtjLmppPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpOwp0aGlzLmhlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxEYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5zKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5iZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfSxoZTpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKCkpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5oZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwxRTQpO3RoaXMuSShiKX19KX0pKGMpO3ZhciBjYz1jLmppfHxjYzsoZnVuY3Rpb24oYyl7Yy5saT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFhhOmZ1bmN0aW9uKGIpe2I9bmV3IGJjKGIpO2IucWE/dGhpcy5SKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgY2MoYix0aGlzLkspKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPQowO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlhhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5YYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmxpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuVm49dGhpcy5hWzldO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMuUmk9dGhpcy5hWzNdO3RoaXMubW09dGhpcy5hWzZdO3RoaXMuJGw9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5ncz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5SaihhKX0sClJqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2o6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZuOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUmk6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kbDp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLmdzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Ibig0KTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9dGhpcy5haD10aGlzLiRnPSExO3RoaXMuQWQ9W107dGhpcy4kZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy50bD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLm9xKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7CmI9dGhpcy4kZVtjXTt0aGlzLnZmKGIpJiYodGhpcy5BZC5wdXNoKGIpLHRoaXMuQWgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBxPyEwOiExfSxvcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxhdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLnRsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMueHU9dGhpcy5hWzZdO3RoaXMuS2o9dGhpcy5hWzZdO3RoaXMuWm09dGhpcy5hWzFdO3RoaXMuR2k9dGhpcy5hWzEwXTt0aGlzLkd1PXRoaXMuYVsyXTt0aGlzLllyPXRoaXMuYVs1XTt0aGlzLlJxPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLlp1PWI7Yi5wcm90b3R5cGU9e3d1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHU6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLktqOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5abTp0aGlzLkZpKGEpfSxGaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuR2k6dGhpcy5GdShhKX0sRnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkd1OnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuWnV8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLnd1KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLndjKGsuUnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsCiEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS53YyhrLmVzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5UZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlRnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7CkkuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnZnKHdpbmRvdyxJLmZyKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50aj10aGlzLmFbNF07dGhpcy56dj10aGlzLmFbMl07dGhpcy5waj10aGlzLmFbOF07dGhpcy5DcD10aGlzLmFbOF07dGhpcy5aaz10aGlzLmFbNl07dGhpcy5QbD10aGlzLmFbM107dGhpcy5Iaj10aGlzLmFbN107dGhpcy5saz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5ydj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGo6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnp2OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wajp0aGlzLkJwKGEpfSxCcDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkNwOnRoaXMuWWsoYSl9LFlrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aazp0aGlzLk9sKGEpfSxPbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGw6dGhpcy5HaihhKX0sR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Iajp0aGlzLmtrKGEpfSxrazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLnJ2fHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5zaig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuc2g9dGhpcy5jb25mPXRoaXMuamI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLndkPTA7dGhpcy5aYT0iIjt0aGlzLkJkPVtdO3RoaXMuQ2Q9MDt0aGlzLnVoPSExO3RoaXMuWGU9CltdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e0d0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxCdDpmdW5jdGlvbihhKXt0aGlzLmpiPWF9LEF0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuWmFdJiZ0aGlzLmNvbmZbdGhpcy5aYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlphXVthXSk7cmV0dXJuIGJ9LEljOmZ1bmN0aW9uKGEsYil7ZS5CYSgid2VsdC5kZSIpJiZlLllhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmdyKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSx0aGlzLmpiLlplLGZ1bmN0aW9uKCl7dGhpcy5JYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuamIuc2MpO2Vsc2UgaWYodGhpcy5FcSgpKXRoaXMud3QoZnVuY3Rpb24oKXt0aGlzLkljKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5mZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuY3UoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5sYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuamIsZyk7bC56dCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLlJyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPXRoaXMucGxheWVyLkdlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkllKGEsYyxmKTt0aGlzLnBsYXllci5DaChsKX19LGdyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMud2QpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy53ZC5nZXRUaW1lKCksdGhpcy53ZD1hLDNFNTxiPyEwOiExO3RoaXMud2Q9YTtyZXR1cm4hMX0sVnQ6ZnVuY3Rpb24oKXtlLmxiKCJwcmVyb2xsIik7ZS5lZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnJnKGEpKT90aGlzLkljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfSxVdDpmdW5jdGlvbihhKXtpZighdGhpcy5zaCl7ZS5lZigicG9zdHJvbGwiKTtlLmxiKCJwb3N0cm9sbCIpO3RoaXMuR3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMucmcoYykpP3RoaXMuSWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZ2QsdGhpcy5wbGF5ZXIudSgpKSl9fSxyZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuS3QodGhpcy5VdC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxIZDpmdW5jdGlvbihhKXtlLmxiKCJtaWRyb2xsIik7ZS5lZigibWlkcm9sbCIpO2lmKCF0aGlzLmhoKXt0aGlzLmhoPSEwO3ZhciBiPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkljKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0sa3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5GdCh0aGlzLkhkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkxlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZ0KCk7dGhpcy5wbGF5ZXIuTGUmJnRoaXMua3QoKTsKdGhpcy5sdCgpfSxtdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkJkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5FdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQ2Q9dGhpcy5CZC5sZW5ndGh9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkNkJiYoYT0hMCk7cmV0dXJuIGF9LHd0OmZ1bmN0aW9uKGEpe3RoaXMudWg9YTtmb3IoYT0wO2E8dGhpcy5CZC5sZW5ndGg7YSsrKXRoaXMuQmRbYV1bImZ1bmN0aW9uIl0odGhpcy5acy5iaW5kKHRoaXMpKX0sWnM6ZnVuY3Rpb24oYSl7dGhpcy5DZC0tO2EmJnRoaXMuWGUucHVzaChhKTsKMD49dGhpcy5DZCYmdGhpcy51aCgpfSxScjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9dGhpcy5YZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5taXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55az10aGlzLmFbN107dGhpcy5TbD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzNdO3RoaXMuTnQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5OcD1iO2IucHJvdG90eXBlPXt4azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3A6CnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5abjp0aGlzLk10KGEpfSxNdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5OcHx8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMueGsoNCl9KS5jYWxsKE9oamF1ZGlwQWxpZWNhaUosT2hqYXVkaXBBbGllY2FpSik7Cg==
- 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
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
|
GET
H/1.1
|
200
OK
|
sbt.js
Show response
static.cliipa.com/basev/1.0.306/
Frame 9BA9
|
518 KB
116 KB
|
10ms
10ms
|
Script
application/javascript |
69.16.175.10
Highwinds Network...
|
|
General
- Full URL
- https://static.cliipa.com/basev/1.0.306/sbt.js
- Requested by
- Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
69.16.175.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- tlb.hwcdn.net
- Software
-
/
- Resource Hash
- 230287b29094522a46f74f69cd0ee9dd174e73b9e6f67a0340798cd89a57a2f5
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
11 KB
11 KB
|
43ms
26ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/
|
676 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/OvaMediaPlayer.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f49737b6c3e21187c8bbeb786a2657904a47ba34b42f12752f4e7fafb5889e7a
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
77 B
|
18ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7WzsCFgPCRy_OC6aURATCRy_OC6aURAUAAAAGBvQHGzFc7oYrGodFIi5Xo-VktVwMF4PhcrNYDGEjhsvdcEXjsEjE5Wq0nKyGm8FkthosJpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUUFiESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0pRCLn4UBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAs6glYMBqsziMlmtJvMDgAAAODu____Xw_kZiPHcLQYzhaO2WLj2i0nht3IM3MYN6ORyWLbbQ8YrucpwqgxrW9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhEmNgvjaOHxrRWb1cQt2ox2a4lrMHOLDBOXyTJzrhyO2Vr0-phOu9HIYfFtUTBAaS-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-x7s5FjOFoMZwvHbLFx7ZYTw27kmTmMm9HIZLHt9o3NwjhaeHxrxWY1cYs2o91a4hrM3CLDxGWyzJwrh2O2Fr0-ptNuNHJYfPvGajbczDbDzWLfWM2Gm9lmuFnsO3SG7-pzNipvWoVHJnS4xt2mzGlQuAwW709iWky7s4Pn9zs6VaqLxtiQfRMKs8FjMChiieB0kU5EL-PpIpZInhbpRLjaDEbLiW20Wy1nHpvFY5vNZs6ZceZyDYe74coilihNF-lEr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5XZZ1H9siNForpvNFYPlXDNYJQAAAAAAAACAJcyZNwEAAAA4DWSxGEwWywWAEGPdJfiUCnl0An8rbvwYYk6Xv8tleWveFrfO6XNYGUBipwA!&cmcv=&pix=31589837&cb=1568363833347&uv=23122&tms=1568363833347&abt=aat1_vA!expl_vA!sac5_vB!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1568363830625.302!ts:1568363833347&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
18ms
15ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7WzsCFgPCRy_OC6aURATCRy_OC6aURAUAAAAGBvQHGzFc7oYrGodFIi5Xo-VktVwMF4PhcrNYDGEjhsvdcEXjsEjE5Wq0nKyGm8FkthosJpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUUFiESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0pRCLn4UBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAs6glYMBqsziMlmtJvMDgAAAODu____Xw_kZiPHcLQYzhaO2WLj2i0nht3IM3MYN6ORyWLbbQ8YrucpwqgxrW9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhEmNgvjaOHxrRWb1cQt2ox2a4lrMHOLDBOXyTJzrhyO2Vr0-phOu9HIYfFtUTBAaS-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-x7s5FjOFoMZwvHbLFx7ZYTw27kmTmMm9HIZLHt9o3NwjhaeHxrxWY1cYs2o91a4hrM3CLDxGWyzJwrh2O2Fr0-ptNuNHJYfPvGajbczDbDzWLfWM2Gm9lmuFnsO3SG7-pzNipvWoVHJnS4xt2mzGlQuAwW709iWky7s4Pn9zs6VaqLxtiQfRMKs8FjMChiieB0kU5EL-PpIpZInhbpRLjaDEbLiW20Wy1nHpvFY5vNZs6ZceZyDYe74coilihNF-lEr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5XZZ1H9siNForpvNFYPlXDNYJQAAAAAAAACAJcyZNwEAAAA4DWSxGEwWywWAEGPdJfiUCnl0An8rbvwYYk6Xv8tleWveFrfO6XNYGUBipwA!&cmcv=&pix=&cb=1568363833372&uv=23122&tms=1568363833372&abt=aat1_vA!expl_vA!sac5_vB!ufm_vA&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
POST
H2
|
204
|
ngx_pagespeed_beacon
Show response
www.giga.de/
|
0
73 B
|
11ms
10ms
|
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
BLOB
|
200
OK
|
f69b3f1b-82b2-4bbe-8b1e-2bc8ebbdac6c
https://www.giga.de/
Frame 9BA9
|
1 KB
0
|
|
Other
text/plain |
|
|
|
GET
BLOB
|
200
OK
|
4dd45976-c2f6-4c0a-9402-b0d0d390fa5d
https://www.giga.de/
Frame 9BA9
|
1 KB
0
|
|
Other
text/plain |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 9BA9
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 9BA9
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 1F1F
|
41 KB
13 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
BLOB
|
206
Partial Content
|
4d2ac18c-5296-4411-ba6c-c7eb25daa3b9
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
052d8b21-f1a9-4507-9097-f0e94a2d2a94
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
16ms
5ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/607/2256/s/
|
39 KB
14 KB
|
52ms
17ms
|
Script
application/javascript |
89.163.159.109
MYLOC-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
55ms
20ms
|
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
|
95ms
22ms
|
Script
application/javascript |
194.213.222.29
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
26ms
26ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
|
GET
H/1.1
|
200
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
673 B
|
40ms
8ms
|
Image
image/gif |
54.93.224.155
Amazon.com
|
|
|
GET
H/1.1
|
206
Partial Content
|
5a68b55943ab0f00040790e9.mp4
inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a68b55943ab0f00040790e9/
Frame 9BA9
|
64 KB
0
|
45ms
6ms
|
Media
video/mp4 |
69.16.175.10
Highwinds Network...
|
|
General
- Full URL
- https://inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a68b55943ab0f00040790e9/5a68b55943ab0f00040790e9.mp4
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
69.16.175.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- tlb.hwcdn.net
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
pubads_impl_2019090501.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 1F1F
|
159 KB
58 KB
|
38ms
38ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 1F1F
|
113 B
175 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/
|
14 KB
3 KB
|
6ms
5ms
|
Stylesheet
text/css |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/player.css
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5
|
GET
H2
|
200
|
dsm.js
Show response
vidstat.taboola.com/vpaid/ds/176/
|
1 KB
749 B
|
5ms
5ms
|
Script
application/octet-stream |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7WzsCFgPCRy_OC6aURATCRy_OC6aURAUAAAAGBvQHGzFc7oYrGodFIi5Xo-VktVwMF4PhcrNYDGEjhsvdcEXjsEjE5Wq0nKyGm8FkthosJpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUUFiESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0pRCLn4UBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAs6glYMBqsziMlmtJvMDgAAAODu____Xw_kZiPHcLQYzhaO2WLj2i0nht3IM3MYN6ORyWLbbQ8YrucpwqgxrW9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhEmNgvjaOHxrRWb1cQt2ox2a4lrMHOLDBOXyTJzrhyO2Vr0-phOu9HIYfFtUTBAaS-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-x7s5FjOFoMZwvHbLFx7ZYTw27kmTmMm9HIZLHt9o3NwjhaeHxrxWY1cYs2o91a4hrM3CLDxGWyzJwrh2O2Fr0-ptNuNHJYfPvGajbczDbDzWLfWM2Gm9lmuFnsO3SG7-pzNipvWoVHJnS4xt2mzGlQuAwW709iWky7s4Pn9zs6VaqLxtiQfRMKs8FjMChiieB0kU5EL-PpIpZInhbpRLjaDEbLiW20Wy1nHpvFY5vNZs6ZceZyDYe74coilihNF-lEr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5XZZ1H9siNForpvNFYPlXDNYJQAAAAAAAACAJcyZNwEAAAA4DWSxGEwWywWAEGPdJfiUCnl0An8rbvwYYk6Xv8tleWveFrfO6XNYGUBipwA!&cmcv=&uv=23122&unm=FEED_MANAGER&cb=1568363833623&abt=aat1_vA!expl_vA!sac5_vB!ufm_vA&baseReportD=taboola.com&dataCenter=am&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
3ms
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&_=1568363833643.-419479828
- 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
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 9BA9
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjst3puzM-4Y-Ktv_sjpIofasO-X-ek91XjxehXoKA7HvzkG6QD9ngHV2hcrA9N0slvw_rFHHj443RiRX5i--v5khoRHTEzsVfmIqXt8SCtY&sig=Cg0ArKJSzAV3AL8hilXmEAE&adk=3179048887&tt=138&bs=1585%2C1200&mtos=1108,1108,1108,1108,1108&tos=1108,0,0,0,0&p=278,967.5,528,1267.5&mcvt=1108&rs=3&ht=0&tfs=1190&tls=2298&mc=1<e=1&bas=0&bac=0&met=0&avms=nio&niot_obs=959&niot_cbk=1019&md=2&rst=1568363832317&rpt=139&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1585%2C6699&ss=1600%2C1200&pt=2161&bin=1&deb=1-2-7-18-20-16-116-18-0-0-0&tvt=2289&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=20190909
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.2/
|
4 KB
2 KB
|
25ms
9ms
|
Script
application/javascript |
2600:9000:2057:e00:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 1F1F
|
19 KB
8 KB
|
312ms
312ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1994520669297679&correlator=480827571355416&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21064552%2C21062888%2C21063636&vrg=2019090501&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190913&iu=%2F5286166%2Fgiga.de%2FVidazoo-Passback-300x250&sz=300x250&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&lmt=1568363833&dt=1568363833714&dlt=1568363833469&idt=232&ea=0&frm=23&biw=1585&bih=1200&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3503934010&uci=83req8gj52g&ifi=1&ifk=2079463813&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=2&iag=15&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=2&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1151781421.1568363834&ga_sid=1568363834&ga_hid=1926086429&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019090501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- de63ad1c3fb42acda070c53b705a18d969c48ed0bb2bcda26fcaacc3b8dc1989
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019090501.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 1F1F
|
63 KB
24 KB
|
39ms
39ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
|
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 1F1F
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
161ms
97ms
|
Script
text/plain |
89.163.159.120
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.120
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
28ms
28ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=562f6e0592a50266d82bbdd8627b2056&event_id=page_view&_sid=69511&_ver=0.2.2&_seg=jsonp&_=365703241703
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.2/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.208.73.164
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 12cdcb56f128495591fd6b264ba187967a9e635891b09d8619681eb0116e8314
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
118ms
27ms
|
Script
application/javascript |
34.250.43.132
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame BB4E
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCEiBCBsJsBsRCWDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4203766813119717598
|
42 B
662 B
|
29ms
27ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame A38B
|
0
0
|
108ms
27ms
|
Document
text/html |
108.128.71.27
Amazon.com
|
|
General
- Full URL
- https://adstax-match.adrtx.net/activation?receiverId=adaud
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
108.128.71.27
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
- Software
-
akka-http/10.1.9 /
- Resource Hash
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 17DC
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:825::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019090501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 1F1F
|
76 KB
28 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019090501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
26ms
26ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
utsync.ashx
Show response
ml314.com/
Frame C71B
|
573 B
1 KB
|
94ms
29ms
|
Script
application/javascript |
34.247.144.106
Amazon.com
|
|
General
- Full URL
- https://ml314.com/utsync.ashx?pub=&adv=&et=0&eid=50282&ct=js&pi=&fp=&clid=&if=1&ps=&cl=&mlt=&data=&&cp=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pv=1568363832108_2zcsbvh5j&bl=en-us&cb=7202132&return=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5031%263pid%3D%5BPersonID%5D&ht=&d=&dc=&si=1568363832108_2zcsbvh5j&cid=&s=1600x1200&rp=
- Requested by
- Host: ml314.com
URL: https://ml314.com/tag.aspx?138
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.247.144.106
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-34-247-144-106.eu-west-1.compute.amazonaws.com
- Software
-
Microsoft-IIS/10.0 /
ASP.NET
- Resource Hash
- 6ce766de94077b4e60303af4cc43beadb70f2dff773cae87eaffdd5e1383992a
|
GET
H/1.1
|
200
OK
|
csync.ashx
ml314.com/
Frame C71B
Redirect Chain
-
https://ib.adnxs.com/getuid?https://ml314.com/csync.ashx%3Ffp=$UID%26person_id=5978151496988943630%26eid=2
-
https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fml314.com%2Fcsync.ashx%253Ffp%3D%24UID%2526person_id%3D5978151496988943630%2526eid%3D2
-
https://ml314.com/csync.ashx?fp=8048907583063875128&person_id=5978151496988943630&eid=2
|
43 B
312 B
|
149ms
71ms
|
Image
image/gif |
34.247.144.106
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
csync.ashx
ml314.com/
Frame C71B
Redirect Chain
-
https://tags.bluekai.com/site/20486?limit=0&id=5978151496988943630&redir=https://ml314.com/csync.ashx%3Ffp=$_BK_UUID%26person_id=5978151496988943630%26eid=50056
-
https://ml314.com/csync.ashx?fp=Ide%2BmQ999992OU%2B5&person_id=5978151496988943630&eid=50056
|
43 B
312 B
|
35ms
34ms
|
Image
image/gif |
34.247.144.106
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
match
ps.eyeota.net/
Frame C71B
Redirect Chain
-
https://ps.eyeota.net/pixel?pid=r8hrb20&t=gif
-
https://ps.eyeota.net/pixel/bounce/?pid=r8hrb20&t=gif
-
https://ml314.com/utsync.ashx?eid=50052&et=0&fp=2edf3diw4sFa-EpthQA_PlYOpHokFe418YvxiU-KZPj0&gdpr=1&gdpr_consent=&return=https%3A%2F%2Fps.eyeota.net%2Fmatch%3Fbid%3Dr8hrb20%26uid%3Dnil
-
https://ml314.com/csync.ashx?fp=2edf3diw4sFa-EpthQA_PlYOpHokFe418YvxiU-KZPj0&person_id=5978151496988943630&eid=50052&return=https%3a%2f%2fps.eyeota.net%2fmatch%3fbid%3dr8hrb20%26uid%3dnil
-
https://ps.eyeota.net/match?bid=r8hrb20&uid=nil
|
70 B
171 B
|
67ms
7ms
|
Image
image/gif |
18.195.251.148
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
merge
ce.lijit.com/
Frame C71B
|
0
532 B
|
53ms
12ms
|
Image
text/html |
72.251.249.9
Internap Corporation
|
|
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 096F
Redirect Chain
-
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
-
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
|
0
0
|
58ms
55ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.161.0 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 522C
|
0
0
|
36ms
5ms
|
Document
text/html |
151.101.113.108
Fastly
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame DF0C
|
0
0
|
32ms
9ms
|
Document
text/html |
104.111.230.142
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame 1993
|
0
0
|
30ms
8ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb59.s400.meetrics.net/
|
43 B
308 B
|
5ms
2ms
|
Image
image/gif |
136.243.5.11
HETZNER-AS
|
|
General
- Full URL
- https://lb59.s400.meetrics.net/data?/J1/wKKOBALlnFFLl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A24Az2Az4AzwA2yA12A1mE5rE4zE5sF4BEUkzF2BPlAAAAAAAABHLIAPAAAFAAHLITMPsAPAAAJPAWEABMPsAZAAAOA55A55A85B55A58E55A55AFAzzA03A5BErMPsAPKEAJPAWEAHMPsAPWKAAZAwSAcAAAASksFhFjAAAAAAAAAAAAEAAAHLIAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA21AwwAz2AyzAGAkpFylFj0FAAAAJAxzAxxA12A4xA1BEKA1wAw1A43A40Ax4AJAylFj0FhuFnsFlBFKA1wAw1A43A40Ax4AKA1wAw1A43A40Ax4AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAMPsAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFDyG/SA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.11
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h232.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
18ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
/
Show response
onetag-geo.s-onetag.com/
|
23 B
433 B
|
36ms
7ms
|
XHR
application/json |
2600:9000:2057:f600:5:ae3a:ba00:93a1
Amazon.com
|
|
|