GET
H2
|
200
|
Primary Request
/
Show response
www.tvtoday.de/
Redirect Chain
-
http://tvtoday.de/
-
https://www.tvtoday.de/
|
656 KB
69 KB
|
88ms
26ms
|
Document
text/html |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
dfdd70c.css
www.tvtoday.de/css/
|
313 KB
39 KB
|
33ms
24ms
|
Stylesheet
text/css |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
roboto-v18-latin-regular.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
47ms
40ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-regular.woff2
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
roboto-condensed-v16-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
45ms
39ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/fonts/roboto-condensed-v16-latin-700.woff2
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
roboto-v18-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
45ms
39ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-700.woff2
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
wrapperMessagingWithoutDetection.js
Show response
cdn.privacy-mgmt.com/
|
147 KB
43 KB
|
137ms
52ms
|
Script
application/javascript |
13.224.94.116
AMAZON-02
|
|
|
GET
H2
|
200
|
channel_webp_optimized.css
a2.tvspielfilm.de/images/tv/sender/mini/
|
22 KB
3 KB
|
92ms
22ms
|
Stylesheet
text/css |
2.16.186.73
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
46cfa08.js
Show response
www.tvtoday.de/js/
|
16 KB
5 KB
|
29ms
26ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
adengine.js
Show response
a.bf-ad.net/adengine/tvtoday/
|
600 KB
184 KB
|
42ms
14ms
|
Script
application/x-javascript |
2a02:26f0:6c00::210:bab8
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
tfm.videopkg.min.js
Show response
www.tvtoday.de/js/
|
150 KB
44 KB
|
51ms
48ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
19 KB
8 KB
|
83ms
28ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
tvt_logo_500x100.png
www.tvtoday.de/bundles/frontend/images/logos/
|
37 KB
38 KB
|
28ms
25ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/images/logos/tvt_logo_500x100.png?10.48
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
vikings,201441_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
|
7 KB
7 KB
|
52ms
42ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/201807/3/vikings,201441_navigation_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
avengers-age-of-ultron,201255_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
|
13 KB
13 KB
|
52ms
42ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/201807/3/avengers-age-of-ultron,201255_navigation_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- e8aaebf9f69815ea93b6beff9b78806dacc9bcbf2a25eeee2297d5a95f1e2431
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tvs_partner_logo.png
www.tvtoday.de/bundles/frontend/images/logos/
|
4 KB
5 KB
|
50ms
48ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/images/logos/tvs_partner_logo.png?10.48
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
5fd3a05e8189656084da4b14_780.jpg
images.tvtoday.de/itv/2021-01-12/
|
33 KB
33 KB
|
51ms
42ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/itv/2021-01-12/5fd3a05e8189656084da4b14_780.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- e8ba645d16c5d536f8972f469073ef79605040e36d933d1cca13e763b70f198e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tatort-im-tv-quicklink-startseite-2020,225318_tm_100.jpg
images.tvtoday.de/files/images/202002/4/
|
22 KB
22 KB
|
52ms
43ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/4/tatort-im-tv-quicklink-startseite-2020,225318_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 8d60669fddbf6b72a2e5fc8c13da74bbf90d1ea5da6676e058346414a14f2d55
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
fussball-im-tv-quicklink-startseite-2020,225320_tm_100.jpg
images.tvtoday.de/files/images/202002/3/
|
16 KB
16 KB
|
50ms
41ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/3/fussball-im-tv-quicklink-startseite-2020,225320_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 19d502b1c90d16b4132b9b01229277607cd18150518ec92a806c475a7426238b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
erotik-im-tv-quicklink-startseite-2020,225322_tm_100.jpg
images.tvtoday.de/files/images/202002/5/
|
17 KB
18 KB
|
51ms
42ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/5/erotik-im-tv-quicklink-startseite-2020,225322_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 103f77ffb505419ca5a6e4a8b74d9398f58ed76e484002911fd94e5796075bbb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tv-tipps-heute-quicklink-startseite-2020,225317_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
10 KB
10 KB
|
34ms
33ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/tv-tipps-heute-quicklink-startseite-2020,225317_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 07effd27c24e20b1fc30659b8b771d95c785ab4d3dc3dedaccfcfbfd95b435e6
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
alle-spielfilme-quicklink-startseite-2020,225321_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
12 KB
12 KB
|
122ms
122ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/alle-spielfilme-quicklink-startseite-2020,225321_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 4dd67b29cc3e3eb840d0dce2c9088000e06b21134aabb021f2a2f98e5dc124b8
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
mediatheken-tipps-quicklink-startseite-2020,225319_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
15 KB
16 KB
|
36ms
35ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/mediatheken-tipps-quicklink-startseite-2020,225319_tm_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- e83b8ec23b952200c3ba4729bfbac3b4379e66de48a31ca39c255fa7201ea65a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
de.js
Show response
a.bf-tools.net/de/
|
12 KB
4 KB
|
28ms
6ms
|
Script
application/x-javascript |
2a02:26f0:6c00::210:bab2
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
46 KB
18 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:808::200e
GOOGLE
|
|
|
GET
H2
|
200
|
gtm.js
Show response
www.googletagmanager.com/
|
115 KB
39 KB
|
22ms
22ms
|
Script
application/javascript |
2a00:1450:4001:808::2008
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2F...
-
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2F...
|
0
717 B
|
26ms
26ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=01000000000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0013&i2=00138eb47253bf4865ffcf3d1&ep=1640685512&vr=418&id=b3ypd5&i3=00138eb47253bf4865ffcf3d1%3A1638320209800%3A1610413009800%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1610413009800&n1=1&dntt=0<=1610413009801&ev=&cs=gb5qpa&mo=1&sr=71
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.06.2 0042
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
DATA
|
200
OK
|
truncated
/
|
43 B
0
|
|
Image
image/gif |
|
|
|
GET
H2
|
200
|
live-tv-small.png
www.tvtoday.de/bundles/frontend/images/
|
17 KB
17 KB
|
27ms
27ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/images/live-tv-small.png
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/css/dfdd70c.css?10.48
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
DATA
|
200
OK
|
truncated
/
|
698 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
856 B
0
|
|
Image
image/svg+xml |
|
|
|
POST
H3-Q050
|
200
|
collect
Show response
www.google-analytics.com/j/
|
4 B
390 B
|
39ms
13ms
|
XHR
text/plain |
2a00:1450:4001:808::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/j/collect?v=1&_v=j87&aip=1&a=1041689629&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=YEBAAEABAAAAAC~&jid=841521629&gjid=1476545192&cid=1514907126.1610413010&tid=UA-1909021-1&_gid=1790450104.1610413010&_r=1&_slc=1&cd4=0&z=1605017735
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
www.tvtoday.de/files/images/201711/2/
|
15 KB
15 KB
|
114ms
113ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/files/images/201711/2/neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
www.tvtoday.de/files/images/201901/2/
|
4 KB
4 KB
|
114ms
113ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/files/images/201901/2/tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
DATA
|
200
OK
|
truncated
/
|
596 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
427 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
298 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
H2
|
200
|
2b652e5.js
Show response
www.tvtoday.de/js/
|
25 KB
8 KB
|
45ms
45ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
POST
H2
|
200
|
collect
Show response
stats.g.doubleclick.net/j/
|
1 B
443 B
|
40ms
13ms
|
XHR
text/plain |
2a00:1450:400c:c00::9b
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j87&tid=UA-1909021-1&cid=1514907126.1610413010&jid=841521629&gjid=1476545192&_gid=1790450104.1610413010&_u=YEBAAEAAAAAAAC~&z=1452965241
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c00::9b
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ima3.js
Show response
s0.2mdn.net/instream/html5/
|
316 KB
109 KB
|
34ms
14ms
|
Script
text/javascript |
2a00:1450:4001:825::2006
GOOGLE
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
OPTIONS
H2
|
200
|
native-message
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/
Frame
|
0
0
|
81ms
25ms
|
Other
text/html |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%224f8d0acd-2e8a-4dcb-86a8-c0453f2ed591%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
- Protocol
- H2
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
/
Express
- Resource Hash
|
GET
H2
|
200
|
native-message
Show response
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/
|
44 KB
6 KB
|
35ms
34ms
|
XHR
application/json |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%224f8d0acd-2e8a-4dcb-86a8-c0453f2ed591%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
/
Express
- Resource Hash
- 5ad41f43166b293e1185b60b01a3a4247cfe8ac889b339df3de215f2f7934d8a
|
GET
DATA
|
200
OK
|
truncated
/
|
42 B
0
|
|
Image
image/webp |
|
|
|
GET
H2
|
200
|
sprite_web_optimized_1608300055.webp
a2.tvspielfilm.de/images/tv/sender/mini/
|
202 KB
202 KB
|
24ms
24ms
|
Image
image/webp |
2.16.186.73
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
config.js
Show response
www.tvtoday.de/app/js/
|
827 B
555 B
|
25ms
25ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
vpE4IgkWTromHGP-jack-improve-86,175986_artikel_100.jpg
images.tvtoday.de/files/images/297608/1/
|
68 B
278 B
|
44ms
44ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
main.js
Show response
www.tvtoday.de/app/js/
|
452 KB
123 KB
|
25ms
25ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
vpE4IgkWTromHGPpr3sdVITWKCbr0PD30lOGVu9Q5JsqmBFLrbTuDHyK3nwo7T7zc8c.png
uobsoe.com/img/promotools/
|
68 B
242 B
|
96ms
32ms
|
Image
image/png |
136.243.25.11
HETZNER-AS
|
|
|
GET
H2
|
200
|
index.html
Show response
cmp.tvtoday.de/
Frame C825
|
4 KB
2 KB
|
66ms
21ms
|
Document
text/html |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 73acb88154558109a568cb65e76ae54cc7cd7e8e1174db5aca1bcc333659e2c5
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
703 B
|
414ms
117ms
|
XHR
application/json |
52.217.10.246
AMAZON-02
|
|
|
GET
H2
|
200
|
homad_clienConfig.json
Show response
www.tvtoday.de/js/
|
291 B
392 B
|
25ms
25ms
|
XHR
application/json |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
547f0c02e4b089153cb74c69_780.jpg
images.tvtoday.de/itv/2021-01-12/
|
17 KB
18 KB
|
25ms
25ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
harry-potter-wichtiges-detail-ueber-harry,230086_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
13 KB
13 KB
|
26ms
26ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
daisy-ridley-in-star-wars-9-der-aufstieg-skywalkers,230079_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
11 KB
11 KB
|
27ms
26ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
daniel-meyer,230073_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
9 KB
9 KB
|
27ms
26ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
StickySearchController.js
Show response
www.tvtoday.de/app/js/components/header/
|
404 B
488 B
|
34ms
33ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/app/js/components/header/StickySearchController.js
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
151.106.72.75
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
|
234 B
1005 B
|
70ms
23ms
|
XHR
application/json |
143.204.93.40
AMAZON-02
|
|
|
GET
H2
|
200
|
Notice.7f9f7.css
cmp.tvtoday.de/
Frame C825
|
27 KB
5 KB
|
22ms
21ms
|
Stylesheet
text/css |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/Notice.7f9f7.css
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 0ae5db3739ab7117213fc81312987373f78ea0b7006e644b2fa00b99ca04c0ad
|
GET
H2
|
200
|
polyfills.ede70.js
Show response
cmp.tvtoday.de/
Frame C825
|
5 KB
2 KB
|
23ms
23ms
|
Script
application/javascript |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/polyfills.ede70.js
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- feffa10be7222692f7cf76470564dbe7c0a3d76d5f4da8c12006b879f1cd21ec
|
GET
H2
|
200
|
Notice.c3b1a.js
Show response
cmp.tvtoday.de/
Frame C825
|
160 KB
40 KB
|
23ms
23ms
|
Script
application/javascript |
65.9.7.35
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/Notice.c3b1a.js
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=3353fcc2-1375-4cee-969f-458a87c9c5f0&requestUUID=4f8d0acd-2e8a-4dcb-86a8-c0453f2ed591&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.7.35
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 2b4bc61ab37d7386d97ca8418168601c9f9e6f44fcddb47fe97ebf29bfdbc01b
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.tvtoday.de/04162bfd2bcaffc37e213df8df6197ba4a529801/
|
247 KB
76 KB
|
172ms
83ms
|
XHR
application/javascript |
148.251.89.206
HETZNER-AS
|
|
|
GET
H2
|
200
|
/
d2p3zdq8vjvnxd.cloudfront.net/
Frame C825
|
26 B
367 B
|
51ms
25ms
|
Image
image/gif |
2600:9000:2190:ac00:13:7ad6:7840:21
AMAZON-02
|
|
|
GET
H2
|
200
|
noun_Security_2839859.png
p5.focus.de/fol/multimedia/consentlayer/
Frame C825
|
24 KB
25 KB
|
48ms
8ms
|
Image
image/webp |
2a02:26f0:6c00::210:bb28
AKAMAI-ASN1
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
247 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
703 B
|
103ms
103ms
|
XHR
application/json |
52.217.10.246
AMAZON-02
|
|
|
GET
H2
|
200
|
homad_clienConfig.json
Show response
www.tvtoday.de/js/
|
291 B
391 B
|
26ms
25ms
|
XHR
application/json |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
|
234 B
1014 B
|
23ms
22ms
|
XHR
application/json |
143.204.93.40
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.tvtoday.de/70bd0fca87b0279aa577446acdaad79e1f02d95c/
|
234 B
1 KB
|
93ms
93ms
|
XHR
application/json |
148.251.89.206
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.tvtoday.de/
|
24 B
356 B
|
115ms
25ms
|
Script
application/octet-stream |
78.46.33.212
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.tvtoday.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,KGZ1bmN0aW9uKCkge2Z1bmN0aW9uIGVhKGspe3ZhciBuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG48ay5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6a1tuKytdfTp7ZG9uZTohMH19fXZhciBoYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGssbix4KXtrIT1BcnJheS5wcm90b3R5cGUmJmshPU9iamVjdC5wcm90b3R5cGUmJihrW25dPXgudmFsdWUpfTtmdW5jdGlvbiBGYShrKXtrPVsib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCxrXTtmb3IodmFyIG49MDtuPGsubGVuZ3RoOysrbil7dmFyIHg9a1tuXTtpZih4JiZ4Lk1hdGg9PU1hdGgpcmV0dXJuIHh9dGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGdsb2JhbCBvYmplY3QiKTt9CnZhciBRYT1GYSh0aGlzKTtmdW5jdGlvbiBVYSgpe1VhPWZ1bmN0aW9uKCl7fTtRYS5TeW1ib2x8fChRYS5TeW1ib2w9VmEpfWZ1bmN0aW9uIGpiKGssbil7dGhpcy5hPWs7aGEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfWpiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O3ZhciBWYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoeCl7aWYodGhpcyBpbnN0YW5jZW9mIGspdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBqYigianNjb21wX3N5bWJvbF8iKyh4fHwiIikrIl8iK24rKyx4KX12YXIgbj0wO3JldHVybiBrfSgpOwpmdW5jdGlvbiB1Yigpe1VhKCk7dmFyIGs9UWEuU3ltYm9sLml0ZXJhdG9yO2t8fChrPVFhLlN5bWJvbC5pdGVyYXRvcj1RYS5TeW1ib2woIlN5bWJvbC5pdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2tdJiZoYShBcnJheS5wcm90b3R5cGUsayx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZiKGVhKHRoaXMpKX19KTt1Yj1mdW5jdGlvbigpe319ZnVuY3Rpb24gdmIoayl7dWIoKTtrPXtuZXh0Omt9O2tbUWEuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4ga31mdW5jdGlvbiBFYihrKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZrW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIG4/bi5jYWxsKGspOntuZXh0OmVhKGspfX0KZnVuY3Rpb24gRmIoayl7aWYoIShrIGluc3RhbmNlb2YgQXJyYXkpKXtrPUViKGspO2Zvcih2YXIgbix4PVtdOyEobj1rLm5leHQoKSkuZG9uZTspeC5wdXNoKG4udmFsdWUpO2s9eH1yZXR1cm4ga312YXIgUGI9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7fW4ucHJvdG90eXBlPWs7cmV0dXJuIG5ldyBufSxRYjtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKVFiPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBSYjthOnt2YXIgU2I9e1RkOiEwfSxUYj17fTt0cnl7VGIuX19wcm90b19fPVNiO1JiPVRiLlRkO2JyZWFrIGF9Y2F0Y2goayl7fVJiPSExfVFiPVJiP2Z1bmN0aW9uKGssbil7ay5fX3Byb3RvX189bjtpZihrLl9fcHJvdG9fXyE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihrKyIgaXMgbm90IGV4dGVuc2libGUiKTtyZXR1cm4ga306bnVsbH0KdmFyIFViPVFiO2Z1bmN0aW9uIHkoayxuKXtrLnByb3RvdHlwZT1QYihuLnByb3RvdHlwZSk7ay5wcm90b3R5cGUuY29uc3RydWN0b3I9aztpZihVYilVYihrLG4pO2Vsc2UgZm9yKHZhciB4IGluIG4paWYoInByb3RvdHlwZSIhPXgpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBHPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix4KTtHJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoayx4LEcpfWVsc2Uga1t4XT1uW3hdfWZ1bmN0aW9uIG1jKGssbil7aWYobil7dmFyIHg9UWE7az1rLnNwbGl0KCIuIik7Zm9yKHZhciBHPTA7RzxrLmxlbmd0aC0xO0crKyl7dmFyIEs9a1tHXTtLIGluIHh8fCh4W0tdPXt9KTt4PXhbS119az1rW2subGVuZ3RoLTFdO0c9eFtrXTtuPW4oRyk7biE9RyYmbnVsbCE9biYmaGEoeCxrLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfX0KbWMoIlByb21pc2UiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4odCl7dGhpcy5iPTA7dGhpcy5jPXZvaWQgMDt0aGlzLmE9W107dmFyIHE9dGhpcy5nKCk7dHJ5e3QocS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19ZnVuY3Rpb24geCgpe3RoaXMuYT1udWxsfWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oZnVuY3Rpb24ocSl7cSh0KX0pfWlmKGspcmV0dXJuIGs7eC5wcm90b3R5cGUuYj1mdW5jdGlvbih0KXtpZihudWxsPT10aGlzLmEpe3RoaXMuYT1bXTt2YXIgcT10aGlzO3RoaXMuZyhmdW5jdGlvbigpe3EuYygpfSl9dGhpcy5hLnB1c2godCl9O3ZhciBLPVFhLnNldFRpbWVvdXQ7eC5wcm90b3R5cGUuZz1mdW5jdGlvbih0KXtLKHQsMCl9O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYSYmdGhpcy5hLmxlbmd0aDspe3ZhciB0PXRoaXMuYTt0aGlzLmE9W107Zm9yKHZhciBxPTA7cTx0Lmxlbmd0aDsrK3Epe3ZhciByPQp0W3FdO3RbcV09bnVsbDt0cnl7cigpfWNhdGNoKHcpe3RoaXMuaSh3KX19fXRoaXMuYT1udWxsfTt4LnByb3RvdHlwZS5pPWZ1bmN0aW9uKHQpe3RoaXMuZyhmdW5jdGlvbigpe3Rocm93IHQ7fSl9O24ucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHcpe3JldHVybiBmdW5jdGlvbihJKXtyfHwocj0hMCx3LmNhbGwocSxJKSl9fXZhciBxPXRoaXMscj0hMTtyZXR1cm57cmVzb2x2ZTp0KHRoaXMuRikscmVqZWN0OnQodGhpcy5pKX19O24ucHJvdG90eXBlLkY9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMpdGhpcy5pKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk7ZWxzZSBpZih0IGluc3RhbmNlb2Ygbil0aGlzLkEodCk7ZWxzZXthOnN3aXRjaCh0eXBlb2YgdCl7Y2FzZSAib2JqZWN0Ijp2YXIgcT1udWxsIT10O2JyZWFrIGE7Y2FzZSAiZnVuY3Rpb24iOnE9ITA7YnJlYWsgYTtkZWZhdWx0OnE9ITF9cT90aGlzLm8odCk6dGhpcy5mKHQpfX07Cm4ucHJvdG90eXBlLm89ZnVuY3Rpb24odCl7dmFyIHE9dm9pZCAwO3RyeXtxPXQudGhlbn1jYXRjaChyKXt0aGlzLmkocik7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBxP3RoaXMucyhxLHQpOnRoaXMuZih0KX07bi5wcm90b3R5cGUuaT1mdW5jdGlvbih0KXt0aGlzLmwoMix0KX07bi5wcm90b3R5cGUuZj1mdW5jdGlvbih0KXt0aGlzLmwoMSx0KX07bi5wcm90b3R5cGUubD1mdW5jdGlvbih0LHEpe2lmKDAhPXRoaXMuYil0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3QrIiwgIitxKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5iKTt0aGlzLmI9dDt0aGlzLmM9cTt0aGlzLm0oKX07bi5wcm90b3R5cGUubT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuYSl7Zm9yKHZhciB0PTA7dDx0aGlzLmEubGVuZ3RoOysrdClRLmIodGhpcy5hW3RdKTt0aGlzLmE9bnVsbH19O3ZhciBRPW5ldyB4O24ucHJvdG90eXBlLkE9ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy5nKCk7CnQucmMocS5yZXNvbHZlLHEucmVqZWN0KX07bi5wcm90b3R5cGUucz1mdW5jdGlvbih0LHEpe3ZhciByPXRoaXMuZygpO3RyeXt0LmNhbGwocSxyLnJlc29sdmUsci5yZWplY3QpfWNhdGNoKHcpe3IucmVqZWN0KHcpfX07bi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoVSxHYSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFU/ZnVuY3Rpb24ocmEpe3RyeXt3KFUocmEpKX1jYXRjaChzYSl7SShzYSl9fTpHYX12YXIgdyxJLGJhPW5ldyBuKGZ1bmN0aW9uKFUsR2Epe3c9VTtJPUdhfSk7dGhpcy5yYyhyKHQsdykscihxLEkpKTtyZXR1cm4gYmF9O24ucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfTtuLnByb3RvdHlwZS5yYz1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoKXtzd2l0Y2gody5iKXtjYXNlIDE6dCh3LmMpO2JyZWFrO2Nhc2UgMjpxKHcuYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIisKdy5iKTt9fXZhciB3PXRoaXM7bnVsbD09dGhpcy5hP1EuYihyKTp0aGlzLmEucHVzaChyKX07bi5yZXNvbHZlPUc7bi5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7cih0KX0pfTtuLnJhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PUViKHQpLEk9dy5uZXh0KCk7IUkuZG9uZTtJPXcubmV4dCgpKUcoSS52YWx1ZSkucmMocSxyKX0pfTtuLmFsbD1mdW5jdGlvbih0KXt2YXIgcT1FYih0KSxyPXEubmV4dCgpO3JldHVybiByLmRvbmU/RyhbXSk6bmV3IG4oZnVuY3Rpb24odyxJKXtmdW5jdGlvbiBiYShyYSl7cmV0dXJuIGZ1bmN0aW9uKHNhKXtVW3JhXT1zYTtHYS0tOzA9PUdhJiZ3KFUpfX12YXIgVT1bXSxHYT0wO2RvIFUucHVzaCh2b2lkIDApLEdhKyssRyhyLnZhbHVlKS5yYyhiYShVLmxlbmd0aC0xKSxJKSxyPXEubmV4dCgpO3doaWxlKCFyLmRvbmUpfSl9O3JldHVybiBufSk7CmZ1bmN0aW9uIG5jKCl7dGhpcy5jPSExO3RoaXMuZz1udWxsO3RoaXMuYj12b2lkIDA7dGhpcy5hPTE7dGhpcy5sPTA7dGhpcy5pPW51bGx9ZnVuY3Rpb24gb2Moayl7aWYoay5jKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtrLmM9ITB9bmMucHJvdG90eXBlLmY9ZnVuY3Rpb24oayl7dGhpcy5iPWt9O2Z1bmN0aW9uIHBjKGssbil7ay5pPXtZZDpuLGdlOiEwfTtrLmE9ay5sfW5jLnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24oayl7dGhpcy5pPXtyZXR1cm46a307dGhpcy5hPXRoaXMubH07ZnVuY3Rpb24gcWMoayxuLHgpe2suYT14O3JldHVybnt2YWx1ZTpufX1mdW5jdGlvbiB6YyhrKXt0aGlzLmE9bmV3IG5jO3RoaXMuYj1rfQpmdW5jdGlvbiBBYyhrLG4pe29jKGsuYSk7dmFyIHg9ay5hLmc7aWYoeClyZXR1cm4gQmMoaywicmV0dXJuImluIHg/eFsicmV0dXJuIl06ZnVuY3Rpb24oRyl7cmV0dXJue3ZhbHVlOkcsZG9uZTohMH19LG4say5hLnJldHVybik7ay5hLnJldHVybihuKTtyZXR1cm4gQ2Moayl9ZnVuY3Rpb24gQmMoayxuLHgsRyl7dHJ5e3ZhciBLPW4uY2FsbChrLmEuZyx4KTtpZighKEsgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIkl0ZXJhdG9yIHJlc3VsdCAiK0srIiBpcyBub3QgYW4gb2JqZWN0Iik7aWYoIUsuZG9uZSlyZXR1cm4gay5hLmM9ITEsSzt2YXIgUT1LLnZhbHVlfWNhdGNoKHQpe3JldHVybiBrLmEuZz1udWxsLHBjKGsuYSx0KSxDYyhrKX1rLmEuZz1udWxsO0cuY2FsbChrLmEsUSk7cmV0dXJuIENjKGspfQpmdW5jdGlvbiBDYyhrKXtmb3IoO2suYS5hOyl0cnl7dmFyIG49ay5iKGsuYSk7aWYobilyZXR1cm4gay5hLmM9ITEse3ZhbHVlOm4udmFsdWUsZG9uZTohMX19Y2F0Y2goeCl7ay5hLmI9dm9pZCAwLHBjKGsuYSx4KX1rLmEuYz0hMTtpZihrLmEuaSl7bj1rLmEuaTtrLmEuaT1udWxsO2lmKG4uZ2UpdGhyb3cgbi5ZZDtyZXR1cm57dmFsdWU6bi5yZXR1cm4sZG9uZTohMH19cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX0KZnVuY3Rpb24gRGMoayl7dGhpcy5uZXh0PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nLm5leHQsbixrLmEuZik6KGsuYS5mKG4pLG49Q2MoaykpO3JldHVybiBufTt0aGlzLnRocm93PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nWyJ0aHJvdyJdLG4say5hLmYpOihwYyhrLmEsbiksbj1DYyhrKSk7cmV0dXJuIG59O3RoaXMucmV0dXJuPWZ1bmN0aW9uKG4pe3JldHVybiBBYyhrLG4pfTt1YigpO3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX1mdW5jdGlvbiBFYyhrKXtmdW5jdGlvbiBuKEcpe3JldHVybiBrLm5leHQoRyl9ZnVuY3Rpb24geChHKXtyZXR1cm4gay50aHJvdyhHKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRyxLKXtmdW5jdGlvbiBRKHQpe3QuZG9uZT9HKHQudmFsdWUpOlByb21pc2UucmVzb2x2ZSh0LnZhbHVlKS50aGVuKG4seCkudGhlbihRLEspfVEoay5uZXh0KCkpfSl9CmZ1bmN0aW9uIEZjKGspe3JldHVybiBFYyhuZXcgRGMobmV3IHpjKGspKSl9ZnVuY3Rpb24gR2MoayxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGssbil9Cm1jKCJXZWFrTWFwIixmdW5jdGlvbihrKXtmdW5jdGlvbiBuKHIpe3RoaXMuYT0ocSs9TWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygpO2lmKHIpe3I9RWIocik7Zm9yKHZhciB3OyEodz1yLm5leHQoKSkuZG9uZTspdz13LnZhbHVlLHRoaXMuc2V0KHdbMF0sd1sxXSl9fWZ1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gRyhyKXt2YXIgdz10eXBlb2YgcjtyZXR1cm4ib2JqZWN0Ij09PXcmJm51bGwhPT1yfHwiZnVuY3Rpb24iPT09d31mdW5jdGlvbiBLKHIpe2lmKCFHYyhyLHQpKXt2YXIgdz1uZXcgeDtoYShyLHQse3ZhbHVlOnd9KX19ZnVuY3Rpb24gUShyKXt2YXIgdz1PYmplY3Rbcl07dyYmKE9iamVjdFtyXT1mdW5jdGlvbihJKXtpZihJIGluc3RhbmNlb2YgeClyZXR1cm4gSTtLKEkpO3JldHVybiB3KEkpfSl9aWYoZnVuY3Rpb24oKXtpZigha3x8IU9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcj1PYmplY3Quc2VhbCh7fSksdz1PYmplY3Quc2VhbCh7fSksST1uZXcgayhbW3IsMl0sClt3LDNdXSk7aWYoMiE9SS5nZXQocil8fDMhPUkuZ2V0KHcpKXJldHVybiExO0kuZGVsZXRlKHIpO0kuc2V0KHcsNCk7cmV0dXJuIUkuaGFzKHIpJiY0PT1JLmdldCh3KX1jYXRjaChiYSl7cmV0dXJuITF9fSgpKXJldHVybiBrO3ZhciB0PSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCk7USgiZnJlZXplIik7USgicHJldmVudEV4dGVuc2lvbnMiKTtRKCJzZWFsIik7dmFyIHE9MDtuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocix3KXtpZighRyhyKSl0aHJvdyBFcnJvcigiSW52YWxpZCBXZWFrTWFwIGtleSIpO0socik7aWYoIUdjKHIsdCkpdGhyb3cgRXJyb3IoIldlYWtNYXAga2V5IGZhaWw6ICIrcik7clt0XVt0aGlzLmFdPXc7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmdldD1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KT9yW3RdW3RoaXMuYV06dm9pZCAwfTtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocil7cmV0dXJuIEcocikmJkdjKHIsdCkmJkdjKHJbdF0sCnRoaXMuYSl9O24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KSYmR2Moclt0XSx0aGlzLmEpP2RlbGV0ZSByW3RdW3RoaXMuYV06ITF9O3JldHVybiBufSk7Cm1jKCJNYXAiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4oKXt2YXIgcT17fTtyZXR1cm4gcS5ZYT1xLm5leHQ9cS5oZWFkPXF9ZnVuY3Rpb24geChxLHIpe3ZhciB3PXEuYTtyZXR1cm4gdmIoZnVuY3Rpb24oKXtpZih3KXtmb3IoO3cuaGVhZCE9cS5hOyl3PXcuWWE7Zm9yKDt3Lm5leHQhPXcuaGVhZDspcmV0dXJuIHc9dy5uZXh0LHtkb25lOiExLHZhbHVlOnIodyl9O3c9bnVsbH1yZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fSl9ZnVuY3Rpb24gRyhxLHIpe3ZhciB3PXImJnR5cGVvZiByOyJvYmplY3QiPT13fHwiZnVuY3Rpb24iPT13P1EuaGFzKHIpP3c9US5nZXQocik6KHc9IiIrICsrdCxRLnNldChyLHcpKTp3PSJwXyIrcjt2YXIgST1xLmJbd107aWYoSSYmR2MocS5iLHcpKWZvcihxPTA7cTxJLmxlbmd0aDtxKyspe3ZhciBiYT1JW3FdO2lmKHIhPT1yJiZiYS5rZXkhPT1iYS5rZXl8fHI9PT1iYS5rZXkpcmV0dXJue2lkOncsbGlzdDpJLGluZGV4OnEsdWE6YmF9fXJldHVybntpZDp3LApsaXN0OkksaW5kZXg6LTEsdWE6dm9pZCAwfX1mdW5jdGlvbiBLKHEpe3RoaXMuYj17fTt0aGlzLmE9bigpO3RoaXMuc2l6ZT0wO2lmKHEpe3E9RWIocSk7Zm9yKHZhciByOyEocj1xLm5leHQoKSkuZG9uZTspcj1yLnZhbHVlLHRoaXMuc2V0KHJbMF0sclsxXSl9fWlmKGZ1bmN0aW9uKCl7aWYoIWt8fCJmdW5jdGlvbiIhPXR5cGVvZiBrfHwhay5wcm90b3R5cGUuZW50cmllc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcT1PYmplY3Quc2VhbCh7eDo0fSkscj1uZXcgayhFYihbW3EsInMiXV0pKTtpZigicyIhPXIuZ2V0KHEpfHwxIT1yLnNpemV8fHIuZ2V0KHt4OjR9KXx8ci5zZXQoe3g6NH0sInQiKSE9cnx8MiE9ci5zaXplKXJldHVybiExO3ZhciB3PXIuZW50cmllcygpLEk9dy5uZXh0KCk7aWYoSS5kb25lfHxJLnZhbHVlWzBdIT1xfHwicyIhPUkudmFsdWVbMV0pcmV0dXJuITE7ST13Lm5leHQoKTtyZXR1cm4gSS5kb25lfHw0IT1JLnZhbHVlWzBdLnh8fAoidCIhPUkudmFsdWVbMV18fCF3Lm5leHQoKS5kb25lPyExOiEwfWNhdGNoKGJhKXtyZXR1cm4hMX19KCkpcmV0dXJuIGs7dWIoKTt2YXIgUT1uZXcgV2Vha01hcDtLLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocSxyKXtxPTA9PT1xPzA6cTt2YXIgdz1HKHRoaXMscSk7dy5saXN0fHwody5saXN0PXRoaXMuYlt3LmlkXT1bXSk7dy51YT93LnVhLnZhbHVlPXI6KHcudWE9e25leHQ6dGhpcy5hLFlhOnRoaXMuYS5ZYSxoZWFkOnRoaXMuYSxrZXk6cSx2YWx1ZTpyfSx3Lmxpc3QucHVzaCh3LnVhKSx0aGlzLmEuWWEubmV4dD13LnVhLHRoaXMuYS5ZYT13LnVhLHRoaXMuc2l6ZSsrKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHEpe3E9Ryh0aGlzLHEpO3JldHVybiBxLnVhJiZxLmxpc3Q/KHEubGlzdC5zcGxpY2UocS5pbmRleCwxKSxxLmxpc3QubGVuZ3RofHxkZWxldGUgdGhpcy5iW3EuaWRdLHEudWEuWWEubmV4dD1xLnVhLm5leHQscS51YS5uZXh0LllhPXEudWEuWWEsCnEudWEuaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Sy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmI9e307dGhpcy5hPXRoaXMuYS5ZYT1uKCk7dGhpcy5zaXplPTB9O0sucHJvdG90eXBlLmhhcz1mdW5jdGlvbihxKXtyZXR1cm4hIUcodGhpcyxxKS51YX07Sy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHEpe3JldHVybihxPUcodGhpcyxxKS51YSkmJnEudmFsdWV9O0sucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4geCh0aGlzLGZ1bmN0aW9uKHEpe3JldHVybltxLmtleSxxLnZhbHVlXX0pfTtLLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS5rZXl9KX07Sy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS52YWx1ZX0pfTtLLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PXRoaXMuZW50cmllcygpLApJOyEoST13Lm5leHQoKSkuZG9uZTspST1JLnZhbHVlLHEuY2FsbChyLElbMV0sSVswXSx0aGlzKX07Sy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1LLnByb3RvdHlwZS5lbnRyaWVzO3ZhciB0PTA7cmV0dXJuIEt9KTt2YXIgSGM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihrLG4pe2Zvcih2YXIgeD0xO3g8YXJndW1lbnRzLmxlbmd0aDt4Kyspe3ZhciBHPWFyZ3VtZW50c1t4XTtpZihHKWZvcih2YXIgSyBpbiBHKUdjKEcsSykmJihrW0tdPUdbS10pfXJldHVybiBrfTttYygiT2JqZWN0LmFzc2lnbiIsZnVuY3Rpb24oayl7cmV0dXJuIGt8fEhjfSk7Cm1jKCJBcnJheS5mcm9tIixmdW5jdGlvbihrKXtyZXR1cm4gaz9rOmZ1bmN0aW9uKG4seCxHKXt4PW51bGwhPXg/eDpmdW5jdGlvbihxKXtyZXR1cm4gcX07dmFyIEs9W10sUT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZuW1N5bWJvbC5pdGVyYXRvcl07aWYoImZ1bmN0aW9uIj09dHlwZW9mIFEpe249US5jYWxsKG4pO2Zvcih2YXIgdD0wOyEoUT1uLm5leHQoKSkuZG9uZTspSy5wdXNoKHguY2FsbChHLFEudmFsdWUsdCsrKSl9ZWxzZSBmb3IoUT1uLmxlbmd0aCx0PTA7dDxRO3QrKylLLnB1c2goeC5jYWxsKEcsblt0XSx0KSk7cmV0dXJuIEt9fSk7bWMoIk9iamVjdC5pcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3JldHVybiBuPT09eD8wIT09bnx8MS9uPT09MS94Om4hPT1uJiZ4IT09eH19KTsKbWMoIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3ZhciBHPXRoaXM7RyBpbnN0YW5jZW9mIFN0cmluZyYmKEc9U3RyaW5nKEcpKTt2YXIgSz1HLmxlbmd0aDt4PXh8fDA7Zm9yKDA+eCYmKHg9TWF0aC5tYXgoeCtLLDApKTt4PEs7eCsrKXt2YXIgUT1HW3hdO2lmKFE9PT1ufHxPYmplY3QuaXMoUSxuKSlyZXR1cm4hMH1yZXR1cm4hMX19KTsKbWMoIlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMiLGZ1bmN0aW9uKGspe3JldHVybiBrP2s6ZnVuY3Rpb24obix4KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihuIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihuLHh8fDApfX0pOwooZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dGhpcy5vPXRoaXMuZz10aGlzLmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmY9MDt0aGlzLmM9IiI7dGhpcy5sPSExfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIHgoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIEcoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEsoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFEoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiB0KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBxKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiByKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYWE9ITE7YS5JPTEwO2EuSz0hMTthLklhPSExO2EuTz0hMTthLlA9ITE7YS5zPTA7YS51PSExOwphLlc9bC5zKDEwKTthLlg9ITE7YS5jPSExO2EuWj0hMTtyZXR1cm4gYX1mdW5jdGlvbiB3KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBJKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIGJhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLm89ITE7YS5pc1BsYXlpbmc9ITE7YS5mPTA7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7YS5sPTA7YS51PTA7YS5kdXJhdGlvbj0wO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBHYShhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gcmEoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5CPSExO2Eucz0hMTthLk49ITE7cmV0dXJuIGF9ZnVuY3Rpb24gc2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gVmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLAphKXx8dGhpc31mdW5jdGlvbiB3YihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLlg9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFhhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLnBhcmVudD1udWxsO2EuYz17fTtyZXR1cm4gYX1mdW5jdGlvbiBSYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIEdiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz0iIjtyZXR1cm4gYX1mdW5jdGlvbiBLYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFlhKGEsCmMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLm89ITE7cmV0dXJuIGF9ZnVuY3Rpb24gU2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkthPSExO3ZvaWQgMD09YS5mJiYoYS5mPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBZYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSGIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5mPTA7YS5vPTEwO3JldHVybiBhfWZ1bmN0aW9uIHlhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7cmV0dXJuIGF9ZnVuY3Rpb24gWmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGtiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz1bXTthLmY9ITE7YS5vPSExO3JldHVybiBhfWZ1bmN0aW9uIExhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5LYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiAkYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSWIoYSwKYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Eubz0hMTthLmM9MDtyZXR1cm4gYX1mdW5jdGlvbiBxYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj0hMTthLm09ITE7YS5BPSExO2EubD1bXTthLnM9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGFjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gWmEoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLm11dGVkPSExO3JldHVybiBhfWZ1bmN0aW9uIHJjKCl7dGEuc3x8KHRhLnM9MCk7dGEucysrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9dGEuQiYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT10YS5CKTsxMD50YS5zJiZ3aW5kb3cuc2V0VGltZW91dChyYyw1MDApfWZ1bmN0aW9uIGNiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5zPTA7YS5jPVtdO2EubT1bXTthLm89W107cmV0dXJuIGF9ZnVuY3Rpb24geWIoYSwKYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGJjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIGNjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gZGIoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEtiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO3JldHVybiBhfWZ1bmN0aW9uIHpiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gSGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGRjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBNYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnM9ITE7YS5CPSExO2EuSz0hMTthLnU9ITE7YS5EPSExO2EuYz0hMTtyZXR1cm4gYX1mdW5jdGlvbiB6YShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsCmEpfHx0aGlzfWZ1bmN0aW9uIGVjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPTE1MDA7cmV0dXJuIGF9ZnVuY3Rpb24gZWIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5YPSExO2EudT0hMTthLkQ9ITE7YS5zPSExO2EuYz0wO3JldHVybiBhfWZ1bmN0aW9uIHVhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7YS5sPSExO3JldHVybiBhfWZ1bmN0aW9uIGZjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBnYyhhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLmFiPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gYWIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmFiPW51bGw7YS5sPS0xO2EuZj1nLlNjO3JldHVybiBhfWZ1bmN0aW9uIGhjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIEFiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gQWEoYSl7YT0KQS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO2EuZj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYihhKXthPUYuY2FsbCh0aGlzLGEpfHx0aGlzO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBmYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLkZhPSExO2EuTj0hMTthLkRhPSExO2EudT0hMTthLkk9ITE7YS5HYT1sLnMoMTApO2EuYWE9ITA7YS5kYT0hMTthLkc9ITE7YS5YPSExO2EuV2E9IiI7YS5UYT0hMTthLm89ITE7YS5QPSExO2EuSWE9ITE7YS5pbWE9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gQmEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIENiKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBmYihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnN0YXR1cz1hLkY7YS5XPSExO2EuST0hMTthLm89ITE7YS5QPSExO2EuaXNQbGF5aW5nPSExO2EuRz0xO2EuSz0wO2Eucz1bXTthLmY9ITE7YS5OPVtdO2EuQj0wO2EudT0KMDthLk89ITE7YS5vbmNlPSExO2EuWj0hMTthLmFhPVtdO2EuRD0hMTtyZXR1cm4gYX1mdW5jdGlvbiBsYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO3ZvaWQgMD09YS5TYSYmKGEuU2E9ITEpO3ZvaWQgMD09YS5mJiYoYS5mPSExKTt2b2lkIDA9PWEubCYmKGEubD0hMSk7dm9pZCAwPT1hLnhkJiYoYS54ZD0hMSk7cmV0dXJuIGF9ZnVuY3Rpb24gaWMoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIExiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gbGIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkthPSExO3JldHVybiBhfWZ1bmN0aW9uIEUoYSxjKXt0aGlzLnBsYXllcj0iIjt0aGlzLlY9bnVsbDt0aGlzLlk9IjEiO3RoaXMuaWE9IjIiO3RoaXMua2E9IjMiO3RoaXMuRj0wO3RoaXMubT1bXTt0aGlzLmw9W107dGhpcy5BPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5mYT0hMTt0aGlzLnN0YXR1cz10aGlzLkY7dGhpcy5pZD1sLmcoMTApO3RoaXMuZ2EoYSk7dGhpcy53YShjKX1mdW5jdGlvbiBBKGEpe3RoaXMuYz10aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmk9ITE7dGhpcy5wbGF5ZXI9YTt0aGlzLmZjPSIiO3RoaXMuRj1udWxsO3RoaXMuVCgpfWZ1bmN0aW9uIEYoYSl7dGhpcy5mPXt9O3RoaXMuYT1udWxsO3RoaXMuRj0wO3RoaXMubD0xNTA7dGhpcy5rYz0wO3RoaXMuSShhKX1mdW5jdGlvbiBtYigpe3RoaXMuZz10aGlzLmk9ITE7dGhpcy5iPVtdO3RoaXMuYz17fX1mdW5jdGlvbiBpYShhLGMpe3RoaXMubD1jfHx7fTt0aGlzLlM9YTt0aGlzLlZhPWEueGEoKTt0aGlzLmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5hLmlkPWwuZygxMCk7dGhpcy5mPWJiLnBvcCgpO3RoaXMuZnx8KGwudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5mPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuZi5pZD0iYWRYZGlzcGxheSIsdGhpcy5mLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5iPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAscG9zaXRpb246IiJ9O3RoaXMuQT0hMTt0aGlzLmk9W107dGhpcy5tPSExfWZ1bmN0aW9uIEMoYSxjKXt2YXIgZD1FcnJvci5jYWxsKHRoaXMsYS50eXBlKTt0aGlzLm1lc3NhZ2U9ZC5tZXNzYWdlOyJzdGFjayJpbiBkJiYodGhpcy5zdGFjaz1kLnN0YWNrKTt0aGlzLnR5cGU9YTt0aGlzLmRhdGE9Yzt0aGlzLmRhdGF8fCh0aGlzLmRhdGE9e30pO3RoaXMuZGF0YS5kZXRhaWxzfHwodGhpcy5kYXRhLmRldGFpbHM9Qy5hLk9kKTt0aGlzLmRldGFpbHM9dGhpcy5kYXRhLmRldGFpbHN9ZnVuY3Rpb24gamEoYSxjLGQsZSl7dGhpcy5jPSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCB0ZXh0L2VjbWFzY3JpcHQgdGV4dC9qYXZhc2NyaXB0IHRleHQvanNjcmlwdCB0ZXh0L3gtZWNtYXNjcmlwdCB0ZXh0L3gtamF2YXNjcmlwdCIuc3BsaXQoIiAiKTsKdGhpcy5qYT1hO3RoaXMuYT1jO3RoaXMuQz1lO3RoaXMuc2M9MDt0aGlzLmR1cmF0aW9uPXRoaXMubygpO3RoaXMubmM9dGhpcy5sKCk7dGhpcy5VYj10aGlzLm0oKTt0aGlzLnpjPXRoaXMuRigpO3RoaXMuc2Q9ITE7dGhpcy5pPXRoaXMuZz0iIjt0aGlzLmVycm9yPW51bGw7dGhpcy5GZD1bXX1mdW5jdGlvbiBWKGEsYyl7YT12b2lkIDA9PT1hPyIiOmE7Yz12b2lkIDA9PT1jPyExOmM7dmFyIGQ9dmEuY2FsbCh0aGlzKXx8dGhpcztkLnNyYz1hO2QuZGE9YztkLmE9bnVsbDtkLkxhPVtdO2QuWj1bXTtkLmI9W107ZC5pPVtdO2QuVz0hMTtkLlk9ITE7ZC5jPSExO2QubD0hMTtkLkQ9MTtkLnNyYy5sZW5ndGgmJmQubG9hZChkLnNyYyk7cmV0dXJuIGR9ZnVuY3Rpb24gbmIoYSl7YT12b2lkIDA9PT1hPyIiOmE7dmFyIGM9SWEuY2FsbCh0aGlzLG51bGwpfHx0aGlzO2MuYT1udWxsO2Muc3JjPWE7cmV0dXJuIGN9ZnVuY3Rpb24gSWEoYSxjKXt0aGlzLkM9YTt0aGlzLnBvc2l0aW9uPXZvaWQgMD09PQpjPyJwcmVyb2xsIjpjO3RoaXMucz1udWxsO3RoaXMuamE9W107dGhpcy5iPVtdO3RoaXMuZz1bXTt0aGlzLmR1cmF0aW9uPTB9ZnVuY3Rpb24gVGEoYSxjKXt0aGlzLmVycm9yPWE7dGhpcy5kYXRhPWM7dGhpcy5qYT1bXX1mdW5jdGlvbiBOYShhLGMpe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9YysiY29udGFpbmVyIjthLmFwcGVuZENoaWxkKGQpO2E9Y2EuY2FsbCh0aGlzLGQsYyl8fHRoaXM7YS5jb250YWluZXI9ZDthLmphPVtdO2EubD1bXTthLmY9LTE7YS5mb3JtYXQ9InBvcnRyYWl0IjthLkQoKTtyZXR1cm4gYX1mdW5jdGlvbiBjYShhLGMsZCl7dmFyIGU9dmEuY2FsbCh0aGlzKXx8dGhpcztlLndiPWE7ZS5pZD1jO2UuYj1PYmplY3QuYXNzaWduKHt9LHt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixwcmVsb2FkOiJhdXRvIixhdXRvcGxheToiIn0sZCk7ZS5hPWUucygpO2UuYS5zZXRBdHRyaWJ1dGUoInBvc3RlciIsImh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL2JsYWNrLnBuZyIpOwplLk89IjAwMDAiO2UuUD0iIjtlLnBhcmVudD1udWxsO2UuRygpO2UuSSgpO3JldHVybiBlfWZ1bmN0aW9uIFMoYSl7dmFyIGM9dmEuY2FsbCh0aGlzKXx8dGhpcztjLndiPWE7Yy5jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5jb250YWluZXIuaWQ9ImxpbW9yb290IjtjLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2MuY29udGFpbmVyLnN0eWxlLnRvcD0iMCI7Yy5jb250YWluZXIuc3R5bGUubGVmdD0iMCI7Yy5jb250YWluZXIuc3R5bGUud2lkdGg9IjEwMCUiO2MuY29udGFpbmVyLnN0eWxlLmhlaWdodD0iMTAwJSI7Yy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MudT1udWxsO2MuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5sPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYy5jPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuYT1udWxsO2MubT1udWxsO2MuZj1udWxsO2MubGFiZWw9bnVsbDtjLnM9bnVsbDtjLks9LTE7Yy5wbGF5ZXI9bmV3IE5hKGMuY29udGFpbmVyLCJsaW1vX3ZpZGVvIik7Yy5wbGF5ZXIucGFyZW50PWM7Yy5wbGF5ZXIub24oImNvbXBsZXRlIixmdW5jdGlvbigpe2MuYmEoKX0pO2Mub24oInZpZGVvc3RhcnQiLGZ1bmN0aW9uKCl7Yy5JJiYhYy5WJiYoZy5qLnRyYWNrKCJ2cnRjbHpyX3JldHVybmVkIiwiIiwhMCksYy5WPSEwKX0pO2MuWT0hMTtjLkE9W107Yy5pPVtdO2MuVz0wO2MuST0hMTtjLlY9ITE7Yy5EPSExO2MubGEoKTtyZXR1cm4gY31mdW5jdGlvbiBSKGEpe3ZhciBjPVAuY2FsbCh0aGlzKXx8dGhpcztnLmoudHJhY2soInZydGNsenJfc2V0dXAiLCIiLCEwKTtjLm09YTtjLnBhcmVudD1udWxsO2MuQT0hMTtjLnM9Zy52LmIoInZlcnRpY2FsaXpyIil8fHt9O2MuYT1uZXcgUztjLmEuYT1jO2MucWM9Yy5zLmFsaWFzfHwKInN2bXByZXZpZXciOy0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiJnByZXZpZXciKSYmKGMucWM9InN2bXByZXZpZXciKTtjLlA9KGMucy5hcGl8fCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL2NvbnN1bXB0aW9ucy9vZmZlci9ieV9hbGlhcy9bYWxpYXNdLyIpLnJlcGxhY2UoIlthbGlhc10iLGMucWMpKyI/Z2Rwcj1bZ2Rwcl0mZ2Rwcl9jb25zZW50PVtnZHByX2NvbnNlbnRdIjtjLmI9W107Yy5LPSExO2MuVSgpO2MubXx8KGMuTygpLGMudSgpKTtyZXR1cm4gY31mdW5jdGlvbiBXKCl7dmFyIGE9UC5jYWxsKHRoaXMpfHx0aGlzO2EuWj0iaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiO2EuYT1udWxsO2EuYj0hMTthLmY9ITE7YS5tPSExO2EuTz0wO2EuQT0wO2Eucz0wO2EuSz1bXTtyZXR1cm4gYX1mdW5jdGlvbiBPYSgpe3ZhciBhPU0uY2FsbCh0aGlzKXx8dGhpczsKYS5hPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gb2EoKXt2YXIgYT1NLmNhbGwodGhpcyl8fHRoaXM7YS5hPW51bGw7YS50YSgpO2EuWT0hMTthLlo9IiI7cmV0dXJuIGF9ZnVuY3Rpb24gTSgpe3ZhciBhPVAuY2FsbCh0aGlzKXx8dGhpczthLnZpZGVvVGFnPW51bGw7YS5pYT0xRTM7YS5mPSExO2EuUD0hMTthLkE9ITE7YS5LPSExO2EuYmE9ITE7YS5JPSExO3JldHVybiBhfWZ1bmN0aW9uIFAoKXt2YXIgYT12YS5jYWxsKHRoaXMpfHx0aGlzO2EuZXZlbnQ9e1hiOiJyZWFkeSIsT2E6ImVycm9yIixOYToiZW5kZWQiLG9jOiJ0aW1ldXBkYXRlIixGYzoiaW1wcmVzc2lvbiIsSmM6InN0YXJ0IixFYzoiZmlyc3RRdWFydGlsZSIsR2M6Im1pZHBvaW50IixLYzoidGhpcmRRdWFydGlsZSIsRGM6ImNyZWF0aXZlVmlldyIsb2Q6InNraXAiLHBkOiJ0aW1lY2hhbmdlIixsYzoiY2xpY2t0aHJvdWdoIixIYzoicGF1c2UiLG5kOiJyZXN1bWUiLE1kOiJtdXRlIixSZDoidW5tdXRlIn07YS5DPW51bGw7CmEuYz1udWxsO2EuaT1udWxsO2EuRz0tMTthLlc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiB1KGEsYyxkKXt0aGlzLmE9bnVsbDt0aGlzLmhkKGEpO2EuUy5jYT90aGlzLmJhPWEuUy5jYSgpOnRoaXMuYmE9IiI7YS5TLkJkJiZhLlMuQmQoe3BhdXNlOnRoaXMuamMuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5NYi5iaW5kKHRoaXMpLG11dGU6dGhpcy5JYi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkpkLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuVmE7dGhpcy5wbGF5ZXI9dGhpcy5hLlM7dGhpcy5mPW51bGw7dGhpcy5pPWM7dGhpcy5zPW51bGw7dGhpcy52aWRlbz17fTt0aGlzLmhhPXt9O3RoaXMuWGQ9Zy5qLmcoMTApO3RoaXMuZ2E9MDt0aGlzLlo9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5aPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5TKSYmdGhpcy5hLlMuQ2EmJihhPXRoaXMuYS5TLkNhKCkpLAp0aGlzLlo9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuUWM9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5WPSExO3RoaXMubD1udWxsO3RoaXMuQz17fTt0aGlzLlRhPS0xO3RoaXMubT10aGlzLlZiPSExO3RoaXMuY29udHJvbHM9bnVsbDt0aGlzLmFlPWcuai5nKDEwKTt0aGlzLnphPWcuai5nKDEwKTt0aGlzLnRhPWcuai5nKDEwKTt0aGlzLlBiPWcuai5nKDEwKTt0aGlzLmc9e307dGhpcy5KYj10aGlzLnBhPXRoaXMuUD0hMTtnLmouZygxMCk7dGhpcy5GYT10aGlzLmlhPXRoaXMuTj10aGlzLmxhPSExO3RoaXMuWT1bXTt0aGlzLks9e307dGhpcy5rYT10aGlzLkdhPSExO3RoaXMuQj1udWxsO3RoaXMuYz10aGlzLlU9ITE7dGhpcy5BPW51bGw7dGhpcy53YT17fTt0aGlzLkRhPXt9O3RoaXMuaWI9ITE7dGhpcy5kaXNwbGF5PW51bGx9ZnVuY3Rpb24gb2IoKXt0aGlzLmk9CnRoaXMuZGM9IiI7dGhpcy5iO3RoaXMuYT17fX1mdW5jdGlvbiBDYSgpe31mdW5jdGlvbiB2YSgpe3RoaXMuRj1uZXcgTWFwO3RoaXMubz1uZXcgTWFwO3RoaXMuTj1uZXcgTWFwfWZ1bmN0aW9uIGRhKGEpe3RoaXMuYT10aGlzLnBhcnNlKGEpO3RoaXMuZj0iIn1mdW5jdGlvbiB2KGEpe3RoaXMuZGF0YT1hfHx7fTt0aGlzLnR5cGU9dGhpcy5lcnJvck1lc3NhZ2U9IiJ9ZnVuY3Rpb24geigpe3RoaXMuRWQ9ITE7dGhpcy5VPSJzZXR1cCI7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUWIuYmluZCh0aGlzKSk7dGhpcy5vYT10aGlzLm5hPW51bGw7dGhpcy51PXRoaXMuZmE9ITE7dGhpcy5PPVtdO3RoaXMuaGI9ITE7dGhpcy5pPXt9O3RoaXMuZ2EoKTt0aGlzLmJhPSExO3RoaXMuST1udWxsO3RoaXMubD1uZXcgTWFwO3RoaXMueWIoKX1mdW5jdGlvbiBIKCl7Zy5IPXRoaXM7d2E9dGhpczt0aGlzLkphPSExO3RoaXMuUGE9IiI7dGhpcy5uYT10aGlzLlU9dGhpcy5CPQpudWxsO3RoaXMuT2I9dGhpcy5iYT10aGlzLkFiPSExO3RoaXMuZj0iIjt0aGlzLnpiPSExO3RoaXMuQmE9dGhpcy5lYz0iIjt0aGlzLnliPXRoaXMuYj10aGlzLmE9dGhpcy5kZD0hMTt0aGlzLmc9W107dGhpcy5qYj10aGlzLkQ9IiI7dGhpcy5mYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLldhPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51PSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLkhiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLkk9IiI7dGhpcy5LPVtdO3RoaXMuTz1bXTt0aGlzLmdhPVtdO3RoaXMuWj0iIjt0aGlzLmFhPSExO3RoaXMuR2E9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5XPSExO3RoaXMuTmI9dGhpcy5oYT1udWxsO3RoaXMubGI9dGhpcy5pYT10aGlzLmliPXRoaXMuVGE9dGhpcy5wYj10aGlzLnFhPXRoaXMuRz0hMTsKdGhpcy5BPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnFiPSIiO3RoaXMuZWE9MDt0aGlzLmRhPXRoaXMueGI9ITE7dGhpcy5iaXRyYXRlPTFFMzt0aGlzLmthPXRoaXMubGE9IiI7dGhpcy5rYj1udWxsO3RoaXMuR2Q9ITE7dGhpcy5OPXRoaXMuWT1udWxsO3RoaXMuaT17fTt0aGlzLkRhPTA7dGhpcy5CYj10aGlzLm89ITE7dGhpcy5WPTEwO3RoaXMudGI9ZnVuY3Rpb24oKXt9O3RoaXMuemE9LTE7dGhpcy5oYj10aGlzLm9hPSExO3RoaXMucGE9e319ZnVuY3Rpb24gcGIoKXt0aGlzLmE9dGhpcy5iPSExfWZ1bmN0aW9uIGdiKGEsYyxkLGUsZil7dGhpcy5hPWE7dGhpcy5mPXRoaXMuRj0hMTt0aGlzLm09ZDt0aGlzLmM9ITE7dGhpcy50aW1lb3V0PTA7dGhpcy5vPSExO3RoaXMuZz0tMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5hPW5ldyBQYShhKSk7dmFyIGg9dGhpcy5iPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFjfHwKNCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHwodGhpcy5pKCksdGhpcy5sKGgpLGcudi5iKCJjb21wYW5pb25zIikmJihoPXRoaXMuQShoKSksYyhoKSk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzPyh0aGlzLmkoKSx0aGlzLmwoaCksZChoKSk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmZy5qLkEodGhpcy5hLnVybCkmJiFmJiZsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsInN0YXR1czAiLCEwKTtlJiY0IT1oLnJlYWR5U3RhdGUmJmUoaCl9LmJpbmQodGhpcyl9ZnVuY3Rpb24gUGEoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319ZnVuY3Rpb24gcWIoKXt0aGlzLmE9e307dGhpcy5jPXt9O3RoaXMuY2xpZW50PXt9O3RoaXMuaT17fX1mdW5jdGlvbiBoYigpe31mdW5jdGlvbiBKYSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwKSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixKYSk7c2M9ITA7Zm9yKHZhciBhPTA7YTxiYi5sZW5ndGg7YSsrKWJiW2FdLmxvYWQoKTtmb3IoYT0wO2E8YmIubGVuZ3RoO2ErKyl7dmFyIGM9YmJbYV0ucGxheSgpO2lmKHZvaWQgMCE9PWMpYy50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1NYiYmKE1iKCksTWI9ITEpfWZ1bmN0aW9uIHRjKCl7dmFyIGE9d2luZG93Lk9PO2F8fChhPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdWMoKXt0cnl7bC5HKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfWNhdGNoKGYpe31pZihnLnYuZyl7dmFyIGE9CkljKGZ1bmN0aW9uKCl7bC5oYSh3aW5kb3csTmIuYygpLHtpZDphfSl9LDUwMCk7aWYobC5oYil3YS5XZCgpO2Vsc2V7Zy52LmEucGF1c2VCdXR0b258fChnLnYuYS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cmcudi5hLnBsYXlCdXR0b258fChnLnYuYS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEubXV0ZUJ1dHRvbnx8KGcudi5hLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpnLnYuYS51bm11dGVCdXR0b258fChnLnYuYS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpnLnYuYS5za2lwYWJsZUJ1dHRvbnx8KGcudi5hLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7Zy52LmEuc2tpcEJ1dHRvbnx8KGcudi5hLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKd2EuUmF8fG5ldyBIO2lmKGcudi5iKCJieXBhc3MiKSl7dmFyIGM9Zy52LmIoImNsaWVudENvbmZpZyIpO2lmKCJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPWMuYWxpYXM7dmFyIGU9Yy5zZXJ2ZXJ9ZCYmZT8oZy5ILmRhPSEwLGcuSC5UKGQsZSksZy5ILkZiKCkpOmcuSC5SYShnLnYuYS5nbG9iYWxDb25maWcsZy52LmEuY2xpZW50Q29uZmlnLGcudi5hLnByZWNoZWNrZWQsZy52LmEub25SZWFkeSxnLnYuYS5vbkZhaWx1cmUsZy52LmEpfWVsc2UgZy5ILlJhKGcudi5hLmdsb2JhbENvbmZpZyxnLnYuYS5jbGllbnRDb25maWcsZy52LmEucHJlY2hlY2tlZCxnLnYuYS5vblJlYWR5LGcudi5hLm9uRmFpbHVyZSxnLnYuYSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITB9fWVsc2UgSmModWMsNTApfWZ1bmN0aW9uIFgoYSxjKXtpZihnLnYuZyYmd2EuUmEpeyhnLnYuYS5hZFRhZ3x8Zy52LmEucHJlcm9sbEFkVGFnKSYmYS5wYXVzZSgpO2wuYSh2LmIsYS5DYSgpKTtpZihhLmdldEN1cnJlbnRUaW1lKXt2YXIgZD0KYS5nZXRDdXJyZW50VGltZSgpO2QmJmwudHJhY2soImFjdGl2YXRlZEF0IixkKX1jP3dhLkphPSEwOmwudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2Q9bmV3IGs7ZC5BKGEpO2QuRyh3YSk7ZC5GKGcudi5hKTtkLncoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WChhLGMpfS5iaW5kKHRoaXMpLDUwKX1xYi5wcm90b3R5cGUubD1mdW5jdGlvbihhKXtyZXR1cm4gMDxPYmplY3Qua2V5cyhhfHx7fSkubGVuZ3RoJiZhLmNvbnN0cnVjdG9yPT09T2JqZWN0fTtxYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pW2FdfHx0aGlzLmNsaWVudFthXXx8dGhpcy5hW2FdfTtxYi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybntlbWJlZDp0aGlzLmEsZ2xvYmFsOnRoaXMuYyxjbGllbnQ6dGhpcy5jbGllbnQsY3VzdG9tZXI6dGhpcy5pfX07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWIucHJvdG90eXBlLHtnOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubCh0aGlzLmEpfX19KTt2YXIgZz17djpudWxsLEg6bnVsbCxqOm51bGx9O2cudj1uZXcgcWI7UGEucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSl7dGhpcy5kYXRhLmhvbWFkX21hY3Jvcz1hfTtQYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt0cnl7dGhpcy5hKEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChjKXt9fTtnYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXtpZihhJiZhLnJlc3BvbnNlVGV4dCYmYS5yZXNwb25zZVRleHQuaW5kZXhPZiYmMDw9YS5yZXNwb25zZVRleHQuaW5kZXhPZigiSUZyYW1lUmVzb3VyY2UiKSl0cnl7dmFyIGM9e307Yy5yZXNwb25zZVRleHQ9YS5yZXNwb25zZVRleHQ7Zm9yKHZhciBkPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYy5yZXNwb25zZVRleHQsInRleHQveG1sIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNvbXBhbmlvbkFkcyIpLGU9MDtlPGQubGVuZ3RoO2UrKylmb3IodmFyIGY9CmRbZV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIklGcmFtZVJlc291cmNlIiksaD0wO2g8Zi5sZW5ndGg7aCsrKXt2YXIgbT1nLmouQWQoZltoXSksRD1nLmouSyhtLGcuSCwhMCk7Zy5qLmMobSk7Yy5yZXNwb25zZVRleHQ9Yy5yZXNwb25zZVRleHQucmVwbGFjZShtLEQpO2MucmVzcG9uc2VYTUw9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhjLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKX1nLmoudHJhY2soInN0YXRzX2hkX2NvbXBhbmlvbiIsIiIsITApO3JldHVybiBjfWNhdGNoKEwpe31yZXR1cm4gYX07Z2IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7aWYoYSYmIShhLnJlc3BvbnNlJiZhLnJlc3BvbnNlLmluZGV4T2YmJjA8PWEucmVzcG9uc2UuaW5kZXhPZigic3RhdHNfaGRfYWxpdmUiKSkpdHJ5e3ZhciBkPWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7aWYoMDw9ZC5pbmRleE9mKCJkYXRlOiIpfHwwPD1kLmluZGV4T2YoIkRhdGU6IikpYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJEYXRlIik7CmlmKGMpe3ZhciBlPW5ldyBEYXRlKGMpO2cuSC5vYXx8KGcuSC5vYT1lLmdldFRpbWUoKSk7Zy5ILmhiPWUuZ2V0VGltZSgpO3ZhciBmPWcuSC5oYi1nLkgub2E7aWYoZil7dmFyIGg9TWF0aC5mbG9vcihmLzZFNCksbT1NYXRoLmZsb29yKGYvMzZFNSksRD1NYXRoLmZsb29yKGYvODY0RTUpO2E9IiI7NTw9aCYmKGE9IjVtaW4iKTsxMDw9aCYmKGE9IjEwbWluIik7MjA8PWgmJihhPSIyMG1pbiIpOzMwPD1oJiYoYT0iMzBtaW4iKTs0NTw9aCYmKGE9IjQ1bWluIik7MTw9bSYmKGE9bSsiaCIpOzE8PUQmJihhPUQrImQiKTthJiZnLkgucGEmJiFnLkgucGFbYV0mJihnLkgucGFbYV09ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9hbGl2ZSIsYSwhMCkpfX19Y2F0Y2goTCl7fX07Z2IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLnRpbWVvdXQmJih0aGlzLmc9d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksdGhpcy50aW1lb3V0KSl9O2diLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7dGhpcy5nJiYKd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmcpO3RoaXMuZz0hMX07Z2IucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt0aGlzLmkoKTt0aGlzLm89ITA7dGhpcy5iLm89ITA7dGhpcy5iLmFib3J0KCl9O2diLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYz1hO2E9IiI7Zm9yKHZhciBkIGluIGMpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChjW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5iLnVybENhbGxlZD10aGlzLmEudXJsO3RyeXt0aGlzLmM/dGhpcy5iLm9wZW4odGhpcy5hLm1ldGhvZCx0aGlzLmEudXJsLCExKTp0aGlzLmIub3Blbih0aGlzLmEubWV0aG9kLHRoaXMuYS51cmwsITApLHRoaXMuRnx8KHRoaXMuYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksYSYmMDxhLmxlbmd0aCYmYS5pbmRleE9mJiYoMDxhLmluZGV4T2YoImhvbWFkX3RyYWNrX2tleSIpfHwwPGEuaW5kZXhPZigiaG9tYWRfYXQiKSkmJihhKz0iJmhvbWFkX3ZlcnNpb249MjAyMTAxMTFfMTAxNyIpLHRoaXMuYi5zZW5kKGEpLHRoaXMudSgpfWNhdGNoKGUpe2E9dGhpcy5hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxnLmouQSh0aGlzLmEudXJsKSYmIWEmJmwudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKSx0aGlzLm0mJnRoaXMubSgpfXJldHVybiB0aGlzLmJ9O3BiLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3RoaXMuYj1hfTtwYi5wcm90b3R5cGUuYz0KZnVuY3Rpb24oYSl7dGhpcy5hPWF9O3BiLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShlLGYpe2UuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKCl7fSl9dmFyIGM9e1RlOiJBZENsaWNrVGhydSIsVmU6IkFkRXJyb3IiLFdlOiJBZFN0b3BwZWQiLFplOiJBZExpbmVhckNoYW5nZSIsJGU6IkFkVGFnUGFyc2VkIixjZjoiQWRWaWRlb0NvbXBsZXRlIixmZjoiQWRMb2FkZWQiLGdmOiJBZFNraXBwZWQiLGhmOiJBZFN0YXJ0ZWQiLFhlOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsWWU6IkFkSW1wcmVzc2lvbiIsVWU6IkFkQ3JlYXRpdmVWaWV3IixhZjoiQWRWaWRlb01pZHBvaW50IixiZjoiQWRQYXVzZWQiLGRmOiJBZFZpZGVvU3RhcnQiLGVmOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYz13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYyljLmhhc093blByb3BlcnR5KGQpJiYKYSh0aGlzLmIsY1tkXSx7fSl9O3BiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShkLGUpe2QuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5hJiZ0aGlzLmEuSWMpZm9yKHZhciBjIGluIHRoaXMuYS5JYyl0aGlzLmEuSWMuaGFzT3duUHJvcGVydHkoYykmJmEodGhpcy5hLHRoaXMuYS5JY1tjXSx7fSk7dGhpcy5hJiZ0aGlzLmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe30uYmluZCh0aGlzKSwxMCl9O3BiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5iJiZ0aGlzLmkoKTt0aGlzLmEmJnRoaXMuZygpfTtILnByb3RvdHlwZS5nZXRDb25maWc9ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5KYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlBhLGFkdGFnbW9kaWZpZXI6dGhpcy5CLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5VLGFkdGFncmVnZXg6dGhpcy5uYSxiaXRyYXRlOnRoaXMuYml0cmF0ZSxqc3BvcHVwczp0aGlzLkFiLApzaWRlbG9hZHM6dGhpcy5iYSxkaXNhYmxldGVzdHM6dGhpcy5PYixob21hZEFsaWFzOnRoaXMuZixpc0luaXRpYWxpemVkOnRoaXMuemIsZ2xvYmFsQ29uZmlnOnRoaXMuZWMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuYSxpc1ZlcmlmaWVkOnRoaXMuYixpc0Jsb2NrZWQ6dGhpcy55YixzZXJ2ZXI6dGhpcy5nLHN2bUNvbmZpZzp0aGlzLkQsaG9tYWRBZHBhdGg6dGhpcy5qYixIT01BRF9WRVJJRklFRDp0aGlzLmZiLEhPTUFEX0JMT0NLRUQ6dGhpcy5XYSxIT01BRF9OT0JMT0NLRVI6dGhpcy51LEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhiLHRlc3RIaWRlOnRoaXMuSSx0ZXN0VGFnczp0aGlzLkssdGVzdFRhZ3NKUzp0aGlzLk8sdGVzdFRhZ3NYSFI6dGhpcy5nYSx0ZXN0M1BDb29raWU6dGhpcy5aLHRocm90dGxlOnRoaXMuR2EsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5XLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTmIsCmFkQmxvY2tlckRldGVjdGVkOnRoaXMuRyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMucWEsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucGIsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuVGEsY29uZmlnRmFpbHVyZXM6dGhpcy5BLHNpdGVDb25maWc6dGhpcy5pLHNlcnZlcklkOnRoaXMuRGEsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLm8sdnBhaWQ6dGhpcy5pYSxza2lwQWxsb3dlZDp0aGlzLmxiLHZtYXBzOnRoaXMucWIsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmRhLGFkRmFsbGJhY2tVUkw6dGhpcy5sYSxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2EseWllbGRsYWI6dGhpcy5rYixfY29uZmlnOmcudi5mKCl9fTtILnByb3RvdHlwZS5TYj1mdW5jdGlvbigpe3ZhciBhPSExLGM7Zm9yKGMgaW4gdGhpcy5BKSJib29sZWFuIj09dHlwZW9mIHRoaXMuQVtjXSYmMT09dGhpcy5BW2NdJiYoYT0hMCk7cmV0dXJuIGF9O0gucHJvdG90eXBlLmdkPWZ1bmN0aW9uKGEpe3RoaXMuQVthXT0KITB9O0gucHJvdG90eXBlLlFiPWZ1bmN0aW9uKCl7dmFyIGE9W10sYztmb3IoYyBpbiB0aGlzLkEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5BW2NdJiYxPT10aGlzLkFbY10mJmEucHVzaChjKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuYz1mdW5jdGlvbihhLGMpe3ZhciBkPXZvaWQgMD09PWQ/ITE6ZDtpZighKHRoaXMuSmF8fHZvaWQgMCE9PWMmJmMpKXJldHVybiBuZXcgUGEoYSk7Yz1nLmouQShhKTt2YXIgZT1sLmMoYSk7aWYoYyl7dmFyIGY9dGhpcy53YSgpP2E6ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyI7YT1lLnBhdGguc3Vic3RyKDEpfWVsc2UgZj10aGlzLnMoKSxhPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpO2QmJih0aGlzLlBhfHx0aGlzLkJ8fHRoaXMuVXx8dGhpcy5uYXx8Zy52LmIoInRjZl9jb25maWciKSkmJihhPXRoaXMuQ2IoYSkpO2Q9bmV3IFBhKGYpO2QudXJsPWY7Yz1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy50YShlLmhvc3QpO2QuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWM7ZC5kYXRhLmhvbWFkX3VybF9zdWZmaXg9YTtkLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9bC5CKGEpO2QubWV0aG9kPSJQT1NUIjtyZXR1cm4gZH07SC5wcm90b3R5cGUud2E9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmcmJnRoaXMuZy5sZW5ndGgmJjA8dGhpcy5nLmxlbmd0aCYmKGE9dGhpcy5nWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1hLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9O0gucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpe3ZhciBjPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuZiYmMDx0aGlzLmYubGVuZ3RoKXJldHVybiB0aGlzLmY7Zm9yKGMgaW4gdGhpcy5mKXt2YXIgZD10aGlzLmZbY107aWYoZC5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJgpkLnVybD09PWEpcmV0dXJuIGQuYWxpYXN9cmV0dXJuIm5vbmUifTtILnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdbdGhpcy5EYV19O0gucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKSsiIixjPXRoaXMuZmEoKTthPWwuaWIoYSk7dmFyIGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBjLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKStkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX07SC5wcm90b3R5cGUuRGI9ZnVuY3Rpb24oYSl7dmFyIGM9ITEsZD0iIjtpZihhLmV2YWwpdHJ5e2Q9ZXZhbCgiKCIrYS5ldmFsKyIpKCkiKX1jYXRjaChlKXtjPSEwfWVsc2UgYz0hMDtjJiYiS0VFUCIhPT1hLmZhbGxiYWNrJiYoZD1hLmZhbGxiYWNrKTtyZXR1cm4gZH07SC5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oYSxjKXthPWwuYyhhKTt2YXIgZDtmb3IoZCBpbiBjKXtpZihjW2RdLnN1YnZhbHVlcyl7dmFyIGU9CmRlY29kZVVSSUNvbXBvbmVudChhLnF1ZXJ5S2V5W2RdKS5zcGxpdCgiJiIpO3ZhciBmPXt9O2Zvcih2YXIgaD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgbT1lW2hdLnNwbGl0KCI9Iik7ZlttWzBdXT1tWzFdfWZvcih2YXIgRCBpbiBjW2RdLnN1YnZhbHVlcylmW0RdPXRoaXMuRGIoY1tkXS5zdWJ2YWx1ZXNbRF0pO2U9W107Zm9yKEQgaW4gZillLnB1c2goRCsiPSIrZltEXSk7Zj1lPWVuY29kZVVSSUNvbXBvbmVudChlLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuRGIoY1tkXSk7YS5xdWVyeUtleVtkXT1mfWM9W107Zm9yKGQgaW4gYS5xdWVyeUtleSljLnB1c2goZCsiPSIrYS5xdWVyeUtleVtkXSk7cmV0dXJuIGEuaG9zdCthLnBhdGgrIj8iK2Muam9pbigiJiIpfTtILnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXt0aGlzLlBhJiYoYSs9dGhpcy5QYSk7aWYodGhpcy5CKWZvcih2YXIgYyBpbiB0aGlzLkIpdGhpcy5CLmhhc093blByb3BlcnR5KGMpJiYoYT1hLnJlcGxhY2UoYyx0aGlzLkJbY10pKTsKaWYobC5PKWZvcih2YXIgZD0wO2Q8bC5PLmxlbmd0aDtkKyspe3ZhciBlPWwuT1tkXTtmb3IoYyBpbiBlKWE9YS5yZXBsYWNlKGMsZVtjXSl9dGhpcy5VJiYoYT10aGlzLlpiKGEsdGhpcy5VKSk7aWYoZD1nLnYuYigidGNmX2NvbmZpZyIpKWM9ZC5jb25zZW50X3N0cmluZ19wbGFjZWhvbGRlcnx8IltnZHByX2NvbnNlbnRdIixkPWQuZ2Rwcl9hcHBsaWVzX3BsYWNlaG9sZGVyfHwiW2dkcHJdIixnLlVhJiYoYT1hLnJlcGxhY2UoYyxnLlVhLmRjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoZCxnLlVhLlZjPyJ0cnVlIjoiZmFsc2UiKSk7cmV0dXJuIGF9O0gucHJvdG90eXBlLm1hPWZ1bmN0aW9uKGEpe2cudi5iKCJnZHByIikmJihhPW5ldyBkYShhKSwoIWEuYigiZ2RwciIpfHxhLmIoImdkcHIiKSYmMD09PWEuZygiZ2RwciIpLmxlbmd0aCkmJmEuaSgiZ2RwciIsIltnZHByXSIpLGEuYigiY29uc2VudCIpfHxhLmIoImdkcHJfY29uc2VudCIpfHxhLmwoKSxhLmIoImNvbnNlbnQiKSYmCjA9PT1hLmcoImNvbnNlbnQiKS5sZW5ndGgmJmEuaSgiY29uc2VudCIsIltnZHByX2NvbnNlbnRdIiksYS5iKCJnZHByX2NvbnNlbnQiKSYmMD09PWEuZygiZ2Rwcl9jb25zZW50IikubGVuZ3RoJiZhLmkoImdkcHJfY29uc2VudCIsIltnZHByX2NvbnNlbnRdIiksYT1hLnRvU3RyaW5nKCkpO3ZhciBjPWcudi5iKCJ0Y2ZfY29uZmlnIik7aWYoYyl7dmFyIGQ9Yy5jb25zZW50X3N0cmluZ19wbGFjZWhvbGRlcnx8IltnZHByX2NvbnNlbnRdIjtjPWMuZ2Rwcl9hcHBsaWVzX3BsYWNlaG9sZGVyfHwiW2dkcHJdIjtnLlVhJiYoYT1hLnJlcGxhY2UoZCxnLlVhLmRjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoYyxnLlVhLlZjPyIxIjoiMCIpKX1lbHNlIGE9YS5yZXBsYWNlKCJbZ2Rwcl9jb25zZW50XSIsZy5VYS5kY3x8InVuZGVmaW5lZCIpLGE9YS5yZXBsYWNlKCJbZ2Rwcl0iLGcuVWEuVmM/IjEiOiIwIik7cmV0dXJuIGF9O0gucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5pJiYKdGhpcy5pLmNsaWVudEFQSXMmJnRoaXMuSWIodGhpcy5pLmNsaWVudEFQSXMpfTtILnByb3RvdHlwZS5JYj1mdW5jdGlvbihhKXtpZihhKXt2YXIgYz1uZXcgcGI7YS5wdWJsaXNoZXJBUEkmJmMuZihhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmMuYyhhLnBsYXllcik7Yy53KCl9fTtILnByb3RvdHlwZS5UPWZ1bmN0aW9uKGEsYyl7dGhpcy5mPWE7dGhpcy5nPWM7dGhpcy5hPSEwfTtILnByb3RvdHlwZS5SYT1mdW5jdGlvbihhLGMsZCxlLGYsaCl7d2E9dGhpczt0aGlzLnpiPSEwO3RoaXMuZWM9YTt0aGlzLkJhPWM7dGhpcy5kZD1kO3RoaXMuaGE9ZTt0aGlzLnRiPWY7dGhpcy5pPWh8fHt9O3RoaXMuTWIoKTt0aGlzLlliKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkJhKXRoaXMuVGIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQmEpdHJ5e3RoaXMuQmE9YygpLHRoaXMuYmMoKX1jYXRjaChtKXt0aGlzLkFhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5CYSl0cnl7dGhpcy5CYT1jLHRoaXMuYmMoKX1jYXRjaChtKXt0aGlzLkFhKCJub0NsaWVudENvbmZpZyIpfX07SC5wcm90b3R5cGUubT1mdW5jdGlvbihhKXt2YXIgYz1udWxsO3RyeXtjPW5ldyBFdmVudChhKX1jYXRjaChkKXtjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGMuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gY307SC5wcm90b3R5cGUuV2Q9ZnVuY3Rpb24oKXt0aGlzLmE9ITE7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpfTtILnByb3RvdHlwZS5GYj1mdW5jdGlvbigpe3RoaXMuYj10aGlzLkphPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuSGIpKTt0aGlzLkYoKX07SC5wcm90b3R5cGUuWWI9ZnVuY3Rpb24oKXt0aGlzLmwobmV3IFBhKHRoaXMuZWMrdGhpcy5QKCJnbG9iYWwiKSksdGhpcy5SYi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nZCgiZ2xvYmFsIik7CiJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5iYygpfS5iaW5kKHRoaXMpLCEwKX07SC5wcm90b3R5cGUuVGI9ZnVuY3Rpb24oKXt0aGlzLmwobmV3IFBhKHRoaXMuQmErdGhpcy5QKCJjbGllbnQiLC0xIT10aGlzLkJhLmluZGV4T2YoIj8iKSkpLHRoaXMuYmMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2QoImNsaWVudCIpO3RoaXMuQWEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9O0gucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSxjKXtjPSgodm9pZCAwPT09Yz8wOmMpPyImIjoiPyIpKygiY2FjaGU9IitsLnMoKSk7dGhpcy5pJiZ0aGlzLmkubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihjPSIiKTt0aGlzLmkmJnRoaXMuaS5ub0NhY2hlQnVzdGVyJiYoYz0iIik7cmV0dXJuIGN9O0gucHJvdG90eXBlLkFhPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnFhKXt0aGlzLnFhPSEwO3ZhciBjPWZ1bmN0aW9uKGUpe2V8fAooZT13aW5kb3cpO2Zvcih2YXIgZj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGg9MDtoPGYubGVuZ3RoO2grKyl7aWYoZltoXSYmZltoXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGZbaF0ucGF1c2UpdHJ5e2ZbaF0ucGF1c2UoKX1jYXRjaChtKXt9ZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pfWY9ZS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGg9MDtoPGYubGVuZ3RoO2grKylmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKWZbaF0mJmZbaF0ucGFyZW50Tm9kZSYmZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pO2Y9ZS5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihoPTA7aDxmLmxlbmd0aDtoKyspZltoXSYmCmZbaF0ucGFyZW50Tm9kZSYmZltoXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZbaF0pO2lmKGUuc2VsZiE9ZS50b3ApZm9yKGU9ZS5kb2N1bWVudDtlLmhhc0NoaWxkTm9kZXMoKTspZS5yZW1vdmVDaGlsZChlLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGI9ZnVuY3Rpb24oKXt9KTsiZm9jdXMuZGUiPT1sLkcoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnRiPWZ1bmN0aW9uKCl7fSk7aWYodGhpcy50YiYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnRiKXRoaXMudGIoKTtlbHNle2MoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoYyw1MDApO3RyeXtjKHdpbmRvdy50b3ApLHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe2Mod2luZG93LnRvcCl9LDUwMCl9Y2F0Y2goZSl7fX10aGlzLmI9dGhpcy55Yj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLldhKSk7dGhpcy5GKCk7bC5QKHYuVyk7CnZhciBkPWwuRyh0aGlzLmZhKCkpO2R8fChkPWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2wudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX07SC5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYil7dmFyIGM9e307dHJ5e2M9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZil7Yy5lbmFibGVkPSJmYWxzZSJ9dmFyIGQ9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGQ9ITApfWNhdGNoKGYpe31pZighKGR8fGMuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYy5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2M9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuYz1jO3RoaXMuYT1sLm0oYy5lbmFibGVkKTt0aGlzLmI9CiF0aGlzLmE7dGhpcy5hPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5EfHx0aGlzLmZ8fHRoaXMuYmMoKToodGhpcy5KYT10aGlzLmE9ITEsdGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuRigpKX19O0gucHJvdG90eXBlLmJjPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJihjPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihjKXRyeXtkPUpTT04ucGFyc2UoYy50b1N0cmluZygpKX1jYXRjaChmKXtkPXRoaXMuQmF9ZWxzZSBkPXRoaXMuQmE7Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWU9ZnVuY3Rpb24oKXtmb3IodmFyIGY9MDtmPGQuc2VydmVyLmxlbmd0aDtmKyspe3ZhciBoPWQuc2VydmVyW2ZdO3RyeXtpZih2b2lkIDA9PT1ofHwhaC5yZXBsYWNlKCJbaGFzaF0iLGwuaWIoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbdy4tXSopOj8uKihbMC05XSspP1wvKFthLWYwLTldezQwfSlcLz8kL2cpKXJldHVybiExfWNhdGNoKG0pe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTsKaWYoIShjfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZlKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fWcudi5jbGllbnQ9ZDt0aGlzLmE9bC5tKGQuZW5hYmxlZCk7dGhpcy5iPSF0aGlzLmE7dGhpcy5nPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5nLmxlbmd0aDthKyspdGhpcy5nW2FdPXRoaXMuZ1thXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGwuYigid2ViLmRlIil8fGwuYigiZ214Lm5ldCIpfHxsLmIoImdteC5hdCIpfHxsLmIoImdteC5jaCIpfHxsLmIoIjF1bmQxLmRlIikpJiYhdGhpcy53YSgpKWZvcihhPTA7YTx0aGlzLmcubGVuZ3RoO2ErKyl0aGlzLmdbYV09CnRoaXMuZ1thXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rYT1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5EPWQuY29uZmlnfHwiIjt0aGlzLmY9ZC5hbGlhc3x8bnVsbDt0aGlzLmpiPWQuYWRwYXRofHwiIjt0aGlzLkRhPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmcubGVuZ3RoKTt0aGlzLmEmJnRoaXMuRCYmdGhpcy5mJiZ0aGlzLmcubGVuZ3RoP3RoaXMuaWMoITEpOih0aGlzLkphPXRoaXMuYT0hMSx0aGlzLmI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSksdGhpcy5GKCkpfTtILnByb3RvdHlwZS5FYj1mdW5jdGlvbihhKXt0aGlzLmxhfHwodGhpcy5sYT1hfHwiIil9O0gucHJvdG90eXBlLmljPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPXt9O2lmKGEpe2M9bmV3IFBhKHRoaXMucygpKTt2YXIgZD1sLmModGhpcy5EKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KInMzaG9tYWRnbG9iYWxjb25maWdzIjtjLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yy5tZXRob2Q9IlBPU1QifWVsc2UgYz1uZXcgUGEodGhpcy5EK3RoaXMuUCgiY3VzdG9tZXIiKSk7dGhpcy5sKGMsdGhpcy5MYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nZCgiY3VzdG9tZXIiKTthP3RoaXMuUWQ/dGhpcy5BYSgibm9TVk1Db25maWciKToodGhpcy5RZD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuaWMoITApfS5iaW5kKHRoaXMpLCEwKX19O0gucHJvdG90eXBlLkxjPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShjLnRvU3RyaW5nKCkpfWNhdGNoKGYpe2lmKCF0aGlzLlcmJnRoaXMuYSl7dGhpcy5XPQohMDt0aGlzLmljKCEwKTtyZXR1cm59fWM9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGM9ITApfWNhdGNoKGYpe31pZighKGN8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChmKXt9Zy52Lmk9ZDt0aGlzLnBiPWwubShkLnN0cmljdCk7dGhpcy5UYT1sLm0oZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuaWI9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLm89bC5tKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7CnRoaXMuYT1sLm0oZC5lbmFibGVkKTt0aGlzLkk9ZC50ZXN0aGlkZXx8IiI7dGhpcy5PPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuZ2E9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLlo9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuUGE9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5CPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlU9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLm5hPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkFiPWQuanNwb3B1cHN8fCExO3RoaXMuYmE9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaWE9ZC52cGFpZHx8ITE7dGhpcy5pLnZwYWlkPXRoaXMuaWE7dGhpcy5sYj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLlY9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLnFiPWQudm1hcHN8fCIiO3RoaXMuZGE9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLmJpdHJhdGU9ZC5iaXRyYXRlfHwxRTM7dGhpcy5FYihkLmFkX2ZhbGxiYWNrX1VSTHx8CiIiKTt0aGlzLmthPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLkdhPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5rYj1kLnlpZWxkbGFifHxudWxsO3RoaXMuWT1kLnNhbmRib3hzY3JpcHRzfHxudWxsO2QuYWxpYXMmJih0aGlzLmY9ZC5hbGlhcyk7IXRoaXMuVyYmdGhpcy5hPyh0aGlzLlc9ITAsdGhpcy5pYyghMCkpOnRoaXMuYSYmIXRoaXMuUGMoKSYmKHRoaXMuSXx8dGhpcy5PfHx0aGlzLkt8fHRoaXMuZ2EpP3RoaXMuZGQ/KHRoaXMuSmE9dGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuc2EoKSx0aGlzLkYoKSk6dGhpcy5OYygpOih0aGlzLmE9ITEsdGhpcy5GYSgpKX19O0gucHJvdG90eXBlLnRlPWZ1bmN0aW9uKGEpe3RoaXMuR2Q9ITA7dmFyIGM9ZnVuY3Rpb24oZCl7aWYoZD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2QrIj0oW147XSspIikpKXJldHVybiBkWzJdfSgiYWRwX3NlZ3MiKXx8CiJlMCI7Yz10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkucmVwbGFjZSgiW3NlZ3NdIixlbmNvZGVVUklDb21wb25lbnQoYykpO2M9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIixob21hZF91cmxfc3VmZml4OmMsaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ6bC5CKGMpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07bC5sYSh0aGlzLnMoKSwiUE9TVCIsYyxmdW5jdGlvbihkKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShkLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7fWwudHJhY2soInN0YXRzX2hkX3lsX2RhdGEiLChlJiZlLmxlbmd0aCkudG9TdHJpbmcoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlcil7dmFyIGY9dGhpcy5rYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIik7Zj1mLnNwbGl0KCJbc2l6ZV0iKS5qb2luKGVbMF0uYWRzaXplfHwwKTtmPWYuc3BsaXQoIltwcmljZV0iKS5qb2luKCh0aGlzLmtiLnByaWNlX211bHRpcGxpZXI/CmVbMF0ucHJpY2UqdGhpcy5rYi5wcmljZV9tdWx0aXBsaWVyOmVbMF0ucHJpY2UpfHwwKTt0aGlzLlBhKz1mfX1jYXRjaChoKXthKCl9YSgpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YSgpfS5iaW5kKHRoaXMpKX07SC5wcm90b3R5cGUuTmM9ZnVuY3Rpb24oKXt0aGlzLk1jKCk7dGhpcy5PYygpfTtILnByb3RvdHlwZS5PYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoTCl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitMKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrTCsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGM9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwplLndpZHRoPTE7ZS5oZWlnaHQ9MTtlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Uuc3JjPSJhYm91dDpibGFuayI7dmFyIGY9bC5nKDEwKSxoPWwuZygxMCksbT1sLmcoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe2QrKztjPWMucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2M9Yy5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKG0sZnVuY3Rpb24oKXtkKys7Yz1jLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgRD1hdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKG0sImlubGluZSIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgsImV2YWwiKSsKYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2wuQihhKGYsImRhdGEiKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpO2UuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShEKX1jYXRjaChMKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKX1jYXRjaChPKXt9aWYoMyE9ZCl7dmFyIEw9bC5GKCk7aWYoKEwudWJ8fEwudmIpJiYhTC5oYyYmIWwucmEoKSl7aWYodGhpcy5pJiZ0aGlzLmkucGxheWVyJiZ0aGlzLmkucGxheWVyLmxlbmd0aCl7bC50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYywhMCk7cmV0dXJufWwuYigidGVsZTUuZGUiKXx8bC5iKCJ0YWdlc3NwaWVnZWwuZGUiKXx8dGhpcy5BYSgiY3NwXyIrCmMpfWwudHJhY2soInN0YXRzX2hkX2NzcCIsYywhMCl9fS5iaW5kKHRoaXMpLDFFMyl9O0gucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpfTtILnByb3RvdHlwZS5BYz1mdW5jdGlvbihhKXt0aGlzLkc9ITA7dGhpcy5ifHwodGhpcy5iPXRoaXMuSmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0oYSkpLHRoaXMuRigpLHRoaXMuc2EoKSl9O0gucHJvdG90eXBlLk1jPWZ1bmN0aW9uKCl7aWYodGhpcy5JKXt2YXIgYT1sLkYoKTtpZigoYS51Ynx8YS52YikmJnRoaXMuZ2IoKSl0aGlzLkFjKHRoaXMuSGIpO2Vsc2V7YT0hMTt0cnl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkkpO2Muc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5JKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7dmFyIGQ9MD09PWMub2Zmc2V0V2lkdGh8fDA9PT1jLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2E9ZH1jYXRjaChlKXt9YT90aGlzLkFjKHRoaXMuSGIpOnRoaXMub2IoKX19ZWxzZSB0aGlzLm9iKCl9O0gucHJvdG90eXBlLmxkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtlPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsbC5zKCkpLHRoaXMuTGUoZSwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmtkLmJpbmQodGhpcyksYy5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLmtkKCl9fWZ1bmN0aW9uIGMoKXt0aGlzLkFjKHRoaXMuSGIpfWlmKCh0aGlzLks9dGhpcy5nYSkmJnRoaXMuSy5sZW5ndGgpe3ZhciBkPXRoaXMuSy5zbGljZSgpLGU9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmtkKCl9O0gucHJvdG90eXBlLkxlPWZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBlKCl7ZigpJiYKYygpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5sKG5ldyBQYShhKSxlLGZ1bmN0aW9uKCl7ZigpJiZkKCl9KX07SC5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2U9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIixsLnMoKSksdGhpcy5NZShlLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubGQuYmluZCh0aGlzKSxjLmJpbmQodGhpcykpfWNhdGNoKGYpe3RoaXMubGQoKX19ZnVuY3Rpb24gYygpe3RoaXMuQWModGhpcy5IYil9aWYodGhpcy5PJiZ0aGlzLk8ubGVuZ3RoKXt2YXIgZD10aGlzLk8uc2xpY2UoKSxlO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5sZCgpfTtILnByb3RvdHlwZS5NZT1mdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGYoKXtoKCkmJmQoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIG0/Cih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLCEwKTohMX1sLmcoKTt2YXIgbT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oTCxPKXtPPT1hJiZoKCkmJmYoKX07dmFyIEQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTtELnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO0Quc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7RC5vbmxvYWQ9ZTtELm9uZXJyb3I9ZjtELnNyYz1hO0QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGYpfWNhdGNoKEwpe2UoKX19O0gucHJvdG90eXBlLmtkPWZ1bmN0aW9uKCl7aWYodGhpcy5aKXRyeXtsLmxhKHRoaXMuWiwiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5hYT0hbC5tKGEuY2MpO3RoaXMuRmEoKX0uYmluZCh0aGlzKSx0aGlzLm5iLmJpbmQodGhpcykpfWNhdGNoKGEpe3RoaXMubmIoKX1lbHNlIHRoaXMuRmEoKX07CkgucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpO3RoaXMuc2EoKX07SC5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3sidGVzdGFkdGFnc3hociI6ImhlcmUgYmUgZHJhZ29ucyIsICJlbmFibGVkIjp0cnVlfScpLnRlc3RhZHRhZ3N4aHJ8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJjb25maWciOiJoZXJlIGJlIGRyYWdvbnMifScpLmVuYWJsZWR8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6ImhlcmUgYmUgZHJhZ29ucyJ9JykuZW5hYmxlZHx8ImZ1bmN0aW9uKCl7fSI9PT1DdXN0b21FdmVudC50b1N0cmluZygpfHwhMX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fTtILnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPSIwIixkPSIwIjt0cnl7bC5yYSgpJiYoYz0iMSIpfWNhdGNoKGUpe2M9CjJ9dGhpcy5HJiYoZD0iMSIpO2wudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYysiIitkLCEwKTtnLmouYigiZ2lnYS5kZSIpJiZ0aGlzLkcmJmwudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuZ2IoKSwhMCk7bC5GKCk7KHRoaXMuSmEmJnRoaXMuYXx8bC5hYSgpKSYmdGhpcy5ZJiZ0aGlzLkdiKCk7dGhpcy5aJiZsLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuYWEudG9TdHJpbmcoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy5mYikpO3RoaXMuaGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5oYSYmdGhpcy5oYSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5hYX0pO2lmKHRoaXMuYSl0cnl7dGhpcy56YT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2ZldGNoKGEuZWMrYS5QKCJnbG9iYWwiKSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpeyExPT09Zy5qLm0oZS5lbmFibGVkKT8KKGEuYT0hMSwhMD09PWcuai5tKGUubGVlcm95KSYmY2xlYXJJbnRlcnZhbChhLnphKSk6YS5hPSEwfSkuY2F0Y2goKTtmZXRjaChhLkQrYS5QKCJjdXN0b21lciIpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLmpzb24oKX0pLnRoZW4oZnVuY3Rpb24oZSl7ITE9PT1nLmoubShlLmVuYWJsZWQpPyhhLmE9ITEsITA9PT1nLmoubShlLmxlZXJveSkmJmNsZWFySW50ZXJ2YWwoYS56YSkpOmEuYT0hMH0pLmNhdGNoKCl9LDNFNSl9Y2F0Y2goZSl7fX07SC5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oKXt0aGlzLk49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5OLmlkPWwuZygxMCk7dGhpcy5OLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuTi5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk4uY29udGVudFdpbmRvdyxjPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dGhpcy5ZJiYoYy5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8CnRoaXMuWS5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5ZW2VdLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcykpO2Muc3JjPWwuSygiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5OKX07SC5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oKXtpZih0aGlzLlRhJiZ0aGlzLlNiKCkpe3ZhciBhPXRoaXMuUWIoKTthJiZhLmpvaW4mJmwudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19O0gucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe2U9dm9pZCAwPT09CmU/ITE6ZTtmPXZvaWQgMD09PWY/ITE6ZjtoPXZvaWQgMD09PWg/ITE6aDt0aGlzLmVhfHwodGhpcy5lYT0wKTt0aGlzLmVhKys7MUUzPHRoaXMuZWEmJiF0aGlzLnhiJiYodGhpcy54Yj0hMCxsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLCgxRTMpLnRvU3RyaW5nKCksITApKTt2YXIgbT1hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIik7YT1uZXcgZ2IoYSxjLGQsbnVsbCxtKTtlJiYoYS5GPSEwKTtmJiZsLnljKCkmJihhLmY9ITApO2gmJihhLmM9ITApO2lmKEQpe3ZhciBEPXBhcnNlSW50KEQsMTApOzA8RCYmKGEudGltZW91dD1EKX1yZXR1cm4gYS5sb2FkKCl9O0gucHJvdG90eXBlLkpiPWZ1bmN0aW9uKCl7dGhpcy5CYnx8KHRoaXMuQmI9ITAsbC5yYSgpfHxsLlYoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbCxlPSIiO3RyeXsoYz1hLnJlc3BvbnNlWE1MKXx8KGM9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChoKXt0aGlzLkFhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGVbMF0mJihlPWVbMF0pLGUpe2U9ZSYmZS5jaGlsZE5vZGVzJiZlLmNoaWxkTm9kZXNbMF0/ZS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLndhKCl8fChlPWwuYyhlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2E9ZnVuY3Rpb24oaCl7dmFyIG09IiI7dHJ5e2gmJmgudGFyZ2V0JiYKaC50YXJnZXQuZXJyb3ImJihtPWgudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKEQpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5BYSgibWVkaWFmaWxlX25vc291cmNlIittKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLkFhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoYyk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsZSk7Zi5sb2FkKCl9ZWxzZSB0aGlzLkFhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5BYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuQWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5BYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9O0gucHJvdG90eXBlLktiPWZ1bmN0aW9uKCl7dGhpcy5jKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLmMoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMubChhLHRoaXMuUWMuYmluZCh0aGlzKSx0aGlzLkNjLmJpbmQodGhpcykpfTtILnByb3RvdHlwZS5RYz1mdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbDt0cnl7KGM9YS5yZXNwb25zZVhNTCl8fChjPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSwKZD1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3JldHVybn1kfHx0aGlzLlBiKCl9O0gucHJvdG90eXBlLkNjPWZ1bmN0aW9uKCl7fTtILnByb3RvdHlwZS5QYj1mdW5jdGlvbigpe2wuUCh2LlApO2wudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuQWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9O0gucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7aWYodGhpcy5hJiZ0aGlzLmJhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuYmEubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5iYVthXTsicmVxdWVzdCI9PWMudHlwZSYmbC5WKGMudXJsLGMuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yy50eXBlKXt2YXIgZD1uZXcgQ2E7d2luZG93W2QuYSgpXT10aGlzO2wuVihjLnVybCxjLmFsaWFzLG51bGwsZnVuY3Rpb24oZSl7aWYoZS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoZS5yZXNwb25zZVRleHQpfWNhdGNoKGYpe319LApmdW5jdGlvbigpe30sdGhpcyl9fX07SC5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5HYX07dmFyIHdhPXt9O3oucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMuRWQ9ITB9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhLmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixhLmJpbmQodGhpcykpfTt6LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy5uYXx8KHRoaXMubmE9dGhpcy5nKDEwKSk7cmV0dXJuIHRoaXMubmF9O3oucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgZj0obmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uKwpuYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKSkuc3BsaXQoIiAiKS5qb2luKCIiKSxoPU1hdGgubWF4KE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvNjApLE1hdGgucm91bmQoKERhdGUubm93KCkvMUUzKzEwKS82MCkpLnRvU3RyaW5nKCksbT1mLnNsaWNlKDAsZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtmPWYuc2xpY2UoZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gaCttK2grZitofSgpLGM9ZnVuY3Rpb24oZil7dmFyIGg9MCxtO2lmKDA9PWYubGVuZ3RoKXJldHVybiBoO3ZhciBEPTA7Zm9yKG09Zi5sZW5ndGg7RDxtO0QrKyloPShoPDw1KS1oK2YuY2hhckNvZGVBdChEKSxofD0wO3JldHVybiBNYXRoLmFicyhoKX0oYSkudG9TdHJpbmcoKTtjPShjK2Muc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKS5tYXRjaCgvLnsxLDJ9L2cpLm1hcChOdW1iZXIpOwphPWJ0b2EoYSkucmVwbGFjZSgvW15hLXpdL2dpLCIiKS5zdWJzdHIoMCwxMDApO2Zvcih2YXIgZD0iIixlPTA7ZTxjLmxlbmd0aDtlKyspZCs9YS5jaGFyQXQoY1tlXSk7cmV0dXJuIGR8fCJ6b3JrIn07ei5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLm9hfHwodGhpcy5vYT1NYXRoLnJhbmRvbSgpKTtyZXR1cm4gdGhpcy5vYX07ei5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oKXt0aGlzLmk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fTt6LnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihhLGMpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYywKIioiKX07ei5wcm90b3R5cGUuZj1mdW5jdGlvbihhLGMsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YyxkYXRhOmR9KX07ei5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUGIoYS5kYXRhKX07ei5wcm90b3R5cGUuUGI9ZnVuY3Rpb24oYSl7aWYodGhpcy5pJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGM9dGhpcy5pLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXRoaXMuaSYmdGhpcy5pLmV2ZW50bGlzdGVuZXImJnRoaXMuaS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX07ei5wcm90b3R5cGUuWj1mdW5jdGlvbihhLGMpe3RoaXMuaS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpjfSl9O3oucHJvdG90eXBlLldhPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRigpO3JldHVybiBnLnBjPyExOmcudi5iKCJ2cGFpZCIpJiYhYS5yYSYmKGEudWJ8fGEudmIpfTt6LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIoIm1hcnRoYXN0ZXdhcnQuY29tIil8fHRoaXMuYigiZmFuZG9tLmNvbSIpfHx0aGlzLmIoImdpZ2EuZGUiKXx8dGhpcy5iKCJraW5vLmRlIil8fHRoaXMuYigic3BpZWxldGlwcHMuZGUiKXx8dGhpcy5iKCJkZXNpcmVkLmRlIil9O3oucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7cmV0dXJuIGEudWJ8fGEudmJ8fGEuaGN8fGEueGN9O3oucHJvdG90eXBlLkdiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYigic3BpZWdlbC5kZSIpfHx0aGlzLmIoIndlYi5kZSIpfHx0aGlzLmIoImdteC5uZXQiKX07ei5wcm90b3R5cGUuSWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iKCJzcGllZ2VsLmRlIikmJiJwcmVyb2xsIj09PXRoaXMuVSYmLjM+dGhpcy5EYSgpfTt6LnByb3RvdHlwZS5NYj1mdW5jdGlvbigpe3ZhciBhPQpnLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIHRoaXMucmEoKSYmZy5qLmIoInNwaWVnZWwuZGUiKSYmdGhpcy5EYSgpPChhLnRha2VvdmVyfHwuMTQpfHx0aGlzLkxiKCl9O3oucHJvdG90eXBlLk5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmEoKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpfTt6LnByb3RvdHlwZS5MYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhKCkmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKX07ei5wcm90b3R5cGUuTj1mdW5jdGlvbigpe2lmKGcucGMpcmV0dXJuITE7aWYoZy5VZClyZXR1cm4hMDt2YXIgYT1nLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIGEmJmEuZW5hYmxlZCYmYS5sb2dvJiZ0aGlzLnJhKCl8fHRoaXMuTmIoKX07ei5wcm90b3R5cGUuVGE9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9CndpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIiZzdGFuZGFsb25lIil9O3oucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmwuZ2V0KCJmZXRjaCIpKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eSIse2NyZWRlbnRpYWxzOiJvbWl0In0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIDIwMCE9PWEuc3RhdHVzfHwiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHkiIT09YS51cmx9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiEwfSl9Y2F0Y2goYSl7cmV0dXJuITF9fTt6LnByb3RvdHlwZS55Yj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5ib2R5KXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthLndpZHRoPTE7YS5oZWlnaHQ9MTthLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKdmFyIGM9YS5jb250ZW50V2luZG93fWVsc2UgYz13aW5kb3d9Y2F0Y2goTyl7Yz13aW5kb3d9dmFyIGQ9Yy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZT1jLnNldFRpbWVvdXQuYmluZCh3aW5kb3cpLGY9Yy5kb2N1bWVudC5jcmVhdGVFbGVtZW50LmJpbmQoZG9jdW1lbnQpLGg9Yy5KU09OLG09Yy5KU09OLnBhcnNlLEQ9Yy5DdXN0b21FdmVudDt0cnl7dmFyIEw9Yy5mZXRjaC5iaW5kKHdpbmRvdyk7dGhpcy5sLnNldCgiZmV0Y2giLEwpfWNhdGNoKE8pe310aGlzLmwuc2V0KCJjcmVhdGVFbGVtZW50IixmKTt0aGlzLmwuc2V0KCJzZXRJbnRlcnZhbCIsZCk7dGhpcy5sLnNldCgic2V0VGltZW91dCIsZSk7dGhpcy5sLnNldCgiSlNPTiIsaCk7dGhpcy5sLnNldCgiSlNPTi5wYXJzZSIsbSk7dGhpcy5sLnNldCgiQ3VzdG9tRXZlbnQiLEQpO2RvY3VtZW50LmJvZHkmJmEmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSl9O3oucHJvdG90eXBlLmthPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7cmV0dXJuIDE9PWYuYT8oZD1jLmlhKGEpLGU9e21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LGJvZHk6ZGEuYSh7aG9tYWRfcmVzb2x2ZV9oYXNoOmR9KX0scWMoZixmZXRjaChhLGUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGguanNvbigpfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gaC51cmx9KSwyKSk6Zi5yZXR1cm4oZi5iKX0pfTt6LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXt2YXIgYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtyZXR1cm4gMT09ZS5hPyhjPWcuSC5zKCksZD17bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0sYm9keTpkYS5hKHtob21hZF91cmxfc3VmZml4OmEsaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoOiEwLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH0pfSwKcWMoZSxmZXRjaChjLGQpLnRoZW4oZnVuY3Rpb24oZil7cmV0dXJuIGYuanNvbigpfSkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gZy5ILmZhKCkucmVwbGFjZSgiW2hhc2hdIixmLmhhc2gpfSksMikpOmUucmV0dXJuKGUuYil9KX07ei5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD10aGlzLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOmlmKCEoZC5BKGEpJiZkLldhKCkmJmQucWIoKSkpe2guYT0yO2JyZWFrfXJldHVybiBxYyhoLGQua2EoYSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gYX0pLDMpO2Nhc2UgMzplPWguYixkLkEoZSl8fDAhPT1lLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfHwoYz0hMCxhPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQoZSkrIiZ0eXBlPWpzIik7Y2FzZSAyOnJldHVybiBhPQpkYS5iKGEpLGY9ZC5vKGEsYyl8fCIiLGQuYmEmJihmPW5ldyBSZXF1ZXN0KGEpKSxxYyhoLGZldGNoKGYpLDQpO2Nhc2UgNDpyZXR1cm4gaC5yZXR1cm4oaC5iKX19KX07ei5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oYSl7dGhpcy5iYT0hMTthJiZhLmluZGV4T2YmJjA8PWEuaW5kZXhPZigiaGRtYz10cnVlIikmJmcucGxheWVyJiZnLnBsYXllci5jYSYmIk9ubHlIT01BRCI9PWcucGxheWVyLmNhKCkmJiFnLkguRyYmKHRoaXMuYmE9ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9ub2hvbWFkIiwiIiwhMCkpfTt6LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1uZXcgZGEoZy5ILm1hKGEpKTtpZih0aGlzLkEoYSkpe3ZhciBmPWUuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTt2YXIgaD1hO2E9ZS5wYXRofWVsc2UgZj1jPyJ2cGFpZCI6Zy5ILnRhKGUuaG9zdCksaD1nLkgucygpLGE9Yz9hOmUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpOwphPWcuSC5DYihhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOmYsaG9tYWRfdXJsX3N1ZmZpeDphLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmJ0b2EoYS50b1N0cmluZygpKX07dGhpcy5XYSgpJiYoZi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSEwKTtmPU9iamVjdC5hc3NpZ24oe30sZixkKTtkPXttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifSxjcmVkZW50aWFsczoiaW5jbHVkZSIsYm9keTpkYS5hKGYpfTtyZXR1cm4gbmV3IFJlcXVlc3QoaCxkKX07ei5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pYShhKSxkPSExO2lmKGMpcmV0dXJuIHRoaXMubGEoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpjfSxmdW5jdGlvbihlKXt0cnl7ZD1KU09OLnBhcnNlKGUucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goZil7fX0sZnVuY3Rpb24oKXt9LCEwKSxkfTt6LnByb3RvdHlwZS5pYT0KZnVuY3Rpb24oYSl7dmFyIGM9L14oaHR0cHM/KTpcL1wvKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pXC8/JC9nO2lmKChjPWMuZXhlYyhhKSkmJihjWzJdfHxjWzVdKSl7aWYoY1syXSlyZXR1cm4gY1syXTtpZihjWzVdKXJldHVybiBjWzVdfWVsc2UgaWYoYz0vXihodHRwcz8pOlwvXC8oW3cuLV0qKTo/LiooWzAtOV0rKT9cLz8oW2EtZjAtOV17NDB9KVwvPyQvZywoYz1jLmV4ZWMoYSkpJiZjWzRdKXJldHVybiBjWzRdO3JldHVybiExfTt6LnByb3RvdHlwZS54Yj1mdW5jdGlvbihhLGMpe2lmKGMmJiEoMD50aGlzLmMoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yyl7aWYodGhpcy5FYihhKSlyZXR1cm47KGM9dGhpcy5CYihhKSl8fChjPWEpfTA9PT1jLmluZGV4T2YoIi8vIikmJihjPSJodHRwczoiK2MpO3RoaXMuaS51cmxzW2FdPWM7dGhpcy5pLnVybHNbY109YTt0aGlzLmkuaG9tYWRVcmxzW2FdPWM7dGhpcy5pLm9yaWdpbmFsVXJsc1tjXT0KYX19O3oucHJvdG90eXBlLkViPWZ1bmN0aW9uKGEpe3ZhciBjPSExO3RoaXMuaS5ob21hZFVybHNbYV0mJihjPXRoaXMuaS5ob21hZFVybHNbYV0pO3JldHVybiBjfTt6LnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt2YXIgYz0hMTt0aGlzLmkub3JpZ2luYWxVcmxzJiZ0aGlzLmkub3JpZ2luYWxVcmxzW2FdJiYoYz10aGlzLmkub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuS2I9ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX07ei5wcm90b3R5cGUuemE9ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGM9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYysrO3JldHVybiBjfTt6LnByb3RvdHlwZS5UYj1mdW5jdGlvbihhLGMsZCl7YSYmKGEuc3R5bGVbY109ZCl9O3oucHJvdG90eXBlLnFhPWZ1bmN0aW9uKGEsYyl7Yz10aGlzLkNiKGMpOwpmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLlRiKGEsY1tkXS5rZXksY1tkXS52YWx1ZSl9O3oucHJvdG90eXBlLnpiPWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSl9Y2F0Y2goYyl7cmV0dXJuIiJ9fTt6LnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXthPWEuc3BsaXQoIjsiKTtmb3IodmFyIGM9W10sZCxlPSIiLGY9MDtmPGEubGVuZ3RoO2YrKyl7dmFyIGg9YVtmXS5zcGxpdCgiOiIpO2Q9aFswXS50cmltKCk7aFsxXSYmaFsxXS50cmltP2U9aFsxXS50cmltKCk6ZT0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoaD1kLnNwbGl0KCItIiksZD1oWzBdK3RoaXMuemIoaFsxXSkpO2Q9e2tleTpkLHZhbHVlOmV9O2MucHVzaChkKX1yZXR1cm4gY307ei5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9IndlYi5kZSBwY2dhbWVzLmRlIHBjZ2FtZXNoYXJkd2FyZS5kZSB2aWRlb2dhbWVzem9uZS5kZSBnYW1lem9uZS5kZSBnYW1lc2FrdHVlbGwuZGUgYnVmZmVkLmRlIGdvbGVtLmRlIi5zcGxpdCgiICIpLApjPXRoaXMuRigpLGQ9MDtkPGEubGVuZ3RoO2QrKylpZih0aGlzLmIoYVtkXSkmJihjLnZifHxjLnljfHxjLnViKSlyZXR1cm4hMDtyZXR1cm4hMX07ei5wcm90b3R5cGUuVz1mdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfTt6LnByb3RvdHlwZS5GYT1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWYpcmV0dXJuITE7dmFyIGg9Zi5oZWlnaHQqZi53aWR0aDthPWYud2lkdGg7dmFyIG09Zi5oZWlnaHQ7MD5mLnRvcCYmKG0rPWYudG9wKTtmLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCihtLT1mLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5mLmxlZnQmJihhKz1mLmxlZnQpO2YucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoYS09Zi5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+bSYmKG09MCk7MD5hJiYoYT0wKTswPGgmJihkPTEwMC9oKmEqbSk7ZD49YyYmKGU9ITApO3JldHVybiBlfTt6LnByb3RvdHlwZS5HYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLkZhKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihjKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdhKGEpfS5iaW5kKHRoaXMpLAoxMDApfTt6LnByb3RvdHlwZS5TYj1mdW5jdGlvbihhKXtmb3IoO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpfTt6LnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbYS1mMC05XXs0MH0pP1wuPyhbXHdcLlwtXSopXC4oZGFtb2h8aG9tYWQpXC4oW1x3XC5cLV0qKTo/KFswLTldKyk/XC8/KFthLWYwLTldezQwfSk/XC8/KChcP3wjKS4qKT8kLyl9O3oucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX07ei5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoTWF0aC5hYnMoYSkpfHwxMDtyZXR1cm4iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0KLjV9KS5qb2luKCIiKS5zdWJzdHIoMCxhKX07ei5wcm90b3R5cGUuaWI9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyYil7dmFyIGliPSIiLHNiO2ZvcihzYj03OzA8PXNiO3NiLS0pe3ZhciBqYz1yYj4+PjQqc2ImMTU7aWIrPWpjLnRvU3RyaW5nKDE2KX1yZXR1cm4gaWJ9ZnVuY3Rpb24gZChyYixpYil7cmV0dXJuIHJiPDxpYnxyYj4+PjMyLWlifXZhciBlLGY9QXJyYXkoODApLGg9MTczMjU4NDE5MyxtPTQwMjMyMzM0MTcsRD0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LE89MzI4NTM3NzUyMDt2YXIgTj1hLmxlbmd0aDt2YXIgbWE9W107Zm9yKGU9MDtlPE4tMztlKz00KXt2YXIga2E9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMyk7bWEucHVzaChrYSl9c3dpdGNoKE4lNCl7Y2FzZSAwOmU9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6ZT1hLmNoYXJDb2RlQXQoTi0xKTw8MjR8ODM4ODYwODticmVhazsKY2FzZSAyOmU9YS5jaGFyQ29kZUF0KE4tMik8PDI0fGEuY2hhckNvZGVBdChOLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQoTi0zKTw8MjR8YS5jaGFyQ29kZUF0KE4tMik8PDE2fGEuY2hhckNvZGVBdChOLTEpPDw4fDEyOH1mb3IobWEucHVzaChlKTsxNCE9bWEubGVuZ3RoJTE2OyltYS5wdXNoKDApO21hLnB1c2goTj4+PjI5KTttYS5wdXNoKE48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG1hLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKylmW2VdPW1hW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWZbZV09ZChmW2UtM11eZltlLThdXmZbZS0xNF1eZltlLTE2XSwxKTtrYT1oO049bTt2YXIgbmE9RDt2YXIgWT1MO3ZhciB4YT1PO2ZvcihlPTA7MTk+PWU7ZSsrKXt2YXIgWj1kKGthLDUpKyhOJm5hfH5OJlkpK3hhK2ZbZV0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1O3hhPVk7WT1uYTtuYT1kKE4sMzApO049a2E7a2E9Wn1mb3IoZT0yMDszOT49ZTtlKyspWj0KZChrYSw1KSsoTl5uYV5ZKSt4YStmW2VdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx4YT1ZLFk9bmEsbmE9ZChOLDMwKSxOPWthLGthPVo7Zm9yKGU9NDA7NTk+PWU7ZSsrKVo9ZChrYSw1KSsoTiZuYXxOJll8bmEmWSkreGErZltlXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2ZvcihlPTYwOzc5Pj1lO2UrKylaPWQoa2EsNSkrKE5ebmFeWSkreGErZltlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2g9aCtrYSY0Mjk0OTY3Mjk1O209bStOJjQyOTQ5NjcyOTU7RD1EK25hJjQyOTQ5NjcyOTU7TD1MK1kmNDI5NDk2NzI5NTtPPU8reGEmNDI5NDk2NzI5NX1aPWMoaCkrYyhtKStjKEQpK2MoTCkrYyhPKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpfTt6LnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkLGUsZixoLG0sRCxMPTA7TDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoTCsrKSwKZT1hLmNoYXJDb2RlQXQoTCsrKSxmPWEuY2hhckNvZGVBdChMKyspLGg9ZD4+MixkPShkJjMpPDw0fGU+PjQsbT0oZSYxNSk8PDJ8Zj4+NixEPWYmNjMsaXNOYU4oZSk/bT1EPTY0OmlzTmFOKGYpJiYoRD02NCksYz1jKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KG0pKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KEQpO3JldHVybiBjfTt6LnByb3RvdHlwZS55Yz1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IuaGFzT3duUHJvcGVydHkoInZlbmRvciIpJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfTt6LnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxjPXt9O2MudmI9L0ZpcmVmb3hcL3xGeGlPU1wvLy50ZXN0KGEpJiYhL1NlYW1vbmtleVwvLy50ZXN0KGEpO2MueGM9L09QUlwvfE9wZXJhXC98T1BUXC8vLnRlc3QoYSk7Yy5qZT0vVHJpZGVudFwvNy4wO3w7IE1TSUUvLnRlc3QoYSk7Yy5oYz0vRWRnZVwvfEVkZ1wvfEVkZ2lPU1wvfEVkZ0FcLy8udGVzdChhKTtjLmxlPS9TYW1zdW5nQnJvd3NlclwvLy50ZXN0KGEpO2Mub2U9L1lhQnJvd3NlclwvfFlvd3NlclwvLy50ZXN0KGEpO2MubmU9L1VDQnJvd3NlclwvLy50ZXN0KGEpO2MuaGU9L0ZCQU58RkJBVi8udGVzdChhKTtjLmtlPS9JbnN0YWdyYW0vLnRlc3QoYSk7Yy5tZT0vVHdpdHRlci8udGVzdChhKTtjLmFkPWMubGV8fGMub2V8fGMubmV8fGMuaGV8fGMua2V8fGMubWU7Yy51Yj0vQ2hyb21lXC98Q3JpT1NcLy8udGVzdChhKSYmCiEvQ2hyb21pdW1cLy8udGVzdChhKSYmIWMueGMmJiFjLmhjJiYhYy5hZDtjLnljPS9TYWZhcmlcLy8udGVzdChhKSYmIWMudmImJiFjLnViJiYhYy54YyYmIWMuaGMmJiFjLmFkO2MucmE9L2lQaG9uZXxpUGFkfGlQb2R8QW5kcm9pZHxCbGFja0JlcnJ5fFBsYXlCb29rfE1vYmlsZXxPcGVyYSBNaW5pfElFTW9iaWxlfEZ4aU9TfENyaU9TfEVkZ2lPUy8udGVzdChhKTtjLnJmPSFjLnZiJiYhYy54YyYmIWMuamUmJiFjLmhjJiYhYy51YiYmIWMueWMmJiFjLmFkO2MucWY9L2JvdHxiaW5nYm90fGdvb2dsZWJvdHxjcmF3bGVyfHNwaWRlcnxyb2JvdHxjcmF3bGluZy8udGVzdChhKTt0cnl7Yy5pZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5ifHwvSGVhZGxlc3NDaHJvbWVcLy8udGVzdChhKX1jYXRjaChkKXtjLmllPSExfXJldHVybiBjfTt6LnByb3RvdHlwZS5yYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkYoKS5yYX07CnoucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGM9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxlPTE0O2UtLTspZFtjW2VdXT1hW2VdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbY1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGYsaCxtKXtoJiYoZC5xdWVyeUtleVtoXT1tKX0pO3JldHVybiBkfTt6LnByb3RvdHlwZS51bmlxdWU9CmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz17fSxkPVtdLGU9MCxmPWEubGVuZ3RoO2U8ZjsrK2UpYy5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxjW2FbZV1dPTEpO3JldHVybiBkfTt6LnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEpe2E9dGhpcy5jKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYz0iIjthW2EubGVuZ3RoLTJdJiYoYys9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihjKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihjPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YyYmLTE8Yy5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9O3oucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dmFyIGE9IiIsYz0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxjPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYz13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChkKXt9cmV0dXJuIGErY307ei5wcm90b3R5cGUuRGI9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9W10sZT1bXSxmPTA7ZjxjLmxlbmd0aDtmKyspZFtjW2ZdXT0hMDtmb3IoZj0wO2Y8YS5sZW5ndGg7ZisrKWRbYVtmXV18fGUucHVzaChhW2ZdKTtyZXR1cm4gZX07ei5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oYSxjKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGM/KChlPWEuc3BsaXQoIiUiKSkmJihlPWVbMF0pLGQ9TWF0aC5yb3VuZChjLzEwMCplKSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChmKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfTt6LnByb3RvdHlwZS5ZYj1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdiKGEsYyl9Owp6LnByb3RvdHlwZS53YT1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGM9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGM9TWF0aC5mbG9vcihhLzYwKSxjPXRoaXMuamIoYykrIjoiK3RoaXMuamIoTWF0aC5mbG9vcihhLTYwKmMpKSk7cmV0dXJuIGN9O3oucHJvdG90eXBlLmpiPWZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfTt6LnByb3RvdHlwZS5wYT1mdW5jdGlvbihhKXt0aGlzLlU9YX07ei5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSxjLGQpe2Quc3RhdGU9dGhpcy5VO3RoaXMuZWEoZCk7dHJ5e2lmKCJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXZhciBlPW5ldyBDdXN0b21FdmVudChjLHtkZXRhaWw6ZH0pO2Vsc2UgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxlLmluaXRDdXN0b21FdmVudChjLCExLCExLGQpO2EuZGlzcGF0Y2hFdmVudChlKX1jYXRjaChmKXt0aGlzLmhiPQohMCxkb2N1bWVudC5ib2R5PyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGEud2lkdGg9MSxhLmhlaWdodD0xLGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKSxhPWEuY29udGVudFdpbmRvdyk6YT13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PWEuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX07ei5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXt2YXIgYyxkO2N8fChjPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTtpZihhJiYxMDA1PT1hLmNvZGUmJih0aGlzLmIoImZvY3VzIil8fHRoaXMuYigiZ2lnYSIpKSl7dmFyIGU9Il8iK2EuaG9tYWRJbXByZXNzaW9uQWRJZDt0aGlzLkl8fCh0aGlzLkk9e2hvbWFkSW1wcmVzc2lvbkFkSWRzOnt9fSk7dGhpcy5JLmhvbWFkSW1wcmVzc2lvbkFkSWRzW2VdP3RoaXMuSS5ob21hZEltcHJlc3Npb25BZElkc1tlXSsrOnRoaXMuSS5ob21hZEltcHJlc3Npb25BZElkc1tlXT0xO3RoaXMudHJhY2soInN0YXRzX3RtcF9hZHN0YXJ0IiwKdGhpcy5JLmhvbWFkSW1wcmVzc2lvbkFkSWRzW2VdLCEwKX10aGlzLmhhKGQsYyxhKTtnJiZnLnBsYXllciYmZy5wbGF5ZXIuJGQmJmcucGxheWVyLiRkKGEubmFtZSxhKX07ei5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGMsZCxlLGYsaCl7dmFyIG09YTtkJiZjJiYoYz12LmEoYyxkKSk7YyYmKG09di5hKGEsYykpO2UmJihtPXYuYShtLGUpKTtmJiYobT12LmEobSxmKSk7aCYmKG09di5hKG0saCkpO3RoaXMuUChtKX07ei5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7dmFyIGM9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2t8fGEuY29ycm9ib3JhdGVfdHJhY2spYz1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXt2YyYmKGMuc2Vzc2lvbl9pZD12Yyk7Yy5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmCihjLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yy5ldmVudD1hLmNvZGU7Yy5zaXRlX2hyZWY9dGhpcy5uYigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmMucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpjLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmMucG9zaXRpb249MzticmVhaztkZWZhdWx0OmMucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYy52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKTthLmR1cmF0aW9uJiYoYy5hZF9kdXJhdGlvbj1hLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGN9O3oucHJvdG90eXBlLlpiPWZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5EKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lYShhKX07CnoucHJvdG90eXBlLmVhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUmIoYSk7aWYoYylpZihnLkgmJmcuSC5iKXtpZihnLkguYSl7aWYoIm9iamVjdCI9PXR5cGVvZiBjKXRyeXtjPUpTT04uc3RyaW5naWZ5KGMpfWNhdGNoKGQpe2M9Yy50b1N0cmluZz9jLnRvU3RyaW5nKCk6IiJ9YyYmYy50cmltJiYoYz1jLnRyaW0oKSk7YT1nLkgucygpO2hiKGcuSC5jKGEsITApLCJ0cmFja2luZyIpO2E9Zy5ILmMoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWM7Zy5ILmwoYSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9KX19ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoYyl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUudHJhY2s9ZnVuY3Rpb24oYSxjLGQpe2lmKGQ9dm9pZCAwPT09ZD8hMTpkKWlmKGcuSCYmZy5ILmIpe2lmKGcuSC5hKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtjJiZjLnRyaW0mJihjPQpjLnRyaW0oKSk7dmFyIGU9Zy5ILnMoKTtoYihnLkguYyhlLCEwKSwidHJhY2tpbmciKTtlPWcuSC5jKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYysiIikrIioiO2cuSC5sKGUsZnVuY3Rpb24oZil7dmFyIGg9ITE7Zj1mLnJlc3BvbnNlVGV4dDt0cnl7Zj1KU09OLnBhcnNlKGYpLGY9Zi5kYXRhLGZbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGg9ITApLGZbMV0mJmZbMV0hPWVuY29kZVVSSUNvbXBvbmVudChjKyIiKSYmKGg9ITEpfWNhdGNoKG0pe31ofHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZlswXT9mWzBdOiIiKSsoZlsxXT9mWzFdOiIiKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9KX19ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYyxkKX0uYmluZCh0aGlzKSw1MDApfTt6LnByb3RvdHlwZS5ZPWZ1bmN0aW9uKGEpe2lmKCFnfHwhZy5ILmIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlkoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGcuSC5hKXt2YXIgYz1hLmpvaW4oIiwiKSxkPWcuSC5zKCk7ZD1nLkguYyhkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YztnLkgubChkLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30pfX07ei5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXtnLkgmJmcuSC5iP2cuSC5hJiZnLkguS2IoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSw1MDApfTt6LnByb3RvdHlwZS5wYj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn07ei5wcm90b3R5cGUuQWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vYihhKToiIn07ei5wcm90b3R5cGUub2I9CmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGIoYSk7YyYmKGM9Yy50cmltKCkpOyFjJiZhLnRleHRDb250ZW50JiYoYz1hLnRleHRDb250ZW50LGM9Yy50cmltKCkpO3JldHVybiBjfTt6LnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEsYyxkLGUpe2Q9dm9pZCAwPT09ZD8hMTpkO2U9dm9pZCAwPT09ZT97fTplO2lmKHRoaXMuQShhKXx8dGhpcy5LYihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7aWYod2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmZkJiZ3aW5kb3cuc2FuZGJveC5mZFsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0pe3ZhciBmPXdpbmRvdy5zYW5kYm94OzA8PWYuZmRbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fGYuZmRbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIil9aWYodGhpcy50YShhKSlyZXR1cm4gdGhpcy50YShhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9OwpmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2UmJmUucG9zdCYmKGZbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGYuaG9tYWRfdnBhaWRfc2NyaXB0aW5qZWN0PUpTT04uc3RyaW5naWZ5KHtoZWFkOiJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIn0pLGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZSYmZS5vbmx5VVJMJiYoZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGg9ITE7ZD0hMTtkPXRoaXMuYyhhKTtkPXRoaXMuVihhLGMudGEoZC5ob3N0KSxmLGZ1bmN0aW9uKG0pe2g9bS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSwKYywhMCk7dHJ5e2h8fChoPWQpLGg9SlNPTi5wYXJzZShoLnRvU3RyaW5nKCkpfWNhdGNoKG0pe2g9ITF9aC51cmwmJmguaGFzaCYmKGg9Yy5mYSgpLnJlcGxhY2UoIltoYXNoXSIsaC5oYXNoKSk7dGhpcy54YihoLGEpO3JldHVybiBofTt6LnByb3RvdHlwZS5WPWZ1bmN0aW9uKGEsYyxkLGUsZixoLG0sRCl7bT12b2lkIDA9PT1tPyExOm07RD12b2lkIDA9PT1EPyExOkQ7dmFyIEw9aHx8Zy5IO2g9ITA7RCYmKGg9ITEpO2lmKEwmJkwuYilpZihMLmEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChOKXtmKE4pfWlmKCJzdHJpbmciIT10eXBlb2YgYSlmKCk7ZWxzZXtoYihMLmMoYSxoKSwibG9hZFJlc291cmNlVGhyb3VnaEhvbWFkIik7aD1MLmMoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1jO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgTyBpbiBkKWguZGF0YVtPXT1kW09dO3JldHVybiBMLmwoaCxlLGYsITEsCiExLG0pfX1lbHNlIGYoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WKGEsYyxkLGUsZixMLG0sRCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUubGE9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe3ZhciBtPSEwO209dm9pZCAwPT09bT8hMTptO3ZhciBEPSEwOyh2b2lkIDA9PT1oPzA6aCkmJihEPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgTCBpbiBoKWQrPSImIitMKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFtMXSk7ZD1kLnN1YnN0cigxKX12YXIgTz1uZXcgWE1MSHR0cFJlcXVlc3Q7Ty5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZXx8NCE9Ty5yZWFkeVN0YXRlfHwyMDAhPU8uc3RhdHVzJiYyMDEhPU8uc3RhdHVzfHxlKE8pO2YmJjQ9PU8ucmVhZHlTdGF0ZSYmMjAwIT1PLnN0YXR1cyYmMjAxIT1PLnN0YXR1cyYmZihPKX07dHJ5e08ub3BlbihjLGEsRCksTy53aXRoQ3JlZGVudGlhbHM9bSwwPGQubGVuZ3RoJiYKTy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxPLnNlbmQoZCl9Y2F0Y2goTil7ZiYmZigpfX07ei5wcm90b3R5cGUuSmI9ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMTtpZihjKWZvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWlmKGNbZV09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9O3oucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX07dmFyIGw9bmV3IHo7Zy5qPWw7Zy5qLk9iKCk7dmFyIERhPWw7di5wcm90b3R5cGUuZ2V0RXJyb3JDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9O3YucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfTt2LmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD17fSxlO2ZvcihlIGluIGMpZFtlXT1jW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTt2Llc9e2NvZGU6IjEwMDAiLAp0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTt2Lmk9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuZ2E9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07di5PPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuaWE9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5CPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTt2Lmw9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTt2LkY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O3YuRD17Y29kZToiMTAwOCIsCnR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTt2LmY9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O3YubT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTt2LmRhPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5VPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LlA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LmhhPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Lk49e2NvZGU6IjEwMTUiLAp0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O3YuSz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O3YuZz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTt2LmI9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTt2LmM9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTt2LnU9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTt2LnM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTt2LkE9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkUGF1c2UifTt2Lkc9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTt2Lm89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTt2LmVhPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O3YuVj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTt2LlhhPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTt2LiRhPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07di5JPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07di5mYT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CnYuYmE9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Llo9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2Llk9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07di5hYT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07KGZ1bmN0aW9uKGEsYyl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP2MoZXhwb3J0cyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5wZj9kZWZpbmUoWyJleHBvcnRzIl0sYyk6YyhhLmpmPXt9KX0pKHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhwKXsic3RyaW5nIiE9PQp0eXBlb2YgcCYmKHA9U3RyaW5nKHApKTtpZigvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChwKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZSIpO3JldHVybiBwLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZChwKXsic3RyaW5nIiE9PXR5cGVvZiBwJiYocD1TdHJpbmcocCkpO3JldHVybiBwfWZ1bmN0aW9uIGUocCl7dmFyIEI9e25leHQ6ZnVuY3Rpb24oKXt2YXIgSj1wLnNoaWZ0KCk7cmV0dXJue2RvbmU6dm9pZCAwPT09Six2YWx1ZTpKfX19O1ouQ2QmJihVYSgpLHViKCksQltTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIEJ9KTtyZXR1cm4gQn1mdW5jdGlvbiBmKHApe3RoaXMubWFwPXt9O3AgaW5zdGFuY2VvZiBmP3AuZm9yRWFjaChmdW5jdGlvbihCLEope3RoaXMuYXBwZW5kKEosQil9LHRoaXMpOkFycmF5LmlzQXJyYXkocCk/cC5mb3JFYWNoKGZ1bmN0aW9uKEIpe3RoaXMuYXBwZW5kKEJbMF0sCkJbMV0pfSx0aGlzKTpwJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3RoaXMuYXBwZW5kKEIscFtCXSl9LHRoaXMpfWZ1bmN0aW9uIGgocCl7aWYocC5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO3AuYm9keVVzZWQ9ITB9ZnVuY3Rpb24gbShwKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oQixKKXtwLm9ubG9hZD1mdW5jdGlvbigpe0IocC5yZXN1bHQpfTtwLm9uZXJyb3I9ZnVuY3Rpb24oKXtKKHAuZXJyb3IpfX0pfWZ1bmN0aW9uIEQocCl7dmFyIEI9bmV3IEZpbGVSZWFkZXIsSj1tKEIpO0IucmVhZEFzQXJyYXlCdWZmZXIocCk7cmV0dXJuIEp9ZnVuY3Rpb24gTChwKXtwPW5ldyBVaW50OEFycmF5KHApO2Zvcih2YXIgQj1BcnJheShwLmxlbmd0aCksSj0wO0o8cC5sZW5ndGg7SisrKUJbSl09U3RyaW5nLmZyb21DaGFyQ29kZShwW0pdKTtyZXR1cm4gQi5qb2luKCIiKX0KZnVuY3Rpb24gTyhwKXtpZihwLnNsaWNlKXJldHVybiBwLnNsaWNlKDApO3ZhciBCPW5ldyBVaW50OEFycmF5KHAuYnl0ZUxlbmd0aCk7Qi5zZXQobmV3IFVpbnQ4QXJyYXkocCkpO3JldHVybiBCLmJ1ZmZlcn1mdW5jdGlvbiBOKCl7dGhpcy5ib2R5VXNlZD0hMTt0aGlzLnJkPWZ1bmN0aW9uKHApeyh0aGlzLiRiPXApPyJzdHJpbmciPT09dHlwZW9mIHA/dGhpcy5hYz1wOlouYmxvYiYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihwKT90aGlzLnJiPXA6Wi5mb3JtRGF0YSYmRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5xZD1wOlouc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5hYz1wLnRvU3RyaW5nKCk6Wi5hcnJheUJ1ZmZlciYmWi5ibG9iJiZwJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihwKT8odGhpcy5iYj1PKHAuYnVmZmVyKSx0aGlzLiRiPW5ldyBCbG9iKFt0aGlzLmJiXSkpOgpaLmFycmF5QnVmZmVyJiYoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCl8fGliKHApKT90aGlzLmJiPU8ocCk6dGhpcy5hYz1wPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwKTp0aGlzLmFjPSIiO3RoaXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpfHwoInN0cmluZyI9PT10eXBlb2YgcD90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgiKTp0aGlzLnJiJiZ0aGlzLnJiLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLnJiLnR5cGUpOlouc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCkmJnRoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IikpfTtaLmJsb2ImJih0aGlzLmJsb2I9ZnVuY3Rpb24oKXt2YXIgcD1oKHRoaXMpOwppZihwKXJldHVybiBwO2lmKHRoaXMucmIpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnJiKTtpZih0aGlzLmJiKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuYmJdKSk7aWYodGhpcy5xZCl0aHJvdyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5hY10pKX0sdGhpcy5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiP2godGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLmJiKTp0aGlzLmJsb2IoKS50aGVuKEQpfSk7dGhpcy50ZXh0PWZ1bmN0aW9uKCl7dmFyIHA9aCh0aGlzKTtpZihwKXJldHVybiBwO2lmKHRoaXMucmIpe3A9dGhpcy5yYjt2YXIgQj1uZXcgRmlsZVJlYWRlcixKPW0oQik7Qi5yZWFkQXNUZXh0KHApO3JldHVybiBKfWlmKHRoaXMuYmIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShMKHRoaXMuYmIpKTtpZih0aGlzLnFkKXRocm93IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQiKTsKcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmFjKX07Wi5mb3JtRGF0YSYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihrYSl9KTt0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX07cmV0dXJuIHRoaXN9ZnVuY3Rpb24gbWEocCxCKXtCPUJ8fHt9O3ZhciBKPUIuYm9keTtpZihwIGluc3RhbmNlb2YgbWEpe2lmKHAuYm9keVVzZWQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIik7dGhpcy51cmw9cC51cmw7dGhpcy5jcmVkZW50aWFscz1wLmNyZWRlbnRpYWxzO0IuaGVhZGVyc3x8KHRoaXMuaGVhZGVycz1uZXcgZihwLmhlYWRlcnMpKTt0aGlzLm1ldGhvZD1wLm1ldGhvZDt0aGlzLm1vZGU9cC5tb2RlO3RoaXMuc2lnbmFsPXAuc2lnbmFsO0p8fG51bGw9PXAuJGJ8fChKPXAuJGIscC5ib2R5VXNlZD0hMCl9ZWxzZSB0aGlzLnVybD1TdHJpbmcocCk7dGhpcy5jcmVkZW50aWFscz0KQi5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8InNhbWUtb3JpZ2luIjtpZihCLmhlYWRlcnN8fCF0aGlzLmhlYWRlcnMpdGhpcy5oZWFkZXJzPW5ldyBmKEIuaGVhZGVycyk7cD1CLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiO3ZhciBwYT1wLnRvVXBwZXJDYXNlKCk7dGhpcy5tZXRob2Q9LTE8c2IuaW5kZXhPZihwYSk/cGE6cDt0aGlzLm1vZGU9Qi5tb2RlfHx0aGlzLm1vZGV8fG51bGw7dGhpcy5zaWduYWw9Qi5zaWduYWx8fHRoaXMuc2lnbmFsO3RoaXMucmVmZXJyZXI9bnVsbDtpZigoIkdFVCI9PT10aGlzLm1ldGhvZHx8IkhFQUQiPT09dGhpcy5tZXRob2QpJiZKKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5yZChKKX1mdW5jdGlvbiBrYShwKXt2YXIgQj1uZXcgRm9ybURhdGE7cC50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKEope2lmKEope3ZhciBwYT1KLnNwbGl0KCI9Iik7Cko9cGEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIik7cGE9cGEuam9pbigiPSIpLnJlcGxhY2UoL1wrL2csIiAiKTtCLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQoSiksZGVjb2RlVVJJQ29tcG9uZW50KHBhKSl9fSk7cmV0dXJuIEJ9ZnVuY3Rpb24gbmEocCl7dmFyIEI9bmV3IGY7cC5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIikuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihKKXtKPUouc3BsaXQoIjoiKTt2YXIgcGE9Si5zaGlmdCgpLnRyaW0oKTtwYSYmQi5hcHBlbmQocGEsSi5qb2luKCI6IikudHJpbSgpKX0pO3JldHVybiBCfWZ1bmN0aW9uIFkocCxCKXtCfHwoQj17fSk7dGhpcy50eXBlPSJkZWZhdWx0Ijt0aGlzLnN0YXR1cz12b2lkIDA9PT1CLnN0YXR1cz8yMDA6Qi5zdGF0dXM7dGhpcy5vaz0yMDA8PXRoaXMuc3RhdHVzJiYzMDA+dGhpcy5zdGF0dXM7dGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIEI/Qi5zdGF0dXNUZXh0OiJPSyI7dGhpcy5oZWFkZXJzPQpuZXcgZihCLmhlYWRlcnMpO3RoaXMudXJsPUIudXJsfHwiIjt0aGlzLnJkKHApfWZ1bmN0aW9uIHhhKHAsQil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKEoscGEpe2Z1bmN0aW9uIHdjKCl7YWEuYWJvcnQoKX12YXIgRWE9bmV3IG1hKHAsQik7aWYoRWEuc2lnbmFsJiZFYS5zaWduYWwuYWJvcnRlZClyZXR1cm4gcGEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgYWE9bmV3IFhNTEh0dHBSZXF1ZXN0O2FhLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBEYj17c3RhdHVzOmFhLnN0YXR1cyxzdGF0dXNUZXh0OmFhLnN0YXR1c1RleHQsaGVhZGVyczpuYShhYS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKXx8IiIpfTtEYi51cmw9InJlc3BvbnNlVVJMImluIGFhP2FhLnJlc3BvbnNlVVJMOkRiLmhlYWRlcnMuZ2V0KCJYLVJlcXVlc3QtVVJMIik7SihuZXcgWSgicmVzcG9uc2UiaW4gYWE/YWEucmVzcG9uc2U6YWEucmVzcG9uc2VUZXh0LERiKSl9O2FhLm9uZXJyb3I9CmZ1bmN0aW9uKCl7cGEobmV3IFR5cGVFcnJvcigiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIpKX07YWEub250aW1lb3V0PWZ1bmN0aW9uKCl7cGEobmV3IFR5cGVFcnJvcigiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIpKX07YWEub25hYm9ydD1mdW5jdGlvbigpe3BhKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9O2FhLm9wZW4oRWEubWV0aG9kLEVhLnVybCwhMCk7ImluY2x1ZGUiPT09RWEuY3JlZGVudGlhbHM/YWEud2l0aENyZWRlbnRpYWxzPSEwOiJvbWl0Ij09PUVhLmNyZWRlbnRpYWxzJiYoYWEud2l0aENyZWRlbnRpYWxzPSExKTsicmVzcG9uc2VUeXBlImluIGFhJiZaLmJsb2ImJihhYS5yZXNwb25zZVR5cGU9ImJsb2IiKTtFYS5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oRGIsS2Mpe2FhLnNldFJlcXVlc3RIZWFkZXIoS2MsRGIpfSk7RWEuc2lnbmFsJiYoRWEuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0Iix3YyksYWEub25yZWFkeXN0YXRlY2hhbmdlPQpmdW5jdGlvbigpezQ9PT1hYS5yZWFkeVN0YXRlJiZFYS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHdjKX0pO2FhLnNlbmQoInVuZGVmaW5lZCI9PT10eXBlb2YgRWEuJGI/bnVsbDpFYS4kYil9KX1VYSgpO3ZhciBaPXtzZWFyY2hQYXJhbXM6IlVSTFNlYXJjaFBhcmFtcyJpbiBzZWxmLENkOiJTeW1ib2wiaW4gc2VsZiYmIml0ZXJhdG9yImluIFN5bWJvbCxibG9iOiJGaWxlUmVhZGVyImluIHNlbGYmJiJCbG9iImluIHNlbGYmJiEwLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzZWxmLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzZWxmfTtpZihaLmFycmF5QnVmZmVyKXZhciByYj0iW29iamVjdCBJbnQ4QXJyYXldO1tvYmplY3QgVWludDhBcnJheV07W29iamVjdCBVaW50OENsYW1wZWRBcnJheV07W29iamVjdCBJbnQxNkFycmF5XTtbb2JqZWN0IFVpbnQxNkFycmF5XTtbb2JqZWN0IEludDMyQXJyYXldO1tvYmplY3QgVWludDMyQXJyYXldO1tvYmplY3QgRmxvYXQzMkFycmF5XTtbb2JqZWN0IEZsb2F0NjRBcnJheV0iLnNwbGl0KCI7IiksCmliPUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24ocCl7cmV0dXJuIHAmJi0xPHJiLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHApKX07Zi5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHAsQil7cD1jKHApO0I9ZChCKTt2YXIgSj10aGlzLm1hcFtwXTt0aGlzLm1hcFtwXT1KP0orIiwgIitCOkJ9O2YucHJvdG90eXBlWyJkZWxldGUiXT1mdW5jdGlvbihwKXtkZWxldGUgdGhpcy5tYXBbYyhwKV19O2YucHJvdG90eXBlLmdldD1mdW5jdGlvbihwKXtwPWMocCk7cmV0dXJuIHRoaXMuaGFzKHApP3RoaXMubWFwW3BdOm51bGx9O2YucHJvdG90eXBlLmhhcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkoYyhwKSl9O2YucHJvdG90eXBlLnNldD1mdW5jdGlvbihwLEIpe3RoaXMubWFwW2MocCldPWQoQil9O2YucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24ocCxCKXtmb3IodmFyIEogaW4gdGhpcy5tYXApdGhpcy5tYXAuaGFzT3duUHJvcGVydHkoSikmJgpwLmNhbGwoQix0aGlzLm1hcFtKXSxKLHRoaXMpfTtmLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIHA9W107dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKEIsSil7cC5wdXNoKEopfSk7cmV0dXJuIGUocCl9O2YucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCKXtwLnB1c2goQil9KTtyZXR1cm4gZShwKX07Zi5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCLEope3AucHVzaChbSixCXSl9KTtyZXR1cm4gZShwKX07Wi5DZCYmKFVhKCksdWIoKSxmLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWYucHJvdG90eXBlLmVudHJpZXMpO3ZhciBzYj0iREVMRVRFIEdFVCBIRUFEIE9QVElPTlMgUE9TVCBQVVQiLnNwbGl0KCIgIik7Ti5jYWxsKG1hLnByb3RvdHlwZSk7Ti5jYWxsKFkucHJvdG90eXBlKTtZLmVycm9yPWZ1bmN0aW9uKCl7dmFyIHA9bmV3IFkobnVsbCwKe3N0YXR1czowLHN0YXR1c1RleHQ6IiJ9KTtwLnR5cGU9ImVycm9yIjtyZXR1cm4gcH07dmFyIGpjPVszMDEsMzAyLDMwMywzMDcsMzA4XTtZLnJlZGlyZWN0PWZ1bmN0aW9uKHAsQil7aWYoLTE9PT1qYy5pbmRleE9mKEIpKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHN0YXR1cyBjb2RlIik7cmV0dXJuIG5ldyBZKG51bGwse3N0YXR1czpCLGhlYWRlcnM6e2xvY2F0aW9uOnB9fSl9O2EuRE9NRXhjZXB0aW9uPXNlbGYuRE9NRXhjZXB0aW9uO3RyeXtuZXcgYS5ET01FeGNlcHRpb259Y2F0Y2gocCl7YS5ET01FeGNlcHRpb249ZnVuY3Rpb24oQixKKXt0aGlzLm1lc3NhZ2U9Qjt0aGlzLm5hbWU9Sjt0aGlzLnN0YWNrPUVycm9yKEIpLnN0YWNrfSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGEuRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLkRPTUV4Y2VwdGlvbn14YS5hPSEwO3NlbGYuZmV0Y2h8fChzZWxmLmZldGNoPQp4YSxzZWxmLkhlYWRlcnM9ZixzZWxmLlJlcXVlc3Q9bWEsc2VsZi5SZXNwb25zZT1ZKTthLkhlYWRlcnM9ZjthLlJlcXVlc3Q9bWE7YS5SZXNwb25zZT1ZO2EuZmV0Y2g9eGE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7ZGEuYT1mdW5jdGlvbihhLGMpe2M9dm9pZCAwPT09Yz8hMDpjO3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGM/W2QsYVtkXV0ubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbigiPSIpOltkLGFbZF1dLmpvaW4oIj0iKX0pLmpvaW4oIiYiKX07ZGEuYj1mdW5jdGlvbihhKXtbe3BhdHRlcm46L1xbKHJhbmRvbXxybmR8Y2FjaGVidXN0ZXJ8Y29ycmVsYXRvcilcXS9nLHZhbHVlOmcuai5zKDEwKX0se3BhdHRlcm46L1xbKHJlZmVycmVyX3VybClcXS9nLHZhbHVlOmRvY3VtZW50LnJlZmVycmVyfSx7cGF0dGVybjovXFsoZGVzY3JpcHRpb25fdXJsfHVybClcXS9nLHZhbHVlOmRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9LAp7cGF0dGVybjovXFsodGltZXx0aW1lc3RhbXApXF0vZyx2YWx1ZToobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpfV0uZm9yRWFjaChmdW5jdGlvbihjKXthPWEucmVwbGFjZShjLnBhdHRlcm4sYy52YWx1ZSl9KTtyZXR1cm4gYX07ZGEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt0aGlzLmEucXVlcnlLZXkuZ2Rwcl9jb25zZW50PSJbZ2Rwcl9jb25zZW50XSI7dGhpcy5hLnF1ZXJ5PWRhLmEodGhpcy5hLnF1ZXJ5S2V5LCExKTt0aGlzLmMoKX07ZGEucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSxjKXt0aGlzLmEucXVlcnlLZXlbYV09Yzt0aGlzLmEucXVlcnk9ZGEuYSh0aGlzLmEucXVlcnlLZXksITEpO3RoaXMuYygpfTtkYS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5S2V5W2FdfTtkYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5S2V5Lmhhc093blByb3BlcnR5KGEpfTtkYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMucGFyc2UodGhpcy50b1N0cmluZygpKX07CmRhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblt0aGlzLmEucHJvdG9jb2wubGVuZ3RoP3RoaXMuYS5wcm90b2NvbCsiOi8vIjoiIix0aGlzLmEudWQsdGhpcy5hLnBhdGgsdGhpcy5hLnF1ZXJ5Lmxlbmd0aD8iPyIrdGhpcy5hLnF1ZXJ5OiIiLHRoaXMuYS5hbmNob3IubGVuZ3RoPyIjIit0aGlzLmEuYW5jaG9yOiIiXS5qb2luKCIiKX07ZGEucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7YT1kYS5iKGEpO3RoaXMuZj10aGlzLnYuY2RbdGhpcy52LkplPyJzdHJpY3QiOiJsb29zZSJdLmV4ZWMoYSk7YT0xNDtmb3IodmFyIGQ9e307YS0tOylkW3RoaXMudi5rZXlbYV1dPXRoaXMuZlthXXx8IiI7ZFt0aGlzLnYucS5uYW1lXT17fTtkW3RoaXMudi5rZXlbMTJdXS5yZXBsYWNlKHRoaXMudi5xLmNkLGZ1bmN0aW9uKGUsZixoKXtmJiYoZFtjLnYucS5uYW1lXVtmXT1oKX0pO3JldHVybiBkfTtRYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYS5wcm90b3R5cGUsCnt2Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57SmU6ITEsa2V5OiJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJpbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpLHE6e25hbWU6InF1ZXJ5S2V5IixjZDovKD86XnwmKShbXiY9XSopPT8oW14mXSopL2d9LGNkOntzdHJpY3Q6L14oPzooW146XC8/I10rKTopPyg/OlwvXC8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKT8oKCgoPzpbXj8jXC9dKlwvKSopKFtePyNdKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8sbG9vc2U6L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS99fX19LApwcm90b2NvbDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wcm90b2NvbH19LHVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnVkfX0saG9zdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5ob3N0fX0scGF0aDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wYXRofX0scXVlcnk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucXVlcnl9fSxhbmNob3I6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYW5jaG9yfX19KTt2YS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5OLmhhcyhhKT8oYyh0aGlzLk4uZ2V0KGEpKSwKITApOiExfTt2YS5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxjLGQpe2Q9dm9pZCAwPT09ZD8hMTpkO3RoaXMuRi5oYXMoYSl8fHRoaXMuRi5zZXQoYSxbXSk7dGhpcy5GLmdldChhKS5wdXNoKGMpO2QmJnRoaXMuYWEoYSxjKX07dmEucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oYSxjLGQpe2Q9dm9pZCAwPT09ZD8hMTpkO3RoaXMuby5oYXMoYSl8fHRoaXMuby5zZXQoYSxbXSk7ZCYmdGhpcy5hYShhLGMpfHx0aGlzLm8uZ2V0KGEpLnB1c2goYyl9O3ZhLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEpe3ZhciBjPXZvaWQgMD09PWM/ITA6YztpZighMD09PWMpdGhpcy5GLmRlbGV0ZShhKSx0aGlzLm8uZGVsZXRlKGEpO2Vsc2V7dmFyIGQ9ZnVuY3Rpb24oZSl7dmFyIGY9ZS5nZXQoYSk7ZiYmZS5zZXQoYSxmLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4gaCE9PWN9KSl9O2QodGhpcy5GKTtkKHRoaXMubyl9fTt2YS5wcm90b3R5cGUuTD1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoaCxtLEQpe2Zvcih2YXIgTD0KW10sTz0yO088YXJndW1lbnRzLmxlbmd0aDsrK08pTFtPLTJdPWFyZ3VtZW50c1tPXTsoTz1oLmdldChtKSkmJk8ubGVuZ3RoJiZPLmZvckVhY2goZnVuY3Rpb24oTil7Ti5hcHBseShudWxsLEZiKEwpKX0pfWZvcih2YXIgZT1bXSxmPTE7Zjxhcmd1bWVudHMubGVuZ3RoOysrZillW2YtMV09YXJndW1lbnRzW2ZdO3RoaXMuTi5zZXQuYXBwbHkodGhpcy5OLFthXS5jb25jYXQoRmIoZSkpKTtkLmFwcGx5KG51bGwsW3RoaXMubyxhXS5jb25jYXQoRmIoZSkpKTtkLmFwcGx5KG51bGwsW3RoaXMuRixhXS5jb25jYXQoRmIoZSkpKTt0aGlzLm8uZGVsZXRlKGEpfTtDYS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYz0wLGQ7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9MDtmb3IoZD1hLmxlbmd0aDtlPGQ7ZSsrKXt2YXIgZj1hLmNoYXJDb2RlQXQoZSk7Yz0oYzw8NSktYytmO2N8PTB9cmV0dXJuIE1hdGguYWJzKGMpfTtDYS5wcm90b3R5cGUueWE9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLwoxRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5hfHwieCIpfTtDYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfTtDYS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXthPXBhcnNlSW50KGEsMTApO3JldHVybiA2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWE/U3RyaW5nLmZyb21DaGFyQ29kZShhKTowPj0KYT8iIjo2NT5hP3RoaXMuYihhKzY1KTo5MDxhP3RoaXMuYihNYXRoLnJvdW5kKGEvMikpOmEudG9TdHJpbmcoKX07Q2EucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLTEsZD0iIjswPD1jO2QrPWFbYy0tXSk7cmV0dXJuIGR9O0NhLnByb3RvdHlwZS5hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nKHRoaXMueWEoKSk7YT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyk7Zm9yKHZhciBjPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyljKz10aGlzLmIoYVtkXSk7MD09Yy5sZW5ndGgmJihjPSJ6b3JrIik7cmV0dXJuIGN9O0NhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYSgpKyIyIn07Q2EucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmcodGhpcy5pKCkpO2E9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpO2Zvcih2YXIgYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYys9CnRoaXMuYihhW2RdKTswPT1jLmxlbmd0aCYmKGM9InpvcmsiKTtyZXR1cm4gY307b2IucHJvdG90eXBlLm09ZnVuY3Rpb24oKXtmb3IodmFyIGE9d2luZG93OyF0aGlzLmI7KXt0cnl7aWYoYS5mcmFtZXMuX190Y2ZhcGlMb2NhdG9yfHxhLmZyYW1lcy5fX2NtcExvY2F0b3IpdGhpcy5iPWF9Y2F0Y2goYyl7fWlmKGE9PT13aW5kb3cudG9wKWJyZWFrO2lmKGE9PT1hLnBhcmVudClicmVhazthPWEucGFyZW50fXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmMuYmluZCh0aGlzKSl9O29iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEsYyxkLGUpe2lmKHRoaXMuYil7dmFyIGY9TWF0aC5yYW5kb20oKSsiIjthPXtfX3RjZmFwaUNhbGw6e2NvbW1hbmQ6YSxwYXJhbWV0ZXI6ZSx2ZXJzaW9uOmMsY2FsbElkOmZ9fTt0aGlzLmFbZl09ZDt0aGlzLmIucG9zdE1lc3NhZ2UoYSwiKiIpfWVsc2UgZCh7bXNnOiJDTVAgbm90IGZvdW5kIn0sITEpfTtvYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz0Ke307aWYoInN0cmluZyI9PT10eXBlb2YgYS5kYXRhKXRyeXtjPUpTT04ucGFyc2UoYS5kYXRhKX1jYXRjaChkKXt9ZWxzZSBjPWEuZGF0YTtjJiZjLl9fdGNmYXBpUmV0dXJuJiYoYT1jLl9fdGNmYXBpUmV0dXJuKSYmYS5jYWxsSWQmJnRoaXMuYSYmdGhpcy5hW2EuY2FsbElkXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYVthLmNhbGxJZF0mJih0aGlzLmFbYS5jYWxsSWRdKGEucmV0dXJuVmFsdWUsYS5zdWNjZXNzKSxkZWxldGUgdGhpcy5hW2EuY2FsbElkXSl9O29iLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjO0ZjKGZ1bmN0aW9uKGQpe2M9YS5mLmJpbmQoYSk7IWEuYiYmd2luZG93Ll9fdGNmYXBpJiYoYz13aW5kb3cuX190Y2ZhcGkpO3JldHVybiBkLnJldHVybihuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtjKCJnZXRUQ0RhdGEiLDIsZnVuY3Rpb24oZixoKXtoPyh0aGlzLmk9Zix0aGlzLmRjPWYudGNTdHJpbmcsdGhpcy5WYz10aGlzLmkuZ2RwckFwcGxpZXMsCmUodGhpcy5kYykpOmUoITEpfS5iaW5kKGEpKX0pKX0pfTtvYi5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMubSgpO3RoaXMubCgpfTtnLlVhPW5ldyBvYjtnLlVhLmcoKTt1LnByb3RvdHlwZS5OYj1mdW5jdGlvbihhKXt0aGlzLmc9YX07dS5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmcubWluVmlzO3RoaXMuZ1t0aGlzLmJhXSYmdGhpcy5nW3RoaXMuYmFdLm1pblZpcyYmKGE9dGhpcy5nW3RoaXMuYmFdLm1pblZpcyk7cmV0dXJuIGF9O3UucHJvdG90eXBlLlNlPWZ1bmN0aW9uKCl7InByZXJvbGwiPT1nLmouVSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuTygpLCEwKTt0aGlzLk5lKCk7Zy5qLmEodi51LHRoaXMuYigpKX07dS5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXM7Zy5qLk4oKSYmKCh0aGlzLmM9Zy5qLkVkKXx8Zy5qLnRyYWNrKCJ2cnRjbHpyX25vaW50ZXJhY3Rpb24iLCIiLCEwKSk7InZlcnRpY2FsaXpyIj09PQphJiYodGhpcy5jPSEwKTtnLmouZmE9bnVsbDtpZih0aGlzLmkuYil0aGlzLmdhKyssdGhpcy5pLkxiKCksZy5qLkliKCkmJnRoaXMuZ2IoKSYmdGhpcy5oYigpP3RoaXMuVGIoKTooZy5ILmdldENvbmZpZygpLHRoaXMuaS5KYSYmdGhpcy5pLmE/KGcuai5BYihhKSx0aGlzLmM/KHRoaXMuVT0hMCx0aGlzLmw9bmV3IFYsdGhpcy5mYSgpKToodGhpcy5TZSgpLHRoaXMubD1uZXcgVihhKSx0aGlzLmwub24oImNvbXBsZXRlIixmdW5jdGlvbihoKXtoLndjP2UuZmEoKTplLkYoKX0sITApLHRoaXMubC5vbigiZXJyb3IiLGZ1bmN0aW9uKGgpe2Uuc2EoaCk7ZS5GKCl9LCEwKSkpOnRoaXMuRigpKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZWEoYSxjLGQpfSw1MCl9fTt1LnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3RoaXMuRmE9dGhpcy5pYT10aGlzLnBhPSExOyh0aGlzLkM9dGhpcy5sP3RoaXMubC5ZYygpOm51bGwpPygid2VsZWN0Ij09PXRoaXMuQiYmZy52LmIoImFkX2ZhbGxiYWNrIikmJgpnLmoudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsITAsITApLHRoaXMuT2IodGhpcy5DKSx0aGlzLkdiKHRoaXMuQyksdGhpcy5ZPXRoaXMuRmIodGhpcy5DKSx0aGlzLlpkKCkpOnRoaXMuYz90aGlzLk9iKHRoaXMuQyk6dGhpcy50YygpfTt1LnByb3RvdHlwZS5zYT1mdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sLmksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZmIoY1tkXSxjW2RdLmVycm9yKTt0aGlzLkMgaW5zdGFuY2VvZiBqYSYmKHRoaXMuQy5lcnJvcj1hJiZhIGluc3RhbmNlb2YgQz9hOm5ldyBDKEMuRiksdGhpcy5mYih0aGlzLkMsdGhpcy5DLmVycm9yKSl9O3UucHJvdG90eXBlLmZiPWZ1bmN0aW9uKGEsYyl7c3dpdGNoKGMudHlwZSl7Y2FzZSBDLmc6Yy5kZXRhaWxzPT1DLmEuU2Q/Zy5qLmEodi5nYSx0aGlzLmIoKSk6KGcuai5tYSgpLGMuZGV0YWlscz09Qy5hLlBkLmNvZGUmJmcuai5hKHYuVSx0aGlzLmIoKSkpO2cuai5hKHYuTyx0aGlzLmIoKSk7dGhpcy5PZSgpOwp0aGlzLm8oImVtcHR5Iik7IndlbGVjdCI9PT10aGlzLkImJmcudi5iKCJhZF9mYWxsYmFjayIpJiZnLmoudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsITEsITApO3RoaXMuaS5hYSYmZy5qLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuaS5hYSwhMCk7YnJlYWs7Y2FzZSBDLmI6Zy5qLmEodi5kYSx0aGlzLmIoKSk7dGhpcy5vKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2UgQy5BOmcuai5hKHYuaGEsdGhpcy5iKCkpO3RoaXMubygid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSBDLm86Zy5qLmEodi5pYSx0aGlzLmIoKSk7dGhpcy5vKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2UgQy5pOmcuai5hKHYuaSx0aGlzLmIoKSk7dGhpcy5vKCJub21lZGlhIik7YnJlYWs7Y2FzZSBDLm06Zy5qLmEodi5pLHRoaXMuYigpKTt0aGlzLm8oIm1lZGlhZXJyb3IiKTticmVhaztjYXNlIEMuZjpnLmouYSh2LmJhLHRoaXMuYigpKTt0aGlzLm8oImR1bW15YWQiKTticmVhazsKY2FzZSBDLmw6Zy5qLmEodi5aLHRoaXMuYigpKTt0aGlzLm8oImR1cmF0aW9uIik7YnJlYWs7Y2FzZSBDLmM6Zy5qLmEodi5pLHRoaXMuYigpKTtjJiZjLmRhdGEmJmMuZGF0YS5kZXRhaWxzJiZjLmRhdGEuZGV0YWlscy5jb2RlPT1DLmEubWQuY29kZT90aGlzLm8oIk9OTFlfTUVaWkFOSU5FIik6dGhpcy5vKCJOT19QTEFZQUJMRV9BRFMiKTticmVhaztkZWZhdWx0OnRoaXMubygidW5rbm93biIpfWEmJmEuamEmJnRoaXMudWUoYSxhLmVycm9yLnR5cGUuY29kZSl9O3UucHJvdG90eXBlLnVlPWZ1bmN0aW9uKGEsYyl7YT1hLmphLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iZXJyb3IiPT09ZS5pZH0pO2lmKDkwMTxjfHwxPmMpYz05MDA7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5sZW5ndGg7KXRyeXt2YXIgZD1hLnBvcCgpO3RoaXMuZGEoZC51cmwsZC50eXBlLGMpfWNhdGNoKGUpe319O3UucHJvdG90eXBlLkdiPWZ1bmN0aW9uKGEpe2lmKGEpe2Eub3JpZ2luJiYoYT1hLm9yaWdpbik7CmlmKGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIHUpdHJ5e3RoaXMuaGE9dGhpcy55ZShhKX1jYXRjaChjKXt9dGhpcy5HYihhLnBhcmVudCl9fTt1LnByb3RvdHlwZS5GYj1mdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIHV8fChjPXRoaXMuRmIoYS5wYXJlbnQpKSxjLnB1c2godGhpcy52ZShhKSkpO3JldHVybiBjfTt1LnByb3RvdHlwZS52ZT1mdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuUWEmJmEuUWEuZ2V0QXR0cmlidXRlKXtjPWEuUWEuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5RYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLnB1c2goYVtlXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19O3UucHJvdG90eXBlLnllPQpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGU9IiI7aWYoYS5RYSl7dmFyIGY9YS5RYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO3ZhciBoPWEuUWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5RYS5nZXRBdHRyaWJ1dGUoImlkIikmJihlPWEuUWEuZ2V0QXR0cmlidXRlKCJpZCIpLGQucHVzaChlKSk7YS5RYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGU9YS5RYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxkLnB1c2goZSkpO2Zvcih2YXIgbT0wO208aC5sZW5ndGg7bSsrKWhbbV0uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZT1oW21dLmdldEF0dHJpYnV0ZSgiaWQiKSxkLnB1c2goZSkpLGhbbV0uZ2V0QXR0cmlidXRlKCJhZElEIikmJihlPWhbbV0uZ2V0QXR0cmlidXRlKCJhZElEIiksZC5wdXNoKGUpKTtmb3IobT0wO208Zi5sZW5ndGg7bSsrKWMucHVzaChhLkFkKGZbbV0pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczpkLGFkSWQ6ZX19O3UucHJvdG90eXBlLlJhPQpmdW5jdGlvbigpe3RoaXMuTj0hMX07dS5wcm90b3R5cGUuTGM9ZnVuY3Rpb24oKXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKTt0aGlzLm09dGhpcy5jb250cm9scz1udWxsO3RoaXMuVj0hMTt0aGlzLktiKHRoaXMuZGlzcGxheSk7dGhpcy5kaXNwbGF5LnJlbW92ZSgpfTt1LnByb3RvdHlwZS5PYj1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmEuWGMoKSxkPWcudi5iKCJjb250YWluZXIuc3R5bGUiKSxlPXBhcnNlSW50KGcudi5iKCJ6SW5kZXgiKXx8MUU0LDEwKTstLWU7ZCYmZy5qLnFhKGMsZCsiIik7Yy56SW5kZXg9ZTt0aGlzLnM9Yzt0aGlzLmRpc3BsYXk9bnVsbDt0aGlzLmRpc3BsYXk9dGhpcy5jZShhKTt0aGlzLmRpc3BsYXkuQmUoYSk7dGhpcy5kaXNwbGF5LmhkKHRoaXMuYSk7dGhpcy5kaXNwbGF5LkRlKHRoaXMuYWEoKSk7dGhpcy5kaXNwbGF5LkVlKGMpO3RoaXMuUWMmJnRoaXMucGxheWVyLldjKCkmJnRoaXMuZGlzcGxheS5GZSh0aGlzLnBsYXllci5XYygpLzEwMCk7CnRoaXMuUGModGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkuVCgpPyh0aGlzLktlKHRoaXMuTygpKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKT9hLnN0eWxlPWcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKSsiIjooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmMmJihhLnN0eWxlLnRvcD0iOHB4IixhLnN0eWxlLmxlZnQ9IjhweCIsYS5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiLGEuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSIsYS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCB3aGl0ZSIpKSx0aGlzLmY9dGhpcy5zLmFwcGVuZENoaWxkKGEpLHRoaXMuYyYmdGhpcy5kaXNwbGF5IGluc3RhbmNlb2YgUiYmdGhpcy5hLlVjKCEwKSx0aGlzLmRpc3BsYXkuc2IodGhpcy5mKSk6dGhpcy5LYih0aGlzLmRpc3BsYXkpfTsKdS5wcm90b3R5cGUuaGQ9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O3UucHJvdG90eXBlLmNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1udWxsLGU9bnVsbCxmPW51bGw7aWYoYSYmYS51KCkpe3RyeXsoZT10aGlzLmEuUy5nZXRSYXdQbGF5ZXIoKSkmJmUuZW52dmFycyYmKGY9ZS5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZT10aGlzLmEuUykmJmUudmMmJihmPWUudmMoKSk7aWYoZi52aWRlb1Nsb3QpcmV0dXJuIGQ9bmV3IE9hLGQucyhmLnZpZGVvU2xvdCksZDt0aHJvdyJ2aWRlb1RhZyI7fWNhdGNoKGgpe2Q9bmV3IE19Zy5wYz9kPW5ldyBvYTpkPW5ldyBNfWVsc2UgYSYmYS5mKCk/KHRoaXMuR2E9ITAsZD1uZXcgVyk6dGhpcy5jJiYoZy5CYz8oZD1nLkJjLGQuY29udGludWUoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMCkpOmQ9bmV3IFIsdGhpcy5DPW5ldyBqYShbXSxbXSxbXSxudWxsKSx0aGlzLkMuemM9NSx0aGlzLmEuZyhmdW5jdGlvbihoKXtjLmRpc3BsYXkucmVzaXplKGgpfSkpOwpyZXR1cm4gZH07dS5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpczthLm9uKGEuZXZlbnQuWGIsdGhpcy5FYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2MsdGhpcy5zZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRmMsdGhpcy5CYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuSmMsdGhpcy5sYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRGMsdGhpcy56Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuRWMsdGhpcy5BYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuR2MsdGhpcy5DYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuS2MsdGhpcy5uYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2QsdGhpcy5xZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQucGQsdGhpcy5vYi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQubGMsdGhpcy55Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuTmEsdGhpcy5lZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuT2EsdGhpcy5wZS5iaW5kKHRoaXMpKTsKYS5vbihhLmV2ZW50LkhjLHRoaXMubmEuYmluZCh0aGlzKSk7YS5vbihhLmV2ZW50Lm5kLHRoaXMub2EuYmluZCh0aGlzKSk7dGhpcy5jJiYoYS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7Yy5qYygpO2MuYS5VYyghMSk7Yy5mLnN0eWxlLnRvcD0iMCI7Yy5mLnN0eWxlLmxlZnQ9IjAiO2MuZi5zdHlsZS53aWR0aD0iMTAwJSI7Yy5mLnN0eWxlLmhlaWdodD0iMTAwJSI7Yy5mLnN0eWxlLmJvcmRlcj0ibm9uZSJ9KSxhLm9uKCJ1bmNsb3NlIixmdW5jdGlvbigpe2MuYS5VYyghMCk7Yy5mLnN0eWxlLnRvcD0iOHB4IjtjLmYuc3R5bGUubGVmdD0iOHB4IjtjLmYuc3R5bGUud2lkdGg9ImNhbGMoMTAwJSAtIDE2cHgpIjtjLmYuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSI7Yy5mLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkIHdoaXRlIn0pLGEub24oIlNIT1dDT05UUk9MUyIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSkpfTt1LnByb3RvdHlwZS5LYj1mdW5jdGlvbihhKXthLmcoYS5ldmVudC5YYik7CmEuZyhhLmV2ZW50Lm9jKTthLmcoYS5ldmVudC5GYyk7YS5nKGEuZXZlbnQuSmMpO2EuZyhhLmV2ZW50LkRjKTthLmcoYS5ldmVudC5FYyk7YS5nKGEuZXZlbnQuR2MpO2EuZyhhLmV2ZW50LktjKTthLmcoYS5ldmVudC5OYSk7YS5nKGEuZXZlbnQuT2EpfTt1LnByb3RvdHlwZS5FYj1mdW5jdGlvbigpe3RoaXMuT2MoKTt0aGlzLmEuTigpO3RoaXMuZGlzcGxheSBpbnN0YW5jZW9mIFd8fHRoaXMuS2QoKTt0aGlzLkxkKCk7dGhpcy5qYigpO3RoaXMuYS5EKCk7dGhpcy5BZSgpO3RoaXMuYyYmdGhpcy51KCl9O3UucHJvdG90eXBlLnNlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYS5TO2E9YS5jdXJyZW50VGltZTt0aGlzLlZiPSEwO2MuSGEmJmMuSGEoKSYmZy5qLmEodi5iLHRoaXMuYigpKTtjPU1hdGguZmxvb3IoYSk7dGhpcy5IZChjKTtpZighdGhpcy5pYSl7YT0yRTM7dmFyIGQ9NTAsZT1nLnYuYigidmlld2FibGVJbXByZXNzaW9uIik7ZSYmKGUucGVyY2VudCYmKGQ9ZS5wZXJjZW50KSwKZS50aW1lTVMmJihhPWUudGltZU1TKSk7dGhpcy5pYT17ZGlzcGxheTp0aGlzLmRpc3BsYXksY2I6ZnVuY3Rpb24oKXt0aGlzLkZhPSEwO2cuai5hKHYuZWEsdGhpcy5iKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmEscGVyY2VudDpkLHN0YXJ0VGltZTohMX07Zy5qLkdhKHRoaXMuaWEpfWE9IiI7dGhpcy5DLnpjJiYoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSkmJihjPXRoaXMuQy56Yy1jLDA8Yz9hPWcudi5iKCJza2lwYWJsZUJ1dHRvbiIpOihhPWcudi5iKCJza2lwQnV0dG9uIiksdGhpcy5WfHwodGhpcy5WPSEwLGcuai50cmFjaygidnJ0Y2x6cl9za2lwX2FjdGl2ZSIsIiIsITApLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmRhKCk7dGhpcy50cmFjaygic2tpcCIpO2cuai5hKHYuYyx0aGlzLmIoKSk7dGhpcy5DLnNkPyh0aGlzLkxjKCksdGhpcy5DLm9yaWdpbi5zZigpKTp0aGlzLkYoKX0uYmluZCh0aGlzKSkpKSwKdGhpcy5kaXNwbGF5LkIoYSkmJihhPXRoaXMuZGlzcGxheS5CKGEpKSxhPWEucmVwbGFjZSgiW3RpbWVdIixjKSxkLmlubmVySFRNTD1hKTt0aGlzLm0mJihjPXRoaXMuZGlzcGxheS5nZXREdXJhdGlvbigpLGE9dGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5tLmlubmVySFRNTD10aGlzLloucmVwbGFjZSgiW3RpbWVdIixnLmoud2EoYy1hKSksdGhpcy5jJiZ0aGlzLnUoKSl9O3UucHJvdG90eXBlLnpiPWZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9O3UucHJvdG90eXBlLkJiPWZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUHx8dGhpcy5QZSgpO2cuai5hKHYubSx0aGlzLmIoKSl9O3UucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlNiKCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TYigpfS5iaW5kKHRoaXMpKTsKdGhpcy50cmFjaygic3RhcnQiKTt0aGlzLmkubyYmdGhpcy5XKCJzdGFydCIpO2cuai5hKHYuQix0aGlzLmIoKSk7dGhpcy5jJiZ0aGlzLkQoKX07dS5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5XKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5wYT0hMCk7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2cuai5hKHYubCx0aGlzLmIoKSl9O3UucHJvdG90eXBlLkNiPWZ1bmN0aW9uKCl7dGhpcy5pLm8mJihnLmoudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlcoIm1pZHBvaW50IikpO3RoaXMudHJhY2soIm1pZHBvaW50Iik7Zy5qLmEodi5GLHRoaXMuYigpKX07dS5wcm90b3R5cGUubmI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5XKCJ0aGlyZFF1YXJ0aWxlIikpO3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKZy5qLmEodi5ELHRoaXMuYigpKX07dS5wcm90b3R5cGUucWU9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zy5qLmEodi5jLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtnLmouYSh2LkcsdGhpcy5iKCkpO3RoaXMuZGlzcGxheSYmdGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lJiZ0aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24mJnRoaXMuSWQodGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCkpfTt1LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuemEpO2EmJihhLmlubmVySFRNTD10aGlzLmcucGxheUJ1dHRvbik7dGhpcy5BJiYodGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkkoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygicGF1c2UiLCEwKTtnLmouYSh2LkEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5vYT1mdW5jdGlvbigpeyJ3ZWxlY3QiPT09CnRoaXMuQiYmKHRoaXMuVT0hMSx0aGlzLkcoKSk7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy5wYXVzZUJ1dHRvbik7dGhpcy5BJiYodGhpcy5BLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtnLmouYSh2LnMsdGhpcy5iKCkpO3RoaXMuYyYmdGhpcy5EKCl9O3UucHJvdG90eXBlLkRiPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy51bm11dGVCdXR0b24pO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlFiKCJtdXRlZCIpO2cuai5hKHYuWGEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5wYj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudGEpO2EmJihhLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbik7dGhpcy50cmFjaygidW5tdXRlIiwhMCk7dGhpcy5RYigidW5tdXRlZCIpOwpnLmouYSh2LiRhLHRoaXMuYigpKX07dS5wcm90b3R5cGUueWI9ZnVuY3Rpb24oYSl7dGhpcy5hLlMmJnRoaXMuYS5TLnlkJiZ0aGlzLmEuUy55ZCgpO2lmKGcuai5yYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5jJiYodGhpcy5VPSExKSx0aGlzLkcoKTtlbHNlIGlmKGF8fHRoaXMuQy5VYil7dHJ5e3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuQy5zY3x8KHRoaXMuQy5zYz0xKTtpZigxMDA+Yy10aGlzLkMuc2MpcmV0dXJuO3RoaXMuQy5zYz1jfWNhdGNoKGQpe31nLmouYSh2Lk4sdGhpcy5iKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTthPSJfdG9wIjtpZih0aGlzLmkuZGF8fCJ3ZWxlY3QiPT09dGhpcy5CKWE9Il9ibGFuayI7d2luZG93Lm9wZW4odGhpcy5DLlViLGEpfX07dS5wcm90b3R5cGUuZWU9ZnVuY3Rpb24oKXtpZih0aGlzLkMpZy5ILm8mJiF0aGlzLlAmJihnLmoudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLAohMCksdGhpcy5XKCJjb21wbGV0ZSIpKSx0aGlzLnRyYWNrKCJjb21wbGV0ZSIpLGcuai5hKHYuZix0aGlzLmIoKSksdGhpcy5GKCk7ZWxzZSBpZih0aGlzLmMpe3RoaXMuTj0hMTt0aGlzLmdhKys7dHJ5e3RoaXMuZGlzcGxheS5yZW1vdmUoKX1jYXRjaChhKXt9dHJ5e3RoaXMucy5yZW1vdmVDaGlsZCh0aGlzLmYpfWNhdGNoKGEpe310aGlzLm09dGhpcy5jb250cm9scz1udWxsO3RoaXMuVj0hMTt0aGlzLmRpc3BsYXkucGF1c2UoKTt0aGlzLmEuYygpO3RoaXMuVmI9ITE7dGhpcy5hYSgpLmVkKCk7dGhpcy5tYSgpfX07dS5wcm90b3R5cGUucGU9ZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIEM/KHRoaXMuc2EoYSksdGhpcy5GKCEwKSk6KCJ2cGFpZGVycm9yIj09YSYmKHRoaXMubygidnBhaWRlcnJvciIpLGcuai5hKHYuZmEsdGhpcy5iKCkpLHRoaXMuRigpKSwidmVydGljYWxpenIiPT1hJiZ0aGlzLkYoKSwiTk9PUFZJREVPIj09YSYmKHRoaXMuUD0hMCx0aGlzLkYoKSksYT09Qy5pJiYKdGhpcy5zYShDLmkpLCJwbGF5cHJvbWlzZUZhaWxlZCIhPWF8fHRoaXMubGF8fHRoaXMuRigpKX07dS5wcm90b3R5cGUuQWU9ZnVuY3Rpb24oKXt0aGlzLmxhfHx0aGlzLk1jKCl9O3UucHJvdG90eXBlLk1jPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LnBsYXkoKTt0aGlzLmFhKCkuamQodGhpcyl9O3UucHJvdG90eXBlLk5jPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkLGU9MDtlPGEubGVuZ3RoO2UrKylkPWcuai5pYShhW2VdKSxjLnB1c2goZCk7YT17aGFzaGVzOmN9O2E9di5hKGEsdGhpcy5xYSgpKTtnLmouWmIoYSl9O3UucHJvdG90eXBlLkY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5DJiZ0aGlzLkMuRmQmJnRoaXMuTmModGhpcy5DLkZkKTtpZighdGhpcy5OKWlmKHRoaXMuTj0hMCx0aGlzLkZhfHwoZy5qLmEodi5WLHRoaXMuYigpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSwhdGhpcy5sfHx0aGlzLmwuY3x8dGhpcy5sLmx8fHRoaXMubC5CKXt0aGlzLk49CiExO3RoaXMuZ2ErKzt0cnl7dGhpcy5kaXNwbGF5LnJlbW92ZSgpfWNhdGNoKGMpe310cnl7dGhpcy5zLnJlbW92ZUNoaWxkKHRoaXMuZil9Y2F0Y2goYyl7fXRoaXMubT10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5WPSExO3RyeXt0aGlzLmRpc3BsYXkucGF1c2UoKX1jYXRjaChjKXt9dGhpcy5hLmMoKTt0aGlzLlZiPSExO3RoaXMuYWEoKS5lZCgpO2lmKHRoaXMubCYmdGhpcy5sLndjJiZ0aGlzLmwuYyl0aGlzLmZhKCk7ZWxzZXtpZih0aGlzLmwmJnRoaXMubC5sJiZhKXtpZih0aGlzLmwud2Mpe3RoaXMuZmEoKTtyZXR1cm59aWYodGhpcy5sLkIpe3RoaXMubC5VKCk7cmV0dXJufX10aGlzLnRjKCl9fWVsc2UgdGhpcy50YygpfTt1LnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPU9iamVjdC5hc3NpZ24oe30sdGhpcy5DJiZ0aGlzLkMuYmU/dGhpcy5DLm5jOm51bGwsdGhpcy5hLlMuQ2EoKSx0aGlzLnFiKCksdGhpcy5xYSgpKX1jYXRjaChjKXthPXt9fXJldHVybiBhfTsKdS5wcm90b3R5cGUuU2I9ZnVuY3Rpb24oKXt0aGlzLkpifHwodGhpcy5KYj0hMCx0aGlzLnBhfHxnLmoudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfTt1LnByb3RvdHlwZS5IZD1mdW5jdGlvbihhKXt0aGlzLm9iKCk7YT09dGhpcy5UYXx8dGhpcy5QfHwoMD09YSYmKHRoaXMuQmIoKSx0aGlzLnpiKCksdGhpcy5sYigpKSxhPT1NYXRoLmZsb29yKHRoaXMuQy5kdXJhdGlvbi80KSYmdGhpcy5BYigpLGE9PU1hdGguZmxvb3IodGhpcy5DLmR1cmF0aW9uLzIpJiZ0aGlzLkNiKCksYT09TWF0aC5mbG9vcigzKnRoaXMuQy5kdXJhdGlvbi80KSYmdGhpcy5uYigpLHRoaXMuVGE9YSl9O3UucHJvdG90eXBlLktlPWZ1bmN0aW9uKGEpe2cuai50cmFjaygic3RhdHNfaGRfYWRfc2V0dXAiLGEsITApfTt1LnByb3RvdHlwZS5OZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuTygpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX07CnUucHJvdG90eXBlLlBlPWZ1bmN0aW9uKCl7Zy5qLlkoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfTt1LnByb3RvdHlwZS5PZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLk8oKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfTt1LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe2cuai5ZKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9O3UucHJvdG90eXBlLlc9ZnVuY3Rpb24oYSl7KHRoaXMuR2F8fHRoaXMuaS5vKSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5PKCksITApfTt1LnByb3RvdHlwZS5RYj1mdW5jdGlvbihhKXt0aGlzLmkubyYmZy5qLnRyYWNrKCJzdGF0c19oZF8iK2EsImNvbnRlbnQiLCEwKX07dS5wcm90b3R5cGUuSWQ9ZnVuY3Rpb24oYSxjKXthPU1hdGguZmxvb3IoYSk7aWYoIXRoaXMuRGFbIl8iKwphXSl7dmFyIGQ9dGhpcy5XYSh0aGlzLkMuamEsInByb2dyZXNzIik7dGhpcy5EYVsiXyIrYV09W107Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV07YT09Zy5qLmdiKGYub2Zmc2V0LGMpJiYodGhpcy5kYShmLnVybCwicHJvZ3Jlc3MiKSx0aGlzLkRhWyJfIithXS5wdXNoKGYpKX19fTt1LnByb3RvdHlwZS50cmFjaz1mdW5jdGlvbihhLGMpe2M9dm9pZCAwPT09Yz8hMTpjO2lmKCJwcm9ncmVzcyIhPWEmJiF0aGlzLlApe3RoaXMud2EmJnRoaXMud2EudHJhY2smJnRoaXMud2EudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZudWxsIT1nLmouZmEmJmcuai50cmFjaygic3RhdHNfaGRfYWR4X2ltcHJlc3Npb24iLGcuai5mYS50b1N0cmluZygpLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7dmFyIGQ9YSsiSGFzQmVlblRyYWNrZWQiO2lmKHRoaXNbZF0pcmV0dXJuO3RoaXNbZF09ITB9ZD1bXTt0cnl7ZD10aGlzLldhKHRoaXMuQy5qYSwKYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGU9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmthPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuaGEuaW1wcmVzc2lvbnMmJmcuai5KYihlLnVybCx0aGlzLmhhLmltcHJlc3Npb25zKT90aGlzLmRhKGUudXJsLGUudHlwZSx7fSxmdW5jdGlvbihmKXt0cnl7dmFyIGg9Zi5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtnLmouYSh2Lm8sdGhpcy5DLm5jLHRoaXMuYS5TLkNhKCksdGhpcy5xYigpLHthZElkOnRoaXMuaGEuYWRJZCxpbXByZXNzaW9uVVJMOmh9LHRoaXMucWEoKSl9Y2F0Y2gobSl7fX0uYmluZCh0aGlzKSk6dGhpcy5kYShlLnVybCxlLnR5cGUpfWNhdGNoKGYpe31pZighYyl0cnl7dGhpcy5DLmphPXRoaXMuWWIodGhpcy5DLmphLGEpfWNhdGNoKGYpe319fTt1LnByb3RvdHlwZS5PPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLnJhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGM9IiI7Zy5qLnUmJgooYz0iX3JlY3ljbGVkIik7dGhpcy5HYSYmKGM9Il92cGFpZCIpOyJ3ZWxlY3QiPT09dGhpcy5CJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9O3UucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEsYyxkLGUpe2Q9dm9pZCAwPT09ZD97fTpkO2U9dm9pZCAwPT09ZT9udWxsOmU7dmFyIGY9dm9pZCAwPT09Zj9udWxsOmY7aWYoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCl7dmFyIGg9dGhpcy5pLmMoYSk7ZCYmaC5iKGQpO2V8fChlPXRoaXMueGIpO2Z8fChmPXRoaXMueGIpO2Q9ZnVuY3Rpb24oKXt0aGlzLkxiKGEpO2UoKX0uYmluZCh0aGlzKTt2YXIgbT1mdW5jdGlvbigpe3RoaXMuTGIoYSk7ZigpfS5iaW5kKHRoaXMpO2cuai5iYT8oImltcHJlc3Npb24iIT1jfHx0aGlzLmlifHwodGhpcy5pYj0hMCxjPWcuai5LKCJodHRwczovL2hvbWFkLXZhc3QtaW1wcmVzc2lvbnMuczMuYW1hem9uYXdzLmNvbS93ZWxlY3QuZGUuZ2lmP3NhbHQ9MC4iK2cuai5zKDE2KSxnLkgpLGM9dGhpcy5pLmMoYyksCnRoaXMuaS5sKGMsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSwhMSwhMCkpLChuZXcgSW1hZ2UpLnNyYz1hKToodGhpcy5DYyhhKSx0aGlzLmkubChoLGQsbSwhMSwhMCkpfX07dS5wcm90b3R5cGUuQ2M9ZnVuY3Rpb24oYSl7dGhpcy5LW2FdPSJvcGVuIn07dS5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oYSl7dGhpcy5LW2FdPSJjbG9zZWQifTt1LnByb3RvdHlwZS5aZD1mdW5jdGlvbigpe3RoaXMuSz17fX07dS5wcm90b3R5cGUuUWU9ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5LKXRoaXMuSy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLktbY10mJmErKztyZXR1cm4gYX07dS5wcm90b3R5cGUuV2E9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHlwZT09Y30pfTt1LnByb3RvdHlwZS5ZYj1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlIT09Y30pfTt1LnByb3RvdHlwZS5PYz0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmEuUzthLnRkJiZhLnRkKHRoaXMueWIuYmluZCh0aGlzKSl9O3UucHJvdG90eXBlLktkPWZ1bmN0aW9uKCl7aWYoIXRoaXMubSl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmdbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpOwp0aGlzLmM/YS5pbm5lckhUTUw9IldlcmJ1bmciOmEuaW5uZXJIVE1MPXRoaXMuWi5yZXBsYWNlKCJbdGltZV0iLGcuai53YSgwKSk7dmFyIGM9dGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5pLlYmJihjPXRoaXMuaS5WKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnUuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5tPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmMmJih0aGlzLm0uc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gY2VudGVyIix0aGlzLm0uc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIix0aGlzLnUoKSl9fTt1LnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7KHRoaXMuZ1siY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLmkuVnx8dGhpcy5jKSYmdGhpcy5tJiZ0aGlzLm0uc3R5bGUmJih0aGlzLm0uc3R5bGUuZGlzcGxheT0ibm9uZSIpfTt1LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYz10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKTsKdGhpcy5kaXNwbGF5LmwoKXx8YSYmYyYmKHRoaXMuZ1siY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLmkuVnx8dGhpcy5jKSYmdGhpcy5tJiZ0aGlzLm0uc3R5bGUmJih0aGlzLm0uc3R5bGUuZGlzcGxheT0iYmxvY2siKX07dS5wcm90b3R5cGUuTGQ9ZnVuY3Rpb24oKXtpZighZy5qLlcodGhpcy5jb250cm9scykpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLmFlO3RoaXMuZ1siY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuZ1siY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkkoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJwbGF5UGF1c2Uuc3R5bGUiXT9kLnN0eWxlPXRoaXMuZ1sicGxheVBhdXNlLnN0eWxlIl06KGQuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZC5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtkLmlkPXRoaXMuemE7ZC5pbm5lckhUTUw9dGhpcy5nLnBhdXNlQnV0dG9uO2QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmIuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5SYi5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTsKdGhpcy5EKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JKCk7dGhpcy51KCl9LmJpbmQodGhpcykpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZ1sibXV0ZS5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5nWyJtdXRlLnN0eWxlIl06KGUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGUuc3R5bGVbImZsb2F0Il09InJpZ2h0IixlLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2UuaWQ9dGhpcy50YTtlLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbjtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlJlLmJpbmQodGhpcykpO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSSgpOwp0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmdbInNraXAuc3R5bGUiXTp0aGlzLmRpc3BsYXkuRCgpP2cuai5xYShmLHRoaXMuZGlzcGxheS5EKCkpOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5QYjtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgaD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTtoJiZoWzBdJiYoaFswXS5zdHlsZS5vcGFjaXR5PTEpfSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgaD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKaCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGQpO3RoaXMuQy56YyYmYy5hcHBlbmRDaGlsZChmKTtjLmFwcGVuZENoaWxkKGUpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5qLnJhKCl8fCh0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKSx0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JKCk7dGhpcy51KCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZi5hcHBlbmRDaGlsZChjKTt0aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9hLnN0eWxlPXRoaXMuZ1sicmVzdW1lQ29udHJvbC5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuekluZGV4PSIxMDAwMCIsYS5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQSYmKHRoaXMuQS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmEuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5BPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmEuZyhmdW5jdGlvbihoKXt0aGlzLkEuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpO3RoaXMuYyYmKGQuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gbGVmdCIsZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gcmlnaHQiLGUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIik7dGhpcy5hLlMuRWEmJiF0aGlzLmMmJnRoaXMuYS5TLkVhKCkmJihnLmouYSh2LkksdGhpcy5iKCkpLHRoaXMuSWIoKSk7dGhpcy5JKCl9fTt1LnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn07dS5wcm90b3R5cGUuRz1mdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMuQSYmImJsb2NrIj09dGhpcy5BLnN0eWxlLmRpc3BsYXl8fAp0aGlzLlV8fHRoaXMuZGlzcGxheS5sKCl8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9O3UucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCk/KHRoaXMuZGlzcGxheS5wbGF5KCksdGhpcy5vYSgpKToodGhpcy5kaXNwbGF5LnBhdXNlKCksdGhpcy5uYSgpKX07dS5wcm90b3R5cGUuamM9ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNwbGF5LmlzUGF1c2VkKCl8fHRoaXMuYyl0aGlzLmRpc3BsYXkucGF1c2UoKSx0aGlzLm5hKCl9O3UucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCkmJih0aGlzLmRpc3BsYXkucGxheSgpLHRoaXMub2EoKSl9O3UucHJvdG90eXBlLlJlPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCk/KHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSk6KHRoaXMuZGlzcGxheS5YYSgpLHRoaXMuRGIoKSl9O3UucHJvdG90eXBlLkliPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCl8fAoodGhpcy5kaXNwbGF5LlhhKCksdGhpcy5EYigpKX07dS5wcm90b3R5cGUuSmQ9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWIoKSYmKHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSl9O3UucHJvdG90eXBlLnRjPWZ1bmN0aW9uKCl7aWYodGhpcy5nYigpKWlmKHRoaXMuaGIoKSl7aWYoZy5qLnRyYWNrKCJzdGF0c19oZF9iYWNrZmlsbF9hbGxvd2VkIiwid2VsZWN0IiwhMCksdGhpcy5UYigpKXt0aGlzLk49ITE7cmV0dXJufX1lbHNlIHRoaXMuVmQoKT9nLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX2FsbG93ZWQiLCJ2ZXJ0aWNhbGl6ciIsITApOmcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsIm5vbmUiLCEwKTtlbHNlIGcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsImZhbHNlIiwhMCk7dGhpcy5sYT0hMDt0aGlzLm1hKCl9O3UucHJvdG90eXBlLmdiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pLkd8fGcuai5HYigpLGM9KCF0aGlzLmthfHwKdGhpcy56ZSgpKSYmIXRoaXMuQixkPWcuai5GYigpLGU9InByZXJvbGwiPT09Zy5qLlU7cmV0dXJuIGEmJmMmJmQmJmV9O3UucHJvdG90eXBlLmhiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIik7YT1nLkguaWEmJmEmJmEudXJsO3ZhciBjPSFnLmoucmEoKTtyZXR1cm4gYSYmY307dS5wcm90b3R5cGUuVmQ9ZnVuY3Rpb24oKXtyZXR1cm4gZy5qLkYoKS5yYSYmZy5qLk4oKX07dS5wcm90b3R5cGUuemU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZGlzcGxheSYmMT50aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSYmNT09PXRoaXMuQy5kdXJhdGlvbn1jYXRjaChhKXtyZXR1cm4hMX19O3UucHJvdG90eXBlLndlPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIiksYz1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsoYT1hP2EudXJsOm51bGwpfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0X3Rlc3QueG1sIik7CnJldHVybiBhfTt1LnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMud2UoKTt0aGlzLkI9IndlbGVjdCI7dGhpcy5VPXRoaXMua2E9ITA7cmV0dXJuIGEmJihnLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX3N0YXJ0Iiwid2VsZWN0IiwhMCksYT1nLkgubWEoYSksYT1nLmouSyhhLHRoaXMuaSwhMSx7b25seVVSTDohMH0pKT8odGhpcy5lYShhLCEwLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwKTohMX07dS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5RZSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoITApfS5iaW5kKHRoaXMpLDIwMCk6KHRoaXMuZGlzcGxheSYmKHRoaXMuZGlzcGxheS5wYXVzZSgpLHRoaXMuYyYmdGhpcy5kaXNwbGF5JiZ0aGlzLmRpc3BsYXkucmVtb3ZlKCkpLHRoaXMuYS5jKCksdGhpcy5hLkcoKSx0aGlzLlZiPSExLGcuai5hKHYuSyx0aGlzLmIoKSksdGhpcy5hYSgpLmVkKCkpfTsKdS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLlMmJihhPXRoaXMuYS5TKTtyZXR1cm4gYX07dS5wcm90b3R5cGUuamI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlpiKCk7YSYmKGcuai5GYSh0aGlzLnZpZGVvLGEpP3RoaXMuTWIoKTp0aGlzLmpjKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMTAwKSl9O3UucHJvdG90eXBlLnFiPWZ1bmN0aW9uKCl7dmFyIGE9e307aWYodGhpcy5DKXthLmNsaWNrdGhyb3VnaD10aGlzLkMuVWI7YS5kdXJhdGlvbj10aGlzLkMuZHVyYXRpb247YS5hZFBvZD10aGlzLkMuc2Q7dmFyIGM9dGhpcy5kaXNwbGF5O2MmJihhLmN1cnJlbnRUaW1lPWMuZ2V0Q3VycmVudFRpbWUoKSxhLnZpZGVvX2R1cmF0aW9uPXRoaXMuZGlzcGxheS5nZXREdXJhdGlvbigpKTt0aGlzLlkmJjA8dGhpcy5ZLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5ZKX1yZXR1cm4gYX07dS5wcm90b3R5cGUucWE9CmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5YZCsiLSIrdGhpcy5nYTt0aGlzLkMmJnRoaXMuQy56ZCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLkMuemQoKSk7cmV0dXJuIGF9O3UucHJvdG90eXBlLnhiPWZ1bmN0aW9uKCl7fTt5KFAsdmEpO1AucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07UC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiAwfTtQLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiAwfTtQLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt9OwpQLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5GZT1mdW5jdGlvbihhKXt0aGlzLkc9YX07UC5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT0hMDstMT09PXRoaXMuRyYmKGE9ITEpO3JldHVybiBhfTtQLnByb3RvdHlwZS5oZD1mdW5jdGlvbihhKXt0aGlzLmk9YX07UC5wcm90b3R5cGUuRWU9ZnVuY3Rpb24oYSl7dGhpcy5jPWF9O1AucHJvdG90eXBlLlhjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY307UC5wcm90b3R5cGUuQmU9ZnVuY3Rpb24oYSl7dGhpcy5DPWF9O1AucHJvdG90eXBlLmRhPWZ1bmN0aW9uKCl7fTtQLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9O1AucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4hMX07UC5wcm90b3R5cGUuRGU9ZnVuY3Rpb24oYSl7dGhpcy5XPWF9O3koTSxQKTtNLnByb3RvdHlwZS5UPQpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLlUoKSxjPXRoaXMuaTt0aGlzLmthKGEpO2EucHJlbG9hZD0iYXV0byI7Zy52LmIoInZpZGVvLnN0eWxlLnBvc2l0aW9uIikmJihhLnN0eWxlLnBvc2l0aW9uPWcudi5iKCJ2aWRlby5zdHlsZS5wb3NpdGlvbiIpKyIiKTtnLnYuYigidmlkZW8uc3R5bGUiKSYmKGEuc3R5bGU9Zy52LmIoInZpZGVvLnN0eWxlIikrIiIpO3ZhciBkPWcudi5iKCJ2aWRlby5hdHRyaWJ1dGVzIik7aWYoZClmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhLnNldEF0dHJpYnV0ZShlLGRbZV0pO3RoaXMucGEoKSYmKGEudm9sdW1lPXRoaXMuRyk7Zy5qLlNiKGEpO3RoaXMubmEoKTt0aGlzLm0oYSk/KGEubG9hZCgpLHRoaXMubWEoKSxjLmcodGhpcy5yZXNpemUuYmluZCh0aGlzKSkpOnRoaXMuTCh0aGlzLmV2ZW50Lk9hLG5ldyBDKEMuaSkpO1AucHJvdG90eXBlLlQuY2FsbCh0aGlzKX1jYXRjaChmKXtyZXR1cm4hMX1yZXR1cm4hMH07TS5wcm90b3R5cGUucmVtb3ZlPQpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO2EucGF1c2UoKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9O00ucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5SKCkucGF1c2UoKX07TS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkucGF1c2VkfHx0aGlzLkl9O00ucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5wbGF5KCk7aWYoYSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5iYT90aGlzLkwodGhpcy5ldmVudC5PYSwicGxheXByb21pc2VGYWlsZWQiKToodGhpcy5JPSEwLHRoaXMucGF1c2UoKSx0aGlzLkwodGhpcy5ldmVudC5IYyksdGhpcy5iYT0hMCl9LmJpbmQodGhpcykpO3NjPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsCnRoaXMuYi5iaW5kKHRoaXMpKSk6TWI9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLlIoKTt0aGlzLkt8fChjLmxvYWQoKSx0aGlzLnBsYXkoKSl9LmJpbmQodGhpcyl9O00ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5SKCkubXV0ZWQ9ITB9O00ucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5SKCkubXV0ZWQ9ITF9O00ucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLm11dGVkfTtNLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5jdXJyZW50VGltZX07TS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkuZHVyYXRpb259O00ucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4hMX07TS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcy5SKCk7Yy5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKGQpe2EuRGEoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKZnVuY3Rpb24oZCl7YS5oYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oZCl7YS5JPSExO2EuR2EoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIixmdW5jdGlvbihkKXthLmZhKGQpfSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oZCl7YS5nYShkKX0pO2Muc3R5bGUmJihjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGQpe3RyeXtkLmN1cnJlbnRUYXJnZXQucGF1c2VkP2EucGxheSgpOmEuZWEoKX1jYXRjaChlKXthLmVhKCl9fSl9O00ucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLlIoKTtjLnN0eWxlLndpZHRoPWEud2lkdGgrInB4IjtjLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifTtNLnByb3RvdHlwZS5mYT1mdW5jdGlvbihhKXt0aGlzLnJlbW92ZSgpO3RoaXMuTCh0aGlzLmV2ZW50Lk5hLGEpfTtNLnByb3RvdHlwZS5HYT0KZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5SKCk7Yy5jb250cm9scz0hMTt0aGlzLks9ITA7YS5jdXJyZW50VGltZT1jLmN1cnJlbnRUaW1lO2EuZGlzcGxheT10aGlzOzA8Yy5kdXJhdGlvbiYmdGhpcy5MKHRoaXMuZXZlbnQub2MsYSl9O00ucHJvdG90eXBlLkRhPWZ1bmN0aW9uKGEpe3RoaXMuZnx8KHRoaXMuUigpLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mfHx0aGlzLmhhKGEpfS5iaW5kKHRoaXMpLHRoaXMuaWEpKX07TS5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5DLGQ9dGhpcy5SKCk7dGhpcy5QfHwhdGhpcy5tKGQpfHx0aGlzLkF8fHRoaXMuZnx8KHRoaXMuUD0hMCwhZy5qLnJhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyhjLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKT8odGhpcy5BfHwodGhpcy5BPSEwLGcuSC5pYnx8Zy5ILkFhKCJ2aWRlby1ub29wIikpLHRoaXMuTCh0aGlzLmV2ZW50Lk9hLAoiTk9PUFZJREVPIikpOihkLmNvbnRyb2xzPSExLHRoaXMuTCh0aGlzLmV2ZW50LlhiKSkpfTtNLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlIoKSxjPXRoaXMubGEoKSxkPTA7ZDxjLmxlbmd0aDtkKyspYS5jYW5QbGF5VHlwZShjW2RdLnR5cGUpJiZ0aGlzLnUoYSxjW2RdLnVybCsiIil9O00ucHJvdG90eXBlLmxhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLmEsYz1OdW1iZXIoZy52LmIoImJpdHJhdGUiKSl8fDFFMzt0cnl7dmFyIGQ9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTEhPWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtCmguYml0cmF0ZSl9KTthPWQuY29uY2F0KGUpfWNhdGNoKGYpe31yZXR1cm4gYX07TS5wcm90b3R5cGUudT1mdW5jdGlvbihhLGMpe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Quc3JjPWM7ZC5vbmVycm9yPXRoaXMuRmEuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGQpfTtNLnByb3RvdHlwZS5GYT1mdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt2YXIgYz10aGlzLlIoKTtjLm5ldHdvcmtTdGF0ZSYmYy5uZXR3b3JrU3RhdGU9PT1jLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKGEpfTtNLnByb3RvdHlwZS5lYT1mdW5jdGlvbigpe3RoaXMuTCh0aGlzLmV2ZW50LmxjKX07TS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5mPSEwO3ZhciBjPXt9O2lmKGEmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZSlzd2l0Y2goYS50YXJnZXQuZXJyb3IuY29kZSl7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfQUJPUlRFRDpjPQpDLmEubWM7YnJlYWs7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfTkVUV09SSzpjPUMuYS5tYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9ERUNPREU6Yz1DLmEubWM7YnJlYWs7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQ6Yz1DLmEubWN9ZWxzZSB0aGlzLnZpZGVvVGFnLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlb1RhZy5ORVRXT1JLX05PX1NPVVJDRSYmZy5ILkpiKCk7dGhpcy5MKHRoaXMuZXZlbnQuT2EsbmV3IEMoQy5tLHtkZXRhaWxzOmMsZXJyb3I6YX0pKX07TS5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLlIoKSl9O00ucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofTtNLnByb3RvdHlwZS5rYT1mdW5jdGlvbihhKXt0aGlzLnZpZGVvVGFnPWF9O00ucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307Ck0ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT1iYi5wb3AoKTthfHwoYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGEuaWQ9Zy5qLmcoMTApLGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTtyZXR1cm4gYX07TS5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYik7dGhpcy5LfHwoYS5sb2FkKCksYS5wbGF5KCkpfTtmb3IodmFyIGJiPVtdLHhjPTA7MTAwPnhjO3hjKyspe3ZhciBPYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO09iLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPYi5pZD1nLmouZygxMCk7T2IuY29udHJvbHM9ITA7YmIucHVzaChPYil9dmFyIE1iPW51bGwsc2M9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEphKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsSmEpO3kob2EsTSk7b2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLlk/dGhpcy5WKCk6dGhpcy56YSgpfTtvYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3RoaXMucWEoKTtNLnByb3RvdHlwZS5wbGF5LmNhbGwodGhpcyl9O29hLnByb3RvdHlwZS56YT1mdW5jdGlvbigpe3RoaXMuWT0hMDt0aGlzLlo9dGhpcy5jLnN0eWxlLnpJbmRleDt0aGlzLmMuc3R5bGUuekluZGV4PSIxMDAwIjt0aGlzLm9hKCl9O29hLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe2lmKHRoaXMuYSl0cnl7b2EuYSgpLHRoaXMuYy5zdHlsZS56SW5kZXg9dGhpcy5aLHRoaXMuYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYSl9Y2F0Y2goYSl7fX07b2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLnNiLmNhbGwodGhpcywKYSk7dGhpcy5zPWF9O29hLnByb3RvdHlwZS53YT1mdW5jdGlvbihhKXt0aGlzLmEuc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO3RoaXMuYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In07b2EucHJvdG90eXBlLm9hPWZ1bmN0aW9uKCl7dGhpcy5pLmcodGhpcy53YS5iaW5kKHRoaXMpKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnpJbmRleD0xRTY7YS5zdHlsZS53aWR0aD0iIjthLnN0eWxlLmhlaWdodD0iIjthLnN0eWxlLmxlZnQ9IjBweCI7YS5zdHlsZS50b3A9IjBweCI7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjZmZmIjthLmlubmVySFRNTD10aGlzLk87dGhpcy5hPWE7dGhpcy5zLmFwcGVuZENoaWxkKHRoaXMuYSl9O29hLnByb3RvdHlwZS50YT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7ZmV0Y2goImh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vc3BpZWdlbFNuaXBwZXQuaHRtbCIpLnRoZW4oZnVuY3Rpb24oYyl7Yy50ZXh0KCkudGhlbihmdW5jdGlvbihkKXthLk89CmQ7YS5zYSgpfSl9KX07b2EucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmcoMTApO3dpbmRvd1thXT1mdW5jdGlvbigpe3RoaXMuVigpfS5iaW5kKHRoaXMpO3RoaXMuTz10aGlzLk8ucmVwbGFjZSgiW09OQ0xJQ0tIQU5ETEVSXSIsIndpbmRvd1snIithKyInXSgpIil9O29hLlJhPWZ1bmN0aW9uKCl7Zy5wYz0hMH07b2EuYT1mdW5jdGlvbigpe2cucGM9ITF9OzA8PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInN2bXB1ciIpJiZvYS5SYSgpO3koT2EsTSk7T2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXtNLnByb3RvdHlwZS5ULmNhbGwodGhpcyk7cmV0dXJuITB9O09hLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYyl7YSYmYS5hcHBlbmRDaGlsZD9NLnByb3RvdHlwZS51LmNhbGwodGhpcyxhLGMpOmEuc2V0QXR0cmlidXRlKCJzcmMiLGMpfTtPYS5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZT9NLnByb3RvdHlwZS5tLmNhbGwodGhpcywKYSk6ITB9O09hLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dGhpcy5hLmxvYWQoKTtyZXR1cm4gdGhpcy5hfTtPYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmE9YX07T2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtPYS5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7dGhpcy5MKHRoaXMuZXZlbnQuTmEsYSl9O09hLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oYSl7aWYoMCE9YS53aWR0aCYmMCE9YS5oZWlnaHQpe3ZhciBjPXRoaXMuUigpO2Muc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO2Muc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9fTt5KFcsUCk7Vy5wcm90b3R5cGUuVD1mdW5jdGlvbigpe2cuai5nYSgpO3ZhciBhPShnLmoubC5nZXQoImNyZWF0ZUVsZW1lbnQiKXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkoImlmcmFtZSIpO3RoaXMuSShhKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwKIm5vIik7YS5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTthLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt2YXIgYz1nLnYuYigidnBhaWRJZnJhbWUuc3R5bGUiKTtjJiZnLmoucWEoYSxjKyIiKTthLm9ubG9hZD10aGlzLlUuYmluZCh0aGlzKTtjPWcuai5LKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsZy5ILCEwKTthLnNyYz1jO2cuai5aKCJ2cGFpZGV2ZW50Iix0aGlzLnUuYmluZCh0aGlzKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkwodGhpcy5ldmVudC5YYil9LmJpbmQodGhpcyksMCk7dGhpcy5ZKCk7cmV0dXJuITB9O1cucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYSxjPQphLnBhcmVudE5vZGU7YSYmYyYmZy5qLlcoYSkmJmMucmVtb3ZlQ2hpbGQoYSk7dGhpcy5JKG51bGwpO2cuai5nYSgpfTtXLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkF9O1cucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307Vy5wcm90b3R5cGUubD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm19O1cucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbnRyb2wiLCJwbGF5Iik7dGhpcy5iPSExfTtXLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29udHJvbCIsInBhdXNlIik7dGhpcy5iPSEwfTtXLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9O1cucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwibXV0ZSIpO3RoaXMuZj0hMH07Vy5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsCiJjb250cm9sIiwidW5tdXRlIik7dGhpcy5mPSExfTtXLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9O1cucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXtnLmouZih0aGlzLmEsInJlc2l6ZSIse3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fSl9O1cucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZCxlLGYsaCxtLEQsTCxPO3JldHVybiBGYyhmdW5jdGlvbihOKXtpZigxPT1OLmEpe2M9YS5pO2Q9ITE7Yy5TLkVhJiZjLlMuRWEoKSYmKGQ9ITApO2U9YS5DLnMoKTtmPWEuQy5uYztlJiZlLnVybCYmMDw9ZS51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJihnLkguZ2V0Q29uZmlnKCksKGg9Zy52LmIoImFkX2ZhbGxiYWNrX2NvbmZpZyIpKSYmaC53ZWxlY3RhbGlhcyYmKGY9SlNPTi5zdHJpbmdpZnkoaCkpKTttPWEuWGMoKTtpZighZy5qLkEoZS51cmwpKXtEPWUudXJsO04uYT0yO3JldHVybn1yZXR1cm4gcWMoTixnLmoua2EoZS51cmwpLAozKX0yIT1OLmEmJihEPU4uYik7TD1EO089e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZy5ILmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpMLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmUuZGVzaXJlZEJpdHJhdGV8fGUuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpmLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmZ9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KG0uc3R5bGUud2lkdGgsMTApLGhlaWdodDpwYXJzZUludChtLnN0eWxlLmhlaWdodCwxMCl9fSxjb250ZW50UGxheWVyOnttdXRlZDpkfX07YS5WKE8pO2cuai5aKCIiLGEudS5iaW5kKGEpKTtnLmouWigidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5MKHRoaXMuZXZlbnQuTmEpfS5iaW5kKGEpKTtnLmouWigidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkwodGhpcy5ldmVudC5OYSl9LmJpbmQoYSkpO2MuZyhmdW5jdGlvbihtYSl7Zy5qLmYodGhpcy5hLAoicmVzaXplIixtYSl9LmJpbmQoYSkpO04uYT0wfSl9O1cucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiZjLm8oITApO3RoaXMuSz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkZjKTsiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkRjKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50LkpjKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuRWMpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuR2MpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiYKdGhpcy5MKHRoaXMuZXZlbnQuS2MpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MKHRoaXMuZXZlbnQuTmEpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMucmVtb3ZlKCksdGhpcy5MKHRoaXMuZXZlbnQuTmEpKTsiQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTCh0aGlzLmV2ZW50Lm9kKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJih0aGlzLmJhKGEuZGF0YS50aW1pbmcpLHRoaXMuTCh0aGlzLmV2ZW50LnBkLGEpLHRoaXMuYj0hMSk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe2M9YS5kYXRhLmNsaWNrVGhydVRhcmdldDt2YXIgZD10aGlzLkM7Y3x8KGM9ZC5VYik7aWYoIWMpcmV0dXJuO3RoaXMuTCh0aGlzLmV2ZW50LmxjKX0iQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYj0hMCx0aGlzLkwodGhpcy5ldmVudC5IYykpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuYj0hMSx0aGlzLkwodGhpcy5ldmVudC5uZCkpOwoiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5mPSEwLHRoaXMuTCh0aGlzLmV2ZW50Lk1kKSk6KHRoaXMuZj0hMSx0aGlzLkwodGhpcy5ldmVudC5SZCkpKTsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiYoYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLCFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoZD1jLm1hdGNoKGQpKT9kLmpvaW4mJihjPWQuam9pbigiLSIpKTpjPWMuc3Vic3RyaW5nKDAsMjApKSx0aGlzLnJlbW92ZSgpLHRoaXMuTCh0aGlzLmV2ZW50Lk9hLCJ2cGFpZGVycm9yIixjKSk7ImJsb2NrQ29udHJvbHMiPT1hLmRhdGEubmFtZSYmKHRoaXMubT0hMCk7InVuYmxvY2tDb250cm9scyI9PWEuZGF0YS5uYW1lJiYodGhpcy5tPSExKX19O1cucHJvdG90eXBlLmJhPWZ1bmN0aW9uKGEpe2EmJih0aGlzLnM9CmEuZHVyYXRpb24sdGhpcy5BPWEuY3VycmVudFRpbWUsdGhpcy5PPWEucmVtYWluaW5nVGltZSl9O1cucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwKImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw1RTMpfTtXLnByb3RvdHlwZS5zYj1mdW5jdGlvbihhKXthLmFwcGVuZENoaWxkKHRoaXMuYSl9O1cucHJvdG90eXBlLkk9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O1cucHJvdG90eXBlLlk9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5QKX07Vy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXthJiZhLmRhdGEmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiYiaW50ZXJ2ZW50aW9uIj09YS5kYXRhLmV2ZW50JiZnLmoudHJhY2soInN0YXRzX2hkX2ludGVydmVudGlvbiIsCmEuZGF0YS5pZCwhMCl9O3koUixQKTtSLnByb3RvdHlwZS5jb250aW51ZT1mdW5jdGlvbigpe3RoaXMubSYmKHRoaXMuTygpLHRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JKCl9LmJpbmQodGhpcyksMCkpfTtSLnByb3RvdHlwZS5aYT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuVztkJiZkLnZkJiZkLnZkKGEsYyl9O1IucHJvdG90eXBlLmRhPWZ1bmN0aW9uKCl7Zy5qLnRyYWNrKCJ2cnRjbHpyX3NraXBlZCIsIiIsITApO3RoaXMuWmEoInNraXAiLHt9KX07Ui5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RyeXtoaXN0b3J5LnB1c2hTdGF0ZSh7dmVydGljYWw6ITB9LCIiLCIjIitnLmouZyg1KSksaGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpfWNhdGNoKGEpe313aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLGZ1bmN0aW9uKGEpe2EmJmEuc3RhdGUmJmEuc3RhdGUudmVydGljYWwmJnRoaXMuYS5jbG9zZSgpfS5iaW5kKHRoaXMpKX07ClIucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiBjYWxjKDE4JSk7IGJvdHRvbTogOXB4OyB3aWR0aDogNjQlOyB0ZXh0LWFsaWduOiBjZW50ZXI7In07Ui5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgiU2tpcCBBZCIsIldlcmJ1bmcgJnV1bWw7YmVyc3ByaW5nZW4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLzxkaXYgc3R5bGU9IlthLXpBLVowLTk6O1wuXHNcKFwpXC0sI10qIi9naSwnPGRpdiBzdHlsZT0id2lkdGg6MTAwJTsgaGVpZ2h0OiAzMHB4OyBmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFJvYm90bywgYXJpYWwsIHNhbnMtc2VyaWY7IG9wYWNpdHk6IDAuNjsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbGluZS1oZWlnaHQ6IDMwcHg7IicpfTtSLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOwphLmhyZWY9dGhpcy5zLmNzc3x8Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3ZlcnRpY2FsaXpyLmNzcyI7YS5yZWw9InN0eWxlc2hlZXQiO2EudHlwZT0idGV4dC9jc3MiO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvc3dpcGUubWluLmpzIjthLnR5cGU9InRleHQvamF2YXNjcmlwdCI7YS5vbmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLks9ITA7dGhpcy5WKCl9LmJpbmQodGhpcyk7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX07Ui5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztGYyhmdW5jdGlvbihkKXtpZigxPT1kLmEpcmV0dXJuIGcudi5jbGllbnQudGNmX2NvbmZpZz0hMCxxYyhkLGcuai5mYihnLkgubWEoYS5QKSksMik7Yz1kLmI7ZmV0Y2goYyx7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpe2UuYWR2ZXJ0aXNlbWVudHMmJgoxPGUuYWR2ZXJ0aXNlbWVudHMubGVuZ3RoPyhhLkwoYS5ldmVudC5YYiksYS5iPWUuYWR2ZXJ0aXNlbWVudHMsZy5qLnRyYWNrKCJ2cnRjbHpyX3N1Y2Nlc3MiLCIiLCEwKSxhLm0/YS5tKCk6YS5JKCkpOihlLnJlYXNvbj8iaW5zdWZmaWNpZW50X2FkcyI9PT1lLnJlYXNvbj9nLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJpbnN1ZmZpY2llbnRfYWRzIiwhMCk6Im9iamVjdCI9PT10eXBlb2YgZS5yZWFzb24mJmUucmVhc29uLmhhc093blByb3BlcnR5KCJhdmFpbGFibGUiKSYmZy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwidW5hdmFpbGFibGUiLCEwKTpnLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJ1bmtub3duIiwhMCksYS5mKCksYS5MKGEuZXZlbnQuT2EsInZlcnRpY2FsaXpyIiksYS5aYSgiZXJyb3IiLHt9KSl9KS5jYXRjaChmdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9lcnJvciIsImFwaSIsITApO2EuZigpO2EuTChhLmV2ZW50Lk9hLCJ2ZXJ0aWNhbGl6ciIpO2EuWmEoImVycm9yIiwKe30pfSk7ZC5hPTB9KX07Ui5wcm90b3R5cGUuUmM9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLnRyYWNrKCJjbGlja3RyYWNraW5nIik7dmFyIGE9dGhpcy5hLmEud2Q7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsIl90b3AiKTtjLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWF9Y2F0Y2goZCl7Yz13aW5kb3cub3BlbihhLCJfdG9wIik7dHJ5e2N8fHdpbmRvdy5vcGVuKGEsIl90b3AiKX1jYXRjaChlKXt3aW5kb3cub3BlbihhLCJfdG9wIil9fX0uYmluZCh0aGlzKSw1MDApfTtSLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO3RoaXMuYi5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPW5ldyBWKCIiLCEwKTtkLmNvbnRlbnRfcGllY2VzPWQuY29udGVudF9waWVjZXMuc29ydChmdW5jdGlvbihmKXtyZXR1cm4tMT09PWYucmF0aW8uaW5kZXhPZigiOToxNiIpPwoxOi0xfSk7ZC5zcmM9ZC5jb250ZW50X3BpZWNlc1swXS5yZXNvdXJjZTtjLnB1c2goZS5iYShkLnNyYysiJnByZWZldGNoPXRydWUiKSl9KTtQcm9taXNlLmFsbChjLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gZX0pfSkpLnRoZW4oZnVuY3Rpb24oZCl7YS5iLmZvckVhY2goZnVuY3Rpb24oaCxtKXtkW21daW5zdGFuY2VvZiBWJiYoaC52YXN0X2RhdGE9ZFttXSl9KTtpZihhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pKWZvcih2YXIgZT1hLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pLGY9MDtmPGUubGVuZ3RoO2YrKylnLmoudHJhY2soInZydGNsenJfbm92YXN0IixlWzBdLmlkLnRvU3RyaW5nKCksITApO2EuYi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGgudmFzdF9kYXRhfSkubGVuZ3RoP2EuYS5nYShhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiBoLnZhc3RfZGF0YX0pKToKKGEuZigpLGEuTChhLmV2ZW50Lk9hLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSl9O1IucHJvdG90eXBlLk89ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5wbGF5ZXIub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe2EuQT0hMDtjLmRpc3BsYXk9YTthLkwoYS5ldmVudC5vYyxjKTthLlphKCJ0aW1ldXBkYXRlIixjKX0pO3RoaXMuYS5wbGF5ZXIub24oImVuZGVkIixmdW5jdGlvbihjKXthLkwoYS5ldmVudC5OYSxjKTthLlphKCJlbmRlZCIsYyl9KTt0aGlzLmEub24oInZpZGVvc3RhcnQiLGZ1bmN0aW9uKCl7YS5MKCJ1bmNsb3NlIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYz10aGlzO3RoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2MuTChjLmV2ZW50LmxjKTtjLlphKCJjbGlja3Rocm91Z2giLHt9KX0pfS5iaW5kKGEpLDApfSk7dGhpcy5hLm9uKCJjbG9zZSIsZnVuY3Rpb24oKXthLkwoImNsb3NlIik7CmEuWmEoImNsb3NlIix7fSl9KX07Ui5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3JldHVybiEwfTtSLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmYoKX07Ui5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMuYj1udWxsO3RoaXMuYSYmKHRoaXMuYT10aGlzLmEuWigpKX07Ui5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hJiZ0aGlzLmEucGxheWVyP3RoaXMuYS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTotMX07Ui5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hJiZ0aGlzLmEucGxheWVyP3RoaXMuYS5wbGF5ZXIuZ2V0RHVyYXRpb24oKTotMX07Ui5wcm90b3R5cGUubD1mdW5jdGlvbigpe307Ui5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5BPyh0aGlzLmEucmVzdW1lKCksdGhpcy5hLnBsYXllci5wbGF5KCkpOnRoaXMuSz90aGlzLmEuUmEoKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5wbGF5KCl9LAo1MCk7dGhpcy5MKCJ1bmNsb3NlIil9O1IucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5hJiZ0aGlzLmEucGxheWVyLnBhdXNlKCl9O1IucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7dmFyIGE9ITA7dGhpcy5hJiYoYT10aGlzLkE/dGhpcy5hLnBsYXllci5pc1BhdXNlZCgpOiEwKTtyZXR1cm4gYX07Ui5wcm90b3R5cGUuWGE9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLlhhKCl9O1IucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5hLnBsYXllci4kYSgpfTtSLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGxheWVyLmViKCl9O1IucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXt0aGlzLmEmJnRoaXMuYS5yZXNpemUoYSl9O1IucHJvdG90eXBlLnNiPWZ1bmN0aW9uKGEpe3RoaXMucGFyZW50PWE7dGhpcy5hLndiPWE7dGhpcy5hLmFwcGVuZCgpO3RoaXMuYS5zaG93KCl9O3koUyx2YSk7Uy5wcm90b3R5cGUubGE9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpczt0aGlzLmIuaWQ9ImxpbW8iO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYik7dGhpcy5CLmlkPSJsaW1vX3N3aXBlciI7dGhpcy5CLmNsYXNzTGlzdC5hZGQoInN3aXBlIik7dGhpcy5iLmFwcGVuZENoaWxkKHRoaXMuQik7dGhpcy5HLmlkPSJsaW1vX3N3aXBlcl9jb250ZW50Ijt0aGlzLkIuYXBwZW5kQ2hpbGQodGhpcy5HKTt0aGlzLmwuaWQ9Im1lbnUiO3RoaXMubC5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMubC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmwpO3RoaXMuTy5pZD0iaGVhZGVyIjt0aGlzLm09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7dGhpcy5tLmlkPSJsb2dvIjt0aGlzLm0uY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt2YXIgYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvbG9nby1zdm0ucG5nIjtnLmouYigic3BpZWdlbC5kZSIpJiYKKGM9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL2xvZ28tc3Bvbi5wbmciKTtnLmouYigid2ViLmRlIikmJihjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXdlYmRlLnBuZyIpO3RoaXMubS5zcmM9KGcudi5iKCJ2ZXJ0aWNhbGl6ciIpfHx7fSkubG9nb3x8Yzt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm0pO3RoaXMuZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmYuaWQ9ImNsb3NlIjt0aGlzLmYuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt0aGlzLmYuaW5uZXJIVE1MPSI8aW1nIHN0eWxlPSdtYXJnaW4tdG9wOjNweDttYXgtd2lkdGg6MjBweDsnIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCa0FBQUFaQ0FZQUFBREU2WVZqQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5VnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURZdU1DMWpNREF5SURjNUxqRTJORFEyTUN3Z01qQXlNQzh3TlM4eE1pMHhOam93TkRveE55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lESXhMaklnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1UWXhNakpHUmpsQ05UWXdNVEZGUVRnNE5rTkROVGRDUVRFNE1UUTJPRVFpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TVRZeE1qSkdSa0ZDTlRZd01URkZRVGc0TmtORE5UZENRVEU0TVRRMk9FUWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG94TmpFeU1rWkdOMEkxTmpBeE1VVkJPRGcyUTBNMU4wSkJNVGd4TkRZNFJDSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3hOakV5TWtaR09FSTFOakF4TVVWQk9EZzJRME0xTjBKQk1UZ3hORFk0UkNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BsMDhCSUlBQUFTZlNVUkJWSGphZkZaWFM2eEpFRzBRVWZRZmlHQkFUQmdRTSthTStpU1lYbFpNNkwzcU9ONVJ4Q3hpd0lBaWdpRCtBUjkyRjVabFFaYTcreUx1Z3k5bXhheVlzMnRXRExWVmpkWDJySElIK3B0dnFydnI5S211VXpYaTVlVkYzTjNkaWRqWTJGOHRMUzJQYW1wcXZnS0F1THE2RXB1Ym0ySmhZVUhNenM3S01UTXpJNytYbHBia1dGbFpFUnNiRzJKblowZGNYMThMMnRmZTNwNWpZV0Z4NU9ucE9Vbyt5Q1lmWVdGaHZ3bDg1ZEhiMjJzZysrSGhvWmlibS9zaHlOcmFtamc1T1pGK2hvYUc4dG1IbFpVVkJBUUVmSDk5ZlJVaU9qcjZkekxpQWtoT1RsWkFYVjFkNWJSeGZYMWRURTFOZlFwQ1kzZDNWd0lNREF3VThkN2EybG9ZR3h1VDc0R0JnWDhLbmlncUtvS25weWRBVmdxb3RiWFZTQTdveE5QVDAyWWdpNHVMWW10clN3TDA5L2NYOHA2eXNqSzR2THdFYjI5djVVZjA5ZlY5NFI4SkNRbnc4UEFBOGZIeGFrRmRYVjBsQXpFakFxQzdJRHN5THVhMVZWVlZjSEZ4QVhaMmRtcC9SMGVIU1M1RW9ESTJwcWFtd3ZQek0wUkdSdXBBRmJTT0dFeE9UdW9BaW9IQllJQ2JteHR3Y0hCUSs1cWJtMnZVeGRQbzdPd3M1MG5NTk1rb01URlJiY0NzazR3WUFFK29JbUF5bWVEOC9CenM3ZTFCczlXeGIwRzNqM2ZCNmFlQWtwS1NnRDU2NkJvYUdrcmZtUC9FdHBLU0VyaS92d2RIUjhjUEFMZTN0KzhnU0ZNT01qUTFOWmw0Y1Z4Y0hLQ0dJQ1VsUlRuQURQeUYzOHZMeStVZE9EazVnV1pySkQ5N2UzdmkrUGo0SFlRUUtkZlB6czZrRVdOcDFFTkhIMkttYTZtNHVCZ2VIeC9CMmRsWjJTb3FLdXBwUDRtVDd1LzA5TlFjaEFBbzUwbUFORkZmWDY4WVJVVkZTVVpwYVdueXQ5Rm9sQXgwQUxUVjg1MVI5cTJ1cm40T3NyKy9MMHNKQ3d3WkdheXRyVy9KQ1dVYkNRd3ZITWJIeDhIRnhZV1ZmVjlaV1ZuREFLUWxGcW9LRnoyb2RoRUl4WkVVVHZXS2dUQk1QMnZoK0JDNjhQRHdVVnBINnltOWFTK1ZHZ29aaXZJZEJMTkRoWXVvMGlLeWQzZDM1OW5hMnY3TEZXRmlZZ0l5TXpNQkhhblEyZGpZWERjMk5wYlIrdVhsWlZucnFCS1FQL0w3QVdSN2UxdnBBTk5aNlNBL1AxK1dDaDhmSC9rN0ppWUdNTVFLNksxZVNjSFNBU2thRkNxVndneEMyWFYwZE1SQ1Uwb3VMQ3lVTmMzVjFkVXN1NEtDZ2dEdkV6SXlNblFnV2VzT0RnNWtBcG1CMEoxd1A5Q1ZuSnViQzlnVEFIc0RhSmsyeXU4aElTR1NVWHA2dWw0WlROeVBXSHZ5d1lwSEpSZjhuNEc3dTd0eWdGbFVUZXZhMnRyVVFmejkvU1dqN094c3RhNmxwY1dvKzFXMUM4dTE2Z2M1T1RtQXpNREx5K3VERGlocjZCc3Z1NExuc0dmSTRxZ0Q0VUcrcWRwRmorSGg0VHllek12TGt3emMzTncrS0prRVJuMkYrNGhlR1h4OWZRRmJ1VHlnMW1GbDFvbkJ3Y0VjTm1abFpja1ljeGE5TVdqa3JDRWR6TS9QbXpVc0JGS1Z3Yy9QVDFZR25SRzJneStxTTVhV2xzbys0dUhob1JaVVYxZlhjUXZtemtnZzNCazVkQmdheFlpU2hHb2E3bjNQeHREUTBML29wYUNnQUlLRGc5VUUxaTRKUUdXR0FFaGtPZ2dORWgrbDY1dXV2dkZlL0FNQkl5TWpERG91RnlETjc3b0d1S05ScmxPN0pZRFBRT2lPaUNYL1crbnA2VEhvZmpBei8wRldsbktTYWt4RVJNUWYrTC9yQktsWGtRMnJySFJDdGVoSElNU1U3b2ZyRkdacENmbzV4b1AvemVMK1Q0QUJBTGNkT0xNZUJqRmJBQUFBQUVsRlRrU3VRbUNDJz48L2ltZz4iOwp0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YS5jbG9zZSgpO2EuSXx8KGcuai50cmFjaygidnJ0Y2x6cl9jbG9zZWQiLCIiLCEwKSxhLkk9ITApfSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubGFiZWwuaWQ9InRpdGxlIjt0aGlzLmxhYmVsLmlubmVySFRNTD0iTnVyIGVpbiBTcG90IElocmVyIFdhaGwiO3RoaXMubGFiZWwuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsKTt0aGlzLnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5zLmNsYXNzTGlzdC5hZGQoImxpbW9fc3Bpbm5lciIpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucyk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5PKX07Uy5wcm90b3R5cGUuUmE9ZnVuY3Rpb24oKXt0aGlzLkQ9ITF9OwpTLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt9O1MucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYm9keS1uby1zY3JvbGwiKTt0aGlzLndiLmZpcnN0Q2hpbGQ/dGhpcy53Yi5pbnNlcnRCZWZvcmUodGhpcy5jb250YWluZXIsdGhpcy53Yi5maXJzdENoaWxkKTp0aGlzLndiLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKX07Uy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn07Uy5wcm90b3R5cGUua2E9ZnVuY3Rpb24oKXt0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5PSJub25lIn07Uy5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7aGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYm9keS1uby1zY3JvbGwiKTtBcnJheS5mcm9tKHRoaXMuaSkuZm9yRWFjaChmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5yZW1vdmUoImNsb3NlZCIpfSk7CnRoaXMuRD0hMX07Uy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7QXJyYXkuZnJvbSh0aGlzLmkpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jbGFzc0xpc3QuYWRkKCJjbG9zZWQiKX0pO3RoaXMucGxheWVyLmlzUGxheWluZ3x8dGhpcy5rYSgpO3RoaXMuRD0hMDt0aGlzLkwoImNsb3NlIil9O1MucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPTMwLGQ7dGhpcy5LPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZD1wYXJzZUludChjJTYwLDEwKTtkPTEwPmQ/IjAiK2Q6ZDthLmxhYmVsLmlubmVySFRNTD0iTnVyIGVpbiBTcG90IElocmVyIFdhaGw8YnI+c3RhcnRldCBpbiAiK2QrIiBTZWt1bmRlbiI7ZG9jdW1lbnQuaGFzRm9jdXMoKSYmIWEuRCYmLTE+PS0tYyYmKGM9MzAsY2xlYXJJbnRlcnZhbChhLkspLGEubmEoKSl9LDFFMyl9O1MucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQ7RmMoZnVuY3Rpb24oZSl7c3dpdGNoKGUuYSl7Y2FzZSAxOmlmKCFhLmxlbmd0aClyZXR1cm4gZS5yZXR1cm4oKTtjLkE9YTtkPTA7Y2FzZSAyOmlmKCEoZDxjLkEubGVuZ3RoKSl7ZS5hPTQ7YnJlYWt9cmV0dXJuIHFjKGUsYy5oYShjLkFbZF0udmFzdF9kYXRhKSwzKTtjYXNlIDM6ZCsrO2UuYT0yO2JyZWFrO2Nhc2UgNDpjLkEuZm9yRWFjaChmdW5jdGlvbihmLGgpe2MuaS5wdXNoKGMuaWEoZixoKSk7Yy5lYShoKX0pLGUuYT0wfX0pfTtTLnByb3RvdHlwZS5oYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZSxmLGgsbTtyZXR1cm4gRmMoZnVuY3Rpb24oRCl7MT09RC5hJiYoZD0wKTtpZig1IT1ELmEpe2lmKCEoZDxhLmIubGVuZ3RoKSl7RC5hPTA7cmV0dXJufWU9YS5iW2RdO2Y9ZS5hPWMuZGEoZS5hKTtyZXR1cm4gcWMoRCxnLmoua2EoZlswXS51cmwpLDUpfWg9RC5iO209Zy5qLkIoaCk7ZS5hWzBdLnVybD0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iKwptO2QrKztELmE9Mn0pfTtTLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt2YXIgYz1OdW1iZXIoZy52LmIoImJpdHJhdGUiKSl8fDFFMzt0cnl7dmFyIGQ9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTEhPWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pO2E9ZC5jb25jYXQoZSl9Y2F0Y2goZil7fXJldHVybiBhfTtTLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz10aGlzLkFbdGhpcy51LmdldFBvcygpXTtnLmoudHJhY2soInZydGNsenJfY2hvc2VuX2F1dG8iLHRoaXMudS5nZXRQb3MoKSwhMCk7dGhpcy5VKCk7CnRoaXMuTCgidmlkZW9zdGFydCIpO3ZhciBkPWMudmFzdF9kYXRhLGU9Yy5pZDtmZXRjaChnLmoubyhjLnNyYywhMCkpLnRoZW4oZnVuY3Rpb24oKXthLnBsYXllci5jKHtpZDplLGFsaWFzOmEuYS5xY30pO3ZhciBmPWQuWWMoKTthLmEud2Q9Zi5VYjthLmEuTCgiU0hPV0NPTlRST0xTIik7YS5wbGF5ZXIuc3RhcnQoZil9KX07Uy5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7QXJyYXkuZnJvbSh0aGlzLmNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihjKXtjIT1hLnBsYXllci5jb250YWluZXImJmMhPWEuTyYmYyE9YS5tJiZjIT1hLmxhYmVsJiYoYy5zdHlsZS5kaXNwbGF5PSJub25lIik7Yz09YS5sYWJlbCYmKGEubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgaWhyZXIgV2FobCIsYS5sYWJlbC5zdHlsZS5tYXJnaW5Ub3A9IjdweCIpfSk7dGhpcy5mLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmMuc3R5bGUuekluZGV4PSIxMTAwMCI7dGhpcy5jLnN0eWxlLnRvcD0KIjcwcHgiO3RoaXMuYy5zdHlsZS5yaWdodD0iMHB4Ijt0aGlzLmMuc3R5bGUuY29sb3I9IndoaXRlIjt0aGlzLmMuc3R5bGUuZm9udEZhbWlseT0iUm9ib3RvLCBhcmlhbCwgc2Fucy1zZXJpZiI7dGhpcy5jLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jLmlubmVySFRNTD0nPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmOyBvcGFjaXR5OiAwLjc7IHBhZGRpbmc6IDZweDsgYm9yZGVyOiAjRkZGRkZGOyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsiPk1laHIgZXJmYWhyZW48L2Rpdj4nO3RoaXMuYy5vbmNsaWNrPXRoaXMuYS5SYy5iaW5kKHRoaXMuYSk7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jKX07Uy5wcm90b3R5cGUucWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuVysrO3RoaXMuVz49dGhpcy5pLmxlbmd0aCYmKGcuai50cmFjaygidnJ0Y2x6cl9hbmltYXRpb25zdGFydCIsCiIiLCEwKSx0aGlzLmkucmV2ZXJzZSgpLHRoaXMuaS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7c2V0VGltZW91dChmdW5jdGlvbigpe2MuY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKTthLm9hKGQpO2QhPT1hLmkubGVuZ3RoLTE/c2V0VGltZW91dChmdW5jdGlvbigpe2MuY2xhc3NMaXN0LmFkZCgib3V0Iil9LDc1MCk6c2V0VGltZW91dChmdW5jdGlvbigpe2Euc2EoKX0sNzUwKX0sNzUwKmQpfSksdGhpcy5pLnJldmVyc2UoKSl9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dGhpcy5tLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMubC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMuZi5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO3RoaXMuRy5jbGFzc0xpc3QuYWRkKCJzd2lwZS13cmFwIik7dGhpcy5zLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5zKTt0aGlzLmxhYmVsLmlubmVySFRNTD0KIk51ciBlaW4gU3BvdCBJaHJlciBXYWhsPGJyPnN0YXJ0ZXQgaW4gMzAgU2VrdW5kZW4iO2Zvcih2YXIgYT10aGlzLmkubGVuZ3RoLTE7MDw9YTthLS0pdGhpcy5pW2FdLmNsYXNzTGlzdC5yZW1vdmUoIm91dCIpO3RoaXMuUCgwKTt0aGlzLnBhKCk7dGhpcy5tYSgpfTtTLnByb3RvdHlwZS5pYT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTGlzdC5hZGQoInN3aXBlLWl0ZW0iKTtlLmNsYXNzTGlzdC5hZGQoInN0YXJ0Iik7Zy5qLmZiKGEucG9ydHJhaXRfaW1hZ2VfdXJsfHxhLmltYWdlX3VybCkudGhlbihmdW5jdGlvbihoKXtmZXRjaChoKS50aGVuKGZ1bmN0aW9uKG0pe3JldHVybiBtLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24obSl7ZS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZT0iY292ZXIiO2Uuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoJyIrVVJMLmNyZWF0ZU9iamVjdFVSTChtKSsiJykifSkudGhlbihmdW5jdGlvbigpe2QucWEoKX0pfSk7CnZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2YuY2xhc3NMaXN0LmFkZCgiaWNvbi1wbGF5Iik7Zi5zZXRBdHRyaWJ1dGUoImRhdGEtaWQiLGMpO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7Yy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRWdBQUFCSUNBWUFBQUJWN2JOSEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVZwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRNElEYzVMakUyTkRBek5pd2dNakF4T1M4d09DOHhNeTB3TVRvd05qbzFOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJREl4TGpFZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNREUyTWpjeE4wUTFOakpETVRGRlFVSXhRVE5DUWpBd1JUTkJOa0UzT0VZaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk1ERTJNamN4TjBVMU5qSkRNVEZGUVVJeFFUTkNRakF3UlROQk5rRTNPRVlpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvd01UWXlOekUzUWpVMk1rTXhNVVZCUWpGQk0wSkNNREJGTTBFMlFUYzRSaUlnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG93TVRZeU56RTNRelUyTWtNeE1VVkJRakZCTTBKQ01EQkZNMEUyUVRjNFJpSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbWZ1K3RVQUFBajNTVVJCVkhqYTVKeC9iRlBYRmNmdnM1L3QrRWVNN1dEeXkrRm4yZ0loSTJFdEN4QWdDUzFTdDBJSFNsczJDbDNYcllPbFk2Qk5kRkpWVFdocllXcTcwaUZhRkdtTVRtdW5UbUZiMTBGYXVnRnRhRUxhTkZCQ0EwNGdKSEZpNDlpeEV5Y2tzYkdkM1ROZnN6Y3JUbUw3dnVjZlBkTDNINGp2OC92NDNIUFB1YjhZSkt5SnNQS3dERmlaUkxPd2xGZ3lyRFR5ZDJOWWJxeGJXSDFZVnFJZUxCT1dYNmd2ekFqd0RDMVdNZFpDckx1d0ZERzJONExWam5VVnF4bHJJQmtCU2JEdXhWcUZsYy9qYzhDVHJtQTFFbGkzRXgyUUhLc0NxeHdyWGVEdU80UjFCdXMwMW1paUFXSUpsRzlTNkVLeEdzU3RXZ0xMbXdpQTdzRjZuQVRiUkRJSTduL0NNc1lMa0JTckVtdU5RTUUrR2h2SCtoaXJCc3NqSkNBWW5uZGc1YURrTURQV0VaSXFSR1RpS0I2MkdHczNsZzRsajhHQXNRS3JHOHZHSjZBU3JLZEo5MG8yZzRGa09aYURKSnpVQWEzRzJrNnk0V1ExQ0NsTHNRYUpOMUVEOUhXc0o1SWNEaGZTRWhLUHpEUUFMU1FCV1l4U3g0S2UxSUZsandVUWpGWjdTQ0daYWdhOW9RanJBa2t1dy83UlpIbk9EbEkrcEtySnlUdEtvL0dnUjdFS1VlcGJPaW1QTGtmaVFWQ0JyMFZmSFZ0TDNubGFIZ1RRcXJEVUZDTWlNMCtuMTI4c3I3aG5mbVpXaGd3eE11dmdnQ3ZCZ3ZaY3JEcFNua3dLYUIxSkNLbkJlZkhaNThyK2N1cmtxbzFiSHN0OTdNbnZ6UzVic3liWDBkbkZ5TWFSekRMZ0hFd1FTR295VGRJeEdhQXBnMWFrdG1QTDF1VXZISDZ0d092MW92SHhjZVQzKzFGR1ZwYWtjdnMyUTg0c3ZkcmUyZVhYeXVWS2l6TWhRTTBqeGEwM0hLRDFOQVB6M0prWitpUEhqcTVNMTJqWjBQOERVSGN2V2FKODlJbnRjejJETHFiZmJQYWJIWTU0UTVLUXFyOTlJa0FTMm5WV3JpNUQrOXdMTHk0Q0dCUE9SV0NQRW9sRWFFVkZ1ZTdoelp2bit1ejlNdC9vQ0l0QkRjUVJVaTRLVExiNVF3RjlneFJ6MUN4dnBrNzc5SzZmNW9jRHhBVWxWNmxFRDI3ZW5MbHNXWkhlYVRhSk5DcTV5bVMxT2VNQUNCeWtMMWpRY2dGdHdjcWdDaWhMci8xQjFVOFdUQVdJMisyeURIbXlSN1p1TTZpVUtzV28weWJHVFdpNnpWYUh3SkJVV1BYY1BFZ1hMZytJeGNReVNjVDFHM2lURDRPcTNMb3Q2NTMzYWt1LzlkRERzOWVXRk44dE1LQUZoTWtkRDFwQktseTZRMEoyWnNhVFA5bzViN29lRkFwS3pMS290S3hjVjFHK0xtZlVaWmZLcFNLRlFON0VrSG1qRzBGQUc3SDB0SjlpME9zMDM5OVpOVDhhUUZ4UWFvMVd2R0ZUWmRiOE9mTzBMc2ROY1ZhR2RrWm5qNlZmQUVpTkxPbG0rWHc4d2V2MVVWa2lCa2lRUjYxZTk0Qm1aVmw1eVZ2SGp2YUtHSkhvZEVQVFZSNEJBUk14ZU5BY3JESStucENOZitrZlByTXJQeFlQQ2dYRk1Bd3F2dmMrOVladmI4cER0MXdLNVBGSVRkWStQcm9kc0xra0pvbmgxL2dBTkNkemx1NnBIeit6Z0JZZ0xpaFpXaHF6L3FHTittWEZ4WHJuelI2eFJwT3VOcGx2MHU1MlhRQm9KVW14cVZ2ZXpBenRVMVgwQVhIVGdzeWNYR25sZHgvUDFjMVFLOGFHbkpMWmhweVpIVjBtRzZWSDlBTWdXRExtWlZWVXExQ29kdTdlY3hkZmdMZ2V0YkNnVUxtcDhwRThsOVBwOTdwSHBEZTZlK3dVbWg0R1FBOGluallhcUZpSmJOZmV2WXY0Qm5TbmJNRWh0YVIwdGViK0I5Ym5vdHNqU3FWVW9yeGhpZ21VVjBTeVJuNjZBSHhyZ2Mzbjg2SE03QnoyNWQrOXNmajVmZnNLVnk0dGpHV0VUZ2RBS1RjaEgwd0xWcTJ0MEJ3NmNtUjVmbTVPdEV2a1VsNEJTU1JzWEplS29Hc1hMUzlSRlN4YUdHMk5tU1pDRlBiUWhQVlBwVUtXQ041a3lEVW9vLzA4QUhMejVrRnBrcml2eEVKaTJkWGRNUlRseDkzd0FtTjhmVGt4SzQ0cklKaU0rN1Mrem1XODF1R01CZEFvYis2TmhCL0ZnbDdEc2l3NlYzZG00QmMvMzlQY2JqS2JvMnhxQ0lwVm1ONDA4SVZJYUJQalhNaHFOWHQvKzhyKzlwYVdGc2RIalJmYVltak9DWUJzdlAyU0xDc1NzanQ1UEc1VVhYMm8rOFEvLzlIei9nY2ZYNmJRckEwQTlmTDFwVm1wVkN4RWR3STR0Ylh2OWg4Nzl2dU9vU0dYNTlTcGMxOVNhcjRYQUpsNGMzY3B2eDRFY2FhMTlkTG9hd2RmYXVzMmRROVRCQk0wVXhBUXJBVlIzMVluWWxtR3J6ampjZzJNSHp5NHY3MmhvYUh2d3cvclczbDRqQ2NJeUlkMURRVTJaOUtPQ3d6dE9PUHplZEdiZjZqdXFhbDVwNnYyQStvZXd6Vmc0Z3V1ZUxid0FRaU4wd0VFY1FhODV1eS9UamdPSDNyVmFMUDNqOVdkdjlUT2MzajdiNUFQQXJxSUF2dUJxUDdpWWpiMlRCckFkRjF2Y3gvNDlmTmZYcmxxSERqMzJlVnJRbFFvS0xEejdBNGdtTk85amloUDNvdkUwUU9DN3VRZUcwVUg5dit5N2VTSmsxMk5YeGh2Q0poT1hTZE1FSGRUd1RuYWdCZ204aTRXR0xZWjlMZmpiMXVyWHo5a2RBME91UVdHQS9iSm5aR1M4NDlOS0hEMlFvWGlaREJzWDJ4dUdQN05nVisxV2l5V1czWDF2TWVaaVd3WTY3T0pBTUZoTk5qVnNJSGFvN3orOGVuR0didk40bjE1L3o1anc2Zm5yWitjRnlUT2hMTXppSE13TDNUZnpyOVJZSWNabFROZjdqR1B6K1VhUkhLNUlteWM4WHB2bytyREwzVWVyNm5wUEZ0L3NRM0YxMFlJZy8vOWVLRy9PY21MQ21nOFRhUEdOaU05cmFoNFdUcDNlanBZYmIvL1hvMTk3NTZxNXFhbXorMTFqWEhwVHFIMkxnbzVYelpScmRTSkFvZHdZOTdFYWVtek9vWUhIYXg2aGxLK2FIR2hFandHdXBQeFNzdm9zN3QzZnZIM3Z4N3ZQRjEvb2MxazduTWtBQnlvU2Q4TW5ZSUlOOHJBNmVTZjBjcUwxdDlmV3FDVVNrVFpPZGtLdTgwMjF0UGJPMXpmMUhvZEpZNEJsRmNRWit2ZFZJREF2b040V3JOUFFEdUw5ZWNKNCtRa0h6b092ZVFyQU1kQzNoVkZDZ2lxMlRjUWoxT3lDV0NqNUIzRG5tZWRha0xyRmduYTk2SFVPQ3NXT21LL2p0VTFhWTQyallaZ2JidVBqR3hNaXNDQnpRSkhzUzVObWNST3MwRllGWUN6RllVcEFBbEdyTGV4ems4cnk0K2c0VzdpVFV1VEdCSjR6aCs1eFNoTlFHQ3d1Um9xNjZJSnlwUkV0ekVTa0pzaitWQTBxdzZ3VEFTVFNYQWxSWHFTd0lFUThTcjVjUkhmZ0lLald3TUtYSXcwQnlYKzFSVFZKSVpHYkRSZURFNUZiMFdKZWJuSld5aHdFVlBVbG9yWDQ4Q1V4VW1VUU5mamNBM2dWSkFhTGg0WExIMUU1bk5HYURYSzV4VmRrSDJYWXMxSC9GN1JaU1R4TUNtdTZKcklNa2hhc0lSTW8waGliTzgybVphQWRhdlBVWkplOGpiWnFBblhCTUtwUHU0MWdiQlFBRmNFU2ptRk11UXR3K2ovcndtRVNTMVlLdmNKOVlYL0k4QUFKWXZmbHVPaStKRUFBQUFBU1VWT1JLNUNZSUk9IjsKZi5hcHBlbmRDaGlsZChjKTtlLmRhdGE9YTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaWQ9InN1YmxpbmUiO2MuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJsYWJlbCI+JythLnN1YmxpbmUrIjwvZGl2PiI7ZS5hcHBlbmRDaGlsZChjKTtlLmFwcGVuZENoaWxkKGYpO3RoaXMuRy5hcHBlbmRDaGlsZChlKTtyZXR1cm4gZX07Uy5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO0FycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaWNvbi1wbGF5IikpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtaWQiKTtkJiZjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoYS5LKTtnLmoudHJhY2soInZydGNsenJfY2hvc2VuIixhLnUuZ2V0UG9zKCksITApO2EuVSgpO2EuTCgidmlkZW9zdGFydCIpO3ZhciBlPWEuQVtkXSxmPWUudmFzdF9kYXRhLGg9ZS5pZDtmZXRjaChnLmoubyhlLnNyYywKITApKS50aGVuKGZ1bmN0aW9uKCl7YS5wbGF5ZXIuYyh7aWQ6aCxhbGlhczphLmEucWN9KTt2YXIgbT1mLlljKCk7YS5hLndkPW0uVWI7YS5wbGF5ZXIuc3RhcnQobSl9KX0pfSl9O1MucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnU9bmV3IFN3aXBlKHRoaXMuQix7c3RhcnRTbGlkZTowLGF1dG86ITEsZHJhZ2dhYmxlOiExLGF1dG9SZXN0YXJ0OiExLGNvbnRpbnVvdXM6ITAsZGlzYWJsZVNjcm9sbDohMCxzdG9wUHJvcGFnYXRpb246ITAsdHJhbnNpdGlvbkVuZDpmdW5jdGlvbihjKXthLnRhKGMpO2EuWXx8KGEuWT0hMCxnLmoudHJhY2soInZydGNsenJfYW5pbWF0aW9uZmluaXNoZWQiLCIiLCEwKSl9fSk7dGhpcy5mYSgpfTtTLnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt0aGlzLlAoYSl9O1MucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5sLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxpbW9idXR0b24iKTtjLmxlbmd0aCYmKEFycmF5LmZyb20oYykuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfSksCmNbYV0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikpfTtTLnByb3RvdHlwZS5vYT1mdW5jdGlvbihhKXt0aGlzLmwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGltb2J1dHRvbiIpW2FdLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKX07Uy5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPXRoaXMubC5maXJzdEVsZW1lbnRDaGlsZCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7ZS5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2YuY2xhc3NMaXN0LmFkZCgibGltb2J1dHRvbiIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Yy51LnNsaWRlKGEsNTApO2MuUChhKX0pO2UuYXBwZW5kQ2hpbGQoZik7ZC5hcHBlbmRDaGlsZChlKX07Uy5wcm90b3R5cGUuYmE9ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7CnRoaXMuTCgiY29tcGxldGUiKX07Uy5wcm90b3R5cGUuWj1mdW5jdGlvbigpe2Zvcihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJvZHktbm8tc2Nyb2xsIik7dGhpcy5iLmZpcnN0Q2hpbGQ7KXRoaXMuYi5yZW1vdmVDaGlsZCh0aGlzLmIubGFzdENoaWxkKTt0aGlzLmImJnRoaXMuYi5wYXJlbnRFbGVtZW50JiZ0aGlzLmIucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmIpO3RoaXMuY29udGFpbmVyJiZ0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50JiZ0aGlzLmNvbnRhaW5lci5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtyZXR1cm4gbnVsbH07eShjYSx2YSk7Y2EucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dGhpcy5PPWEuaWQ7dGhpcy5QPWEuYWxpYXN9O2NhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9YmIucG9wKCk7YXx8KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSxhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7CnJldHVybiBhfTtjYS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5CKGEpfTtjYS5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXt2YXIgYz10aGlzO0ZjKGZ1bmN0aW9uKGQpe2MuYS5zcmM9YTtjLmEubG9hZCgpO2MucGxheSgpO2QuYT0wfSl9O2NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmEuc3JjJiZ0aGlzLmEucGxheSgpLmNhdGNoKGZ1bmN0aW9uKCl7Zy5qLnRyYWNrKCJ2cnRjbHpyX3Byb21pc2VmYWlsdXJlIiwiIiwhMCk7YS5wYXJlbnQuY2xvc2UoKTthLnBhcmVudC5hLkwoYS5wYXJlbnQuYS5ldmVudC5OYSl9KX07Y2EucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5hLnBhdXNlKCl9O2NhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmEuY3VycmVudFRpbWUmJiF0aGlzLmEucGF1c2VkfTtjYS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnBhdXNlZH07CmNhLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEubXV0ZWR9O2NhLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe3RoaXMuYS5tdXRlZD0hMH07Y2EucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7dGhpcy5hLm11dGVkPSExfTtjYS5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmN1cnJlbnRUaW1lfTtjYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmR1cmF0aW9ufTtjYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmlkKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5iLndpZHRoKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuYi5oZWlnaHQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoInByZWxvYWQiLHRoaXMuYi5wcmVsb2FkKTt0aGlzLmEuc2V0QXR0cmlidXRlKCJ3ZWJraXQtcGxheXNpbmxpbmUiLCJ0cnVlIik7CnRoaXMuYS5zZXRBdHRyaWJ1dGUoInBsYXlzaW5saW5lIiwidHJ1ZSIpO3RoaXMud2IuYXBwZW5kQ2hpbGQodGhpcy5hKTt0aGlzLmEucmVtb3ZlQXR0cmlidXRlKCJjb250cm9scyIpfTtjYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe307Y2EucHJvdG90eXBlLkk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7fSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIixmdW5jdGlvbigpe2EuaSgpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe3ZhciBkPWMuY3VycmVudFRhcmdldDtjLmN1cnJlbnRUaW1lPWQuY3VycmVudFRpbWU7MDxkLmR1cmF0aW9uJiZhLkwoInRpbWV1cGRhdGUiLGMpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2EuTCgiZXJyb3IiKX0pO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsCmZ1bmN0aW9uKCl7fSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7YS5MKCJwbGF5aW5nIil9KX07eShOYSxjYSk7TmEucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGEpe3RoaXMuamE9YS5qYTt0aGlzLmw9YS5hO3RoaXMuZm9ybWF0PWEuYVswXS5mb3JtYXQ7Y2EucHJvdG90eXBlLnN0YXJ0LmNhbGwodGhpcyxhLmFbMF0udXJsKX07TmEucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXt0aGlzLmEuc3R5bGUub2JqZWN0Rml0PSJjb3ZlciI7dmFyIGE9dGhpcy5hLm9mZnNldFdpZHRoL3RoaXMuYS5vZmZzZXRIZWlnaHQ7aWYoImxhbmRzY2FwZSI9PT10aGlzLmZvcm1hdHx8InNxdWFyZSI9PT10aGlzLmZvcm1hdCl0aGlzLmEuc3R5bGUub2JqZWN0Rml0PS41NjI1PmE/ImNvbnRhaW4iOiJjb3ZlciI7InBvcnRyYWl0Ij09PXRoaXMuZm9ybWF0JiYodGhpcy5hLnN0eWxlLm9iamVjdEZpdD0iY29udGFpbiIpfTtOYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3ZhciBhPQp0aGlzO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpezA8YS5hLmR1cmF0aW9uJiZhLksoYS5hLmN1cnJlbnRUaW1lKX0pO3RoaXMuYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsZnVuY3Rpb24oKXthLnUoKX0pfTtOYS5wcm90b3R5cGUuSz1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7YSE9PXRoaXMuZiYmKDA9PT1hJiYodGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZy5qLnRyYWNrKCJ2cnRjbHpyX2ltcHJlc3Npb24iLCIiLCEwKSksYT09PU1hdGguZmxvb3IodGhpcy5hLmR1cmF0aW9uLzQpJiZ0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksYT09PU1hdGguZmxvb3IodGhpcy5hLmR1cmF0aW9uLzIpJiZ0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGE9PT1NYXRoLmZsb29yKDMqdGhpcy5hLmR1cmF0aW9uLzQpJiZ0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksCnRoaXMuZj1hKX07TmEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfZW5kZWQiLCIiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuTCgiZW5kZWQiKTt0aGlzLnBhcmVudC5hLlphKCJlbmRlZCIse30pfTtOYS5wcm90b3R5cGUudHJhY2s9ZnVuY3Rpb24oYSl7dGhpcy5BKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9e307ImltcHJlc3Npb24iPT09YSYmYy5pZC5pbmNsdWRlcygiSE9NQURfIikmJihkPXtob21hZF9pbXBfcHJlZml4OiJ2ZXJ0aWNhbGl6ci0ifSk7ZmV0Y2goZy5qLm8oYy51cmwsITEsZCkpfSk7dGhpcy5qYT10aGlzLm0oYSl9O05hLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmphLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy50eXBlPT09YX0pfTtOYS5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qYS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMudHlwZSE9PWF9KX07VGEucHJvdG90eXBlLmI9CmZ1bmN0aW9uKGEpe3RoaXMuamE9dGhpcy5qYS5jb25jYXQoYSl9O0lhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLkMucXVlcnlTZWxlY3RvcigiVkFTVEFkVGFnVVJJIil9O0lhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztyZXR1cm4gRmMoZnVuY3Rpb24oZCl7aWYoMT09ZC5hKXthLmphPWEubygpO2EuZz1hLkYoKTtpZighYS5BKCkpcmV0dXJuIGEuYj1hLm0oKSxhLnUoKT9kLnJldHVybihuZXcgamEoYS5qYSxhLmIsYS5nLGEuQykpOmQucmV0dXJuKG5ldyBUYSgtMSE9YS5nZXREdXJhdGlvbigpP25ldyBDKEMuZik6bmV3IEMoQy5sKSx7QzphLkN9KSk7YS5zPW5ldyBuYihhLkMucXVlcnlTZWxlY3RvcigiVkFTVEFkVGFnVVJJIikudGV4dENvbnRlbnQpO3JldHVybiBxYyhkLGEucy5sb2FkKCksMyl9Yz1kLmI7Yy5iKGEuamEpO3JldHVybiBkLnJldHVybihjKX0pfTtJYS5wcm90b3R5cGUubz1mdW5jdGlvbigpe3ZhciBhPQp0aGlzO1siTm9uTGluZWFyQWRzIiwiQ29tcGFuaW9uIl0uZm9yRWFjaChmdW5jdGlvbihkKXtBcnJheS5mcm9tKGEuQy5xdWVyeVNlbGVjdG9yQWxsKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX0pfSk7dmFyIGM9W107IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmZyb20oYS5DLnF1ZXJ5U2VsZWN0b3JBbGwoZCkpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIGY9ZS5nZXRBdHRyaWJ1dGUoImlkIil8fGQudG9Mb3dlckNhc2UoKSxoPWUuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCksbT1lLmdldEF0dHJpYnV0ZSgib2Zmc2V0Iil8fGQudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmYsdHlwZTpoLHVybDplLnRleHRDb250ZW50LApyZXF1ZXN0OmEuaShlLnRleHRDb250ZW50KSxvZmZzZXQ6bX0pfX0pfSk7cmV0dXJuIGN9O0lhLnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFZlcmlmaWNhdGlvbnMiKVswXTtyZXR1cm5bXS5zbGljZS5jYWxsKGE/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uIik6W10pfTtJYS5wcm90b3R5cGUubT1mdW5jdGlvbigpe3ZhciBhPVtdO0FycmF5LmZyb20odGhpcy5DLnF1ZXJ5U2VsZWN0b3JBbGwoIk1lZGlhRmlsZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPXt9O0FycmF5LmZyb20oYy5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZS5sb2NhbE5hbWVdPWUudmFsdWV9KTtkLmZvcm1hdD0xKmQud2lkdGg+MSpkLmhlaWdodD8ibGFuZHNjYXBlIjoxKmQud2lkdGg9PTEqZC5oZWlnaHQ/InNxdWFyZSI6InBvcnRyYWl0IjtkLnVybD1jLnRleHRDb250ZW50O2EucHVzaChkKX0pO3JldHVybiBhfTsKSWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmdldER1cmF0aW9uKCl9O0lhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3RyeXt2YXIgYT1FYih0aGlzLkMucXVlcnlTZWxlY3RvcigiRHVyYXRpb24iKS50ZXh0Q29udGVudC5zcGxpdCgiOiIpKSxjPWEubmV4dCgpLnZhbHVlLGQ9YS5uZXh0KCkudmFsdWUsZT1hLm5leHQoKS52YWx1ZTtyZXR1cm4gMzYwMCorYys2MCorZCsgK2V9Y2F0Y2goZil7cmV0dXJuLTF9fTtJYS5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXtyZXR1cm4gRGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgRGEubz9EYS5vKGEpOm5ldyBSZXF1ZXN0KGEse21ldGhvZDoiR0VUIn0pfTt5KG5iLElhKTtuYi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOnJldHVybiBxYyhoLGEubChhLnNyYykuY2F0Y2goZnVuY3Rpb24obSl7dGhyb3cgbmV3IFRhKG5ldyBDKEMuYiksCntlcnJvcjptfSk7fSksMik7Y2FzZSAyOnJldHVybiBjPWguYixxYyhoLGEuZihjKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBuZXcgVGEobmV3IEMoQy5iKSx7ZXJyb3I6bSxyZXNwb25zZTpjfSk7fSksMyk7Y2FzZSAzOnJldHVybiBkPWguYixhLmE9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhkLCJ0ZXh0L3htbCIpLGEuQz1hLmEucXVlcnlTZWxlY3RvcigiQWQiKSxhLkM/cWMoaCxhLnBhcnNlKCkuY2F0Y2goZnVuY3Rpb24obSl7dGhyb3cgbTt9KSw0KTooZT1uZXcgVGEobmV3IEMoQy5nKSxhLkMpLGUuYihhLmMoKSksaC5yZXR1cm4oZSkpO2Nhc2UgNDpyZXR1cm4gZj1oLmIsaC5yZXR1cm4oZil9fSl9O25iLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5kYT9EYS5kYShhKTpmZXRjaChuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KSl9O25iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3JldHVybiBGYyhmdW5jdGlvbihjKXtpZigxMD4KTWF0aC5hYnMoYS5zdGF0dXMtMjAwKSYmYS5ib2R5KXJldHVybiBjLnJldHVybihhLnRleHQoKS50aGVuKGZ1bmN0aW9uKGQpe3JldHVybiBkfSkpO25ldyBDKEMuYix7cmVzcG9uc2U6YX0pO2MuYT0wfSl9O25iLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkVycm9yIikpLmZvckVhY2goZnVuY3Rpb24oZCl7aWYoZCl7dmFyIGU9ZC5nZXRBdHRyaWJ1dGUoImlkIil8fGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmUsdHlwZToiZXJyb3IiLHVybDpkLnRleHRDb250ZW50LHJlcXVlc3Q6YS5pKGQudGV4dENvbnRlbnQpfSl9fSk7cmV0dXJuIGN9O3koVix2YSk7Vi5wcm90b3R5cGUuWWM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iLnNoaWZ0KCl9O1YucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpczt0aGlzLnNyYz1hO3RoaXMudSgpLnRoZW4oZnVuY3Rpb24oKXtjLkwoImNvbXBsZXRlIiwKYyl9KS5jYXRjaChmdW5jdGlvbihkKXtjLkwoImVycm9yIixkKX0pfTtWLnByb3RvdHlwZS5iYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3JldHVybiBGYyhmdW5jdGlvbihkKXtyZXR1cm4gMT09ZC5hPyhjLnNyYz1hLHFjKGQsYy51KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBjfSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBDKEMuYix7ZXJyb3I6ZX0pfSksMikpOmQucmV0dXJuKGQuYil9KX07Vi5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcztyZXR1cm4gRmMoZnVuY3Rpb24oZCl7cmV0dXJuIHFjKGQsYy5HKGEpLDApfSl9O1YucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZDtyZXR1cm4gRmMoZnVuY3Rpb24oZSl7c3dpdGNoKGUuYSl7Y2FzZSAxOnJldHVybiBxYyhlLGEuUChhLnNyYykuY2F0Y2goZnVuY3Rpb24oZil7dGhyb3cgbmV3IEMoQy5iLGYpO30pLDIpO2Nhc2UgMjpyZXR1cm4gYz1lLmIscWMoZSxhLk8oYykuY2F0Y2goZnVuY3Rpb24oKXt0aHJvdyBuZXcgQyhDLmIsCntyZXNwb25zZTpjfSk7fSksMyk7Y2FzZSAzOnJldHVybiBkPWUuYixxYyhlLGEuRyhkKSw0KTtjYXNlIDQ6ZS5hPTB9fSl9O1YucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuQSgpLnRoZW4oZnVuY3Rpb24oKXthLkwoImNvbXBsZXRlIixhKX0pLmNhdGNoKGZ1bmN0aW9uKGMpe2EuTCgiZXJyb3IiLGMpfSl9O1YucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLmRhP0RhLmRhKGEsdGhpcy5kYSk6ZmV0Y2gobmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSkpfTtWLnByb3RvdHlwZS5PPWZ1bmN0aW9uKGEpe2lmKDEwPk1hdGguYWJzKGEuc3RhdHVzLTIwMCkpcmV0dXJuIGEudGV4dCgpLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGN9KTt0aHJvdyBuZXcgQyhDLmIse3Jlc3BvbnNlOmF9KTt9O1YucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7dHJ5e2MuYT0KKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoKG0pe3Rocm93IG5ldyBDKEMubyx7ZXJyb3I6bSxyZXN1bHQ6YX0pO31kPWMuYS5maXJzdENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7c3dpdGNoKGQpe2Nhc2UgInZhc3QiOmMuTGE9QXJyYXkuZnJvbShjLmEucXVlcnlTZWxlY3RvckFsbCgiQWQiKSk7Yy5jPTAhPT1jLmEucXVlcnlTZWxlY3RvckFsbCgiQWRbc2VxdWVuY2VdIikubGVuZ3RoO2MuYyYmKGMuRD1jLmEucXVlcnlTZWxlY3RvckFsbCgiQWRbc2VxdWVuY2VdIikubGVuZ3RoKTtjLmw9MTxjLkxhLmxlbmd0aCYmIWMuYzticmVhaztjYXNlICJ2bWFwOnZtYXAiOmMuWT0hMDtjLmYoInByZXJvbGwiKTtjLmYoIm1pZHJvbGwiKTtjLmYoInBvc3Ryb2xsIik7Yy5MYS5sZW5ndGh8fGMuZigpO2JyZWFrO2Nhc2UgInBsYXlsaXN0IjpjLlc9ITA7Yy5tKCJQcmVyb2xsIik7Yy5tKCJNaWRyb2xsIik7Yy5tKCJQb3N0cm9sbCIpO2JyZWFrOwpkZWZhdWx0OnRocm93IGU9bmV3IEMoQy5nKSxjLmkucHVzaChuZXcgVGEoZSx7dmFzdDpjLmF9KSksZTt9Yy5MYS5sZW5ndGh8fChmPW5ldyBUYShuZXcgQyhDLmcpLHt9KSxmLmIoYy5JKCkpLGMuaS5wdXNoKGYpKTtyZXR1cm4gaC5yZXR1cm4oYy5BKCkpfSl9O1YucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGMsZCxlO3JldHVybiBGYyhmdW5jdGlvbihmKXtpZigxPT1mLmEpe2lmKCEoYS5iLmxlbmd0aDxhLkQmJmEuTGEubGVuZ3RoKSl7Zi5hPTM7cmV0dXJufWM9YS5aO2Q9Yy5wdXNoO3JldHVybiBxYyhmLGEuVihhLkxhLnNoaWZ0KCkpLDQpfWlmKDMhPWYuYSlkLmNhbGwoYyxmLmIpLGYuYT0xO2Vsc2V7aWYoYS53YylyZXR1cm4gZi5yZXR1cm4oYSk7ZT1uZXcgQyhDLmMse2RldGFpbHM6Qy5hLk5kfSk7YS5aYygpJiYoZT1uZXcgQyhDLmMse2RldGFpbHM6Qy5hLm1kfSkpO2EuaS5wdXNoKG5ldyBUYShlLHt2YXN0OmEuYX0pKTt0aHJvdyBlO319KX07Vi5wcm90b3R5cGUuWmM9CmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuYi5sZW5ndGg7YysrKXRoaXMuYltjXS5aYygpJiYoYT0hMCk7cmV0dXJuIGF9O1YucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkLGU7cmV0dXJuIEZjKGZ1bmN0aW9uKGYpe2lmKDE9PWYuYSlyZXR1cm4gZD1uZXcgSWEoYSxhLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSkscWMoZixkLnBhcnNlKCkuY2F0Y2goZnVuY3Rpb24oaCl7cmV0dXJuIGh9KSwyKTtlPWYuYjtlIGluc3RhbmNlb2YgamE/Yy5iLnB1c2goZSk6ZSBpbnN0YW5jZW9mIFRhJiZjLmkucHVzaChlKTtyZXR1cm4gZi5yZXR1cm4oZCl9KX07Vi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt2YXIgYz10aGlzOyhhP0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoJ0FkQnJlYWtbYnJlYWtJZD0iJythKyciXScpKTpBcnJheS5mcm9tKHRoaXMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZEJyZWFrIikpKS5mb3JFYWNoKGZ1bmN0aW9uKGQsCmUpe3ZhciBmPWQucXVlcnlTZWxlY3RvcigiVkFTVEFkRGF0YSIpOyhkPWQucXVlcnlTZWxlY3RvcigiQWRUYWdVUkkiKSk/KGU9Yy5zKGQudGV4dENvbnRlbnQsZSksYSYmZS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixhKSxjLkxhLnB1c2goZSkpOmYmJkFycmF5LmZyb20oZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSkuZm9yRWFjaChmdW5jdGlvbihoKXthJiZoLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpO2MuTGEucHVzaChoKX0pfSl9O1YucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcztBcnJheS5mcm9tKHRoaXMuYS5xdWVyeVNlbGVjdG9yQWxsKGEpKS5mb3JFYWNoKGZ1bmN0aW9uKGQsZSl7aWYoZD1kLnF1ZXJ5U2VsZWN0b3IoIkFkIikpZT1jLnMoZC50ZXh0Q29udGVudCxlKSxlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpLGMuTGEucHVzaChlKX0pfTtWLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPVtdO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkVycm9yIikpLmZvckVhY2goZnVuY3Rpb24oZCl7aWYoZCl7dmFyIGU9CmQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Yy5wdXNoKHtpZDplLHR5cGU6ImVycm9yIix1cmw6ZC50ZXh0Q29udGVudCxyZXF1ZXN0OmEuSyhkLnRleHRDb250ZW50KX0pfX0pO3JldHVybiBjfTtWLnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5vP0RhLm8oYSk6bmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSl9O1YucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSxjKXthPSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxWQVNUIHZlcnNpb249IjQuMCI+PEFkIHNlcXVlbmNlPSJbU0VRVUVOQ0VdIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBW1tVUkldXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+PC9WQVNUPicucmVwbGFjZSgiW1NFUVVFTkNFXSIsYy50b1N0cmluZygpKS5yZXBsYWNlKCJbVVJJXSIsYSk7cmV0dXJuKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLAoidGV4dC94bWwiKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZH07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVi5wcm90b3R5cGUse3djOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiFhLmZlKCl9KS5sZW5ndGh9fSxCOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkxhLmxlbmd0aH19fSk7amEucHJvdG90eXBlLmZlPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmEubGVuZ3RofTtqYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIDA8dGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYS5jLmluY2x1ZGVzKGMudHlwZSl9KS5sZW5ndGh9O2phLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYS5jLmluY2x1ZGVzKGMudHlwZSl9KVswXX07CmphLnByb3RvdHlwZS5iZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5jfTtqYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHRoaXMuYS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIWEuYy5pbmNsdWRlcyhjLnR5cGUpfSlbMF19O2phLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe3RoaXMuamE9dGhpcy5qYS5jb25jYXQoYSl9O2phLnByb3RvdHlwZS5aYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuQy5xdWVyeVNlbGVjdG9yQWxsKCJNZXp6YW5pbmUiKSxjPSExO2EmJmEubGVuZ3RoJiYoYz0hMCk7cmV0dXJuIGN9O2phLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPUViKHRoaXMuQy5xdWVyeVNlbGVjdG9yKCJEdXJhdGlvbiIpLnRleHRDb250ZW50LnNwbGl0KCI6IikpLGM9YS5uZXh0KCkudmFsdWUsZD1hLm5leHQoKS52YWx1ZSxlPWEubmV4dCgpLnZhbHVlO3JldHVybiAzNjAwKitjKzYwKitkKyArZX1jYXRjaChmKXtyZXR1cm4tMX19O2phLnByb3RvdHlwZS5GPQpmdW5jdGlvbigpe3ZhciBhPTAsYz0hMTt0cnl7Yz10aGlzLkMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYT1nLmouWWIoYyx0aGlzLmR1cmF0aW9uKSwwPmEmJihhPTApfWNhdGNoKGQpe2E9MH1yZXR1cm4gYX07amEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy5DLnF1ZXJ5U2VsZWN0b3IoIkFkUGFyYW1ldGVycyIpO3JldHVybiBhP2EudGV4dENvbnRlbnQ6IiJ9Y2F0Y2goYyl7cmV0dXJuIiJ9fTtqYS5wcm90b3R5cGUubT1mdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLkMucXVlcnlTZWxlY3RvcigiQ2xpY2tUaHJvdWdoIik7cmV0dXJuIGE/YS50ZXh0Q29udGVudDoiIn1jYXRjaChjKXtyZXR1cm4iIn19O2phLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7dHJ5e2lmKCF0aGlzLmcpZm9yKHZhciBhPXRoaXMuQy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmCjA8PWMuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuZz1hW2RdKTtyZXR1cm4gdGhpcy5nfWNhdGNoKGUpe3JldHVybiIifX07amEucHJvdG90eXBlLnpkPWZ1bmN0aW9uKCl7dHJ5e2lmKHRoaXMuaSlyZXR1cm4gdGhpcy5pO3ZhciBhPSIiLGM9dGhpcy5BKCk7YyYmYy5nZXRBdHRyaWJ1dGU/KGE9Yy5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuaT1hfWNhdGNoKGQpe3JldHVybiIifX07eShDLEVycm9yKTtDLm89e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdmE6IlhNTF9QQVJTRV9FUlJPUiJ9O0MubD17dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsdmE6IkRVUkFUSU9OX0VSUk9SIn07Qy5nPXt0eXBlOiJlcnJvciIsCmNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdmE6IkVNUFRZX1ZBU1QifTtDLkE9e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9O0MuYj17dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKdmE6IkxPQURfRVJST1IifTtDLmk9e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHZhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn07Qy5tPXt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHZhOiJNRURJQUZJTEVfRVJST1IifTtDLmY9e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsdmE6IkRVTU1ZX0FEIn07Qy5GPXt0eXBlOiJlcnJvciIsY29kZTotMSxtZXNzYWdlOiJ1bmtub3duIix2YToidW5rbm93biJ9O0MuYz17dHlwZToiZXJyb3IiLGNvZGU6NTU1LG1lc3NhZ2U6Im5vIHBsYXlhYmxlIGFkcyIsdmE6Ik5PX1BMQVlBQkxFX0FEUyJ9O0MuYT17TmQ6e3R5cGU6ImVycm9yIiwKY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsdmE6Ik5PX0FEUyJ9LFBkOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIix2YToiTk9fTUVESUFGSUxFUyJ9LG1jOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHZhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdmE6IlZQQUlEX0lHTk9SRUQifSxtZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNSxtZXNzYWdlOiJvbmx5IG1lenphbmluZSIsdmE6Ik9OTFlfTUVaWkFOSU5FIn0sT2Q6e3R5cGU6ImhpbnQiLGNvZGU6LTEsbWVzc2FnZToibm8gZGV0YWlsIix2YToibm8gZGV0YWlsIn19O2lhLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEpe3ZhciBjPSExLGQ9MCxlPTA7YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmM9ImZpeGVkIixkPWEubGVmdCxlPWEudG9wKTtkPXt4OmQseTplfTtkLnBvc2l0aW9uPWM7cmV0dXJuIGR9O2lhLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihhKXtpZih0aGlzLmwudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnUoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZj10aGlzLkIoYSk7YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsCmQrPWEsdGhpcy5sLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5sLnBvc2l0aW9uSWZGaXhlZCkpO2M9e3g6Yyx5OmR9O2UmJihjLnBvc2l0aW9uPWUpO3JldHVybiBjfTtpYS5wcm90b3R5cGUuST1mdW5jdGlvbigpe3RoaXMuQT0hMH07aWEucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXt0aGlzLlMucGF1c2UoKTtsLmEodi5iLHRoaXMuUy5DYSgpKX07aWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oKXt0aGlzLkF8fCh0aGlzLlMucGxheSgpLGwuYSh2LmcsdGhpcy5TLkNhKCkpKX07aWEucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O2cudi5iKCJ6SW5kZXgiKSYmKGE9Zy52LmIoInpJbmRleCIpKTt0aGlzLlMucGF1c2UoKTt0aGlzLmEuc3R5bGUuekluZGV4PWE7dGhpcy5hLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuYS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5hLnN0eWxlLmJveFNpemluZz10aGlzLlZhLnN0eWxlLmJveFNpemluZzt0aGlzLm0/CnRoaXMuYS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsIDAsIDAsIC43NSkiOih0aGlzLmEuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIix0aGlzLmEuc3R5bGUud2lkdGg9dGhpcy5WYS5vZmZzZXRXaWR0aCswKyJweCIsdGhpcy5hLnN0eWxlLmhlaWdodD10aGlzLlZhLm9mZnNldEhlaWdodCswKyJweCIsdGhpcy5GKHRoaXMuVmEub2Zmc2V0V2lkdGgrMCx0aGlzLlZhLm9mZnNldEhlaWdodCswKSk7dGhpcy5nZXRQb3NpdGlvbih0aGlzLlZhKTt0aGlzLlMuV2ImJnRoaXMuUy5XYigpP3RoaXMuUy54YSgpLmFwcGVuZENoaWxkKHRoaXMuYSk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmEpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDEwKX07aWEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dGhpcy5TLmV4aXRGdWxsc2NyZWVuKCl9O2lhLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSwKZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH07aWEucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O2lmKHRoaXMubSl7dmFyIGQ9d2luZG93O2M9ZG9jdW1lbnQ7dmFyIGU9Yy5kb2N1bWVudEVsZW1lbnQsZj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YT1kLmlubmVyV2lkdGh8fGUuY2xpZW50V2lkdGh8fGYuY2xpZW50V2lkdGg7ZD1kLmlubmVySGVpZ2h0fHxlLmNsaWVudEhlaWdodHx8Zi5jbGllbnRIZWlnaHQ7Yz1jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CmM9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIseDowLHk6TWF0aC5hYnMoYy55KSx3aWR0aDphLGhlaWdodDpkfX1yZXR1cm4gY307aWEucHJvdG90eXBlLm89ZnVuY3Rpb24oYSl7dGhpcy5TLkRkJiZnLmouVyh0aGlzLlMuY29udGFpbmVyKSYmKHRoaXMuUy5EZCgpLHRoaXMuVmE9dGhpcy5TLmNvbnRhaW5lcixhPSEwKTt2YXIgYz10aGlzLnModGhpcy5WYSk7aWYoYy54IT10aGlzLmIueHx8Yy55IT10aGlzLmIueXx8Yy5wb3NpdGlvbiE9dGhpcy5iLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLmIud2lkdGh8fGMuaGVpZ2h0IT10aGlzLmIuaGVpZ2h0fHxhfHxnLmouYigic3BpZWdlbCIpJiYuNT5NYXRoLnJhbmRvbSgpKXtpZigwPHRoaXMuYi53aWR0aCYmMDx0aGlzLmIuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5jKCk7cmV0dXJufXRoaXMuYj1jO3RoaXMuUy5XYigpPyh0aGlzLmEuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmEuc3R5bGUudG9wPSIwcHgiKToodGhpcy5hLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuYS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuYS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5hLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuYS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuRihjLndpZHRoLGMuaGVpZ2h0KX1sLlcodGhpcy5hKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMTApfTtpYS5wcm90b3R5cGUuVWM9ZnVuY3Rpb24oYSl7dGhpcy5tPWF9O2lhLnByb3RvdHlwZS5GPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTA7ZDx0aGlzLmkubGVuZ3RoO2QrKyl0aGlzLmlbZF0oe3dpZHRoOmEsaGVpZ2h0OmN9KX07aWEucHJvdG90eXBlLlhjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX07aWEucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dGhpcy5pfHwodGhpcy5pPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5pLnB1c2goYSl9O2lhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5hJiYKdGhpcy5hLnBhcmVudE5vZGUmJnRoaXMuYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmEpfTttYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuaT0hMDtmb3IodmFyIGEgaW4gdGhpcy5jKXtpZih0aGlzLmcpYnJlYWs7dmFyIGM9dGhpcy5jW2FdO3RoaXMubChjKSYmKHRoaXMuYi5wdXNoKGMpLHRoaXMuZihjKSl9fTttYi5wcm90b3R5cGUubD1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIEY/ITA6ITF9O21iLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3RoaXMubChhKSYmYS53KCl9O21iLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBBKWZvcihnLlNjPWEsdGhpcy5nPSEwLGE9MDthPHRoaXMuYi5sZW5ndGg7YSsrKXRoaXMuYlthXSYmdGhpcy5iW2FdLmtjJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYlthXS5rYyl9O21iLnByb3RvdHlwZS5hPWZ1bmN0aW9uKGEsCmMpe2lmKCF0aGlzLmd8fGMpdGhpcy5iLnB1c2goYSksdGhpcy5mKGEpfTt2YXIgVD1uZXcgbWI7VC53KCk7Ri5wcm90b3R5cGUudz1mdW5jdGlvbigpe307Ri5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuRjw9dGhpcy5sPyh0aGlzLkYrKyx0aGlzLmtjPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCkpOjA+dGhpcy5sJiYodGhpcy5rYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApKX07Ri5wcm90b3R5cGUuTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkY+dGhpcy5sPyEwOiExfTtGLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy5GPTB9O0YucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In07Ri5wcm90b3R5cGUuST1mdW5jdGlvbihhKXt0aGlzLmE9YX07Ri5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXt0aGlzLmZbYS55YSgpXT1hO1QmJlQuaSYmVC5tKGEpfTtGLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe3ZhciBjPQphLlIoKSxkO2ZvcihkIGluIHRoaXMuZilpZihjPT10aGlzLmZbZF0uUigpKXJldHVybiEwO3JldHVybiB0aGlzLmZbYS55YSgpXT8hMDohMX07Ri5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXthPWEueGEoKTtmb3IodmFyIGMgaW4gdGhpcy5mKXRyeXt2YXIgZD10aGlzLmZbY10ueGEoKTtpZihhLmlkPT0oZD9kLmlkOiIiKSlyZXR1cm4hMH1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX1yZXR1cm4hMX07QS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifTtBLnByb3RvdHlwZS5DYT1mdW5jdGlvbigpe3ZhciBhPXt9LGM9dGhpcy5SKCksZD10aGlzLnhhKCksZT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YylhLnZpZGVvVGFnSWQ9Yy5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDtlJiYoYS5wbGF5ZXI9ZSk7cmV0dXJuIGF9O0EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt9O0EucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7fTtBLnByb3RvdHlwZS5IZT0KZnVuY3Rpb24oYSl7dGhpcy5jPWF9O0EucHJvdG90eXBlLkdlPWZ1bmN0aW9uKGEpe3RoaXMuRj1hfTtBLnByb3RvdHlwZS5iZD1mdW5jdGlvbigpe307QS5wcm90b3R5cGUuaXNGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCkuY2F0Y2goZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX07QS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX07CkEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfTtBLnByb3RvdHlwZS55YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfTtBLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuaWQ9YX07QS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthJiYodGhpcy52aWRlb1RhZz1hLHRoaXMuRCgpfHx0aGlzLkIoKSx0aGlzLm8odGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpKX07QS5wcm90b3R5cGUuUj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfTtBLnByb3RvdHlwZS5CPWZ1bmN0aW9uKCl7dmFyIGE9bC5nKDEwKTt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGEpfTtBLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX07QS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj1hfTtBLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT0KdHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9O0EucHJvdG90eXBlLmdldFJhd1BsYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn07QS5wcm90b3R5cGUuJGM9ZnVuY3Rpb24oKXtyZXR1cm4hMH07QS5wcm90b3R5cGUuaXNQbGF5aW5nPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0EucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfTtBLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH07QS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4hMX07QS5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3RoaXMuaT0hMH07QS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/CiEwOiExfTtBLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9O0EucHJvdG90eXBlLnJlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmpkPWZ1bmN0aW9uKGEpe3RoaXMuZmM9YX07QS5wcm90b3R5cGUuZWQ9ZnVuY3Rpb24oKXt0aGlzLmZjPW51bGx9O0EucHJvdG90eXBlLldjPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0UucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt9O0UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXt0aGlzLmZhfHwodGhpcy5mYT0hMCxsLm1hKCkpfTtFLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGM9bmV3IENhO3dpbmRvd1tjLmEoKV18fCh3aW5kb3dbYy5hKCldPXt9KTt3aW5kb3dbYy5hKCldW2EueWEoKV18fCh3aW5kb3dbYy5hKCldW2EueWEoKV09e30sd2luZG93W2MuYSgpXVthLnlhKCldLmluaXRpYXRvcj1sLkQoKSk7d2luZG93W2MuYSgpXVthLnlhKCldW2wuRCgpXT8Kd2luZG93W2MuYSgpXVthLnlhKCldW2wuRCgpXSsrOndpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV09MX07RS5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPSEwLGQ9bmV3IENhO3dpbmRvd1tkLmEoKV0mJndpbmRvd1tkLmEoKV1bYS55YSgpXSYmd2luZG93W2QuYSgpXVthLnlhKCldLmluaXRpYXRvciE9bC5EKCkmJih0aGlzLlUoKSxjPSExKTtyZXR1cm4gY307RS5wcm90b3R5cGUuYT1mdW5jdGlvbihhLGMpe3ZhciBkPSEwO2EmJihkPSExKTt0aGlzLmkoKXx8KHRoaXMubmEoKSx0aGlzLnBhKCk/KHRoaXMuVSgpLHRoaXMuVih0aGlzLnBsYXllcixkKSx0aGlzLmhhKCksYyYmImZ1bmN0aW9uIj09dHlwZW9mIGMmJmMoKSk6KGwudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKSx0aGlzLlUoKSkpfTtFLnByb3RvdHlwZS5KPWZ1bmN0aW9uKGEsYyl7dGhpcy5pKCl8fCh0aGlzLm0ucHVzaChhKSx0aGlzLmwucHVzaCh7cmVhc29uOmEsCmRldGFpbDpjfSkpfTtFLnByb3RvdHlwZS5oYT1mdW5jdGlvbigpe3ZhciBhPSJ1bmtub3duIixjPVtdO3RoaXMubSYmMDx0aGlzLm0ubGVuZ3RoJiYodGhpcy5tPWwudW5pcXVlKHRoaXMubSksbC50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMubS5qb2luKCIsIikpKTtpZih0aGlzLmwpe2Zvcih2YXIgZD0wO2Q8dGhpcy5sLmxlbmd0aDtkKyspdGhpcy5BW3RoaXMubFtkXS5yZWFzb25dPT10aGlzLkFbYV0mJmMucHVzaCh0aGlzLmxbZF0uZGV0YWlsKSx0aGlzLkFbdGhpcy5sW2RdLnJlYXNvbl08dGhpcy5BW2FdJiYoYz1bXSxjLnB1c2godGhpcy5sW2RdLmRldGFpbCksYT10aGlzLmxbZF0ucmVhc29uKTt0aGlzLkFbYV18fChhPSJ1bmtub3duIixjPVtdKTswPGMubGVuZ3RoJiYoYz1sLnVuaXF1ZShjKSxhPWErIi0iK2Muam9pbigiLSIpKTtsLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfX07RS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWX07CkUucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlhfTtFLnByb3RvdHlwZS56YT1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2F9O0UucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkZ9O0UucHJvdG90eXBlLmJhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLll9O0UucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuRn07RS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YX07RS5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSl7dGhpcy5WPWF9O3kobGIsQSk7bGIucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuYihhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5nKGEpO3RoaXMuS2E9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9CiEwfS5iaW5kKHRoaXMpKX07bGIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTtsYi5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTtsYi5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn07eShMYixFKTtMYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9YS5rZjtjP2MuSWE/Yy5JYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihkKXt2YXIgZT0hMSxmPSIiO2QuZ2V0RXJyb3ImJihlPWQuZ2V0RXJyb3IoKSk7ZXx8ZC5kZXRhaWwuZ2V0RXJyb3ImJihlPWQuZGV0YWlsLmdldEVycm9yKCkpO2UuZ2V0RXJyb3JDb2RlJiYoZis9ZS5nZXRFcnJvckNvZGUoKSk7ZS5nZXRNZXNzYWdlJiYoZis9ZS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD0KZi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMuTSgpLHRoaXMuYigpKToodGhpcy5KKCJhZGVycm9yIiksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpLDEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLkooImZyYW1ld29yayIpLHRoaXMuYygpKX07TGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5LYT90aGlzLmEoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwKX07eShpYyxGKTtpYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBsYih3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyBMYihhLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBMYz1uZXcgaWMoWCk7VC5hKExjKTt5KGxhLEEpO2xhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9bC5jKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYwPD1hLmF1dGhvcml0eS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJih0aGlzLmY9ITApO3RoaXMuVGMoKTt0aGlzLnVjKCk7YT0hMDt0aGlzLnBsYXllci5nZXRDb25maWcmJihhPXRoaXMucGxheWVyLmdldENvbmZpZygpKTthfHwodGhpcy5TYT0hMCl9O2xhLnByb3RvdHlwZS5UYz1mdW5jdGlvbigpe3RoaXMuU2E9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLlNhPSEwKTshYS5ub2RlTmFtZXx8Ik9CSkVDVCIhPWEubm9kZU5hbWUmJiJWSURFTyIhPWEubm9kZU5hbWV8fChhPWEucGFyZW50Tm9kZSk7dGhpcy5sPQphO2lmKHRoaXMuZil7dGhpcy51YygpO2lmKHRoaXMuU2EpcmV0dXJuO2E9dGhpcy5SKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfXRoaXMuYihhKX07bGEucHJvdG90eXBlLnVjPWZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Epe3ZhciBhPXRoaXMubCxjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2N8fCh0aGlzLlNhPSEwKTt0aGlzLmcoYyk7Zy52LmIoInVzZV92aWRlb3RhZ19hc19jb250YWluZXIiKSYmdGhpcy5iKGMpfX07bGEucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoZy52LmIoInBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCIpKWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmCmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGMpe2MuZHVyYXRpb24mJmMucG9zaXRpb24mJjE+Yy5kdXJhdGlvbi1jLnBvc2l0aW9uJiZ0aGlzLmMmJigwLHRoaXMuYykoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGMpe2MuZHVyYXRpb24mJmMucG9zaXRpb24mJjE+Yy5kdXJhdGlvbi1jLnBvc2l0aW9uJiZ0aGlzLmMmJigwLHRoaXMuYykoKX0uYmluZCh0aGlzKSl9O2xhLnByb3RvdHlwZS5EZD1mdW5jdGlvbigpe3RoaXMuVGMoKTt0aGlzLnVjKCl9O2xhLnByb3RvdHlwZS5iZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihjKXt0aGlzLm0oYyl9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihjKXt0aGlzLm0oYyl9LmJpbmQodGhpcykpfTsKbGEucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5wbGF5ZXI7Yy5nZXRQb3NpdGlvbigpO2MuZ2V0UG9zaXRpb24oKTtjLmdldER1cmF0aW9uKCk7Yy5nZXRQb3NpdGlvbigpO2MuZ2V0RHVyYXRpb24oKTtjLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYy5nZXRQb3NpdGlvbiYmMzA8Yy5nZXRQb3NpdGlvbigpJiYzMDxjLmdldER1cmF0aW9uKCktYy5nZXRQb3NpdGlvbigpJiZ0aGlzLkYmJigwLHRoaXMuRikoKX07bGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMuUigpLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfTtsYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9OwpsYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfTtsYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifTtsYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX07bGEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz10aGlzLnBsYXllcjtjLmdldE11dGUmJmMuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9O2xhLnByb3RvdHlwZS5XYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLGM9ITE7YS5nZXRWb2x1bWUmJmEuZ2V0Vm9sdW1lKCkmJihjPWEuZ2V0Vm9sdW1lKCkpO3JldHVybiBjfTt5KGZiLEUpO2ZiLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dGhpcy5hYT0iYWRDbGljayBhZENvbXBsZXRlIGFkRXJyb3IgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFJlcXVlc3QgYWRTa2lwcGVkIGFkVGltZSBiZWZvcmVDb21wbGV0ZSBiZWZvcmVQbGF5IGMgY2FzdCBjb21wbGV0ZSBlbSBmaXJzdEZyYW1lIGwgaWRsZSBsZXZlbHMgbWV0YSBwbGF5IHBsYXlsaXN0Q29tcGxldGUgcmVhZHkgcmVzaXplIHNlZWsgc2ggdGltZSIuc3BsaXQoIiAiKX07CmZiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GO3RoaXMuaXNQbGF5aW5nPXRoaXMuST10aGlzLlc9ITE7dGhpcy5HPTE7dGhpcy5LPTA7dGhpcy5zPVtdO3RoaXMuZj0hMX07ZmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7Zy5qLmIoInNwaWVnZWwuZGUiKSYmZy5qLnNhKCkudGhlbihmdW5jdGlvbihmKXtmJiYoYS5QPSEwLGEub3x8Yy5wbHVnaW5zLnZhc3QuZGVzdHJveSgpLGwudHJhY2soInN0YXRzX2hkX3Rha2VvdmVyIiwhYS5vLCEwKSl9KS5jYXRjaChmdW5jdGlvbigpe30pOy0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKSYmYy5wbHVnaW5zLnZhc3QuZGVzdHJveSgpO2lmKGcuai5NYigpJiZnLmouTigpKXt2YXIgZD1mdW5jdGlvbigpe3RoaXMubz9nLmoudHJhY2soInZydGNsenJfdGFrZW92ZXIiLAohMSwhMCk6KGcuai50cmFjaygidnJ0Y2x6cl90YWtlb3ZlciIsITAsITApLGMucGx1Z2lucy52YXN0LmRlc3Ryb3koKSxnLkJjPXRoaXMuQmMsYy5vbigicGxheSIsZnVuY3Rpb24oKXtjLm11dGVkQXV0b3N0YXJ0fHx0aGlzLkR8fChnLmoudHJhY2soInZydGNsenJfZGVsaXZlciIsInBsYXkiLCEwKSx0aGlzLmMoKSx0aGlzLkQ9ITApfS5iaW5kKHRoaXMpKSxjLm9uKCJtdXRlIixmdW5jdGlvbihmKXshYy5tdXRlZEF1dG9zdGFydHx8Zi5tdXRlfHx0aGlzLkR8fChnLmoudHJhY2soInZydGNsenJfZGVsaXZlciIsIm11dGUiLCEwKSx0aGlzLmMoKSx0aGlzLkQ9ITApfS5iaW5kKHRoaXMpKSl9LmJpbmQodGhpcyk7dGhpcy5CYz1uZXcgUihkKX1lbHNle3ZhciBlPXt9O2lmKGMuZ2V0Q29uZmlnKWlmKGU9Yy5nZXRDb25maWcoKSxlLmFkdmVydGlzaW5nKXtpZihlLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkc9ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmY9ITApO2Vsc2V7aWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcihkPTA7ZDxlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtkKyspaWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZVtkXS50YWcpe3RoaXMuZj0hMDticmVha31lLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmY9ITApO2UuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuZj0hMCl9ZS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmY9ITApfWVsc2UgdGhpcy5NKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtlPSJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUgYWRDb21wbGV0ZSIuc3BsaXQoIiAiKTsKZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyljLm9uKGVbZF0sZnVuY3Rpb24oZil7dmFyIGg9dGhpczt0aGlzLm89ITA7dGhpcy5NKGYudHlwZSk7ImFkUGxheSI9PT1mLnR5cGUmJmcuai5iKCJzcGllZ2VsLmRlIikmJmcuai5zYSgpLnRoZW4oZnVuY3Rpb24obSl7bSYmZy5qLnRyYWNrKCJzdGF0c19oZF90YWtlb3Zlcl9jYyIsaC5QLCEwKX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSk7ImFkQ29tcGxldGUiPT09Zi50eXBlJiYodGhpcy5JPSEwKX0uYmluZCh0aGlzKSk7Yy5vbigiYWRFcnJvciIsZnVuY3Rpb24oZil7dGhpcy5vbkFkRXJyb3IoZil9LmJpbmQodGhpcykpO2Mub24oInRpbWUiLGZ1bmN0aW9uKGYpe3RoaXMuaXNQbGF5aW5nPSEwOzMwPGYuZHVyYXRpb24mJiF0aGlzLmkoKSYmIWMubXV0ZWRBdXRvc3RhcnQmJih0aGlzLmY/KHRoaXMuSigiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuYygpKToodGhpcy5KKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLwoxRTMpKSx0aGlzLmMoITApKSl9LmJpbmQodGhpcykpO2Mub24oInBsYXlsaXN0aXRlbSIsZnVuY3Rpb24oKXtpZih0aGlzLmkoKSYmKHRoaXMuZygpLHRoaXMucGxheWVyLnhkPSEwLGNvbmYuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGY9dGhpcy5wbGF5ZXIuZmM7ZiYmKGYuamMoKSxmLnRjKCkpfX0uYmluZCh0aGlzKSl9fTtmYi5wcm90b3R5cGUub25BZEVycm9yPWZ1bmN0aW9uKGEpe3RoaXMuTnx8KHRoaXMuTj1bXSk7dGhpcy5OLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt0aGlzLksrKzt2YXIgYz1hLnRhZzstMT09dGhpcy5zLmluZGV4T2YoYykmJnRoaXMucy5wdXNoKGMpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlP2wuYWEoKT8obC51PSEwLHRoaXMuSigiYWRlbXB0eSIsYS5jb2RlKSx0aGlzLmMoKSk6KHRoaXMuTSgpLHRoaXMuYigpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMuTSgiZW1wdHkiKToKMzAzPT1hLmNvZGUmJi0xIT1hLm1lc3NhZ2UuaW5kZXhPZigiZW1wdHkiKT90aGlzLk0oImVtcHR5Iik6KHRoaXMuSigiYWRlcnJvciIsYS5jb2RlKSx0aGlzLnMubGVuZ3RoPj10aGlzLkcmJnRoaXMuYygpKX07ZmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7KGE9dm9pZCAwPT09YT8hMTphKT90aGlzLkI/dGhpcy5CKys6dGhpcy5CPTE6dGhpcy51P3RoaXMudSsrOnRoaXMudT0xO3ZhciBjPXRoaXMucGxheWVyO2lmKGwuVyhjLlIoKSkpaWYoYy5TYSl0aGlzLk0oInBsYXllciBpcyBpbnZhbGQiKTtlbHNle3ZhciBkPWZ1bmN0aW9uKCl7dGhpcy51PnRoaXMuQiYmKGE9ITEpO3RoaXMuYShhKX0uYmluZCh0aGlzKTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZSIsZnVuY3Rpb24oZSl7LjU+ZS5wb3NpdGlvbiYmISgwPmUucG9zaXRpb24mJjA+ZS5kdXJhdGlvbil8fHRoaXMuT3x8KHRoaXMuTz0hMCxkKCkpfS5iaW5kKHRoaXMpKX1lbHNlIGMuVGMoKSxjLnVjKCksCmMuU2F8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDIwKX07eShDYixGKTtDYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz1GLnByb3RvdHlwZS5iLmNhbGwodGhpcyxhKTthPWEucGxheWVyO2lmKCFjJiZhKWZvcih2YXIgZCBpbiB0aGlzLmYpdGhpcy5mW2RdLnBsYXllcj09YSYmKGM9ITApO3JldHVybiBjfTtDYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5jKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7CmlmKCghd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpJiZ3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpKXthPVtdO2lmKDE8Yy5sZW5ndGgpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKGNbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWQ9bmV3IGxhKHdpbmRvdy5qd3BsYXllcihhW2NdKSksbnVsbD09ZC5pZCYmbnVsbD09ZC5jb250YWluZXImJm51bGw9PWQudmlkZW9UYWd8fGQuU2F8fHRoaXMuYihkKXx8dGhpcy5HKGQpfHwodGhpcy5pKGQpLGQ9bmV3IGZiKGQsdGhpcy5hKSxkLlQoKSxkLncoKSl9dGhpcy5nKCl9fTtDYi5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGwuQihhLmFuY2hvcil9O3ZhciBNYz1uZXcgQ2IoWCk7VC5hKE1jKTt5KEJhLEEpO0JhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYz1hLmVsXztjfHwoYz1hLmVsKCkpO2M/KHRoaXMuYihjKSwoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5nKGEpOnRoaXMuYSgpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtCYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9O0JhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcykpfTtCYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmN1cnJlbnRUaW1lKCk7YT1hLmR1cmF0aW9uKCk7CmMmJjA8YyYmYSYmMDxhJiZjPj1hLTImJnRoaXMuYyYmdGhpcy5jKCl9O0JhLnByb3RvdHlwZS4kYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGM9SlNPTi5wYXJzZShhKTtpZihjLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFjWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZCl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfTtCYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9O0JhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH07QmEucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfTsKQmEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjKXRyeXtjPWMoKX1jYXRjaChkKXtjPSExfWMmJmEuZXhpdEZ1bGxzY3JlZW4oKX07QmEucHJvdG90eXBlLmN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9O3koZmEsRSk7ZmEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnNhKHRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKXx8KHRoaXMuZWEoKSx0aGlzLmxhKCksdGhpcy5CKCkpfTtmYS5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGwuYigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfTtmYS5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOwphLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT1hLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGMpe319cmV0dXJuIHRoaXMuaW1hfTtmYS5wcm90b3R5cGUuTz1mdW5jdGlvbigpe2lmKCF0aGlzLklhKXt2YXIgYT10aGlzLnMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLklhPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLklhPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLklhPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJgoodGhpcy5JYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5JYX07ZmEucHJvdG90eXBlLlo9ZnVuY3Rpb24oKXtpZighdGhpcy51KXt2YXIgYT10aGlzLnMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy51PWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy51PWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudX07ZmEucHJvdG90eXBlLnFhPWZ1bmN0aW9uKCl7aWYoIXRoaXMuUCl7dmFyIGE9dGhpcy5zKCksYz10aGlzLm9hKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGMpJiYodGhpcy5QPSEwKX1yZXR1cm4gdGhpcy5QfTtmYS5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTshdGhpcy5OJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5OPSEwKTtyZXR1cm4gdGhpcy5OfTtmYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLk8oKTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0iYWRzTWFuYWdlckxvYWRlZCIsZT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGU9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZil7dGhpcy5mKGYpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbigpe3RoaXMudGEoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oZil7dGhpcy5mKGYpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKTt0aGlzLmMoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkIoKX0uYmluZCh0aGlzKSwyMCl9O2ZhLnByb3RvdHlwZS50YT1mdW5jdGlvbigpe3RoaXMuRz0hMDt2YXIgYT10aGlzLlooKTtpZihhfHx0aGlzLmkoKSl7dmFyIGM9CiJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZil7dGhpcy5mKGYpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihmKXt0aGlzLmYoZik7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuYyghMCl9LmJpbmQodGhpcykpO3ZhciBlPSIiO2wucmEoKSYmKGU9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsCmZ1bmN0aW9uKCl7bC5iKCJjaGlwLmRlIikmJmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2lmKGwuYigiY2hpcC5kZSIpKXt2YXIgZj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsibWlkcG9pbnQiLCIiLCEwKTtsLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCghZi5wYXVzZWQoKSkudG9TdHJpbmcoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiYKbC50cmFjaygic3RhdHNfY3VzdF8iK2UrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm89ITA7bC5iKCJjaGlwLmRlIikmJmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLm98fCh0aGlzLkooImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmMoKSx0aGlzLksoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkIoKX0uYmluZCh0aGlzKSwyMCl9O2ZhLnByb3RvdHlwZS5sYT0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuYyghMCk7dGhpcy5KKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihjKXt0aGlzLmYoYyk7dGhpcy5jKCk7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSigiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSl9O2ZhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGcuSCYmZy5ILmIpZy5ILkphJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGMpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSw1MCkpfTtmYS5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLnFhKCkpe3ZhciBjPXRoaXMucygpLGQ9dGhpcy5PKCk7YyYmZCYmKHRoaXMuR3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkc/CnRoaXMuTSgpOih0aGlzLmMoITApLHRoaXMuSigibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMuZGE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnMoKSxmPXRoaXMuTygpO2UmJiFmPyh0aGlzLkooIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYygpKToodGhpcy5jKCEwKSx0aGlzLkooIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5kYT0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMuaSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw1MCl9O2ZhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09CmYuaW5kZXhPZigiMzAzIikmJi0xPT09Zi5pbmRleE9mKCI0MDMiKXx8KG09ITApOyJudW1iZXIiPT10eXBlb2YgZiYmKGguWD1mLGguSigiYWRlcnJvciIsZikpfXJldHVybiBtfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmMoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5XKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5XKCk7YnJlYWt9fTtmYS5wcm90b3R5cGUuVz0KZnVuY3Rpb24oKXt0aGlzLm1hKCk/KHRoaXMuST0hMCxsLnU9bC5hYSgpLHRoaXMuYWE9IWwudSx0aGlzLksoITApKToodGhpcy5JPSEwLHRoaXMuTSgiZW1wdHkgdmFzdCIpKX07ZmEucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWwuRyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5YPyEwOmwuYWEoKX07ZmEucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkk/KGwudXx8dGhpcy5NKCksdGhpcy5iKCkpOnRoaXMuSyhhKX0uYmluZCh0aGlzKSwxMDApfTtmYS5wcm90b3R5cGUuSz1mdW5jdGlvbihhKXt0aGlzLmkoKXx8KHZvaWQgMCE9PWEmJmF8fCh0aGlzLmFhPSExKSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmEodGhpcy5hYSxmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfTsKeShCYixGKTtCYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpO3ZhciBjPXRoaXMuYyh3aW5kb3cpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXRyeXtjPWN8fHRoaXMuYyhhW2RdKX1jYXRjaChlKXt9dGhpcy5nKCl9fTtCYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2M9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYz1hLnZpZGVvanMucGxheWVycyk7MD09Yy5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYy5wdXNoKGEpKTtpZigwPGwuemEoYykpe2Zvcih2YXIgZCBpbiBjKWMuaGFzT3duUHJvcGVydHkoZCkmJgooYT1uZXcgQmEoY1tkXSksYS5pfHx0aGlzLmIoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuaShhKSwobmV3IGZhKGEsdGhpcy5hKSkudygpKSk7cmV0dXJuITB9cmV0dXJuITF9O0JiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5rYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApfTt2YXIgTmM9bmV3IEJiKFgpO1QuYShOYyk7eShBYSxBKTtBYS5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS51aSYmYS51aS50YWdBdHRyaWJ1dGVzP2EudWkudGFnQXR0cmlidXRlcy5pZD8oYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnVpLnRhZ0F0dHJpYnV0ZXMuaWQpKT8odGhpcy5iKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCk6dGhpcy5hKCk6dGhpcy5hKCl9O0FhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3RoaXMuZj0KYX07QWEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWQ/ITA6ITF9O0FhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07QWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07QWEucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkfTtBYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQ/ITE6KHRoaXMucGF1c2UoKSwhMCl9O0FhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfTtBYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn07QWEucHJvdG90eXBlLmNhPQpmdW5jdGlvbigpe3JldHVybiJUSEVPcGxheWVyIn07eShBYixFKTtBYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2EuYWRzJiZhLmFkcy5hZGRFdmVudExpc3RlbmVyJiZhLmFkcy5hZGRFdmVudExpc3RlbmVyKCJhZGVycm9yIixmdW5jdGlvbihjKXtjPWMuZXJyb3JDb2RlOzEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jP3RoaXMuYigpOih0aGlzLkooImFkZXJyb3IiLGMpLHRoaXMuYygpKX0uYmluZCh0aGlzKSk7dGhpcy5mKCl9O0FiLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZHMmJmEuYWRzLmN1cnJlbnRBZHMmJjA8YS5hZHMuY3VycmVudEFkcy5sZW5ndGgmJmEuYWRzLnBsYXlpbmc/dGhpcy5NKCk6IXRoaXMucGxheWVyLmlzUGF1c2VkKCkmJi4yPHRoaXMucGxheWVyLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5jKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwKMTAwKX07QWIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5wbGF5ZXIuaXNQYXVzZWQoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSw1MCk6dGhpcy5hKGEpfTt5KGhjLEYpO2hjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LlRIRU9wbGF5ZXImJndpbmRvdy5USEVPcGxheWVyLnBsYXllcnMpZm9yKHZhciBhIGluIHdpbmRvdy5USEVPcGxheWVyLnBsYXllcnMpe3ZhciBjPXdpbmRvdy5USEVPcGxheWVyLnBsYXllcnNbYV07Yy5wbGF5JiYoYz1uZXcgQWEoYyksYy5pfHx0aGlzLmIoYyl8fCh0aGlzLmkoYyksYy5sKHRoaXMuYSksKG5ldyBBYihjLHRoaXMuYSkpLncoKSkpfXRoaXMudSgpO3RoaXMuZygpfTt2YXIgT2M9bmV3IGhjKFgpO1QuYShPYyk7eShhYixBKTthYi5wcm90b3R5cGUuVD1mdW5jdGlvbigpe2cuU2M/KHRoaXMuZj1nLlNjLHRoaXMuYih0aGlzLmYueGEoKSksdGhpcy5nKHRoaXMuZi5SKCkpKToKdGhpcy5hKCl9O2FiLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpfTthYi5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZi5wbGF5KCl9O2FiLnByb3RvdHlwZS52ZD1mdW5jdGlvbihhLGMpe2lmKCJ0aW1ldXBkYXRlIj09YSl7YT1jLnRhcmdldC5oZWlnaHQ7dmFyIGQ9Yy50YXJnZXQuY3VycmVudFRpbWUsZT1jLnRhcmdldC5kdXJhdGlvbixmPU1hdGguZmxvb3IoZCksaD17fTtoLndpZHRoPWMudGFyZ2V0LndpZHRoO2guaGVpZ2h0PWE7aC5jdXJyZW50VGltZT1kO2guZHVyYXRpb249ZTtoLnJlbWFpbmluZ1RpbWU9ZS1kO2guZXZlbnQ9IkFkUmVtYWluaW5nVGltZUNoYW5nZSI7ZiE9dGhpcy5sJiYoMD09ZiYmKGguZXZlbnQ9ImltcHJlc3Npb24iKSxmPT1NYXRoLmZsb29yKGUvNCkmJihoLmV2ZW50PSJmaXJzdHF1YXJ0aWxlIiksZj09TWF0aC5mbG9vcihlLzIpJiYoaC5ldmVudD0ibWlkcG9pbnQiKSxmPT1NYXRoLmZsb29yKDMqZS80KSYmCihoLmV2ZW50PSJ0aGlyZHF1YXJ0aWxlIiksdGhpcy5tKGgpLHRoaXMubD1mKX1lbHNlImVuZGVkIj09YSYmdGhpcy5tKHtldmVudDoiZW5kZWQifSl9O2FiLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe2EudmVydGljYWxpemVyPSEwO3RoaXMuYWImJnRoaXMuYWIucG9zdE1lc3NhZ2UoYSwiKiIpfTthYi5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iVmVydGljYWxpenJQbGF5ZXIifTt5KGdjLEUpO2djLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnZlcnRpY2FsaXplciYmKHRoaXMuYWI9YS5zb3VyY2UsdGhpcy5wbGF5ZXIuYWI9YS5zb3VyY2UsdGhpcy5hKCkpfS5iaW5kKHRoaXMpKX07eShmYyxGKTtmYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPW5ldyBhYih7fSk7dGhpcy5iKGEpfHxhLml8fCh0aGlzLmkoYSksKG5ldyBnYyhhLHRoaXMuYSkpLncoKSk7CnRoaXMuZygpfTt2YXIgUGM9bmV3IGZjKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLnBhdXNlKCk7bC5hKHYuYix0aGlzLnBsYXllci5DYSgpKTt2YXIgYz1nLnYuYTthPW5ldyBpYShhLGMpO2EuZXhpdEZ1bGxzY3JlZW4oKTtnLkguSmE9ITA7YT1uZXcgdShhLGcuSCxjKTthLk5iKGMpO2EuZWEoInZlcnRpY2FsaXpyIik7dGhpcy5wbGF5ZXIuamQoYSl9KTtULmEoUGMsITApO3kodWEsQSk7dWEucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9YS5wbGF5ZXJDb250YWluZXI7aWYoIWMmJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihjPWEucGFyZW50Tm9kZSksIWMpKXt0aGlzLmEoKTtyZXR1cm59dGhpcy5iKGMpO2E9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSwKdGhpcy5sPSEwKTthP3RoaXMuZyhhKTp0aGlzLmEoKX07dWEucHJvdG90eXBlLnhlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZmMsZD10aGlzLnlhKCksZT0iIjthLm1lbW8mJihlPWEubWVtby52aWRlb2lkKTtlJiZjJiZjLlZiJiYoMDw9ZC5pbmRleE9mKGUpfHxjLmpjKCkpfTt1YS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9O3VhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3RoaXMuZisrO2lmKDEwPHRoaXMuZilyZXR1cm4hMTsKdGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH07dWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfTt1YS5wcm90b3R5cGUuaXNQbGF5aW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9O3VhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lP2EucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lP3dpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCk6MH07dWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbj9hLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbj93aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpOjB9O3VhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn07dWEucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7fTt5KGViLEUpO2ViLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7aWYoIXRoaXMudSlpZih0aGlzLmN8fAoodGhpcy5jPTApLHRoaXMucGxheWVyLmlzUGxheWluZygpJiZ0aGlzLmMrKywxNTx0aGlzLmMpdGhpcy5KKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZighMCk7ZWxzZXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudT0hMDt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRyhkKTt0aGlzLnN8fCh0aGlzLkooImFkZXJyb3IiLHRoaXMuWCksdGhpcy5mKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX07ZWIucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0aGlzLnM9ITA7dGhpcy5NKCJlbXB0eSB2YXN0Iil9O2ViLnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmJiYoaC5YPWYsaC5KKCJhZGVycm9yIixmKSl9cmV0dXJuIG19YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmCmMoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CKCk7YnJlYWt9fTtlYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3RoaXMuWD10aGlzLlh8fCExO3RoaXMubygpO3ZhciBjPXdpbmRvdy5vdlZpZGVvO2N8fChjPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2MmJmMucmVnaXN0ZXJFdmVudCYmIXRoaXMuRD8oYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKSxjLnJlZ2lzdGVyRXZlbnQoYy5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLApjLnJlZ2lzdGVyRXZlbnQoYy5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLGMucmVnaXN0ZXJFdmVudChjLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuZigpfS5iaW5kKHRoaXMpKSx0aGlzLkQ9ITAsYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oZCl7YS54ZShkKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcyksMTAwKX07ZWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLmFjdGl2ZVBsYXllciYmCih0aGlzLnBsYXllcj1uZXcgdWEod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5hKGEpfTt5KGVjLEYpO2VjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IHVhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLChuZXcgZWIoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgUWM9bmV3IGVjKFgpO1QuYShRYyk7eSh6YSxBKTt6YS5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Y3x8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLmIoYyk7dGhpcy5vKGEpO3RoaXMuZigpfTt6YS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX07emEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnhhKCksYz10aGlzLlIoKTsKY3x8KChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYz90aGlzLmcoYyk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApKX07emEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTt6YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTt6YS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX07emEucHJvdG90eXBlLiRjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH07CnphLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJPb3lhbGEifTt6YS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYT9hLm11dGVkOiEwfTt6YS5wcm90b3R5cGUuQ2E9ZnVuY3Rpb24oKXt2YXIgYT17fSxjPXRoaXMuUigpLGQ9dGhpcy54YSgpO2lmKGEudmlkZW9UYWc9YylhLnZpZGVvVGFnSWQ9Yy5pZDtpZihhLmNvbnRhaW5lcj1kKWEuY29udGFpbmVySWQ9ZC5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfTt5KE1hLEUpO01hLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGMoKTt0aGlzLmM9dGhpcy5jfHwhMTt2YXIgYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGQsZSl7dGhpcy5PKGUpfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMucz0KITA7dGhpcy5LJiZ0aGlzLk4oKX0uYmluZCh0aGlzKSk7Yy5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5wbGF5ZXIuZmM7ZCYmZC5WYiYmdGhpcy5wbGF5ZXIucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5mKCk7dGhpcy5LPSEwO3RoaXMuTigpfS5iaW5kKHRoaXMpKTt0aGlzLkcoKX07TWEucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLmN8fChoYigiaW1hOiAiK3RoaXMuZigpLCJPb3lhbGEiKSx0aGlzLnN8fHRoaXMuZigpP3RoaXMucyYmdGhpcy5EJiYhdGhpcy51JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwKMTAwKSl9O01hLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JKCk7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19O01hLnByb3RvdHlwZS5JPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoImFkTWFuYWdlckNvbnRyb2xsZXIiPT09ZC5uYW1lKXJldHVybiBkLmluc3RhbmNlfX07TWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oKXtpZih0aGlzLmYoKSl7dmFyIGE9dGhpcy5JKCkuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMudT0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkQ9YS5uZn10aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSwxMDApfTtNYS5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX07TWEucHJvdG90eXBlLk89ZnVuY3Rpb24oYSl7dGhpcy5jPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdLDEwKTowOzEwMDk9PXRoaXMuY3x8MzAyPT10aGlzLmM/dGhpcy5CPSEwOnRoaXMuSigiYWRlcnJvciIsdGhpcy5jKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9O01hLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7dGhpcy5CPyh0aGlzLk0oKSx0aGlzLmIoKSk6YS4kYygpPyh0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUChhKT8odGhpcy5hKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMDApfTt5KGRjLEYpO2RjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5sPTE1MDA7dmFyIGE9dGMoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGwuemEoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYyBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9bmV3IHphKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2NdKTt0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBNYShkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBSYz1uZXcgZGMoWCk7VC5hKFJjKTt5KEhhLEEpO0hhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dGhpcy5pPSExO3RoaXMuZigpfTtIYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPSExLGM9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7CmF8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnR8fHRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50RWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYz10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWMmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmM/KHRoaXMuYihhKSx0aGlzLmcoYykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX07SGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX07SGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9O0hhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfTsKSGEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9O0hhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMubCgpfTtIYS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuYyYmKDAsdGhpcy5jKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCl9LmJpbmQodGhpcyksMTAwKX07SGEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn07eSh6YixFKTt6Yi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz1hLmNvZGUsZD1hLm1lc3NhZ2U7YS5kYXRhJiYoYz1hLmRhdGEuY29kZSxkPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1jJiYoOTAwPT1jJiYwPGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLk0oImVtcHR5IiksdGhpcy5iKCkpOgoxMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz90aGlzLmIoKTp0aGlzLmYoKSl9O3piLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYz0wO2M8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtjKyspdGhpcy5jKGEuYWRFcnJvckV2ZW50c1tjXSk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGQpe3RoaXMuYyhkKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoZC5hZEVycm9yRXZlbnRzKWZvcih2YXIgZT0wO2U8ZC5hZEVycm9yRXZlbnRzLmxlbmd0aDtlKyspdGhpcy5jKGQuYWRFcnJvckV2ZW50c1tlXSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX07emIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTApfTt5KEtiLEYpO0tiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9bmV3IEhhKGEpO2EuaT90aGlzLmcoKTp0aGlzLmIoYSl8fChhLm8oTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuaShhKSwobmV3IHpiKGEsdGhpcy5hKSkudygpKX07S2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLm18fCh0aGlzLm09ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihjKXt0aGlzLmMoYy5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuKXtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLmMod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKX1lbHNlIGlmKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImJpdG1vdmlucGxheWVyLWNvbnRhaW5lciIpKWZvcihhPQowO2E8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIikubGVuZ3RoO2ErKyl0aGlzLmMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIilbYV0pO3RoaXMuZygpfTt2YXIgU2M9bmV3IEtiKFgpO1QuYShTYyk7eShkYixBKTtkYi5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmNvbnRhaW5lcjthLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybnthZHZlcnRpc2luZzp7cHJlcm9sbEFkVGFnOiJ2ZXJ0aWNhbGl6ciJ9fX07aWYoYyl7dHJ5e2MuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZCl7fXRoaXMuYihjKTt0aGlzLmcoYyl9ZWxzZSB0aGlzLmEoKX07ZGIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7d2luZG93LmI9ZztpZighdGhpcy5pc1BhdXNlZCl7dGhpcy5pc1BhdXNlZD0hMDtmb3IodmFyIGE9dGhpcy5wbGF5ZXIuY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKSwKYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uc3R5bGUuZmlsdGVyPSJibHVyKDhweCkiO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUud2lkdGg9IjEwMCUiO2Euc3R5bGUuaGVpZ2h0PSIxMDAlIjthLnN0eWxlLnRvcD0iMCI7YS5zdHlsZS5sZWZ0PSIwIjthLnN0eWxlLmZvbnRGYW1pbHk9IlNwaWVnZWxTZXJpZlVJLEFyaWFsLHNhbnMtc2VyaWYiO2Euc3R5bGUuZm9udFNpemU9IjIwcHgiO2EuaW5uZXJIVE1MPSI8Yj5MaXZlVGlja2VyPC9iPiI7dGhpcy5sPWE7dGhpcy5wbGF5ZXIuY29udGFpbmVyLmFwcGVuZENoaWxkKGEpO3RoaXMucGxheWVyLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJlZCI7Yy5zdHlsZS5mb250RmFtaWx5PSJTcGllZ2VsU2VyaWZVSSxBcmlhbCxzYW5zLXNlcmlmIjsKYy5zdHlsZS5jb2xvcj0id2hpdGUiO2Muc3R5bGUuZm9udFNpemU9IjE1cHgiO2Muc3R5bGUucGFkZGluZ0xlZnQ9IjE1cHgiO2Muc3R5bGUubWFyZ2luVG9wPSIyMHB4IjtjLmlubmVySFRNTD0iTnVyIGVpbiBWaWRlbyB6dW0gTGFkZW4gZGVzIFRpY2tlcnMgPiI7Yy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Mub25jbGljaz1mdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyk7Yz0uNTYyNSp0aGlzLnBsYXllci5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Quc3R5bGUud2lkdGg9IjEwMCUiO2Quc3R5bGUuaGVpZ2h0PSIiK2MrInB4IjtkLnN0eWxlLm1heEhlaWdodD0iNTAwcHgiO2Quc3R5bGUudG9wPSIwIjtkLnN0eWxlLmxlZnQ9IjAiO2Qub25jbGljaz1mdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpOwphLmFwcGVuZENoaWxkKGQpO3RoaXMuYihkKX19O2RiLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZCl7dGhpcy5pc1BhdXNlZD0hMTt0aGlzLmwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmwpO2Zvcih2YXIgYT10aGlzLnBsYXllci5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLnN0eWxlLmZpbHRlcj0iIn19O2RiLnByb3RvdHlwZS5DZT1mdW5jdGlvbihhKXt0aGlzLmY9YX07ZGIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuImNsb2FrZXIifTt5KGNjLEUpO2NjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYz1hLmdldFJhd1BsYXllcigpLmNvbmYuYWRCcmVha1RpbWU7YS5DZShmdW5jdGlvbigpe2cudi5pLnZlcnRpY2FsaXpyPSExO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2EucGF1c2UoKX0sCmMpfTt5KGJjLEYpO2JjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoYSYmYS5xdWVyeUtleSYmYS5xdWVyeUtleS5hZGJyZWFrZXIpe2cuVWQ9ITA7dmFyIGM9Zy52LmIoImNsb2FrZXIiKXx8VGM7YS5xdWVyeUtleS5hZEJyZWFrVGltZSYmKGMuYWRCcmVha1RpbWU9YS5xdWVyeUtleS5hZEJyZWFrVGltZSk7YS5xdWVyeUtleS5taW5IZWlnaHQmJihjLm1pbkhlaWdodD1hLnF1ZXJ5S2V5Lm1pbkhlaWdodCk7YS5xdWVyeUtleS5xdWVyeVNlbGVjdG9yQWxsJiYoYy5xdWVyeVNlbGVjdG9yQWxsPWEucXVlcnlLZXkucXVlcnlTZWxlY3RvckFsbCk7aWYoYyl7YT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGMucXVlcnlTZWxlY3RvckFsbCk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF07IkRJViI9PWUubm9kZU5hbWUmJihlPW5ldyBkYih7Y29udGFpbmVyOmUsY29uZjpjfSksZS5pfHx0aGlzLmIoZSl8fAoodGhpcy5pKGUpLChuZXcgY2MoZSx0aGlzLmEpKS53KCkpKX10aGlzLmcoKX19fTt2YXIgVGM9e3F1ZXJ5U2VsZWN0b3JBbGw6Ii5vdXRicmFpbi1jb250YWluZXIiLGFkQnJlYWtUaW1lOiI1MDAifSxVYz1uZXcgYmMoWCk7VC5hKFVjKTt5KCRhLEEpOyRhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS50b1N0cmluZygpKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpO3RoaXMuYihhKTtpZihhKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLmcoYyl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTskYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319OwokYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGEpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX07JGEucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmE7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfTskYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifTt5KHliLEUpO3liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7dGEuQSgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3RhLkEoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKTt0YS5BKCIjIithLCJhZHNMb2FkZXJGYWlsZWQiLApmdW5jdGlvbigpe3RoaXMuSigiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt0YS5BKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMuSigiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLmEoKX0uYmluZCh0aGlzKSk7dGEuRCgpfTt5Yi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yz1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLk0oKTt0aGlzLmIoKTtyZXR1cm59Zm9yKHZhciBlIGluIGFbZF0paWYoYVtkXS5oYXNPd25Qcm9wZXJ0eShlKSYmKGM9aXNOYU4oYVtkXVtlXSk/ITE6YVtkXVtlXSwxMDA5PT1hW2RdW2VdfHwxMDAxPT1hW2RdW2VdfHwzMDM9PWFbZF1bZV18fDQwMz09YVtkXVtlXSkpe3RoaXMuTSgpO3RoaXMuYigpO3JldHVybn19dGhpcy5KKCJhZGVycm9yIiwKYyk7dGhpcy5hKCl9O3koY2IsRik7Y2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGQ9MDtkPGMubGVuZ3RoO2QrKylhLnB1c2goY1tkXSk7Yz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylhLnB1c2goY1tkXSk7dGhpcy5vJiYoYT1sLkRiKGEsdGhpcy5vKSk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGU9YVtjXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpO2U9bmV3ICRhKGUpO2lmKCF0aGlzLmIoZSkmJiFlLmkpe3RoaXMuaShlKTt2YXIgZj1uZXcgeWIoZSx0aGlzLmEpO2YudygpfX1mb3IoYz0wO2M8YS5sZW5ndGg7YysrKWZvcihkPWFbY107ZC5wYXJlbnRFbGVtZW50Oyl7ZD1kLnBhcmVudEVsZW1lbnQ7dmFyIGg9ZC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5vfHwodGhpcy5vPVtdKSx0aGlzLm8ucHVzaChhW2NdKSxlPW5ldyAkYShoKSx0aGlzLmIoZSl8fGUuaXx8KHRoaXMuaShlKSxmPW5ldyB5YihlLHRoaXMuYSksZi53KCkpfWNhdGNoKG0pe319fXRoaXMuZygpfTtjYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhLGMsZCl7dGhpcy5jfHwodGhpcy5jPXt9KTt0aGlzLmNbYV18fCh0aGlzLmNbYV09e30pO3RoaXMuY1thXVtjXXx8KHRoaXMuY1thXVtjXT1bXSk7dGhpcy5jW2FdW2NdLnB1c2goZCl9O2NiLnByb3RvdHlwZS5LPWZ1bmN0aW9uKGEpe3ZhciBjPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY3x8dGhpcy5jJiYhdGhpcy5jW2NdKXRoaXMubXx8KHRoaXMubT1bXSksdGhpcy5tLnB1c2goYSksdGhpcy5OKCkmJih0aGlzLnUoKSx0aGlzLncoKSk7ZWxzZXt2YXIgZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jW2NdW2RdJiYKMDx0aGlzLmNbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5jW2NdW2RdW2VdKGEpfX07Y2IucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXtpZih0aGlzLm0pZm9yKHZhciBhPTA7YTx0aGlzLm0ubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5tW2FdLGQ9Yy5zUGxheWVyU2VsZWN0b3IsZT0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBjLm9FdmVudFR5cGUmJihlPWMub0V2ZW50VHlwZSk7aWYodGhpcy5jW2RdW2VdJiYwPHRoaXMuY1tkXVtlXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNbZF1bZV0ubGVuZ3RoO2YrKyl0aGlzLmNbZF1bZV1bZl0oYyl9fTtjYi5wcm90b3R5cGUuQj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpOyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1hLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9YS5vRXZlbnRUeXBlLmgmJnRhLksoYSl9Owp2YXIgdGE9bmV3IGNiKFgpO1QuYSh0YSk7cmMoKTt5KFphLEEpO1phLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS50b1N0cmluZygpKTt0aGlzLmIoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5nKGMpfTtaYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9O1phLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9O1phLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiYKYS5wYXVzZSgpfSl9O1phLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfTtaYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn07eShhYyxFKTthYy5wcm90b3R5cGUudz1mdW5jdGlvbigpe2wuZygzKTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTskKCIjIithKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYyl7bC5PLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtsLk8ucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9Yy5kYXRhLm11dGVkO2Mub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFjLmlzUGxheWluZ3x8Yy5pc1BsYXlpbmcoKSljLmlzQWQmJgpjLmlzQWQoKT90aGlzLk0oKTpjLmRhdGEmJmMuZGF0YS5hZHMmJmMuZGF0YS5hZHMudmFzdCYmYy5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLkooIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkooIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLmEoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Mub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Mub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5hKCl9LmJpbmQodGhpcykpO2Mub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5hKCl9LmJpbmQodGhpcykpO2Mub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpOwpjLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9O3koSmIsRik7SmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWFbY10sZT0iIjt0cnl7ZT1kLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChoKXtlPWQuaWR9aWYoZSYmCiQoIiMiK2UpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBmPW5ldyBaYShlKTt0aGlzLmIoZil8fCh0aGlzLmkoZiksKG5ldyBhYyhmLHRoaXMuYSkpLncoKSl9Y2F0Y2goaCl7fX10aGlzLmcoKX07SmIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitjKTtmb3IodmFyIGQgaW4gdGhpcy5mKWlmKGM9PXRoaXMuZltkXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5mW2EueWEoKV0/ITA6ITF9O3ZhciBWYz1uZXcgSmIoWCk7VC5hKFZjKTt5KHFhLEEpO3FhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz0hMTt0aGlzLmFiPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihkKXt0cnl7aWYoZCYmZC5zb3VyY2UmJmQuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnN8fChkLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLlJjKCl9LmJpbmQodGhpcykpLAp0aGlzLnM9ITApO3ZhciBlPXRoaXMudShkLnNvdXJjZS5fZW52dmFycyk7ZSYmKHRoaXMubT1lKTtpZighdGhpcy5BJiYoZC5zb3VyY2UuQ0hPT1NFUl9USU1FfHxkLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGY9ZC5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1kLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2wudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGYsITApO2wudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGYrKHBhcnNlSW50KGgsMTApPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7bC50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLkE9ITA7dGhpcy5hYj1kLnNvdXJjZX19fWNhdGNoKG0pe319LmJpbmQodGhpcykpO3RoaXMudmMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGM9YSk7dGhpcy5iKGEpO3RoaXMuZyhjKTsKdGhpcy5HKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7aGIoInNldCB1cCBwbGF5ZXIgRE9ORSIsdGhpcy5nZXRSYXdQbGF5ZXIoKSxhLCJPbmx5SE9NQUQiKX07cWEucHJvdG90eXBlLnRkPWZ1bmN0aW9uKGEpe3RoaXMubHx8KHRoaXMubD1bXSk7dGhpcy5sLnB1c2goYSl9O3FhLnByb3RvdHlwZS55ZD1mdW5jdGlvbigpe3RoaXMuYWImJnRoaXMuYWIucG9zdE1lc3NhZ2UoImNsaWNrdGhyb3VnaF9ldmVudCIpfTtxYS5wcm90b3R5cGUuUmM9ZnVuY3Rpb24oKXtpZih0aGlzLmwmJnRoaXMubC5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmwubGVuZ3RoO2ErKyl0cnl7dGhpcy5sW2FdKCl9Y2F0Y2goYyl7fX07cWEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3FhLnByb3RvdHlwZS52Yz1mdW5jdGlvbigpe2lmKHRoaXMubSlyZXR1cm4gdGhpcy5tO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7CmlmKGE9dGhpcy51KGEpKXJldHVybiB0aGlzLm09YX19O3FhLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJmEudmlkZW9TbG90JiYoYz1hKTthJiZhLmhkdnBhaWQmJihjPWEuaGR2cGFpZCk7cmV0dXJuIGN9O3FhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe307cWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt9O3FhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKGEsYyl7YSYmYS5wYXVzZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYucGF1c2UmJnRoaXMuZi5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZiYmdGhpcy5mLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZi5yZXN1bWUmJnRoaXMuZi5yZXN1bWUoKX0uYmluZCh0aGlzKSk7CmEmJmEubXV0ZUV2ZW50JiZjLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLm11dGUmJnRoaXMuZi5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLnVubXV0ZSYmdGhpcy5mLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX07cWEucHJvdG90eXBlLkJkPWZ1bmN0aW9uKGEpe3RoaXMuZj1hfTtxYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn07eShJYixFKTtJYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9dGhpcy5wbGF5ZXI7YS5hdXRvc3RhcnQmJiF0aGlzLm8mJih0aGlzLmYoKSx0aGlzLm89ITAsdGhpcy5nKCkpOwpjLnhhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpKX07SWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci52YygpP3RoaXMuYSgpOih0aGlzLmN8fCh0aGlzLmM9MSksdGhpcy5jKyssMTA8dGhpcy5jP3RoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwKSl9O3koJGIsRik7JGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZihnLnYuZyl7aWYoZy52LmEucGxheWVyKXt2YXIgYT1nLnYuYS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGUpe2wudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGMsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFhKGFbZF0pLHRoaXMuYihjKXx8KHRoaXMuaShjKSwobmV3IEliKGMsdGhpcy5hKSkudygpKX19ZWxzZSB0aGlzLmcoKX07dmFyIFdjPW5ldyAkYihYKTtULmEoV2MpOwp5KExhLEEpO0xhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuYihhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nKGEpO3RoaXMuS2E9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9ITB9LmJpbmQodGhpcykpfTtMYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O0xhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O0xhLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhP2EubXV0ZWQ6ITB9O0xhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfTtMYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn07CkxhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuYz8oMCx0aGlzLmMpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksNDAwKX07TGEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifTt5KGtiLEUpO2tiLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn07a2IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYyl7Yz1jLmdldEVycm9yKCk7Yy5nZXRFcnJvckNvZGUoKTt0aGlzLmN8fCh0aGlzLmM9W10pO3RoaXMuYy5wdXNoKGMuZ2V0RXJyb3JDb2RlKCkpOwoxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwzMDM9PWMuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yy5nZXRFcnJvckNvZGUoKT90aGlzLmIoKTp0aGlzLkooImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO3RoaXMuTSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfTtrYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMucygpO3RoaXMuZj90aGlzLkIodGhpcy5mKToodGhpcy5mPXRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCkpfTtrYi5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKGEuS2EmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5mKXt0aGlzLmEoKTtyZXR1cm59aWYoIXRoaXMubyl7dGhpcy5hKCk7cmV0dXJufWE9CiEwO2lmKHRoaXMuYyYmdGhpcy5jLmxlbmd0aCYmMTx0aGlzLmMubGVuZ3RoKWZvcih2YXIgYz0wO2M8dGhpcy5jLmxlbmd0aC0xO2MrKykxMDA5IT10aGlzLmNbY10mJjMwMyE9dGhpcy5jW2NdJiY0MDMhPXRoaXMuY1tjXSYmKGE9ITEpO2lmKGEpdGhpcy5NKCJlbXB0eSIpLHRoaXMuYigpO2Vsc2V7dGhpcy5hKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9O3koWmIsRik7WmIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmw9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYyBpbiBhKXt2YXIgZD1uZXcgTGEoYS5pdGVtKCtjKSk7dGhpcy5iKGQpfHwtMT09ZC5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5pKGQpLChuZXcga2IoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgWGM9Cm5ldyBaYihYKTtULmEoWGMpO3koeWEsQSk7eWEucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuYihhKTt0aGlzLmcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl9O3lhLnByb3RvdHlwZS5NYT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5sKCl9LmJpbmQodGhpcyksNTAwKX07eWEucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYz10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZjJiYwPGMmJmE+PWMtMSYmdGhpcy5jJiZ0aGlzLmMoKX07eWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGM9YS5wbGF5YmFjay5nZXREdXJhdGlvbigpKTsKcmV0dXJuIGN9O3lhLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihjPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGN9O3lhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX07eWEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9O3lhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfTt5YS5wcm90b3R5cGUuSWU9ZnVuY3Rpb24oKXt0aGlzLmY9CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9O3lhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In07eShIYixFKTtIYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubz0xMDt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLmZ8fCh0aGlzLmY9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5KKCJhZGVycm9yIik7dGhpcy5jKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLkooIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksCnRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLkooIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5KKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKToodGhpcy5KKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKToodGhpcy5mfHx0aGlzLmYrKyx0aGlzLmY8PXRoaXMubz8odGhpcy5mKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuSigibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpKX07SGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pc1BsYXlpbmcoKT8odGhpcy5wbGF5ZXIuSWUoKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfTt5KFliLEYpO1liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxjO2EmJmFbMF0mJihjPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZjWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgeWEod2luZG93LnBsYXllckFwaSksdGhpcy5iKGEpfHwodGhpcy5pKGEpLChuZXcgSGIoYSx0aGlzLmEpKS53KCkpKTt0aGlzLmcoKX07dmFyIFljPW5ldyBZYihYKTtULmEoWWMpO3koU2EsCkEpO1NhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2EucGFyZW50Tm9kZT8oYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZSk/KHRoaXMuYihhKSwoYT10aGlzLmdldFJhd1BsYXllcigpKT8odGhpcy5nKGEpLHRoaXMuS2E9ITEsYS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuS2E9ITB9LmJpbmQodGhpcykpKTp0aGlzLmY9ITApOnRoaXMuZj0hMDp0aGlzLmY9ITA6dGhpcy5mPSEwfTtTYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O1NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O1NhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0iIjthLmN1cnJlbnRUaW1lJiYoYz1hLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGN9O1NhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz0wO2EuZHVyYXRpb24mJihjPWEuZHVyYXRpb24pO3JldHVybiBjfTtTYS5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYz10aGlzLmdldER1cmF0aW9uKCk7YSYmYyYmMT5jLWE/dGhpcy5jKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX07U2EucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9O3koWWEsRSk7WWEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci54YSgpLGM9dGhpcy5wbGF5ZXIuUigpO2MmJmMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMucGxheWVyLkthPSExfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMuTSgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSk7YT10aGlzLmYoKTswPGEuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkIoKTp0aGlzLnMoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmEoKXx8KHRoaXMuSigiY29udGVudHBsYXkiKSx0aGlzLmMoITApKX0uYmluZCh0aGlzKSwxRTMpfTtZYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RoaXMuYmEoKXx8dGhpcy5jKCEwKX07WWEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmYoKTshYS5JYSYmYS5MYSYmYS5sZiYmYS5tZiYmKHRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmMoKSl9O1lhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihjKXthOntjPWMuZ2V0RXJyb3IoKTtmb3IoZCBpbiBjKWlmKCJudW1iZXIiPT10eXBlb2YgY1tkXSl7dmFyIGQ9Y1tkXTticmVhayBhfWQ9dm9pZCAwfTEwMDk9PWR8fDMwMz09ZHx8NDAzPT1kPyh0aGlzLk0oKSx0aGlzLmIoKSk6KHRoaXMuSigiYWRlcnJvciIsZCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9O1lhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7aWYoIXRoaXMubylmb3IodmFyIGE9a2MuYygpLGM9dGhpcy5wbGF5ZXIueGEoKS5pZCxkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5pZD09YyYmKHRoaXMubz1hW2RdKTtyZXR1cm4gdGhpcy5vfTtZYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PQphPyExOmE7dGhpcy5wbGF5ZXIuS2E/YT90aGlzLmYoKS5hZHNMb2FkZXI/dGhpcy5hKCEwKTp0aGlzLmEoKTp0aGlzLmEoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSwxMCl9O3koeGIsRik7eGIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7YT1uZXcgU2EoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuYihhKXx8YS5mfHwodGhpcy5pKGEpLChuZXcgWWEoYSx0aGlzLmEpKS53KCkpfTt4Yi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWtjLmMoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLm0oYVtjXSk7dGhpcy5nKCl9O3hiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dmFyIGE7aWYoZy52LmcmJmcudi5hLnBsYXllcmFwaSYmKGE9Zy52LmEucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTthPVtdO3ZhciBjPQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGMmJmMubGVuZ3RoKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXS5mZXJtb2Q7ZSYmYS5wdXNoKGUpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZjLmxlbmd0aCl7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdJiZjW2RdLmZlcm1vZCYmYS5wdXNoKGNbZF0uZmVybW9kKSxjW2RdJiZjW2RdLnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChjW2RdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxjW2RdJiZjW2RdLnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZjW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChjW2RdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX07dmFyIGtjPW5ldyB4YihYKTtULmEoa2MpO3koS2EsQSk7S2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7dGIuYyYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLmIoYSk7aWYoYS50YWdOYW1lKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1jP3RoaXMuZyhjKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtLYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtpZih0Yi5jKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9OwpLYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9O0thLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9O0thLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJuZXh0In07S2EucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0thLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkfWVsc2UgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9CnRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfTt5KEdiLEUpO0diLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuYz1hLmlkKTt0Yi5jP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihjKXt2YXIgZD1jLnBsYXllckNvbnRhaW5lcjtkJiZ0aGlzLmMmJmQhPXRoaXMuY3x8ImFkZXJyb3IiIT1jLmV2ZW50fHxsLmIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWMuYWRUeXBlfHwoYy5hZFVSTCYmKGNvbmYuYWRUYWc9Yy5hZFVSTCksdGhpcy5KKCJhZGVycm9yIixjLnRmKSx0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihjKXsiYWRlcnJvciI9PWMmJgoodGhpcy5KKCJhZGVycm9yIiksdGhpcy5hKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9O3koWGIsRik7WGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXt0aGlzLmM9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZih0aGlzLmMpZm9yKHZhciBjPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGQ9Yy5sZW5ndGgsZT0wO2U8ZDtlKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY1tlXSkpYT1uZXcgS2EoYSksYS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYT1uZXcgR2IoYSx0aGlzLmEpLGEudygpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9Cm5ldyBLYShhKSxhLmk/dGhpcy51KCk6dGhpcy5iKGEpfHwodGhpcy5pKGEpLGE9bmV3IEdiKGEsdGhpcy5hKSxhLncoKSl9dGhpcy5nKCl9O3ZhciB0Yj1uZXcgWGIoWCk7VC5hKHRiKTt5KFJhLEEpO1JhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKWlmKGEuR2V0VmlkZW9FbClpZihhLkdldEVsKXt2YXIgYz1hLkdldFZpZGVvRWwoKTthPWEuR2V0RWwoKTtjJiZhPyh0aGlzLmIoYSksdGhpcy5nKGMpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpO2Vsc2UgdGhpcy5hKCk7ZWxzZSB0aGlzLmEoKX07UmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX07UmEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfTtSYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTsKdmFyIGM9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2MuSXNQYXVzZWQoKSYmYy5QbGF5KCk6KGMuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfTtSYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfTtSYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXtpZihnLmouTigpJiZnLmouYigidC1vbmxpbmUuZGUiKSlyZXR1cm4hMTt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9O1JhLnByb3RvdHlwZS5jYT1mdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifTt5KFhhLEUpO1hhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7Zy5qLmIoInQtb25saW5lLmRlIikmJmcuai5OKCkmJiFnLmouVGEoKSYmCihhLlNldFZBU1RQcmVyb2xsVGFnKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci92YXN0NC1lbXB0eS54bWwiKSxnLnYuYS5ydW5JbnNpZGVDb250YWluZXI9ITEpO3RoaXMubygpO2cuai5iKCJ0LW9ubGluZS5kZSIpJiZnLmouTigpJiZnLmouVGEoKSYmKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGMpe2MuZm9yRWFjaChmdW5jdGlvbihkKXsiYXR0cmlidXRlcyI9PT1kLnR5cGUmJiJzcmMiPT09ZC5hdHRyaWJ1dGVOYW1lJiYoZD1uZXcgZGEodGhpcy5wbGF5ZXIudmlkZW9UYWcuc3JjKSxkLmhvc3QuaW5jbHVkZXMoInZlcnRpY2FsaXpyLmNvbSIpfHwoZC5ob3N0LmluY2x1ZGVzKCJkbGMyLnQtb25saW5lLmRlIik/bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMudSgpOih0aGlzLnBsYXllci52aWRlb1RhZy5zcmM9Imh0dHBzOi8vd3d3LnZlcnRpY2FsaXpyLmNvbS9hcGkvdmVydGljYWxpemVyLz9tZWRpYWZpbGU9IitnLmouQih0aGlzLnBsYXllci52aWRlb1RhZy5zcmMpKwoiJmM9IitnLmoucygxMCksdGhpcy5wbGF5ZXIudmlkZW9UYWcubG9hZCgpLHRoaXMucGxheWVyLnZpZGVvVGFnLnBsYXkoKSx0aGlzLkIoKSkpKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKS5vYnNlcnZlKHRoaXMucGxheWVyLnZpZGVvVGFnLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwfSk7YS5PbigiYWRFcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk0oKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGMpe2MuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1jLmRldGFpbC5uYW1lJiZ0aGlzLmcoKX0uYmluZCh0aGlzKSl9OwpYYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCk7dGhpcy5wYXJlbnQ9YS5wYXJlbnRFbGVtZW50O3RoaXMuYz1hLnN0eWxlO2Euc3R5bGUucG9zaXRpb249ImFic29sdXRlIjthLnN0eWxlLnRvcD0iMHB4IjthLnN0eWxlLmxlZnQ9IjBweCI7YS5zdHlsZS53aWR0aD0iMTAwJSI7YS5zdHlsZS5oZWlnaHQ9IjEwMCUiO2Euc3R5bGUuekluZGV4PSIyMDAwMCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX07WGEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci54YSgpO2Euc3R5bGU9dGhpcy5jO3RoaXMucGFyZW50LmFwcGVuZENoaWxkKGEpO3RoaXMucGFyZW50PW51bGw7dGhpcy5jPXt9fTtYYS5wcm90b3R5cGUubz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSxjPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmYoY1tkXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX07ClhhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5vKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS52YXN0RXJyb3JDb2RlJiYoYT1hW2NdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpO2EmJmEuaW5kZXhPZiYmMDw9YS5pbmRleE9mKCJBZEVycm9yIDEwMDkgKFRoZSBWQVNUIHJlc3BvbnNlIGRvY3VtZW50IGlzIGVtcHR5IikmJihhPTEwMDkpO2wudT1sLmFhKCkmJigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSk7bC51fHwxMDA5IT1hJiYzMDMhPWEmJjQwMyE9YT8odGhpcy5KKCJhZGVycm9yIixhKSx0aGlzLnMoKSk6KHRoaXMuTSgpLHRoaXMuYigpKX19O1hhLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dGhpcy5hKCExKX07eShXYixGKTtXYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7CmF8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgUmEoYVtjXSk7ZC5pfHx0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBYYShkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBaYz1uZXcgV2IoWCk7VC5hKFpjKTt5KFdhLEEpO1dhLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYz1hLmVsOyhhPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLmIoYyksdGhpcy5nKGEpKTp0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtXYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9O1dhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMucGxheWVyLnBhdXNlKCl9OwpXYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX07V2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfTtXYS5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9O3kod2IsRSk7d2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5mLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMuTS5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy5NLmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMuTS5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLk0uYmluZCh0aGlzKSl9O3diLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEpe2lmKCJvYmplY3QiPT0KdHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXSYmYVtjXS52YXN0RXJyb3JDb2RlJiYoYT1hW2NdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLk0oKSx0aGlzLmIoKSk6KHRoaXMuSigiYWRlcnJvciIsYSksdGhpcy5jKCkpfX07d2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLmEoITEpfTt5KFZiLEYpO1ZiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGM7Zm9yKGMgaW4gYSl7dmFyIGQ9bmV3IFdhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLHdpbmRvdy5icmlkcGxheWVyPWQsKG5ldyB3YihkLHRoaXMuYSkpLncoKSl9fXRoaXMuZygpfTsKdmFyICRjPW5ldyBWYihYKTtULmEoJGMpO3koc2EsQSk7c2EucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuYSgpO2Vsc2V7Zm9yKHZhciBjPWE7YyYmYy5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1jLnBhcmVudE5vZGUubm9kZU5hbWUpe2M9Yy5wYXJlbnROb2RlO2JyZWFrfWM9Yy5wYXJlbnROb2RlfXRoaXMuZyhhKTt0aGlzLmIoYyl9ZWxzZSB0aGlzLmEoKX07c2EucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpdmFyIGM9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pO2Vsc2UgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxjLmluaXRDdXN0b21FdmVudChhLCExLCExLHt9KTtjJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjKX07CnNhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dGhpcy5mPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkU3RhcnQiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmZ8fCh0aGlzLmY9ITAsdGhpcy5sKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSl9O3NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGF1c2UoKX19O3NhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dHJ5e3RoaXMuZiYmKHRoaXMubCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLmY9ITEpLHRoaXMubCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGxheSgpfX07c2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7aWYoIXRoaXMuUigpLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLAohMH07c2EucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifTt5KHJhLEUpO3JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5NKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5NKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTSgpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTSgpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiYKYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5ELmJpbmQodGhpcyksMTApfTtyYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGM9YS5nZXRFcnJvcigpKTtjLmdldEVycm9yQ29kZT8oYy5nZXRFcnJvckNvZGUoKSx0aGlzLkooImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucz0hMCwxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwzMDM9PWMuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yy5nZXRFcnJvckNvZGUoKT8odGhpcy5OPSEwLHRoaXMuTSgpKTp0aGlzLmYoKSk6KHRoaXMuc3x8dGhpcy5KKCJub2ZyYW1ld29yayIpLHRoaXMuZigpKX07cmEucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTsKdGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5EKCk7dGhpcy51KCk7dGhpcy5HKCl9O3JhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLm8uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihhKXt0aGlzLmMoYSl9LmJpbmQodGhpcykpfTtyYS5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLkI/dGhpcy5hKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKGEpfS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuQj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGMgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09CmMmJihhLmRldGFpbFtjXXx8dGhpcy5jKGEpKX07eShHYSxGKTtHYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IHNhKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYS5tKCksYT1uZXcgcmEoYSx0aGlzLmEpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5vLmJpbmQoYSkpLGEudygpKX10aGlzLmcoKX07dmFyIGFkPW5ldyBHYShYKTtULmEoYWQpO3koVSxBKTtVLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBjPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihjKXt0aGlzLmIoYyk7dmFyIGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmQ/KHRoaXMuZyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGUsZil7dGhpcy5sPWU7dGhpcy51PWZ9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oZSl7dGhpcy5kdXJhdGlvbj1lfS5iaW5kKHRoaXMpKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtVLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtVLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGE9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH07VS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX07VS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9OwpVLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfTtVLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmx9O1UucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259O1UucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9O1UucHJvdG90eXBlLk1hPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnMoYSl9LmJpbmQodGhpcykpfTtVLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGM9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYyYmMDxjJiYKYT49Yy0xJiYhdGhpcy5mJiYodGhpcy5mPSEwLHRoaXMuYyYmdGhpcy5jKCkpfTt5KGJhLEUpO2JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMucylpZih0aGlzLmZ8fCh0aGlzLmY9MCksdGhpcy5mKyssMTU8dGhpcy5mKXdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhP3dpbmRvdy5jYW5SdW5BZHM/dGhpcy56YSgpOnRoaXMuYyghMCk6KHRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSxhLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuYygpOnRoaXMuYyghMCkpO2Vsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5zPSEwO3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRChkKTt0aGlzLm98fCh0aGlzLkooImFkZXJyb3IiLHRoaXMuWCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfTtiYS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3RoaXMubz0hMDt0aGlzLk0oImVtcHR5IHZhc3QiKX07YmEucHJvdG90eXBlLkQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGY/KGguWD0KZixoLkooImFkZXJyb3IiLGYpKTpoLkooImFkZXJyb3IiKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQigpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYyhhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQigpO2JyZWFrfX07YmEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTsKdGhpcy51KCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYyl7InBsYXlpbmciPT1jJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9OwpiYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLmlzUGxheWluZz90aGlzLmEoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoYSl9LmJpbmQodGhpcyksMTApfTt5KEksRik7SS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IFUod2luZG93Lmluc2VydGVkUGxheWVyKTthLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBjPTA7Yzx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YysrKWE9bmV3IFUod2luZG93LlRWMlBsYXllcnNbY10pLGEuaXx8dGhpcy5iKGEpfHwodGhpcy5pKGEpLGE9bmV3IGJhKGEsdGhpcy5hKSxhLncoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYyBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShjKSYmCndpbmRvdy5UVjJQbGF5ZXJzW2NdLnZpZGVvTW9kZWwmJihhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhLkEodGhpcy5hKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpKTt0aGlzLnUoKTt0aGlzLmcoKX07dmFyIGJkPW5ldyBJKFgpO1QuYShiZCk7eSh3LEEpO3cucHJvdG90eXBlLlQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTt0aGlzLmIoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5nKGMpO3RoaXMuZigpfTt3LnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5U3RhdGUoKTthIT10aGlzLmwmJih0aGlzLmw9YSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMil9O3cucHJvdG90eXBlLmNhPQpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifTt3LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07dy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX07eShyLEUpO3IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLnM9MDt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLkcoKX07ci5wcm90b3R5cGUuRz1mdW5jdGlvbigpe2lmKCh0aGlzLmM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJnRoaXMuYy5hZHNMb2FkZXIpcmV0dXJuIHRoaXMuSWE9dGhpcy5jLmFkc0xvYWRlcix0aGlzLm8oKSwhMDt0aGlzLnMrKztpZih0aGlzLnM+dGhpcy5JKXRoaXMuSigibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz8KdGhpcy5mKCEwKTp0aGlzLmYoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkcuYmluZCh0aGlzKSwxMDApLCExfTtyLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZSl7dGhpcy5CKGUpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXt0aGlzLkIoZSk7dGhpcy5KKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuTigpfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwyMCl9O3IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkooImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTticmVha319O3IucHJvdG90eXBlLkQ9ZnVuY3Rpb24oKXt0aGlzLnU9ITB9O3IucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudT8odGhpcy5NKCksdGhpcy5iKCkpOnRoaXMuZighMCl9LmJpbmQodGhpcyksMTAwKX07ci5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmEodm9pZCAwPT09CmE/ITE6YSl9O3kocSxGKTtxLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE7aWYoKGE9ZXZhbCgidHJ5IHtzcmF2dnBsUGxheWVySW5zdGFuY2VzfWNhdGNoKGUpe2ZhbHNlfSIpKXx8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMmJndpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aCYmMDx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGgpZm9yKHZhciBjPWF8fHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLGQ9MDtkPGMubGVuZ3RoO2QrKylhPW5ldyB3KGNbZF0pLHRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHIoYSx0aGlzLmEpKS53KCkpO3RoaXMuZygpfTt2YXIgY2Q9bmV3IHEoWCk7VC5hKGNkKTt5KHQsQSk7dC5wcm90b3R5cGUuVD1mdW5jdGlvbigpe3ZhciBhPSExLGM9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGM9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChkKXt9YSYmYz8odGhpcy5iKGEpLAp0aGlzLmcoYyksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5hKCl9O3QucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9O3QucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9O3QucHJvdG90eXBlLmNhPWZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn07eShRLEUpO1EucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmMoKX07US5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoKHZvaWQgMD09PWE/MDphKT8odGhpcy5KKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyghMCl9LmJpbmQodGhpcyksMTAwKSl9O3koSyxGKTtLLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTsKaWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyB0KHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmkpe3RoaXMuZygpO3JldHVybn1pZighdGhpcy5iKGEpKXt0aGlzLmkoYSk7KG5ldyBRKGEsdGhpcy5hKSkudygpO3RoaXMuZygpO3JldHVybn19dGhpcy5nKCl9O3ZhciBkZD1uZXcgSyhYKTtULmEoZGQpO3koRyxBKTtHLnByb3RvdHlwZS5UPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5iKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCl9O0cucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9O0cucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfTsKRy5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXtyZXR1cm4iQVYifTt5KHgsRSk7eC5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcykpO3RoaXMuZigpO3RoaXMubygpfTt4LnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGM9MDtjPGEuYWRzTG9hZGVyLmxlbmd0aDtjKyspe3ZhciBkPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihkPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2NdLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXtlLmdldEVycm9yJiYoZT1lLmdldEVycm9yKCkpO3ZhciBmPSExO2lmKDEwMDk9PWV8fDMwMz09ZXx8NDAzPT1lKWY9ITA7aWYoIWYpZm9yKHZhciBoIGluIGUpe2lmKGVbaF0mJmVbaF0uaW5kZXhPZiYmKC0xIT1lW2hdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWVbaF0uaW5kZXhPZigiMzAzIil8fC0xIT1lW2hdLmluZGV4T2YoIjQwMyIpKSl7Zj0hMDticmVha31pZihlW2hdJiYoMTAwOT09ZVtoXXx8MzAzPT1lW2hdfHw0MDM9PWVbaF0pKXtmPSEwO2JyZWFrfX1mPyh0aGlzLk0oKSx0aGlzLmIoKSk6dGhpcy5jKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9O3gucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5pKCkpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCksdGhpcy5NKCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5jKCk6dGhpcy5jKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfX07eC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxRTQpO3RoaXMuYShhKX07eShuLEYpO24ucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT1uZXcgRyhhKTthLmk/dGhpcy5nKCk6CnRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHgoYSx0aGlzLmEpKS53KCkpfTtuLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuYyh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLmcoKX07dmFyIGVkPW5ldyBuKFgpO1QuYShlZCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihhKXtpZihhLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBjPWEuZmlsZW5hbWU/YS5maWxlbmFtZToiIjtpZigtMSE9Yy5pbmRleE9mKCJob21hZCIpfHwtMSE9Yy5pbmRleE9mKCJoZC1tYWluIikpYz1hLm1lc3NhZ2U/YS5tZXNzYWdlOiIiLGE9YS5lcnJvci5zdGFjaz8KYS5lcnJvci5zdGFjazoiIiwtMSE9Yy5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhhPWMuc3Vic3RyaW5nKGMuaW5kZXhPZigiOiIpKzEsYy5pbmRleE9mKCJpcyBub3QiKS0xKSxsLlAodi5ZKSxsLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixhLCEwKSk6LTEhPWEuaW5kZXhPZigic2V0QCIpJiYobC5QKHYuYWEpLGwudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgSWM9Zy5qLmwuZ2V0KCJzZXRJbnRlcnZhbCIpLEpjPWcuai5sLmdldCgic2V0VGltZW91dCIpO2cudj1uZXcgcWI7dHJ5e3ZhciBsYz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iaGQtbWFpbi5qcyJdJyk7bGMmJmxjLnNldEF0dHJpYnV0ZSgiaWQiLGcuai5sYigpKTt2YXIgeWM9bGMuZ2V0QXR0cmlidXRlKCJkYXRhLWluZm8iKTt5YyYmKGcudi5hPXdpbmRvd1t5Y10pfWNhdGNoKGEpe312YXIgTmI9bmV3IENhO2hiKCJjaGFubmVsTmFtZTogIisKTmIuYSgpLCJIb21hZEluaXQiKTtoYigiY2hhbm5lbE5hbWVEZXByZWNhdGVkOiAiK05iLmYoKSwiSG9tYWRJbml0Iik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoTmIuYSgpLGZ1bmN0aW9uKGEpe2cudi5nfHwoZy52LmE9YS5kZXRhaWwpfSwhMSk7bC5oYSh3aW5kb3csbC5nKDEwKSx7fSk7dmFyIHZjPWwuZygxMCk7dWMoKTtrLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7dGhpcy5vPSEwfTtrLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5jPXRoaXMucGxheWVyLmNhKCk7Zy5wbGF5ZXI9YX07ay5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt0aGlzLmI9YX07ay5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXt0aGlzLmc9YX07ay5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdbYV07dGhpcy5nW3RoaXMuY10mJnRoaXMuZ1t0aGlzLmNdW2FdJiYoYz10aGlzLmdbdGhpcy5jXVthXSk7cmV0dXJuIGN9O2sucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSwKYyl7Yz12b2lkIDA9PT1jPyExOmM7Zy5VYS5nKCk7dmFyIGQ9ITE7aWYodGhpcy51KCkpdGhpcy5iLlJhKHRoaXMuYi5lYyx0aGlzLmIuQmEsdGhpcy5iLmRkLGZ1bmN0aW9uKCl7dGhpcy5pKGEsYyl9LmJpbmQodGhpcyksdGhpcy5iLnRiKTtlbHNlIGlmKGwudSYmLTE9PT13YS5QYS5pbmRleE9mKCJzdm1fZHJvcCIpJiYod2EuUGErPSImc3ZtX2Ryb3A9MSIpLHdhLmtiJiYhd2EuR2Qpd2EudGUoZnVuY3Rpb24oKXt0aGlzLmkoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2wuYSh2LmIsdGhpcy5wbGF5ZXIuQ2EoKSk7dmFyIGU9dGhpcy5nLGY9bmV3IGlhKHRoaXMucGxheWVyLGUpO2MmJmYuSSgpO2YuZXhpdEZ1bGxzY3JlZW4oKTt2YXIgaD1uZXcgdShmLHRoaXMuYixlKTtoLk5iKHRoaXMuZyk7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoZT0hMSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihlPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKSxhPQphKGUpKTthfHxsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5yZSYmKGQ9ITEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5lYShhLGQpO3RoaXMucGxheWVyLmpkKGgpfS5iaW5kKHRoaXMpLDApfX07ay5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlO2lmKHRoaXMuZil7dmFyIGM9YS5nZXRUaW1lKCktdGhpcy5mLmdldFRpbWUoKTt0aGlzLmY9YTtyZXR1cm4gM0U1PGM/ITA6ITF9dGhpcy5mPWE7cmV0dXJuITF9O2sucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtsLnBhKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubShhKSk/dGhpcy5pKGEpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfTtrLnByb3RvdHlwZS5JPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLm8pe2wucGEoInBvc3Ryb2xsIik7dGhpcy5OKCk7dmFyIGM9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5tKGMpKT90aGlzLmkoYyxnLnYuYigicG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50Iik/ITA6YSk6KGwudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfX07ay5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX07ay5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMucGxheWVyLkhlKHRoaXMuSS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTWEoKX07ay5wcm90b3R5cGUucz1mdW5jdGlvbihhKXtsLnBhKCJtaWRyb2xsIik7aWYoIXRoaXMubCl7dGhpcy5sPSEwO3ZhciBjPXRoaXMuYSgiYWRUYWciKTt0aGlzLmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLmkoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubD0hMX0uYmluZCh0aGlzKSwxRTMpKToobC50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxsLmEodi5nLHRoaXMucGxheWVyLkNhKCkpKX19O2sucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5HZSh0aGlzLnMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuYmQoKX07ay5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuSygpO3RoaXMucGxheWVyLmJkJiZ0aGlzLkIoKTt0aGlzLkQoKX19KSgpO30pKCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
78.46.33.212
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.212.33.46.78.clients.your-server.de
- Software
-
openresty/1.19.3.1 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame F3DE
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.tvtoday.de/d3dbec2a6c211f9e96833b47bc7f6219d4f34e7d/
|
112 B
680 B
|
96ms
32ms
|
XHR
application/json |
148.251.89.206
HETZNER-AS
|
|
|
GET
H2
|
200
|
547f0c02e4b089153cb74c69_245.webp
images.tvtoday.de/itv/2021-01-12/
|
2 KB
2 KB
|
25ms
25ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd3a6098189656084da6d05_245.webp
images.tvtoday.de/itv/2021-01-12/
|
8 KB
8 KB
|
26ms
25ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd359bb818965750e93ce6b_245.webp
images.tvtoday.de/itv/2021-01-11/
|
5 KB
5 KB
|
26ms
25ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd3647c818965750e9432f8_245.webp
images.tvtoday.de/itv/2021-01-11/
|
6 KB
6 KB
|
26ms
25ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd35a34818965750e93d2f9_245.webp
images.tvtoday.de/itv/2021-01-11/
|
4 KB
4 KB
|
26ms
25ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fdc5aa481896512334958ba_245.webp
images.tvtoday.de/itv/2021-01-11/
|
6 KB
6 KB
|
26ms
26ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
548a252de4b0c014706bce81_245.webp
images.tvtoday.de/itv/2021-01-11/
|
6 KB
6 KB
|
27ms
26ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd3a6098189656084da6d05_780.jpg
images.tvtoday.de/itv/2021-01-12/
|
46 KB
46 KB
|
25ms
25ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd3a98e8189656084da86de_780.jpg
images.tvtoday.de/itv/2021-01-12/
|
51 KB
52 KB
|
27ms
26ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5fd3add58189656084daac06_780.jpg
images.tvtoday.de/itv/2021-01-12/
|
41 KB
42 KB
|
25ms
25ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|