/
station_catalog.html
563 lines (388 loc) · 932 KB
/
station_catalog.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
<!DOCTYPE html>
<html lang="en" data-content_root="" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>Station catalog — SolarStations</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" href="_static/styles/sphinx-book-theme.css?digest=14f4ca6b54d191a8c7657f6c759bf11a5fb86285" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/togglebutton.css" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
<link rel="stylesheet" type="text/css" href="_static/sphinx-thebe.css" />
<link rel="stylesheet" type="text/css" href="_static/design-style.4045f2051d55cab465a707391d5b2007.min.css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
<script src="_static/scripts/sphinx-book-theme.js?digest=5a5c038af52cf7bc1a1ec88eea08e6366ee68824"></script>
<script>let toggleHintShow = 'Click to show';</script>
<script>let toggleHintHide = 'Click to hide';</script>
<script>let toggleOpenOnPrint = 'true';</script>
<script src="_static/togglebutton.js"></script>
<script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
<script src="_static/design-tabs.js"></script>
<script async="async" src="https://www.googletagmanager.com/gtag/js?id=G-6KXSD7FTJM"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){ dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-6KXSD7FTJM');
</script>
<script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"
const thebe_selector = ".thebe,.cell"
const thebe_selector_input = "pre"
const thebe_selector_output = ".output, .cell_output"
</script>
<script async="async" src="_static/sphinx-thebe.js"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'station_catalog';</script>
<link rel="canonical" href="https://SolarStations.org/station_catalog.html" />
<link rel="shortcut icon" href="_static/assessing_solar_favicon.ico"/>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Station requirements and categorization" href="station_requirements.html" />
<link rel="prev" title="Introduction" href="intro.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search this book..."
aria-label="Search this book..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<a class="navbar-brand logo" href="intro.html">
<img src="_static/assessing_solar_logo.png" class="logo__image only-light" alt="SolarStations - Home"/>
<script>document.write(`<img src="_static/assessing_solar_logo.png" class="logo__image only-dark" alt="SolarStations - Home"/>`);</script>
</a></div>
<div class="sidebar-primary-item"><nav class="bd-links" id="bd-docs-nav" aria-label="Main">
<div class="bd-toc-item navbar-nav active">
<ul class="nav bd-sidenav bd-sidenav__home-link">
<li class="toctree-l1">
<a class="reference internal" href="intro.html">
Introduction
</a>
</li>
</ul>
<ul class="current nav bd-sidenav">
<li class="toctree-l1 current active"><a class="current reference internal" href="#">Station catalog</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_requirements.html">Station requirements</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_metadata.html">Metadata</a></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">High-quality networks</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="station_network_bsrn.html">Baseline Surface Radiation Network (BSRN)</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_network_midc.html">MIDC</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_network_solrad.html">SOLRAD</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_network_srml.html">SRML</a></li>
<li class="toctree-l1"><a class="reference internal" href="station_network_esmap.html">ESMAP</a></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Other networks</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="station_network_pvlive.html">PV-Live</a></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Appendix</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="contributing.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference external" href="https://assessingsolar.org">AssessingSolar.org</a></li>
<li class="toctree-l1"><a class="reference external" href="https://iea-pvps.org/research-tasks/solar-resource-for-high-penetration-and-large-scale-applications/">IEA PVPS Task 16</a></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="sbt-scroll-pixel-helper"></div>
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item"><label class="sidebar-toggle primary-toggle btn btn-sm" for="__primary" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-bars"></span>
</label></div>
</div>
<div class="header-article-items__end">
<div class="header-article-item">
<div class="article-header-buttons">
<div class="dropdown dropdown-source-buttons">
<button class="btn dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Source repositories">
<i class="fab fa-github"></i>
</button>
<ul class="dropdown-menu">
<li><a href="https://github.com/assessingsolar/solarstations" target="_blank"
class="btn btn-sm btn-source-repository-button dropdown-item"
title="Source repository"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fab fa-github"></i>
</span>
<span class="btn__text-container">Repository</span>
</a>
</li>
<li><a href="https://github.com/assessingsolar/solarstations/issues/new?title=Issue%20on%20page%20%2Fstation_catalog.html&body=Your%20issue%20content%20here." target="_blank"
class="btn btn-sm btn-source-issues-button dropdown-item"
title="Open an issue"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-lightbulb"></i>
</span>
<span class="btn__text-container">Open issue</span>
</a>
</li>
</ul>
</div>
<div class="dropdown dropdown-download-buttons">
<button class="btn dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Download this page">
<i class="fas fa-download"></i>
</button>
<ul class="dropdown-menu">
<li><a href="_sources/station_catalog.ipynb" target="_blank"
class="btn btn-sm btn-download-source-button dropdown-item"
title="Download source file"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-file"></i>
</span>
<span class="btn__text-container">.ipynb</span>
</a>
</li>
<li>
<button onclick="window.print()"
class="btn btn-sm btn-download-pdf-button dropdown-item"
title="Print to PDF"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-file-pdf"></i>
</span>
<span class="btn__text-container">.pdf</span>
</button>
</li>
</ul>
</div>
<button onclick="toggleFullScreen()"
class="btn btn-sm btn-fullscreen-button"
title="Fullscreen mode"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-expand"></i>
</span>
</button>
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script>
<script>
document.write(`
<button class="btn btn-sm navbar-btn search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
</button>
`);
</script>
</div></div>
</div>
</div>
</div>
<div id="jb-print-docs-body" class="onlyprint">
<h1>Station catalog</h1>
<!-- Table of contents -->
<div id="print-main-content">
<div id="jb-print-toc">
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section class="tex2jax_ignore mathjax_ignore" id="station-catalog">
<h1>Station catalog<a class="headerlink" href="#station-catalog" title="Permalink to this heading">#</a></h1>
<p>This site provides an overview of available solar radiation monitoring stations worldwide and metadata of the stations.</p>
<p>The table is also available to download in CSV form: <a class="reference download internal" download="" href="_downloads/f85f41dda48ab008055bbfad91e578b2/SolarStationsOrg-station-catalog.csv"><code class="xref download docutils literal notranslate"><span class="pre">SolarStationsOrg-station-catalog.csv</span></code></a></p>
<div class="cell tag_full-width tag_remove-input docutils container">
<div class="cell_output docutils container">
<div class="output text_html"><style>:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0,0,0,.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0,0,0,.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before{border-left-color:#ffffff80}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:#ffffff80;border-left-color:transparent}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0!important;padding-top:0!important;padding-bottom:0!important;border-top-width:0px!important;border-bottom-width:0px!important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0!important;overflow:hidden!important}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before{position:absolute;display:block;bottom:50%;content:"\25b2";content:"\25b2"/""}table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{position:absolute;display:block;top:50%;content:"\25bc";content:"\25bc"/""}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>th.dt-ordering-asc,table.dataTable thead>tr>th.dt-ordering-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc,table.dataTable thead>tr>td.dt-ordering-asc,table.dataTable thead>tr>td.dt-ordering-desc{position:relative;padding-right:30px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order{position:absolute;right:12px;top:0;bottom:0;width:12px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0,0,0,.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled span.dt-column-order:before,table.dataTable thead>tr>td.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled span.dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255,255,255,.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0d6efd;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0)}to{transform:translate(24px)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td,table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:700}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0,0,0,.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{border-top:1px solid rgba(0,0,0,.3);padding:10px 10px 6px}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr:first-child>*{border-top:none}table.dataTable>tbody>tr:last-child>*{border-bottom:none}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.9);color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable>tbody>tr>th,table.dataTable>tbody>tr>td{padding:8px 10px}table.dataTable.row-border>tbody>tr>*,table.dataTable.display>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15)}table.dataTable.row-border>tbody>tr:first-child>*,table.dataTable.display>tbody>tr:first-child>*{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}table.dataTable.cell-border>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15);border-right:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr>*:first-child{border-left:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr:first-child>*{border-top:1px solid rgba(0,0,0,.3)}table.dataTable.stripe>tbody>tr:nth-child(odd)>*,table.dataTable.display>tbody>tr:nth-child(odd)>*{box-shadow:inset 0 0 0 9999px #00000006;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.023)}table.dataTable.stripe>tbody>tr:nth-child(odd).selected>*,table.dataTable.display>tbody>tr:nth-child(odd).selected>*{box-shadow:inset 0 0 0 9999px #0d6efdeb;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px #00000009;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd!important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),1)!important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_1{box-shadow:inset 0 0 0 9999px #0000000e;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.054)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_2{box-shadow:inset 0 0 0 9999px #0000000c;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.047)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_3{box-shadow:inset 0 0 0 9999px #0000000a;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.039)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdf3;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.954)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf1;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.947)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdef;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px #00000003;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px #00000001;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efde8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px #00000015;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px #00000013;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px #00000010;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdfa;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdf5;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.962)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}div.dt-container{position:relative;clear:both}div.dt-container div.dt-layout-row{display:table;clear:both;width:100%}div.dt-container div.dt-layout-row.dt-layout-table,div.dt-container div.dt-layout-row.dt-layout-table div.dt-layout-cell{display:block}div.dt-container div.dt-layout-cell{display:table-cell;vertical-align:middle;padding:5px 0}div.dt-container div.dt-layout-cell.dt-full{text-align:center}div.dt-container div.dt-layout-cell.dt-start{text-align:left}div.dt-container div.dt-layout-cell.dt-end{text-align:right}div.dt-container div.dt-layout-cell:empty{display:none}div.dt-container .dt-search input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}div.dt-container .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit}div.dt-container select.dt-input{padding:4px}div.dt-container .dt-paging .dt-paging-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:inherit!important;border:1px solid transparent;border-radius:2px;background:transparent}div.dt-container .dt-paging .dt-paging-button.current,div.dt-container .dt-paging .dt-paging-button.current:hover{color:inherit!important;border:1px solid rgba(0,0,0,.3);background-color:#0000000d;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(230,230,230,.05)),color-stop(100%,rgba(0,0,0,.05)));background:-webkit-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-moz-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-ms-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-o-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:linear-gradient(to bottom,#e6e6e60d,#0000000d)}div.dt-container .dt-paging .dt-paging-button.disabled,div.dt-container .dt-paging .dt-paging-button.disabled:hover,div.dt-container .dt-paging .dt-paging-button.disabled:active{cursor:default;color:#00000080!important;border:1px solid transparent;background:transparent;box-shadow:none}div.dt-container .dt-paging .dt-paging-button:hover{color:#fff!important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0%,#111 100%);background:-moz-linear-gradient(top,#585858 0%,#111 100%);background:-ms-linear-gradient(top,#585858 0%,#111 100%);background:-o-linear-gradient(top,#585858 0%,#111 100%);background:linear-gradient(to bottom,#585858,#111)}div.dt-container .dt-paging .dt-paging-button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b,#0c0c0c);box-shadow:inset 0 0 3px #111}div.dt-container .dt-paging .ellipsis{padding:0 1em}div.dt-container .dt-length,div.dt-container .dt-search,div.dt-container .dt-info,div.dt-container .dt-processing,div.dt-container .dt-paging{color:inherit}div.dt-container .dataTables_scroll{clear:both}div.dt-container .dataTables_scroll div.dt-scroll-body{-webkit-overflow-scrolling:touch}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td{vertical-align:middle}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div.dt-container.dt-empty-footer tbody>tr:last-child>*{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body tbody>tr:last-child>*{border-bottom:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row,div.dt-container div.dt-layout-cell{display:block}div.dt-container div.dt-layout-cell.dt-full,div.dt-container div.dt-layout-cell.dt-start,div.dt-container div.dt-layout-cell.dt-end{text-align:center}}@media screen and (max-width: 640px){.dt-container .dt-length,.dt-container .dt-search{float:none;text-align:center}.dt-container .dt-search{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89,91,94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89,91,94)}html.dark table.dataTable.row-border>tbody>tr>*,html.dark table.dataTable.display>tbody>tr>*{border-top:1px solid rgb(64,67,70)}html.dark table.dataTable.row-border>tbody>tr:first-child>*,html.dark table.dataTable.display>tbody>tr:first-child>*{border-top:none}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64,67,70);border-right:1px solid rgb(64,67,70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64,67,70)}html.dark .dt-container.dt-empty-footer table.dataTable{border-bottom:1px solid rgb(89,91,94)}html.dark .dt-container .dt-search input,html.dark .dt-container .dt-length select{border:1px solid rgba(255,255,255,.2);background-color:var(--dt-html-background)}html.dark .dt-container .dt-paging .dt-paging-button.current,html.dark .dt-container .dt-paging .dt-paging-button.current:hover{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark .dt-container .dt-paging .dt-paging-button.disabled,html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover,html.dark .dt-container .dt-paging .dt-paging-button.disabled:active{color:#666!important}html.dark .dt-container .dt-paging .dt-paging-button:hover{border:1px solid rgb(53,53,53);background:#353535}html.dark .dt-container .dt-paging .dt-paging-button:active{background:#3a3a3a}*[dir=rtl] table.dataTable thead th,*[dir=rtl] table.dataTable thead td,*[dir=rtl] table.dataTable tfoot th,*[dir=rtl] table.dataTable tfoot td{text-align:right}*[dir=rtl] table.dataTable th.dt-type-numeric,*[dir=rtl] table.dataTable th.dt-type-date,*[dir=rtl] table.dataTable td.dt-type-numeric,*[dir=rtl] table.dataTable td.dt-type-date{text-align:left}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-start{text-align:right}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-end{text-align:left}*[dir=rtl] div.dt-container div.dt-search input{margin:0 3px 0 0}@keyframes dtb-spinner{to{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{to{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dataTables_wrapper{position:relative}div.dt-buttons{position:initial}div.dt-buttons .dt-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#fff;border-radius:.75em;box-shadow:3px 4px 10px 1px #000c;text-align:center;z-index:2003;overflow:hidden}div.dt-button-info h2{padding:2rem 2rem 1rem;margin:0;font-weight:400}div.dt-button-info>div{padding:1em 2em 2em}div.dtb-popover-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none!important}div.dt-button-collection-title{text-align:center;padding:.3em .5em .5em;margin-left:.5em;margin-right:.5em;font-size:.9em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0,0,0,.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection .dt-button-active{padding-right:3em}div.dt-button-collection .dt-button-active:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active.dt-button-split{padding-right:0}div.dt-button-collection .dt-button-active.dt-button-split:after{display:none}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child{padding-right:3em}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection .dt-button-active-a a{padding-right:3em}div.dt-button-collection .dt-button-active-a a:after{position:absolute;right:1em;display:inline-block;content:"\2713";color:inherit}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0,0,0,.1);padding-left:0}@media print{table.dataTable tr>*{box-shadow:none!important}}html.dark div.dt-button-info{background-color:var(--dt-html-background);border:1px solid rgba(255,255,255,.15)}div.dt-buttons>.dt-button,div.dt-buttons>div.dt-button-split .dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(230, 230, 230, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dt-buttons>.dt-button:first-child,div.dt-buttons>div.dt-button-split .dt-button:first-child{margin-left:0}div.dt-buttons>.dt-button.disabled,div.dt-buttons>div.dt-button-split .dt-button.disabled{cursor:default;opacity:.4}div.dt-buttons>.dt-button.dt-button-active:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background-color:#0000001a;background:linear-gradient(to bottom,#b3b3b31a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(179, 179, 179, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)");box-shadow:inset 1px 1px 3px #999}div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:#0000001a;background:linear-gradient(to bottom,#8080801a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(128, 128, 128, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:hover,div.dt-buttons>div.dt-button-split .dt-button:hover{text-decoration:none}div.dt-buttons>.dt-button:hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){border:1px solid #666;background-color:#0000001a;background:linear-gradient(to bottom,#9999991a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr="rgba(153, 153, 153, 0.1)",EndColorStr="rgba(0, 0, 0, 0.1)")}div.dt-buttons>.dt-button:focus:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(53,132,228)}div.dt-buttons>.dt-button embed,div.dt-buttons>div.dt-button-split .dt-button embed{outline:none}div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(0,0,0,.15);border-top-right-radius:0;border-bottom-right-radius:0}div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid #666}div.dt-buttons>div.dt-button-split .dt-button:last-child{border-left:1px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0}div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid #666}div.dt-buttons span.dt-button-down-arrow{position:relative;top:-2px;font-size:10px;padding-left:10px;line-height:1em;opacity:.6}div.dt-buttons div.dt-button-split{display:inline-block}div.dt-buttons div.dt-button-split .dt-button:first-child{margin-right:0}div.dt-buttons div.dt-button-split .dt-button:last-child{margin-left:-1px;padding-left:.75em;padding-right:.75em;z-index:2}div.dt-buttons div.dt-button-split .dt-button:last-child span{padding-left:0}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:.75em 0;border:1px solid rgba(0,0,0,.4);background-color:#fff;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px #0000004d;box-sizing:border-box}div.dt-button-collection .dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;background:none;margin:0;padding:.5em 1em;border:none;text-align:left;cursor:pointer;color:inherit}div.dt-button-collection .dt-button.dt-button-active{background:none;box-shadow:none}div.dt-button-collection .dt-button.disabled{cursor:default;opacity:.4}div.dt-button-collection .dt-button:hover:not(.disabled){border:none;background:#9999991a;box-shadow:none}div.dt-button-collection div.dt-button-split{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}div.dt-button-collection div.dt-button-split button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-button-split button.dt-button-split-drop{min-width:33px;flex:0}div.dt-button-collection.fixed .dt-button{border-radius:.25em;background:#ffffff1a}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:#fff;padding:.5em}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block!important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;background:radial-gradient(ellipse farthest-corner at center,#0000004d,#000000b3);z-index:2001}.dt-button.processing{color:#0003}.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid rgb(40,40,40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1.5s infinite linear;-o-animation:dtb-spinner 1.5s infinite linear;-ms-animation:dtb-spinner 1.5s infinite linear;-webkit-animation:dtb-spinner 1.5s infinite linear;-moz-animation:dtb-spinner 1.5s infinite linear}@media screen and (max-width: 640px){div.dt-buttons{float:none!important;text-align:center}}html.dark div.dt-buttons>.dt-button,html.dark div.dt-buttons>div.dt-button-split .dt-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background:#b3b3b326;box-shadow:inset 1px 1px 2px #000}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){background:#80808026;box-shadow:inset 1px 1px 3px #000}html.dark div.dt-buttons>.dt-button:hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){background:#b3b3b326}html.dark div.dt-buttons>.dt-button:focus:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(110,168,254)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(255,255,255,.1)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid rgb(89,91,94)}html.dark div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid rgb(89,91,94)}html.dark div.dt-button-collection{border:1px solid rgba(255,255,255,.15);background-color:#212529;box-shadow:3px 4px 10px 1px #000c}table.dataTable thead tr>.dtfc-fixed-start,table.dataTable thead tr>.dtfc-fixed-end,table.dataTable tfoot tr>.dtfc-fixed-start,table.dataTable tfoot tr>.dtfc-fixed-end{top:0;bottom:0;z-index:3;background-color:#fff}table.dataTable tbody tr>.dtfc-fixed-start,table.dataTable tbody tr>.dtfc-fixed-end{z-index:1;background-color:#fff}table.dataTable tr>.dtfc-fixed-left:after,table.dataTable tr>.dtfc-fixed-right:after{position:absolute;top:0;bottom:0;width:10px;transition:box-shadow .3s;content:"";pointer-events:none}table.dataTable tr>.dtfc-fixed-left:after{right:0;transform:translate(100%)}table.dataTable tr>.dtfc-fixed-right:after{left:0;transform:translate(-80%)}table.dataTable.dtfc-scrolling-left tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}div.dt-scroll,div.dtfh-floatingparent{position:relative}div.dt-scroll div.dtfc-top-blocker,div.dt-scroll div.dtfc-bottom-blocker,div.dtfh-floatingparent div.dtfc-top-blocker,div.dtfh-floatingparent div.dtfc-bottom-blocker{position:absolute;background-color:#fff}html.dark table.dataTable thead tr>.dtfc-fixed-start,html.dark table.dataTable thead tr>.dtfc-fixed-end,html.dark table.dataTable tfoot tr>.dtfc-fixed-start,html.dark table.dataTable tfoot tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-start,html.dark table.dataTable tbody tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable.dtfc-scrolling-left tbody>tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}html.dark div.dtfc-top-blocker,html.dark div.dtfc-bottom-blocker{background-color:var(--dt-html-background)}table.dataTable tbody th.focus,table.dataTable tbody td.focus{outline:2px solid #36f;outline-offset:-2px}table.dataTable tbody tr.selected th.focus,table.dataTable tbody tr.selected td.focus{outline-color:#03c}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{outline:2px solid #ff8b33;outline-offset:-2px}html.dark table.dataTable tbody th.focus,html.dark table.dataTable tbody td.focus{outline-color:#0d6efd}html.dark table.dataTable tbody tr.selected th.focus,html.dark table.dataTable tbody tr.selected td.focus{outline-color:#0143a3}html.dark div.dtk-focus-alt table.dataTable tbody th.focus,html.dark div.dtk-focus-alt table.dataTable tbody td.focus{outline-color:#ff8b33}table.dataTable tr.dtrg-group th{background-color:#0000001a;text-align:left}table.dataTable tr.dtrg-group.dtrg-level-0 th{font-weight:700}table.dataTable tr.dtrg-group.dtrg-level-1 th,table.dataTable tr.dtrg-group.dtrg-level-2 th,table.dataTable tr.dtrg-group.dtrg-level-3 th,table.dataTable tr.dtrg-group.dtrg-level-4 th,table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#0000000d;padding-top:.25em;padding-bottom:.25em;padding-left:2em;font-size:.9em}table.dataTable tr.dtrg-group.dtrg-level-2 th{background-color:#00000003;padding-left:2.5em}table.dataTable tr.dtrg-group.dtrg-level-3 th{background-color:#00000003;padding-left:3em}table.dataTable tr.dtrg-group.dtrg-level-4 th{background-color:#00000003;padding-left:3.5em}table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#00000003;padding-left:4em}html.dark table.dataTable tr.dtrg-group th{background-color:#ffffff1a}html.dark table.dataTable tr.dtrg-group.dtrg-level-1 th{background-color:#ffffff0d}html.dark table.dataTable tr.dtrg-group.dtrg-level-2 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-3 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-4 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#ffffff03}div.dt-button-collection{overflow:visible!important;z-index:2002!important}div.dt-button-collection div.dtsb-searchBuilder{padding-left:1em!important;padding-right:1em!important}div.dt-button-collection.dtb-collection-closeable div.dtsb-titleRow{padding-right:40px}.dtsb-greyscale{border:1px solid #cecece!important}div.dtsb-logicContainer .dtsb-greyscale{border:none!important}div.dtsb-searchBuilder{justify-content:space-evenly;cursor:default;margin-bottom:1em;text-align:left}div.dtsb-searchBuilder button.dtsb-button,div.dtsb-searchBuilder select{font-size:1em}div.dtsb-searchBuilder div.dtsb-titleRow{justify-content:space-evenly;margin-bottom:.5em}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title{display:inline-block;padding-top:14px}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title:empty{display:inline}div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll{float:right;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition{display:block}div.dtsb-searchBuilder div.dtsb-group{position:relative;clear:both;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-group button.dtsb-search{float:right}div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup{margin:2px;text-align:center;padding:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);position:absolute;margin-top:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{margin-bottom:.8em;display:flex;justify-content:start;flex-flow:row wrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{padding:.4em;margin-right:.8em;min-width:5em;max-width:20em;color:inherit;font-size:1em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic{font-style:normal}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic{font-style:italic}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{flex:1;white-space:nowrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont span.dtsp-joiner{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input.dtsb-value{width:33%}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont select,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input{height:100%;box-sizing:border-box}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{margin-left:auto;display:inline-block}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child{margin-right:0}@media screen and (max-width: 550px){div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{display:flex;flex-flow:none;flex-direction:column;justify-content:start;padding-right:calc(35px + .8em);margin-bottom:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:first-child),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:nth-child(2)),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:last-child){padding-top:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:first-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:nth-child(2),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:last-child{padding-top:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{max-width:none;width:100%;margin-bottom:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{position:absolute;width:35px;display:flex;flex-wrap:wrap-reverse;right:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button{margin-right:0!important}}div.dtsb-searchBuilder button,div.dtsb-searchBuilder select.dtsb-dropDown,div.dtsb-searchBuilder input{background-color:#f9f9f9}div.dtsb-searchBuilder button.dtsb-button{position:relative;display:inline-block;box-sizing:border-box;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dtsb-searchBuilder button.dtsb-button:hover{background-color:#cecece;cursor:pointer}div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgba(0,0,0,.3);background-color:#0000001a;background:linear-gradient(to right,#e6e6e61a,#0000001a)}div.dtsb-searchBuilder div.dtsb-logicContainer button{border:1px solid transparent;background:transparent}div.dtsb-searchBuilder button.dtsb-clearGroup{min-width:2em;padding:0}div.dtsb-searchBuilder button.dtsb-iptbtn{min-width:100px;text-align:left}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{border:1px solid;border-color:#cecece;border-radius:3px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic{border:none;border-radius:0;flex-grow:1;flex-shrink:0;flex-basis:3em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup{border:none;border-radius:0;width:2em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{border:1px solid;border-radius:3px}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition{border-color:#48b13c}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data{border-color:#e70f00}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value{border-color:#0069ba}html.dark div.dtsb-searchBuilder button.dtsb-button,html.dark div.dtsb-searchBuilder select.dtsb-dropDown,html.dark div.dtsb-searchBuilder input.dtsb-input{background-color:#424549!important;color-scheme:dark}html.dark div.dtsb-searchBuilder button.dtsb-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dtsb-searchBuilder button.dtsb-button:hover{background:#b3b3b326}html.dark div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgb(89,91,94)}html.dark div.dtsb-searchBuilder .dtsb-greyscale{border-color:#fff3!important}div.dtsp-topRow{display:flex;flex-direction:row;flex-wrap:nowrap;border:2px solid rgba(0,0,0,0);border-radius:3px;justify-content:space-around;align-content:flex-start;align-items:flex-start}div.dtsp-topRow input.dtsp-search{text-overflow:ellipsis;min-width:50px;flex-basis:90px;max-width:none}div.dtsp-topRow input.dtsp-search::placeholder{color:inherit}div.dtsp-topRow div.dtsp-subRow1{display:flex;flex-direction:row;flex-wrap:nowrap;flex:1 1 auto}div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont{position:relative;width:100%}div.dtsp-topRow div.dtsp-subRow1 input{padding-right:2em;width:100%!important;box-sizing:border-box;font-size:1em}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{background-color:transparent;border:none;cursor:initial;box-shadow:none;padding-bottom:0;padding-top:0;min-height:1em;height:fit-content;box-sizing:content-box}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]::placeholder{color:initial;opacity:1}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon{position:absolute;top:0;right:0;bottom:0}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABbmlDQ1BpY2MAACiRdZE7SwNBFIU/EyWikRRaiFhsoWKhEBREO42FTZAQFYza7G5eQhKX3QQJtoKNhWAh2vgq/AfaCrYKgqAIIhb+Al+NhPVOEkiQZJbZ+3FmzmXmDHjCGTPrtAYhm8vb0bmQthxb0Xzv+PHRxRSabjrWTCQSpun4eaRF1YdR1av5voajM55wTGhpF54wLTsvPC0c3sxbineFe8y0Hhc+ER6x5YDCt0o3KvymOFXhL8X2YnQWPKqnlqpjo47NtJ0VHhYeyGYKZvU86ib+RG5pQWqfzH4coswRQsOgwDoZ8oxKzUlmjX3Bsm+eDfGY8rcoYosjRVq8I6IWpGtCalL0hHwZiir3/3k6yfGxSnd/CNpeXfdzEHz7UNpz3d9T1y2dgfcFrnM1/4bkNPkt+l5NGziGwDZc3tQ04wCudqD32dJtvSx5ZXqSSfi4gK4YdN9Dx2olq+o650+wuCVPdAeHRzAk+wNrfw8JaBFXEnV+AAAACXBIWXMAAA9hAAAPYQGoP6dpAAABMUlEQVQoU6XRr0vDQRjH8akoM4iIjqGoOIZ5oIjB5XWxajaYDGLSIhhNYjcPRDSJwbQNw+L+BNGgYYo/5pT5/shz8vDlBgMPXux7z3N3z+25VOofYyCyd4ZYCavI4gXPsRp9LqiDdrEMH+8wv8Vh8gBfWclFPOEUN3hAHjlMoRa7wTzBS5xgKLFglPkZLjDic6HyDsEMNvGR2Nxifoci3tEI+X770JU0XmPXIlax+LTPh83fFox1X6kxyzdjm9UcdXi9S+Vti6svfyNULhNR9TVsYNhW6Ff9KKCNR7/Zv6eeaQ+6+qcdpu9BqGlp1HFgud+FYdzzUcUExu0Q/cdzHGEFetIlXKPjK/sbqYoOftMiS+j9jzEJPd1Wt+5+kdR/9EM9ucIC5jCbyPc01Q32kfsBppYz3hYFcCwAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:12px}div.dtsp-topRow div.dtsp-subRow2{white-space:nowrap;flex:0 0 auto}div.dtsp-topRow button>span{display:inline-block;height:100%;width:100%}div.dtsp-topRow button.dtsp-nameButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAK2SURBVFgJ7ZY9j41BFICvryCExrJBQ6HyEYVEIREaUZDQIRoR2ViJKCioxV+gkVXYTVZEQiEUhG2EQnxUCh0FKolY4ut5XnM2cyfva3Pt5m7EPcmzZ2bemTNnzjkzd1utnvQi0IvAfxiBy5z5FoxO89kPY+8mbMjtzs47RXs5/WVpbAG6bWExt5PuIibvhVkwmC+ck3eK9ln6/fAddFojYzBVuYSBpcnIEvRaqOw2RcaN18FPuJH0JvRUxbT3wWf4ltiKPgfVidWlbGZgPozDFfgAC+EA/K2EI4cwcAJ+gPaeQ+VQU2SOMMGcPgPl/m/V2p50rrbRsRgt9Iv5h6xtpP22Bz7Ce1C+gFFxfKzOmShcU+Qmyh2w3w8rIJfddHTck66EukL/xPhj+JM8rHNmFys0Pg4v0up3aFNlwR9NYyodd3OL/C64zpsymcTFcf6ElM4YzjAWKYrJkaq8kE/yUYNP4BoYvS1QRo+hNtF5xfkTUjoTheukSFFMjlTFm6PjceOca/SMpKfeCR1L6Uzk/y2WIkVhNFJlJAZhP+hYns7b9D3IPuhY5mYrIv8OrQJvR5NYyNaW4jsU8pSGNySiVx4o5tXq3JkoXE/mg5R/M8dGJCJpKhaDcjBRdbI/Rm8g69c122om33BHmj2CHoV5qa9jUXBraJ+G1fAVjIBO1klc87ro1K4JZ/K35SWW3TwcyDd6TecqnAEd8cGq2+w84xvBm1n3vS0izKkkwh5XNC/GmFPqqAtPF89AOScKuemaNzoTV1SD5dtSbmLf1/RV+tC0WTgcj6R7HEtrVGWaqu/lYDZ/2pvxQ/kIyw/gFByHC9AHw910hv1aUUumyd8yy0QfhmEkfiNod0Xusct68J1qc8Tdux0Z97Q+hsDb+AYGYEbF/4Guw2Q/qDPqZG/zXgT+3Qj8AtKnfWhFwmuAAAAAAElFTkSuQmCC)!important;background-repeat:no-repeat;background-position:center;background-size:23px;vertical-align:bottom}div.dtsp-topRow button.dtsp-countButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAG5SURBVEgN3VU9LwVBFF0fiYhofUSlEQkKhU7z/oBCQkIiGr9BgUbhVzy9BAnhFyjV/AYFiU5ICM7ZN+c5Zud5dm3lJmfmzrkz9+7cu3c3y/6jjOBSF8CxXS7FmTkbwqIJjDpJvTcmsJ4K3KPZUpyZsx0sxoB9J6mnAkyC7wGuuCFIipNtEcpcWExgXpOBc78vgj6N+QO4NVsjwdFM59tUIDxDrHMBOeIQ34C5ZDregXuAQm4YcI68nN9B3wr2PcwPAIPkN2EqtJH6b+QZm1ajjTx7BqwAr26Lb+C2Kvpbt0Mb2HAJ7NrGFGfmXO3DeA4UshDfQAVmH0gaUFg852TTTDvlxwBlCtxy9zXyBhQFaq0wMmIdRebrfgosA3zb2hKnqG0oqchp4QbuR8X0TjzABhbdOT8jnQ/atcgqpnfwOA7yqZyTU587ZkIGdesLTt2EkynOnbreMUUKMI/dA4B/QVOcO13CQh+5wWCgDwo/75u59odB/wjmfhbgvACcAOyZPHihMWAoIwxyCLgf1oxfgjzVbgBXSTzIN+f0pg6s5DkcesLMRpsBrgE2XO3CN64JFP7JtUeKHX4CKtRRXFZ+7dEAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:18px;vertical-align:bottom}div.dtsp-topRow button.dtsp-collapseButton span.dtsp-caret{position:relative;top:9px;display:inline-block}div.dtsp-topRow button.dtsp-collapseButton.dtsp-rotated{transform:rotate(180deg)}div.dtsp-searchPane table thead th,div.dtsp-searchPane table thead td{width:100%!important}div.dt-button-collection{z-index:2002}div.dt-button-collection.dtb-collection-closeable div.dtsp-titleRow{padding-right:25px}div.dtsp-columns-1{max-width:100%;min-width:100%;margin:0!important}div.dtsp-columns-2{max-width:49%;min-width:49%;margin:0!important}div.dtsp-columns-3{max-width:32%;min-width:32%;margin:0!important}div.dtsp-columns-4{max-width:24%;min-width:24%;margin:0!important}div.dtsp-columns-5{max-width:19%;min-width:19%;margin:0!important}div.dtsp-columns-6{max-width:16%;min-width:16%;margin:0!important}div.dtsp-columns-7{max-width:14%;min-width:14%;margin:0!important}div.dtsp-columns-8{max-width:12%;min-width:12%;margin:0!important}div.dtsp-columns-9{max-width:10.5%;min-width:10.5%;margin:0!important}div.dtsp-narrow{flex-direction:column!important}div.dtsp-narrow div.dtsp-subRow1,div.dtsp-narrow div.dtsp-subRow2{width:100%}div.dtsp-narrow div.dtsp-subRow2 button{margin:0!important;width:25%!important}div.dt-button-collection div.dtsp-panesContainer{padding-left:1em;padding-right:1em;margin-bottom:0}div.dtsp-panesContainer{margin-bottom:1em}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{width:100%}div.dtsp-searchPane div.dt-container div.dataTables_layout_cell,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_layout_cell{padding:0}div.dtsp-searchPane div.dt-container div.dt-scroll-head,div.dtsp-searchPane div.dt-container div.dataTables_scrollHead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-head,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollHead{display:none!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#fff!important;border:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body thead,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody thead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body thead,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody thead{display:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>td{padding:5px 10px}div.dtsp-searchPane div.dt-container div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody td.dtsp-nameColumn{width:100%!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{cursor:default}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name{text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:middle;white-space:nowrap;flex-grow:1;text-align:left}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{display:inline-block;background-color:#cfcfcf;text-align:center;border-radius:10px;width:auto;min-width:30px;color:#000;font-size:.9em;padding:0 4px}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty{display:none}div.dtsp-panesContainer{clear:both;padding-left:0;padding-right:0;text-align:center}div.dtsp-panesContainer div.dtsp-searchPanes{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-content:flex-start;align-items:stretch;clear:both;text-align:left}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane{flex-grow:1;flex-shrink:0;font-size:.9em;margin-top:15px!important}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper{flex:1;box-sizing:border-box}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dataTables_filter,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dataTables_filter{display:none}div.dtsp-panesContainer div.dtsp-title{float:left;padding:10px 0}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{float:right}div.dtsp-hidden{display:none!important}html.dark div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder,html[data-bs-theme=dark] div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder{color:#fff}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{border:1px solid #f0f0f0;border-radius:4px;overflow:hidden}div.dtsp-searchPane div.dt-container:hover,div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid #cfcfcf}div.dtsp-searchPane div.dt-container div.dt-scroll,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll{margin:-5px 0}div.dtsp-searchPane div.dt-container table.dataTable,div.dtsp-searchPane div.dataTables_wrapper table.dataTable{border-bottom:none!important}div.dtsp-searchPane div.dtsp-topRow{border:1px solid transparent}div.dtsp-searchPane div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{padding-bottom:5px}div.dtsp-searchPane div.dtsp-topRow div.dtsp-searchCont input.dtsp-search{border:none;padding-left:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered{border:1px solid #f0f0f0;border-radius:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered:hover{background-color:#f0f0f0}div.dtsp-searchPane input.dtsp-paneInputButton,div.dtsp-searchPane button.dtsp-paneButton{height:35px;width:35px;min-width:0;display:inline-block;margin:2px 2px 0;border:0px solid transparent;background-color:transparent}div.dtsp-searchPane input.dtsp-paneInputButton:hover,div.dtsp-searchPane button.dtsp-paneButton:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-searchPane button.dtsp-paneButton{vertical-align:middle;opacity:.6}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{border:1px solid transparent;background-color:transparent}div.dtsp-panesContainer button.dtsp-clearAll:hover,div.dtsp-panesContainer button.dtsp-collapseAll:hover,div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-panesContainer button.dtsp-disabledButton{cursor:default!important;color:#7c7c7c}div.dtsp-panesContainer button.dtsp-disabledButton:hover{background-color:transparent}div.dtsp-panesContainer button.dtsp-disabledButton:focus{outline:none}@media screen and (max-width: 767px){div.dtsp-columns-4,div.dtsp-columns-5,div.dtsp-columns-6{max-width:31%!important;min-width:31%!important}}@media screen and (max-width: 640px){div.dtsp-searchPanes{flex-direction:column!important}div.dtsp-searchPane{max-width:98%!important;min-width:98%!important}}html.dark div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span,html.dark div.dtsp-topRow button.dtsp-nameButton span,html.dark div.dtsp-topRow button.dtsp-countButton span{filter:invert(1)}html.dark div.dtsp-topRow input.dtsp-paneInputButton,html.dark div.dtsp-topRow button.dtsp-paneButton{color:inherit}html.dark div.dtsp-topRow input.dtsp-paneInputButton:hover,html.dark div.dtsp-topRow button.dtsp-paneButton:hover{background-color:#404549}html.dark div.dtsp-topRow.dtsp-bordered{border:1px solid rgba(255,255,255,.2);background:#2f3438!important}html.dark div.dtsp-topRow.dtsp-bordered:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-panesContainer button.dtsp-clearAll,html.dark div.dtsp-panesContainer button.dtsp-collapseAll,html.dark div.dtsp-panesContainer button.dtsp-showAll{color:inherit}html.dark div.dtsp-panesContainer button.dtsp-clearAll:hover,html.dark div.dtsp-panesContainer button.dtsp-collapseAll:hover,html.dark div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#404549}html.dark div.dtsp-panesContainer button.dtsp-disabledButton{color:#7c7c7c}html.dark div.dtsp-searchPane div.dt-container,html.dark div.dtsp-searchPane div.dataTables_wrapper{border:1px solid rgba(255,255,255,.2)}html.dark div.dtsp-searchPane div.dt-container:hover,html.dark div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#2f3438!important}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{background-color:#212529;color:inherit}table.dataTable>tbody>tr>.selected{background-color:#0d6efde6;color:#fff}table.dataTable>tbody>tr>.dt-select{text-align:center;vertical-align:middle}table.dataTable>thead>tr>.dt-select{text-align:center}table.dataTable input.dt-select-checkbox{appearance:none;position:relative;display:inline-block;width:12px;height:12px;border:1px solid;border-radius:3px;vertical-align:middle;margin-top:1px;color:inherit;font-size:20px;line-height:1em}table.dataTable input.dt-select-checkbox:checked:after{display:block;content:"\2713";margin-top:-8px}table.dataTable input.dt-select-checkbox:indeterminate:after{display:block;position:absolute;content:" ";top:3px;left:3px;height:4px;width:4px;background-color:#000;border-radius:2px}table.dataTable>tbody>tr.selected input.dt-select-checkbox:checked{border:1px solid}table.dataTable>tbody>tr>td.select-checkbox,table.dataTable>tbody>tr>th.select-checkbox{position:relative}table.dataTable>tbody>tr>td.select-checkbox:before,table.dataTable>tbody>tr>th.select-checkbox:before{display:block;position:absolute;top:50%;left:50%;width:12px;height:12px;box-sizing:border-box;content:" ";margin-top:-6px;margin-left:-6px;border:1px solid;border-radius:3px}table.dataTable>tbody>tr.selected>td.select-checkbox:before,table.dataTable>tbody>tr.selected>th.select-checkbox:before{border:1px solid;content:"\2713";font-size:20px;line-height:6px;text-align:center}table.dataTable.compact>tbody>tr>td.select-checkbox:before,table.dataTable.compact>tbody>tr>th.select-checkbox:before{margin-top:-12px}table.dataTable.compact>tbody>tr.selected>td.select-checkbox:after,table.dataTable.compact>tbody>tr.selected>th.select-checkbox:after{margin-top:-16px}div.dt-container span.select-info,div.dt-container span.select-item{margin-left:.5em}html.dark table.dataTable input.dt-select-checkbox:indeterminate:after,html[data-bs-theme=dark] table.dataTable input.dt-select-checkbox:indeterminate:after{background-color:#fff}@media screen and (max-width: 640px){div.dt-container span.select-info,div.dt-container span.select-item{margin-left:0;display:block}}
</style>
<script>window._datatables_src_for_itables_2_0_0 = "data:text/javascript;base64,dmFyIEZvPU9iamVjdC5jcmVhdGU7dmFyIHhhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgQm89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgTm89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIE9vPU9iamVjdC5nZXRQcm90b3R5cGVPZixFbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBXcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLHIpPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbcl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTt2YXIgX2E9KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKTt2YXIgUm89KHQsZSxyLG4pPT57aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QifHx0eXBlb2YgZT09ImZ1bmN0aW9uIilmb3IobGV0IHMgb2YgTm8oZSkpIUVvLmNhbGwodCxzKSYmcyE9PXImJnhhKHQscyx7Z2V0OigpPT5lW3NdLGVudW1lcmFibGU6IShuPUJvKGUscykpfHxuLmVudW1lcmFibGV9KTtyZXR1cm4gdH07dmFyIGllPSh0LGUscik9PihyPXQhPW51bGw/Rm8oT28odCkpOnt9LFJvKGV8fCF0fHwhdC5fX2VzTW9kdWxlP3hhKHIsImRlZmF1bHQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KTpyLHQpKTt2YXIgVGE9X2EoKENhLGlpKT0+eyhmdW5jdGlvbih0KXt0eXBlb2YgQ2E9PSJvYmplY3QiJiZ0eXBlb2YgaWk8InUiP2lpLmV4cG9ydHM9dCgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOih0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXMpLkpTWmlwPXQoKX0pKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIHModSxwKXtpZighclt1XSl7aWYoIWVbdV0pe3ZhciB2PXR5cGVvZiBXcj09ImZ1bmN0aW9uIiYmV3I7aWYoIXAmJnYpcmV0dXJuIHYodSwhMCk7aWYoYSlyZXR1cm4gYSh1LCEwKTt2YXIgbT1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIit1KyInIik7dGhyb3cgbS5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixtfXZhciBnPXJbdV09e2V4cG9ydHM6e319O2VbdV1bMF0uY2FsbChnLmV4cG9ydHMsZnVuY3Rpb24oVCl7dmFyIHc9ZVt1XVsxXVtUXTtyZXR1cm4gcyh3fHxUKX0sZyxnLmV4cG9ydHMsdCxlLHIsbil9cmV0dXJuIHJbdV0uZXhwb3J0c31mb3IodmFyIGE9dHlwZW9mIFdyPT0iZnVuY3Rpb24iJiZXcixsPTA7bDxuLmxlbmd0aDtsKyspcyhuW2xdKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO3IuZW5jb2RlPWZ1bmN0aW9uKGwpe2Zvcih2YXIgdSxwLHYsbSxnLFQsdyxrPVtdLFA9MCxGPWwubGVuZ3RoLGg9RixvPW4uZ2V0VHlwZU9mKGwpIT09InN0cmluZyI7UDxsLmxlbmd0aDspaD1GLVAsdj1vPyh1PWxbUCsrXSxwPVA8Rj9sW1ArK106MCxQPEY/bFtQKytdOjApOih1PWwuY2hhckNvZGVBdChQKyspLHA9UDxGP2wuY2hhckNvZGVBdChQKyspOjAsUDxGP2wuY2hhckNvZGVBdChQKyspOjApLG09dT4+MixnPSgzJnUpPDw0fHA+PjQsVD0xPGg/KDE1JnApPDwyfHY+PjY6NjQsdz0yPGg/NjMmdjo2NCxrLnB1c2goYS5jaGFyQXQobSkrYS5jaGFyQXQoZykrYS5jaGFyQXQoVCkrYS5jaGFyQXQodykpO3JldHVybiBrLmpvaW4oIiIpfSxyLmRlY29kZT1mdW5jdGlvbihsKXt2YXIgdSxwLHYsbSxnLFQsdz0wLGs9MCxQPSJkYXRhOiI7aWYobC5zdWJzdHIoMCxQLmxlbmd0aCk9PT1QKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTt2YXIgRixoPTMqKGw9bC5yZXBsYWNlKC9bXkEtWmEtejAtOSsvPV0vZywiIikpLmxlbmd0aC80O2lmKGwuY2hhckF0KGwubGVuZ3RoLTEpPT09YS5jaGFyQXQoNjQpJiZoLS0sbC5jaGFyQXQobC5sZW5ndGgtMik9PT1hLmNoYXJBdCg2NCkmJmgtLSxoJTEhPTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJhc2U2NCBpbnB1dCwgYmFkIGNvbnRlbnQgbGVuZ3RoLiIpO2ZvcihGPXMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGgpOm5ldyBBcnJheSgwfGgpO3c8bC5sZW5ndGg7KXU9YS5pbmRleE9mKGwuY2hhckF0KHcrKykpPDwyfChtPWEuaW5kZXhPZihsLmNoYXJBdCh3KyspKSk+PjQscD0oMTUmbSk8PDR8KGc9YS5pbmRleE9mKGwuY2hhckF0KHcrKykpKT4+Mix2PSgzJmcpPDw2fChUPWEuaW5kZXhPZihsLmNoYXJBdCh3KyspKSksRltrKytdPXUsZyE9PTY0JiYoRltrKytdPXApLFQhPT02NCYmKEZbaysrXT12KTtyZXR1cm4gRn19LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vZXh0ZXJuYWwiKSxzPXQoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxhPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxsPXQoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIHUocCx2LG0sZyxUKXt0aGlzLmNvbXByZXNzZWRTaXplPXAsdGhpcy51bmNvbXByZXNzZWRTaXplPXYsdGhpcy5jcmMzMj1tLHRoaXMuY29tcHJlc3Npb249Zyx0aGlzLmNvbXByZXNzZWRDb250ZW50PVR9dS5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgcD1uZXcgcyhuLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbCgiZGF0YV9sZW5ndGgiKSksdj10aGlzO3JldHVybiBwLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09di51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcigiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaCIpfSkscH0sZ2V0Q29tcHJlc3NlZFdvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcyhuLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkud2l0aFN0cmVhbUluZm8oImNvbXByZXNzZWRTaXplIix0aGlzLmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygidW5jb21wcmVzc2VkU2l6ZSIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygiY3JjMzIiLHRoaXMuY3JjMzIpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdGhpcy5jb21wcmVzc2lvbil9fSx1LmNyZWF0ZVdvcmtlckZyb209ZnVuY3Rpb24ocCx2LG0pe3JldHVybiBwLnBpcGUobmV3IGEpLnBpcGUobmV3IGwoInVuY29tcHJlc3NlZFNpemUiKSkucGlwZSh2LmNvbXByZXNzV29ya2VyKG0pKS5waXBlKG5ldyBsKCJjb21wcmVzc2VkU2l6ZSIpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLHYpfSxlLmV4cG9ydHM9dX0seyIuL2V4dGVybmFsIjo2LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIjoyNiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6Mjd9XSwzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtyLlNUT1JFPXttYWdpYzoiXDBcMCIsY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LHIuREVGTEFURT10KCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vdXRpbHMiKSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhLGw9W10sdT0wO3U8MjU2O3UrKyl7YT11O2Zvcih2YXIgcD0wO3A8ODtwKyspYT0xJmE/Mzk4ODI5MjM4NF5hPj4+MTphPj4+MTtsW3VdPWF9cmV0dXJuIGx9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGEsbCl7cmV0dXJuIGEhPT12b2lkIDAmJmEubGVuZ3RoP24uZ2V0VHlwZU9mKGEpIT09InN0cmluZyI/ZnVuY3Rpb24odSxwLHYsbSl7dmFyIGc9cyxUPW0rdjt1Xj0tMTtmb3IodmFyIHc9bTt3PFQ7dysrKXU9dT4+PjheZ1syNTUmKHVecFt3XSldO3JldHVybi0xXnV9KDB8bCxhLGEubGVuZ3RoLDApOmZ1bmN0aW9uKHUscCx2LG0pe3ZhciBnPXMsVD1tK3Y7dV49LTE7Zm9yKHZhciB3PW07dzxUO3crKyl1PXU+Pj44XmdbMjU1Jih1XnAuY2hhckNvZGVBdCh3KSldO3JldHVybi0xXnV9KDB8bCxhLGEubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtyLmJhc2U2ND0hMSxyLmJpbmFyeT0hMSxyLmRpcj0hMSxyLmNyZWF0ZUZvbGRlcnM9ITAsci5kYXRlPW51bGwsci5jb21wcmVzc2lvbj1udWxsLHIuY29tcHJlc3Npb25PcHRpb25zPW51bGwsci5jb21tZW50PW51bGwsci51bml4UGVybWlzc2lvbnM9bnVsbCxyLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPW51bGw7bj10eXBlb2YgUHJvbWlzZTwidSI/UHJvbWlzZTp0KCJsaWUiKSxlLmV4cG9ydHM9e1Byb21pc2U6bn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIFVpbnQzMkFycmF5PCJ1IixzPXQoInBha28iKSxhPXQoIi4vdXRpbHMiKSxsPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSx1PW4/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcCh2LG0pe2wuY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK3YpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPXYsdGhpcy5fcGFrb09wdGlvbnM9bSx0aGlzLm1ldGE9e319ci5tYWdpYz0iXGJcMCIsYS5pbmhlcml0cyhwLGwpLHAucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbih2KXt0aGlzLm1ldGE9di5tZXRhLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGEudHJhbnNmb3JtVG8odSx2LmRhdGEpLCExKX0scC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe2wucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHAucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgc1t0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciB2PXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24obSl7di5wdXNoKHtkYXRhOm0sbWV0YTp2Lm1ldGF9KX19LHIuY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24odil7cmV0dXJuIG5ldyBwKCJEZWZsYXRlIix2KX0sci51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGcsVCl7dmFyIHcsaz0iIjtmb3Iodz0wO3c8VDt3Kyspays9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmZyksZz4+Pj04O3JldHVybiBrfWZ1bmN0aW9uIHMoZyxULHcsayxQLEYpe3ZhciBoLG8sZj1nLmZpbGUsQz1nLmNvbXByZXNzaW9uLEI9RiE9PXUudXRmOGVuY29kZSxjPWEudHJhbnNmb3JtVG8oInN0cmluZyIsRihmLm5hbWUpKSx6PWEudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKGYubmFtZSkpLEc9Zi5jb21tZW50LGV0PWEudHJhbnNmb3JtVG8oInN0cmluZyIsRihHKSksRT1hLnRyYW5zZm9ybVRvKCJzdHJpbmciLHUudXRmOGVuY29kZShHKSksWj16Lmxlbmd0aCE9PWYubmFtZS5sZW5ndGgseT1FLmxlbmd0aCE9PUcubGVuZ3RoLF89IiIsUz0iIixOPSIiLFI9Zi5kaXIsTD1mLmRhdGUsWD17Y3JjMzI6MCxjb21wcmVzc2VkU2l6ZTowLHVuY29tcHJlc3NlZFNpemU6MH07VCYmIXd8fChYLmNyYzMyPWcuY3JjMzIsWC5jb21wcmVzc2VkU2l6ZT1nLmNvbXByZXNzZWRTaXplLFgudW5jb21wcmVzc2VkU2l6ZT1nLnVuY29tcHJlc3NlZFNpemUpO3ZhciBqPTA7VCYmKGp8PTgpLEJ8fCFaJiYheXx8KGp8PTIwNDgpO3ZhciBxPTAsYXQ9MDtSJiYocXw9MTYpLFA9PT0iVU5JWCI/KGF0PTc5OCxxfD1mdW5jdGlvbih0dCx5dCl7dmFyIFR0PXR0O3JldHVybiB0dHx8KFR0PXl0PzE2ODkzOjMzMjA0KSwoNjU1MzUmVHQpPDwxNn0oZi51bml4UGVybWlzc2lvbnMsUikpOihhdD0yMCxxfD1mdW5jdGlvbih0dCl7cmV0dXJuIDYzJih0dHx8MCl9KGYuZG9zUGVybWlzc2lvbnMpKSxoPUwuZ2V0VVRDSG91cnMoKSxoPDw9NixofD1MLmdldFVUQ01pbnV0ZXMoKSxoPDw9NSxofD1MLmdldFVUQ1NlY29uZHMoKS8yLG89TC5nZXRVVENGdWxsWWVhcigpLTE5ODAsbzw8PTQsb3w9TC5nZXRVVENNb250aCgpKzEsbzw8PTUsb3w9TC5nZXRVVENEYXRlKCksWiYmKFM9bigxLDEpK24ocChjKSw0KSt6LF8rPSJ1cCIrbihTLmxlbmd0aCwyKStTKSx5JiYoTj1uKDEsMSkrbihwKGV0KSw0KStFLF8rPSJ1YyIrbihOLmxlbmd0aCwyKStOKTt2YXIgSj0iIjtyZXR1cm4gSis9YApcMGAsSis9bihqLDIpLEorPUMubWFnaWMsSis9bihoLDIpLEorPW4obywyKSxKKz1uKFguY3JjMzIsNCksSis9bihYLmNvbXByZXNzZWRTaXplLDQpLEorPW4oWC51bmNvbXByZXNzZWRTaXplLDQpLEorPW4oYy5sZW5ndGgsMiksSis9bihfLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDp2LkxPQ0FMX0ZJTEVfSEVBREVSK0orYytfLGRpclJlY29yZDp2LkNFTlRSQUxfRklMRV9IRUFERVIrbihhdCwyKStKK24oZXQubGVuZ3RoLDIpKyJcMFwwXDBcMCIrbihxLDQpK24oayw0KStjK18rZXR9fXZhciBhPXQoIi4uL3V0aWxzIiksbD10KCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi4vdXRmOCIpLHA9dCgiLi4vY3JjMzIiKSx2PXQoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIG0oZyxULHcsayl7bC5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1ULHRoaXMuemlwUGxhdGZvcm09dyx0aGlzLmVuY29kZUZpbGVOYW1lPWssdGhpcy5zdHJlYW1GaWxlcz1nLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119YS5pbmhlcml0cyhtLGwpLG0ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZyl7dmFyIFQ9Zy5tZXRhLnBlcmNlbnR8fDAsdz10aGlzLmVudHJpZXNDb3VudCxrPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChnKToodGhpcy5ieXRlc1dyaXR0ZW4rPWcuZGF0YS5sZW5ndGgsbC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6Zy5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDp3PyhUKzEwMCoody1rLTEpKS93OjEwMH19KSl9LG0ucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihnKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1nLmZpbGUubmFtZTt2YXIgVD10aGlzLnN0cmVhbUZpbGVzJiYhZy5maWxlLmRpcjtpZihUKXt2YXIgdz1zKGcsVCwhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6dy5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sbS5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKGcpe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgVD10aGlzLnN0cmVhbUZpbGVzJiYhZy5maWxlLmRpcix3PXMoZyxULCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHcuZGlyUmVjb3JkKSxUKXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihrKXtyZXR1cm4gdi5EQVRBX0RFU0NSSVBUT1IrbihrLmNyYzMyLDQpK24oay5jb21wcmVzc2VkU2l6ZSw0KStuKGsudW5jb21wcmVzc2VkU2l6ZSw0KX0oZyksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOncuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LG0ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBnPXRoaXMuYnl0ZXNXcml0dGVuLFQ9MDtUPHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7VCsrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbVF0sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHc9dGhpcy5ieXRlc1dyaXR0ZW4tZyxrPWZ1bmN0aW9uKFAsRixoLG8sZil7dmFyIEM9YS50cmFuc2Zvcm1Ubygic3RyaW5nIixmKG8pKTtyZXR1cm4gdi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIituKFAsMikrbihQLDIpK24oRiw0KStuKGgsNCkrbihDLmxlbmd0aCwyKStDfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLHcsZyx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOmssbWV0YTp7cGVyY2VudDoxMDB9fSl9LG0ucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxtLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKGcpe3RoaXMuX3NvdXJjZXMucHVzaChnKTt2YXIgVD10aGlzO3JldHVybiBnLm9uKCJkYXRhIixmdW5jdGlvbih3KXtULnByb2Nlc3NDaHVuayh3KX0pLGcub24oImVuZCIsZnVuY3Rpb24oKXtULmNsb3NlZFNvdXJjZShULnByZXZpb3VzLnN0cmVhbUluZm8pLFQuX3NvdXJjZXMubGVuZ3RoP1QucHJlcGFyZU5leHRTb3VyY2UoKTpULmVuZCgpfSksZy5vbigiZXJyb3IiLGZ1bmN0aW9uKHcpe1QuZXJyb3Iodyl9KSx0aGlzfSxtLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIWwucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxtLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihnKXt2YXIgVD10aGlzLl9zb3VyY2VzO2lmKCFsLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsZykpcmV0dXJuITE7Zm9yKHZhciB3PTA7dzxULmxlbmd0aDt3KyspdHJ5e1Rbd10uZXJyb3IoZyl9Y2F0Y2h7fXJldHVybiEwfSxtLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgZz10aGlzLl9zb3VyY2VzLFQ9MDtUPGcubGVuZ3RoO1QrKylnW1RdLmxvY2soKX0sZS5leHBvcnRzPW19LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vY29tcHJlc3Npb25zIikscz10KCIuL1ppcEZpbGVXb3JrZXIiKTtyLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGEsbCx1KXt2YXIgcD1uZXcgcyhsLnN0cmVhbUZpbGVzLHUsbC5wbGF0Zm9ybSxsLmVuY29kZUZpbGVOYW1lKSx2PTA7dHJ5e2EuZm9yRWFjaChmdW5jdGlvbihtLGcpe3YrKzt2YXIgVD1mdW5jdGlvbihGLGgpe3ZhciBvPUZ8fGgsZj1uW29dO2lmKCFmKXRocm93IG5ldyBFcnJvcihvKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gZn0oZy5vcHRpb25zLmNvbXByZXNzaW9uLGwuY29tcHJlc3Npb24pLHc9Zy5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8bC5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LGs9Zy5kaXIsUD1nLmRhdGU7Zy5fY29tcHJlc3NXb3JrZXIoVCx3KS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6bSxkaXI6ayxkYXRlOlAsY29tbWVudDpnLmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczpnLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpnLmRvc1Blcm1pc3Npb25zfSkucGlwZShwKX0pLHAuZW50cmllc0NvdW50PXZ9Y2F0Y2gobSl7cC5lcnJvcihtKX1yZXR1cm4gcH19LHsiLi4vY29tcHJlc3Npb25zIjozLCIuL1ppcEZpbGVXb3JrZXIiOjh9XSwxMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHM9bmV3IG47Zm9yKHZhciBhIGluIHRoaXMpdHlwZW9mIHRoaXNbYV0hPSJmdW5jdGlvbiImJihzW2FdPXRoaXNbYV0pO3JldHVybiBzfX0obi5wcm90b3R5cGU9dCgiLi9vYmplY3QiKSkubG9hZEFzeW5jPXQoIi4vbG9hZCIpLG4uc3VwcG9ydD10KCIuL3N1cHBvcnQiKSxuLmRlZmF1bHRzPXQoIi4vZGVmYXVsdHMiKSxuLnZlcnNpb249IjMuMTAuMSIsbi5sb2FkQXN5bmM9ZnVuY3Rpb24ocyxhKXtyZXR1cm4gbmV3IG4oKS5sb2FkQXN5bmMocyxhKX0sbi5leHRlcm5hbD10KCIuL2V4dGVybmFsIiksZS5leHBvcnRzPW59LHsiLi9kZWZhdWx0cyI6NSwiLi9leHRlcm5hbCI6NiwiLi9sb2FkIjoxMSwiLi9vYmplY3QiOjE1LCIuL3N1cHBvcnQiOjMwfV0sMTE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9leHRlcm5hbCIpLGE9dCgiLi91dGY4IiksbD10KCIuL3ppcEVudHJpZXMiKSx1PXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxwPXQoIi4vbm9kZWpzVXRpbHMiKTtmdW5jdGlvbiB2KG0pe3JldHVybiBuZXcgcy5Qcm9taXNlKGZ1bmN0aW9uKGcsVCl7dmFyIHc9bS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IHUpO3cub24oImVycm9yIixmdW5jdGlvbihrKXtUKGspfSkub24oImVuZCIsZnVuY3Rpb24oKXt3LnN0cmVhbUluZm8uY3JjMzIhPT1tLmRlY29tcHJlc3NlZC5jcmMzMj9UKG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoIikpOmcoKX0pLnJlc3VtZSgpfSl9ZS5leHBvcnRzPWZ1bmN0aW9uKG0sZyl7dmFyIFQ9dGhpcztyZXR1cm4gZz1uLmV4dGVuZChnfHx7fSx7YmFzZTY0OiExLGNoZWNrQ1JDMzI6ITEsb3B0aW1pemVkQmluYXJ5U3RyaW5nOiExLGNyZWF0ZUZvbGRlcnM6ITEsZGVjb2RlRmlsZU5hbWU6YS51dGY4ZGVjb2RlfSkscC5pc05vZGUmJnAuaXNTdHJlYW0obSk/cy5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk6bi5wcmVwYXJlQ29udGVudCgidGhlIGxvYWRlZCB6aXAgZmlsZSIsbSwhMCxnLm9wdGltaXplZEJpbmFyeVN0cmluZyxnLmJhc2U2NCkudGhlbihmdW5jdGlvbih3KXt2YXIgaz1uZXcgbChnKTtyZXR1cm4gay5sb2FkKHcpLGt9KS50aGVuKGZ1bmN0aW9uKHcpe3ZhciBrPVtzLlByb21pc2UucmVzb2x2ZSh3KV0sUD13LmZpbGVzO2lmKGcuY2hlY2tDUkMzMilmb3IodmFyIEY9MDtGPFAubGVuZ3RoO0YrKylrLnB1c2godihQW0ZdKSk7cmV0dXJuIHMuUHJvbWlzZS5hbGwoayl9KS50aGVuKGZ1bmN0aW9uKHcpe2Zvcih2YXIgaz13LnNoaWZ0KCksUD1rLmZpbGVzLEY9MDtGPFAubGVuZ3RoO0YrKyl7dmFyIGg9UFtGXSxvPWguZmlsZU5hbWVTdHIsZj1uLnJlc29sdmUoaC5maWxlTmFtZVN0cik7VC5maWxlKGYsaC5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpoLmRhdGUsZGlyOmguZGlyLGNvbW1lbnQ6aC5maWxlQ29tbWVudFN0ci5sZW5ndGg/aC5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpoLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpoLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6Zy5jcmVhdGVGb2xkZXJzfSksaC5kaXJ8fChULmZpbGUoZikudW5zYWZlT3JpZ2luYWxOYW1lPW8pfXJldHVybiBrLnppcENvbW1lbnQubGVuZ3RoJiYoVC5jb21tZW50PWsuemlwQ29tbWVudCksVH0pfX0seyIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vQ3JjMzJQcm9iZSI6MjUsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcEVudHJpZXMiOjMzfV0sMTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gYShsLHUpe3MuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrbCksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKHUpfW4uaW5oZXJpdHMoYSxzKSxhLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihsKXt2YXIgdT10aGlzOyh0aGlzLl9zdHJlYW09bCkucGF1c2UoKSxsLm9uKCJkYXRhIixmdW5jdGlvbihwKXt1LnB1c2goe2RhdGE6cCxtZXRhOntwZXJjZW50OjB9fSl9KS5vbigiZXJyb3IiLGZ1bmN0aW9uKHApe3UuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1wOnUuZXJyb3IocCl9KS5vbigiZW5kIixmdW5jdGlvbigpe3UuaXNQYXVzZWQ/dS5fdXBzdHJlYW1FbmRlZD0hMDp1LmVuZCgpfSl9LGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxhLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LGUuZXhwb3J0cz1hfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGU7ZnVuY3Rpb24gcyhhLGwsdSl7bi5jYWxsKHRoaXMsbCksdGhpcy5faGVscGVyPWE7dmFyIHA9dGhpczthLm9uKCJkYXRhIixmdW5jdGlvbih2LG0pe3AucHVzaCh2KXx8cC5faGVscGVyLnBhdXNlKCksdSYmdShtKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24odil7cC5lbWl0KCJlcnJvciIsdil9KS5vbigiZW5kIixmdW5jdGlvbigpe3AucHVzaChudWxsKX0pfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxuKSxzLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtpc05vZGU6dHlwZW9mIEJ1ZmZlcjwidSIsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihuLHMpe2lmKEJ1ZmZlci5mcm9tJiZCdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSlyZXR1cm4gQnVmZmVyLmZyb20obixzKTtpZih0eXBlb2Ygbj09Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBCdWZmZXIobixzKX0sYWxsb2NCdWZmZXI6ZnVuY3Rpb24obil7aWYoQnVmZmVyLmFsbG9jKXJldHVybiBCdWZmZXIuYWxsb2Mobik7dmFyIHM9bmV3IEJ1ZmZlcihuKTtyZXR1cm4gcy5maWxsKDApLHN9LGlzQnVmZmVyOmZ1bmN0aW9uKG4pe3JldHVybiBCdWZmZXIuaXNCdWZmZXIobil9LGlzU3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiBuJiZ0eXBlb2Ygbi5vbj09ImZ1bmN0aW9uIiYmdHlwZW9mIG4ucGF1c2U9PSJmdW5jdGlvbiImJnR5cGVvZiBuLnJlc3VtZT09ImZ1bmN0aW9uIn19fSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihmLEMsQil7dmFyIGMsej1hLmdldFR5cGVPZihDKSxHPWEuZXh0ZW5kKEJ8fHt9LHApO0cuZGF0ZT1HLmRhdGV8fG5ldyBEYXRlLEcuY29tcHJlc3Npb24hPT1udWxsJiYoRy5jb21wcmVzc2lvbj1HLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCkpLHR5cGVvZiBHLnVuaXhQZXJtaXNzaW9ucz09InN0cmluZyImJihHLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChHLnVuaXhQZXJtaXNzaW9ucyw4KSksRy51bml4UGVybWlzc2lvbnMmJjE2Mzg0JkcudW5peFBlcm1pc3Npb25zJiYoRy5kaXI9ITApLEcuZG9zUGVybWlzc2lvbnMmJjE2JkcuZG9zUGVybWlzc2lvbnMmJihHLmRpcj0hMCksRy5kaXImJihmPVAoZikpLEcuY3JlYXRlRm9sZGVycyYmKGM9ayhmKSkmJkYuY2FsbCh0aGlzLGMsITApO3ZhciBldD16PT09InN0cmluZyImJkcuYmluYXJ5PT09ITEmJkcuYmFzZTY0PT09ITE7QiYmQi5iaW5hcnkhPT12b2lkIDB8fChHLmJpbmFyeT0hZXQpLChDIGluc3RhbmNlb2YgdiYmQy51bmNvbXByZXNzZWRTaXplPT09MHx8Ry5kaXJ8fCFDfHxDLmxlbmd0aD09PTApJiYoRy5iYXNlNjQ9ITEsRy5iaW5hcnk9ITAsQz0iIixHLmNvbXByZXNzaW9uPSJTVE9SRSIsej0ic3RyaW5nIik7dmFyIEU9bnVsbDtFPUMgaW5zdGFuY2VvZiB2fHxDIGluc3RhbmNlb2YgbD9DOlQuaXNOb2RlJiZULmlzU3RyZWFtKEMpP25ldyB3KGYsQyk6YS5wcmVwYXJlQ29udGVudChmLEMsRy5iaW5hcnksRy5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsRy5iYXNlNjQpO3ZhciBaPW5ldyBtKGYsRSxHKTt0aGlzLmZpbGVzW2ZdPVp9dmFyIHM9dCgiLi91dGY4IiksYT10KCIuL3V0aWxzIiksbD10KCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIiksdT10KCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiKSxwPXQoIi4vZGVmYXVsdHMiKSx2PXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLG09dCgiLi96aXBPYmplY3QiKSxnPXQoIi4vZ2VuZXJhdGUiKSxUPXQoIi4vbm9kZWpzVXRpbHMiKSx3PXQoIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlciIpLGs9ZnVuY3Rpb24oZil7Zi5zbGljZSgtMSk9PT0iLyImJihmPWYuc3Vic3RyaW5nKDAsZi5sZW5ndGgtMSkpO3ZhciBDPWYubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gMDxDP2Yuc3Vic3RyaW5nKDAsQyk6IiJ9LFA9ZnVuY3Rpb24oZil7cmV0dXJuIGYuc2xpY2UoLTEpIT09Ii8iJiYoZis9Ii8iKSxmfSxGPWZ1bmN0aW9uKGYsQyl7cmV0dXJuIEM9QyE9PXZvaWQgMD9DOnAuY3JlYXRlRm9sZGVycyxmPVAoZiksdGhpcy5maWxlc1tmXXx8bi5jYWxsKHRoaXMsZixudWxsLHtkaXI6ITAsY3JlYXRlRm9sZGVyczpDfSksdGhpcy5maWxlc1tmXX07ZnVuY3Rpb24gaChmKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGYpPT09IltvYmplY3QgUmVnRXhwXSJ9dmFyIG89e2xvYWQ6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGZvckVhY2g6ZnVuY3Rpb24oZil7dmFyIEMsQixjO2ZvcihDIGluIHRoaXMuZmlsZXMpYz10aGlzLmZpbGVzW0NdLChCPUMuc2xpY2UodGhpcy5yb290Lmxlbmd0aCxDLmxlbmd0aCkpJiZDLnNsaWNlKDAsdGhpcy5yb290Lmxlbmd0aCk9PT10aGlzLnJvb3QmJmYoQixjKX0sZmlsdGVyOmZ1bmN0aW9uKGYpe3ZhciBDPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oQixjKXtmKEIsYykmJkMucHVzaChjKX0pLEN9LGZpbGU6ZnVuY3Rpb24oZixDLEIpe2lmKGFyZ3VtZW50cy5sZW5ndGghPT0xKXJldHVybiBmPXRoaXMucm9vdCtmLG4uY2FsbCh0aGlzLGYsQyxCKSx0aGlzO2lmKGgoZikpe3ZhciBjPWY7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKEcsZXQpe3JldHVybiFldC5kaXImJmMudGVzdChHKX0pfXZhciB6PXRoaXMuZmlsZXNbdGhpcy5yb290K2ZdO3JldHVybiB6JiYhei5kaXI/ejpudWxsfSxmb2xkZXI6ZnVuY3Rpb24oZil7aWYoIWYpcmV0dXJuIHRoaXM7aWYoaChmKSlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oeixHKXtyZXR1cm4gRy5kaXImJmYudGVzdCh6KX0pO3ZhciBDPXRoaXMucm9vdCtmLEI9Ri5jYWxsKHRoaXMsQyksYz10aGlzLmNsb25lKCk7cmV0dXJuIGMucm9vdD1CLm5hbWUsY30scmVtb3ZlOmZ1bmN0aW9uKGYpe2Y9dGhpcy5yb290K2Y7dmFyIEM9dGhpcy5maWxlc1tmXTtpZihDfHwoZi5zbGljZSgtMSkhPT0iLyImJihmKz0iLyIpLEM9dGhpcy5maWxlc1tmXSksQyYmIUMuZGlyKWRlbGV0ZSB0aGlzLmZpbGVzW2ZdO2Vsc2UgZm9yKHZhciBCPXRoaXMuZmlsdGVyKGZ1bmN0aW9uKHosRyl7cmV0dXJuIEcubmFtZS5zbGljZSgwLGYubGVuZ3RoKT09PWZ9KSxjPTA7YzxCLmxlbmd0aDtjKyspZGVsZXRlIHRoaXMuZmlsZXNbQltjXS5uYW1lXTtyZXR1cm4gdGhpc30sZ2VuZXJhdGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oZil7dmFyIEMsQj17fTt0cnl7aWYoKEI9YS5leHRlbmQoZnx8e30se3N0cmVhbUZpbGVzOiExLGNvbXByZXNzaW9uOiJTVE9SRSIsY29tcHJlc3Npb25PcHRpb25zOm51bGwsdHlwZToiIixwbGF0Zm9ybToiRE9TIixjb21tZW50Om51bGwsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ppcCIsZW5jb2RlRmlsZU5hbWU6cy51dGY4ZW5jb2RlfSkpLnR5cGU9Qi50eXBlLnRvTG93ZXJDYXNlKCksQi5jb21wcmVzc2lvbj1CLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCksQi50eXBlPT09ImJpbmFyeXN0cmluZyImJihCLnR5cGU9InN0cmluZyIpLCFCLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuIik7YS5jaGVja1N1cHBvcnQoQi50eXBlKSxCLnBsYXRmb3JtIT09ImRhcndpbiImJkIucGxhdGZvcm0hPT0iZnJlZWJzZCImJkIucGxhdGZvcm0hPT0ibGludXgiJiZCLnBsYXRmb3JtIT09InN1bm9zInx8KEIucGxhdGZvcm09IlVOSVgiKSxCLnBsYXRmb3JtPT09IndpbjMyIiYmKEIucGxhdGZvcm09IkRPUyIpO3ZhciBjPUIuY29tbWVudHx8dGhpcy5jb21tZW50fHwiIjtDPWcuZ2VuZXJhdGVXb3JrZXIodGhpcyxCLGMpfWNhdGNoKHopeyhDPW5ldyBsKCJlcnJvciIpKS5lcnJvcih6KX1yZXR1cm4gbmV3IHUoQyxCLnR5cGV8fCJzdHJpbmciLEIubWltZVR5cGUpfSxnZW5lcmF0ZUFzeW5jOmZ1bmN0aW9uKGYsQyl7cmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShmKS5hY2N1bXVsYXRlKEMpfSxnZW5lcmF0ZU5vZGVTdHJlYW06ZnVuY3Rpb24oZixDKXtyZXR1cm4oZj1mfHx7fSkudHlwZXx8KGYudHlwZT0ibm9kZWJ1ZmZlciIpLHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShmKS50b05vZGVqc1N0cmVhbShDKX19O2UuZXhwb3J0cz1vfSx7Ii4vY29tcHJlc3NlZE9iamVjdCI6MiwiLi9kZWZhdWx0cyI6NSwiLi9nZW5lcmF0ZSI6OSwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyIjoxMiwiLi9ub2RlanNVdGlscyI6MTQsIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3N0cmVhbS9TdHJlYW1IZWxwZXIiOjI5LCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBPYmplY3QiOjM1fV0sMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoInN0cmVhbSIpfSx7c3RyZWFtOnZvaWQgMH1dLDE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vRGF0YVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSk7Zm9yKHZhciBsPTA7bDx0aGlzLmRhdGEubGVuZ3RoO2wrKylhW2xdPTI1NSZhW2xdfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxuKSxzLnByb3RvdHlwZS5ieXRlQXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnplcm8rYV19LHMucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgbD1hLmNoYXJDb2RlQXQoMCksdT1hLmNoYXJDb2RlQXQoMSkscD1hLmNoYXJDb2RlQXQoMiksdj1hLmNoYXJDb2RlQXQoMyksbT10aGlzLmxlbmd0aC00OzA8PW07LS1tKWlmKHRoaXMuZGF0YVttXT09PWwmJnRoaXMuZGF0YVttKzFdPT09dSYmdGhpcy5kYXRhW20rMl09PT1wJiZ0aGlzLmRhdGFbbSszXT09PXYpcmV0dXJuIG0tdGhpcy56ZXJvO3JldHVybi0xfSxzLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmU9ZnVuY3Rpb24oYSl7dmFyIGw9YS5jaGFyQ29kZUF0KDApLHU9YS5jaGFyQ29kZUF0KDEpLHA9YS5jaGFyQ29kZUF0KDIpLHY9YS5jaGFyQ29kZUF0KDMpLG09dGhpcy5yZWFkRGF0YSg0KTtyZXR1cm4gbD09PW1bMF0mJnU9PT1tWzFdJiZwPT09bVsyXSYmdj09PW1bM119LHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2hlY2tPZmZzZXQoYSksYT09PTApcmV0dXJuW107dmFyIGw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2EpO3JldHVybiB0aGlzLmluZGV4Kz1hLGx9LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9EYXRhUmVhZGVyIjoxOH1dLDE4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIik7ZnVuY3Rpb24gcyhhKXt0aGlzLmRhdGE9YSx0aGlzLmxlbmd0aD1hLmxlbmd0aCx0aGlzLmluZGV4PTAsdGhpcy56ZXJvPTB9cy5wcm90b3R5cGU9e2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGEpe3RoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4K2EpfSxjaGVja0luZGV4OmZ1bmN0aW9uKGEpe2lmKHRoaXMubGVuZ3RoPHRoaXMuemVybythfHxhPDApdGhyb3cgbmV3IEVycm9yKCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICIrdGhpcy5sZW5ndGgrIiwgYXNrZWQgaW5kZXggPSAiK2ErIikuIENvcnJ1cHRlZCB6aXAgPyIpfSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmNoZWNrSW5kZXgoYSksdGhpcy5pbmRleD1hfSxza2lwOmZ1bmN0aW9uKGEpe3RoaXMuc2V0SW5kZXgodGhpcy5pbmRleCthKX0sYnl0ZUF0OmZ1bmN0aW9uKCl7fSxyZWFkSW50OmZ1bmN0aW9uKGEpe3ZhciBsLHU9MDtmb3IodGhpcy5jaGVja09mZnNldChhKSxsPXRoaXMuaW5kZXgrYS0xO2w+PXRoaXMuaW5kZXg7bC0tKXU9KHU8PDgpK3RoaXMuYnl0ZUF0KGwpO3JldHVybiB0aGlzLmluZGV4Kz1hLHV9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIG4udHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5yZWFkRGF0YShhKSl9LHJlYWREYXRhOmZ1bmN0aW9uKCl7fSxsYXN0SW5kZXhPZlNpZ25hdHVyZTpmdW5jdGlvbigpe30scmVhZEFuZENoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkRGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZEludCg0KTtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoMTk4MCsoYT4+MjUmMTI3KSwoYT4+MjEmMTUpLTEsYT4+MTYmMzEsYT4+MTEmMzEsYT4+NSY2MywoMzEmYSk8PDEpKX19LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMn1dLDE5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vVWludDhBcnJheVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe3RoaXMuY2hlY2tPZmZzZXQoYSk7dmFyIGw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2EpO3JldHVybiB0aGlzLmluZGV4Kz1hLGx9LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vRGF0YVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvK2EpfSxzLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmxhc3RJbmRleE9mKGEpLXRoaXMuemVyb30scy5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09dGhpcy5yZWFkRGF0YSg0KX0scy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oYSl7dGhpcy5jaGVja09mZnNldChhKTt2YXIgbD10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrYSk7cmV0dXJuIHRoaXMuaW5kZXgrPWEsbH0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9BcnJheVJlYWRlciIpO2Z1bmN0aW9uIHMoYSl7bi5jYWxsKHRoaXMsYSl9dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLG4pLHMucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2hlY2tPZmZzZXQoYSksYT09PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO3ZhciBsPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCthKTtyZXR1cm4gdGhpcy5pbmRleCs9YSxsfSxlLmV4cG9ydHM9c30seyIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3fV0sMjI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N1cHBvcnQiKSxhPXQoIi4vQXJyYXlSZWFkZXIiKSxsPXQoIi4vU3RyaW5nUmVhZGVyIiksdT10KCIuL05vZGVCdWZmZXJSZWFkZXIiKSxwPXQoIi4vVWludDhBcnJheVJlYWRlciIpO2UuZXhwb3J0cz1mdW5jdGlvbih2KXt2YXIgbT1uLmdldFR5cGVPZih2KTtyZXR1cm4gbi5jaGVja1N1cHBvcnQobSksbSE9PSJzdHJpbmcifHxzLnVpbnQ4YXJyYXk/bT09PSJub2RlYnVmZmVyIj9uZXcgdSh2KTpzLnVpbnQ4YXJyYXk/bmV3IHAobi50cmFuc2Zvcm1UbygidWludDhhcnJheSIsdikpOm5ldyBhKG4udHJhbnNmb3JtVG8oImFycmF5Iix2KSk6bmV3IGwodil9fSx7Ii4uL3N1cHBvcnQiOjMwLCIuLi91dGlscyI6MzIsIi4vQXJyYXlSZWFkZXIiOjE3LCIuL05vZGVCdWZmZXJSZWFkZXIiOjE5LCIuL1N0cmluZ1JlYWRlciI6MjAsIi4vVWludDhBcnJheVJlYWRlciI6MjF9XSwyMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtyLkxPQ0FMX0ZJTEVfSEVBREVSPSJQSwMEIixyLkNFTlRSQUxfRklMRV9IRUFERVI9IlBLAQIiLHIuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPSJQSwUGIixyLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1I9IlBLBlx4MDciLHIuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPSJQSwYGIixyLkRBVEFfREVTQ1JJUFRPUj0iUEtceDA3XGIifSx7fV0sMjQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9HZW5lcmljV29ya2VyIikscz10KCIuLi91dGlscyIpO2Z1bmN0aW9uIGEobCl7bi5jYWxsKHRoaXMsIkNvbnZlcnRXb3JrZXIgdG8gIitsKSx0aGlzLmRlc3RUeXBlPWx9cy5pbmhlcml0cyhhLG4pLGEucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihsKXt0aGlzLnB1c2goe2RhdGE6cy50cmFuc2Zvcm1Ubyh0aGlzLmRlc3RUeXBlLGwuZGF0YSksbWV0YTpsLm1ldGF9KX0sZS5leHBvcnRzPWF9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9HZW5lcmljV29ya2VyIikscz10KCIuLi9jcmMzMiIpO2Z1bmN0aW9uIGEoKXtuLmNhbGwodGhpcywiQ3JjMzJQcm9iZSIpLHRoaXMud2l0aFN0cmVhbUluZm8oImNyYzMyIiwwKX10KCIuLi91dGlscyIpLmluaGVyaXRzKGEsbiksYS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGwpe3RoaXMuc3RyZWFtSW5mby5jcmMzMj1zKGwuZGF0YSx0aGlzLnN0cmVhbUluZm8uY3JjMzJ8fDApLHRoaXMucHVzaChsKX0sZS5leHBvcnRzPWF9LHsiLi4vY3JjMzIiOjQsIi4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0dlbmVyaWNXb3JrZXIiKTtmdW5jdGlvbiBhKGwpe3MuY2FsbCh0aGlzLCJEYXRhTGVuZ3RoUHJvYmUgZm9yICIrbCksdGhpcy5wcm9wTmFtZT1sLHRoaXMud2l0aFN0cmVhbUluZm8obCwwKX1uLmluaGVyaXRzKGEscyksYS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGwpe2lmKGwpe3ZhciB1PXRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXXx8MDt0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV09dStsLmRhdGEubGVuZ3RofXMucHJvdG90eXBlLnByb2Nlc3NDaHVuay5jYWxsKHRoaXMsbCl9LGUuZXhwb3J0cz1hfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0dlbmVyaWNXb3JrZXIiKTtmdW5jdGlvbiBhKGwpe3MuY2FsbCh0aGlzLCJEYXRhV29ya2VyIik7dmFyIHU9dGhpczt0aGlzLmRhdGFJc1JlYWR5PSExLHRoaXMuaW5kZXg9MCx0aGlzLm1heD0wLHRoaXMuZGF0YT1udWxsLHRoaXMudHlwZT0iIix0aGlzLl90aWNrU2NoZWR1bGVkPSExLGwudGhlbihmdW5jdGlvbihwKXt1LmRhdGFJc1JlYWR5PSEwLHUuZGF0YT1wLHUubWF4PXAmJnAubGVuZ3RofHwwLHUudHlwZT1uLmdldFR5cGVPZihwKSx1LmlzUGF1c2VkfHx1Ll90aWNrQW5kUmVwZWF0KCl9LGZ1bmN0aW9uKHApe3UuZXJyb3IocCl9KX1uLmluaGVyaXRzKGEscyksYS5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe3MucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLmRhdGE9bnVsbH0sYS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSYmKCF0aGlzLl90aWNrU2NoZWR1bGVkJiZ0aGlzLmRhdGFJc1JlYWR5JiYodGhpcy5fdGlja1NjaGVkdWxlZD0hMCxuLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsW10sdGhpcykpLCEwKX0sYS5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQ9ZnVuY3Rpb24oKXt0aGlzLl90aWNrU2NoZWR1bGVkPSExLHRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZHx8KHRoaXMuX3RpY2soKSx0aGlzLmlzRmluaXNoZWR8fChuLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsW10sdGhpcyksdGhpcy5fdGlja1NjaGVkdWxlZD0hMCkpfSxhLnByb3RvdHlwZS5fdGljaz1mdW5jdGlvbigpe2lmKHRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt2YXIgbD1udWxsLHU9TWF0aC5taW4odGhpcy5tYXgsdGhpcy5pbmRleCsxNjM4NCk7aWYodGhpcy5pbmRleD49dGhpcy5tYXgpcmV0dXJuIHRoaXMuZW5kKCk7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJzdHJpbmciOmw9dGhpcy5kYXRhLnN1YnN0cmluZyh0aGlzLmluZGV4LHUpO2JyZWFrO2Nhc2UidWludDhhcnJheSI6bD10aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCx1KTticmVhaztjYXNlImFycmF5IjpjYXNlIm5vZGVidWZmZXIiOmw9dGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsdSl9cmV0dXJuIHRoaXMuaW5kZXg9dSx0aGlzLnB1c2goe2RhdGE6bCxtZXRhOntwZXJjZW50OnRoaXMubWF4P3RoaXMuaW5kZXgvdGhpcy5tYXgqMTAwOjB9fSl9LGUuZXhwb3J0cz1hfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4ocyl7dGhpcy5uYW1lPXN8fCJkZWZhdWx0Iix0aGlzLnN0cmVhbUluZm89e30sdGhpcy5nZW5lcmF0ZWRFcnJvcj1udWxsLHRoaXMuZXh0cmFTdHJlYW1JbmZvPXt9LHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5pc0ZpbmlzaGVkPSExLHRoaXMuaXNMb2NrZWQ9ITEsdGhpcy5fbGlzdGVuZXJzPXtkYXRhOltdLGVuZDpbXSxlcnJvcjpbXX0sdGhpcy5wcmV2aW91cz1udWxsfW4ucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKHMpe3RoaXMuZW1pdCgiZGF0YSIscyl9LGVuZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt0aGlzLmZsdXNoKCk7dHJ5e3RoaXMuZW1pdCgiZW5kIiksdGhpcy5jbGVhblVwKCksdGhpcy5pc0ZpbmlzaGVkPSEwfWNhdGNoKHMpe3RoaXMuZW1pdCgiZXJyb3IiLHMpfXJldHVybiEwfSxlcnJvcjpmdW5jdGlvbihzKXtyZXR1cm4hdGhpcy5pc0ZpbmlzaGVkJiYodGhpcy5pc1BhdXNlZD90aGlzLmdlbmVyYXRlZEVycm9yPXM6KHRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLmVtaXQoImVycm9yIixzKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmVycm9yKHMpLHRoaXMuY2xlYW5VcCgpKSwhMCl9LG9uOmZ1bmN0aW9uKHMsYSl7cmV0dXJuIHRoaXMuX2xpc3RlbmVyc1tzXS5wdXNoKGEpLHRoaXN9LGNsZWFuVXA6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbUluZm89dGhpcy5nZW5lcmF0ZWRFcnJvcj10aGlzLmV4dHJhU3RyZWFtSW5mbz1udWxsLHRoaXMuX2xpc3RlbmVycz1bXX0sZW1pdDpmdW5jdGlvbihzLGEpe2lmKHRoaXMuX2xpc3RlbmVyc1tzXSlmb3IodmFyIGw9MDtsPHRoaXMuX2xpc3RlbmVyc1tzXS5sZW5ndGg7bCsrKXRoaXMuX2xpc3RlbmVyc1tzXVtsXS5jYWxsKHRoaXMsYSl9LHBpcGU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMucmVnaXN0ZXJQcmV2aW91cyh0aGlzKX0scmVnaXN0ZXJQcmV2aW91czpmdW5jdGlvbihzKXtpZih0aGlzLmlzTG9ja2VkKXRocm93IG5ldyBFcnJvcigiVGhlIHN0cmVhbSAnIit0aGlzKyInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4iKTt0aGlzLnN0cmVhbUluZm89cy5zdHJlYW1JbmZvLHRoaXMubWVyZ2VTdHJlYW1JbmZvKCksdGhpcy5wcmV2aW91cz1zO3ZhciBhPXRoaXM7cmV0dXJuIHMub24oImRhdGEiLGZ1bmN0aW9uKGwpe2EucHJvY2Vzc0NodW5rKGwpfSkscy5vbigiZW5kIixmdW5jdGlvbigpe2EuZW5kKCl9KSxzLm9uKCJlcnJvciIsZnVuY3Rpb24obCl7YS5lcnJvcihsKX0pLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNQYXVzZWQmJiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkPSEwLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMucGF1c2UoKSwhMCl9LHJlc3VtZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIHM9dGhpcy5pc1BhdXNlZD0hMTtyZXR1cm4gdGhpcy5nZW5lcmF0ZWRFcnJvciYmKHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcikscz0hMCksdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5yZXN1bWUoKSwhc30sZmx1c2g6ZnVuY3Rpb24oKXt9LHByb2Nlc3NDaHVuazpmdW5jdGlvbihzKXt0aGlzLnB1c2gocyl9LHdpdGhTdHJlYW1JbmZvOmZ1bmN0aW9uKHMsYSl7cmV0dXJuIHRoaXMuZXh0cmFTdHJlYW1JbmZvW3NdPWEsdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzfSxtZXJnZVN0cmVhbUluZm86ZnVuY3Rpb24oKXtmb3IodmFyIHMgaW4gdGhpcy5leHRyYVN0cmVhbUluZm8pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZXh0cmFTdHJlYW1JbmZvLHMpJiYodGhpcy5zdHJlYW1JbmZvW3NdPXRoaXMuZXh0cmFTdHJlYW1JbmZvW3NdKX0sbG9jazpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuaXNMb2NrZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5sb2NrKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHM9IldvcmtlciAiK3RoaXMubmFtZTtyZXR1cm4gdGhpcy5wcmV2aW91cz90aGlzLnByZXZpb3VzKyIgLT4gIitzOnN9fSxlLmV4cG9ydHM9bn0se31dLDI5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzIikscz10KCIuL0NvbnZlcnRXb3JrZXIiKSxhPXQoIi4vR2VuZXJpY1dvcmtlciIpLGw9dCgiLi4vYmFzZTY0IiksdT10KCIuLi9zdXBwb3J0IikscD10KCIuLi9leHRlcm5hbCIpLHY9bnVsbDtpZih1Lm5vZGVzdHJlYW0pdHJ5e3Y9dCgiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiKX1jYXRjaHt9ZnVuY3Rpb24gbShULHcpe3JldHVybiBuZXcgcC5Qcm9taXNlKGZ1bmN0aW9uKGssUCl7dmFyIEY9W10saD1ULl9pbnRlcm5hbFR5cGUsbz1ULl9vdXRwdXRUeXBlLGY9VC5fbWltZVR5cGU7VC5vbigiZGF0YSIsZnVuY3Rpb24oQyxCKXtGLnB1c2goQyksdyYmdyhCKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oQyl7Rj1bXSxQKEMpfSkub24oImVuZCIsZnVuY3Rpb24oKXt0cnl7dmFyIEM9ZnVuY3Rpb24oQixjLHope3N3aXRjaChCKXtjYXNlImJsb2IiOnJldHVybiBuLm5ld0Jsb2Iobi50cmFuc2Zvcm1UbygiYXJyYXlidWZmZXIiLGMpLHopO2Nhc2UiYmFzZTY0IjpyZXR1cm4gbC5lbmNvZGUoYyk7ZGVmYXVsdDpyZXR1cm4gbi50cmFuc2Zvcm1UbyhCLGMpfX0obyxmdW5jdGlvbihCLGMpe3ZhciB6LEc9MCxldD1udWxsLEU9MDtmb3Ioej0wO3o8Yy5sZW5ndGg7eisrKUUrPWNbel0ubGVuZ3RoO3N3aXRjaChCKXtjYXNlInN0cmluZyI6cmV0dXJuIGMuam9pbigiIik7Y2FzZSJhcnJheSI6cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYyk7Y2FzZSJ1aW50OGFycmF5Ijpmb3IoZXQ9bmV3IFVpbnQ4QXJyYXkoRSksej0wO3o8Yy5sZW5ndGg7eisrKWV0LnNldChjW3pdLEcpLEcrPWNbel0ubGVuZ3RoO3JldHVybiBldDtjYXNlIm5vZGVidWZmZXIiOnJldHVybiBCdWZmZXIuY29uY2F0KGMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICciK0IrIiciKX19KGgsRiksZik7ayhDKX1jYXRjaChCKXtQKEIpfUY9W119KS5yZXN1bWUoKX0pfWZ1bmN0aW9uIGcoVCx3LGspe3ZhciBQPXc7c3dpdGNoKHcpe2Nhc2UiYmxvYiI6Y2FzZSJhcnJheWJ1ZmZlciI6UD0idWludDhhcnJheSI7YnJlYWs7Y2FzZSJiYXNlNjQiOlA9InN0cmluZyJ9dHJ5e3RoaXMuX2ludGVybmFsVHlwZT1QLHRoaXMuX291dHB1dFR5cGU9dyx0aGlzLl9taW1lVHlwZT1rLG4uY2hlY2tTdXBwb3J0KFApLHRoaXMuX3dvcmtlcj1ULnBpcGUobmV3IHMoUCkpLFQubG9jaygpfWNhdGNoKEYpe3RoaXMuX3dvcmtlcj1uZXcgYSgiZXJyb3IiKSx0aGlzLl93b3JrZXIuZXJyb3IoRil9fWcucHJvdG90eXBlPXthY2N1bXVsYXRlOmZ1bmN0aW9uKFQpe3JldHVybiBtKHRoaXMsVCl9LG9uOmZ1bmN0aW9uKFQsdyl7dmFyIGs9dGhpcztyZXR1cm4gVD09PSJkYXRhIj90aGlzLl93b3JrZXIub24oVCxmdW5jdGlvbihQKXt3LmNhbGwoayxQLmRhdGEsUC5tZXRhKX0pOnRoaXMuX3dvcmtlci5vbihULGZ1bmN0aW9uKCl7bi5kZWxheSh3LGFyZ3VtZW50cyxrKX0pLHRoaXN9LHJlc3VtZTpmdW5jdGlvbigpe3JldHVybiBuLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsW10sdGhpcy5fd29ya2VyKSx0aGlzfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93b3JrZXIucGF1c2UoKSx0aGlzfSx0b05vZGVqc1N0cmVhbTpmdW5jdGlvbihUKXtpZihuLmNoZWNrU3VwcG9ydCgibm9kZXN0cmVhbSIpLHRoaXMuX291dHB1dFR5cGUhPT0ibm9kZWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUrIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kIik7cmV0dXJuIG5ldyB2KHRoaXMse29iamVjdE1vZGU6dGhpcy5fb3V0cHV0VHlwZSE9PSJub2RlYnVmZmVyIn0sVCl9fSxlLmV4cG9ydHM9Z30seyIuLi9iYXNlNjQiOjEsIi4uL2V4dGVybmFsIjo2LCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciI6MTMsIi4uL3N1cHBvcnQiOjMwLCIuLi91dGlscyI6MzIsIi4vQ29udmVydFdvcmtlciI6MjQsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwzMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtpZihyLmJhc2U2ND0hMCxyLmFycmF5PSEwLHIuc3RyaW5nPSEwLHIuYXJyYXlidWZmZXI9dHlwZW9mIEFycmF5QnVmZmVyPCJ1IiYmdHlwZW9mIFVpbnQ4QXJyYXk8InUiLHIubm9kZWJ1ZmZlcj10eXBlb2YgQnVmZmVyPCJ1IixyLnVpbnQ4YXJyYXk9dHlwZW9mIFVpbnQ4QXJyYXk8InUiLHR5cGVvZiBBcnJheUJ1ZmZlcj4idSIpci5ibG9iPSExO2Vsc2V7dmFyIG49bmV3IEFycmF5QnVmZmVyKDApO3RyeXtyLmJsb2I9bmV3IEJsb2IoW25dLHt0eXBlOiJhcHBsaWNhdGlvbi96aXAifSkuc2l6ZT09PTB9Y2F0Y2h7dHJ5e3ZhciBzPW5ldyhzZWxmLkJsb2JCdWlsZGVyfHxzZWxmLldlYktpdEJsb2JCdWlsZGVyfHxzZWxmLk1vekJsb2JCdWlsZGVyfHxzZWxmLk1TQmxvYkJ1aWxkZXIpO3MuYXBwZW5kKG4pLHIuYmxvYj1zLmdldEJsb2IoImFwcGxpY2F0aW9uL3ppcCIpLnNpemU9PT0wfWNhdGNoe3IuYmxvYj0hMX19fXRyeXtyLm5vZGVzdHJlYW09ISF0KCJyZWFkYWJsZS1zdHJlYW0iKS5SZWFkYWJsZX1jYXRjaHtyLm5vZGVzdHJlYW09ITF9fSx7InJlYWRhYmxlLXN0cmVhbSI6MTZ9XSwzMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijtmb3IodmFyIG49dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksYT10KCIuL25vZGVqc1V0aWxzIiksbD10KCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIiksdT1uZXcgQXJyYXkoMjU2KSxwPTA7cDwyNTY7cCsrKXVbcF09MjUyPD1wPzY6MjQ4PD1wPzU6MjQwPD1wPzQ6MjI0PD1wPzM6MTkyPD1wPzI6MTt1WzI1NF09dVsyNTRdPTE7ZnVuY3Rpb24gdigpe2wuY2FsbCh0aGlzLCJ1dGYtOCBkZWNvZGUiKSx0aGlzLmxlZnRPdmVyPW51bGx9ZnVuY3Rpb24gbSgpe2wuY2FsbCh0aGlzLCJ1dGYtOCBlbmNvZGUiKX1yLnV0ZjhlbmNvZGU9ZnVuY3Rpb24oZyl7cmV0dXJuIHMubm9kZWJ1ZmZlcj9hLm5ld0J1ZmZlckZyb20oZywidXRmLTgiKTpmdW5jdGlvbihUKXt2YXIgdyxrLFAsRixoLG89VC5sZW5ndGgsZj0wO2ZvcihGPTA7RjxvO0YrKykoNjQ1MTImKGs9VC5jaGFyQ29kZUF0KEYpKSk9PTU1Mjk2JiZGKzE8byYmKDY0NTEyJihQPVQuY2hhckNvZGVBdChGKzEpKSk9PTU2MzIwJiYoaz02NTUzNisoay01NTI5Njw8MTApKyhQLTU2MzIwKSxGKyspLGYrPWs8MTI4PzE6azwyMDQ4PzI6azw2NTUzNj8zOjQ7Zm9yKHc9cy51aW50OGFycmF5P25ldyBVaW50OEFycmF5KGYpOm5ldyBBcnJheShmKSxGPWg9MDtoPGY7RisrKSg2NDUxMiYoaz1ULmNoYXJDb2RlQXQoRikpKT09NTUyOTYmJkYrMTxvJiYoNjQ1MTImKFA9VC5jaGFyQ29kZUF0KEYrMSkpKT09NTYzMjAmJihrPTY1NTM2KyhrLTU1Mjk2PDwxMCkrKFAtNTYzMjApLEYrKyksazwxMjg/d1toKytdPWs6KGs8MjA0OD93W2grK109MTkyfGs+Pj42OihrPDY1NTM2P3dbaCsrXT0yMjR8az4+PjEyOih3W2grK109MjQwfGs+Pj4xOCx3W2grK109MTI4fGs+Pj4xMiY2Myksd1toKytdPTEyOHxrPj4+NiY2Myksd1toKytdPTEyOHw2MyZrKTtyZXR1cm4gd30oZyl9LHIudXRmOGRlY29kZT1mdW5jdGlvbihnKXtyZXR1cm4gcy5ub2RlYnVmZmVyP24udHJhbnNmb3JtVG8oIm5vZGVidWZmZXIiLGcpLnRvU3RyaW5nKCJ1dGYtOCIpOmZ1bmN0aW9uKFQpe3ZhciB3LGssUCxGLGg9VC5sZW5ndGgsbz1uZXcgQXJyYXkoMipoKTtmb3Iodz1rPTA7dzxoOylpZigoUD1UW3crK10pPDEyOClvW2srK109UDtlbHNlIGlmKDQ8KEY9dVtQXSkpb1trKytdPTY1NTMzLHcrPUYtMTtlbHNle2ZvcihQJj1GPT09Mj8zMTpGPT09Mz8xNTo3OzE8RiYmdzxoOylQPVA8PDZ8NjMmVFt3KytdLEYtLTsxPEY/b1trKytdPTY1NTMzOlA8NjU1MzY/b1trKytdPVA6KFAtPTY1NTM2LG9baysrXT01NTI5NnxQPj4xMCYxMDIzLG9baysrXT01NjMyMHwxMDIzJlApfXJldHVybiBvLmxlbmd0aCE9PWsmJihvLnN1YmFycmF5P289by5zdWJhcnJheSgwLGspOm8ubGVuZ3RoPWspLG4uYXBwbHlGcm9tQ2hhckNvZGUobyl9KGc9bi50cmFuc2Zvcm1UbyhzLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSIsZykpfSxuLmluaGVyaXRzKHYsbCksdi5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGcpe3ZhciBUPW4udHJhbnNmb3JtVG8ocy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLGcuZGF0YSk7aWYodGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgpe2lmKHMudWludDhhcnJheSl7dmFyIHc9VDsoVD1uZXcgVWludDhBcnJheSh3Lmxlbmd0aCt0aGlzLmxlZnRPdmVyLmxlbmd0aCkpLnNldCh0aGlzLmxlZnRPdmVyLDApLFQuc2V0KHcsdGhpcy5sZWZ0T3Zlci5sZW5ndGgpfWVsc2UgVD10aGlzLmxlZnRPdmVyLmNvbmNhdChUKTt0aGlzLmxlZnRPdmVyPW51bGx9dmFyIGs9ZnVuY3Rpb24oRixoKXt2YXIgbztmb3IoKGg9aHx8Ri5sZW5ndGgpPkYubGVuZ3RoJiYoaD1GLmxlbmd0aCksbz1oLTE7MDw9byYmKDE5MiZGW29dKT09MTI4OylvLS07cmV0dXJuIG88MHx8bz09PTA/aDpvK3VbRltvXV0+aD9vOmh9KFQpLFA9VDtrIT09VC5sZW5ndGgmJihzLnVpbnQ4YXJyYXk/KFA9VC5zdWJhcnJheSgwLGspLHRoaXMubGVmdE92ZXI9VC5zdWJhcnJheShrLFQubGVuZ3RoKSk6KFA9VC5zbGljZSgwLGspLHRoaXMubGVmdE92ZXI9VC5zbGljZShrLFQubGVuZ3RoKSkpLHRoaXMucHVzaCh7ZGF0YTpyLnV0ZjhkZWNvZGUoUCksbWV0YTpnLm1ldGF9KX0sdi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmxlZnRPdmVyJiZ0aGlzLmxlZnRPdmVyLmxlbmd0aCYmKHRoaXMucHVzaCh7ZGF0YTpyLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksbWV0YTp7fX0pLHRoaXMubGVmdE92ZXI9bnVsbCl9LHIuVXRmOERlY29kZVdvcmtlcj12LG4uaW5oZXJpdHMobSxsKSxtLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oZyl7dGhpcy5wdXNoKHtkYXRhOnIudXRmOGVuY29kZShnLmRhdGEpLG1ldGE6Zy5tZXRhfSl9LHIuVXRmOEVuY29kZVdvcmtlcj1tfSx7Ii4vbm9kZWpzVXRpbHMiOjE0LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwzMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL3N1cHBvcnQiKSxzPXQoIi4vYmFzZTY0IiksYT10KCIuL25vZGVqc1V0aWxzIiksbD10KCIuL2V4dGVybmFsIik7ZnVuY3Rpb24gdSh3KXtyZXR1cm4gd31mdW5jdGlvbiBwKHcsayl7Zm9yKHZhciBQPTA7UDx3Lmxlbmd0aDsrK1Apa1tQXT0yNTUmdy5jaGFyQ29kZUF0KFApO3JldHVybiBrfXQoInNldGltbWVkaWF0ZSIpLHIubmV3QmxvYj1mdW5jdGlvbih3LGspe3IuY2hlY2tTdXBwb3J0KCJibG9iIik7dHJ5e3JldHVybiBuZXcgQmxvYihbd10se3R5cGU6a30pfWNhdGNoe3RyeXt2YXIgUD1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtyZXR1cm4gUC5hcHBlbmQodyksUC5nZXRCbG9iKGspfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLiIpfX19O3ZhciB2PXtzdHJpbmdpZnlCeUNodW5rOmZ1bmN0aW9uKHcsayxQKXt2YXIgRj1bXSxoPTAsbz13Lmxlbmd0aDtpZihvPD1QKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdyk7Zm9yKDtoPG87KWs9PT0iYXJyYXkifHxrPT09Im5vZGVidWZmZXIiP0YucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdy5zbGljZShoLE1hdGgubWluKGgrUCxvKSkpKTpGLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHcuc3ViYXJyYXkoaCxNYXRoLm1pbihoK1AsbykpKSksaCs9UDtyZXR1cm4gRi5qb2luKCIiKX0sc3RyaW5naWZ5QnlDaGFyOmZ1bmN0aW9uKHcpe2Zvcih2YXIgaz0iIixQPTA7UDx3Lmxlbmd0aDtQKyspays9U3RyaW5nLmZyb21DaGFyQ29kZSh3W1BdKTtyZXR1cm4ga30sYXBwbHlDYW5CZVVzZWQ6e3VpbnQ4YXJyYXk6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG4udWludDhhcnJheSYmU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGg9PT0xfWNhdGNoe3JldHVybiExfX0oKSxub2RlYnVmZmVyOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuLm5vZGVidWZmZXImJlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhLmFsbG9jQnVmZmVyKDEpKS5sZW5ndGg9PT0xfWNhdGNoe3JldHVybiExfX0oKX19O2Z1bmN0aW9uIG0odyl7dmFyIGs9NjU1MzYsUD1yLmdldFR5cGVPZih3KSxGPSEwO2lmKFA9PT0idWludDhhcnJheSI/Rj12LmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk6UD09PSJub2RlYnVmZmVyIiYmKEY9di5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyKSxGKWZvcig7MTxrOyl0cnl7cmV0dXJuIHYuc3RyaW5naWZ5QnlDaHVuayh3LFAsayl9Y2F0Y2h7az1NYXRoLmZsb29yKGsvMil9cmV0dXJuIHYuc3RyaW5naWZ5QnlDaGFyKHcpfWZ1bmN0aW9uIGcodyxrKXtmb3IodmFyIFA9MDtQPHcubGVuZ3RoO1ArKylrW1BdPXdbUF07cmV0dXJuIGt9ci5hcHBseUZyb21DaGFyQ29kZT1tO3ZhciBUPXt9O1Quc3RyaW5nPXtzdHJpbmc6dSxhcnJheTpmdW5jdGlvbih3KXtyZXR1cm4gcCh3LG5ldyBBcnJheSh3Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gVC5zdHJpbmcudWludDhhcnJheSh3KS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIHAodyxuZXcgVWludDhBcnJheSh3Lmxlbmd0aCkpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBwKHcsYS5hbGxvY0J1ZmZlcih3Lmxlbmd0aCkpfX0sVC5hcnJheT17c3RyaW5nOm0sYXJyYXk6dSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodykuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHcpe3JldHVybiBuZXcgVWludDhBcnJheSh3KX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gYS5uZXdCdWZmZXJGcm9tKHcpfX0sVC5hcnJheWJ1ZmZlcj17c3RyaW5nOmZ1bmN0aW9uKHcpe3JldHVybiBtKG5ldyBVaW50OEFycmF5KHcpKX0sYXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIGcobmV3IFVpbnQ4QXJyYXkodyksbmV3IEFycmF5KHcuYnl0ZUxlbmd0aCkpfSxhcnJheWJ1ZmZlcjp1LHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHcpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBhLm5ld0J1ZmZlckZyb20obmV3IFVpbnQ4QXJyYXkodykpfX0sVC51aW50OGFycmF5PXtzdHJpbmc6bSxhcnJheTpmdW5jdGlvbih3KXtyZXR1cm4gZyh3LG5ldyBBcnJheSh3Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih3KXtyZXR1cm4gdy5idWZmZXJ9LHVpbnQ4YXJyYXk6dSxub2RlYnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBhLm5ld0J1ZmZlckZyb20odyl9fSxULm5vZGVidWZmZXI9e3N0cmluZzptLGFycmF5OmZ1bmN0aW9uKHcpe3JldHVybiBnKHcsbmV3IEFycmF5KHcubGVuZ3RoKSl9LGFycmF5YnVmZmVyOmZ1bmN0aW9uKHcpe3JldHVybiBULm5vZGVidWZmZXIudWludDhhcnJheSh3KS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24odyl7cmV0dXJuIGcodyxuZXcgVWludDhBcnJheSh3Lmxlbmd0aCkpfSxub2RlYnVmZmVyOnV9LHIudHJhbnNmb3JtVG89ZnVuY3Rpb24odyxrKXtpZihrPWt8fCIiLCF3KXJldHVybiBrO3IuY2hlY2tTdXBwb3J0KHcpO3ZhciBQPXIuZ2V0VHlwZU9mKGspO3JldHVybiBUW1BdW3ddKGspfSxyLnJlc29sdmU9ZnVuY3Rpb24odyl7Zm9yKHZhciBrPXcuc3BsaXQoIi8iKSxQPVtdLEY9MDtGPGsubGVuZ3RoO0YrKyl7dmFyIGg9a1tGXTtoPT09Ii4ifHxoPT09IiImJkYhPT0wJiZGIT09ay5sZW5ndGgtMXx8KGg9PT0iLi4iP1AucG9wKCk6UC5wdXNoKGgpKX1yZXR1cm4gUC5qb2luKCIvIil9LHIuZ2V0VHlwZU9mPWZ1bmN0aW9uKHcpe3JldHVybiB0eXBlb2Ygdz09InN0cmluZyI/InN0cmluZyI6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHcpPT09IltvYmplY3QgQXJyYXldIj8iYXJyYXkiOm4ubm9kZWJ1ZmZlciYmYS5pc0J1ZmZlcih3KT8ibm9kZWJ1ZmZlciI6bi51aW50OGFycmF5JiZ3IGluc3RhbmNlb2YgVWludDhBcnJheT8idWludDhhcnJheSI6bi5hcnJheWJ1ZmZlciYmdyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyPyJhcnJheWJ1ZmZlciI6dm9pZCAwfSxyLmNoZWNrU3VwcG9ydD1mdW5jdGlvbih3KXtpZighblt3LnRvTG93ZXJDYXNlKCldKXRocm93IG5ldyBFcnJvcih3KyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtIil9LHIuTUFYX1ZBTFVFXzE2QklUUz02NTUzNSxyLk1BWF9WQUxVRV8zMkJJVFM9LTEsci5wcmV0dHk9ZnVuY3Rpb24odyl7dmFyIGssUCxGPSIiO2ZvcihQPTA7UDwod3x8IiIpLmxlbmd0aDtQKyspRis9IlxceCIrKChrPXcuY2hhckNvZGVBdChQKSk8MTY/IjAiOiIiKStrLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiBGfSxyLmRlbGF5PWZ1bmN0aW9uKHcsayxQKXtzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKXt3LmFwcGx5KFB8fG51bGwsa3x8W10pfSl9LHIuaW5oZXJpdHM9ZnVuY3Rpb24odyxrKXtmdW5jdGlvbiBQKCl7fVAucHJvdG90eXBlPWsucHJvdG90eXBlLHcucHJvdG90eXBlPW5ldyBQfSxyLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB3LGssUD17fTtmb3Iodz0wO3c8YXJndW1lbnRzLmxlbmd0aDt3KyspZm9yKGsgaW4gYXJndW1lbnRzW3ddKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbd10saykmJlBba109PT12b2lkIDAmJihQW2tdPWFyZ3VtZW50c1t3XVtrXSk7cmV0dXJuIFB9LHIucHJlcGFyZUNvbnRlbnQ9ZnVuY3Rpb24odyxrLFAsRixoKXtyZXR1cm4gbC5Qcm9taXNlLnJlc29sdmUoaykudGhlbihmdW5jdGlvbihvKXtyZXR1cm4gbi5ibG9iJiYobyBpbnN0YW5jZW9mIEJsb2J8fFsiW29iamVjdCBGaWxlXSIsIltvYmplY3QgQmxvYl0iXS5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSkhPT0tMSkmJnR5cGVvZiBGaWxlUmVhZGVyPCJ1Ij9uZXcgbC5Qcm9taXNlKGZ1bmN0aW9uKGYsQyl7dmFyIEI9bmV3IEZpbGVSZWFkZXI7Qi5vbmxvYWQ9ZnVuY3Rpb24oYyl7ZihjLnRhcmdldC5yZXN1bHQpfSxCLm9uZXJyb3I9ZnVuY3Rpb24oYyl7QyhjLnRhcmdldC5lcnJvcil9LEIucmVhZEFzQXJyYXlCdWZmZXIobyl9KTpvfSkudGhlbihmdW5jdGlvbihvKXt2YXIgZj1yLmdldFR5cGVPZihvKTtyZXR1cm4gZj8oZj09PSJhcnJheWJ1ZmZlciI/bz1yLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixvKTpmPT09InN0cmluZyImJihoP289cy5kZWNvZGUobyk6UCYmRiE9PSEwJiYobz1mdW5jdGlvbihDKXtyZXR1cm4gcChDLG4udWludDhhcnJheT9uZXcgVWludDhBcnJheShDLmxlbmd0aCk6bmV3IEFycmF5KEMubGVuZ3RoKSl9KG8pKSksbyk6bC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkNhbid0IHJlYWQgdGhlIGRhdGEgb2YgJyIrdysiJy4gSXMgaXQgaW4gYSBzdXBwb3J0ZWQgSmF2YVNjcmlwdCB0eXBlIChTdHJpbmcsIEJsb2IsIEFycmF5QnVmZmVyLCBldGMpID8iKSl9KX19LHsiLi9iYXNlNjQiOjEsIi4vZXh0ZXJuYWwiOjYsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N1cHBvcnQiOjMwLHNldGltbWVkaWF0ZTo1NH1dLDMzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vcmVhZGVyL3JlYWRlckZvciIpLHM9dCgiLi91dGlscyIpLGE9dCgiLi9zaWduYXR1cmUiKSxsPXQoIi4vemlwRW50cnkiKSx1PXQoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIHAodil7dGhpcy5maWxlcz1bXSx0aGlzLmxvYWRPcHRpb25zPXZ9cC5wcm90b3R5cGU9e2NoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKHYpe2lmKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUodikpe3RoaXMucmVhZGVyLmluZGV4LT00O3ZhciBtPXRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7dGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogdW5leHBlY3RlZCBzaWduYXR1cmUgKCIrcy5wcmV0dHkobSkrIiwgZXhwZWN0ZWQgIitzLnByZXR0eSh2KSsiKSIpfX0saXNTaWduYXR1cmU6ZnVuY3Rpb24odixtKXt2YXIgZz10aGlzLnJlYWRlci5pbmRleDt0aGlzLnJlYWRlci5zZXRJbmRleCh2KTt2YXIgVD10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpPT09bTtyZXR1cm4gdGhpcy5yZWFkZXIuc2V0SW5kZXgoZyksVH0scmVhZEJsb2NrRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoMiksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnppcENvbW1lbnRMZW5ndGg9dGhpcy5yZWFkZXIucmVhZEludCgyKTt2YXIgdj10aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpLG09dS51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLGc9cy50cmFuc2Zvcm1UbyhtLHYpO3RoaXMuemlwQ29tbWVudD10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGcpfSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5yZWFkZXIuc2tpcCg0KSx0aGlzLmRpc2tOdW1iZXI9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpck9mZnNldD10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YT17fTtmb3IodmFyIHYsbSxnLFQ9dGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUtNDQ7MDxUOyl2PXRoaXMucmVhZGVyLnJlYWRJbnQoMiksbT10aGlzLnJlYWRlci5yZWFkSW50KDQpLGc9dGhpcy5yZWFkZXIucmVhZERhdGEobSksdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW3ZdPXtpZDp2LGxlbmd0aDptLHZhbHVlOmd9fSxyZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6ZnVuY3Rpb24oKXtpZih0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmRpc2tzQ291bnQ9dGhpcy5yZWFkZXIucmVhZEludCg0KSwxPHRoaXMuZGlza3NDb3VudCl0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXZvbHVtZXMgemlwIGFyZSBub3Qgc3VwcG9ydGVkIil9LHJlYWRMb2NhbEZpbGVzOmZ1bmN0aW9uKCl7dmFyIHYsbTtmb3Iodj0wO3Y8dGhpcy5maWxlcy5sZW5ndGg7disrKW09dGhpcy5maWxlc1t2XSx0aGlzLnJlYWRlci5zZXRJbmRleChtLmxvY2FsSGVhZGVyT2Zmc2V0KSx0aGlzLmNoZWNrU2lnbmF0dXJlKGEuTE9DQUxfRklMRV9IRUFERVIpLG0ucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlciksbS5oYW5kbGVVVEY4KCksbS5wcm9jZXNzQXR0cmlidXRlcygpfSxyZWFkQ2VudHJhbERpcjpmdW5jdGlvbigpe3ZhciB2O2Zvcih0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO3RoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShhLkNFTlRSQUxfRklMRV9IRUFERVIpOykodj1uZXcgbCh7emlwNjQ6dGhpcy56aXA2NH0sdGhpcy5sb2FkT3B0aW9ucykpLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlciksdGhpcy5maWxlcy5wdXNoKHYpO2lmKHRoaXMuY2VudHJhbERpclJlY29yZHMhPT10aGlzLmZpbGVzLmxlbmd0aCYmdGhpcy5jZW50cmFsRGlyUmVjb3JkcyE9PTAmJnRoaXMuZmlsZXMubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAiK3RoaXMuY2VudHJhbERpclJlY29yZHMrIiByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgIit0aGlzLmZpbGVzLmxlbmd0aCl9LHJlYWRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt2YXIgdj10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShhLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7aWYodjwwKXRocm93IHRoaXMuaXNTaWduYXR1cmUoMCxhLkxPQ0FMX0ZJTEVfSEVBREVSKT9uZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Iik6bmV3IEVycm9yKCJDYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSA6IGlzIHRoaXMgYSB6aXAgZmlsZSA/IElmIGl0IGlzLCBzZWUgaHR0cHM6Ly9zdHVrLmdpdGh1Yi5pby9qc3ppcC9kb2N1bWVudGF0aW9uL2hvd3RvL3JlYWRfemlwLmh0bWwiKTt0aGlzLnJlYWRlci5zZXRJbmRleCh2KTt2YXIgbT12O2lmKHRoaXMuY2hlY2tTaWduYXR1cmUoYS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCksdGhpcy5kaXNrTnVtYmVyPT09cy5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09cy5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkcz09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUU3x8dGhpcy5jZW50cmFsRGlyT2Zmc2V0PT09cy5NQVhfVkFMVUVfMzJCSVRTKXtpZih0aGlzLnppcDY0PSEwLCh2PXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGEuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUikpPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciIpO2lmKHRoaXMucmVhZGVyLnNldEluZGV4KHYpLHRoaXMuY2hlY2tTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSx0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpLCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcixhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkmJih0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoYS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcjwwKSl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpO3RoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciksdGhpcy5jaGVja1NpZ25hdHVyZShhLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpfXZhciBnPXRoaXMuY2VudHJhbERpck9mZnNldCt0aGlzLmNlbnRyYWxEaXJTaXplO3RoaXMuemlwNjQmJihnKz0yMCxnKz0xMit0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSk7dmFyIFQ9bS1nO2lmKDA8VCl0aGlzLmlzU2lnbmF0dXJlKG0sYS5DRU5UUkFMX0ZJTEVfSEVBREVSKXx8KHRoaXMucmVhZGVyLnplcm89VCk7ZWxzZSBpZihUPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nICIrTWF0aC5hYnMoVCkrIiBieXRlcy4iKX0scHJlcGFyZVJlYWRlcjpmdW5jdGlvbih2KXt0aGlzLnJlYWRlcj1uKHYpfSxsb2FkOmZ1bmN0aW9uKHYpe3RoaXMucHJlcGFyZVJlYWRlcih2KSx0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKSx0aGlzLnJlYWRDZW50cmFsRGlyKCksdGhpcy5yZWFkTG9jYWxGaWxlcygpfX0sZS5leHBvcnRzPXB9LHsiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zaWduYXR1cmUiOjIzLCIuL3N1cHBvcnQiOjMwLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyeSI6MzR9XSwzNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL3JlYWRlci9yZWFkZXJGb3IiKSxzPXQoIi4vdXRpbHMiKSxhPXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLGw9dCgiLi9jcmMzMiIpLHU9dCgiLi91dGY4IikscD10KCIuL2NvbXByZXNzaW9ucyIpLHY9dCgiLi9zdXBwb3J0Iik7ZnVuY3Rpb24gbShnLFQpe3RoaXMub3B0aW9ucz1nLHRoaXMubG9hZE9wdGlvbnM9VH1tLnByb3RvdHlwZT17aXNFbmNyeXB0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4oMSZ0aGlzLmJpdEZsYWcpPT0xfSx1c2VVVEY4OmZ1bmN0aW9uKCl7cmV0dXJuKDIwNDgmdGhpcy5iaXRGbGFnKT09MjA0OH0scmVhZExvY2FsUGFydDpmdW5jdGlvbihnKXt2YXIgVCx3O2lmKGcuc2tpcCgyMiksdGhpcy5maWxlTmFtZUxlbmd0aD1nLnJlYWRJbnQoMiksdz1nLnJlYWRJbnQoMiksdGhpcy5maWxlTmFtZT1nLnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpLGcuc2tpcCh3KSx0aGlzLmNvbXByZXNzZWRTaXplPT09LTF8fHRoaXMudW5jb21wcmVzc2VkU2l6ZT09PS0xKXRocm93IG5ldyBFcnJvcigiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKSIpO2lmKChUPWZ1bmN0aW9uKGspe2Zvcih2YXIgUCBpbiBwKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLFApJiZwW1BdLm1hZ2ljPT09aylyZXR1cm4gcFtQXTtyZXR1cm4gbnVsbH0odGhpcy5jb21wcmVzc2lvbk1ldGhvZCkpPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiAiK3MucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpKyIgdW5rbm93biAoaW5uZXIgZmlsZSA6ICIrcy50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLmZpbGVOYW1lKSsiKSIpO3RoaXMuZGVjb21wcmVzc2VkPW5ldyBhKHRoaXMuY29tcHJlc3NlZFNpemUsdGhpcy51bmNvbXByZXNzZWRTaXplLHRoaXMuY3JjMzIsVCxnLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKX0scmVhZENlbnRyYWxQYXJ0OmZ1bmN0aW9uKGcpe3RoaXMudmVyc2lvbk1hZGVCeT1nLnJlYWRJbnQoMiksZy5za2lwKDIpLHRoaXMuYml0RmxhZz1nLnJlYWRJbnQoMiksdGhpcy5jb21wcmVzc2lvbk1ldGhvZD1nLnJlYWRTdHJpbmcoMiksdGhpcy5kYXRlPWcucmVhZERhdGUoKSx0aGlzLmNyYzMyPWcucmVhZEludCg0KSx0aGlzLmNvbXByZXNzZWRTaXplPWcucmVhZEludCg0KSx0aGlzLnVuY29tcHJlc3NlZFNpemU9Zy5yZWFkSW50KDQpO3ZhciBUPWcucmVhZEludCgyKTtpZih0aGlzLmV4dHJhRmllbGRzTGVuZ3RoPWcucmVhZEludCgyKSx0aGlzLmZpbGVDb21tZW50TGVuZ3RoPWcucmVhZEludCgyKSx0aGlzLmRpc2tOdW1iZXJTdGFydD1nLnJlYWRJbnQoMiksdGhpcy5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPWcucmVhZEludCgyKSx0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXM9Zy5yZWFkSW50KDQpLHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9Zy5yZWFkSW50KDQpLHRoaXMuaXNFbmNyeXB0ZWQoKSl0aHJvdyBuZXcgRXJyb3IoIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQiKTtnLnNraXAoVCksdGhpcy5yZWFkRXh0cmFGaWVsZHMoZyksdGhpcy5wYXJzZVpJUDY0RXh0cmFGaWVsZChnKSx0aGlzLmZpbGVDb21tZW50PWcucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCl9LHByb2Nlc3NBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7dGhpcy51bml4UGVybWlzc2lvbnM9bnVsbCx0aGlzLmRvc1Blcm1pc3Npb25zPW51bGw7dmFyIGc9dGhpcy52ZXJzaW9uTWFkZUJ5Pj44O3RoaXMuZGlyPSEhKDE2JnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksZz09MCYmKHRoaXMuZG9zUGVybWlzc2lvbnM9NjMmdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKSxnPT0zJiYodGhpcy51bml4UGVybWlzc2lvbnM9dGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiY2NTUzNSksdGhpcy5kaXJ8fHRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpIT09Ii8ifHwodGhpcy5kaXI9ITApfSxwYXJzZVpJUDY0RXh0cmFGaWVsZDpmdW5jdGlvbigpe2lmKHRoaXMuZXh0cmFGaWVsZHNbMV0pe3ZhciBnPW4odGhpcy5leHRyYUZpZWxkc1sxXS52YWx1ZSk7dGhpcy51bmNvbXByZXNzZWRTaXplPT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy51bmNvbXByZXNzZWRTaXplPWcucmVhZEludCg4KSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuY29tcHJlc3NlZFNpemU9Zy5yZWFkSW50KDgpKSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5sb2NhbEhlYWRlck9mZnNldD1nLnJlYWRJbnQoOCkpLHRoaXMuZGlza051bWJlclN0YXJ0PT09cy5NQVhfVkFMVUVfMzJCSVRTJiYodGhpcy5kaXNrTnVtYmVyU3RhcnQ9Zy5yZWFkSW50KDQpKX19LHJlYWRFeHRyYUZpZWxkczpmdW5jdGlvbihnKXt2YXIgVCx3LGssUD1nLmluZGV4K3RoaXMuZXh0cmFGaWVsZHNMZW5ndGg7Zm9yKHRoaXMuZXh0cmFGaWVsZHN8fCh0aGlzLmV4dHJhRmllbGRzPXt9KTtnLmluZGV4KzQ8UDspVD1nLnJlYWRJbnQoMiksdz1nLnJlYWRJbnQoMiksaz1nLnJlYWREYXRhKHcpLHRoaXMuZXh0cmFGaWVsZHNbVF09e2lkOlQsbGVuZ3RoOncsdmFsdWU6a307Zy5zZXRJbmRleChQKX0saGFuZGxlVVRGODpmdW5jdGlvbigpe3ZhciBnPXYudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IjtpZih0aGlzLnVzZVVURjgoKSl0aGlzLmZpbGVOYW1lU3RyPXUudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKSx0aGlzLmZpbGVDb21tZW50U3RyPXUudXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtlbHNle3ZhciBUPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO2lmKFQhPT1udWxsKXRoaXMuZmlsZU5hbWVTdHI9VDtlbHNle3ZhciB3PXMudHJhbnNmb3JtVG8oZyx0aGlzLmZpbGVOYW1lKTt0aGlzLmZpbGVOYW1lU3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUodyl9dmFyIGs9dGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7aWYoayE9PW51bGwpdGhpcy5maWxlQ29tbWVudFN0cj1rO2Vsc2V7dmFyIFA9cy50cmFuc2Zvcm1UbyhnLHRoaXMuZmlsZUNvbW1lbnQpO3RoaXMuZmlsZUNvbW1lbnRTdHI9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShQKX19fSxmaW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoOmZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5leHRyYUZpZWxkc1syODc4OV07aWYoZyl7dmFyIFQ9bihnLnZhbHVlKTtyZXR1cm4gVC5yZWFkSW50KDEpIT09MXx8bCh0aGlzLmZpbGVOYW1lKSE9PVQucmVhZEludCg0KT9udWxsOnUudXRmOGRlY29kZShULnJlYWREYXRhKGcubGVuZ3RoLTUpKX1yZXR1cm4gbnVsbH0sZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDpmdW5jdGlvbigpe3ZhciBnPXRoaXMuZXh0cmFGaWVsZHNbMjU0NjFdO2lmKGcpe3ZhciBUPW4oZy52YWx1ZSk7cmV0dXJuIFQucmVhZEludCgxKSE9PTF8fGwodGhpcy5maWxlQ29tbWVudCkhPT1ULnJlYWRJbnQoNCk/bnVsbDp1LnV0ZjhkZWNvZGUoVC5yZWFkRGF0YShnLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9fSxlLmV4cG9ydHM9bX0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vY29tcHJlc3Npb25zIjozLCIuL2NyYzMyIjo0LCIuL3JlYWRlci9yZWFkZXJGb3IiOjIyLCIuL3N1cHBvcnQiOjMwLCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMn1dLDM1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oVCx3LGspe3RoaXMubmFtZT1ULHRoaXMuZGlyPWsuZGlyLHRoaXMuZGF0ZT1rLmRhdGUsdGhpcy5jb21tZW50PWsuY29tbWVudCx0aGlzLnVuaXhQZXJtaXNzaW9ucz1rLnVuaXhQZXJtaXNzaW9ucyx0aGlzLmRvc1Blcm1pc3Npb25zPWsuZG9zUGVybWlzc2lvbnMsdGhpcy5fZGF0YT13LHRoaXMuX2RhdGFCaW5hcnk9ay5iaW5hcnksdGhpcy5vcHRpb25zPXtjb21wcmVzc2lvbjprLmNvbXByZXNzaW9uLGNvbXByZXNzaW9uT3B0aW9uczprLmNvbXByZXNzaW9uT3B0aW9uc319dmFyIHM9dCgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIiksYT10KCIuL3N0cmVhbS9EYXRhV29ya2VyIiksbD10KCIuL3V0ZjgiKSx1PXQoIi4vY29tcHJlc3NlZE9iamVjdCIpLHA9dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpO24ucHJvdG90eXBlPXtpbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihUKXt2YXIgdz1udWxsLGs9InN0cmluZyI7dHJ5e2lmKCFUKXRocm93IG5ldyBFcnJvcigiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLiIpO3ZhciBQPShrPVQudG9Mb3dlckNhc2UoKSk9PT0ic3RyaW5nInx8az09PSJ0ZXh0IjtrIT09ImJpbmFyeXN0cmluZyImJmshPT0idGV4dCJ8fChrPSJzdHJpbmciKSx3PXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTt2YXIgRj0hdGhpcy5fZGF0YUJpbmFyeTtGJiYhUCYmKHc9dy5waXBlKG5ldyBsLlV0ZjhFbmNvZGVXb3JrZXIpKSwhRiYmUCYmKHc9dy5waXBlKG5ldyBsLlV0ZjhEZWNvZGVXb3JrZXIpKX1jYXRjaChoKXsodz1uZXcgcCgiZXJyb3IiKSkuZXJyb3IoaCl9cmV0dXJuIG5ldyBzKHcsaywiIil9LGFzeW5jOmZ1bmN0aW9uKFQsdyl7cmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0oVCkuYWNjdW11bGF0ZSh3KX0sbm9kZVN0cmVhbTpmdW5jdGlvbihULHcpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKFR8fCJub2RlYnVmZmVyIikudG9Ob2RlanNTdHJlYW0odyl9LF9jb21wcmVzc1dvcmtlcjpmdW5jdGlvbihULHcpe2lmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiB1JiZ0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljPT09VC5tYWdpYylyZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7dmFyIGs9dGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO3JldHVybiB0aGlzLl9kYXRhQmluYXJ5fHwoaz1rLnBpcGUobmV3IGwuVXRmOEVuY29kZVdvcmtlcikpLHUuY3JlYXRlV29ya2VyRnJvbShrLFQsdyl9LF9kZWNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiB1P3RoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpOnRoaXMuX2RhdGEgaW5zdGFuY2VvZiBwP3RoaXMuX2RhdGE6bmV3IGEodGhpcy5fZGF0YSl9fTtmb3IodmFyIHY9WyJhc1RleHQiLCJhc0JpbmFyeSIsImFzTm9kZUJ1ZmZlciIsImFzVWludDhBcnJheSIsImFzQXJyYXlCdWZmZXIiXSxtPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxnPTA7Zzx2Lmxlbmd0aDtnKyspbi5wcm90b3R5cGVbdltnXV09bTtlLmV4cG9ydHM9bn0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vc3RyZWFtL0RhdGFXb3JrZXIiOjI3LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3RyZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMX1dLDM2OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcyxhLGw9bi5NdXRhdGlvbk9ic2VydmVyfHxuLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7aWYobCl7dmFyIHU9MCxwPW5ldyBsKFQpLHY9bi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7cC5vYnNlcnZlKHYse2NoYXJhY3RlckRhdGE6ITB9KSxzPWZ1bmN0aW9uKCl7di5kYXRhPXU9Kyt1JTJ9fWVsc2UgaWYobi5zZXRJbW1lZGlhdGV8fG4uTWVzc2FnZUNoYW5uZWw9PT12b2lkIDApcz0iZG9jdW1lbnQiaW4gbiYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBuLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpP2Z1bmN0aW9uKCl7dmFyIHc9bi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt3Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe1QoKSx3Lm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3KSx3PW51bGx9LG4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHcpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQoVCwwKX07ZWxzZXt2YXIgbT1uZXcgbi5NZXNzYWdlQ2hhbm5lbDttLnBvcnQxLm9ubWVzc2FnZT1ULHM9ZnVuY3Rpb24oKXttLnBvcnQyLnBvc3RNZXNzYWdlKDApfX12YXIgZz1bXTtmdW5jdGlvbiBUKCl7dmFyIHcsazthPSEwO2Zvcih2YXIgUD1nLmxlbmd0aDtQOyl7Zm9yKGs9ZyxnPVtdLHc9LTE7Kyt3PFA7KWtbd10oKTtQPWcubGVuZ3RofWE9ITF9ZS5leHBvcnRzPWZ1bmN0aW9uKHcpe2cucHVzaCh3KSE9PTF8fGF8fHMoKX19KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp7fSl9LHt9XSwzNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCJpbW1lZGlhdGUiKTtmdW5jdGlvbiBzKCl7fXZhciBhPXt9LGw9WyJSRUpFQ1RFRCJdLHU9WyJGVUxGSUxMRUQiXSxwPVsiUEVORElORyJdO2Z1bmN0aW9uIHYoUCl7aWYodHlwZW9mIFAhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVzb2x2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dGhpcy5zdGF0ZT1wLHRoaXMucXVldWU9W10sdGhpcy5vdXRjb21lPXZvaWQgMCxQIT09cyYmdyh0aGlzLFApfWZ1bmN0aW9uIG0oUCxGLGgpe3RoaXMucHJvbWlzZT1QLHR5cGVvZiBGPT0iZnVuY3Rpb24iJiYodGhpcy5vbkZ1bGZpbGxlZD1GLHRoaXMuY2FsbEZ1bGZpbGxlZD10aGlzLm90aGVyQ2FsbEZ1bGZpbGxlZCksdHlwZW9mIGg9PSJmdW5jdGlvbiImJih0aGlzLm9uUmVqZWN0ZWQ9aCx0aGlzLmNhbGxSZWplY3RlZD10aGlzLm90aGVyQ2FsbFJlamVjdGVkKX1mdW5jdGlvbiBnKFAsRixoKXtuKGZ1bmN0aW9uKCl7dmFyIG87dHJ5e289RihoKX1jYXRjaChmKXtyZXR1cm4gYS5yZWplY3QoUCxmKX1vPT09UD9hLnJlamVjdChQLG5ldyBUeXBlRXJyb3IoIkNhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYiKSk6YS5yZXNvbHZlKFAsbyl9KX1mdW5jdGlvbiBUKFApe3ZhciBGPVAmJlAudGhlbjtpZihQJiYodHlwZW9mIFA9PSJvYmplY3QifHx0eXBlb2YgUD09ImZ1bmN0aW9uIikmJnR5cGVvZiBGPT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbigpe0YuYXBwbHkoUCxhcmd1bWVudHMpfX1mdW5jdGlvbiB3KFAsRil7dmFyIGg9ITE7ZnVuY3Rpb24gbyhCKXtofHwoaD0hMCxhLnJlamVjdChQLEIpKX1mdW5jdGlvbiBmKEIpe2h8fChoPSEwLGEucmVzb2x2ZShQLEIpKX12YXIgQz1rKGZ1bmN0aW9uKCl7RihmLG8pfSk7Qy5zdGF0dXM9PT0iZXJyb3IiJiZvKEMudmFsdWUpfWZ1bmN0aW9uIGsoUCxGKXt2YXIgaD17fTt0cnl7aC52YWx1ZT1QKEYpLGguc3RhdHVzPSJzdWNjZXNzIn1jYXRjaChvKXtoLnN0YXR1cz0iZXJyb3IiLGgudmFsdWU9b31yZXR1cm4gaH0oZS5leHBvcnRzPXYpLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKFApe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iKXJldHVybiB0aGlzO3ZhciBGPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gRi5yZXNvbHZlKFAoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBofSl9LGZ1bmN0aW9uKGgpe3JldHVybiBGLnJlc29sdmUoUCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgaH0pfSl9LHYucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKFApe3JldHVybiB0aGlzLnRoZW4obnVsbCxQKX0sdi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihQLEYpe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iJiZ0aGlzLnN0YXRlPT09dXx8dHlwZW9mIEYhPSJmdW5jdGlvbiImJnRoaXMuc3RhdGU9PT1sKXJldHVybiB0aGlzO3ZhciBoPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHMpO3JldHVybiB0aGlzLnN0YXRlIT09cD9nKGgsdGhpcy5zdGF0ZT09PXU/UDpGLHRoaXMub3V0Y29tZSk6dGhpcy5xdWV1ZS5wdXNoKG5ldyBtKGgsUCxGKSksaH0sbS5wcm90b3R5cGUuY2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihQKXthLnJlc29sdmUodGhpcy5wcm9taXNlLFApfSxtLnByb3RvdHlwZS5vdGhlckNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oUCl7Zyh0aGlzLnByb21pc2UsdGhpcy5vbkZ1bGZpbGxlZCxQKX0sbS5wcm90b3R5cGUuY2FsbFJlamVjdGVkPWZ1bmN0aW9uKFApe2EucmVqZWN0KHRoaXMucHJvbWlzZSxQKX0sbS5wcm90b3R5cGUub3RoZXJDYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oUCl7Zyh0aGlzLnByb21pc2UsdGhpcy5vblJlamVjdGVkLFApfSxhLnJlc29sdmU9ZnVuY3Rpb24oUCxGKXt2YXIgaD1rKFQsRik7aWYoaC5zdGF0dXM9PT0iZXJyb3IiKXJldHVybiBhLnJlamVjdChQLGgudmFsdWUpO3ZhciBvPWgudmFsdWU7aWYobyl3KFAsbyk7ZWxzZXtQLnN0YXRlPXUsUC5vdXRjb21lPUY7Zm9yKHZhciBmPS0xLEM9UC5xdWV1ZS5sZW5ndGg7KytmPEM7KVAucXVldWVbZl0uY2FsbEZ1bGZpbGxlZChGKX1yZXR1cm4gUH0sYS5yZWplY3Q9ZnVuY3Rpb24oUCxGKXtQLnN0YXRlPWwsUC5vdXRjb21lPUY7Zm9yKHZhciBoPS0xLG89UC5xdWV1ZS5sZW5ndGg7KytoPG87KVAucXVldWVbaF0uY2FsbFJlamVjdGVkKEYpO3JldHVybiBQfSx2LnJlc29sdmU9ZnVuY3Rpb24oUCl7cmV0dXJuIFAgaW5zdGFuY2VvZiB0aGlzP1A6YS5yZXNvbHZlKG5ldyB0aGlzKHMpLFApfSx2LnJlamVjdD1mdW5jdGlvbihQKXt2YXIgRj1uZXcgdGhpcyhzKTtyZXR1cm4gYS5yZWplY3QoRixQKX0sdi5hbGw9ZnVuY3Rpb24oUCl7dmFyIEY9dGhpcztpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUCkhPT0iW29iamVjdCBBcnJheV0iKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCJtdXN0IGJlIGFuIGFycmF5IikpO3ZhciBoPVAubGVuZ3RoLG89ITE7aWYoIWgpcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7Zm9yKHZhciBmPW5ldyBBcnJheShoKSxDPTAsQj0tMSxjPW5ldyB0aGlzKHMpOysrQjxoOyl6KFBbQl0sQik7cmV0dXJuIGM7ZnVuY3Rpb24geihHLGV0KXtGLnJlc29sdmUoRykudGhlbihmdW5jdGlvbihFKXtmW2V0XT1FLCsrQyE9PWh8fG98fChvPSEwLGEucmVzb2x2ZShjLGYpKX0sZnVuY3Rpb24oRSl7b3x8KG89ITAsYS5yZWplY3QoYyxFKSl9KX19LHYucmFjZT1mdW5jdGlvbihQKXt2YXIgRj10aGlzO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQKSE9PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoIm11c3QgYmUgYW4gYXJyYXkiKSk7dmFyIGg9UC5sZW5ndGgsbz0hMTtpZighaClyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGY9LTEsQz1uZXcgdGhpcyhzKTsrK2Y8aDspQj1QW2ZdLEYucmVzb2x2ZShCKS50aGVuKGZ1bmN0aW9uKGMpe298fChvPSEwLGEucmVzb2x2ZShDLGMpKX0sZnVuY3Rpb24oYyl7b3x8KG89ITAsYS5yZWplY3QoQyxjKSl9KTt2YXIgQjtyZXR1cm4gQ319LHtpbW1lZGlhdGU6MzZ9XSwzODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17fTsoMCx0KCIuL2xpYi91dGlscy9jb21tb24iKS5hc3NpZ24pKG4sdCgiLi9saWIvZGVmbGF0ZSIpLHQoIi4vbGliL2luZmxhdGUiKSx0KCIuL2xpYi96bGliL2NvbnN0YW50cyIpKSxlLmV4cG9ydHM9bn0seyIuL2xpYi9kZWZsYXRlIjozOSwiLi9saWIvaW5mbGF0ZSI6NDAsIi4vbGliL3V0aWxzL2NvbW1vbiI6NDEsIi4vbGliL3psaWIvY29uc3RhbnRzIjo0NH1dLDM5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vemxpYi9kZWZsYXRlIikscz10KCIuL3V0aWxzL2NvbW1vbiIpLGE9dCgiLi91dGlscy9zdHJpbmdzIiksbD10KCIuL3psaWIvbWVzc2FnZXMiKSx1PXQoIi4vemxpYi96c3RyZWFtIikscD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHY9MCxtPS0xLGc9MCxUPTg7ZnVuY3Rpb24gdyhQKXtpZighKHRoaXMgaW5zdGFuY2VvZiB3KSlyZXR1cm4gbmV3IHcoUCk7dGhpcy5vcHRpb25zPXMuYXNzaWduKHtsZXZlbDptLG1ldGhvZDpULGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6Zyx0bzoiIn0sUHx8e30pO3ZhciBGPXRoaXMub3B0aW9ucztGLnJhdyYmMDxGLndpbmRvd0JpdHM/Ri53aW5kb3dCaXRzPS1GLndpbmRvd0JpdHM6Ri5nemlwJiYwPEYud2luZG93Qml0cyYmRi53aW5kb3dCaXRzPDE2JiYoRi53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgdSx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIGg9bi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLEYubGV2ZWwsRi5tZXRob2QsRi53aW5kb3dCaXRzLEYubWVtTGV2ZWwsRi5zdHJhdGVneSk7aWYoaCE9PXYpdGhyb3cgbmV3IEVycm9yKGxbaF0pO2lmKEYuaGVhZGVyJiZuLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLEYuaGVhZGVyKSxGLmRpY3Rpb25hcnkpe3ZhciBvO2lmKG89dHlwZW9mIEYuZGljdGlvbmFyeT09InN0cmluZyI/YS5zdHJpbmcyYnVmKEYuZGljdGlvbmFyeSk6cC5jYWxsKEYuZGljdGlvbmFyeSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP25ldyBVaW50OEFycmF5KEYuZGljdGlvbmFyeSk6Ri5kaWN0aW9uYXJ5LChoPW4uZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLG8pKSE9PXYpdGhyb3cgbmV3IEVycm9yKGxbaF0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1mdW5jdGlvbiBrKFAsRil7dmFyIGg9bmV3IHcoRik7aWYoaC5wdXNoKFAsITApLGguZXJyKXRocm93IGgubXNnfHxsW2guZXJyXTtyZXR1cm4gaC5yZXN1bHR9dy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihQLEYpe3ZhciBoLG8sZj10aGlzLnN0cm0sQz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7bz1GPT09fn5GP0Y6Rj09PSEwPzQ6MCx0eXBlb2YgUD09InN0cmluZyI/Zi5pbnB1dD1hLnN0cmluZzJidWYoUCk6cC5jYWxsKFApPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9mLmlucHV0PW5ldyBVaW50OEFycmF5KFApOmYuaW5wdXQ9UCxmLm5leHRfaW49MCxmLmF2YWlsX2luPWYuaW5wdXQubGVuZ3RoO2Rve2lmKGYuYXZhaWxfb3V0PT09MCYmKGYub3V0cHV0PW5ldyBzLkJ1ZjgoQyksZi5uZXh0X291dD0wLGYuYXZhaWxfb3V0PUMpLChoPW4uZGVmbGF0ZShmLG8pKSE9PTEmJmghPT12KXJldHVybiB0aGlzLm9uRW5kKGgpLCEodGhpcy5lbmRlZD0hMCk7Zi5hdmFpbF9vdXQhPT0wJiYoZi5hdmFpbF9pbiE9PTB8fG8hPT00JiZvIT09Mil8fCh0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLm9uRGF0YShhLmJ1ZjJiaW5zdHJpbmcocy5zaHJpbmtCdWYoZi5vdXRwdXQsZi5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShzLnNocmlua0J1ZihmLm91dHB1dCxmLm5leHRfb3V0KSkpfXdoaWxlKCgwPGYuYXZhaWxfaW58fGYuYXZhaWxfb3V0PT09MCkmJmghPT0xKTtyZXR1cm4gbz09PTQ/KGg9bi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChoKSx0aGlzLmVuZGVkPSEwLGg9PT12KTpvIT09Mnx8KHRoaXMub25FbmQodiksIShmLmF2YWlsX291dD0wKSl9LHcucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihQKXt0aGlzLmNodW5rcy5wdXNoKFApfSx3LnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihQKXtQPT09diYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PXMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPVAsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ30sci5EZWZsYXRlPXcsci5kZWZsYXRlPWssci5kZWZsYXRlUmF3PWZ1bmN0aW9uKFAsRil7cmV0dXJuKEY9Rnx8e30pLnJhdz0hMCxrKFAsRil9LHIuZ3ppcD1mdW5jdGlvbihQLEYpe3JldHVybihGPUZ8fHt9KS5nemlwPSEwLGsoUCxGKX19LHsiLi91dGlscy9jb21tb24iOjQxLCIuL3V0aWxzL3N0cmluZ3MiOjQyLCIuL3psaWIvZGVmbGF0ZSI6NDYsIi4vemxpYi9tZXNzYWdlcyI6NTEsIi4vemxpYi96c3RyZWFtIjo1M31dLDQwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vemxpYi9pbmZsYXRlIikscz10KCIuL3V0aWxzL2NvbW1vbiIpLGE9dCgiLi91dGlscy9zdHJpbmdzIiksbD10KCIuL3psaWIvY29uc3RhbnRzIiksdT10KCIuL3psaWIvbWVzc2FnZXMiKSxwPXQoIi4vemxpYi96c3RyZWFtIiksdj10KCIuL3psaWIvZ3poZWFkZXIiKSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gZyh3KXtpZighKHRoaXMgaW5zdGFuY2VvZiBnKSlyZXR1cm4gbmV3IGcodyk7dGhpcy5vcHRpb25zPXMuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSx3fHx7fSk7dmFyIGs9dGhpcy5vcHRpb25zO2sucmF3JiYwPD1rLndpbmRvd0JpdHMmJmsud2luZG93Qml0czwxNiYmKGsud2luZG93Qml0cz0tay53aW5kb3dCaXRzLGsud2luZG93Qml0cz09PTAmJihrLndpbmRvd0JpdHM9LTE1KSksISgwPD1rLndpbmRvd0JpdHMmJmsud2luZG93Qml0czwxNil8fHcmJncud2luZG93Qml0c3x8KGsud2luZG93Qml0cys9MzIpLDE1PGsud2luZG93Qml0cyYmay53aW5kb3dCaXRzPDQ4JiYhKDE1Jmsud2luZG93Qml0cykmJihrLndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBwLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgUD1uLmluZmxhdGVJbml0Mih0aGlzLnN0cm0say53aW5kb3dCaXRzKTtpZihQIT09bC5aX09LKXRocm93IG5ldyBFcnJvcih1W1BdKTt0aGlzLmhlYWRlcj1uZXcgdixuLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKX1mdW5jdGlvbiBUKHcsayl7dmFyIFA9bmV3IGcoayk7aWYoUC5wdXNoKHcsITApLFAuZXJyKXRocm93IFAubXNnfHx1W1AuZXJyXTtyZXR1cm4gUC5yZXN1bHR9Zy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih3LGspe3ZhciBQLEYsaCxvLGYsQyxCPXRoaXMuc3RybSxjPXRoaXMub3B0aW9ucy5jaHVua1NpemUsej10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxHPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Rj1rPT09fn5rP2s6az09PSEwP2wuWl9GSU5JU0g6bC5aX05PX0ZMVVNILHR5cGVvZiB3PT0ic3RyaW5nIj9CLmlucHV0PWEuYmluc3RyaW5nMmJ1Zih3KTptLmNhbGwodyk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP0IuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkodyk6Qi5pbnB1dD13LEIubmV4dF9pbj0wLEIuYXZhaWxfaW49Qi5pbnB1dC5sZW5ndGg7ZG97aWYoQi5hdmFpbF9vdXQ9PT0wJiYoQi5vdXRwdXQ9bmV3IHMuQnVmOChjKSxCLm5leHRfb3V0PTAsQi5hdmFpbF9vdXQ9YyksKFA9bi5pbmZsYXRlKEIsbC5aX05PX0ZMVVNIKSk9PT1sLlpfTkVFRF9ESUNUJiZ6JiYoQz10eXBlb2Ygej09InN0cmluZyI/YS5zdHJpbmcyYnVmKHopOm0uY2FsbCh6KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bmV3IFVpbnQ4QXJyYXkoeik6eixQPW4uaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLEMpKSxQPT09bC5aX0JVRl9FUlJPUiYmRz09PSEwJiYoUD1sLlpfT0ssRz0hMSksUCE9PWwuWl9TVFJFQU1fRU5EJiZQIT09bC5aX09LKXJldHVybiB0aGlzLm9uRW5kKFApLCEodGhpcy5lbmRlZD0hMCk7Qi5uZXh0X291dCYmKEIuYXZhaWxfb3V0IT09MCYmUCE9PWwuWl9TVFJFQU1fRU5EJiYoQi5hdmFpbF9pbiE9PTB8fEYhPT1sLlpfRklOSVNIJiZGIT09bC5aX1NZTkNfRkxVU0gpfHwodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/KGg9YS51dGY4Ym9yZGVyKEIub3V0cHV0LEIubmV4dF9vdXQpLG89Qi5uZXh0X291dC1oLGY9YS5idWYyc3RyaW5nKEIub3V0cHV0LGgpLEIubmV4dF9vdXQ9byxCLmF2YWlsX291dD1jLW8sbyYmcy5hcnJheVNldChCLm91dHB1dCxCLm91dHB1dCxoLG8sMCksdGhpcy5vbkRhdGEoZikpOnRoaXMub25EYXRhKHMuc2hyaW5rQnVmKEIub3V0cHV0LEIubmV4dF9vdXQpKSkpLEIuYXZhaWxfaW49PT0wJiZCLmF2YWlsX291dD09PTAmJihHPSEwKX13aGlsZSgoMDxCLmF2YWlsX2lufHxCLmF2YWlsX291dD09PTApJiZQIT09bC5aX1NUUkVBTV9FTkQpO3JldHVybiBQPT09bC5aX1NUUkVBTV9FTkQmJihGPWwuWl9GSU5JU0gpLEY9PT1sLlpfRklOSVNIPyhQPW4uaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQoUCksdGhpcy5lbmRlZD0hMCxQPT09bC5aX09LKTpGIT09bC5aX1NZTkNfRkxVU0h8fCh0aGlzLm9uRW5kKGwuWl9PSyksIShCLmF2YWlsX291dD0wKSl9LGcucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbih3KXt0aGlzLmNodW5rcy5wdXNoKHcpfSxnLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih3KXt3PT09bC5aX09LJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9dyx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxyLkluZmxhdGU9ZyxyLmluZmxhdGU9VCxyLmluZmxhdGVSYXc9ZnVuY3Rpb24odyxrKXtyZXR1cm4oaz1rfHx7fSkucmF3PSEwLFQodyxrKX0sci51bmd6aXA9VH0seyIuL3V0aWxzL2NvbW1vbiI6NDEsIi4vdXRpbHMvc3RyaW5ncyI6NDIsIi4vemxpYi9jb25zdGFudHMiOjQ0LCIuL3psaWIvZ3poZWFkZXIiOjQ3LCIuL3psaWIvaW5mbGF0ZSI6NDksIi4vemxpYi9tZXNzYWdlcyI6NTEsIi4vemxpYi96c3RyZWFtIjo1M31dLDQxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIEludDMyQXJyYXk8InUiO3IuYXNzaWduPWZ1bmN0aW9uKGwpe2Zvcih2YXIgdT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7dS5sZW5ndGg7KXt2YXIgcD11LnNoaWZ0KCk7aWYocCl7aWYodHlwZW9mIHAhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IocCsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciB2IGluIHApcC5oYXNPd25Qcm9wZXJ0eSh2KSYmKGxbdl09cFt2XSl9fXJldHVybiBsfSxyLnNocmlua0J1Zj1mdW5jdGlvbihsLHUpe3JldHVybiBsLmxlbmd0aD09PXU/bDpsLnN1YmFycmF5P2wuc3ViYXJyYXkoMCx1KToobC5sZW5ndGg9dSxsKX07dmFyIHM9e2FycmF5U2V0OmZ1bmN0aW9uKGwsdSxwLHYsbSl7aWYodS5zdWJhcnJheSYmbC5zdWJhcnJheSlsLnNldCh1LnN1YmFycmF5KHAscCt2KSxtKTtlbHNlIGZvcih2YXIgZz0wO2c8djtnKyspbFttK2ddPXVbcCtnXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihsKXt2YXIgdSxwLHYsbSxnLFQ7Zm9yKHU9dj0wLHA9bC5sZW5ndGg7dTxwO3UrKyl2Kz1sW3VdLmxlbmd0aDtmb3IoVD1uZXcgVWludDhBcnJheSh2KSx1PW09MCxwPWwubGVuZ3RoO3U8cDt1KyspZz1sW3VdLFQuc2V0KGcsbSksbSs9Zy5sZW5ndGg7cmV0dXJuIFR9fSxhPXthcnJheVNldDpmdW5jdGlvbihsLHUscCx2LG0pe2Zvcih2YXIgZz0wO2c8djtnKyspbFttK2ddPXVbcCtnXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihsKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sbCl9fTtyLnNldFR5cGVkPWZ1bmN0aW9uKGwpe2w/KHIuQnVmOD1VaW50OEFycmF5LHIuQnVmMTY9VWludDE2QXJyYXksci5CdWYzMj1JbnQzMkFycmF5LHIuYXNzaWduKHIscykpOihyLkJ1Zjg9QXJyYXksci5CdWYxNj1BcnJheSxyLkJ1ZjMyPUFycmF5LHIuYXNzaWduKHIsYSkpfSxyLnNldFR5cGVkKG4pfSx7fV0sNDI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9jb21tb24iKSxzPSEwLGE9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxbMF0pfWNhdGNoe3M9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2h7YT0hMX1mb3IodmFyIGw9bmV3IG4uQnVmOCgyNTYpLHU9MDt1PDI1Njt1KyspbFt1XT0yNTI8PXU/NjoyNDg8PXU/NToyNDA8PXU/NDoyMjQ8PXU/MzoxOTI8PXU/MjoxO2Z1bmN0aW9uIHAodixtKXtpZihtPDY1NTM3JiYodi5zdWJhcnJheSYmYXx8IXYuc3ViYXJyYXkmJnMpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbi5zaHJpbmtCdWYodixtKSk7Zm9yKHZhciBnPSIiLFQ9MDtUPG07VCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUodltUXSk7cmV0dXJuIGd9bFsyNTRdPWxbMjU0XT0xLHIuc3RyaW5nMmJ1Zj1mdW5jdGlvbih2KXt2YXIgbSxnLFQsdyxrLFA9di5sZW5ndGgsRj0wO2Zvcih3PTA7dzxQO3crKykoNjQ1MTImKGc9di5jaGFyQ29kZUF0KHcpKSk9PTU1Mjk2JiZ3KzE8UCYmKDY0NTEyJihUPXYuY2hhckNvZGVBdCh3KzEpKSk9PTU2MzIwJiYoZz02NTUzNisoZy01NTI5Njw8MTApKyhULTU2MzIwKSx3KyspLEYrPWc8MTI4PzE6ZzwyMDQ4PzI6Zzw2NTUzNj8zOjQ7Zm9yKG09bmV3IG4uQnVmOChGKSx3PWs9MDtrPEY7dysrKSg2NDUxMiYoZz12LmNoYXJDb2RlQXQodykpKT09NTUyOTYmJncrMTxQJiYoNjQ1MTImKFQ9di5jaGFyQ29kZUF0KHcrMSkpKT09NTYzMjAmJihnPTY1NTM2KyhnLTU1Mjk2PDwxMCkrKFQtNTYzMjApLHcrKyksZzwxMjg/bVtrKytdPWc6KGc8MjA0OD9tW2srK109MTkyfGc+Pj42OihnPDY1NTM2P21baysrXT0yMjR8Zz4+PjEyOihtW2srK109MjQwfGc+Pj4xOCxtW2srK109MTI4fGc+Pj4xMiY2MyksbVtrKytdPTEyOHxnPj4+NiY2MyksbVtrKytdPTEyOHw2MyZnKTtyZXR1cm4gbX0sci5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKHYpe3JldHVybiBwKHYsdi5sZW5ndGgpfSxyLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24odil7Zm9yKHZhciBtPW5ldyBuLkJ1Zjgodi5sZW5ndGgpLGc9MCxUPW0ubGVuZ3RoO2c8VDtnKyspbVtnXT12LmNoYXJDb2RlQXQoZyk7cmV0dXJuIG19LHIuYnVmMnN0cmluZz1mdW5jdGlvbih2LG0pe3ZhciBnLFQsdyxrLFA9bXx8di5sZW5ndGgsRj1uZXcgQXJyYXkoMipQKTtmb3IoZz1UPTA7ZzxQOylpZigodz12W2crK10pPDEyOClGW1QrK109dztlbHNlIGlmKDQ8KGs9bFt3XSkpRltUKytdPTY1NTMzLGcrPWstMTtlbHNle2Zvcih3Jj1rPT09Mj8zMTprPT09Mz8xNTo3OzE8ayYmZzxQOyl3PXc8PDZ8NjMmdltnKytdLGstLTsxPGs/RltUKytdPTY1NTMzOnc8NjU1MzY/RltUKytdPXc6KHctPTY1NTM2LEZbVCsrXT01NTI5Nnx3Pj4xMCYxMDIzLEZbVCsrXT01NjMyMHwxMDIzJncpfXJldHVybiBwKEYsVCl9LHIudXRmOGJvcmRlcj1mdW5jdGlvbih2LG0pe3ZhciBnO2ZvcigobT1tfHx2Lmxlbmd0aCk+di5sZW5ndGgmJihtPXYubGVuZ3RoKSxnPW0tMTswPD1nJiYoMTkyJnZbZ10pPT0xMjg7KWctLTtyZXR1cm4gZzwwfHxnPT09MD9tOmcrbFt2W2ddXT5tP2c6bX19LHsiLi9jb21tb24iOjQxfV0sNDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKG4scyxhLGwpe2Zvcih2YXIgdT02NTUzNSZufDAscD1uPj4+MTYmNjU1MzV8MCx2PTA7YSE9PTA7KXtmb3IoYS09dj0yZTM8YT8yZTM6YTtwPXArKHU9dStzW2wrK118MCl8MCwtLXY7KTt1JT02NTUyMSxwJT02NTUyMX1yZXR1cm4gdXxwPDwxNnwwfX0se31dLDQ0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fX0se31dLDQ1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBzLGE9W10sbD0wO2w8MjU2O2wrKyl7cz1sO2Zvcih2YXIgdT0wO3U8ODt1Kyspcz0xJnM/Mzk4ODI5MjM4NF5zPj4+MTpzPj4+MTthW2xdPXN9cmV0dXJuIGF9KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKHMsYSxsLHUpe3ZhciBwPW4sdj11K2w7c149LTE7Zm9yKHZhciBtPXU7bTx2O20rKylzPXM+Pj44XnBbMjU1JihzXmFbbV0pXTtyZXR1cm4tMV5zfX0se31dLDQ2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuLHM9dCgiLi4vdXRpbHMvY29tbW9uIiksYT10KCIuL3RyZWVzIiksbD10KCIuL2FkbGVyMzIiKSx1PXQoIi4vY3JjMzIiKSxwPXQoIi4vbWVzc2FnZXMiKSx2PTAsbT00LGc9MCxUPS0yLHc9LTEsaz00LFA9MixGPTgsaD05LG89Mjg2LGY9MzAsQz0xOSxCPTIqbysxLGM9MTUsej0zLEc9MjU4LGV0PUcreisxLEU9NDIsWj0xMTMseT0xLF89MixTPTMsTj00O2Z1bmN0aW9uIFIoRCx1dCl7cmV0dXJuIEQubXNnPXBbdXRdLHV0fWZ1bmN0aW9uIEwoRCl7cmV0dXJuKEQ8PDEpLSg0PEQ/OTowKX1mdW5jdGlvbiBYKEQpe2Zvcih2YXIgdXQ9RC5sZW5ndGg7MDw9LS11dDspRFt1dF09MH1mdW5jdGlvbiBqKEQpe3ZhciB1dD1ELnN0YXRlLG90PXV0LnBlbmRpbmc7b3Q+RC5hdmFpbF9vdXQmJihvdD1ELmF2YWlsX291dCksb3QhPT0wJiYocy5hcnJheVNldChELm91dHB1dCx1dC5wZW5kaW5nX2J1Zix1dC5wZW5kaW5nX291dCxvdCxELm5leHRfb3V0KSxELm5leHRfb3V0Kz1vdCx1dC5wZW5kaW5nX291dCs9b3QsRC50b3RhbF9vdXQrPW90LEQuYXZhaWxfb3V0LT1vdCx1dC5wZW5kaW5nLT1vdCx1dC5wZW5kaW5nPT09MCYmKHV0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBxKEQsdXQpe2EuX3RyX2ZsdXNoX2Jsb2NrKEQsMDw9RC5ibG9ja19zdGFydD9ELmJsb2NrX3N0YXJ0Oi0xLEQuc3Ryc3RhcnQtRC5ibG9ja19zdGFydCx1dCksRC5ibG9ja19zdGFydD1ELnN0cnN0YXJ0LGooRC5zdHJtKX1mdW5jdGlvbiBhdChELHV0KXtELnBlbmRpbmdfYnVmW0QucGVuZGluZysrXT11dH1mdW5jdGlvbiBKKEQsdXQpe0QucGVuZGluZ19idWZbRC5wZW5kaW5nKytdPXV0Pj4+OCYyNTUsRC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109MjU1JnV0fWZ1bmN0aW9uIHR0KEQsdXQpe3ZhciBvdCxILE09RC5tYXhfY2hhaW5fbGVuZ3RoLFk9RC5zdHJzdGFydCxwdD1ELnByZXZfbGVuZ3RoLG10PUQubmljZV9tYXRjaCxydD1ELnN0cnN0YXJ0PkQud19zaXplLWV0P0Quc3Ryc3RhcnQtKEQud19zaXplLWV0KTowLGd0PUQud2luZG93LEN0PUQud19tYXNrLHh0PUQucHJldix2dD1ELnN0cnN0YXJ0K0csenQ9Z3RbWStwdC0xXSxVdD1ndFtZK3B0XTtELnByZXZfbGVuZ3RoPj1ELmdvb2RfbWF0Y2gmJihNPj49MiksbXQ+RC5sb29rYWhlYWQmJihtdD1ELmxvb2thaGVhZCk7ZG8gaWYoZ3RbKG90PXV0KStwdF09PT1VdCYmZ3Rbb3QrcHQtMV09PT16dCYmZ3Rbb3RdPT09Z3RbWV0mJmd0Wysrb3RdPT09Z3RbWSsxXSl7WSs9MixvdCsrO2RvO3doaWxlKGd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZndFsrK1ldPT09Z3RbKytvdF0mJmd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZndFsrK1ldPT09Z3RbKytvdF0mJmd0WysrWV09PT1ndFsrK290XSYmZ3RbKytZXT09PWd0Wysrb3RdJiZZPHZ0KTtpZihIPUctKHZ0LVkpLFk9dnQtRyxwdDxIKXtpZihELm1hdGNoX3N0YXJ0PXV0LG10PD0ocHQ9SCkpYnJlYWs7enQ9Z3RbWStwdC0xXSxVdD1ndFtZK3B0XX19d2hpbGUoKHV0PXh0W3V0JkN0XSk+cnQmJi0tTSE9MCk7cmV0dXJuIHB0PD1ELmxvb2thaGVhZD9wdDpELmxvb2thaGVhZH1mdW5jdGlvbiB5dChEKXt2YXIgdXQsb3QsSCxNLFkscHQsbXQscnQsZ3QsQ3QseHQ9RC53X3NpemU7ZG97aWYoTT1ELndpbmRvd19zaXplLUQubG9va2FoZWFkLUQuc3Ryc3RhcnQsRC5zdHJzdGFydD49eHQrKHh0LWV0KSl7Zm9yKHMuYXJyYXlTZXQoRC53aW5kb3csRC53aW5kb3cseHQseHQsMCksRC5tYXRjaF9zdGFydC09eHQsRC5zdHJzdGFydC09eHQsRC5ibG9ja19zdGFydC09eHQsdXQ9b3Q9RC5oYXNoX3NpemU7SD1ELmhlYWRbLS11dF0sRC5oZWFkW3V0XT14dDw9SD9ILXh0OjAsLS1vdDspO2Zvcih1dD1vdD14dDtIPUQucHJldlstLXV0XSxELnByZXZbdXRdPXh0PD1IP0gteHQ6MCwtLW90Oyk7TSs9eHR9aWYoRC5zdHJtLmF2YWlsX2luPT09MClicmVhaztpZihwdD1ELnN0cm0sbXQ9RC53aW5kb3cscnQ9RC5zdHJzdGFydCtELmxvb2thaGVhZCxndD1NLEN0PXZvaWQgMCxDdD1wdC5hdmFpbF9pbixndDxDdCYmKEN0PWd0KSxvdD1DdD09PTA/MDoocHQuYXZhaWxfaW4tPUN0LHMuYXJyYXlTZXQobXQscHQuaW5wdXQscHQubmV4dF9pbixDdCxydCkscHQuc3RhdGUud3JhcD09PTE/cHQuYWRsZXI9bChwdC5hZGxlcixtdCxDdCxydCk6cHQuc3RhdGUud3JhcD09PTImJihwdC5hZGxlcj11KHB0LmFkbGVyLG10LEN0LHJ0KSkscHQubmV4dF9pbis9Q3QscHQudG90YWxfaW4rPUN0LEN0KSxELmxvb2thaGVhZCs9b3QsRC5sb29rYWhlYWQrRC5pbnNlcnQ+PXopZm9yKFk9RC5zdHJzdGFydC1ELmluc2VydCxELmluc19oPUQud2luZG93W1ldLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tZKzFdKSZELmhhc2hfbWFzaztELmluc2VydCYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tZK3otMV0pJkQuaGFzaF9tYXNrLEQucHJldltZJkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPVksWSsrLEQuaW5zZXJ0LS0sIShELmxvb2thaGVhZCtELmluc2VydDx6KSk7KTt9d2hpbGUoRC5sb29rYWhlYWQ8ZXQmJkQuc3RybS5hdmFpbF9pbiE9PTApfWZ1bmN0aW9uIFR0KEQsdXQpe2Zvcih2YXIgb3QsSDs7KXtpZihELmxvb2thaGVhZDxldCl7aWYoeXQoRCksRC5sb29rYWhlYWQ8ZXQmJnV0PT09dilyZXR1cm4geTtpZihELmxvb2thaGVhZD09PTApYnJlYWt9aWYob3Q9MCxELmxvb2thaGVhZD49eiYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K3otMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLG90IT09MCYmRC5zdHJzdGFydC1vdDw9RC53X3NpemUtZXQmJihELm1hdGNoX2xlbmd0aD10dChELG90KSksRC5tYXRjaF9sZW5ndGg+PXopaWYoSD1hLl90cl90YWxseShELEQuc3Ryc3RhcnQtRC5tYXRjaF9zdGFydCxELm1hdGNoX2xlbmd0aC16KSxELmxvb2thaGVhZC09RC5tYXRjaF9sZW5ndGgsRC5tYXRjaF9sZW5ndGg8PUQubWF4X2xhenlfbWF0Y2gmJkQubG9va2FoZWFkPj16KXtmb3IoRC5tYXRjaF9sZW5ndGgtLTtELnN0cnN0YXJ0KyssRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrei0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCwtLUQubWF0Y2hfbGVuZ3RoIT0wOyk7RC5zdHJzdGFydCsrfWVsc2UgRC5zdHJzdGFydCs9RC5tYXRjaF9sZW5ndGgsRC5tYXRjaF9sZW5ndGg9MCxELmluc19oPUQud2luZG93W0Quc3Ryc3RhcnRdLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0KzFdKSZELmhhc2hfbWFzaztlbHNlIEg9YS5fdHJfdGFsbHkoRCwwLEQud2luZG93W0Quc3Ryc3RhcnRdKSxELmxvb2thaGVhZC0tLEQuc3Ryc3RhcnQrKztpZihIJiYocShELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHl9cmV0dXJuIEQuaW5zZXJ0PUQuc3Ryc3RhcnQ8ei0xP0Quc3Ryc3RhcnQ6ei0xLHV0PT09bT8ocShELCEwKSxELnN0cm0uYXZhaWxfb3V0PT09MD9TOk4pOkQubGFzdF9saXQmJihxKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKT95Ol99ZnVuY3Rpb24gQXQoRCx1dCl7Zm9yKHZhciBvdCxILE07Oyl7aWYoRC5sb29rYWhlYWQ8ZXQpe2lmKHl0KEQpLEQubG9va2FoZWFkPGV0JiZ1dD09PXYpcmV0dXJuIHk7aWYoRC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKG90PTAsRC5sb29rYWhlYWQ+PXomJihELmluc19oPShELmluc19oPDxELmhhc2hfc2hpZnReRC53aW5kb3dbRC5zdHJzdGFydCt6LTFdKSZELmhhc2hfbWFzayxvdD1ELnByZXZbRC5zdHJzdGFydCZELndfbWFza109RC5oZWFkW0QuaW5zX2hdLEQuaGVhZFtELmluc19oXT1ELnN0cnN0YXJ0KSxELnByZXZfbGVuZ3RoPUQubWF0Y2hfbGVuZ3RoLEQucHJldl9tYXRjaD1ELm1hdGNoX3N0YXJ0LEQubWF0Y2hfbGVuZ3RoPXotMSxvdCE9PTAmJkQucHJldl9sZW5ndGg8RC5tYXhfbGF6eV9tYXRjaCYmRC5zdHJzdGFydC1vdDw9RC53X3NpemUtZXQmJihELm1hdGNoX2xlbmd0aD10dChELG90KSxELm1hdGNoX2xlbmd0aDw9NSYmKEQuc3RyYXRlZ3k9PT0xfHxELm1hdGNoX2xlbmd0aD09PXomJjQwOTY8RC5zdHJzdGFydC1ELm1hdGNoX3N0YXJ0KSYmKEQubWF0Y2hfbGVuZ3RoPXotMSkpLEQucHJldl9sZW5ndGg+PXomJkQubWF0Y2hfbGVuZ3RoPD1ELnByZXZfbGVuZ3RoKXtmb3IoTT1ELnN0cnN0YXJ0K0QubG9va2FoZWFkLXosSD1hLl90cl90YWxseShELEQuc3Ryc3RhcnQtMS1ELnByZXZfbWF0Y2gsRC5wcmV2X2xlbmd0aC16KSxELmxvb2thaGVhZC09RC5wcmV2X2xlbmd0aC0xLEQucHJldl9sZW5ndGgtPTI7KytELnN0cnN0YXJ0PD1NJiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrei0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCksLS1ELnByZXZfbGVuZ3RoIT0wOyk7aWYoRC5tYXRjaF9hdmFpbGFibGU9MCxELm1hdGNoX2xlbmd0aD16LTEsRC5zdHJzdGFydCsrLEgmJihxKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4geX1lbHNlIGlmKEQubWF0Y2hfYXZhaWxhYmxlKXtpZigoSD1hLl90cl90YWxseShELDAsRC53aW5kb3dbRC5zdHJzdGFydC0xXSkpJiZxKEQsITEpLEQuc3Ryc3RhcnQrKyxELmxvb2thaGVhZC0tLEQuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiB5fWVsc2UgRC5tYXRjaF9hdmFpbGFibGU9MSxELnN0cnN0YXJ0KyssRC5sb29rYWhlYWQtLX1yZXR1cm4gRC5tYXRjaF9hdmFpbGFibGUmJihIPWEuX3RyX3RhbGx5KEQsMCxELndpbmRvd1tELnN0cnN0YXJ0LTFdKSxELm1hdGNoX2F2YWlsYWJsZT0wKSxELmluc2VydD1ELnN0cnN0YXJ0PHotMT9ELnN0cnN0YXJ0OnotMSx1dD09PW0/KHEoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTpELmxhc3RfbGl0JiYocShELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCk/eTpffWZ1bmN0aW9uIGt0KEQsdXQsb3QsSCxNKXt0aGlzLmdvb2RfbGVuZ3RoPUQsdGhpcy5tYXhfbGF6eT11dCx0aGlzLm5pY2VfbGVuZ3RoPW90LHRoaXMubWF4X2NoYWluPUgsdGhpcy5mdW5jPU19ZnVuY3Rpb24gTHQoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD1GLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBzLkJ1ZjE2KDIqQiksdGhpcy5keW5fZHRyZWU9bmV3IHMuQnVmMTYoMiooMipmKzEpKSx0aGlzLmJsX3RyZWU9bmV3IHMuQnVmMTYoMiooMipDKzEpKSxYKHRoaXMuZHluX2x0cmVlKSxYKHRoaXMuZHluX2R0cmVlKSxYKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IHMuQnVmMTYoYysxKSx0aGlzLmhlYXA9bmV3IHMuQnVmMTYoMipvKzEpLFgodGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IHMuQnVmMTYoMipvKzEpLFgodGhpcy5kZXB0aCksdGhpcy5sX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLmxhc3RfbGl0PTAsdGhpcy5kX2J1Zj0wLHRoaXMub3B0X2xlbj0wLHRoaXMuc3RhdGljX2xlbj0wLHRoaXMubWF0Y2hlcz0wLHRoaXMuaW5zZXJ0PTAsdGhpcy5iaV9idWY9MCx0aGlzLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gQnQoRCl7dmFyIHV0O3JldHVybiBEJiZELnN0YXRlPyhELnRvdGFsX2luPUQudG90YWxfb3V0PTAsRC5kYXRhX3R5cGU9UCwodXQ9RC5zdGF0ZSkucGVuZGluZz0wLHV0LnBlbmRpbmdfb3V0PTAsdXQud3JhcDwwJiYodXQud3JhcD0tdXQud3JhcCksdXQuc3RhdHVzPXV0LndyYXA/RTpaLEQuYWRsZXI9dXQud3JhcD09PTI/MDoxLHV0Lmxhc3RfZmx1c2g9dixhLl90cl9pbml0KHV0KSxnKTpSKEQsVCl9ZnVuY3Rpb24gJHQoRCl7dmFyIHV0PUJ0KEQpO3JldHVybiB1dD09PWcmJmZ1bmN0aW9uKG90KXtvdC53aW5kb3dfc2l6ZT0yKm90Lndfc2l6ZSxYKG90LmhlYWQpLG90Lm1heF9sYXp5X21hdGNoPW5bb3QubGV2ZWxdLm1heF9sYXp5LG90Lmdvb2RfbWF0Y2g9bltvdC5sZXZlbF0uZ29vZF9sZW5ndGgsb3QubmljZV9tYXRjaD1uW290LmxldmVsXS5uaWNlX2xlbmd0aCxvdC5tYXhfY2hhaW5fbGVuZ3RoPW5bb3QubGV2ZWxdLm1heF9jaGFpbixvdC5zdHJzdGFydD0wLG90LmJsb2NrX3N0YXJ0PTAsb3QubG9va2FoZWFkPTAsb3QuaW5zZXJ0PTAsb3QubWF0Y2hfbGVuZ3RoPW90LnByZXZfbGVuZ3RoPXotMSxvdC5tYXRjaF9hdmFpbGFibGU9MCxvdC5pbnNfaD0wfShELnN0YXRlKSx1dH1mdW5jdGlvbiBLdChELHV0LG90LEgsTSxZKXtpZighRClyZXR1cm4gVDt2YXIgcHQ9MTtpZih1dD09PXcmJih1dD02KSxIPDA/KHB0PTAsSD0tSCk6MTU8SCYmKHB0PTIsSC09MTYpLE08MXx8aDxNfHxvdCE9PUZ8fEg8OHx8MTU8SHx8dXQ8MHx8OTx1dHx8WTwwfHxrPFkpcmV0dXJuIFIoRCxUKTtIPT09OCYmKEg9OSk7dmFyIG10PW5ldyBMdDtyZXR1cm4oRC5zdGF0ZT1tdCkuc3RybT1ELG10LndyYXA9cHQsbXQuZ3poZWFkPW51bGwsbXQud19iaXRzPUgsbXQud19zaXplPTE8PG10LndfYml0cyxtdC53X21hc2s9bXQud19zaXplLTEsbXQuaGFzaF9iaXRzPU0rNyxtdC5oYXNoX3NpemU9MTw8bXQuaGFzaF9iaXRzLG10Lmhhc2hfbWFzaz1tdC5oYXNoX3NpemUtMSxtdC5oYXNoX3NoaWZ0PX5+KChtdC5oYXNoX2JpdHMrei0xKS96KSxtdC53aW5kb3c9bmV3IHMuQnVmOCgyKm10Lndfc2l6ZSksbXQuaGVhZD1uZXcgcy5CdWYxNihtdC5oYXNoX3NpemUpLG10LnByZXY9bmV3IHMuQnVmMTYobXQud19zaXplKSxtdC5saXRfYnVmc2l6ZT0xPDxNKzYsbXQucGVuZGluZ19idWZfc2l6ZT00Km10LmxpdF9idWZzaXplLG10LnBlbmRpbmdfYnVmPW5ldyBzLkJ1ZjgobXQucGVuZGluZ19idWZfc2l6ZSksbXQuZF9idWY9MSptdC5saXRfYnVmc2l6ZSxtdC5sX2J1Zj0zKm10LmxpdF9idWZzaXplLG10LmxldmVsPXV0LG10LnN0cmF0ZWd5PVksbXQubWV0aG9kPW90LCR0KEQpfW49W25ldyBrdCgwLDAsMCwwLGZ1bmN0aW9uKEQsdXQpe3ZhciBvdD02NTUzNTtmb3Iob3Q+RC5wZW5kaW5nX2J1Zl9zaXplLTUmJihvdD1ELnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoRC5sb29rYWhlYWQ8PTEpe2lmKHl0KEQpLEQubG9va2FoZWFkPT09MCYmdXQ9PT12KXJldHVybiB5O2lmKEQubG9va2FoZWFkPT09MClicmVha31ELnN0cnN0YXJ0Kz1ELmxvb2thaGVhZCxELmxvb2thaGVhZD0wO3ZhciBIPUQuYmxvY2tfc3RhcnQrb3Q7aWYoKEQuc3Ryc3RhcnQ9PT0wfHxELnN0cnN0YXJ0Pj1IKSYmKEQubG9va2FoZWFkPUQuc3Ryc3RhcnQtSCxELnN0cnN0YXJ0PUgscShELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCl8fEQuc3Ryc3RhcnQtRC5ibG9ja19zdGFydD49RC53X3NpemUtZXQmJihxKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4geX1yZXR1cm4gRC5pbnNlcnQ9MCx1dD09PW0/KHEoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTooRC5zdHJzdGFydD5ELmJsb2NrX3N0YXJ0JiYocShELCExKSxELnN0cm0uYXZhaWxfb3V0KSx5KX0pLG5ldyBrdCg0LDQsOCw0LFR0KSxuZXcga3QoNCw1LDE2LDgsVHQpLG5ldyBrdCg0LDYsMzIsMzIsVHQpLG5ldyBrdCg0LDQsMTYsMTYsQXQpLG5ldyBrdCg4LDE2LDMyLDMyLEF0KSxuZXcga3QoOCwxNiwxMjgsMTI4LEF0KSxuZXcga3QoOCwzMiwxMjgsMjU2LEF0KSxuZXcga3QoMzIsMTI4LDI1OCwxMDI0LEF0KSxuZXcga3QoMzIsMjU4LDI1OCw0MDk2LEF0KV0sci5kZWZsYXRlSW5pdD1mdW5jdGlvbihELHV0KXtyZXR1cm4gS3QoRCx1dCxGLDE1LDgsMCl9LHIuZGVmbGF0ZUluaXQyPUt0LHIuZGVmbGF0ZVJlc2V0PSR0LHIuZGVmbGF0ZVJlc2V0S2VlcD1CdCxyLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oRCx1dCl7cmV0dXJuIEQmJkQuc3RhdGU/RC5zdGF0ZS53cmFwIT09Mj9UOihELnN0YXRlLmd6aGVhZD11dCxnKTpUfSxyLmRlZmxhdGU9ZnVuY3Rpb24oRCx1dCl7dmFyIG90LEgsTSxZO2lmKCFEfHwhRC5zdGF0ZXx8NTx1dHx8dXQ8MClyZXR1cm4gRD9SKEQsVCk6VDtpZihIPUQuc3RhdGUsIUQub3V0cHV0fHwhRC5pbnB1dCYmRC5hdmFpbF9pbiE9PTB8fEguc3RhdHVzPT09NjY2JiZ1dCE9PW0pcmV0dXJuIFIoRCxELmF2YWlsX291dD09PTA/LTU6VCk7aWYoSC5zdHJtPUQsb3Q9SC5sYXN0X2ZsdXNoLEgubGFzdF9mbHVzaD11dCxILnN0YXR1cz09PUUpaWYoSC53cmFwPT09MilELmFkbGVyPTAsYXQoSCwzMSksYXQoSCwxMzkpLGF0KEgsOCksSC5nemhlYWQ/KGF0KEgsKEguZ3poZWFkLnRleHQ/MTowKSsoSC5nemhlYWQuaGNyYz8yOjApKyhILmd6aGVhZC5leHRyYT80OjApKyhILmd6aGVhZC5uYW1lPzg6MCkrKEguZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLGF0KEgsMjU1JkguZ3poZWFkLnRpbWUpLGF0KEgsSC5nemhlYWQudGltZT4+OCYyNTUpLGF0KEgsSC5nemhlYWQudGltZT4+MTYmMjU1KSxhdChILEguZ3poZWFkLnRpbWU+PjI0JjI1NSksYXQoSCxILmxldmVsPT09OT8yOjI8PUguc3RyYXRlZ3l8fEgubGV2ZWw8Mj80OjApLGF0KEgsMjU1JkguZ3poZWFkLm9zKSxILmd6aGVhZC5leHRyYSYmSC5nemhlYWQuZXh0cmEubGVuZ3RoJiYoYXQoSCwyNTUmSC5nemhlYWQuZXh0cmEubGVuZ3RoKSxhdChILEguZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxILmd6aGVhZC5oY3JjJiYoRC5hZGxlcj11KEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmcsMCkpLEguZ3ppbmRleD0wLEguc3RhdHVzPTY5KTooYXQoSCwwKSxhdChILDApLGF0KEgsMCksYXQoSCwwKSxhdChILDApLGF0KEgsSC5sZXZlbD09PTk/MjoyPD1ILnN0cmF0ZWd5fHxILmxldmVsPDI/NDowKSxhdChILDMpLEguc3RhdHVzPVopO2Vsc2V7dmFyIHB0PUYrKEgud19iaXRzLTg8PDQpPDw4O3B0fD0oMjw9SC5zdHJhdGVneXx8SC5sZXZlbDwyPzA6SC5sZXZlbDw2PzE6SC5sZXZlbD09PTY/MjozKTw8NixILnN0cnN0YXJ0IT09MCYmKHB0fD0zMikscHQrPTMxLXB0JTMxLEguc3RhdHVzPVosSihILHB0KSxILnN0cnN0YXJ0IT09MCYmKEooSCxELmFkbGVyPj4+MTYpLEooSCw2NTUzNSZELmFkbGVyKSksRC5hZGxlcj0xfWlmKEguc3RhdHVzPT09NjkpaWYoSC5nemhlYWQuZXh0cmEpe2ZvcihNPUgucGVuZGluZztILmd6aW5kZXg8KDY1NTM1JkguZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihILnBlbmRpbmchPT1ILnBlbmRpbmdfYnVmX3NpemV8fChILmd6aGVhZC5oY3JjJiZILnBlbmRpbmc+TSYmKEQuYWRsZXI9dShELmFkbGVyLEgucGVuZGluZ19idWYsSC5wZW5kaW5nLU0sTSkpLGooRCksTT1ILnBlbmRpbmcsSC5wZW5kaW5nIT09SC5wZW5kaW5nX2J1Zl9zaXplKSk7KWF0KEgsMjU1JkguZ3poZWFkLmV4dHJhW0guZ3ppbmRleF0pLEguZ3ppbmRleCsrO0guZ3poZWFkLmhjcmMmJkgucGVuZGluZz5NJiYoRC5hZGxlcj11KEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmctTSxNKSksSC5nemluZGV4PT09SC5nemhlYWQuZXh0cmEubGVuZ3RoJiYoSC5nemluZGV4PTAsSC5zdGF0dXM9NzMpfWVsc2UgSC5zdGF0dXM9NzM7aWYoSC5zdGF0dXM9PT03MylpZihILmd6aGVhZC5uYW1lKXtNPUgucGVuZGluZztkb3tpZihILnBlbmRpbmc9PT1ILnBlbmRpbmdfYnVmX3NpemUmJihILmd6aGVhZC5oY3JjJiZILnBlbmRpbmc+TSYmKEQuYWRsZXI9dShELmFkbGVyLEgucGVuZGluZ19idWYsSC5wZW5kaW5nLU0sTSkpLGooRCksTT1ILnBlbmRpbmcsSC5wZW5kaW5nPT09SC5wZW5kaW5nX2J1Zl9zaXplKSl7WT0xO2JyZWFrfVk9SC5nemluZGV4PEguZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZILmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoSC5nemluZGV4KyspOjAsYXQoSCxZKX13aGlsZShZIT09MCk7SC5nemhlYWQuaGNyYyYmSC5wZW5kaW5nPk0mJihELmFkbGVyPXUoRC5hZGxlcixILnBlbmRpbmdfYnVmLEgucGVuZGluZy1NLE0pKSxZPT09MCYmKEguZ3ppbmRleD0wLEguc3RhdHVzPTkxKX1lbHNlIEguc3RhdHVzPTkxO2lmKEguc3RhdHVzPT09OTEpaWYoSC5nemhlYWQuY29tbWVudCl7TT1ILnBlbmRpbmc7ZG97aWYoSC5wZW5kaW5nPT09SC5wZW5kaW5nX2J1Zl9zaXplJiYoSC5nemhlYWQuaGNyYyYmSC5wZW5kaW5nPk0mJihELmFkbGVyPXUoRC5hZGxlcixILnBlbmRpbmdfYnVmLEgucGVuZGluZy1NLE0pKSxqKEQpLE09SC5wZW5kaW5nLEgucGVuZGluZz09PUgucGVuZGluZ19idWZfc2l6ZSkpe1k9MTticmVha31ZPUguZ3ppbmRleDxILmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmSC5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KEguZ3ppbmRleCsrKTowLGF0KEgsWSl9d2hpbGUoWSE9PTApO0guZ3poZWFkLmhjcmMmJkgucGVuZGluZz5NJiYoRC5hZGxlcj11KEQuYWRsZXIsSC5wZW5kaW5nX2J1ZixILnBlbmRpbmctTSxNKSksWT09PTAmJihILnN0YXR1cz0xMDMpfWVsc2UgSC5zdGF0dXM9MTAzO2lmKEguc3RhdHVzPT09MTAzJiYoSC5nemhlYWQuaGNyYz8oSC5wZW5kaW5nKzI+SC5wZW5kaW5nX2J1Zl9zaXplJiZqKEQpLEgucGVuZGluZysyPD1ILnBlbmRpbmdfYnVmX3NpemUmJihhdChILDI1NSZELmFkbGVyKSxhdChILEQuYWRsZXI+PjgmMjU1KSxELmFkbGVyPTAsSC5zdGF0dXM9WikpOkguc3RhdHVzPVopLEgucGVuZGluZyE9PTApe2lmKGooRCksRC5hdmFpbF9vdXQ9PT0wKXJldHVybiBILmxhc3RfZmx1c2g9LTEsZ31lbHNlIGlmKEQuYXZhaWxfaW49PT0wJiZMKHV0KTw9TChvdCkmJnV0IT09bSlyZXR1cm4gUihELC01KTtpZihILnN0YXR1cz09PTY2NiYmRC5hdmFpbF9pbiE9PTApcmV0dXJuIFIoRCwtNSk7aWYoRC5hdmFpbF9pbiE9PTB8fEgubG9va2FoZWFkIT09MHx8dXQhPT12JiZILnN0YXR1cyE9PTY2Nil7dmFyIG10PUguc3RyYXRlZ3k9PT0yP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0Ozspe2lmKHJ0Lmxvb2thaGVhZD09PTAmJih5dChydCkscnQubG9va2FoZWFkPT09MCkpe2lmKGd0PT09dilyZXR1cm4geTticmVha31pZihydC5tYXRjaF9sZW5ndGg9MCxDdD1hLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyssQ3QmJihxKHJ0LCExKSxydC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB5fXJldHVybiBydC5pbnNlcnQ9MCxndD09PW0/KHEocnQsITApLHJ0LnN0cm0uYXZhaWxfb3V0PT09MD9TOk4pOnJ0Lmxhc3RfbGl0JiYocShydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKT95Ol99KEgsdXQpOkguc3RyYXRlZ3k9PT0zP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0LHh0LHZ0LHp0LFV0PXJ0LndpbmRvdzs7KXtpZihydC5sb29rYWhlYWQ8PUcpe2lmKHl0KHJ0KSxydC5sb29rYWhlYWQ8PUcmJmd0PT09dilyZXR1cm4geTtpZihydC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHJ0Lm1hdGNoX2xlbmd0aD0wLHJ0Lmxvb2thaGVhZD49eiYmMDxydC5zdHJzdGFydCYmKHh0PVV0W3Z0PXJ0LnN0cnN0YXJ0LTFdKT09PVV0WysrdnRdJiZ4dD09PVV0WysrdnRdJiZ4dD09PVV0WysrdnRdKXt6dD1ydC5zdHJzdGFydCtHO2RvO3doaWxlKHh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnh0PT09VXRbKyt2dF0mJnZ0PHp0KTtydC5tYXRjaF9sZW5ndGg9Ry0oenQtdnQpLHJ0Lm1hdGNoX2xlbmd0aD5ydC5sb29rYWhlYWQmJihydC5tYXRjaF9sZW5ndGg9cnQubG9va2FoZWFkKX1pZihydC5tYXRjaF9sZW5ndGg+PXo/KEN0PWEuX3RyX3RhbGx5KHJ0LDEscnQubWF0Y2hfbGVuZ3RoLXopLHJ0Lmxvb2thaGVhZC09cnQubWF0Y2hfbGVuZ3RoLHJ0LnN0cnN0YXJ0Kz1ydC5tYXRjaF9sZW5ndGgscnQubWF0Y2hfbGVuZ3RoPTApOihDdD1hLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyspLEN0JiYocShydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4geX1yZXR1cm4gcnQuaW5zZXJ0PTAsZ3Q9PT1tPyhxKHJ0LCEwKSxydC5zdHJtLmF2YWlsX291dD09PTA/UzpOKTpydC5sYXN0X2xpdCYmKHEocnQsITEpLHJ0LnN0cm0uYXZhaWxfb3V0PT09MCk/eTpffShILHV0KTpuW0gubGV2ZWxdLmZ1bmMoSCx1dCk7aWYobXQhPT1TJiZtdCE9PU58fChILnN0YXR1cz02NjYpLG10PT09eXx8bXQ9PT1TKXJldHVybiBELmF2YWlsX291dD09PTAmJihILmxhc3RfZmx1c2g9LTEpLGc7aWYobXQ9PT1fJiYodXQ9PT0xP2EuX3RyX2FsaWduKEgpOnV0IT09NSYmKGEuX3RyX3N0b3JlZF9ibG9jayhILDAsMCwhMSksdXQ9PT0zJiYoWChILmhlYWQpLEgubG9va2FoZWFkPT09MCYmKEguc3Ryc3RhcnQ9MCxILmJsb2NrX3N0YXJ0PTAsSC5pbnNlcnQ9MCkpKSxqKEQpLEQuYXZhaWxfb3V0PT09MCkpcmV0dXJuIEgubGFzdF9mbHVzaD0tMSxnfXJldHVybiB1dCE9PW0/ZzpILndyYXA8PTA/MTooSC53cmFwPT09Mj8oYXQoSCwyNTUmRC5hZGxlciksYXQoSCxELmFkbGVyPj44JjI1NSksYXQoSCxELmFkbGVyPj4xNiYyNTUpLGF0KEgsRC5hZGxlcj4+MjQmMjU1KSxhdChILDI1NSZELnRvdGFsX2luKSxhdChILEQudG90YWxfaW4+PjgmMjU1KSxhdChILEQudG90YWxfaW4+PjE2JjI1NSksYXQoSCxELnRvdGFsX2luPj4yNCYyNTUpKTooSihILEQuYWRsZXI+Pj4xNiksSihILDY1NTM1JkQuYWRsZXIpKSxqKEQpLDA8SC53cmFwJiYoSC53cmFwPS1ILndyYXApLEgucGVuZGluZyE9PTA/ZzoxKX0sci5kZWZsYXRlRW5kPWZ1bmN0aW9uKEQpe3ZhciB1dDtyZXR1cm4gRCYmRC5zdGF0ZT8odXQ9RC5zdGF0ZS5zdGF0dXMpIT09RSYmdXQhPT02OSYmdXQhPT03MyYmdXQhPT05MSYmdXQhPT0xMDMmJnV0IT09WiYmdXQhPT02NjY/UihELFQpOihELnN0YXRlPW51bGwsdXQ9PT1aP1IoRCwtMyk6Zyk6VH0sci5kZWZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbihELHV0KXt2YXIgb3QsSCxNLFkscHQsbXQscnQsZ3QsQ3Q9dXQubGVuZ3RoO2lmKCFEfHwhRC5zdGF0ZXx8KFk9KG90PUQuc3RhdGUpLndyYXApPT09Mnx8WT09PTEmJm90LnN0YXR1cyE9PUV8fG90Lmxvb2thaGVhZClyZXR1cm4gVDtmb3IoWT09PTEmJihELmFkbGVyPWwoRC5hZGxlcix1dCxDdCwwKSksb3Qud3JhcD0wLEN0Pj1vdC53X3NpemUmJihZPT09MCYmKFgob3QuaGVhZCksb3Quc3Ryc3RhcnQ9MCxvdC5ibG9ja19zdGFydD0wLG90Lmluc2VydD0wKSxndD1uZXcgcy5CdWY4KG90Lndfc2l6ZSkscy5hcnJheVNldChndCx1dCxDdC1vdC53X3NpemUsb3Qud19zaXplLDApLHV0PWd0LEN0PW90Lndfc2l6ZSkscHQ9RC5hdmFpbF9pbixtdD1ELm5leHRfaW4scnQ9RC5pbnB1dCxELmF2YWlsX2luPUN0LEQubmV4dF9pbj0wLEQuaW5wdXQ9dXQseXQob3QpO290Lmxvb2thaGVhZD49ejspe2ZvcihIPW90LnN0cnN0YXJ0LE09b3QubG9va2FoZWFkLSh6LTEpO290Lmluc19oPShvdC5pbnNfaDw8b3QuaGFzaF9zaGlmdF5vdC53aW5kb3dbSCt6LTFdKSZvdC5oYXNoX21hc2ssb3QucHJldltIJm90LndfbWFza109b3QuaGVhZFtvdC5pbnNfaF0sb3QuaGVhZFtvdC5pbnNfaF09SCxIKyssLS1NOyk7b3Quc3Ryc3RhcnQ9SCxvdC5sb29rYWhlYWQ9ei0xLHl0KG90KX1yZXR1cm4gb3Quc3Ryc3RhcnQrPW90Lmxvb2thaGVhZCxvdC5ibG9ja19zdGFydD1vdC5zdHJzdGFydCxvdC5pbnNlcnQ9b3QubG9va2FoZWFkLG90Lmxvb2thaGVhZD0wLG90Lm1hdGNoX2xlbmd0aD1vdC5wcmV2X2xlbmd0aD16LTEsb3QubWF0Y2hfYXZhaWxhYmxlPTAsRC5uZXh0X2luPW10LEQuaW5wdXQ9cnQsRC5hdmFpbF9pbj1wdCxvdC53cmFwPVksZ30sci5kZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHsiLi4vdXRpbHMvY29tbW9uIjo0MSwiLi9hZGxlcjMyIjo0MywiLi9jcmMzMiI6NDUsIi4vbWVzc2FnZXMiOjUxLCIuL3RyZWVzIjo1Mn1dLDQ3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfX0se31dLDQ4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihuLHMpe3ZhciBhLGwsdSxwLHYsbSxnLFQsdyxrLFAsRixoLG8sZixDLEIsYyx6LEcsZXQsRSxaLHksXzthPW4uc3RhdGUsbD1uLm5leHRfaW4seT1uLmlucHV0LHU9bCsobi5hdmFpbF9pbi01KSxwPW4ubmV4dF9vdXQsXz1uLm91dHB1dCx2PXAtKHMtbi5hdmFpbF9vdXQpLG09cCsobi5hdmFpbF9vdXQtMjU3KSxnPWEuZG1heCxUPWEud3NpemUsdz1hLndoYXZlLGs9YS53bmV4dCxQPWEud2luZG93LEY9YS5ob2xkLGg9YS5iaXRzLG89YS5sZW5jb2RlLGY9YS5kaXN0Y29kZSxDPSgxPDxhLmxlbmJpdHMpLTEsQj0oMTw8YS5kaXN0Yml0cyktMTt0OmRve2g8MTUmJihGKz15W2wrK108PGgsaCs9OCxGKz15W2wrK108PGgsaCs9OCksYz1vW0YmQ107ZTpmb3IoOzspe2lmKEY+Pj49ej1jPj4+MjQsaC09eiwoej1jPj4+MTYmMjU1KT09PTApX1twKytdPTY1NTM1JmM7ZWxzZXtpZighKDE2JnopKXtpZighKDY0JnopKXtjPW9bKDY1NTM1JmMpKyhGJigxPDx6KS0xKV07Y29udGludWUgZX1pZigzMiZ6KXthLm1vZGU9MTI7YnJlYWsgdH1uLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixhLm1vZGU9MzA7YnJlYWsgdH1HPTY1NTM1JmMsKHomPTE1KSYmKGg8eiYmKEYrPXlbbCsrXTw8aCxoKz04KSxHKz1GJigxPDx6KS0xLEY+Pj49eixoLT16KSxoPDE1JiYoRis9eVtsKytdPDxoLGgrPTgsRis9eVtsKytdPDxoLGgrPTgpLGM9ZltGJkJdO3I6Zm9yKDs7KXtpZihGPj4+PXo9Yz4+PjI0LGgtPXosISgxNiYoej1jPj4+MTYmMjU1KSkpe2lmKCEoNjQmeikpe2M9ZlsoNjU1MzUmYykrKEYmKDE8PHopLTEpXTtjb250aW51ZSByfW4ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLGEubW9kZT0zMDticmVhayB0fWlmKGV0PTY1NTM1JmMsaDwoeiY9MTUpJiYoRis9eVtsKytdPDxoLChoKz04KTx6JiYoRis9eVtsKytdPDxoLGgrPTgpKSxnPChldCs9RiYoMTw8eiktMSkpe24ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsYS5tb2RlPTMwO2JyZWFrIHR9aWYoRj4+Pj16LGgtPXosKHo9cC12KTxldCl7aWYodzwoej1ldC16KSYmYS5zYW5lKXtuLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGEubW9kZT0zMDticmVhayB0fWlmKFo9UCwoRT0wKT09PWspe2lmKEUrPVQteix6PEcpe2ZvcihHLT16O19bcCsrXT1QW0UrK10sLS16Oyk7RT1wLWV0LFo9X319ZWxzZSBpZihrPHope2lmKEUrPVQray16LCh6LT1rKTxHKXtmb3IoRy09ejtfW3ArK109UFtFKytdLC0tejspO2lmKEU9MCxrPEcpe2ZvcihHLT16PWs7X1twKytdPVBbRSsrXSwtLXo7KTtFPXAtZXQsWj1ffX19ZWxzZSBpZihFKz1rLXosejxHKXtmb3IoRy09ejtfW3ArK109UFtFKytdLC0tejspO0U9cC1ldCxaPV99Zm9yKDsyPEc7KV9bcCsrXT1aW0UrK10sX1twKytdPVpbRSsrXSxfW3ArK109WltFKytdLEctPTM7RyYmKF9bcCsrXT1aW0UrK10sMTxHJiYoX1twKytdPVpbRSsrXSkpfWVsc2V7Zm9yKEU9cC1ldDtfW3ArK109X1tFKytdLF9bcCsrXT1fW0UrK10sX1twKytdPV9bRSsrXSwyPChHLT0zKTspO0cmJihfW3ArK109X1tFKytdLDE8RyYmKF9bcCsrXT1fW0UrK10pKX1icmVha319YnJlYWt9fXdoaWxlKGw8dSYmcDxtKTtsLT1HPWg+PjMsRiY9KDE8PChoLT1HPDwzKSktMSxuLm5leHRfaW49bCxuLm5leHRfb3V0PXAsbi5hdmFpbF9pbj1sPHU/dS1sKzU6NS0obC11KSxuLmF2YWlsX291dD1wPG0/bS1wKzI1NzoyNTctKHAtbSksYS5ob2xkPUYsYS5iaXRzPWh9fSx7fV0sNDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMvY29tbW9uIikscz10KCIuL2FkbGVyMzIiKSxhPXQoIi4vY3JjMzIiKSxsPXQoIi4vaW5mZmFzdCIpLHU9dCgiLi9pbmZ0cmVlcyIpLHA9MSx2PTIsbT0wLGc9LTIsVD0xLHc9ODUyLGs9NTkyO2Z1bmN0aW9uIFAoRSl7cmV0dXJuKEU+Pj4yNCYyNTUpKyhFPj4+OCY2NTI4MCkrKCg2NTI4MCZFKTw8OCkrKCgyNTUmRSk8PDI0KX1mdW5jdGlvbiBGKCl7dGhpcy5tb2RlPTAsdGhpcy5sYXN0PSExLHRoaXMud3JhcD0wLHRoaXMuaGF2ZWRpY3Q9ITEsdGhpcy5mbGFncz0wLHRoaXMuZG1heD0wLHRoaXMuY2hlY2s9MCx0aGlzLnRvdGFsPTAsdGhpcy5oZWFkPW51bGwsdGhpcy53Yml0cz0wLHRoaXMud3NpemU9MCx0aGlzLndoYXZlPTAsdGhpcy53bmV4dD0wLHRoaXMud2luZG93PW51bGwsdGhpcy5ob2xkPTAsdGhpcy5iaXRzPTAsdGhpcy5sZW5ndGg9MCx0aGlzLm9mZnNldD0wLHRoaXMuZXh0cmE9MCx0aGlzLmxlbmNvZGU9bnVsbCx0aGlzLmRpc3Rjb2RlPW51bGwsdGhpcy5sZW5iaXRzPTAsdGhpcy5kaXN0Yml0cz0wLHRoaXMubmNvZGU9MCx0aGlzLm5sZW49MCx0aGlzLm5kaXN0PTAsdGhpcy5oYXZlPTAsdGhpcy5uZXh0PW51bGwsdGhpcy5sZW5zPW5ldyBuLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBuLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIGgoRSl7dmFyIFo7cmV0dXJuIEUmJkUuc3RhdGU/KFo9RS5zdGF0ZSxFLnRvdGFsX2luPUUudG90YWxfb3V0PVoudG90YWw9MCxFLm1zZz0iIixaLndyYXAmJihFLmFkbGVyPTEmWi53cmFwKSxaLm1vZGU9VCxaLmxhc3Q9MCxaLmhhdmVkaWN0PTAsWi5kbWF4PTMyNzY4LFouaGVhZD1udWxsLFouaG9sZD0wLFouYml0cz0wLFoubGVuY29kZT1aLmxlbmR5bj1uZXcgbi5CdWYzMih3KSxaLmRpc3Rjb2RlPVouZGlzdGR5bj1uZXcgbi5CdWYzMihrKSxaLnNhbmU9MSxaLmJhY2s9LTEsbSk6Z31mdW5jdGlvbiBvKEUpe3ZhciBaO3JldHVybiBFJiZFLnN0YXRlPygoWj1FLnN0YXRlKS53c2l6ZT0wLFoud2hhdmU9MCxaLnduZXh0PTAsaChFKSk6Z31mdW5jdGlvbiBmKEUsWil7dmFyIHksXztyZXR1cm4gRSYmRS5zdGF0ZT8oXz1FLnN0YXRlLFo8MD8oeT0wLFo9LVopOih5PTErKFo+PjQpLFo8NDgmJihaJj0xNSkpLFomJihaPDh8fDE1PFopP2c6KF8ud2luZG93IT09bnVsbCYmXy53Yml0cyE9PVomJihfLndpbmRvdz1udWxsKSxfLndyYXA9eSxfLndiaXRzPVosbyhFKSkpOmd9ZnVuY3Rpb24gQyhFLFope3ZhciB5LF87cmV0dXJuIEU/KF89bmV3IEYsKEUuc3RhdGU9Xykud2luZG93PW51bGwsKHk9ZihFLFopKSE9PW0mJihFLnN0YXRlPW51bGwpLHkpOmd9dmFyIEIsYyx6PSEwO2Z1bmN0aW9uIEcoRSl7aWYoeil7dmFyIFo7Zm9yKEI9bmV3IG4uQnVmMzIoNTEyKSxjPW5ldyBuLkJ1ZjMyKDMyKSxaPTA7WjwxNDQ7KUUubGVuc1taKytdPTg7Zm9yKDtaPDI1NjspRS5sZW5zW1orK109OTtmb3IoO1o8MjgwOylFLmxlbnNbWisrXT03O2Zvcig7WjwyODg7KUUubGVuc1taKytdPTg7Zm9yKHUocCxFLmxlbnMsMCwyODgsQiwwLEUud29yayx7Yml0czo5fSksWj0wO1o8MzI7KUUubGVuc1taKytdPTU7dSh2LEUubGVucywwLDMyLGMsMCxFLndvcmsse2JpdHM6NX0pLHo9ITF9RS5sZW5jb2RlPUIsRS5sZW5iaXRzPTksRS5kaXN0Y29kZT1jLEUuZGlzdGJpdHM9NX1mdW5jdGlvbiBldChFLFoseSxfKXt2YXIgUyxOPUUuc3RhdGU7cmV0dXJuIE4ud2luZG93PT09bnVsbCYmKE4ud3NpemU9MTw8Ti53Yml0cyxOLnduZXh0PTAsTi53aGF2ZT0wLE4ud2luZG93PW5ldyBuLkJ1ZjgoTi53c2l6ZSkpLF8+PU4ud3NpemU/KG4uYXJyYXlTZXQoTi53aW5kb3csWix5LU4ud3NpemUsTi53c2l6ZSwwKSxOLnduZXh0PTAsTi53aGF2ZT1OLndzaXplKTooXzwoUz1OLndzaXplLU4ud25leHQpJiYoUz1fKSxuLmFycmF5U2V0KE4ud2luZG93LFoseS1fLFMsTi53bmV4dCksKF8tPVMpPyhuLmFycmF5U2V0KE4ud2luZG93LFoseS1fLF8sMCksTi53bmV4dD1fLE4ud2hhdmU9Ti53c2l6ZSk6KE4ud25leHQrPVMsTi53bmV4dD09PU4ud3NpemUmJihOLnduZXh0PTApLE4ud2hhdmU8Ti53c2l6ZSYmKE4ud2hhdmUrPVMpKSksMH1yLmluZmxhdGVSZXNldD1vLHIuaW5mbGF0ZVJlc2V0Mj1mLHIuaW5mbGF0ZVJlc2V0S2VlcD1oLHIuaW5mbGF0ZUluaXQ9ZnVuY3Rpb24oRSl7cmV0dXJuIEMoRSwxNSl9LHIuaW5mbGF0ZUluaXQyPUMsci5pbmZsYXRlPWZ1bmN0aW9uKEUsWil7dmFyIHksXyxTLE4sUixMLFgsaixxLGF0LEosdHQseXQsVHQsQXQsa3QsTHQsQnQsJHQsS3QsRCx1dCxvdCxILE09MCxZPW5ldyBuLkJ1ZjgoNCkscHQ9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO2lmKCFFfHwhRS5zdGF0ZXx8IUUub3V0cHV0fHwhRS5pbnB1dCYmRS5hdmFpbF9pbiE9PTApcmV0dXJuIGc7KHk9RS5zdGF0ZSkubW9kZT09PTEyJiYoeS5tb2RlPTEzKSxSPUUubmV4dF9vdXQsUz1FLm91dHB1dCxYPUUuYXZhaWxfb3V0LE49RS5uZXh0X2luLF89RS5pbnB1dCxMPUUuYXZhaWxfaW4saj15LmhvbGQscT15LmJpdHMsYXQ9TCxKPVgsdXQ9bTt0OmZvcig7Oylzd2l0Y2goeS5tb2RlKXtjYXNlIFQ6aWYoeS53cmFwPT09MCl7eS5tb2RlPTEzO2JyZWFrfWZvcig7cTwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWlmKDImeS53cmFwJiZqPT09MzU2MTUpe1lbeS5jaGVjaz0wXT0yNTUmaixZWzFdPWo+Pj44JjI1NSx5LmNoZWNrPWEoeS5jaGVjayxZLDIsMCkscT1qPTAseS5tb2RlPTI7YnJlYWt9aWYoeS5mbGFncz0wLHkuaGVhZCYmKHkuaGVhZC5kb25lPSExKSwhKDEmeS53cmFwKXx8KCgoMjU1JmopPDw4KSsoaj4+OCkpJTMxKXtFLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIseS5tb2RlPTMwO2JyZWFrfWlmKCgxNSZqKSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix5Lm1vZGU9MzA7YnJlYWt9aWYocS09NCxEPTgrKDE1JihqPj4+PTQpKSx5LndiaXRzPT09MCl5LndiaXRzPUQ7ZWxzZSBpZihEPnkud2JpdHMpe0UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIix5Lm1vZGU9MzA7YnJlYWt9eS5kbWF4PTE8PEQsRS5hZGxlcj15LmNoZWNrPTEseS5tb2RlPTUxMiZqPzEwOjEyLHE9aj0wO2JyZWFrO2Nhc2UgMjpmb3IoO3E8MTY7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH1pZih5LmZsYWdzPWosKDI1NSZ5LmZsYWdzKSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix5Lm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmeS5mbGFncyl7RS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIseS5tb2RlPTMwO2JyZWFrfXkuaGVhZCYmKHkuaGVhZC50ZXh0PWo+PjgmMSksNTEyJnkuZmxhZ3MmJihZWzBdPTI1NSZqLFlbMV09aj4+PjgmMjU1LHkuY2hlY2s9YSh5LmNoZWNrLFksMiwwKSkscT1qPTAseS5tb2RlPTM7Y2FzZSAzOmZvcig7cTwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fXkuaGVhZCYmKHkuaGVhZC50aW1lPWopLDUxMiZ5LmZsYWdzJiYoWVswXT0yNTUmaixZWzFdPWo+Pj44JjI1NSxZWzJdPWo+Pj4xNiYyNTUsWVszXT1qPj4+MjQmMjU1LHkuY2hlY2s9YSh5LmNoZWNrLFksNCwwKSkscT1qPTAseS5tb2RlPTQ7Y2FzZSA0OmZvcig7cTwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fXkuaGVhZCYmKHkuaGVhZC54ZmxhZ3M9MjU1JmoseS5oZWFkLm9zPWo+PjgpLDUxMiZ5LmZsYWdzJiYoWVswXT0yNTUmaixZWzFdPWo+Pj44JjI1NSx5LmNoZWNrPWEoeS5jaGVjayxZLDIsMCkpLHE9aj0wLHkubW9kZT01O2Nhc2UgNTppZigxMDI0JnkuZmxhZ3Mpe2Zvcig7cTwxNjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fXkubGVuZ3RoPWoseS5oZWFkJiYoeS5oZWFkLmV4dHJhX2xlbj1qKSw1MTImeS5mbGFncyYmKFlbMF09MjU1JmosWVsxXT1qPj4+OCYyNTUseS5jaGVjaz1hKHkuY2hlY2ssWSwyLDApKSxxPWo9MH1lbHNlIHkuaGVhZCYmKHkuaGVhZC5leHRyYT1udWxsKTt5Lm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZ5LmZsYWdzJiYoTDwodHQ9eS5sZW5ndGgpJiYodHQ9TCksdHQmJih5LmhlYWQmJihEPXkuaGVhZC5leHRyYV9sZW4teS5sZW5ndGgseS5oZWFkLmV4dHJhfHwoeS5oZWFkLmV4dHJhPW5ldyBBcnJheSh5LmhlYWQuZXh0cmFfbGVuKSksbi5hcnJheVNldCh5LmhlYWQuZXh0cmEsXyxOLHR0LEQpKSw1MTImeS5mbGFncyYmKHkuY2hlY2s9YSh5LmNoZWNrLF8sdHQsTikpLEwtPXR0LE4rPXR0LHkubGVuZ3RoLT10dCkseS5sZW5ndGgpKWJyZWFrIHQ7eS5sZW5ndGg9MCx5Lm1vZGU9NztjYXNlIDc6aWYoMjA0OCZ5LmZsYWdzKXtpZihMPT09MClicmVhayB0O2Zvcih0dD0wO0Q9X1tOK3R0KytdLHkuaGVhZCYmRCYmeS5sZW5ndGg8NjU1MzYmJih5LmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmdHQ8TDspO2lmKDUxMiZ5LmZsYWdzJiYoeS5jaGVjaz1hKHkuY2hlY2ssXyx0dCxOKSksTC09dHQsTis9dHQsRClicmVhayB0fWVsc2UgeS5oZWFkJiYoeS5oZWFkLm5hbWU9bnVsbCk7eS5sZW5ndGg9MCx5Lm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZ5LmZsYWdzKXtpZihMPT09MClicmVhayB0O2Zvcih0dD0wO0Q9X1tOK3R0KytdLHkuaGVhZCYmRCYmeS5sZW5ndGg8NjU1MzYmJih5LmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmdHQ8TDspO2lmKDUxMiZ5LmZsYWdzJiYoeS5jaGVjaz1hKHkuY2hlY2ssXyx0dCxOKSksTC09dHQsTis9dHQsRClicmVhayB0fWVsc2UgeS5oZWFkJiYoeS5oZWFkLmNvbW1lbnQ9bnVsbCk7eS5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZ5LmZsYWdzKXtmb3IoO3E8MTY7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH1pZihqIT09KDY1NTM1JnkuY2hlY2spKXtFLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIseS5tb2RlPTMwO2JyZWFrfXE9aj0wfXkuaGVhZCYmKHkuaGVhZC5oY3JjPXkuZmxhZ3M+PjkmMSx5LmhlYWQuZG9uZT0hMCksRS5hZGxlcj15LmNoZWNrPTAseS5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtxPDMyOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9RS5hZGxlcj15LmNoZWNrPVAoaikscT1qPTAseS5tb2RlPTExO2Nhc2UgMTE6aWYoeS5oYXZlZGljdD09PTApcmV0dXJuIEUubmV4dF9vdXQ9UixFLmF2YWlsX291dD1YLEUubmV4dF9pbj1OLEUuYXZhaWxfaW49TCx5LmhvbGQ9aix5LmJpdHM9cSwyO0UuYWRsZXI9eS5jaGVjaz0xLHkubW9kZT0xMjtjYXNlIDEyOmlmKFo9PT01fHxaPT09NilicmVhayB0O2Nhc2UgMTM6aWYoeS5sYXN0KXtqPj4+PTcmcSxxLT03JnEseS5tb2RlPTI3O2JyZWFrfWZvcig7cTwzOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9c3dpdGNoKHkubGFzdD0xJmoscS09MSwzJihqPj4+PTEpKXtjYXNlIDA6eS5tb2RlPTE0O2JyZWFrO2Nhc2UgMTppZihHKHkpLHkubW9kZT0yMCxaIT09NilicmVhaztqPj4+PTIscS09MjticmVhayB0O2Nhc2UgMjp5Lm1vZGU9MTc7YnJlYWs7Y2FzZSAzOkUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLHkubW9kZT0zMH1qPj4+PTIscS09MjticmVhaztjYXNlIDE0OmZvcihqPj4+PTcmcSxxLT03JnE7cTwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWlmKCg2NTUzNSZqKSE9KGo+Pj4xNl42NTUzNSkpe0UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIix5Lm1vZGU9MzA7YnJlYWt9aWYoeS5sZW5ndGg9NjU1MzUmaixxPWo9MCx5Lm1vZGU9MTUsWj09PTYpYnJlYWsgdDtjYXNlIDE1OnkubW9kZT0xNjtjYXNlIDE2OmlmKHR0PXkubGVuZ3RoKXtpZihMPHR0JiYodHQ9TCksWDx0dCYmKHR0PVgpLHR0PT09MClicmVhayB0O24uYXJyYXlTZXQoUyxfLE4sdHQsUiksTC09dHQsTis9dHQsWC09dHQsUis9dHQseS5sZW5ndGgtPXR0O2JyZWFrfXkubW9kZT0xMjticmVhaztjYXNlIDE3OmZvcig7cTwxNDspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWlmKHkubmxlbj0yNTcrKDMxJmopLGo+Pj49NSxxLT01LHkubmRpc3Q9MSsoMzEmaiksaj4+Pj01LHEtPTUseS5uY29kZT00KygxNSZqKSxqPj4+PTQscS09NCwyODY8eS5ubGVufHwzMDx5Lm5kaXN0KXtFLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLHkubW9kZT0zMDticmVha315LmhhdmU9MCx5Lm1vZGU9MTg7Y2FzZSAxODpmb3IoO3kuaGF2ZTx5Lm5jb2RlOyl7Zm9yKDtxPDM7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH15LmxlbnNbcHRbeS5oYXZlKytdXT03Jmosaj4+Pj0zLHEtPTN9Zm9yKDt5LmhhdmU8MTk7KXkubGVuc1twdFt5LmhhdmUrK11dPTA7aWYoeS5sZW5jb2RlPXkubGVuZHluLHkubGVuYml0cz03LG90PXtiaXRzOnkubGVuYml0c30sdXQ9dSgwLHkubGVucywwLDE5LHkubGVuY29kZSwwLHkud29yayxvdCkseS5sZW5iaXRzPW90LmJpdHMsdXQpe0UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLHkubW9kZT0zMDticmVha315LmhhdmU9MCx5Lm1vZGU9MTk7Y2FzZSAxOTpmb3IoO3kuaGF2ZTx5Lm5sZW4reS5uZGlzdDspe2Zvcig7a3Q9KE09eS5sZW5jb2RlW2omKDE8PHkubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1Jk0sISgoQXQ9TT4+PjI0KTw9cSk7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH1pZihMdDwxNilqPj4+PUF0LHEtPUF0LHkubGVuc1t5LmhhdmUrK109THQ7ZWxzZXtpZihMdD09PTE2KXtmb3IoSD1BdCsyO3E8SDspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWlmKGo+Pj49QXQscS09QXQseS5oYXZlPT09MCl7RS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLHkubW9kZT0zMDticmVha31EPXkubGVuc1t5LmhhdmUtMV0sdHQ9MysoMyZqKSxqPj4+PTIscS09Mn1lbHNlIGlmKEx0PT09MTcpe2ZvcihIPUF0KzM7cTxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9cS09QXQsRD0wLHR0PTMrKDcmKGo+Pj49QXQpKSxqPj4+PTMscS09M31lbHNle2ZvcihIPUF0Kzc7cTxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9cS09QXQsRD0wLHR0PTExKygxMjcmKGo+Pj49QXQpKSxqPj4+PTcscS09N31pZih5LmhhdmUrdHQ+eS5ubGVuK3kubmRpc3Qpe0UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0Iix5Lm1vZGU9MzA7YnJlYWt9Zm9yKDt0dC0tOyl5LmxlbnNbeS5oYXZlKytdPUR9fWlmKHkubW9kZT09PTMwKWJyZWFrO2lmKHkubGVuc1syNTZdPT09MCl7RS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIseS5tb2RlPTMwO2JyZWFrfWlmKHkubGVuYml0cz05LG90PXtiaXRzOnkubGVuYml0c30sdXQ9dShwLHkubGVucywwLHkubmxlbix5LmxlbmNvZGUsMCx5Lndvcmssb3QpLHkubGVuYml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0Iix5Lm1vZGU9MzA7YnJlYWt9aWYoeS5kaXN0Yml0cz02LHkuZGlzdGNvZGU9eS5kaXN0ZHluLG90PXtiaXRzOnkuZGlzdGJpdHN9LHV0PXUodix5LmxlbnMseS5ubGVuLHkubmRpc3QseS5kaXN0Y29kZSwwLHkud29yayxvdCkseS5kaXN0Yml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0Iix5Lm1vZGU9MzA7YnJlYWt9aWYoeS5tb2RlPTIwLFo9PT02KWJyZWFrIHQ7Y2FzZSAyMDp5Lm1vZGU9MjE7Y2FzZSAyMTppZig2PD1MJiYyNTg8PVgpe0UubmV4dF9vdXQ9UixFLmF2YWlsX291dD1YLEUubmV4dF9pbj1OLEUuYXZhaWxfaW49TCx5LmhvbGQ9aix5LmJpdHM9cSxsKEUsSiksUj1FLm5leHRfb3V0LFM9RS5vdXRwdXQsWD1FLmF2YWlsX291dCxOPUUubmV4dF9pbixfPUUuaW5wdXQsTD1FLmF2YWlsX2luLGo9eS5ob2xkLHE9eS5iaXRzLHkubW9kZT09PTEyJiYoeS5iYWNrPS0xKTticmVha31mb3IoeS5iYWNrPTA7a3Q9KE09eS5sZW5jb2RlW2omKDE8PHkubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1Jk0sISgoQXQ9TT4+PjI0KTw9cSk7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH1pZihrdCYmISgyNDAma3QpKXtmb3IoQnQ9QXQsJHQ9a3QsS3Q9THQ7a3Q9KE09eS5sZW5jb2RlW0t0KygoaiYoMTw8QnQrJHQpLTEpPj5CdCldKT4+PjE2JjI1NSxMdD02NTUzNSZNLCEoQnQrKEF0PU0+Pj4yNCk8PXEpOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9aj4+Pj1CdCxxLT1CdCx5LmJhY2srPUJ0fWlmKGo+Pj49QXQscS09QXQseS5iYWNrKz1BdCx5Lmxlbmd0aD1MdCxrdD09PTApe3kubW9kZT0yNjticmVha31pZigzMiZrdCl7eS5iYWNrPS0xLHkubW9kZT0xMjticmVha31pZig2NCZrdCl7RS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIseS5tb2RlPTMwO2JyZWFrfXkuZXh0cmE9MTUma3QseS5tb2RlPTIyO2Nhc2UgMjI6aWYoeS5leHRyYSl7Zm9yKEg9eS5leHRyYTtxPEg7KXtpZihMPT09MClicmVhayB0O0wtLSxqKz1fW04rK108PHEscSs9OH15Lmxlbmd0aCs9aiYoMTw8eS5leHRyYSktMSxqPj4+PXkuZXh0cmEscS09eS5leHRyYSx5LmJhY2srPXkuZXh0cmF9eS53YXM9eS5sZW5ndGgseS5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDtrdD0oTT15LmRpc3Rjb2RlW2omKDE8PHkuZGlzdGJpdHMpLTFdKT4+PjE2JjI1NSxMdD02NTUzNSZNLCEoKEF0PU0+Pj4yNCk8PXEpOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9aWYoISgyNDAma3QpKXtmb3IoQnQ9QXQsJHQ9a3QsS3Q9THQ7a3Q9KE09eS5kaXN0Y29kZVtLdCsoKGomKDE8PEJ0KyR0KS0xKT4+QnQpXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmTSwhKEJ0KyhBdD1NPj4+MjQpPD1xKTspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWo+Pj49QnQscS09QnQseS5iYWNrKz1CdH1pZihqPj4+PUF0LHEtPUF0LHkuYmFjays9QXQsNjQma3Qpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHkubW9kZT0zMDticmVha315Lm9mZnNldD1MdCx5LmV4dHJhPTE1Jmt0LHkubW9kZT0yNDtjYXNlIDI0OmlmKHkuZXh0cmEpe2ZvcihIPXkuZXh0cmE7cTxIOyl7aWYoTD09PTApYnJlYWsgdDtMLS0sais9X1tOKytdPDxxLHErPTh9eS5vZmZzZXQrPWomKDE8PHkuZXh0cmEpLTEsaj4+Pj15LmV4dHJhLHEtPXkuZXh0cmEseS5iYWNrKz15LmV4dHJhfWlmKHkub2Zmc2V0PnkuZG1heCl7RS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIix5Lm1vZGU9MzA7YnJlYWt9eS5tb2RlPTI1O2Nhc2UgMjU6aWYoWD09PTApYnJlYWsgdDtpZih0dD1KLVgseS5vZmZzZXQ+dHQpe2lmKCh0dD15Lm9mZnNldC10dCk+eS53aGF2ZSYmeS5zYW5lKXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHkubW9kZT0zMDticmVha315dD10dD55LnduZXh0Pyh0dC09eS53bmV4dCx5LndzaXplLXR0KTp5LnduZXh0LXR0LHR0PnkubGVuZ3RoJiYodHQ9eS5sZW5ndGgpLFR0PXkud2luZG93fWVsc2UgVHQ9Uyx5dD1SLXkub2Zmc2V0LHR0PXkubGVuZ3RoO2ZvcihYPHR0JiYodHQ9WCksWC09dHQseS5sZW5ndGgtPXR0O1NbUisrXT1UdFt5dCsrXSwtLXR0Oyk7eS5sZW5ndGg9PT0wJiYoeS5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKFg9PT0wKWJyZWFrIHQ7U1tSKytdPXkubGVuZ3RoLFgtLSx5Lm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZih5LndyYXApe2Zvcig7cTwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGp8PV9bTisrXTw8cSxxKz04fWlmKEotPVgsRS50b3RhbF9vdXQrPUoseS50b3RhbCs9SixKJiYoRS5hZGxlcj15LmNoZWNrPXkuZmxhZ3M/YSh5LmNoZWNrLFMsSixSLUopOnMoeS5jaGVjayxTLEosUi1KKSksSj1YLCh5LmZsYWdzP2o6UChqKSkhPT15LmNoZWNrKXtFLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLHkubW9kZT0zMDticmVha31xPWo9MH15Lm1vZGU9Mjg7Y2FzZSAyODppZih5LndyYXAmJnkuZmxhZ3Mpe2Zvcig7cTwzMjspe2lmKEw9PT0wKWJyZWFrIHQ7TC0tLGorPV9bTisrXTw8cSxxKz04fWlmKGohPT0oNDI5NDk2NzI5NSZ5LnRvdGFsKSl7RS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLHkubW9kZT0zMDticmVha31xPWo9MH15Lm1vZGU9Mjk7Y2FzZSAyOTp1dD0xO2JyZWFrIHQ7Y2FzZSAzMDp1dD0tMzticmVhayB0O2Nhc2UgMzE6cmV0dXJuLTQ7Y2FzZSAzMjpkZWZhdWx0OnJldHVybiBnfXJldHVybiBFLm5leHRfb3V0PVIsRS5hdmFpbF9vdXQ9WCxFLm5leHRfaW49TixFLmF2YWlsX2luPUwseS5ob2xkPWoseS5iaXRzPXEsKHkud3NpemV8fEohPT1FLmF2YWlsX291dCYmeS5tb2RlPDMwJiYoeS5tb2RlPDI3fHxaIT09NCkpJiZldChFLEUub3V0cHV0LEUubmV4dF9vdXQsSi1FLmF2YWlsX291dCk/KHkubW9kZT0zMSwtNCk6KGF0LT1FLmF2YWlsX2luLEotPUUuYXZhaWxfb3V0LEUudG90YWxfaW4rPWF0LEUudG90YWxfb3V0Kz1KLHkudG90YWwrPUoseS53cmFwJiZKJiYoRS5hZGxlcj15LmNoZWNrPXkuZmxhZ3M/YSh5LmNoZWNrLFMsSixFLm5leHRfb3V0LUopOnMoeS5jaGVjayxTLEosRS5uZXh0X291dC1KKSksRS5kYXRhX3R5cGU9eS5iaXRzKyh5Lmxhc3Q/NjQ6MCkrKHkubW9kZT09PTEyPzEyODowKSsoeS5tb2RlPT09MjB8fHkubW9kZT09PTE1PzI1NjowKSwoYXQ9PTAmJko9PT0wfHxaPT09NCkmJnV0PT09bSYmKHV0PS01KSx1dCl9LHIuaW5mbGF0ZUVuZD1mdW5jdGlvbihFKXtpZighRXx8IUUuc3RhdGUpcmV0dXJuIGc7dmFyIFo9RS5zdGF0ZTtyZXR1cm4gWi53aW5kb3cmJihaLndpbmRvdz1udWxsKSxFLnN0YXRlPW51bGwsbX0sci5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKEUsWil7dmFyIHk7cmV0dXJuIEUmJkUuc3RhdGUmJjImKHk9RS5zdGF0ZSkud3JhcD8oKHkuaGVhZD1aKS5kb25lPSExLG0pOmd9LHIuaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oRSxaKXt2YXIgeSxfPVoubGVuZ3RoO3JldHVybiBFJiZFLnN0YXRlPyh5PUUuc3RhdGUpLndyYXAhPT0wJiZ5Lm1vZGUhPT0xMT9nOnkubW9kZT09PTExJiZzKDEsWixfLDApIT09eS5jaGVjaz8tMzpldChFLFosXyxfKT8oeS5tb2RlPTMxLC00KTooeS5oYXZlZGljdD0xLG0pOmd9LHIuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDEsIi4vYWRsZXIzMiI6NDMsIi4vY3JjMzIiOjQ1LCIuL2luZmZhc3QiOjQ4LCIuL2luZnRyZWVzIjo1MH1dLDUwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4uL3V0aWxzL2NvbW1vbiIpLHM9WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSxhPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sbD1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sdT1bMTYsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIsMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjcsMjcsMjgsMjgsMjksMjksNjQsNjRdO2UuZXhwb3J0cz1mdW5jdGlvbihwLHYsbSxnLFQsdyxrLFApe3ZhciBGLGgsbyxmLEMsQixjLHosRyxldD1QLmJpdHMsRT0wLFo9MCx5PTAsXz0wLFM9MCxOPTAsUj0wLEw9MCxYPTAsaj0wLHE9bnVsbCxhdD0wLEo9bmV3IG4uQnVmMTYoMTYpLHR0PW5ldyBuLkJ1ZjE2KDE2KSx5dD1udWxsLFR0PTA7Zm9yKEU9MDtFPD0xNTtFKyspSltFXT0wO2ZvcihaPTA7WjxnO1orKylKW3ZbbStaXV0rKztmb3IoUz1ldCxfPTE1OzE8PV8mJkpbX109PT0wO18tLSk7aWYoXzxTJiYoUz1fKSxfPT09MClyZXR1cm4gVFt3KytdPTIwOTcxNTIwLFRbdysrXT0yMDk3MTUyMCxQLmJpdHM9MSwwO2Zvcih5PTE7eTxfJiZKW3ldPT09MDt5KyspO2ZvcihTPHkmJihTPXkpLEU9TD0xO0U8PTE1O0UrKylpZihMPDw9MSwoTC09SltFXSk8MClyZXR1cm4tMTtpZigwPEwmJihwPT09MHx8XyE9PTEpKXJldHVybi0xO2Zvcih0dFsxXT0wLEU9MTtFPDE1O0UrKyl0dFtFKzFdPXR0W0VdK0pbRV07Zm9yKFo9MDtaPGc7WisrKXZbbStaXSE9PTAmJihrW3R0W3ZbbStaXV0rK109Wik7aWYoQj1wPT09MD8ocT15dD1rLDE5KTpwPT09MT8ocT1zLGF0LT0yNTcseXQ9YSxUdC09MjU3LDI1Nik6KHE9bCx5dD11LC0xKSxFPXksQz13LFI9Wj1qPTAsbz0tMSxmPShYPTE8PChOPVMpKS0xLHA9PT0xJiY4NTI8WHx8cD09PTImJjU5MjxYKXJldHVybiAxO2Zvcig7Oyl7Zm9yKGM9RS1SLEc9a1taXTxCPyh6PTAsa1taXSk6a1taXT5CPyh6PXl0W1R0K2tbWl1dLHFbYXQra1taXV0pOih6PTk2LDApLEY9MTw8RS1SLHk9aD0xPDxOO1RbQysoaj4+UikrKGgtPUYpXT1jPDwyNHx6PDwxNnxHfDAsaCE9PTA7KTtmb3IoRj0xPDxFLTE7aiZGOylGPj49MTtpZihGIT09MD8oaiY9Ri0xLGorPUYpOmo9MCxaKyssLS1KW0VdPT0wKXtpZihFPT09XylicmVhaztFPXZbbStrW1pdXX1pZihTPEUmJihqJmYpIT09byl7Zm9yKFI9PT0wJiYoUj1TKSxDKz15LEw9MTw8KE49RS1SKTtOK1I8XyYmISgoTC09SltOK1JdKTw9MCk7KU4rKyxMPDw9MTtpZihYKz0xPDxOLHA9PT0xJiY4NTI8WHx8cD09PTImJjU5MjxYKXJldHVybiAxO1Rbbz1qJmZdPVM8PDI0fE48PDE2fEMtd3wwfX1yZXR1cm4gaiE9PTAmJihUW0Mral09RS1SPDwyNHw2NDw8MTZ8MCksUC5iaXRzPVMsMH19LHsiLi4vdXRpbHMvY29tbW9uIjo0MX1dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSx7fV0sNTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vdXRpbHMvY29tbW9uIikscz0wLGE9MTtmdW5jdGlvbiBsKE0pe2Zvcih2YXIgWT1NLmxlbmd0aDswPD0tLVk7KU1bWV09MH12YXIgdT0wLHA9Mjksdj0yNTYsbT12KzErcCxnPTMwLFQ9MTksdz0yKm0rMSxrPTE1LFA9MTYsRj03LGg9MjU2LG89MTYsZj0xNyxDPTE4LEI9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sYz1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sej1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sRz1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sZXQ9bmV3IEFycmF5KDIqKG0rMikpO2woZXQpO3ZhciBFPW5ldyBBcnJheSgyKmcpO2woRSk7dmFyIFo9bmV3IEFycmF5KDUxMik7bChaKTt2YXIgeT1uZXcgQXJyYXkoMjU2KTtsKHkpO3ZhciBfPW5ldyBBcnJheShwKTtsKF8pO3ZhciBTLE4sUixMPW5ldyBBcnJheShnKTtmdW5jdGlvbiBYKE0sWSxwdCxtdCxydCl7dGhpcy5zdGF0aWNfdHJlZT1NLHRoaXMuZXh0cmFfYml0cz1ZLHRoaXMuZXh0cmFfYmFzZT1wdCx0aGlzLmVsZW1zPW10LHRoaXMubWF4X2xlbmd0aD1ydCx0aGlzLmhhc19zdHJlZT1NJiZNLmxlbmd0aH1mdW5jdGlvbiBqKE0sWSl7dGhpcy5keW5fdHJlZT1NLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz1ZfWZ1bmN0aW9uIHEoTSl7cmV0dXJuIE08MjU2P1pbTV06WlsyNTYrKE0+Pj43KV19ZnVuY3Rpb24gYXQoTSxZKXtNLnBlbmRpbmdfYnVmW00ucGVuZGluZysrXT0yNTUmWSxNLnBlbmRpbmdfYnVmW00ucGVuZGluZysrXT1ZPj4+OCYyNTV9ZnVuY3Rpb24gSihNLFkscHQpe00uYmlfdmFsaWQ+UC1wdD8oTS5iaV9idWZ8PVk8PE0uYmlfdmFsaWQmNjU1MzUsYXQoTSxNLmJpX2J1ZiksTS5iaV9idWY9WT4+UC1NLmJpX3ZhbGlkLE0uYmlfdmFsaWQrPXB0LVApOihNLmJpX2J1Znw9WTw8TS5iaV92YWxpZCY2NTUzNSxNLmJpX3ZhbGlkKz1wdCl9ZnVuY3Rpb24gdHQoTSxZLHB0KXtKKE0scHRbMipZXSxwdFsyKlkrMV0pfWZ1bmN0aW9uIHl0KE0sWSl7Zm9yKHZhciBwdD0wO3B0fD0xJk0sTT4+Pj0xLHB0PDw9MSwwPC0tWTspO3JldHVybiBwdD4+PjF9ZnVuY3Rpb24gVHQoTSxZLHB0KXt2YXIgbXQscnQsZ3Q9bmV3IEFycmF5KGsrMSksQ3Q9MDtmb3IobXQ9MTttdDw9azttdCsrKWd0W210XT1DdD1DdCtwdFttdC0xXTw8MTtmb3IocnQ9MDtydDw9WTtydCsrKXt2YXIgeHQ9TVsyKnJ0KzFdO3h0IT09MCYmKE1bMipydF09eXQoZ3RbeHRdKysseHQpKX19ZnVuY3Rpb24gQXQoTSl7dmFyIFk7Zm9yKFk9MDtZPG07WSsrKU0uZHluX2x0cmVlWzIqWV09MDtmb3IoWT0wO1k8ZztZKyspTS5keW5fZHRyZWVbMipZXT0wO2ZvcihZPTA7WTxUO1krKylNLmJsX3RyZWVbMipZXT0wO00uZHluX2x0cmVlWzIqaF09MSxNLm9wdF9sZW49TS5zdGF0aWNfbGVuPTAsTS5sYXN0X2xpdD1NLm1hdGNoZXM9MH1mdW5jdGlvbiBrdChNKXs4PE0uYmlfdmFsaWQ/YXQoTSxNLmJpX2J1Zik6MDxNLmJpX3ZhbGlkJiYoTS5wZW5kaW5nX2J1ZltNLnBlbmRpbmcrK109TS5iaV9idWYpLE0uYmlfYnVmPTAsTS5iaV92YWxpZD0wfWZ1bmN0aW9uIEx0KE0sWSxwdCxtdCl7dmFyIHJ0PTIqWSxndD0yKnB0O3JldHVybiBNW3J0XTxNW2d0XXx8TVtydF09PT1NW2d0XSYmbXRbWV08PW10W3B0XX1mdW5jdGlvbiBCdChNLFkscHQpe2Zvcih2YXIgbXQ9TS5oZWFwW3B0XSxydD1wdDw8MTtydDw9TS5oZWFwX2xlbiYmKHJ0PE0uaGVhcF9sZW4mJkx0KFksTS5oZWFwW3J0KzFdLE0uaGVhcFtydF0sTS5kZXB0aCkmJnJ0KyssIUx0KFksbXQsTS5oZWFwW3J0XSxNLmRlcHRoKSk7KU0uaGVhcFtwdF09TS5oZWFwW3J0XSxwdD1ydCxydDw8PTE7TS5oZWFwW3B0XT1tdH1mdW5jdGlvbiAkdChNLFkscHQpe3ZhciBtdCxydCxndCxDdCx4dD0wO2lmKE0ubGFzdF9saXQhPT0wKWZvcig7bXQ9TS5wZW5kaW5nX2J1ZltNLmRfYnVmKzIqeHRdPDw4fE0ucGVuZGluZ19idWZbTS5kX2J1ZisyKnh0KzFdLHJ0PU0ucGVuZGluZ19idWZbTS5sX2J1Zit4dF0seHQrKyxtdD09PTA/dHQoTSxydCxZKToodHQoTSwoZ3Q9eVtydF0pK3YrMSxZKSwoQ3Q9QltndF0pIT09MCYmSihNLHJ0LT1fW2d0XSxDdCksdHQoTSxndD1xKC0tbXQpLHB0KSwoQ3Q9Y1tndF0pIT09MCYmSihNLG10LT1MW2d0XSxDdCkpLHh0PE0ubGFzdF9saXQ7KTt0dChNLGgsWSl9ZnVuY3Rpb24gS3QoTSxZKXt2YXIgcHQsbXQscnQsZ3Q9WS5keW5fdHJlZSxDdD1ZLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSx4dD1ZLnN0YXRfZGVzYy5oYXNfc3RyZWUsdnQ9WS5zdGF0X2Rlc2MuZWxlbXMsenQ9LTE7Zm9yKE0uaGVhcF9sZW49MCxNLmhlYXBfbWF4PXcscHQ9MDtwdDx2dDtwdCsrKWd0WzIqcHRdIT09MD8oTS5oZWFwWysrTS5oZWFwX2xlbl09enQ9cHQsTS5kZXB0aFtwdF09MCk6Z3RbMipwdCsxXT0wO2Zvcig7TS5oZWFwX2xlbjwyOylndFsyKihydD1NLmhlYXBbKytNLmhlYXBfbGVuXT16dDwyPysrenQ6MCldPTEsTS5kZXB0aFtydF09MCxNLm9wdF9sZW4tLSx4dCYmKE0uc3RhdGljX2xlbi09Q3RbMipydCsxXSk7Zm9yKFkubWF4X2NvZGU9enQscHQ9TS5oZWFwX2xlbj4+MTsxPD1wdDtwdC0tKUJ0KE0sZ3QscHQpO2ZvcihydD12dDtwdD1NLmhlYXBbMV0sTS5oZWFwWzFdPU0uaGVhcFtNLmhlYXBfbGVuLS1dLEJ0KE0sZ3QsMSksbXQ9TS5oZWFwWzFdLE0uaGVhcFstLU0uaGVhcF9tYXhdPXB0LE0uaGVhcFstLU0uaGVhcF9tYXhdPW10LGd0WzIqcnRdPWd0WzIqcHRdK2d0WzIqbXRdLE0uZGVwdGhbcnRdPShNLmRlcHRoW3B0XT49TS5kZXB0aFttdF0/TS5kZXB0aFtwdF06TS5kZXB0aFttdF0pKzEsZ3RbMipwdCsxXT1ndFsyKm10KzFdPXJ0LE0uaGVhcFsxXT1ydCsrLEJ0KE0sZ3QsMSksMjw9TS5oZWFwX2xlbjspO00uaGVhcFstLU0uaGVhcF9tYXhdPU0uaGVhcFsxXSxmdW5jdGlvbihVdCxwZSl7dmFyIG9yLHdlLFllLHRlLGJlLEVlLGRlPXBlLmR5bl90cmVlLHRuPXBlLm1heF9jb2RlLG1yPXBlLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxlbj1wZS5zdGF0X2Rlc2MuaGFzX3N0cmVlLHJuPXBlLnN0YXRfZGVzYy5leHRyYV9iaXRzLG5uPXBlLnN0YXRfZGVzYy5leHRyYV9iYXNlLGtlPXBlLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLGplPTA7Zm9yKHRlPTA7dGU8PWs7dGUrKylVdC5ibF9jb3VudFt0ZV09MDtmb3IoZGVbMipVdC5oZWFwW1V0LmhlYXBfbWF4XSsxXT0wLG9yPVV0LmhlYXBfbWF4KzE7b3I8dztvcisrKWtlPCh0ZT1kZVsyKmRlWzIqKHdlPVV0LmhlYXBbb3JdKSsxXSsxXSsxKSYmKHRlPWtlLGplKyspLGRlWzIqd2UrMV09dGUsdG48d2V8fChVdC5ibF9jb3VudFt0ZV0rKyxiZT0wLG5uPD13ZSYmKGJlPXJuW3dlLW5uXSksRWU9ZGVbMip3ZV0sVXQub3B0X2xlbis9RWUqKHRlK2JlKSxlbiYmKFV0LnN0YXRpY19sZW4rPUVlKihtclsyKndlKzFdK2JlKSkpO2lmKGplIT09MCl7ZG97Zm9yKHRlPWtlLTE7VXQuYmxfY291bnRbdGVdPT09MDspdGUtLTtVdC5ibF9jb3VudFt0ZV0tLSxVdC5ibF9jb3VudFt0ZSsxXSs9MixVdC5ibF9jb3VudFtrZV0tLSxqZS09Mn13aGlsZSgwPGplKTtmb3IodGU9a2U7dGUhPT0wO3RlLS0pZm9yKHdlPVV0LmJsX2NvdW50W3RlXTt3ZSE9PTA7KXRuPChZZT1VdC5oZWFwWy0tb3JdKXx8KGRlWzIqWWUrMV0hPT10ZSYmKFV0Lm9wdF9sZW4rPSh0ZS1kZVsyKlllKzFdKSpkZVsyKlllXSxkZVsyKlllKzFdPXRlKSx3ZS0tKX19KE0sWSksVHQoZ3QsenQsTS5ibF9jb3VudCl9ZnVuY3Rpb24gRChNLFkscHQpe3ZhciBtdCxydCxndD0tMSxDdD1ZWzFdLHh0PTAsdnQ9Nyx6dD00O2ZvcihDdD09PTAmJih2dD0xMzgsenQ9MyksWVsyKihwdCsxKSsxXT02NTUzNSxtdD0wO210PD1wdDttdCsrKXJ0PUN0LEN0PVlbMioobXQrMSkrMV0sKyt4dDx2dCYmcnQ9PT1DdHx8KHh0PHp0P00uYmxfdHJlZVsyKnJ0XSs9eHQ6cnQhPT0wPyhydCE9PWd0JiZNLmJsX3RyZWVbMipydF0rKyxNLmJsX3RyZWVbMipvXSsrKTp4dDw9MTA/TS5ibF90cmVlWzIqZl0rKzpNLmJsX3RyZWVbMipDXSsrLGd0PXJ0LHp0PSh4dD0wKT09PUN0Pyh2dD0xMzgsMyk6cnQ9PT1DdD8odnQ9NiwzKToodnQ9Nyw0KSl9ZnVuY3Rpb24gdXQoTSxZLHB0KXt2YXIgbXQscnQsZ3Q9LTEsQ3Q9WVsxXSx4dD0wLHZ0PTcsenQ9NDtmb3IoQ3Q9PT0wJiYodnQ9MTM4LHp0PTMpLG10PTA7bXQ8PXB0O210KyspaWYocnQ9Q3QsQ3Q9WVsyKihtdCsxKSsxXSwhKCsreHQ8dnQmJnJ0PT09Q3QpKXtpZih4dDx6dClmb3IoO3R0KE0scnQsTS5ibF90cmVlKSwtLXh0IT0wOyk7ZWxzZSBydCE9PTA/KHJ0IT09Z3QmJih0dChNLHJ0LE0uYmxfdHJlZSkseHQtLSksdHQoTSxvLE0uYmxfdHJlZSksSihNLHh0LTMsMikpOnh0PD0xMD8odHQoTSxmLE0uYmxfdHJlZSksSihNLHh0LTMsMykpOih0dChNLEMsTS5ibF90cmVlKSxKKE0seHQtMTEsNykpO2d0PXJ0LHp0PSh4dD0wKT09PUN0Pyh2dD0xMzgsMyk6cnQ9PT1DdD8odnQ9NiwzKToodnQ9Nyw0KX19bChMKTt2YXIgb3Q9ITE7ZnVuY3Rpb24gSChNLFkscHQsbXQpe0ooTSwodTw8MSkrKG10PzE6MCksMyksZnVuY3Rpb24ocnQsZ3QsQ3QseHQpe2t0KHJ0KSx4dCYmKGF0KHJ0LEN0KSxhdChydCx+Q3QpKSxuLmFycmF5U2V0KHJ0LnBlbmRpbmdfYnVmLHJ0LndpbmRvdyxndCxDdCxydC5wZW5kaW5nKSxydC5wZW5kaW5nKz1DdH0oTSxZLHB0LCEwKX1yLl90cl9pbml0PWZ1bmN0aW9uKE0pe290fHwoZnVuY3Rpb24oKXt2YXIgWSxwdCxtdCxydCxndCxDdD1uZXcgQXJyYXkoaysxKTtmb3IocnQ9bXQ9MDtydDxwLTE7cnQrKylmb3IoX1tydF09bXQsWT0wO1k8MTw8QltydF07WSsrKXlbbXQrK109cnQ7Zm9yKHlbbXQtMV09cnQscnQ9Z3Q9MDtydDwxNjtydCsrKWZvcihMW3J0XT1ndCxZPTA7WTwxPDxjW3J0XTtZKyspWltndCsrXT1ydDtmb3IoZ3Q+Pj03O3J0PGc7cnQrKylmb3IoTFtydF09Z3Q8PDcsWT0wO1k8MTw8Y1tydF0tNztZKyspWlsyNTYrZ3QrK109cnQ7Zm9yKHB0PTA7cHQ8PWs7cHQrKylDdFtwdF09MDtmb3IoWT0wO1k8PTE0MzspZXRbMipZKzFdPTgsWSsrLEN0WzhdKys7Zm9yKDtZPD0yNTU7KWV0WzIqWSsxXT05LFkrKyxDdFs5XSsrO2Zvcig7WTw9Mjc5OylldFsyKlkrMV09NyxZKyssQ3RbN10rKztmb3IoO1k8PTI4NzspZXRbMipZKzFdPTgsWSsrLEN0WzhdKys7Zm9yKFR0KGV0LG0rMSxDdCksWT0wO1k8ZztZKyspRVsyKlkrMV09NSxFWzIqWV09eXQoWSw1KTtTPW5ldyBYKGV0LEIsdisxLG0sayksTj1uZXcgWChFLGMsMCxnLGspLFI9bmV3IFgobmV3IEFycmF5KDApLHosMCxULEYpfSgpLG90PSEwKSxNLmxfZGVzYz1uZXcgaihNLmR5bl9sdHJlZSxTKSxNLmRfZGVzYz1uZXcgaihNLmR5bl9kdHJlZSxOKSxNLmJsX2Rlc2M9bmV3IGooTS5ibF90cmVlLFIpLE0uYmlfYnVmPTAsTS5iaV92YWxpZD0wLEF0KE0pfSxyLl90cl9zdG9yZWRfYmxvY2s9SCxyLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbihNLFkscHQsbXQpe3ZhciBydCxndCxDdD0wOzA8TS5sZXZlbD8oTS5zdHJtLmRhdGFfdHlwZT09PTImJihNLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKHh0KXt2YXIgdnQsenQ9NDA5MzYyNDQ0Nztmb3IodnQ9MDt2dDw9MzE7dnQrKyx6dD4+Pj0xKWlmKDEmenQmJnh0LmR5bl9sdHJlZVsyKnZ0XSE9PTApcmV0dXJuIHM7aWYoeHQuZHluX2x0cmVlWzE4XSE9PTB8fHh0LmR5bl9sdHJlZVsyMF0hPT0wfHx4dC5keW5fbHRyZWVbMjZdIT09MClyZXR1cm4gYTtmb3IodnQ9MzI7dnQ8djt2dCsrKWlmKHh0LmR5bl9sdHJlZVsyKnZ0XSE9PTApcmV0dXJuIGE7cmV0dXJuIHN9KE0pKSxLdChNLE0ubF9kZXNjKSxLdChNLE0uZF9kZXNjKSxDdD1mdW5jdGlvbih4dCl7dmFyIHZ0O2ZvcihEKHh0LHh0LmR5bl9sdHJlZSx4dC5sX2Rlc2MubWF4X2NvZGUpLEQoeHQseHQuZHluX2R0cmVlLHh0LmRfZGVzYy5tYXhfY29kZSksS3QoeHQseHQuYmxfZGVzYyksdnQ9VC0xOzM8PXZ0JiZ4dC5ibF90cmVlWzIqR1t2dF0rMV09PT0wO3Z0LS0pO3JldHVybiB4dC5vcHRfbGVuKz0zKih2dCsxKSs1KzUrNCx2dH0oTSkscnQ9TS5vcHRfbGVuKzMrNz4+PjMsKGd0PU0uc3RhdGljX2xlbiszKzc+Pj4zKTw9cnQmJihydD1ndCkpOnJ0PWd0PXB0KzUscHQrNDw9cnQmJlkhPT0tMT9IKE0sWSxwdCxtdCk6TS5zdHJhdGVneT09PTR8fGd0PT09cnQ/KEooTSwyKyhtdD8xOjApLDMpLCR0KE0sZXQsRSkpOihKKE0sNCsobXQ/MTowKSwzKSxmdW5jdGlvbih4dCx2dCx6dCxVdCl7dmFyIHBlO2ZvcihKKHh0LHZ0LTI1Nyw1KSxKKHh0LHp0LTEsNSksSih4dCxVdC00LDQpLHBlPTA7cGU8VXQ7cGUrKylKKHh0LHh0LmJsX3RyZWVbMipHW3BlXSsxXSwzKTt1dCh4dCx4dC5keW5fbHRyZWUsdnQtMSksdXQoeHQseHQuZHluX2R0cmVlLHp0LTEpfShNLE0ubF9kZXNjLm1heF9jb2RlKzEsTS5kX2Rlc2MubWF4X2NvZGUrMSxDdCsxKSwkdChNLE0uZHluX2x0cmVlLE0uZHluX2R0cmVlKSksQXQoTSksbXQmJmt0KE0pfSxyLl90cl90YWxseT1mdW5jdGlvbihNLFkscHQpe3JldHVybiBNLnBlbmRpbmdfYnVmW00uZF9idWYrMipNLmxhc3RfbGl0XT1ZPj4+OCYyNTUsTS5wZW5kaW5nX2J1ZltNLmRfYnVmKzIqTS5sYXN0X2xpdCsxXT0yNTUmWSxNLnBlbmRpbmdfYnVmW00ubF9idWYrTS5sYXN0X2xpdF09MjU1JnB0LE0ubGFzdF9saXQrKyxZPT09MD9NLmR5bl9sdHJlZVsyKnB0XSsrOihNLm1hdGNoZXMrKyxZLS0sTS5keW5fbHRyZWVbMiooeVtwdF0rdisxKV0rKyxNLmR5bl9kdHJlZVsyKnEoWSldKyspLE0ubGFzdF9saXQ9PT1NLmxpdF9idWZzaXplLTF9LHIuX3RyX2FsaWduPWZ1bmN0aW9uKE0pe0ooTSwyLDMpLHR0KE0saCxldCksZnVuY3Rpb24oWSl7WS5iaV92YWxpZD09PTE2PyhhdChZLFkuYmlfYnVmKSxZLmJpX2J1Zj0wLFkuYmlfdmFsaWQ9MCk6ODw9WS5iaV92YWxpZCYmKFkucGVuZGluZ19idWZbWS5wZW5kaW5nKytdPTI1NSZZLmJpX2J1ZixZLmJpX2J1Zj4+PTgsWS5iaV92YWxpZC09OCl9KE0pfX0seyIuLi91dGlscy9jb21tb24iOjQxfV0sNTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH19LHt9XSw1NDpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihuKXsoZnVuY3Rpb24ocyxhKXsidXNlIHN0cmljdCI7aWYoIXMuc2V0SW1tZWRpYXRlKXt2YXIgbCx1LHAsdixtPTEsZz17fSxUPSExLHc9cy5kb2N1bWVudCxrPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHMpO2s9ayYmay5zZXRUaW1lb3V0P2s6cyxsPXt9LnRvU3RyaW5nLmNhbGwocy5wcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIj9mdW5jdGlvbihvKXtwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7RihvKX0pfTpmdW5jdGlvbigpe2lmKHMucG9zdE1lc3NhZ2UmJiFzLmltcG9ydFNjcmlwdHMpe3ZhciBvPSEwLGY9cy5vbm1lc3NhZ2U7cmV0dXJuIHMub25tZXNzYWdlPWZ1bmN0aW9uKCl7bz0hMX0scy5wb3N0TWVzc2FnZSgiIiwiKiIpLHMub25tZXNzYWdlPWYsb319KCk/KHY9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHMuYWRkRXZlbnRMaXN0ZW5lcj9zLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGgsITEpOnMuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsaCksZnVuY3Rpb24obyl7cy5wb3N0TWVzc2FnZSh2K28sIioiKX0pOnMuTWVzc2FnZUNoYW5uZWw/KChwPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKG8pe0Yoby5kYXRhKX0sZnVuY3Rpb24obyl7cC5wb3J0Mi5wb3N0TWVzc2FnZShvKX0pOncmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gdy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8odT13LmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihvKXt2YXIgZj13LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Yub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7RihvKSxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHUucmVtb3ZlQ2hpbGQoZiksZj1udWxsfSx1LmFwcGVuZENoaWxkKGYpfSk6ZnVuY3Rpb24obyl7c2V0VGltZW91dChGLDAsbyl9LGsuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKG8pe3R5cGVvZiBvIT0iZnVuY3Rpb24iJiYobz1uZXcgRnVuY3Rpb24oIiIrbykpO2Zvcih2YXIgZj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxDPTA7QzxmLmxlbmd0aDtDKyspZltDXT1hcmd1bWVudHNbQysxXTt2YXIgQj17Y2FsbGJhY2s6byxhcmdzOmZ9O3JldHVybiBnW21dPUIsbChtKSxtKyt9LGsuY2xlYXJJbW1lZGlhdGU9UH1mdW5jdGlvbiBQKG8pe2RlbGV0ZSBnW29dfWZ1bmN0aW9uIEYobyl7aWYoVClzZXRUaW1lb3V0KEYsMCxvKTtlbHNle3ZhciBmPWdbb107aWYoZil7VD0hMDt0cnl7KGZ1bmN0aW9uKEMpe3ZhciBCPUMuY2FsbGJhY2ssYz1DLmFyZ3M7c3dpdGNoKGMubGVuZ3RoKXtjYXNlIDA6QigpO2JyZWFrO2Nhc2UgMTpCKGNbMF0pO2JyZWFrO2Nhc2UgMjpCKGNbMF0sY1sxXSk7YnJlYWs7Y2FzZSAzOkIoY1swXSxjWzFdLGNbMl0pO2JyZWFrO2RlZmF1bHQ6Qi5hcHBseShhLGMpfX0pKGYpfWZpbmFsbHl7UChvKSxUPSExfX19fWZ1bmN0aW9uIGgobyl7by5zb3VyY2U9PT1zJiZ0eXBlb2Ygby5kYXRhPT0ic3RyaW5nIiYmby5kYXRhLmluZGV4T2Yodik9PT0wJiZGKCtvLmRhdGEuc2xpY2Uodi5sZW5ndGgpKX19KSh0eXBlb2Ygc2VsZj4idSI/bj09PXZvaWQgMD90aGlzOm46c2VsZil9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp7fSl9LHt9XX0se30sWzEwXSkoMTApfSl9KTt2YXIgYWU9X2EoKGthLGhuKT0+eyhmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt0eXBlb2YgaG49PSJvYmplY3QiJiZ0eXBlb2YgaG4uZXhwb3J0cz09Im9iamVjdCI/aG4uZXhwb3J0cz10LmRvY3VtZW50P2UodCwhMCk6ZnVuY3Rpb24ocil7aWYoIXIuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGUocil9OmUodCl9KSh0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6a2EsZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7dmFyIHI9W10sbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yscz1yLnNsaWNlLGE9ci5mbGF0P2Z1bmN0aW9uKGkpe3JldHVybiByLmZsYXQuY2FsbChpKX06ZnVuY3Rpb24oaSl7cmV0dXJuIHIuY29uY2F0LmFwcGx5KFtdLGkpfSxsPXIucHVzaCx1PXIuaW5kZXhPZixwPXt9LHY9cC50b1N0cmluZyxtPXAuaGFzT3duUHJvcGVydHksZz1tLnRvU3RyaW5nLFQ9Zy5jYWxsKE9iamVjdCksdz17fSxrPWZ1bmN0aW9uKGQpe3JldHVybiB0eXBlb2YgZD09ImZ1bmN0aW9uIiYmdHlwZW9mIGQubm9kZVR5cGUhPSJudW1iZXIiJiZ0eXBlb2YgZC5pdGVtIT0iZnVuY3Rpb24ifSxQPWZ1bmN0aW9uKGQpe3JldHVybiBkIT1udWxsJiZkPT09ZC53aW5kb3d9LEY9dC5kb2N1bWVudCxoPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbyhpLGQsYil7Yj1ifHxGO3ZhciB4LEEsST1iLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKEkudGV4dD1pLGQpZm9yKHggaW4gaClBPWRbeF18fGQuZ2V0QXR0cmlidXRlJiZkLmdldEF0dHJpYnV0ZSh4KSxBJiZJLnNldEF0dHJpYnV0ZSh4LEEpO2IuaGVhZC5hcHBlbmRDaGlsZChJKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEkpfWZ1bmN0aW9uIGYoaSl7cmV0dXJuIGk9PW51bGw/aSsiIjp0eXBlb2YgaT09Im9iamVjdCJ8fHR5cGVvZiBpPT0iZnVuY3Rpb24iP3Bbdi5jYWxsKGkpXXx8Im9iamVjdCI6dHlwZW9mIGl9dmFyIEM9IjMuNy4xIixCPS9IVE1MJC9pLGM9ZnVuY3Rpb24oaSxkKXtyZXR1cm4gbmV3IGMuZm4uaW5pdChpLGQpfTtjLmZuPWMucHJvdG90eXBlPXtqcXVlcnk6Qyxjb25zdHJ1Y3RvcjpjLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PW51bGw/cy5jYWxsKHRoaXMpOmk8MD90aGlzW2krdGhpcy5sZW5ndGhdOnRoaXNbaV19LHB1c2hTdGFjazpmdW5jdGlvbihpKXt2YXIgZD1jLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxpKTtyZXR1cm4gZC5wcmV2T2JqZWN0PXRoaXMsZH0sZWFjaDpmdW5jdGlvbihpKXtyZXR1cm4gYy5lYWNoKHRoaXMsaSl9LG1hcDpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5tYXAodGhpcyxmdW5jdGlvbihkLGIpe3JldHVybiBpLmNhbGwoZCxiLGQpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5ncmVwKHRoaXMsZnVuY3Rpb24oaSxkKXtyZXR1cm4oZCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5ncmVwKHRoaXMsZnVuY3Rpb24oaSxkKXtyZXR1cm4gZCUyfSkpfSxlcTpmdW5jdGlvbihpKXt2YXIgZD10aGlzLmxlbmd0aCxiPStpKyhpPDA/ZDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYj49MCYmYjxkP1t0aGlzW2JdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpsLHNvcnQ6ci5zb3J0LHNwbGljZTpyLnNwbGljZX0sYy5leHRlbmQ9Yy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgaSxkLGIseCxBLEksTz1hcmd1bWVudHNbMF18fHt9LCQ9MSxVPWFyZ3VtZW50cy5sZW5ndGgsUT0hMTtmb3IodHlwZW9mIE89PSJib29sZWFuIiYmKFE9TyxPPWFyZ3VtZW50c1skXXx8e30sJCsrKSx0eXBlb2YgTyE9Im9iamVjdCImJiFrKE8pJiYoTz17fSksJD09PVUmJihPPXRoaXMsJC0tKTskPFU7JCsrKWlmKChpPWFyZ3VtZW50c1skXSkhPW51bGwpZm9yKGQgaW4gaSl4PWlbZF0sIShkPT09Il9fcHJvdG9fXyJ8fE89PT14KSYmKFEmJngmJihjLmlzUGxhaW5PYmplY3QoeCl8fChBPUFycmF5LmlzQXJyYXkoeCkpKT8oYj1PW2RdLEEmJiFBcnJheS5pc0FycmF5KGIpP0k9W106IUEmJiFjLmlzUGxhaW5PYmplY3QoYik/ST17fTpJPWIsQT0hMSxPW2RdPWMuZXh0ZW5kKFEsSSx4KSk6eCE9PXZvaWQgMCYmKE9bZF09eCkpO3JldHVybiBPfSxjLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoQytNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGkpe3Rocm93IG5ldyBFcnJvcihpKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihpKXt2YXIgZCxiO3JldHVybiFpfHx2LmNhbGwoaSkhPT0iW29iamVjdCBPYmplY3RdIj8hMTooZD1uKGkpLGQ/KGI9bS5jYWxsKGQsImNvbnN0cnVjdG9yIikmJmQuY29uc3RydWN0b3IsdHlwZW9mIGI9PSJmdW5jdGlvbiImJmcuY2FsbChiKT09PVQpOiEwKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihpKXt2YXIgZDtmb3IoZCBpbiBpKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGksZCxiKXtvKGkse25vbmNlOmQmJmQubm9uY2V9LGIpfSxlYWNoOmZ1bmN0aW9uKGksZCl7dmFyIGIseD0wO2lmKHooaSkpZm9yKGI9aS5sZW5ndGg7eDxiJiZkLmNhbGwoaVt4XSx4LGlbeF0pIT09ITE7eCsrKTtlbHNlIGZvcih4IGluIGkpaWYoZC5jYWxsKGlbeF0seCxpW3hdKT09PSExKWJyZWFrO3JldHVybiBpfSx0ZXh0OmZ1bmN0aW9uKGkpe3ZhciBkLGI9IiIseD0wLEE9aS5ub2RlVHlwZTtpZighQSlmb3IoO2Q9aVt4KytdOyliKz1jLnRleHQoZCk7cmV0dXJuIEE9PT0xfHxBPT09MTE/aS50ZXh0Q29udGVudDpBPT09OT9pLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudDpBPT09M3x8QT09PTQ/aS5ub2RlVmFsdWU6Yn0sbWFrZUFycmF5OmZ1bmN0aW9uKGksZCl7dmFyIGI9ZHx8W107cmV0dXJuIGkhPW51bGwmJih6KE9iamVjdChpKSk/Yy5tZXJnZShiLHR5cGVvZiBpPT0ic3RyaW5nIj9baV06aSk6bC5jYWxsKGIsaSkpLGJ9LGluQXJyYXk6ZnVuY3Rpb24oaSxkLGIpe3JldHVybiBkPT1udWxsPy0xOnUuY2FsbChkLGksYil9LGlzWE1MRG9jOmZ1bmN0aW9uKGkpe3ZhciBkPWkmJmkubmFtZXNwYWNlVVJJLGI9aSYmKGkub3duZXJEb2N1bWVudHx8aSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFCLnRlc3QoZHx8YiYmYi5ub2RlTmFtZXx8IkhUTUwiKX0sbWVyZ2U6ZnVuY3Rpb24oaSxkKXtmb3IodmFyIGI9K2QubGVuZ3RoLHg9MCxBPWkubGVuZ3RoO3g8Yjt4KyspaVtBKytdPWRbeF07cmV0dXJuIGkubGVuZ3RoPUEsaX0sZ3JlcDpmdW5jdGlvbihpLGQsYil7Zm9yKHZhciB4LEE9W10sST0wLE89aS5sZW5ndGgsJD0hYjtJPE87SSsrKXg9IWQoaVtJXSxJKSx4IT09JCYmQS5wdXNoKGlbSV0pO3JldHVybiBBfSxtYXA6ZnVuY3Rpb24oaSxkLGIpe3ZhciB4LEEsST0wLE89W107aWYoeihpKSlmb3IoeD1pLmxlbmd0aDtJPHg7SSsrKUE9ZChpW0ldLEksYiksQSE9bnVsbCYmTy5wdXNoKEEpO2Vsc2UgZm9yKEkgaW4gaSlBPWQoaVtJXSxJLGIpLEEhPW51bGwmJk8ucHVzaChBKTtyZXR1cm4gYShPKX0sZ3VpZDoxLHN1cHBvcnQ6d30pLHR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJihjLmZuW1N5bWJvbC5pdGVyYXRvcl09cltTeW1ib2wuaXRlcmF0b3JdKSxjLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGksZCl7cFsiW29iamVjdCAiK2QrIl0iXT1kLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB6KGkpe3ZhciBkPSEhaSYmImxlbmd0aCJpbiBpJiZpLmxlbmd0aCxiPWYoaSk7cmV0dXJuIGsoaSl8fFAoaSk/ITE6Yj09PSJhcnJheSJ8fGQ9PT0wfHx0eXBlb2YgZD09Im51bWJlciImJmQ+MCYmZC0xIGluIGl9ZnVuY3Rpb24gRyhpLGQpe3JldHVybiBpLm5vZGVOYW1lJiZpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1kLnRvTG93ZXJDYXNlKCl9dmFyIGV0PXIucG9wLEU9ci5zb3J0LFo9ci5zcGxpY2UseT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsXz1uZXcgUmVnRXhwKCJeIit5KyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK3krIiskIiwiZyIpO2MuY29udGFpbnM9ZnVuY3Rpb24oaSxkKXt2YXIgYj1kJiZkLnBhcmVudE5vZGU7cmV0dXJuIGk9PT1ifHwhIShiJiZiLm5vZGVUeXBlPT09MSYmKGkuY29udGFpbnM/aS5jb250YWlucyhiKTppLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZpLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KSl9O3ZhciBTPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXHg4MC1cdUZGRkZcdy1dL2c7ZnVuY3Rpb24gTihpLGQpe3JldHVybiBkP2k9PT0iXDAiPyJcdUZGRkQiOmkuc2xpY2UoMCwtMSkrIlxcIitpLmNoYXJDb2RlQXQoaS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2l9Yy5lc2NhcGVTZWxlY3Rvcj1mdW5jdGlvbihpKXtyZXR1cm4oaSsiIikucmVwbGFjZShTLE4pfTt2YXIgUj1GLEw9bDsoZnVuY3Rpb24oKXt2YXIgaSxkLGIseCxBLEk9TCxPLCQsVSxRLGR0LGZ0PWMuZXhwYW5kbyxpdD0wLHd0PTAsT3Q9ZG4oKSxHdD1kbigpLE10PWRuKCksbGU9ZG4oKSxvZT1mdW5jdGlvbihWLEspe3JldHVybiBWPT09SyYmKEE9ITApLDB9LE1lPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsVmU9Iig/OlxcXFxbXFxkYS1mQS1GXXsxLDZ9Iit5KyI/fFxcXFxbXlxcclxcblxcZl18W1xcdy1dfFteXDAtXFx4N2ZdKSsiLHF0PSJcXFsiK3krIiooIitWZSsiKSg/OiIreSsiKihbKl4kfCF+XT89KSIreStgKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfCIoKD86XFxcXC58W15cXFxcIl0pKikifChgK1ZlKyIpKXwpIit5KyIqXFxdIix1cj0iOigiK1ZlK2ApKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3wiKCg/OlxcXFwufFteXFxcXCJdKSopIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18YCtxdCsiKSopfC4qKVxcKXwpIixYdD1uZXcgUmVnRXhwKHkrIisiLCJnIiksbmU9bmV3IFJlZ0V4cCgiXiIreSsiKiwiK3krIioiKSxNcj1uZXcgUmVnRXhwKCJeIit5KyIqKFs+K35dfCIreSsiKSIreSsiKiIpLFluPW5ldyBSZWdFeHAoeSsifD4iKSxIZT1uZXcgUmVnRXhwKHVyKSxWcj1uZXcgUmVnRXhwKCJeIitWZSsiJCIpLFdlPXtJRDpuZXcgUmVnRXhwKCJeIygiK1ZlKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1ZlKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitWZSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK3F0KSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrdXIpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIreSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIreSsiKig/OihbKy1dfCkiK3krIiooXFxkKyl8KSkiK3krIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK01lKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIreSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIit5KyIqKCg/Oi1cXGQpP1xcZCopIit5KyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxRZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEplPS9eaFxkJC9pLERlPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sUW49L1srfl0vLFhlPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9Iit5KyI/fFxcXFwoW15cXHJcXG5cXGZdKSIsImciKSwkZT1mdW5jdGlvbihWLEspe3ZhciBudD0iMHgiK1Yuc2xpY2UoMSktNjU1MzY7cmV0dXJuIEt8fChudDwwP1N0cmluZy5mcm9tQ2hhckNvZGUobnQrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobnQ+PjEwfDU1Mjk2LG50JjEwMjN8NTYzMjApKX0sVG89ZnVuY3Rpb24oKXt0cigpfSxrbz1jbihmdW5jdGlvbihWKXtyZXR1cm4gVi5kaXNhYmxlZD09PSEwJiZHKFYsImZpZWxkc2V0Iil9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTtmdW5jdGlvbiBTbygpe3RyeXtyZXR1cm4gTy5hY3RpdmVFbGVtZW50fWNhdGNoe319dHJ5e0kuYXBwbHkocj1zLmNhbGwoUi5jaGlsZE5vZGVzKSxSLmNoaWxkTm9kZXMpLHJbUi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2h7ST17YXBwbHk6ZnVuY3Rpb24oSyxudCl7TC5hcHBseShLLHMuY2FsbChudCkpfSxjYWxsOmZ1bmN0aW9uKEspe0wuYXBwbHkoSyxzLmNhbGwoYXJndW1lbnRzLDEpKX19fWZ1bmN0aW9uIFl0KFYsSyxudCxsdCl7dmFyIGN0LF90LFN0LFB0LER0LFZ0LE50LEV0PUsmJksub3duZXJEb2N1bWVudCxIdD1LP0subm9kZVR5cGU6OTtpZihudD1udHx8W10sdHlwZW9mIFYhPSJzdHJpbmcifHwhVnx8SHQhPT0xJiZIdCE9PTkmJkh0IT09MTEpcmV0dXJuIG50O2lmKCFsdCYmKHRyKEspLEs9S3x8TyxVKSl7aWYoSHQhPT0xMSYmKER0PURlLmV4ZWMoVikpKWlmKGN0PUR0WzFdKXtpZihIdD09PTkpaWYoU3Q9Sy5nZXRFbGVtZW50QnlJZChjdCkpe2lmKFN0LmlkPT09Y3QpcmV0dXJuIEkuY2FsbChudCxTdCksbnR9ZWxzZSByZXR1cm4gbnQ7ZWxzZSBpZihFdCYmKFN0PUV0LmdldEVsZW1lbnRCeUlkKGN0KSkmJll0LmNvbnRhaW5zKEssU3QpJiZTdC5pZD09PWN0KXJldHVybiBJLmNhbGwobnQsU3QpLG50fWVsc2V7aWYoRHRbMl0pcmV0dXJuIEkuYXBwbHkobnQsSy5nZXRFbGVtZW50c0J5VGFnTmFtZShWKSksbnQ7aWYoKGN0PUR0WzNdKSYmSy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBJLmFwcGx5KG50LEsuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjdCkpLG50fWlmKCFsZVtWKyIgIl0mJighUXx8IVEudGVzdChWKSkpe2lmKE50PVYsRXQ9SyxIdD09PTEmJihZbi50ZXN0KFYpfHxNci50ZXN0KFYpKSl7Zm9yKEV0PVFuLnRlc3QoVikmJkpuKEsucGFyZW50Tm9kZSl8fEssKEV0IT1LfHwhdy5zY29wZSkmJigoUHQ9Sy5nZXRBdHRyaWJ1dGUoImlkIikpP1B0PWMuZXNjYXBlU2VsZWN0b3IoUHQpOksuc2V0QXR0cmlidXRlKCJpZCIsUHQ9ZnQpKSxWdD1IcihWKSxfdD1WdC5sZW5ndGg7X3QtLTspVnRbX3RdPShQdD8iIyIrUHQ6IjpzY29wZSIpKyIgIit1bihWdFtfdF0pO050PVZ0LmpvaW4oIiwiKX10cnl7cmV0dXJuIEkuYXBwbHkobnQsRXQucXVlcnlTZWxlY3RvckFsbChOdCkpLG50fWNhdGNoe2xlKFYsITApfWZpbmFsbHl7UHQ9PT1mdCYmSy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gd2EoVi5yZXBsYWNlKF8sIiQxIiksSyxudCxsdCl9ZnVuY3Rpb24gZG4oKXt2YXIgVj1bXTtmdW5jdGlvbiBLKG50LGx0KXtyZXR1cm4gVi5wdXNoKG50KyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIEtbVi5zaGlmdCgpXSxLW250KyIgIl09bHR9cmV0dXJuIEt9ZnVuY3Rpb24gTGUoVil7cmV0dXJuIFZbZnRdPSEwLFZ9ZnVuY3Rpb24gX3IoVil7dmFyIEs9Ty5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIVYoSyl9Y2F0Y2h7cmV0dXJuITF9ZmluYWxseXtLLnBhcmVudE5vZGUmJksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChLKSxLPW51bGx9fWZ1bmN0aW9uIERvKFYpe3JldHVybiBmdW5jdGlvbihLKXtyZXR1cm4gRyhLLCJpbnB1dCIpJiZLLnR5cGU9PT1WfX1mdW5jdGlvbiBBbyhWKXtyZXR1cm4gZnVuY3Rpb24oSyl7cmV0dXJuKEcoSywiaW5wdXQiKXx8RyhLLCJidXR0b24iKSkmJksudHlwZT09PVZ9fWZ1bmN0aW9uIGdhKFYpe3JldHVybiBmdW5jdGlvbihLKXtyZXR1cm4iZm9ybSJpbiBLP0sucGFyZW50Tm9kZSYmSy5kaXNhYmxlZD09PSExPyJsYWJlbCJpbiBLPyJsYWJlbCJpbiBLLnBhcmVudE5vZGU/Sy5wYXJlbnROb2RlLmRpc2FibGVkPT09VjpLLmRpc2FibGVkPT09VjpLLmlzRGlzYWJsZWQ9PT1WfHxLLmlzRGlzYWJsZWQhPT0hViYma28oSyk9PT1WOksuZGlzYWJsZWQ9PT1WOiJsYWJlbCJpbiBLP0suZGlzYWJsZWQ9PT1WOiExfX1mdW5jdGlvbiBjcihWKXtyZXR1cm4gTGUoZnVuY3Rpb24oSyl7cmV0dXJuIEs9K0ssTGUoZnVuY3Rpb24obnQsbHQpe2Zvcih2YXIgY3QsX3Q9VihbXSxudC5sZW5ndGgsSyksU3Q9X3QubGVuZ3RoO1N0LS07KW50W2N0PV90W1N0XV0mJihudFtjdF09IShsdFtjdF09bnRbY3RdKSl9KX0pfWZ1bmN0aW9uIEpuKFYpe3JldHVybiBWJiZ0eXBlb2YgVi5nZXRFbGVtZW50c0J5VGFnTmFtZTwidSImJlZ9ZnVuY3Rpb24gdHIoVil7dmFyIEssbnQ9Vj9WLm93bmVyRG9jdW1lbnR8fFY6UjtyZXR1cm4gbnQ9PU98fG50Lm5vZGVUeXBlIT09OXx8IW50LmRvY3VtZW50RWxlbWVudHx8KE89bnQsJD1PLmRvY3VtZW50RWxlbWVudCxVPSFjLmlzWE1MRG9jKE8pLGR0PSQubWF0Y2hlc3x8JC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fCQubXNNYXRjaGVzU2VsZWN0b3IsJC5tc01hdGNoZXNTZWxlY3RvciYmUiE9TyYmKEs9Ty5kZWZhdWx0VmlldykmJksudG9wIT09SyYmSy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLFRvKSx3LmdldEJ5SWQ9X3IoZnVuY3Rpb24obHQpe3JldHVybiAkLmFwcGVuZENoaWxkKGx0KS5pZD1jLmV4cGFuZG8sIU8uZ2V0RWxlbWVudHNCeU5hbWV8fCFPLmdldEVsZW1lbnRzQnlOYW1lKGMuZXhwYW5kbykubGVuZ3RofSksdy5kaXNjb25uZWN0ZWRNYXRjaD1fcihmdW5jdGlvbihsdCl7cmV0dXJuIGR0LmNhbGwobHQsIioiKX0pLHcuc2NvcGU9X3IoZnVuY3Rpb24oKXtyZXR1cm4gTy5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUiKX0pLHcuY3NzSGFzPV9yKGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPLnF1ZXJ5U2VsZWN0b3IoIjpoYXMoKiw6anFmYWtlKSIpLCExfWNhdGNoe3JldHVybiEwfX0pLHcuZ2V0QnlJZD8oZC5maWx0ZXIuSUQ9ZnVuY3Rpb24obHQpe3ZhciBjdD1sdC5yZXBsYWNlKFhlLCRlKTtyZXR1cm4gZnVuY3Rpb24oX3Qpe3JldHVybiBfdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1jdH19LGQuZmluZC5JRD1mdW5jdGlvbihsdCxjdCl7aWYodHlwZW9mIGN0LmdldEVsZW1lbnRCeUlkPCJ1IiYmVSl7dmFyIF90PWN0LmdldEVsZW1lbnRCeUlkKGx0KTtyZXR1cm4gX3Q/W190XTpbXX19KTooZC5maWx0ZXIuSUQ9ZnVuY3Rpb24obHQpe3ZhciBjdD1sdC5yZXBsYWNlKFhlLCRlKTtyZXR1cm4gZnVuY3Rpb24oX3Qpe3ZhciBTdD10eXBlb2YgX3QuZ2V0QXR0cmlidXRlTm9kZTwidSImJl90LmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIFN0JiZTdC52YWx1ZT09PWN0fX0sZC5maW5kLklEPWZ1bmN0aW9uKGx0LGN0KXtpZih0eXBlb2YgY3QuZ2V0RWxlbWVudEJ5SWQ8InUiJiZVKXt2YXIgX3QsU3QsUHQsRHQ9Y3QuZ2V0RWxlbWVudEJ5SWQobHQpO2lmKER0KXtpZihfdD1EdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLF90JiZfdC52YWx1ZT09PWx0KXJldHVybltEdF07Zm9yKFB0PWN0LmdldEVsZW1lbnRzQnlOYW1lKGx0KSxTdD0wO0R0PVB0W1N0KytdOylpZihfdD1EdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLF90JiZfdC52YWx1ZT09PWx0KXJldHVybltEdF19cmV0dXJuW119fSksZC5maW5kLlRBRz1mdW5jdGlvbihsdCxjdCl7cmV0dXJuIHR5cGVvZiBjdC5nZXRFbGVtZW50c0J5VGFnTmFtZTwidSI/Y3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUobHQpOmN0LnF1ZXJ5U2VsZWN0b3JBbGwobHQpfSxkLmZpbmQuQ0xBU1M9ZnVuY3Rpb24obHQsY3Qpe2lmKHR5cGVvZiBjdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPCJ1IiYmVSlyZXR1cm4gY3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsdCl9LFE9W10sX3IoZnVuY3Rpb24obHQpe3ZhciBjdDskLmFwcGVuZENoaWxkKGx0KS5pbm5lckhUTUw9IjxhIGlkPSciK2Z0KyInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBpZD0nIitmdCsiLVxyXFwnIGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fFEucHVzaCgiXFxbIit5KyIqKD86dmFsdWV8IitNZSsiKSIpLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitmdCsiLV0iKS5sZW5ndGh8fFEucHVzaCgifj0iKSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrZnQrIisqIikubGVuZ3RofHxRLnB1c2goIi4jLitbK35dIiksbHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fFEucHVzaCgiOmNoZWNrZWQiKSxjdD1PLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksY3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksbHQuYXBwZW5kQ2hpbGQoY3QpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSwkLmFwcGVuZENoaWxkKGx0KS5kaXNhYmxlZD0hMCxsdC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGghPT0yJiZRLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksY3Q9Ty5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGN0LnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGx0LmFwcGVuZENoaWxkKGN0KSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fFEucHVzaCgiXFxbIit5KyIqbmFtZSIreSsiKj0iK3krYCooPzonJ3wiIilgKX0pLHcuY3NzSGFzfHxRLnB1c2goIjpoYXMiKSxRPVEubGVuZ3RoJiZuZXcgUmVnRXhwKFEuam9pbigifCIpKSxvZT1mdW5jdGlvbihsdCxjdCl7aWYobHQ9PT1jdClyZXR1cm4gQT0hMCwwO3ZhciBfdD0hbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWN0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBfdHx8KF90PShsdC5vd25lckRvY3VtZW50fHxsdCk9PShjdC5vd25lckRvY3VtZW50fHxjdCk/bHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY3QpOjEsX3QmMXx8IXcuc29ydERldGFjaGVkJiZjdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsdCk9PT1fdD9sdD09PU98fGx0Lm93bmVyRG9jdW1lbnQ9PVImJll0LmNvbnRhaW5zKFIsbHQpPy0xOmN0PT09T3x8Y3Qub3duZXJEb2N1bWVudD09UiYmWXQuY29udGFpbnMoUixjdCk/MTp4P3UuY2FsbCh4LGx0KS11LmNhbGwoeCxjdCk6MDpfdCY0Py0xOjEpfSksT31ZdC5tYXRjaGVzPWZ1bmN0aW9uKFYsSyl7cmV0dXJuIFl0KFYsbnVsbCxudWxsLEspfSxZdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oVixLKXtpZih0cihWKSxVJiYhbGVbSysiICJdJiYoIVF8fCFRLnRlc3QoSykpKXRyeXt2YXIgbnQ9ZHQuY2FsbChWLEspO2lmKG50fHx3LmRpc2Nvbm5lY3RlZE1hdGNofHxWLmRvY3VtZW50JiZWLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIG50fWNhdGNoe2xlKEssITApfXJldHVybiBZdChLLE8sbnVsbCxbVl0pLmxlbmd0aD4wfSxZdC5jb250YWlucz1mdW5jdGlvbihWLEspe3JldHVybihWLm93bmVyRG9jdW1lbnR8fFYpIT1PJiZ0cihWKSxjLmNvbnRhaW5zKFYsSyl9LFl0LmF0dHI9ZnVuY3Rpb24oVixLKXsoVi5vd25lckRvY3VtZW50fHxWKSE9TyYmdHIoVik7dmFyIG50PWQuYXR0ckhhbmRsZVtLLnRvTG93ZXJDYXNlKCldLGx0PW50JiZtLmNhbGwoZC5hdHRySGFuZGxlLEsudG9Mb3dlckNhc2UoKSk/bnQoVixLLCFVKTp2b2lkIDA7cmV0dXJuIGx0IT09dm9pZCAwP2x0OlYuZ2V0QXR0cmlidXRlKEspfSxZdC5lcnJvcj1mdW5jdGlvbihWKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrVil9LGMudW5pcXVlU29ydD1mdW5jdGlvbihWKXt2YXIgSyxudD1bXSxsdD0wLGN0PTA7aWYoQT0hdy5zb3J0U3RhYmxlLHg9IXcuc29ydFN0YWJsZSYmcy5jYWxsKFYsMCksRS5jYWxsKFYsb2UpLEEpe2Zvcig7Sz1WW2N0KytdOylLPT09VltjdF0mJihsdD1udC5wdXNoKGN0KSk7Zm9yKDtsdC0tOylaLmNhbGwoVixudFtsdF0sMSl9cmV0dXJuIHg9bnVsbCxWfSxjLmZuLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy51bmlxdWVTb3J0KHMuYXBwbHkodGhpcykpKX0sZD1jLmV4cHI9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpMZSxtYXRjaDpXZSxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oVil7cmV0dXJuIFZbMV09VlsxXS5yZXBsYWNlKFhlLCRlKSxWWzNdPShWWzNdfHxWWzRdfHxWWzVdfHwiIikucmVwbGFjZShYZSwkZSksVlsyXT09PSJ+PSImJihWWzNdPSIgIitWWzNdKyIgIiksVi5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihWKXtyZXR1cm4gVlsxXT1WWzFdLnRvTG93ZXJDYXNlKCksVlsxXS5zbGljZSgwLDMpPT09Im50aCI/KFZbM118fFl0LmVycm9yKFZbMF0pLFZbNF09KyhWWzRdP1ZbNV0rKFZbNl18fDEpOjIqKFZbM109PT0iZXZlbiJ8fFZbM109PT0ib2RkIikpLFZbNV09KyhWWzddK1ZbOF18fFZbM109PT0ib2RkIikpOlZbM10mJll0LmVycm9yKFZbMF0pLFZ9LFBTRVVETzpmdW5jdGlvbihWKXt2YXIgSyxudD0hVls2XSYmVlsyXTtyZXR1cm4gV2UuQ0hJTEQudGVzdChWWzBdKT9udWxsOihWWzNdP1ZbMl09Vls0XXx8Vls1XXx8IiI6bnQmJkhlLnRlc3QobnQpJiYoSz1IcihudCwhMCkpJiYoSz1udC5pbmRleE9mKCIpIixudC5sZW5ndGgtSyktbnQubGVuZ3RoKSYmKFZbMF09VlswXS5zbGljZSgwLEspLFZbMl09bnQuc2xpY2UoMCxLKSksVi5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKFYpe3ZhciBLPVYucmVwbGFjZShYZSwkZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4gVj09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihudCl7cmV0dXJuIEcobnQsSyl9fSxDTEFTUzpmdW5jdGlvbihWKXt2YXIgSz1PdFtWKyIgIl07cmV0dXJuIEt8fChLPW5ldyBSZWdFeHAoIihefCIreSsiKSIrVisiKCIreSsifCQpIikpJiZPdChWLGZ1bmN0aW9uKG50KXtyZXR1cm4gSy50ZXN0KHR5cGVvZiBudC5jbGFzc05hbWU9PSJzdHJpbmciJiZudC5jbGFzc05hbWV8fHR5cGVvZiBudC5nZXRBdHRyaWJ1dGU8InUiJiZudC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKFYsSyxudCl7cmV0dXJuIGZ1bmN0aW9uKGx0KXt2YXIgY3Q9WXQuYXR0cihsdCxWKTtyZXR1cm4gY3Q9PW51bGw/Sz09PSIhPSI6Sz8oY3QrPSIiLEs9PT0iPSI/Y3Q9PT1udDpLPT09IiE9Ij9jdCE9PW50Oks9PT0iXj0iP250JiZjdC5pbmRleE9mKG50KT09PTA6Sz09PSIqPSI/bnQmJmN0LmluZGV4T2YobnQpPi0xOks9PT0iJD0iP250JiZjdC5zbGljZSgtbnQubGVuZ3RoKT09PW50Oks9PT0ifj0iPygiICIrY3QucmVwbGFjZShYdCwiICIpKyIgIikuaW5kZXhPZihudCk+LTE6Sz09PSJ8PSI/Y3Q9PT1udHx8Y3Quc2xpY2UoMCxudC5sZW5ndGgrMSk9PT1udCsiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oVixLLG50LGx0LGN0KXt2YXIgX3Q9Vi5zbGljZSgwLDMpIT09Im50aCIsU3Q9Vi5zbGljZSgtNCkhPT0ibGFzdCIsUHQ9Sz09PSJvZi10eXBlIjtyZXR1cm4gbHQ9PT0xJiZjdD09PTA/ZnVuY3Rpb24oRHQpe3JldHVybiEhRHQucGFyZW50Tm9kZX06ZnVuY3Rpb24oRHQsVnQsTnQpe3ZhciBFdCxIdCxGdCxlZSxnZSx1ZT1fdCE9PVN0PyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsQWU9RHQucGFyZW50Tm9kZSxVZT1QdCYmRHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxDcj0hTnQmJiFQdCxjZT0hMTtpZihBZSl7aWYoX3Qpe2Zvcig7dWU7KXtmb3IoRnQ9RHQ7RnQ9RnRbdWVdOylpZihQdD9HKEZ0LFVlKTpGdC5ub2RlVHlwZT09PTEpcmV0dXJuITE7Z2U9dWU9Vj09PSJvbmx5IiYmIWdlJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGdlPVtTdD9BZS5maXJzdENoaWxkOkFlLmxhc3RDaGlsZF0sU3QmJkNyKXtmb3IoSHQ9QWVbZnRdfHwoQWVbZnRdPXt9KSxFdD1IdFtWXXx8W10sZWU9RXRbMF09PT1pdCYmRXRbMV0sY2U9ZWUmJkV0WzJdLEZ0PWVlJiZBZS5jaGlsZE5vZGVzW2VlXTtGdD0rK2VlJiZGdCYmRnRbdWVdfHwoY2U9ZWU9MCl8fGdlLnBvcCgpOylpZihGdC5ub2RlVHlwZT09PTEmJisrY2UmJkZ0PT09RHQpe0h0W1ZdPVtpdCxlZSxjZV07YnJlYWt9fWVsc2UgaWYoQ3ImJihIdD1EdFtmdF18fChEdFtmdF09e30pLEV0PUh0W1ZdfHxbXSxlZT1FdFswXT09PWl0JiZFdFsxXSxjZT1lZSksY2U9PT0hMSlmb3IoOyhGdD0rK2VlJiZGdCYmRnRbdWVdfHwoY2U9ZWU9MCl8fGdlLnBvcCgpKSYmISgoUHQ/RyhGdCxVZSk6RnQubm9kZVR5cGU9PT0xKSYmKytjZSYmKENyJiYoSHQ9RnRbZnRdfHwoRnRbZnRdPXt9KSxIdFtWXT1baXQsY2VdKSxGdD09PUR0KSk7KTtyZXR1cm4gY2UtPWN0LGNlPT09bHR8fGNlJWx0PT09MCYmY2UvbHQ+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKFYsSyl7dmFyIG50LGx0PWQucHNldWRvc1tWXXx8ZC5zZXRGaWx0ZXJzW1YudG9Mb3dlckNhc2UoKV18fFl0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrVik7cmV0dXJuIGx0W2Z0XT9sdChLKTpsdC5sZW5ndGg+MT8obnQ9W1YsViwiIixLXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoVi50b0xvd2VyQ2FzZSgpKT9MZShmdW5jdGlvbihjdCxfdCl7Zm9yKHZhciBTdCxQdD1sdChjdCxLKSxEdD1QdC5sZW5ndGg7RHQtLTspU3Q9dS5jYWxsKGN0LFB0W0R0XSksY3RbU3RdPSEoX3RbU3RdPVB0W0R0XSl9KTpmdW5jdGlvbihjdCl7cmV0dXJuIGx0KGN0LDAsbnQpfSk6bHR9fSxwc2V1ZG9zOntub3Q6TGUoZnVuY3Rpb24oVil7dmFyIEs9W10sbnQ9W10sbHQ9bmkoVi5yZXBsYWNlKF8sIiQxIikpO3JldHVybiBsdFtmdF0/TGUoZnVuY3Rpb24oY3QsX3QsU3QsUHQpe2Zvcih2YXIgRHQsVnQ9bHQoY3QsbnVsbCxQdCxbXSksTnQ9Y3QubGVuZ3RoO050LS07KShEdD1WdFtOdF0pJiYoY3RbTnRdPSEoX3RbTnRdPUR0KSl9KTpmdW5jdGlvbihjdCxfdCxTdCl7cmV0dXJuIEtbMF09Y3QsbHQoSyxudWxsLFN0LG50KSxLWzBdPW51bGwsIW50LnBvcCgpfX0pLGhhczpMZShmdW5jdGlvbihWKXtyZXR1cm4gZnVuY3Rpb24oSyl7cmV0dXJuIFl0KFYsSykubGVuZ3RoPjB9fSksY29udGFpbnM6TGUoZnVuY3Rpb24oVil7cmV0dXJuIFY9Vi5yZXBsYWNlKFhlLCRlKSxmdW5jdGlvbihLKXtyZXR1cm4oSy50ZXh0Q29udGVudHx8Yy50ZXh0KEspKS5pbmRleE9mKFYpPi0xfX0pLGxhbmc6TGUoZnVuY3Rpb24oVil7cmV0dXJuIFZyLnRlc3QoVnx8IiIpfHxZdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitWKSxWPVYucmVwbGFjZShYZSwkZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihLKXt2YXIgbnQ7ZG8gaWYobnQ9VT9LLmxhbmc6Sy5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fEsuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG50PW50LnRvTG93ZXJDYXNlKCksbnQ9PT1WfHxudC5pbmRleE9mKFYrIi0iKT09PTA7d2hpbGUoKEs9Sy5wYXJlbnROb2RlKSYmSy5ub2RlVHlwZT09PTEpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihWKXt2YXIgSz10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIEsmJksuc2xpY2UoMSk9PT1WLmlkfSxyb290OmZ1bmN0aW9uKFYpe3JldHVybiBWPT09JH0sZm9jdXM6ZnVuY3Rpb24oVil7cmV0dXJuIFY9PT1TbygpJiZPLmhhc0ZvY3VzKCkmJiEhKFYudHlwZXx8Vi5ocmVmfHx+Vi50YWJJbmRleCl9LGVuYWJsZWQ6Z2EoITEpLGRpc2FibGVkOmdhKCEwKSxjaGVja2VkOmZ1bmN0aW9uKFYpe3JldHVybiBHKFYsImlucHV0IikmJiEhVi5jaGVja2VkfHxHKFYsIm9wdGlvbiIpJiYhIVYuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKFYpe3JldHVybiBWLnBhcmVudE5vZGUmJlYucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LFYuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oVil7Zm9yKFY9Vi5maXJzdENoaWxkO1Y7Vj1WLm5leHRTaWJsaW5nKWlmKFYubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKFYpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoVil9LGhlYWRlcjpmdW5jdGlvbihWKXtyZXR1cm4gSmUudGVzdChWLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oVil7cmV0dXJuIFFlLnRlc3QoVi5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihWKXtyZXR1cm4gRyhWLCJpbnB1dCIpJiZWLnR5cGU9PT0iYnV0dG9uInx8RyhWLCJidXR0b24iKX0sdGV4dDpmdW5jdGlvbihWKXt2YXIgSztyZXR1cm4gRyhWLCJpbnB1dCIpJiZWLnR5cGU9PT0idGV4dCImJigoSz1WLmdldEF0dHJpYnV0ZSgidHlwZSIpKT09bnVsbHx8Sy50b0xvd2VyQ2FzZSgpPT09InRleHQiKX0sZmlyc3Q6Y3IoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OmNyKGZ1bmN0aW9uKFYsSyl7cmV0dXJuW0stMV19KSxlcTpjcihmdW5jdGlvbihWLEssbnQpe3JldHVybltudDwwP250K0s6bnRdfSksZXZlbjpjcihmdW5jdGlvbihWLEspe2Zvcih2YXIgbnQ9MDtudDxLO250Kz0yKVYucHVzaChudCk7cmV0dXJuIFZ9KSxvZGQ6Y3IoZnVuY3Rpb24oVixLKXtmb3IodmFyIG50PTE7bnQ8SztudCs9MilWLnB1c2gobnQpO3JldHVybiBWfSksbHQ6Y3IoZnVuY3Rpb24oVixLLG50KXt2YXIgbHQ7Zm9yKG50PDA/bHQ9bnQrSzpudD5LP2x0PUs6bHQ9bnQ7LS1sdD49MDspVi5wdXNoKGx0KTtyZXR1cm4gVn0pLGd0OmNyKGZ1bmN0aW9uKFYsSyxudCl7Zm9yKHZhciBsdD1udDwwP250K0s6bnQ7KytsdDxLOylWLnB1c2gobHQpO3JldHVybiBWfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoaSBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbaV09RG8oaSk7Zm9yKGkgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbaV09QW8oaSk7ZnVuY3Rpb24geWEoKXt9eWEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyB5YTtmdW5jdGlvbiBIcihWLEspe3ZhciBudCxsdCxjdCxfdCxTdCxQdCxEdCxWdD1HdFtWKyIgIl07aWYoVnQpcmV0dXJuIEs/MDpWdC5zbGljZSgwKTtmb3IoU3Q9VixQdD1bXSxEdD1kLnByZUZpbHRlcjtTdDspeyghbnR8fChsdD1uZS5leGVjKFN0KSkpJiYobHQmJihTdD1TdC5zbGljZShsdFswXS5sZW5ndGgpfHxTdCksUHQucHVzaChjdD1bXSkpLG50PSExLChsdD1Nci5leGVjKFN0KSkmJihudD1sdC5zaGlmdCgpLGN0LnB1c2goe3ZhbHVlOm50LHR5cGU6bHRbMF0ucmVwbGFjZShfLCIgIil9KSxTdD1TdC5zbGljZShudC5sZW5ndGgpKTtmb3IoX3QgaW4gZC5maWx0ZXIpKGx0PVdlW190XS5leGVjKFN0KSkmJighRHRbX3RdfHwobHQ9RHRbX3RdKGx0KSkpJiYobnQ9bHQuc2hpZnQoKSxjdC5wdXNoKHt2YWx1ZTpudCx0eXBlOl90LG1hdGNoZXM6bHR9KSxTdD1TdC5zbGljZShudC5sZW5ndGgpKTtpZighbnQpYnJlYWt9cmV0dXJuIEs/U3QubGVuZ3RoOlN0P1l0LmVycm9yKFYpOkd0KFYsUHQpLnNsaWNlKDApfWZ1bmN0aW9uIHVuKFYpe2Zvcih2YXIgSz0wLG50PVYubGVuZ3RoLGx0PSIiO0s8bnQ7SysrKWx0Kz1WW0tdLnZhbHVlO3JldHVybiBsdH1mdW5jdGlvbiBjbihWLEssbnQpe3ZhciBsdD1LLmRpcixjdD1LLm5leHQsX3Q9Y3R8fGx0LFN0PW50JiZfdD09PSJwYXJlbnROb2RlIixQdD13dCsrO3JldHVybiBLLmZpcnN0P2Z1bmN0aW9uKER0LFZ0LE50KXtmb3IoO0R0PUR0W2x0XTspaWYoRHQubm9kZVR5cGU9PT0xfHxTdClyZXR1cm4gVihEdCxWdCxOdCk7cmV0dXJuITF9OmZ1bmN0aW9uKER0LFZ0LE50KXt2YXIgRXQsSHQsRnQ9W2l0LFB0XTtpZihOdCl7Zm9yKDtEdD1EdFtsdF07KWlmKChEdC5ub2RlVHlwZT09PTF8fFN0KSYmVihEdCxWdCxOdCkpcmV0dXJuITB9ZWxzZSBmb3IoO0R0PUR0W2x0XTspaWYoRHQubm9kZVR5cGU9PT0xfHxTdClpZihIdD1EdFtmdF18fChEdFtmdF09e30pLGN0JiZHKER0LGN0KSlEdD1EdFtsdF18fER0O2Vsc2V7aWYoKEV0PUh0W190XSkmJkV0WzBdPT09aXQmJkV0WzFdPT09UHQpcmV0dXJuIEZ0WzJdPUV0WzJdO2lmKEh0W190XT1GdCxGdFsyXT1WKER0LFZ0LE50KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gdGkoVil7cmV0dXJuIFYubGVuZ3RoPjE/ZnVuY3Rpb24oSyxudCxsdCl7Zm9yKHZhciBjdD1WLmxlbmd0aDtjdC0tOylpZighVltjdF0oSyxudCxsdCkpcmV0dXJuITE7cmV0dXJuITB9OlZbMF19ZnVuY3Rpb24gSW8oVixLLG50KXtmb3IodmFyIGx0PTAsY3Q9Sy5sZW5ndGg7bHQ8Y3Q7bHQrKylZdChWLEtbbHRdLG50KTtyZXR1cm4gbnR9ZnVuY3Rpb24gZm4oVixLLG50LGx0LGN0KXtmb3IodmFyIF90LFN0PVtdLFB0PTAsRHQ9Vi5sZW5ndGgsVnQ9SyE9bnVsbDtQdDxEdDtQdCsrKShfdD1WW1B0XSkmJighbnR8fG50KF90LGx0LGN0KSkmJihTdC5wdXNoKF90KSxWdCYmSy5wdXNoKFB0KSk7cmV0dXJuIFN0fWZ1bmN0aW9uIGVpKFYsSyxudCxsdCxjdCxfdCl7cmV0dXJuIGx0JiYhbHRbZnRdJiYobHQ9ZWkobHQpKSxjdCYmIWN0W2Z0XSYmKGN0PWVpKGN0LF90KSksTGUoZnVuY3Rpb24oU3QsUHQsRHQsVnQpe3ZhciBOdCxFdCxIdCxGdCxlZT1bXSxnZT1bXSx1ZT1QdC5sZW5ndGgsQWU9U3R8fElvKEt8fCIqIixEdC5ub2RlVHlwZT9bRHRdOkR0LFtdKSxVZT1WJiYoU3R8fCFLKT9mbihBZSxlZSxWLER0LFZ0KTpBZTtpZihudD8oRnQ9Y3R8fChTdD9WOnVlfHxsdCk/W106UHQsbnQoVWUsRnQsRHQsVnQpKTpGdD1VZSxsdClmb3IoTnQ9Zm4oRnQsZ2UpLGx0KE50LFtdLER0LFZ0KSxFdD1OdC5sZW5ndGg7RXQtLTspKEh0PU50W0V0XSkmJihGdFtnZVtFdF1dPSEoVWVbZ2VbRXRdXT1IdCkpO2lmKFN0KXtpZihjdHx8Vil7aWYoY3Qpe2ZvcihOdD1bXSxFdD1GdC5sZW5ndGg7RXQtLTspKEh0PUZ0W0V0XSkmJk50LnB1c2goVWVbRXRdPUh0KTtjdChudWxsLEZ0PVtdLE50LFZ0KX1mb3IoRXQ9RnQubGVuZ3RoO0V0LS07KShIdD1GdFtFdF0pJiYoTnQ9Y3Q/dS5jYWxsKFN0LEh0KTplZVtFdF0pPi0xJiYoU3RbTnRdPSEoUHRbTnRdPUh0KSl9fWVsc2UgRnQ9Zm4oRnQ9PT1QdD9GdC5zcGxpY2UodWUsRnQubGVuZ3RoKTpGdCksY3Q/Y3QobnVsbCxQdCxGdCxWdCk6SS5hcHBseShQdCxGdCl9KX1mdW5jdGlvbiByaShWKXtmb3IodmFyIEssbnQsbHQsY3Q9Vi5sZW5ndGgsX3Q9ZC5yZWxhdGl2ZVtWWzBdLnR5cGVdLFN0PV90fHxkLnJlbGF0aXZlWyIgIl0sUHQ9X3Q/MTowLER0PWNuKGZ1bmN0aW9uKEV0KXtyZXR1cm4gRXQ9PT1LfSxTdCwhMCksVnQ9Y24oZnVuY3Rpb24oRXQpe3JldHVybiB1LmNhbGwoSyxFdCk+LTF9LFN0LCEwKSxOdD1bZnVuY3Rpb24oRXQsSHQsRnQpe3ZhciBlZT0hX3QmJihGdHx8SHQhPWIpfHwoKEs9SHQpLm5vZGVUeXBlP0R0KEV0LEh0LEZ0KTpWdChFdCxIdCxGdCkpO3JldHVybiBLPW51bGwsZWV9XTtQdDxjdDtQdCsrKWlmKG50PWQucmVsYXRpdmVbVltQdF0udHlwZV0pTnQ9W2NuKHRpKE50KSxudCldO2Vsc2V7aWYobnQ9ZC5maWx0ZXJbVltQdF0udHlwZV0uYXBwbHkobnVsbCxWW1B0XS5tYXRjaGVzKSxudFtmdF0pe2ZvcihsdD0rK1B0O2x0PGN0JiYhZC5yZWxhdGl2ZVtWW2x0XS50eXBlXTtsdCsrKTtyZXR1cm4gZWkoUHQ+MSYmdGkoTnQpLFB0PjEmJnVuKFYuc2xpY2UoMCxQdC0xKS5jb25jYXQoe3ZhbHVlOlZbUHQtMl0udHlwZT09PSIgIj8iKiI6IiJ9KSkucmVwbGFjZShfLCIkMSIpLG50LFB0PGx0JiZyaShWLnNsaWNlKFB0LGx0KSksbHQ8Y3QmJnJpKFY9Vi5zbGljZShsdCkpLGx0PGN0JiZ1bihWKSl9TnQucHVzaChudCl9cmV0dXJuIHRpKE50KX1mdW5jdGlvbiBQbyhWLEspe3ZhciBudD1LLmxlbmd0aD4wLGx0PVYubGVuZ3RoPjAsY3Q9ZnVuY3Rpb24oX3QsU3QsUHQsRHQsVnQpe3ZhciBOdCxFdCxIdCxGdD0wLGVlPSIwIixnZT1fdCYmW10sdWU9W10sQWU9YixVZT1fdHx8bHQmJmQuZmluZC5UQUcoIioiLFZ0KSxDcj1pdCs9QWU9PW51bGw/MTpNYXRoLnJhbmRvbSgpfHwuMSxjZT1VZS5sZW5ndGg7Zm9yKFZ0JiYoYj1TdD09T3x8U3R8fFZ0KTtlZSE9PWNlJiYoTnQ9VWVbZWVdKSE9bnVsbDtlZSsrKXtpZihsdCYmTnQpe2ZvcihFdD0wLCFTdCYmTnQub3duZXJEb2N1bWVudCE9TyYmKHRyKE50KSxQdD0hVSk7SHQ9VltFdCsrXTspaWYoSHQoTnQsU3R8fE8sUHQpKXtJLmNhbGwoRHQsTnQpO2JyZWFrfVZ0JiYoaXQ9Q3IpfW50JiYoKE50PSFIdCYmTnQpJiZGdC0tLF90JiZnZS5wdXNoKE50KSl9aWYoRnQrPWVlLG50JiZlZSE9PUZ0KXtmb3IoRXQ9MDtIdD1LW0V0KytdOylIdChnZSx1ZSxTdCxQdCk7aWYoX3Qpe2lmKEZ0PjApZm9yKDtlZS0tOylnZVtlZV18fHVlW2VlXXx8KHVlW2VlXT1ldC5jYWxsKER0KSk7dWU9Zm4odWUpfUkuYXBwbHkoRHQsdWUpLFZ0JiYhX3QmJnVlLmxlbmd0aD4wJiZGdCtLLmxlbmd0aD4xJiZjLnVuaXF1ZVNvcnQoRHQpfXJldHVybiBWdCYmKGl0PUNyLGI9QWUpLGdlfTtyZXR1cm4gbnQ/TGUoY3QpOmN0fWZ1bmN0aW9uIG5pKFYsSyl7dmFyIG50LGx0PVtdLGN0PVtdLF90PU10W1YrIiAiXTtpZighX3Qpe2ZvcihLfHwoSz1IcihWKSksbnQ9Sy5sZW5ndGg7bnQtLTspX3Q9cmkoS1tudF0pLF90W2Z0XT9sdC5wdXNoKF90KTpjdC5wdXNoKF90KTtfdD1NdChWLFBvKGN0LGx0KSksX3Quc2VsZWN0b3I9Vn1yZXR1cm4gX3R9ZnVuY3Rpb24gd2EoVixLLG50LGx0KXt2YXIgY3QsX3QsU3QsUHQsRHQsVnQ9dHlwZW9mIFY9PSJmdW5jdGlvbiImJlYsTnQ9IWx0JiZIcihWPVZ0LnNlbGVjdG9yfHxWKTtpZihudD1udHx8W10sTnQubGVuZ3RoPT09MSl7aWYoX3Q9TnRbMF09TnRbMF0uc2xpY2UoMCksX3QubGVuZ3RoPjImJihTdD1fdFswXSkudHlwZT09PSJJRCImJksubm9kZVR5cGU9PT05JiZVJiZkLnJlbGF0aXZlW190WzFdLnR5cGVdKXtpZihLPShkLmZpbmQuSUQoU3QubWF0Y2hlc1swXS5yZXBsYWNlKFhlLCRlKSxLKXx8W10pWzBdLEspVnQmJihLPUsucGFyZW50Tm9kZSk7ZWxzZSByZXR1cm4gbnQ7Vj1WLnNsaWNlKF90LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoY3Q9V2UubmVlZHNDb250ZXh0LnRlc3QoVik/MDpfdC5sZW5ndGg7Y3QtLSYmKFN0PV90W2N0XSwhZC5yZWxhdGl2ZVtQdD1TdC50eXBlXSk7KWlmKChEdD1kLmZpbmRbUHRdKSYmKGx0PUR0KFN0Lm1hdGNoZXNbMF0ucmVwbGFjZShYZSwkZSksUW4udGVzdChfdFswXS50eXBlKSYmSm4oSy5wYXJlbnROb2RlKXx8SykpKXtpZihfdC5zcGxpY2UoY3QsMSksVj1sdC5sZW5ndGgmJnVuKF90KSwhVilyZXR1cm4gSS5hcHBseShudCxsdCksbnQ7YnJlYWt9fXJldHVybihWdHx8bmkoVixOdCkpKGx0LEssIVUsbnQsIUt8fFFuLnRlc3QoVikmJkpuKEsucGFyZW50Tm9kZSl8fEspLG50fXcuc29ydFN0YWJsZT1mdC5zcGxpdCgiIikuc29ydChvZSkuam9pbigiIik9PT1mdCx0cigpLHcuc29ydERldGFjaGVkPV9yKGZ1bmN0aW9uKFYpe3JldHVybiBWLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE8uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSkmMX0pLGMuZmluZD1ZdCxjLmV4cHJbIjoiXT1jLmV4cHIucHNldWRvcyxjLnVuaXF1ZT1jLnVuaXF1ZVNvcnQsWXQuY29tcGlsZT1uaSxZdC5zZWxlY3Q9d2EsWXQuc2V0RG9jdW1lbnQ9dHIsWXQudG9rZW5pemU9SHIsWXQuZXNjYXBlPWMuZXNjYXBlU2VsZWN0b3IsWXQuZ2V0VGV4dD1jLnRleHQsWXQuaXNYTUw9Yy5pc1hNTERvYyxZdC5zZWxlY3RvcnM9Yy5leHByLFl0LnN1cHBvcnQ9Yy5zdXBwb3J0LFl0LnVuaXF1ZVNvcnQ9Yy51bmlxdWVTb3J0fSkoKTt2YXIgWD1mdW5jdGlvbihpLGQsYil7Zm9yKHZhciB4PVtdLEE9YiE9PXZvaWQgMDsoaT1pW2RdKSYmaS5ub2RlVHlwZSE9PTk7KWlmKGkubm9kZVR5cGU9PT0xKXtpZihBJiZjKGkpLmlzKGIpKWJyZWFrO3gucHVzaChpKX1yZXR1cm4geH0saj1mdW5jdGlvbihpLGQpe2Zvcih2YXIgYj1bXTtpO2k9aS5uZXh0U2libGluZylpLm5vZGVUeXBlPT09MSYmaSE9PWQmJmIucHVzaChpKTtyZXR1cm4gYn0scT1jLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGF0PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIEooaSxkLGIpe3JldHVybiBrKGQpP2MuZ3JlcChpLGZ1bmN0aW9uKHgsQSl7cmV0dXJuISFkLmNhbGwoeCxBLHgpIT09Yn0pOmQubm9kZVR5cGU/Yy5ncmVwKGksZnVuY3Rpb24oeCl7cmV0dXJuIHg9PT1kIT09Yn0pOnR5cGVvZiBkIT0ic3RyaW5nIj9jLmdyZXAoaSxmdW5jdGlvbih4KXtyZXR1cm4gdS5jYWxsKGQseCk+LTEhPT1ifSk6Yy5maWx0ZXIoZCxpLGIpfWMuZmlsdGVyPWZ1bmN0aW9uKGksZCxiKXt2YXIgeD1kWzBdO3JldHVybiBiJiYoaT0iOm5vdCgiK2krIikiKSxkLmxlbmd0aD09PTEmJngubm9kZVR5cGU9PT0xP2MuZmluZC5tYXRjaGVzU2VsZWN0b3IoeCxpKT9beF06W106Yy5maW5kLm1hdGNoZXMoaSxjLmdyZXAoZCxmdW5jdGlvbihBKXtyZXR1cm4gQS5ub2RlVHlwZT09PTF9KSl9LGMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGkpe3ZhciBkLGIseD10aGlzLmxlbmd0aCxBPXRoaXM7aWYodHlwZW9mIGkhPSJzdHJpbmciKXJldHVybiB0aGlzLnB1c2hTdGFjayhjKGkpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihkPTA7ZDx4O2QrKylpZihjLmNvbnRhaW5zKEFbZF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKGI9dGhpcy5wdXNoU3RhY2soW10pLGQ9MDtkPHg7ZCsrKWMuZmluZChpLEFbZF0sYik7cmV0dXJuIHg+MT9jLnVuaXF1ZVNvcnQoYik6Yn0sZmlsdGVyOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnB1c2hTdGFjayhKKHRoaXMsaXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnB1c2hTdGFjayhKKHRoaXMsaXx8W10sITApKX0saXM6ZnVuY3Rpb24oaSl7cmV0dXJuISFKKHRoaXMsdHlwZW9mIGk9PSJzdHJpbmciJiZxLnRlc3QoaSk/YyhpKTppfHxbXSwhMSkubGVuZ3RofX0pO3ZhciB0dCx5dD0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvLFR0PWMuZm4uaW5pdD1mdW5jdGlvbihpLGQsYil7dmFyIHgsQTtpZighaSlyZXR1cm4gdGhpcztpZihiPWJ8fHR0LHR5cGVvZiBpPT0ic3RyaW5nIilpZihpWzBdPT09IjwiJiZpW2kubGVuZ3RoLTFdPT09Ij4iJiZpLmxlbmd0aD49Mz94PVtudWxsLGksbnVsbF06eD15dC5leGVjKGkpLHgmJih4WzFdfHwhZCkpaWYoeFsxXSl7aWYoZD1kIGluc3RhbmNlb2YgYz9kWzBdOmQsYy5tZXJnZSh0aGlzLGMucGFyc2VIVE1MKHhbMV0sZCYmZC5ub2RlVHlwZT9kLm93bmVyRG9jdW1lbnR8fGQ6RiwhMCkpLGF0LnRlc3QoeFsxXSkmJmMuaXNQbGFpbk9iamVjdChkKSlmb3IoeCBpbiBkKWsodGhpc1t4XSk/dGhpc1t4XShkW3hdKTp0aGlzLmF0dHIoeCxkW3hdKTtyZXR1cm4gdGhpc31lbHNlIHJldHVybiBBPUYuZ2V0RWxlbWVudEJ5SWQoeFsyXSksQSYmKHRoaXNbMF09QSx0aGlzLmxlbmd0aD0xKSx0aGlzO2Vsc2UgcmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHxiKS5maW5kKGkpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChpKTtlbHNle2lmKGkubm9kZVR5cGUpcmV0dXJuIHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYoayhpKSlyZXR1cm4gYi5yZWFkeSE9PXZvaWQgMD9iLnJlYWR5KGkpOmkoYyl9cmV0dXJuIGMubWFrZUFycmF5KGksdGhpcyl9O1R0LnByb3RvdHlwZT1jLmZuLHR0PWMoRik7dmFyIEF0PS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLGt0PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2MuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oaSl7dmFyIGQ9YyhpLHRoaXMpLGI9ZC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB4PTA7eDxiO3grKylpZihjLmNvbnRhaW5zKHRoaXMsZFt4XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihpLGQpe3ZhciBiLHg9MCxBPXRoaXMubGVuZ3RoLEk9W10sTz10eXBlb2YgaSE9InN0cmluZyImJmMoaSk7aWYoIXEudGVzdChpKSl7Zm9yKDt4PEE7eCsrKWZvcihiPXRoaXNbeF07YiYmYiE9PWQ7Yj1iLnBhcmVudE5vZGUpaWYoYi5ub2RlVHlwZTwxMSYmKE8/Ty5pbmRleChiKT4tMTpiLm5vZGVUeXBlPT09MSYmYy5maW5kLm1hdGNoZXNTZWxlY3RvcihiLGkpKSl7SS5wdXNoKGIpO2JyZWFrfX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soSS5sZW5ndGg+MT9jLnVuaXF1ZVNvcnQoSSk6SSl9LGluZGV4OmZ1bmN0aW9uKGkpe3JldHVybiBpP3R5cGVvZiBpPT0ic3RyaW5nIj91LmNhbGwoYyhpKSx0aGlzWzBdKTp1LmNhbGwodGhpcyxpLmpxdWVyeT9pWzBdOmkpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMudW5pcXVlU29ydChjLm1lcmdlKHRoaXMuZ2V0KCksYyhpLGQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmFkZChpPT1udWxsP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGkpKX19KTtmdW5jdGlvbiBMdChpLGQpe2Zvcig7KGk9aVtkXSkmJmkubm9kZVR5cGUhPT0xOyk7cmV0dXJuIGl9Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oaSl7dmFyIGQ9aS5wYXJlbnROb2RlO3JldHVybiBkJiZkLm5vZGVUeXBlIT09MTE/ZDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGkpe3JldHVybiBYKGksInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGksZCxiKXtyZXR1cm4gWChpLCJwYXJlbnROb2RlIixiKX0sbmV4dDpmdW5jdGlvbihpKXtyZXR1cm4gTHQoaSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihpKXtyZXR1cm4gTHQoaSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oaSl7cmV0dXJuIFgoaSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihpKXtyZXR1cm4gWChpLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGksZCxiKXtyZXR1cm4gWChpLCJuZXh0U2libGluZyIsYil9LHByZXZVbnRpbDpmdW5jdGlvbihpLGQsYil7cmV0dXJuIFgoaSwicHJldmlvdXNTaWJsaW5nIixiKX0sc2libGluZ3M6ZnVuY3Rpb24oaSl7cmV0dXJuIGooKGkucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsaSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGkpe3JldHVybiBqKGkuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGkpe3JldHVybiBpLmNvbnRlbnREb2N1bWVudCE9bnVsbCYmbihpLmNvbnRlbnREb2N1bWVudCk/aS5jb250ZW50RG9jdW1lbnQ6KEcoaSwidGVtcGxhdGUiKSYmKGk9aS5jb250ZW50fHxpKSxjLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24oaSxkKXtjLmZuW2ldPWZ1bmN0aW9uKGIseCl7dmFyIEE9Yy5tYXAodGhpcyxkLGIpO3JldHVybiBpLnNsaWNlKC01KSE9PSJVbnRpbCImJih4PWIpLHgmJnR5cGVvZiB4PT0ic3RyaW5nIiYmKEE9Yy5maWx0ZXIoeCxBKSksdGhpcy5sZW5ndGg+MSYmKGt0W2ldfHxjLnVuaXF1ZVNvcnQoQSksQXQudGVzdChpKSYmQS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKEEpfX0pO3ZhciBCdD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uICR0KGkpe3ZhciBkPXt9O3JldHVybiBjLmVhY2goaS5tYXRjaChCdCl8fFtdLGZ1bmN0aW9uKGIseCl7ZFt4XT0hMH0pLGR9Yy5DYWxsYmFja3M9ZnVuY3Rpb24oaSl7aT10eXBlb2YgaT09InN0cmluZyI/JHQoaSk6Yy5leHRlbmQoe30saSk7dmFyIGQsYix4LEEsST1bXSxPPVtdLCQ9LTEsVT1mdW5jdGlvbigpe2ZvcihBPUF8fGkub25jZSx4PWQ9ITA7Ty5sZW5ndGg7JD0tMSlmb3IoYj1PLnNoaWZ0KCk7KyskPEkubGVuZ3RoOylJWyRdLmFwcGx5KGJbMF0sYlsxXSk9PT0hMSYmaS5zdG9wT25GYWxzZSYmKCQ9SS5sZW5ndGgsYj0hMSk7aS5tZW1vcnl8fChiPSExKSxkPSExLEEmJihiP0k9W106ST0iIil9LFE9e2FkZDpmdW5jdGlvbigpe3JldHVybiBJJiYoYiYmIWQmJigkPUkubGVuZ3RoLTEsTy5wdXNoKGIpKSxmdW5jdGlvbiBkdChmdCl7Yy5lYWNoKGZ0LGZ1bmN0aW9uKGl0LHd0KXtrKHd0KT8oIWkudW5pcXVlfHwhUS5oYXMod3QpKSYmSS5wdXNoKHd0KTp3dCYmd3QubGVuZ3RoJiZmKHd0KSE9PSJzdHJpbmciJiZkdCh3dCl9KX0oYXJndW1lbnRzKSxiJiYhZCYmVSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihkdCxmdCl7Zm9yKHZhciBpdDsoaXQ9Yy5pbkFycmF5KGZ0LEksaXQpKT4tMTspSS5zcGxpY2UoaXQsMSksaXQ8PSQmJiQtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihkdCl7cmV0dXJuIGR0P2MuaW5BcnJheShkdCxJKT4tMTpJLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBJJiYoST1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBBPU89W10sST1iPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIUl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gQT1PPVtdLCFiJiYhZCYmKEk9Yj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFBfSxmaXJlV2l0aDpmdW5jdGlvbihkdCxmdCl7cmV0dXJuIEF8fChmdD1mdHx8W10sZnQ9W2R0LGZ0LnNsaWNlP2Z0LnNsaWNlKCk6ZnRdLE8ucHVzaChmdCksZHx8VSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIFEuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISF4fX07cmV0dXJuIFF9O2Z1bmN0aW9uIEt0KGkpe3JldHVybiBpfWZ1bmN0aW9uIEQoaSl7dGhyb3cgaX1mdW5jdGlvbiB1dChpLGQsYix4KXt2YXIgQTt0cnl7aSYmayhBPWkucHJvbWlzZSk/QS5jYWxsKGkpLmRvbmUoZCkuZmFpbChiKTppJiZrKEE9aS50aGVuKT9BLmNhbGwoaSxkLGIpOmQuYXBwbHkodm9pZCAwLFtpXS5zbGljZSh4KSl9Y2F0Y2goSSl7Yi5hcHBseSh2b2lkIDAsW0ldKX19Yy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGkpe3ZhciBkPVtbIm5vdGlmeSIsInByb2dyZXNzIixjLkNhbGxiYWNrcygibWVtb3J5IiksYy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLGMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixjLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxiPSJwZW5kaW5nIix4PXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBifSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gQS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKEkpe3JldHVybiB4LnRoZW4obnVsbCxJKX0scGlwZTpmdW5jdGlvbigpe3ZhciBJPWFyZ3VtZW50cztyZXR1cm4gYy5EZWZlcnJlZChmdW5jdGlvbihPKXtjLmVhY2goZCxmdW5jdGlvbigkLFUpe3ZhciBRPWsoSVtVWzRdXSkmJklbVVs0XV07QVtVWzFdXShmdW5jdGlvbigpe3ZhciBkdD1RJiZRLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkdCYmayhkdC5wcm9taXNlKT9kdC5wcm9taXNlKCkucHJvZ3Jlc3MoTy5ub3RpZnkpLmRvbmUoTy5yZXNvbHZlKS5mYWlsKE8ucmVqZWN0KTpPW1VbMF0rIldpdGgiXSh0aGlzLFE/W2R0XTphcmd1bWVudHMpfSl9KSxJPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24oSSxPLCQpe3ZhciBVPTA7ZnVuY3Rpb24gUShkdCxmdCxpdCx3dCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIE90PXRoaXMsR3Q9YXJndW1lbnRzLE10PWZ1bmN0aW9uKCl7dmFyIG9lLE1lO2lmKCEoZHQ8VSkpe2lmKG9lPWl0LmFwcGx5KE90LEd0KSxvZT09PWZ0LnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtNZT1vZSYmKHR5cGVvZiBvZT09Im9iamVjdCJ8fHR5cGVvZiBvZT09ImZ1bmN0aW9uIikmJm9lLnRoZW4sayhNZSk/d3Q/TWUuY2FsbChvZSxRKFUsZnQsS3Qsd3QpLFEoVSxmdCxELHd0KSk6KFUrKyxNZS5jYWxsKG9lLFEoVSxmdCxLdCx3dCksUShVLGZ0LEQsd3QpLFEoVSxmdCxLdCxmdC5ub3RpZnlXaXRoKSkpOihpdCE9PUt0JiYoT3Q9dm9pZCAwLEd0PVtvZV0pLCh3dHx8ZnQucmVzb2x2ZVdpdGgpKE90LEd0KSl9fSxsZT13dD9NdDpmdW5jdGlvbigpe3RyeXtNdCgpfWNhdGNoKG9lKXtjLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJmMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhvZSxsZS5lcnJvciksZHQrMT49VSYmKGl0IT09RCYmKE90PXZvaWQgMCxHdD1bb2VdKSxmdC5yZWplY3RXaXRoKE90LEd0KSl9fTtkdD9sZSgpOihjLkRlZmVycmVkLmdldEVycm9ySG9vaz9sZS5lcnJvcj1jLkRlZmVycmVkLmdldEVycm9ySG9vaygpOmMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobGUuZXJyb3I9Yy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksdC5zZXRUaW1lb3V0KGxlKSl9fXJldHVybiBjLkRlZmVycmVkKGZ1bmN0aW9uKGR0KXtkWzBdWzNdLmFkZChRKDAsZHQsaygkKT8kOkt0LGR0Lm5vdGlmeVdpdGgpKSxkWzFdWzNdLmFkZChRKDAsZHQsayhJKT9JOkt0KSksZFsyXVszXS5hZGQoUSgwLGR0LGsoTyk/TzpEKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oSSl7cmV0dXJuIEkhPW51bGw/Yy5leHRlbmQoSSx4KTp4fX0sQT17fTtyZXR1cm4gYy5lYWNoKGQsZnVuY3Rpb24oSSxPKXt2YXIgJD1PWzJdLFU9T1s1XTt4W09bMV1dPSQuYWRkLFUmJiQuYWRkKGZ1bmN0aW9uKCl7Yj1VfSxkWzMtSV1bMl0uZGlzYWJsZSxkWzMtSV1bM10uZGlzYWJsZSxkWzBdWzJdLmxvY2ssZFswXVszXS5sb2NrKSwkLmFkZChPWzNdLmZpcmUpLEFbT1swXV09ZnVuY3Rpb24oKXtyZXR1cm4gQVtPWzBdKyJXaXRoIl0odGhpcz09PUE/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxBW09bMF0rIldpdGgiXT0kLmZpcmVXaXRofSkseC5wcm9taXNlKEEpLGkmJmkuY2FsbChBLEEpLEF9LHdoZW46ZnVuY3Rpb24oaSl7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aCxiPWQseD1BcnJheShiKSxBPXMuY2FsbChhcmd1bWVudHMpLEk9Yy5EZWZlcnJlZCgpLE89ZnVuY3Rpb24oJCl7cmV0dXJuIGZ1bmN0aW9uKFUpe3hbJF09dGhpcyxBWyRdPWFyZ3VtZW50cy5sZW5ndGg+MT9zLmNhbGwoYXJndW1lbnRzKTpVLC0tZHx8SS5yZXNvbHZlV2l0aCh4LEEpfX07aWYoZDw9MSYmKHV0KGksSS5kb25lKE8oYikpLnJlc29sdmUsSS5yZWplY3QsIWQpLEkuc3RhdGUoKT09PSJwZW5kaW5nInx8ayhBW2JdJiZBW2JdLnRoZW4pKSlyZXR1cm4gSS50aGVuKCk7Zm9yKDtiLS07KXV0KEFbYl0sTyhiKSxJLnJlamVjdCk7cmV0dXJuIEkucHJvbWlzZSgpfX0pO3ZhciBvdD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztjLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oaSxkKXt0LmNvbnNvbGUmJnQuY29uc29sZS53YXJuJiZpJiZvdC50ZXN0KGkubmFtZSkmJnQuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK2kubWVzc2FnZSxpLnN0YWNrLGQpfSxjLnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKGkpe3Quc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGl9KX07dmFyIEg9Yy5EZWZlcnJlZCgpO2MuZm4ucmVhZHk9ZnVuY3Rpb24oaSl7cmV0dXJuIEgudGhlbihpKS5jYXRjaChmdW5jdGlvbihkKXtjLnJlYWR5RXhjZXB0aW9uKGQpfSksdGhpc30sYy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oaSl7KGk9PT0hMD8tLWMucmVhZHlXYWl0OmMuaXNSZWFkeSl8fChjLmlzUmVhZHk9ITAsIShpIT09ITAmJi0tYy5yZWFkeVdhaXQ+MCkmJkgucmVzb2x2ZVdpdGgoRixbY10pKX19KSxjLnJlYWR5LnRoZW49SC50aGVuO2Z1bmN0aW9uIE0oKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLE0pLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsTSksYy5yZWFkeSgpfUYucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSJ8fEYucmVhZHlTdGF0ZSE9PSJsb2FkaW5nIiYmIUYuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP3Quc2V0VGltZW91dChjLnJlYWR5KTooRi5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixNKSx0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLE0pKTt2YXIgWT1mdW5jdGlvbihpLGQsYix4LEEsSSxPKXt2YXIgJD0wLFU9aS5sZW5ndGgsUT1iPT1udWxsO2lmKGYoYik9PT0ib2JqZWN0Iil7QT0hMDtmb3IoJCBpbiBiKVkoaSxkLCQsYlskXSwhMCxJLE8pfWVsc2UgaWYoeCE9PXZvaWQgMCYmKEE9ITAsayh4KXx8KE89ITApLFEmJihPPyhkLmNhbGwoaSx4KSxkPW51bGwpOihRPWQsZD1mdW5jdGlvbihkdCxmdCxpdCl7cmV0dXJuIFEuY2FsbChjKGR0KSxpdCl9KSksZCkpZm9yKDskPFU7JCsrKWQoaVskXSxiLE8/eDp4LmNhbGwoaVskXSwkLGQoaVskXSxiKSkpO3JldHVybiBBP2k6UT9kLmNhbGwoaSk6VT9kKGlbMF0sYik6SX0scHQ9L14tbXMtLyxtdD0vLShbYS16XSkvZztmdW5jdGlvbiBydChpLGQpe3JldHVybiBkLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gZ3QoaSl7cmV0dXJuIGkucmVwbGFjZShwdCwibXMtIikucmVwbGFjZShtdCxydCl9dmFyIEN0PWZ1bmN0aW9uKGkpe3JldHVybiBpLm5vZGVUeXBlPT09MXx8aS5ub2RlVHlwZT09PTl8fCEraS5ub2RlVHlwZX07ZnVuY3Rpb24geHQoKXt0aGlzLmV4cGFuZG89Yy5leHBhbmRvK3h0LnVpZCsrfXh0LnVpZD0xLHh0LnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24oaSl7dmFyIGQ9aVt0aGlzLmV4cGFuZG9dO3JldHVybiBkfHwoZD17fSxDdChpKSYmKGkubm9kZVR5cGU/aVt0aGlzLmV4cGFuZG9dPWQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGksdGhpcy5leHBhbmRvLHt2YWx1ZTpkLGNvbmZpZ3VyYWJsZTohMH0pKSksZH0sc2V0OmZ1bmN0aW9uKGksZCxiKXt2YXIgeCxBPXRoaXMuY2FjaGUoaSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKUFbZ3QoZCldPWI7ZWxzZSBmb3IoeCBpbiBkKUFbZ3QoeCldPWRbeF07cmV0dXJuIEF9LGdldDpmdW5jdGlvbihpLGQpe3JldHVybiBkPT09dm9pZCAwP3RoaXMuY2FjaGUoaSk6aVt0aGlzLmV4cGFuZG9dJiZpW3RoaXMuZXhwYW5kb11bZ3QoZCldfSxhY2Nlc3M6ZnVuY3Rpb24oaSxkLGIpe3JldHVybiBkPT09dm9pZCAwfHxkJiZ0eXBlb2YgZD09InN0cmluZyImJmI9PT12b2lkIDA/dGhpcy5nZXQoaSxkKToodGhpcy5zZXQoaSxkLGIpLGIhPT12b2lkIDA/YjpkKX0scmVtb3ZlOmZ1bmN0aW9uKGksZCl7dmFyIGIseD1pW3RoaXMuZXhwYW5kb107aWYoeCE9PXZvaWQgMCl7aWYoZCE9PXZvaWQgMClmb3IoQXJyYXkuaXNBcnJheShkKT9kPWQubWFwKGd0KTooZD1ndChkKSxkPWQgaW4geD9bZF06ZC5tYXRjaChCdCl8fFtdKSxiPWQubGVuZ3RoO2ItLTspZGVsZXRlIHhbZFtiXV07KGQ9PT12b2lkIDB8fGMuaXNFbXB0eU9iamVjdCh4KSkmJihpLm5vZGVUeXBlP2lbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGlbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGkpe3ZhciBkPWlbdGhpcy5leHBhbmRvXTtyZXR1cm4gZCE9PXZvaWQgMCYmIWMuaXNFbXB0eU9iamVjdChkKX19O3ZhciB2dD1uZXcgeHQsenQ9bmV3IHh0LFV0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8scGU9L1tBLVpdL2c7ZnVuY3Rpb24gb3IoaSl7cmV0dXJuIGk9PT0idHJ1ZSI/ITA6aT09PSJmYWxzZSI/ITE6aT09PSJudWxsIj9udWxsOmk9PT0raSsiIj8raTpVdC50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aX1mdW5jdGlvbiB3ZShpLGQsYil7dmFyIHg7aWYoYj09PXZvaWQgMCYmaS5ub2RlVHlwZT09PTEpaWYoeD0iZGF0YS0iK2QucmVwbGFjZShwZSwiLSQmIikudG9Mb3dlckNhc2UoKSxiPWkuZ2V0QXR0cmlidXRlKHgpLHR5cGVvZiBiPT0ic3RyaW5nIil7dHJ5e2I9b3IoYil9Y2F0Y2h7fXp0LnNldChpLGQsYil9ZWxzZSBiPXZvaWQgMDtyZXR1cm4gYn1jLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihpKXtyZXR1cm4genQuaGFzRGF0YShpKXx8dnQuaGFzRGF0YShpKX0sZGF0YTpmdW5jdGlvbihpLGQsYil7cmV0dXJuIHp0LmFjY2VzcyhpLGQsYil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oaSxkKXt6dC5yZW1vdmUoaSxkKX0sX2RhdGE6ZnVuY3Rpb24oaSxkLGIpe3JldHVybiB2dC5hY2Nlc3MoaSxkLGIpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihpLGQpe3Z0LnJlbW92ZShpLGQpfX0pLGMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGksZCl7dmFyIGIseCxBLEk9dGhpc1swXSxPPUkmJkkuYXR0cmlidXRlcztpZihpPT09dm9pZCAwKXtpZih0aGlzLmxlbmd0aCYmKEE9enQuZ2V0KEkpLEkubm9kZVR5cGU9PT0xJiYhdnQuZ2V0KEksImhhc0RhdGFBdHRycyIpKSl7Zm9yKGI9Ty5sZW5ndGg7Yi0tOylPW2JdJiYoeD1PW2JdLm5hbWUseC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKHg9Z3QoeC5zbGljZSg1KSksd2UoSSx4LEFbeF0pKSk7dnQuc2V0KEksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBBfXJldHVybiB0eXBlb2YgaT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7enQuc2V0KHRoaXMsaSl9KTpZKHRoaXMsZnVuY3Rpb24oJCl7dmFyIFU7aWYoSSYmJD09PXZvaWQgMClyZXR1cm4gVT16dC5nZXQoSSxpKSxVIT09dm9pZCAwfHwoVT13ZShJLGkpLFUhPT12b2lkIDApP1U6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe3p0LnNldCh0aGlzLGksJCl9KX0sbnVsbCxkLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7enQucmVtb3ZlKHRoaXMsaSl9KX19KSxjLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oaSxkLGIpe3ZhciB4O2lmKGkpcmV0dXJuIGQ9KGR8fCJmeCIpKyJxdWV1ZSIseD12dC5nZXQoaSxkKSxiJiYoIXh8fEFycmF5LmlzQXJyYXkoYik/eD12dC5hY2Nlc3MoaSxkLGMubWFrZUFycmF5KGIpKTp4LnB1c2goYikpLHh8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGksZCl7ZD1kfHwiZngiO3ZhciBiPWMucXVldWUoaSxkKSx4PWIubGVuZ3RoLEE9Yi5zaGlmdCgpLEk9Yy5fcXVldWVIb29rcyhpLGQpLE89ZnVuY3Rpb24oKXtjLmRlcXVldWUoaSxkKX07QT09PSJpbnByb2dyZXNzIiYmKEE9Yi5zaGlmdCgpLHgtLSksQSYmKGQ9PT0iZngiJiZiLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgSS5zdG9wLEEuY2FsbChpLE8sSSkpLCF4JiZJJiZJLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oaSxkKXt2YXIgYj1kKyJxdWV1ZUhvb2tzIjtyZXR1cm4gdnQuZ2V0KGksYil8fHZ0LmFjY2VzcyhpLGIse2VtcHR5OmMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3Z0LnJlbW92ZShpLFtkKyJxdWV1ZSIsYl0pfSl9KX19KSxjLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oaSxkKXt2YXIgYj0yO3JldHVybiB0eXBlb2YgaSE9InN0cmluZyImJihkPWksaT0iZngiLGItLSksYXJndW1lbnRzLmxlbmd0aDxiP2MucXVldWUodGhpc1swXSxpKTpkPT09dm9pZCAwP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHg9Yy5xdWV1ZSh0aGlzLGksZCk7Yy5fcXVldWVIb29rcyh0aGlzLGkpLGk9PT0iZngiJiZ4WzBdIT09ImlucHJvZ3Jlc3MiJiZjLmRlcXVldWUodGhpcyxpKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRlcXVldWUodGhpcyxpKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnF1ZXVlKGl8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGksZCl7dmFyIGIseD0xLEE9Yy5EZWZlcnJlZCgpLEk9dGhpcyxPPXRoaXMubGVuZ3RoLCQ9ZnVuY3Rpb24oKXstLXh8fEEucmVzb2x2ZVdpdGgoSSxbSV0pfTtmb3IodHlwZW9mIGkhPSJzdHJpbmciJiYoZD1pLGk9dm9pZCAwKSxpPWl8fCJmeCI7Ty0tOyliPXZ0LmdldChJW09dLGkrInF1ZXVlSG9va3MiKSxiJiZiLmVtcHR5JiYoeCsrLGIuZW1wdHkuYWRkKCQpKTtyZXR1cm4gJCgpLEEucHJvbWlzZShkKX19KTt2YXIgWWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1llKyIpKFthLXolXSopJCIsImkiKSxiZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLEVlPUYuZG9jdW1lbnRFbGVtZW50LGRlPWZ1bmN0aW9uKGkpe3JldHVybiBjLmNvbnRhaW5zKGkub3duZXJEb2N1bWVudCxpKX0sdG49e2NvbXBvc2VkOiEwfTtFZS5nZXRSb290Tm9kZSYmKGRlPWZ1bmN0aW9uKGkpe3JldHVybiBjLmNvbnRhaW5zKGkub3duZXJEb2N1bWVudCxpKXx8aS5nZXRSb290Tm9kZSh0bik9PT1pLm93bmVyRG9jdW1lbnR9KTt2YXIgbXI9ZnVuY3Rpb24oaSxkKXtyZXR1cm4gaT1kfHxpLGkuc3R5bGUuZGlzcGxheT09PSJub25lInx8aS5zdHlsZS5kaXNwbGF5PT09IiImJmRlKGkpJiZjLmNzcyhpLCJkaXNwbGF5Iik9PT0ibm9uZSJ9O2Z1bmN0aW9uIGVuKGksZCxiLHgpe3ZhciBBLEksTz0yMCwkPXg/ZnVuY3Rpb24oKXtyZXR1cm4geC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gYy5jc3MoaSxkLCIiKX0sVT0kKCksUT1iJiZiWzNdfHwoYy5jc3NOdW1iZXJbZF0/IiI6InB4IiksZHQ9aS5ub2RlVHlwZSYmKGMuY3NzTnVtYmVyW2RdfHxRIT09InB4IiYmK1UpJiZ0ZS5leGVjKGMuY3NzKGksZCkpO2lmKGR0JiZkdFszXSE9PVEpe2ZvcihVPVUvMixRPVF8fGR0WzNdLGR0PStVfHwxO08tLTspYy5zdHlsZShpLGQsZHQrUSksKDEtSSkqKDEtKEk9JCgpL1V8fC41KSk8PTAmJihPPTApLGR0PWR0L0k7ZHQ9ZHQqMixjLnN0eWxlKGksZCxkdCtRKSxiPWJ8fFtdfXJldHVybiBiJiYoZHQ9K2R0fHwrVXx8MCxBPWJbMV0/ZHQrKGJbMV0rMSkqYlsyXTorYlsyXSx4JiYoeC51bml0PVEseC5zdGFydD1kdCx4LmVuZD1BKSksQX12YXIgcm49e307ZnVuY3Rpb24gbm4oaSl7dmFyIGQsYj1pLm93bmVyRG9jdW1lbnQseD1pLm5vZGVOYW1lLEE9cm5beF07cmV0dXJuIEF8fChkPWIuYm9keS5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoeCkpLEE9Yy5jc3MoZCwiZGlzcGxheSIpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxBPT09Im5vbmUiJiYoQT0iYmxvY2siKSxyblt4XT1BLEEpfWZ1bmN0aW9uIGtlKGksZCl7Zm9yKHZhciBiLHgsQT1bXSxJPTAsTz1pLmxlbmd0aDtJPE87SSsrKXg9aVtJXSx4LnN0eWxlJiYoYj14LnN0eWxlLmRpc3BsYXksZD8oYj09PSJub25lIiYmKEFbSV09dnQuZ2V0KHgsImRpc3BsYXkiKXx8bnVsbCxBW0ldfHwoeC5zdHlsZS5kaXNwbGF5PSIiKSkseC5zdHlsZS5kaXNwbGF5PT09IiImJm1yKHgpJiYoQVtJXT1ubih4KSkpOmIhPT0ibm9uZSImJihBW0ldPSJub25lIix2dC5zZXQoeCwiZGlzcGxheSIsYikpKTtmb3IoST0wO0k8TztJKyspQVtJXSE9bnVsbCYmKGlbSV0uc3R5bGUuZGlzcGxheT1BW0ldKTtyZXR1cm4gaX1jLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBrZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBrZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGkpe3JldHVybiB0eXBlb2YgaT09ImJvb2xlYW4iP2k/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bXIodGhpcyk/Yyh0aGlzKS5zaG93KCk6Yyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgamU9L14oPzpjaGVja2JveHxyYWRpbykkL2kscWk9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksR2k9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pOyhmdW5jdGlvbigpe3ZhciBpPUYuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGQ9aS5hcHBlbmRDaGlsZChGLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxiPUYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZC5hcHBlbmRDaGlsZChiKSx3LmNoZWNrQ2xvbmU9ZC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHcubm9DbG9uZUNoZWNrZWQ9ISFkLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxkLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHcub3B0aW9uPSEhZC5sYXN0Q2hpbGR9KSgpO3ZhciBTZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O1NlLnRib2R5PVNlLnRmb290PVNlLmNvbGdyb3VwPVNlLmNhcHRpb249U2UudGhlYWQsU2UudGg9U2UudGQsdy5vcHRpb258fChTZS5vcHRncm91cD1TZS5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7ZnVuY3Rpb24gdmUoaSxkKXt2YXIgYjtyZXR1cm4gdHlwZW9mIGkuZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiP2I9aS5nZXRFbGVtZW50c0J5VGFnTmFtZShkfHwiKiIpOnR5cGVvZiBpLnF1ZXJ5U2VsZWN0b3JBbGw8InUiP2I9aS5xdWVyeVNlbGVjdG9yQWxsKGR8fCIqIik6Yj1bXSxkPT09dm9pZCAwfHxkJiZHKGksZCk/Yy5tZXJnZShbaV0sYik6Yn1mdW5jdGlvbiBMbihpLGQpe2Zvcih2YXIgYj0wLHg9aS5sZW5ndGg7Yjx4O2IrKyl2dC5zZXQoaVtiXSwiZ2xvYmFsRXZhbCIsIWR8fHZ0LmdldChkW2JdLCJnbG9iYWxFdmFsIikpfXZhciBXcz0vPHwmIz9cdys7LztmdW5jdGlvbiBYaShpLGQsYix4LEEpe2Zvcih2YXIgSSxPLCQsVSxRLGR0LGZ0PWQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGl0PVtdLHd0PTAsT3Q9aS5sZW5ndGg7d3Q8T3Q7d3QrKylpZihJPWlbd3RdLEl8fEk9PT0wKWlmKGYoSSk9PT0ib2JqZWN0IiljLm1lcmdlKGl0LEkubm9kZVR5cGU/W0ldOkkpO2Vsc2UgaWYoIVdzLnRlc3QoSSkpaXQucHVzaChkLmNyZWF0ZVRleHROb2RlKEkpKTtlbHNle2ZvcihPPU98fGZ0LmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLCQ9KHFpLmV4ZWMoSSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksVT1TZVskXXx8U2UuX2RlZmF1bHQsTy5pbm5lckhUTUw9VVsxXStjLmh0bWxQcmVmaWx0ZXIoSSkrVVsyXSxkdD1VWzBdO2R0LS07KU89Ty5sYXN0Q2hpbGQ7Yy5tZXJnZShpdCxPLmNoaWxkTm9kZXMpLE89ZnQuZmlyc3RDaGlsZCxPLnRleHRDb250ZW50PSIifWZvcihmdC50ZXh0Q29udGVudD0iIix3dD0wO0k9aXRbd3QrK107KXtpZih4JiZjLmluQXJyYXkoSSx4KT4tMSl7QSYmQS5wdXNoKEkpO2NvbnRpbnVlfWlmKFE9ZGUoSSksTz12ZShmdC5hcHBlbmRDaGlsZChJKSwic2NyaXB0IiksUSYmTG4oTyksYilmb3IoZHQ9MDtJPU9bZHQrK107KUdpLnRlc3QoSS50eXBlfHwiIikmJmIucHVzaChJKX1yZXR1cm4gZnR9dmFyICRpPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBncigpe3JldHVybiEwfWZ1bmN0aW9uIHlyKCl7cmV0dXJuITF9ZnVuY3Rpb24gem4oaSxkLGIseCxBLEkpe3ZhciBPLCQ7aWYodHlwZW9mIGQ9PSJvYmplY3QiKXt0eXBlb2YgYiE9InN0cmluZyImJih4PXh8fGIsYj12b2lkIDApO2ZvcigkIGluIGQpem4oaSwkLGIseCxkWyRdLEkpO3JldHVybiBpfWlmKHg9PW51bGwmJkE9PW51bGw/KEE9Yix4PWI9dm9pZCAwKTpBPT1udWxsJiYodHlwZW9mIGI9PSJzdHJpbmciPyhBPXgseD12b2lkIDApOihBPXgseD1iLGI9dm9pZCAwKSksQT09PSExKUE9eXI7ZWxzZSBpZighQSlyZXR1cm4gaTtyZXR1cm4gST09PTEmJihPPUEsQT1mdW5jdGlvbihVKXtyZXR1cm4gYygpLm9mZihVKSxPLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQS5ndWlkPU8uZ3VpZHx8KE8uZ3VpZD1jLmd1aWQrKykpLGkuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQuYWRkKHRoaXMsZCxBLHgsYil9KX1jLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGksZCxiLHgsQSl7dmFyIEksTywkLFUsUSxkdCxmdCxpdCx3dCxPdCxHdCxNdD12dC5nZXQoaSk7aWYoQ3QoaSkpZm9yKGIuaGFuZGxlciYmKEk9YixiPUkuaGFuZGxlcixBPUkuc2VsZWN0b3IpLEEmJmMuZmluZC5tYXRjaGVzU2VsZWN0b3IoRWUsQSksYi5ndWlkfHwoYi5ndWlkPWMuZ3VpZCsrKSwoVT1NdC5ldmVudHMpfHwoVT1NdC5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKE89TXQuaGFuZGxlKXx8KE89TXQuaGFuZGxlPWZ1bmN0aW9uKGxlKXtyZXR1cm4gdHlwZW9mIGM8InUiJiZjLmV2ZW50LnRyaWdnZXJlZCE9PWxlLnR5cGU/Yy5ldmVudC5kaXNwYXRjaC5hcHBseShpLGFyZ3VtZW50cyk6dm9pZCAwfSksZD0oZHx8IiIpLm1hdGNoKEJ0KXx8WyIiXSxRPWQubGVuZ3RoO1EtLTspJD0kaS5leGVjKGRbUV0pfHxbXSx3dD1HdD0kWzFdLE90PSgkWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksd3QmJihmdD1jLmV2ZW50LnNwZWNpYWxbd3RdfHx7fSx3dD0oQT9mdC5kZWxlZ2F0ZVR5cGU6ZnQuYmluZFR5cGUpfHx3dCxmdD1jLmV2ZW50LnNwZWNpYWxbd3RdfHx7fSxkdD1jLmV4dGVuZCh7dHlwZTp3dCxvcmlnVHlwZTpHdCxkYXRhOngsaGFuZGxlcjpiLGd1aWQ6Yi5ndWlkLHNlbGVjdG9yOkEsbmVlZHNDb250ZXh0OkEmJmMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChBKSxuYW1lc3BhY2U6T3Quam9pbigiLiIpfSxJKSwoaXQ9VVt3dF0pfHwoaXQ9VVt3dF09W10saXQuZGVsZWdhdGVDb3VudD0wLCghZnQuc2V0dXB8fGZ0LnNldHVwLmNhbGwoaSx4LE90LE8pPT09ITEpJiZpLmFkZEV2ZW50TGlzdGVuZXImJmkuYWRkRXZlbnRMaXN0ZW5lcih3dCxPKSksZnQuYWRkJiYoZnQuYWRkLmNhbGwoaSxkdCksZHQuaGFuZGxlci5ndWlkfHwoZHQuaGFuZGxlci5ndWlkPWIuZ3VpZCkpLEE/aXQuc3BsaWNlKGl0LmRlbGVnYXRlQ291bnQrKywwLGR0KTppdC5wdXNoKGR0KSxjLmV2ZW50Lmdsb2JhbFt3dF09ITApfSxyZW1vdmU6ZnVuY3Rpb24oaSxkLGIseCxBKXt2YXIgSSxPLCQsVSxRLGR0LGZ0LGl0LHd0LE90LEd0LE10PXZ0Lmhhc0RhdGEoaSkmJnZ0LmdldChpKTtpZighKCFNdHx8IShVPU10LmV2ZW50cykpKXtmb3IoZD0oZHx8IiIpLm1hdGNoKEJ0KXx8WyIiXSxRPWQubGVuZ3RoO1EtLTspe2lmKCQ9JGkuZXhlYyhkW1FdKXx8W10sd3Q9R3Q9JFsxXSxPdD0oJFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLCF3dCl7Zm9yKHd0IGluIFUpYy5ldmVudC5yZW1vdmUoaSx3dCtkW1FdLGIseCwhMCk7Y29udGludWV9Zm9yKGZ0PWMuZXZlbnQuc3BlY2lhbFt3dF18fHt9LHd0PSh4P2Z0LmRlbGVnYXRlVHlwZTpmdC5iaW5kVHlwZSl8fHd0LGl0PVVbd3RdfHxbXSwkPSRbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK090LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLE89ST1pdC5sZW5ndGg7SS0tOylkdD1pdFtJXSwoQXx8R3Q9PT1kdC5vcmlnVHlwZSkmJighYnx8Yi5ndWlkPT09ZHQuZ3VpZCkmJighJHx8JC50ZXN0KGR0Lm5hbWVzcGFjZSkpJiYoIXh8fHg9PT1kdC5zZWxlY3Rvcnx8eD09PSIqKiImJmR0LnNlbGVjdG9yKSYmKGl0LnNwbGljZShJLDEpLGR0LnNlbGVjdG9yJiZpdC5kZWxlZ2F0ZUNvdW50LS0sZnQucmVtb3ZlJiZmdC5yZW1vdmUuY2FsbChpLGR0KSk7TyYmIWl0Lmxlbmd0aCYmKCghZnQudGVhcmRvd258fGZ0LnRlYXJkb3duLmNhbGwoaSxPdCxNdC5oYW5kbGUpPT09ITEpJiZjLnJlbW92ZUV2ZW50KGksd3QsTXQuaGFuZGxlKSxkZWxldGUgVVt3dF0pfWMuaXNFbXB0eU9iamVjdChVKSYmdnQucmVtb3ZlKGksImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGkpe3ZhciBkLGIseCxBLEksTywkPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxVPWMuZXZlbnQuZml4KGkpLFE9KHZ0LmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbVS50eXBlXXx8W10sZHQ9Yy5ldmVudC5zcGVjaWFsW1UudHlwZV18fHt9O2ZvcigkWzBdPVUsZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDtkKyspJFtkXT1hcmd1bWVudHNbZF07aWYoVS5kZWxlZ2F0ZVRhcmdldD10aGlzLCEoZHQucHJlRGlzcGF0Y2gmJmR0LnByZURpc3BhdGNoLmNhbGwodGhpcyxVKT09PSExKSl7Zm9yKE89Yy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsVSxRKSxkPTA7KEE9T1tkKytdKSYmIVUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKFUuY3VycmVudFRhcmdldD1BLmVsZW0sYj0wOyhJPUEuaGFuZGxlcnNbYisrXSkmJiFVLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KSghVS5ybmFtZXNwYWNlfHxJLm5hbWVzcGFjZT09PSExfHxVLnJuYW1lc3BhY2UudGVzdChJLm5hbWVzcGFjZSkpJiYoVS5oYW5kbGVPYmo9SSxVLmRhdGE9SS5kYXRhLHg9KChjLmV2ZW50LnNwZWNpYWxbSS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fEkuaGFuZGxlcikuYXBwbHkoQS5lbGVtLCQpLHghPT12b2lkIDAmJihVLnJlc3VsdD14KT09PSExJiYoVS5wcmV2ZW50RGVmYXVsdCgpLFUuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gZHQucG9zdERpc3BhdGNoJiZkdC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLFUpLFUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oaSxkKXt2YXIgYix4LEEsSSxPLCQ9W10sVT1kLmRlbGVnYXRlQ291bnQsUT1pLnRhcmdldDtpZihVJiZRLm5vZGVUeXBlJiYhKGkudHlwZT09PSJjbGljayImJmkuYnV0dG9uPj0xKSl7Zm9yKDtRIT09dGhpcztRPVEucGFyZW50Tm9kZXx8dGhpcylpZihRLm5vZGVUeXBlPT09MSYmIShpLnR5cGU9PT0iY2xpY2siJiZRLmRpc2FibGVkPT09ITApKXtmb3IoST1bXSxPPXt9LGI9MDtiPFU7YisrKXg9ZFtiXSxBPXguc2VsZWN0b3IrIiAiLE9bQV09PT12b2lkIDAmJihPW0FdPXgubmVlZHNDb250ZXh0P2MoQSx0aGlzKS5pbmRleChRKT4tMTpjLmZpbmQoQSx0aGlzLG51bGwsW1FdKS5sZW5ndGgpLE9bQV0mJkkucHVzaCh4KTtJLmxlbmd0aCYmJC5wdXNoKHtlbGVtOlEsaGFuZGxlcnM6SX0pfX1yZXR1cm4gUT10aGlzLFU8ZC5sZW5ndGgmJiQucHVzaCh7ZWxlbTpRLGhhbmRsZXJzOmQuc2xpY2UoVSl9KSwkfSxhZGRQcm9wOmZ1bmN0aW9uKGksZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMuRXZlbnQucHJvdG90eXBlLGkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDprKGQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBkKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbaV19LHNldDpmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxpLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpifSl9fSl9LGZpeDpmdW5jdGlvbihpKXtyZXR1cm4gaVtjLmV4cGFuZG9dP2k6bmV3IGMuRXZlbnQoaSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oaSl7dmFyIGQ9dGhpc3x8aTtyZXR1cm4gamUudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZHKGQsImlucHV0IikmJmFuKGQsImNsaWNrIiwhMCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oaSl7dmFyIGQ9dGhpc3x8aTtyZXR1cm4gamUudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZHKGQsImlucHV0IikmJmFuKGQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGkpe3ZhciBkPWkudGFyZ2V0O3JldHVybiBqZS50ZXN0KGQudHlwZSkmJmQuY2xpY2smJkcoZCwiaW5wdXQiKSYmdnQuZ2V0KGQsImNsaWNrIil8fEcoZCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oaSl7aS5yZXN1bHQhPT12b2lkIDAmJmkub3JpZ2luYWxFdmVudCYmKGkub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1pLnJlc3VsdCl9fX19O2Z1bmN0aW9uIGFuKGksZCxiKXtpZighYil7dnQuZ2V0KGksZCk9PT12b2lkIDAmJmMuZXZlbnQuYWRkKGksZCxncik7cmV0dXJufXZ0LnNldChpLGQsITEpLGMuZXZlbnQuYWRkKGksZCx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oeCl7dmFyIEEsST12dC5nZXQodGhpcyxkKTtpZih4LmlzVHJpZ2dlciYxJiZ0aGlzW2RdKXtpZihJKShjLmV2ZW50LnNwZWNpYWxbZF18fHt9KS5kZWxlZ2F0ZVR5cGUmJnguc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihJPXMuY2FsbChhcmd1bWVudHMpLHZ0LnNldCh0aGlzLGQsSSksdGhpc1tkXSgpLEE9dnQuZ2V0KHRoaXMsZCksdnQuc2V0KHRoaXMsZCwhMSksSSE9PUEpcmV0dXJuIHguc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkseC5wcmV2ZW50RGVmYXVsdCgpLEF9ZWxzZSBJJiYodnQuc2V0KHRoaXMsZCxjLmV2ZW50LnRyaWdnZXIoSVswXSxJLnNsaWNlKDEpLHRoaXMpKSx4LnN0b3BQcm9wYWdhdGlvbigpLHguaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Z3IpfX0pfWMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oaSxkLGIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lciYmaS5yZW1vdmVFdmVudExpc3RlbmVyKGQsYil9LGMuRXZlbnQ9ZnVuY3Rpb24oaSxkKXtpZighKHRoaXMgaW5zdGFuY2VvZiBjLkV2ZW50KSlyZXR1cm4gbmV3IGMuRXZlbnQoaSxkKTtpJiZpLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1pLHRoaXMudHlwZT1pLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9aS5kZWZhdWx0UHJldmVudGVkfHxpLmRlZmF1bHRQcmV2ZW50ZWQ9PT12b2lkIDAmJmkucmV0dXJuVmFsdWU9PT0hMT9ncjp5cix0aGlzLnRhcmdldD1pLnRhcmdldCYmaS50YXJnZXQubm9kZVR5cGU9PT0zP2kudGFyZ2V0LnBhcmVudE5vZGU6aS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWkuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9aS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9aSxkJiZjLmV4dGVuZCh0aGlzLGQpLHRoaXMudGltZVN0YW1wPWkmJmkudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbYy5leHBhbmRvXT0hMH0sYy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOnlyLGlzUHJvcGFnYXRpb25TdG9wcGVkOnlyLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOnlyLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWdyLGkmJiF0aGlzLmlzU2ltdWxhdGVkJiZpLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBpPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWdyLGkmJiF0aGlzLmlzU2ltdWxhdGVkJiZpLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgaT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1ncixpJiYhdGhpcy5pc1NpbXVsYXRlZCYmaS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sYy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDohMH0sYy5ldmVudC5hZGRQcm9wKSxjLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGksZCl7ZnVuY3Rpb24gYih4KXtpZihGLmRvY3VtZW50TW9kZSl7dmFyIEE9dnQuZ2V0KHRoaXMsImhhbmRsZSIpLEk9Yy5ldmVudC5maXgoeCk7SS50eXBlPXgudHlwZT09PSJmb2N1c2luIj8iZm9jdXMiOiJibHVyIixJLmlzU2ltdWxhdGVkPSEwLEEoeCksSS50YXJnZXQ9PT1JLmN1cnJlbnRUYXJnZXQmJkEoSSl9ZWxzZSBjLmV2ZW50LnNpbXVsYXRlKGQseC50YXJnZXQsYy5ldmVudC5maXgoeCkpfWMuZXZlbnQuc3BlY2lhbFtpXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgeDtpZihhbih0aGlzLGksITApLEYuZG9jdW1lbnRNb2RlKXg9dnQuZ2V0KHRoaXMsZCkseHx8dGhpcy5hZGRFdmVudExpc3RlbmVyKGQsYiksdnQuc2V0KHRoaXMsZCwoeHx8MCkrMSk7ZWxzZSByZXR1cm4hMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBhbih0aGlzLGkpLCEwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciB4O2lmKEYuZG9jdW1lbnRNb2RlKXg9dnQuZ2V0KHRoaXMsZCktMSx4P3Z0LnNldCh0aGlzLGQseCk6KHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLGIpLHZ0LnJlbW92ZSh0aGlzLGQpKTtlbHNlIHJldHVybiExfSxfZGVmYXVsdDpmdW5jdGlvbih4KXtyZXR1cm4gdnQuZ2V0KHgudGFyZ2V0LGkpfSxkZWxlZ2F0ZVR5cGU6ZH0sYy5ldmVudC5zcGVjaWFsW2RdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciB4PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxBPUYuZG9jdW1lbnRNb2RlP3RoaXM6eCxJPXZ0LmdldChBLGQpO0l8fChGLmRvY3VtZW50TW9kZT90aGlzLmFkZEV2ZW50TGlzdGVuZXIoZCxiKTp4LmFkZEV2ZW50TGlzdGVuZXIoaSxiLCEwKSksdnQuc2V0KEEsZCwoSXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLEE9Ri5kb2N1bWVudE1vZGU/dGhpczp4LEk9dnQuZ2V0KEEsZCktMTtJP3Z0LnNldChBLGQsSSk6KEYuZG9jdW1lbnRNb2RlP3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLGIpOngucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLGIsITApLHZ0LnJlbW92ZShBLGQpKX19fSksYy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihpLGQpe2MuZXZlbnQuc3BlY2lhbFtpXT17ZGVsZWdhdGVUeXBlOmQsYmluZFR5cGU6ZCxoYW5kbGU6ZnVuY3Rpb24oYil7dmFyIHgsQT10aGlzLEk9Yi5yZWxhdGVkVGFyZ2V0LE89Yi5oYW5kbGVPYmo7cmV0dXJuKCFJfHxJIT09QSYmIWMuY29udGFpbnMoQSxJKSkmJihiLnR5cGU9Ty5vcmlnVHlwZSx4PU8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYi50eXBlPWQpLHh9fX0pLGMuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihpLGQsYix4KXtyZXR1cm4gem4odGhpcyxpLGQsYix4KX0sb25lOmZ1bmN0aW9uKGksZCxiLHgpe3JldHVybiB6bih0aGlzLGksZCxiLHgsMSl9LG9mZjpmdW5jdGlvbihpLGQsYil7dmFyIHgsQTtpZihpJiZpLnByZXZlbnREZWZhdWx0JiZpLmhhbmRsZU9iailyZXR1cm4geD1pLmhhbmRsZU9iaixjKGkuZGVsZWdhdGVUYXJnZXQpLm9mZih4Lm5hbWVzcGFjZT94Lm9yaWdUeXBlKyIuIit4Lm5hbWVzcGFjZTp4Lm9yaWdUeXBlLHguc2VsZWN0b3IseC5oYW5kbGVyKSx0aGlzO2lmKHR5cGVvZiBpPT0ib2JqZWN0Iil7Zm9yKEEgaW4gaSl0aGlzLm9mZihBLGQsaVtBXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGQ9PT0hMXx8dHlwZW9mIGQ9PSJmdW5jdGlvbiIpJiYoYj1kLGQ9dm9pZCAwKSxiPT09ITEmJihiPXlyKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LnJlbW92ZSh0aGlzLGksYixkKX0pfX0pO3ZhciBVcz0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxxcz0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxHcz0vXlxzKjwhXFtDREFUQVxbfFxdXF0+XHMqJC9nO2Z1bmN0aW9uIFppKGksZCl7cmV0dXJuIEcoaSwidGFibGUiKSYmRyhkLm5vZGVUeXBlIT09MTE/ZDpkLmZpcnN0Q2hpbGQsInRyIikmJmMoaSkuY2hpbGRyZW4oInRib2R5IilbMF18fGl9ZnVuY3Rpb24gWHMoaSl7cmV0dXJuIGkudHlwZT0oaS5nZXRBdHRyaWJ1dGUoInR5cGUiKSE9PW51bGwpKyIvIitpLnR5cGUsaX1mdW5jdGlvbiAkcyhpKXtyZXR1cm4oaS50eXBlfHwiIikuc2xpY2UoMCw1KT09PSJ0cnVlLyI/aS50eXBlPWkudHlwZS5zbGljZSg1KTppLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGl9ZnVuY3Rpb24gS2koaSxkKXt2YXIgYix4LEEsSSxPLCQsVTtpZihkLm5vZGVUeXBlPT09MSl7aWYodnQuaGFzRGF0YShpKSYmKEk9dnQuZ2V0KGkpLFU9SS5ldmVudHMsVSkpe3Z0LnJlbW92ZShkLCJoYW5kbGUgZXZlbnRzIik7Zm9yKEEgaW4gVSlmb3IoYj0wLHg9VVtBXS5sZW5ndGg7Yjx4O2IrKyljLmV2ZW50LmFkZChkLEEsVVtBXVtiXSl9enQuaGFzRGF0YShpKSYmKE89enQuYWNjZXNzKGkpLCQ9Yy5leHRlbmQoe30sTyksenQuc2V0KGQsJCkpfX1mdW5jdGlvbiBacyhpLGQpe3ZhciBiPWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtiPT09ImlucHV0IiYmamUudGVzdChpLnR5cGUpP2QuY2hlY2tlZD1pLmNoZWNrZWQ6KGI9PT0iaW5wdXQifHxiPT09InRleHRhcmVhIikmJihkLmRlZmF1bHRWYWx1ZT1pLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gd3IoaSxkLGIseCl7ZD1hKGQpO3ZhciBBLEksTywkLFUsUSxkdD0wLGZ0PWkubGVuZ3RoLGl0PWZ0LTEsd3Q9ZFswXSxPdD1rKHd0KTtpZihPdHx8ZnQ+MSYmdHlwZW9mIHd0PT0ic3RyaW5nIiYmIXcuY2hlY2tDbG9uZSYmcXMudGVzdCh3dCkpcmV0dXJuIGkuZWFjaChmdW5jdGlvbihHdCl7dmFyIE10PWkuZXEoR3QpO090JiYoZFswXT13dC5jYWxsKHRoaXMsR3QsTXQuaHRtbCgpKSksd3IoTXQsZCxiLHgpfSk7aWYoZnQmJihBPVhpKGQsaVswXS5vd25lckRvY3VtZW50LCExLGkseCksST1BLmZpcnN0Q2hpbGQsQS5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJihBPUkpLEl8fHgpKXtmb3IoTz1jLm1hcCh2ZShBLCJzY3JpcHQiKSxYcyksJD1PLmxlbmd0aDtkdDxmdDtkdCsrKVU9QSxkdCE9PWl0JiYoVT1jLmNsb25lKFUsITAsITApLCQmJmMubWVyZ2UoTyx2ZShVLCJzY3JpcHQiKSkpLGIuY2FsbChpW2R0XSxVLGR0KTtpZigkKWZvcihRPU9bTy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxjLm1hcChPLCRzKSxkdD0wO2R0PCQ7ZHQrKylVPU9bZHRdLEdpLnRlc3QoVS50eXBlfHwiIikmJiF2dC5hY2Nlc3MoVSwiZ2xvYmFsRXZhbCIpJiZjLmNvbnRhaW5zKFEsVSkmJihVLnNyYyYmKFUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkhPT0ibW9kdWxlIj9jLl9ldmFsVXJsJiYhVS5ub01vZHVsZSYmYy5fZXZhbFVybChVLnNyYyx7bm9uY2U6VS5ub25jZXx8VS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9LFEpOm8oVS50ZXh0Q29udGVudC5yZXBsYWNlKEdzLCIiKSxVLFEpKX1yZXR1cm4gaX1mdW5jdGlvbiBZaShpLGQsYil7Zm9yKHZhciB4LEE9ZD9jLmZpbHRlcihkLGkpOmksST0wOyh4PUFbSV0pIT1udWxsO0krKykhYiYmeC5ub2RlVHlwZT09PTEmJmMuY2xlYW5EYXRhKHZlKHgpKSx4LnBhcmVudE5vZGUmJihiJiZkZSh4KSYmTG4odmUoeCwic2NyaXB0IikpLHgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh4KSk7cmV0dXJuIGl9Yy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oaSl7cmV0dXJuIGl9LGNsb25lOmZ1bmN0aW9uKGksZCxiKXt2YXIgeCxBLEksTywkPWkuY2xvbmVOb2RlKCEwKSxVPWRlKGkpO2lmKCF3Lm5vQ2xvbmVDaGVja2VkJiYoaS5ub2RlVHlwZT09PTF8fGkubm9kZVR5cGU9PT0xMSkmJiFjLmlzWE1MRG9jKGkpKWZvcihPPXZlKCQpLEk9dmUoaSkseD0wLEE9SS5sZW5ndGg7eDxBO3grKylacyhJW3hdLE9beF0pO2lmKGQpaWYoYilmb3IoST1JfHx2ZShpKSxPPU98fHZlKCQpLHg9MCxBPUkubGVuZ3RoO3g8QTt4KyspS2koSVt4XSxPW3hdKTtlbHNlIEtpKGksJCk7cmV0dXJuIE89dmUoJCwic2NyaXB0IiksTy5sZW5ndGg+MCYmTG4oTywhVSYmdmUoaSwic2NyaXB0IikpLCR9LGNsZWFuRGF0YTpmdW5jdGlvbihpKXtmb3IodmFyIGQsYix4LEE9Yy5ldmVudC5zcGVjaWFsLEk9MDsoYj1pW0ldKSE9PXZvaWQgMDtJKyspaWYoQ3QoYikpe2lmKGQ9Ylt2dC5leHBhbmRvXSl7aWYoZC5ldmVudHMpZm9yKHggaW4gZC5ldmVudHMpQVt4XT9jLmV2ZW50LnJlbW92ZShiLHgpOmMucmVtb3ZlRXZlbnQoYix4LGQuaGFuZGxlKTtiW3Z0LmV4cGFuZG9dPXZvaWQgMH1iW3p0LmV4cGFuZG9dJiYoYlt6dC5leHBhbmRvXT12b2lkIDApfX19KSxjLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGkpe3JldHVybiBZaSh0aGlzLGksITApfSxyZW1vdmU6ZnVuY3Rpb24oaSl7cmV0dXJuIFlpKHRoaXMsaSl9LHRleHQ6ZnVuY3Rpb24oaSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihkKXtyZXR1cm4gZD09PXZvaWQgMD9jLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsodGhpcy5ub2RlVHlwZT09PTF8fHRoaXMubm9kZVR5cGU9PT0xMXx8dGhpcy5ub2RlVHlwZT09PTkpJiYodGhpcy50ZXh0Q29udGVudD1kKX0pfSxudWxsLGksYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB3cih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihpKXtpZih0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExfHx0aGlzLm5vZGVUeXBlPT09OSl7dmFyIGQ9WmkodGhpcyxpKTtkLmFwcGVuZENoaWxkKGkpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHdyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe2lmKHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTF8fHRoaXMubm9kZVR5cGU9PT05KXt2YXIgZD1aaSh0aGlzLGkpO2QuaW5zZXJ0QmVmb3JlKGksZC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHdyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHdyKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGkpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBpLGQ9MDsoaT10aGlzW2RdKSE9bnVsbDtkKyspaS5ub2RlVHlwZT09PTEmJihjLmNsZWFuRGF0YSh2ZShpLCExKSksaS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGksZCl7cmV0dXJuIGk9aT8/ITEsZD1kPz9pLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGMuY2xvbmUodGhpcyxpLGQpfSl9LGh0bWw6ZnVuY3Rpb24oaSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihkKXt2YXIgYj10aGlzWzBdfHx7fSx4PTAsQT10aGlzLmxlbmd0aDtpZihkPT09dm9pZCAwJiZiLm5vZGVUeXBlPT09MSlyZXR1cm4gYi5pbm5lckhUTUw7aWYodHlwZW9mIGQ9PSJzdHJpbmciJiYhVXMudGVzdChkKSYmIVNlWyhxaS5leGVjKGQpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZD1jLmh0bWxQcmVmaWx0ZXIoZCk7dHJ5e2Zvcig7eDxBO3grKyliPXRoaXNbeF18fHt9LGIubm9kZVR5cGU9PT0xJiYoYy5jbGVhbkRhdGEodmUoYiwhMSkpLGIuaW5uZXJIVE1MPWQpO2I9MH1jYXRjaHt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoZCl9LG51bGwsaSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgaT1bXTtyZXR1cm4gd3IodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZCl7dmFyIGI9dGhpcy5wYXJlbnROb2RlO2MuaW5BcnJheSh0aGlzLGkpPDAmJihjLmNsZWFuRGF0YSh2ZSh0aGlzKSksYiYmYi5yZXBsYWNlQ2hpbGQoZCx0aGlzKSl9LGkpfX0pLGMuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGksZCl7Yy5mbltpXT1mdW5jdGlvbihiKXtmb3IodmFyIHgsQT1bXSxJPWMoYiksTz1JLmxlbmd0aC0xLCQ9MDskPD1POyQrKyl4PSQ9PT1PP3RoaXM6dGhpcy5jbG9uZSghMCksYyhJWyRdKVtkXSh4KSxsLmFwcGx5KEEseC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEEpfX0pO3ZhciBqbj1uZXcgUmVnRXhwKCJeKCIrWWUrIikoPyFweClbYS16JV0rJCIsImkiKSxNbj0vXi0tLyxzbj1mdW5jdGlvbihpKXt2YXIgZD1pLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuKCFkfHwhZC5vcGVuZXIpJiYoZD10KSxkLmdldENvbXB1dGVkU3R5bGUoaSl9LFFpPWZ1bmN0aW9uKGksZCxiKXt2YXIgeCxBLEk9e307Zm9yKEEgaW4gZClJW0FdPWkuc3R5bGVbQV0saS5zdHlsZVtBXT1kW0FdO3g9Yi5jYWxsKGkpO2ZvcihBIGluIGQpaS5zdHlsZVtBXT1JW0FdO3JldHVybiB4fSxLcz1uZXcgUmVnRXhwKGJlLmpvaW4oInwiKSwiaSIpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXtpZihRKXtVLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLFEuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsRWUuYXBwZW5kQ2hpbGQoVSkuYXBwZW5kQ2hpbGQoUSk7dmFyIGR0PXQuZ2V0Q29tcHV0ZWRTdHlsZShRKTtiPWR0LnRvcCE9PSIxJSIsJD1kKGR0Lm1hcmdpbkxlZnQpPT09MTIsUS5zdHlsZS5yaWdodD0iNjAlIixJPWQoZHQucmlnaHQpPT09MzYseD1kKGR0LndpZHRoKT09PTM2LFEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixBPWQoUS5vZmZzZXRXaWR0aC8zKT09PTEyLEVlLnJlbW92ZUNoaWxkKFUpLFE9bnVsbH19ZnVuY3Rpb24gZChkdCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkdCkpfXZhciBiLHgsQSxJLE8sJCxVPUYuY3JlYXRlRWxlbWVudCgiZGl2IiksUT1GLmNyZWF0ZUVsZW1lbnQoImRpdiIpO1Euc3R5bGUmJihRLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsUS5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHcuY2xlYXJDbG9uZVN0eWxlPVEuc3R5bGUuYmFja2dyb3VuZENsaXA9PT0iY29udGVudC1ib3giLGMuZXh0ZW5kKHcse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSx4fSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBpKCksSX0scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBpKCksYn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSwkfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGkoKSxBfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBkdCxmdCxpdCx3dDtyZXR1cm4gTz09bnVsbCYmKGR0PUYuY3JlYXRlRWxlbWVudCgidGFibGUiKSxmdD1GLmNyZWF0ZUVsZW1lbnQoInRyIiksaXQ9Ri5jcmVhdGVFbGVtZW50KCJkaXYiKSxkdC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZSIsZnQuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpjb250ZW50LWJveDtib3JkZXI6MXB4IHNvbGlkIixmdC5zdHlsZS5oZWlnaHQ9IjFweCIsaXQuc3R5bGUuaGVpZ2h0PSI5cHgiLGl0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIixFZS5hcHBlbmRDaGlsZChkdCkuYXBwZW5kQ2hpbGQoZnQpLmFwcGVuZENoaWxkKGl0KSx3dD10LmdldENvbXB1dGVkU3R5bGUoZnQpLE89cGFyc2VJbnQod3QuaGVpZ2h0LDEwKStwYXJzZUludCh3dC5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQod3QuYm9yZGVyQm90dG9tV2lkdGgsMTApPT09ZnQub2Zmc2V0SGVpZ2h0LEVlLnJlbW92ZUNoaWxkKGR0KSksT319KSl9KSgpO2Z1bmN0aW9uIFJyKGksZCxiKXt2YXIgeCxBLEksTywkPU1uLnRlc3QoZCksVT1pLnN0eWxlO3JldHVybiBiPWJ8fHNuKGkpLGImJihPPWIuZ2V0UHJvcGVydHlWYWx1ZShkKXx8YltkXSwkJiZPJiYoTz1PLnJlcGxhY2UoXywiJDEiKXx8dm9pZCAwKSxPPT09IiImJiFkZShpKSYmKE89Yy5zdHlsZShpLGQpKSwhdy5waXhlbEJveFN0eWxlcygpJiZqbi50ZXN0KE8pJiZLcy50ZXN0KGQpJiYoeD1VLndpZHRoLEE9VS5taW5XaWR0aCxJPVUubWF4V2lkdGgsVS5taW5XaWR0aD1VLm1heFdpZHRoPVUud2lkdGg9TyxPPWIud2lkdGgsVS53aWR0aD14LFUubWluV2lkdGg9QSxVLm1heFdpZHRoPUkpKSxPIT09dm9pZCAwP08rIiI6T31mdW5jdGlvbiBKaShpLGQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZihpKCkpe2RlbGV0ZSB0aGlzLmdldDtyZXR1cm59cmV0dXJuKHRoaXMuZ2V0PWQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXZhciB0YT1bIldlYmtpdCIsIk1veiIsIm1zIl0sZWE9Ri5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxyYT17fTtmdW5jdGlvbiBZcyhpKXtmb3IodmFyIGQ9aVswXS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSksYj10YS5sZW5ndGg7Yi0tOylpZihpPXRhW2JdK2QsaSBpbiBlYSlyZXR1cm4gaX1mdW5jdGlvbiBWbihpKXt2YXIgZD1jLmNzc1Byb3BzW2ldfHxyYVtpXTtyZXR1cm4gZHx8KGkgaW4gZWE/aTpyYVtpXT1ZcyhpKXx8aSl9dmFyIFFzPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxKcz17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sbmE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIGlhKGksZCxiKXt2YXIgeD10ZS5leGVjKGQpO3JldHVybiB4P01hdGgubWF4KDAseFsyXS0oYnx8MCkpKyh4WzNdfHwicHgiKTpkfWZ1bmN0aW9uIEhuKGksZCxiLHgsQSxJKXt2YXIgTz1kPT09IndpZHRoIj8xOjAsJD0wLFU9MCxRPTA7aWYoYj09PSh4PyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDtPPDQ7Tys9MiliPT09Im1hcmdpbiImJihRKz1jLmNzcyhpLGIrYmVbT10sITAsQSkpLHg/KGI9PT0iY29udGVudCImJihVLT1jLmNzcyhpLCJwYWRkaW5nIitiZVtPXSwhMCxBKSksYiE9PSJtYXJnaW4iJiYoVS09Yy5jc3MoaSwiYm9yZGVyIitiZVtPXSsiV2lkdGgiLCEwLEEpKSk6KFUrPWMuY3NzKGksInBhZGRpbmciK2JlW09dLCEwLEEpLGIhPT0icGFkZGluZyI/VSs9Yy5jc3MoaSwiYm9yZGVyIitiZVtPXSsiV2lkdGgiLCEwLEEpOiQrPWMuY3NzKGksImJvcmRlciIrYmVbT10rIldpZHRoIiwhMCxBKSk7cmV0dXJuIXgmJkk+PTAmJihVKz1NYXRoLm1heCgwLE1hdGguY2VpbChpWyJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpXS1JLVUtJC0uNSkpfHwwKSxVK1F9ZnVuY3Rpb24gYWEoaSxkLGIpe3ZhciB4PXNuKGkpLEE9IXcuYm94U2l6aW5nUmVsaWFibGUoKXx8YixJPUEmJmMuY3NzKGksImJveFNpemluZyIsITEseCk9PT0iYm9yZGVyLWJveCIsTz1JLCQ9UnIoaSxkLHgpLFU9Im9mZnNldCIrZFswXS50b1VwcGVyQ2FzZSgpK2Quc2xpY2UoMSk7aWYoam4udGVzdCgkKSl7aWYoIWIpcmV0dXJuICQ7JD0iYXV0byJ9cmV0dXJuKCF3LmJveFNpemluZ1JlbGlhYmxlKCkmJkl8fCF3LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkcoaSwidHIiKXx8JD09PSJhdXRvInx8IXBhcnNlRmxvYXQoJCkmJmMuY3NzKGksImRpc3BsYXkiLCExLHgpPT09ImlubGluZSIpJiZpLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoST1jLmNzcyhpLCJib3hTaXppbmciLCExLHgpPT09ImJvcmRlci1ib3giLE89VSBpbiBpLE8mJigkPWlbVV0pKSwkPXBhcnNlRmxvYXQoJCl8fDAsJCtIbihpLGQsYnx8KEk/ImJvcmRlciI6ImNvbnRlbnQiKSxPLHgsJCkrInB4In1jLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihpLGQpe2lmKGQpe3ZhciBiPVJyKGksIm9wYWNpdHkiKTtyZXR1cm4gYj09PSIiPyIxIjpifX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlU2xpY2U6ITAsY29sdW1uQ291bnQ6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCxzY2FsZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oaSxkLGIseCl7aWYoISghaXx8aS5ub2RlVHlwZT09PTN8fGkubm9kZVR5cGU9PT04fHwhaS5zdHlsZSkpe3ZhciBBLEksTywkPWd0KGQpLFU9TW4udGVzdChkKSxRPWkuc3R5bGU7aWYoVXx8KGQ9Vm4oJCkpLE89Yy5jc3NIb29rc1tkXXx8Yy5jc3NIb29rc1skXSxiIT09dm9pZCAwKXtpZihJPXR5cGVvZiBiLEk9PT0ic3RyaW5nIiYmKEE9dGUuZXhlYyhiKSkmJkFbMV0mJihiPWVuKGksZCxBKSxJPSJudW1iZXIiKSxiPT1udWxsfHxiIT09YilyZXR1cm47ST09PSJudW1iZXIiJiYhVSYmKGIrPUEmJkFbM118fChjLmNzc051bWJlclskXT8iIjoicHgiKSksIXcuY2xlYXJDbG9uZVN0eWxlJiZiPT09IiImJmQuaW5kZXhPZigiYmFja2dyb3VuZCIpPT09MCYmKFFbZF09ImluaGVyaXQiKSwoIU98fCEoInNldCJpbiBPKXx8KGI9Ty5zZXQoaSxiLHgpKSE9PXZvaWQgMCkmJihVP1Euc2V0UHJvcGVydHkoZCxiKTpRW2RdPWIpfWVsc2UgcmV0dXJuIE8mJiJnZXQiaW4gTyYmKEE9Ty5nZXQoaSwhMSx4KSkhPT12b2lkIDA/QTpRW2RdfX0sY3NzOmZ1bmN0aW9uKGksZCxiLHgpe3ZhciBBLEksTywkPWd0KGQpLFU9TW4udGVzdChkKTtyZXR1cm4gVXx8KGQ9Vm4oJCkpLE89Yy5jc3NIb29rc1tkXXx8Yy5jc3NIb29rc1skXSxPJiYiZ2V0ImluIE8mJihBPU8uZ2V0KGksITAsYikpLEE9PT12b2lkIDAmJihBPVJyKGksZCx4KSksQT09PSJub3JtYWwiJiZkIGluIG5hJiYoQT1uYVtkXSksYj09PSIifHxiPyhJPXBhcnNlRmxvYXQoQSksYj09PSEwfHxpc0Zpbml0ZShJKT9JfHwwOkEpOkF9fSksYy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihpLGQpe2MuY3NzSG9va3NbZF09e2dldDpmdW5jdGlvbihiLHgsQSl7aWYoeClyZXR1cm4gUXMudGVzdChjLmNzcyhiLCJkaXNwbGF5IikpJiYoIWIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGh8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKT9RaShiLEpzLGZ1bmN0aW9uKCl7cmV0dXJuIGFhKGIsZCxBKX0pOmFhKGIsZCxBKX0sc2V0OmZ1bmN0aW9uKGIseCxBKXt2YXIgSSxPPXNuKGIpLCQ9IXcuc2Nyb2xsYm94U2l6ZSgpJiZPLnBvc2l0aW9uPT09ImFic29sdXRlIixVPSR8fEEsUT1VJiZjLmNzcyhiLCJib3hTaXppbmciLCExLE8pPT09ImJvcmRlci1ib3giLGR0PUE/SG4oYixkLEEsUSxPKTowO3JldHVybiBRJiYkJiYoZHQtPU1hdGguY2VpbChiWyJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpXS1wYXJzZUZsb2F0KE9bZF0pLUhuKGIsZCwiYm9yZGVyIiwhMSxPKS0uNSkpLGR0JiYoST10ZS5leGVjKHgpKSYmKElbM118fCJweCIpIT09InB4IiYmKGIuc3R5bGVbZF09eCx4PWMuY3NzKGIsZCkpLGlhKGIseCxkdCl9fX0pLGMuY3NzSG9va3MubWFyZ2luTGVmdD1KaSh3LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihpLGQpe2lmKGQpcmV0dXJuKHBhcnNlRmxvYXQoUnIoaSwibWFyZ2luTGVmdCIpKXx8aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LVFpKGkse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxjLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLGQpe2MuY3NzSG9va3NbaStkXT17ZXhwYW5kOmZ1bmN0aW9uKGIpe2Zvcih2YXIgeD0wLEE9e30sST10eXBlb2YgYj09InN0cmluZyI/Yi5zcGxpdCgiICIpOltiXTt4PDQ7eCsrKUFbaStiZVt4XStkXT1JW3hdfHxJW3gtMl18fElbMF07cmV0dXJuIEF9fSxpIT09Im1hcmdpbiImJihjLmNzc0hvb2tzW2krZF0uc2V0PWlhKX0pLGMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGIseCxBKXt2YXIgSSxPLCQ9e30sVT0wO2lmKEFycmF5LmlzQXJyYXkoeCkpe2ZvcihJPXNuKGIpLE89eC5sZW5ndGg7VTxPO1UrKykkW3hbVV1dPWMuY3NzKGIseFtVXSwhMSxJKTtyZXR1cm4gJH1yZXR1cm4gQSE9PXZvaWQgMD9jLnN0eWxlKGIseCxBKTpjLmNzcyhiLHgpfSxpLGQsYXJndW1lbnRzLmxlbmd0aD4xKX19KTtmdW5jdGlvbiBtZShpLGQsYix4LEEpe3JldHVybiBuZXcgbWUucHJvdG90eXBlLmluaXQoaSxkLGIseCxBKX1jLlR3ZWVuPW1lLG1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bWUsaW5pdDpmdW5jdGlvbihpLGQsYix4LEEsSSl7dGhpcy5lbGVtPWksdGhpcy5wcm9wPWIsdGhpcy5lYXNpbmc9QXx8Yy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXgsdGhpcy51bml0PUl8fChjLmNzc051bWJlcltiXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGk9bWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGkmJmkuZ2V0P2kuZ2V0KHRoaXMpOm1lLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihpKXt2YXIgZCxiPW1lLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZD1jLmVhc2luZ1t0aGlzLmVhc2luZ10oaSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qaSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1kPWksdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYiYmYi5zZXQ/Yi5zZXQodGhpcyk6bWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sbWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPW1lLnByb3RvdHlwZSxtZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oaSl7dmFyIGQ7cmV0dXJuIGkuZWxlbS5ub2RlVHlwZSE9PTF8fGkuZWxlbVtpLnByb3BdIT1udWxsJiZpLmVsZW0uc3R5bGVbaS5wcm9wXT09bnVsbD9pLmVsZW1baS5wcm9wXTooZD1jLmNzcyhpLmVsZW0saS5wcm9wLCIiKSwhZHx8ZD09PSJhdXRvIj8wOmQpfSxzZXQ6ZnVuY3Rpb24oaSl7Yy5meC5zdGVwW2kucHJvcF0/Yy5meC5zdGVwW2kucHJvcF0oaSk6aS5lbGVtLm5vZGVUeXBlPT09MSYmKGMuY3NzSG9va3NbaS5wcm9wXXx8aS5lbGVtLnN0eWxlW1ZuKGkucHJvcCldIT1udWxsKT9jLnN0eWxlKGkuZWxlbSxpLnByb3AsaS5ub3craS51bml0KTppLmVsZW1baS5wcm9wXT1pLm5vd319fSxtZS5wcm9wSG9va3Muc2Nyb2xsVG9wPW1lLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oaSl7aS5lbGVtLm5vZGVUeXBlJiZpLmVsZW0ucGFyZW50Tm9kZSYmKGkuZWxlbVtpLnByb3BdPWkubm93KX19LGMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oaSl7cmV0dXJuIGl9LHN3aW5nOmZ1bmN0aW9uKGkpe3JldHVybiAuNS1NYXRoLmNvcyhpKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LGMuZng9bWUucHJvdG90eXBlLmluaXQsYy5meC5zdGVwPXt9O3ZhciB4cixvbix0bz0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sZW89L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBXbigpe29uJiYoRi5oaWRkZW49PT0hMSYmdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoV24pOnQuc2V0VGltZW91dChXbixjLmZ4LmludGVydmFsKSxjLmZ4LnRpY2soKSl9ZnVuY3Rpb24gc2EoKXtyZXR1cm4gdC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eHI9dm9pZCAwfSkseHI9RGF0ZS5ub3coKX1mdW5jdGlvbiBsbihpLGQpe3ZhciBiLHg9MCxBPXtoZWlnaHQ6aX07Zm9yKGQ9ZD8xOjA7eDw0O3grPTItZCliPWJlW3hdLEFbIm1hcmdpbiIrYl09QVsicGFkZGluZyIrYl09aTtyZXR1cm4gZCYmKEEub3BhY2l0eT1BLndpZHRoPWkpLEF9ZnVuY3Rpb24gb2EoaSxkLGIpe2Zvcih2YXIgeCxBPShSZS50d2VlbmVyc1tkXXx8W10pLmNvbmNhdChSZS50d2VlbmVyc1siKiJdKSxJPTAsTz1BLmxlbmd0aDtJPE87SSsrKWlmKHg9QVtJXS5jYWxsKGIsZCxpKSlyZXR1cm4geH1mdW5jdGlvbiBybyhpLGQsYil7dmFyIHgsQSxJLE8sJCxVLFEsZHQsZnQ9IndpZHRoImluIGR8fCJoZWlnaHQiaW4gZCxpdD10aGlzLHd0PXt9LE90PWkuc3R5bGUsR3Q9aS5ub2RlVHlwZSYmbXIoaSksTXQ9dnQuZ2V0KGksImZ4c2hvdyIpO2IucXVldWV8fChPPWMuX3F1ZXVlSG9va3MoaSwiZngiKSxPLnVucXVldWVkPT1udWxsJiYoTy51bnF1ZXVlZD0wLCQ9Ty5lbXB0eS5maXJlLE8uZW1wdHkuZmlyZT1mdW5jdGlvbigpe08udW5xdWV1ZWR8fCQoKX0pLE8udW5xdWV1ZWQrKyxpdC5hbHdheXMoZnVuY3Rpb24oKXtpdC5hbHdheXMoZnVuY3Rpb24oKXtPLnVucXVldWVkLS0sYy5xdWV1ZShpLCJmeCIpLmxlbmd0aHx8Ty5lbXB0eS5maXJlKCl9KX0pKTtmb3IoeCBpbiBkKWlmKEE9ZFt4XSx0by50ZXN0KEEpKXtpZihkZWxldGUgZFt4XSxJPUl8fEE9PT0idG9nZ2xlIixBPT09KEd0PyJoaWRlIjoic2hvdyIpKWlmKEE9PT0ic2hvdyImJk10JiZNdFt4XSE9PXZvaWQgMClHdD0hMDtlbHNlIGNvbnRpbnVlO3d0W3hdPU10JiZNdFt4XXx8Yy5zdHlsZShpLHgpfWlmKFU9IWMuaXNFbXB0eU9iamVjdChkKSwhKCFVJiZjLmlzRW1wdHlPYmplY3Qod3QpKSl7ZnQmJmkubm9kZVR5cGU9PT0xJiYoYi5vdmVyZmxvdz1bT3Qub3ZlcmZsb3csT3Qub3ZlcmZsb3dYLE90Lm92ZXJmbG93WV0sUT1NdCYmTXQuZGlzcGxheSxRPT1udWxsJiYoUT12dC5nZXQoaSwiZGlzcGxheSIpKSxkdD1jLmNzcyhpLCJkaXNwbGF5IiksZHQ9PT0ibm9uZSImJihRP2R0PVE6KGtlKFtpXSwhMCksUT1pLnN0eWxlLmRpc3BsYXl8fFEsZHQ9Yy5jc3MoaSwiZGlzcGxheSIpLGtlKFtpXSkpKSwoZHQ9PT0iaW5saW5lInx8ZHQ9PT0iaW5saW5lLWJsb2NrIiYmUSE9bnVsbCkmJmMuY3NzKGksImZsb2F0Iik9PT0ibm9uZSImJihVfHwoaXQuZG9uZShmdW5jdGlvbigpe090LmRpc3BsYXk9UX0pLFE9PW51bGwmJihkdD1PdC5kaXNwbGF5LFE9ZHQ9PT0ibm9uZSI/IiI6ZHQpKSxPdC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYi5vdmVyZmxvdyYmKE90Lm92ZXJmbG93PSJoaWRkZW4iLGl0LmFsd2F5cyhmdW5jdGlvbigpe090Lm92ZXJmbG93PWIub3ZlcmZsb3dbMF0sT3Qub3ZlcmZsb3dYPWIub3ZlcmZsb3dbMV0sT3Qub3ZlcmZsb3dZPWIub3ZlcmZsb3dbMl19KSksVT0hMTtmb3IoeCBpbiB3dClVfHwoTXQ/ImhpZGRlbiJpbiBNdCYmKEd0PU10LmhpZGRlbik6TXQ9dnQuYWNjZXNzKGksImZ4c2hvdyIse2Rpc3BsYXk6UX0pLEkmJihNdC5oaWRkZW49IUd0KSxHdCYma2UoW2ldLCEwKSxpdC5kb25lKGZ1bmN0aW9uKCl7R3R8fGtlKFtpXSksdnQucmVtb3ZlKGksImZ4c2hvdyIpO2Zvcih4IGluIHd0KWMuc3R5bGUoaSx4LHd0W3hdKX0pKSxVPW9hKEd0P010W3hdOjAseCxpdCkseCBpbiBNdHx8KE10W3hdPVUuc3RhcnQsR3QmJihVLmVuZD1VLnN0YXJ0LFUuc3RhcnQ9MCkpfX1mdW5jdGlvbiBubyhpLGQpe3ZhciBiLHgsQSxJLE87Zm9yKGIgaW4gaSlpZih4PWd0KGIpLEE9ZFt4XSxJPWlbYl0sQXJyYXkuaXNBcnJheShJKSYmKEE9SVsxXSxJPWlbYl09SVswXSksYiE9PXgmJihpW3hdPUksZGVsZXRlIGlbYl0pLE89Yy5jc3NIb29rc1t4XSxPJiYiZXhwYW5kImluIE8pe0k9Ty5leHBhbmQoSSksZGVsZXRlIGlbeF07Zm9yKGIgaW4gSSliIGluIGl8fChpW2JdPUlbYl0sZFtiXT1BKX1lbHNlIGRbeF09QX1mdW5jdGlvbiBSZShpLGQsYil7dmFyIHgsQSxJPTAsTz1SZS5wcmVmaWx0ZXJzLmxlbmd0aCwkPWMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgVS5lbGVtfSksVT1mdW5jdGlvbigpe2lmKEEpcmV0dXJuITE7Zm9yKHZhciBmdD14cnx8c2EoKSxpdD1NYXRoLm1heCgwLFEuc3RhcnRUaW1lK1EuZHVyYXRpb24tZnQpLHd0PWl0L1EuZHVyYXRpb258fDAsT3Q9MS13dCxHdD0wLE10PVEudHdlZW5zLmxlbmd0aDtHdDxNdDtHdCsrKVEudHdlZW5zW0d0XS5ydW4oT3QpO3JldHVybiAkLm5vdGlmeVdpdGgoaSxbUSxPdCxpdF0pLE90PDEmJk10P2l0OihNdHx8JC5ub3RpZnlXaXRoKGksW1EsMSwwXSksJC5yZXNvbHZlV2l0aChpLFtRXSksITEpfSxRPSQucHJvbWlzZSh7ZWxlbTppLHByb3BzOmMuZXh0ZW5kKHt9LGQpLG9wdHM6Yy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOmMuZWFzaW5nLl9kZWZhdWx0fSxiKSxvcmlnaW5hbFByb3BlcnRpZXM6ZCxvcmlnaW5hbE9wdGlvbnM6YixzdGFydFRpbWU6eHJ8fHNhKCksZHVyYXRpb246Yi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZnQsaXQpe3ZhciB3dD1jLlR3ZWVuKGksUS5vcHRzLGZ0LGl0LFEub3B0cy5zcGVjaWFsRWFzaW5nW2Z0XXx8US5vcHRzLmVhc2luZyk7cmV0dXJuIFEudHdlZW5zLnB1c2god3QpLHd0fSxzdG9wOmZ1bmN0aW9uKGZ0KXt2YXIgaXQ9MCx3dD1mdD9RLnR3ZWVucy5sZW5ndGg6MDtpZihBKXJldHVybiB0aGlzO2ZvcihBPSEwO2l0PHd0O2l0KyspUS50d2VlbnNbaXRdLnJ1bigxKTtyZXR1cm4gZnQ/KCQubm90aWZ5V2l0aChpLFtRLDEsMF0pLCQucmVzb2x2ZVdpdGgoaSxbUSxmdF0pKTokLnJlamVjdFdpdGgoaSxbUSxmdF0pLHRoaXN9fSksZHQ9US5wcm9wcztmb3Iobm8oZHQsUS5vcHRzLnNwZWNpYWxFYXNpbmcpO0k8TztJKyspaWYoeD1SZS5wcmVmaWx0ZXJzW0ldLmNhbGwoUSxpLGR0LFEub3B0cykseClyZXR1cm4gayh4LnN0b3ApJiYoYy5fcXVldWVIb29rcyhRLmVsZW0sUS5vcHRzLnF1ZXVlKS5zdG9wPXguc3RvcC5iaW5kKHgpKSx4O3JldHVybiBjLm1hcChkdCxvYSxRKSxrKFEub3B0cy5zdGFydCkmJlEub3B0cy5zdGFydC5jYWxsKGksUSksUS5wcm9ncmVzcyhRLm9wdHMucHJvZ3Jlc3MpLmRvbmUoUS5vcHRzLmRvbmUsUS5vcHRzLmNvbXBsZXRlKS5mYWlsKFEub3B0cy5mYWlsKS5hbHdheXMoUS5vcHRzLmFsd2F5cyksYy5meC50aW1lcihjLmV4dGVuZChVLHtlbGVtOmksYW5pbTpRLHF1ZXVlOlEub3B0cy5xdWV1ZX0pKSxRfWMuQW5pbWF0aW9uPWMuZXh0ZW5kKFJlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbihpLGQpe3ZhciBiPXRoaXMuY3JlYXRlVHdlZW4oaSxkKTtyZXR1cm4gZW4oYi5lbGVtLGksdGUuZXhlYyhkKSxiKSxifV19LHR3ZWVuZXI6ZnVuY3Rpb24oaSxkKXtrKGkpPyhkPWksaT1bIioiXSk6aT1pLm1hdGNoKEJ0KTtmb3IodmFyIGIseD0wLEE9aS5sZW5ndGg7eDxBO3grKyliPWlbeF0sUmUudHdlZW5lcnNbYl09UmUudHdlZW5lcnNbYl18fFtdLFJlLnR3ZWVuZXJzW2JdLnVuc2hpZnQoZCl9LHByZWZpbHRlcnM6W3JvXSxwcmVmaWx0ZXI6ZnVuY3Rpb24oaSxkKXtkP1JlLnByZWZpbHRlcnMudW5zaGlmdChpKTpSZS5wcmVmaWx0ZXJzLnB1c2goaSl9fSksYy5zcGVlZD1mdW5jdGlvbihpLGQsYil7dmFyIHg9aSYmdHlwZW9mIGk9PSJvYmplY3QiP2MuZXh0ZW5kKHt9LGkpOntjb21wbGV0ZTpifHwhYiYmZHx8ayhpKSYmaSxkdXJhdGlvbjppLGVhc2luZzpiJiZkfHxkJiYhayhkKSYmZH07cmV0dXJuIGMuZngub2ZmP3guZHVyYXRpb249MDp0eXBlb2YgeC5kdXJhdGlvbiE9Im51bWJlciImJih4LmR1cmF0aW9uIGluIGMuZnguc3BlZWRzP3guZHVyYXRpb249Yy5meC5zcGVlZHNbeC5kdXJhdGlvbl06eC5kdXJhdGlvbj1jLmZ4LnNwZWVkcy5fZGVmYXVsdCksKHgucXVldWU9PW51bGx8fHgucXVldWU9PT0hMCkmJih4LnF1ZXVlPSJmeCIpLHgub2xkPXguY29tcGxldGUseC5jb21wbGV0ZT1mdW5jdGlvbigpe2soeC5vbGQpJiZ4Lm9sZC5jYWxsKHRoaXMpLHgucXVldWUmJmMuZGVxdWV1ZSh0aGlzLHgucXVldWUpfSx4fSxjLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGksZCxiLHgpe3JldHVybiB0aGlzLmZpbHRlcihtcikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpkfSxpLGIseCl9LGFuaW1hdGU6ZnVuY3Rpb24oaSxkLGIseCl7dmFyIEE9Yy5pc0VtcHR5T2JqZWN0KGkpLEk9Yy5zcGVlZChkLGIseCksTz1mdW5jdGlvbigpe3ZhciAkPVJlKHRoaXMsYy5leHRlbmQoe30saSksSSk7KEF8fHZ0LmdldCh0aGlzLCJmaW5pc2giKSkmJiQuc3RvcCghMCl9O3JldHVybiBPLmZpbmlzaD1PLEF8fEkucXVldWU9PT0hMT90aGlzLmVhY2goTyk6dGhpcy5xdWV1ZShJLnF1ZXVlLE8pfSxzdG9wOmZ1bmN0aW9uKGksZCxiKXt2YXIgeD1mdW5jdGlvbihBKXt2YXIgST1BLnN0b3A7ZGVsZXRlIEEuc3RvcCxJKGIpfTtyZXR1cm4gdHlwZW9mIGkhPSJzdHJpbmciJiYoYj1kLGQ9aSxpPXZvaWQgMCksZCYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgQT0hMCxJPWkhPW51bGwmJmkrInF1ZXVlSG9va3MiLE89Yy50aW1lcnMsJD12dC5nZXQodGhpcyk7aWYoSSkkW0ldJiYkW0ldLnN0b3AmJngoJFtJXSk7ZWxzZSBmb3IoSSBpbiAkKSRbSV0mJiRbSV0uc3RvcCYmZW8udGVzdChJKSYmeCgkW0ldKTtmb3IoST1PLmxlbmd0aDtJLS07KU9bSV0uZWxlbT09PXRoaXMmJihpPT1udWxsfHxPW0ldLnF1ZXVlPT09aSkmJihPW0ldLmFuaW0uc3RvcChiKSxBPSExLE8uc3BsaWNlKEksMSkpOyhBfHwhYikmJmMuZGVxdWV1ZSh0aGlzLGkpfSl9LGZpbmlzaDpmdW5jdGlvbihpKXtyZXR1cm4gaSE9PSExJiYoaT1pfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZCxiPXZ0LmdldCh0aGlzKSx4PWJbaSsicXVldWUiXSxBPWJbaSsicXVldWVIb29rcyJdLEk9Yy50aW1lcnMsTz14P3gubGVuZ3RoOjA7Zm9yKGIuZmluaXNoPSEwLGMucXVldWUodGhpcyxpLFtdKSxBJiZBLnN0b3AmJkEuc3RvcC5jYWxsKHRoaXMsITApLGQ9SS5sZW5ndGg7ZC0tOylJW2RdLmVsZW09PT10aGlzJiZJW2RdLnF1ZXVlPT09aSYmKElbZF0uYW5pbS5zdG9wKCEwKSxJLnNwbGljZShkLDEpKTtmb3IoZD0wO2Q8TztkKyspeFtkXSYmeFtkXS5maW5pc2gmJnhbZF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGIuZmluaXNofSl9fSksYy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihpLGQpe3ZhciBiPWMuZm5bZF07Yy5mbltkXT1mdW5jdGlvbih4LEEsSSl7cmV0dXJuIHg9PW51bGx8fHR5cGVvZiB4PT0iYm9vbGVhbiI/Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGxuKGQsITApLHgsQSxJKX19KSxjLmVhY2goe3NsaWRlRG93bjpsbigic2hvdyIpLHNsaWRlVXA6bG4oImhpZGUiKSxzbGlkZVRvZ2dsZTpsbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihpLGQpe2MuZm5baV09ZnVuY3Rpb24oYix4LEEpe3JldHVybiB0aGlzLmFuaW1hdGUoZCxiLHgsQSl9fSksYy50aW1lcnM9W10sYy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGksZD0wLGI9Yy50aW1lcnM7Zm9yKHhyPURhdGUubm93KCk7ZDxiLmxlbmd0aDtkKyspaT1iW2RdLCFpKCkmJmJbZF09PT1pJiZiLnNwbGljZShkLS0sMSk7Yi5sZW5ndGh8fGMuZnguc3RvcCgpLHhyPXZvaWQgMH0sYy5meC50aW1lcj1mdW5jdGlvbihpKXtjLnRpbWVycy5wdXNoKGkpLGMuZnguc3RhcnQoKX0sYy5meC5pbnRlcnZhbD0xMyxjLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7b258fChvbj0hMCxXbigpKX0sYy5meC5zdG9wPWZ1bmN0aW9uKCl7b249bnVsbH0sYy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sYy5mbi5kZWxheT1mdW5jdGlvbihpLGQpe3JldHVybiBpPWMuZngmJmMuZnguc3BlZWRzW2ldfHxpLGQ9ZHx8ImZ4Iix0aGlzLnF1ZXVlKGQsZnVuY3Rpb24oYix4KXt2YXIgQT10LnNldFRpbWVvdXQoYixpKTt4LnN0b3A9ZnVuY3Rpb24oKXt0LmNsZWFyVGltZW91dChBKX19KX0sZnVuY3Rpb24oKXt2YXIgaT1GLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZD1GLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGI9ZC5hcHBlbmRDaGlsZChGLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtpLnR5cGU9ImNoZWNrYm94Iix3LmNoZWNrT249aS52YWx1ZSE9PSIiLHcub3B0U2VsZWN0ZWQ9Yi5zZWxlY3RlZCxpPUYuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnR5cGU9InJhZGlvIix3LnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0In0oKTt2YXIgbGEsTHI9Yy5leHByLmF0dHJIYW5kbGU7Yy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gWSh0aGlzLGMuYXR0cixpLGQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5yZW1vdmVBdHRyKHRoaXMsaSl9KX19KSxjLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihpLGQsYil7dmFyIHgsQSxJPWkubm9kZVR5cGU7aWYoIShJPT09M3x8ST09PTh8fEk9PT0yKSl7aWYodHlwZW9mIGkuZ2V0QXR0cmlidXRlPiJ1IilyZXR1cm4gYy5wcm9wKGksZCxiKTtpZigoSSE9PTF8fCFjLmlzWE1MRG9jKGkpKSYmKEE9Yy5hdHRySG9va3NbZC50b0xvd2VyQ2FzZSgpXXx8KGMuZXhwci5tYXRjaC5ib29sLnRlc3QoZCk/bGE6dm9pZCAwKSksYiE9PXZvaWQgMCl7aWYoYj09PW51bGwpe2MucmVtb3ZlQXR0cihpLGQpO3JldHVybn1yZXR1cm4gQSYmInNldCJpbiBBJiYoeD1BLnNldChpLGIsZCkpIT09dm9pZCAwP3g6KGkuc2V0QXR0cmlidXRlKGQsYisiIiksYil9cmV0dXJuIEEmJiJnZXQiaW4gQSYmKHg9QS5nZXQoaSxkKSkhPT1udWxsP3g6KHg9Yy5maW5kLmF0dHIoaSxkKSx4Pz92b2lkIDApfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oaSxkKXtpZighdy5yYWRpb1ZhbHVlJiZkPT09InJhZGlvIiYmRyhpLCJpbnB1dCIpKXt2YXIgYj1pLnZhbHVlO3JldHVybiBpLnNldEF0dHJpYnV0ZSgidHlwZSIsZCksYiYmKGkudmFsdWU9YiksZH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihpLGQpe3ZhciBiLHg9MCxBPWQmJmQubWF0Y2goQnQpO2lmKEEmJmkubm9kZVR5cGU9PT0xKWZvcig7Yj1BW3grK107KWkucmVtb3ZlQXR0cmlidXRlKGIpfX0pLGxhPXtzZXQ6ZnVuY3Rpb24oaSxkLGIpe3JldHVybiBkPT09ITE/Yy5yZW1vdmVBdHRyKGksYik6aS5zZXRBdHRyaWJ1dGUoYixiKSxifX0sYy5lYWNoKGMuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGksZCl7dmFyIGI9THJbZF18fGMuZmluZC5hdHRyO0xyW2RdPWZ1bmN0aW9uKHgsQSxJKXt2YXIgTywkLFU9QS50b0xvd2VyQ2FzZSgpO3JldHVybiBJfHwoJD1McltVXSxMcltVXT1PLE89Yih4LEEsSSkhPW51bGw/VTpudWxsLExyW1VdPSQpLE99fSk7dmFyIGlvPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksYW89L14oPzphfGFyZWEpJC9pO2MuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGksZCl7cmV0dXJuIFkodGhpcyxjLnByb3AsaSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2MucHJvcEZpeFtpXXx8aV19KX19KSxjLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihpLGQsYil7dmFyIHgsQSxJPWkubm9kZVR5cGU7aWYoIShJPT09M3x8ST09PTh8fEk9PT0yKSlyZXR1cm4oSSE9PTF8fCFjLmlzWE1MRG9jKGkpKSYmKGQ9Yy5wcm9wRml4W2RdfHxkLEE9Yy5wcm9wSG9va3NbZF0pLGIhPT12b2lkIDA/QSYmInNldCJpbiBBJiYoeD1BLnNldChpLGIsZCkpIT09dm9pZCAwP3g6aVtkXT1iOkEmJiJnZXQiaW4gQSYmKHg9QS5nZXQoaSxkKSkhPT1udWxsP3g6aVtkXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGkpe3ZhciBkPWMuZmluZC5hdHRyKGksInRhYmluZGV4Iik7cmV0dXJuIGQ/cGFyc2VJbnQoZCwxMCk6aW8udGVzdChpLm5vZGVOYW1lKXx8YW8udGVzdChpLm5vZGVOYW1lKSYmaS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx3Lm9wdFNlbGVjdGVkfHwoYy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihpKXt2YXIgZD1pLnBhcmVudE5vZGU7cmV0dXJuIGQmJmQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGkpe3ZhciBkPWkucGFyZW50Tm9kZTtkJiYoZC5zZWxlY3RlZEluZGV4LGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLGMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Yy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIGxyKGkpe3ZhciBkPWkubWF0Y2goQnQpfHxbXTtyZXR1cm4gZC5qb2luKCIgIil9ZnVuY3Rpb24gZHIoaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlJiZpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gVW4oaSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoaSk/aTp0eXBlb2YgaT09InN0cmluZyI/aS5tYXRjaChCdCl8fFtdOltdfWMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihpKXt2YXIgZCxiLHgsQSxJLE87cmV0dXJuIGsoaSk/dGhpcy5lYWNoKGZ1bmN0aW9uKCQpe2ModGhpcykuYWRkQ2xhc3MoaS5jYWxsKHRoaXMsJCxkcih0aGlzKSkpfSk6KGQ9VW4oaSksZC5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoeD1kcih0aGlzKSxiPXRoaXMubm9kZVR5cGU9PT0xJiYiICIrbHIoeCkrIiAiLGIpe2ZvcihJPTA7STxkLmxlbmd0aDtJKyspQT1kW0ldLGIuaW5kZXhPZigiICIrQSsiICIpPDAmJihiKz1BKyIgIik7Tz1scihiKSx4IT09TyYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixPKX19KTp0aGlzKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oaSl7dmFyIGQsYix4LEEsSSxPO3JldHVybiBrKGkpP3RoaXMuZWFjaChmdW5jdGlvbigkKXtjKHRoaXMpLnJlbW92ZUNsYXNzKGkuY2FsbCh0aGlzLCQsZHIodGhpcykpKX0pOmFyZ3VtZW50cy5sZW5ndGg/KGQ9VW4oaSksZC5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoeD1kcih0aGlzKSxiPXRoaXMubm9kZVR5cGU9PT0xJiYiICIrbHIoeCkrIiAiLGIpe2ZvcihJPTA7STxkLmxlbmd0aDtJKyspZm9yKEE9ZFtJXTtiLmluZGV4T2YoIiAiK0ErIiAiKT4tMTspYj1iLnJlcGxhY2UoIiAiK0ErIiAiLCIgIik7Tz1scihiKSx4IT09TyYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixPKX19KTp0aGlzKTp0aGlzLmF0dHIoImNsYXNzIiwiIil9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksZCl7dmFyIGIseCxBLEksTz10eXBlb2YgaSwkPU89PT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheShpKTtyZXR1cm4gayhpKT90aGlzLmVhY2goZnVuY3Rpb24oVSl7Yyh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxVLGRyKHRoaXMpLGQpLGQpfSk6dHlwZW9mIGQ9PSJib29sZWFuIiYmJD9kP3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTooYj1VbihpKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigkKWZvcihJPWModGhpcyksQT0wO0E8Yi5sZW5ndGg7QSsrKXg9YltBXSxJLmhhc0NsYXNzKHgpP0kucmVtb3ZlQ2xhc3MoeCk6SS5hZGRDbGFzcyh4KTtlbHNlKGk9PT12b2lkIDB8fE89PT0iYm9vbGVhbiIpJiYoeD1kcih0aGlzKSx4JiZ2dC5zZXQodGhpcywiX19jbGFzc05hbWVfXyIseCksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIseHx8aT09PSExPyIiOnZ0LmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGkpe3ZhciBkLGIseD0wO2ZvcihkPSIgIitpKyIgIjtiPXRoaXNbeCsrXTspaWYoYi5ub2RlVHlwZT09PTEmJigiICIrbHIoZHIoYikpKyIgIikuaW5kZXhPZihkKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgc289L1xyL2c7Yy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihpKXt2YXIgZCxiLHgsQT10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PWsoaSksdGhpcy5lYWNoKGZ1bmN0aW9uKEkpe3ZhciBPO3RoaXMubm9kZVR5cGU9PT0xJiYoeD9PPWkuY2FsbCh0aGlzLEksYyh0aGlzKS52YWwoKSk6Tz1pLE89PW51bGw/Tz0iIjp0eXBlb2YgTz09Im51bWJlciI/Tys9IiI6QXJyYXkuaXNBcnJheShPKSYmKE89Yy5tYXAoTyxmdW5jdGlvbigkKXtyZXR1cm4gJD09bnVsbD8iIjokKyIifSkpLGQ9Yy52YWxIb29rc1t0aGlzLnR5cGVdfHxjLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sKCFkfHwhKCJzZXQiaW4gZCl8fGQuc2V0KHRoaXMsTywidmFsdWUiKT09PXZvaWQgMCkmJih0aGlzLnZhbHVlPU8pKX0pKTpBPyhkPWMudmFsSG9va3NbQS50eXBlXXx8Yy52YWxIb29rc1tBLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGQmJiJnZXQiaW4gZCYmKGI9ZC5nZXQoQSwidmFsdWUiKSkhPT12b2lkIDA/YjooYj1BLnZhbHVlLHR5cGVvZiBiPT0ic3RyaW5nIj9iLnJlcGxhY2Uoc28sIiIpOmI/PyIiKSk6dm9pZCAwfX0pLGMuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oaSl7dmFyIGQ9Yy5maW5kLmF0dHIoaSwidmFsdWUiKTtyZXR1cm4gZD8/bHIoYy50ZXh0KGkpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGkpe3ZhciBkLGIseCxBPWkub3B0aW9ucyxJPWkuc2VsZWN0ZWRJbmRleCxPPWkudHlwZT09PSJzZWxlY3Qtb25lIiwkPU8/bnVsbDpbXSxVPU8/SSsxOkEubGVuZ3RoO2ZvcihJPDA/eD1VOng9Tz9JOjA7eDxVO3grKylpZihiPUFbeF0sKGIuc2VsZWN0ZWR8fHg9PT1JKSYmIWIuZGlzYWJsZWQmJighYi5wYXJlbnROb2RlLmRpc2FibGVkfHwhRyhiLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihkPWMoYikudmFsKCksTylyZXR1cm4gZDskLnB1c2goZCl9cmV0dXJuICR9LHNldDpmdW5jdGlvbihpLGQpe2Zvcih2YXIgYix4LEE9aS5vcHRpb25zLEk9Yy5tYWtlQXJyYXkoZCksTz1BLmxlbmd0aDtPLS07KXg9QVtPXSwoeC5zZWxlY3RlZD1jLmluQXJyYXkoYy52YWxIb29rcy5vcHRpb24uZ2V0KHgpLEkpPi0xKSYmKGI9ITApO3JldHVybiBifHwoaS5zZWxlY3RlZEluZGV4PS0xKSxJfX19fSksYy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Yy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGksZCl7aWYoQXJyYXkuaXNBcnJheShkKSlyZXR1cm4gaS5jaGVja2VkPWMuaW5BcnJheShjKGkpLnZhbCgpLGQpPi0xfX0sdy5jaGVja09ufHwoYy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmkudmFsdWV9KX0pO3ZhciB6cj10LmxvY2F0aW9uLGRhPXtndWlkOkRhdGUubm93KCl9LHFuPS9cPy87Yy5wYXJzZVhNTD1mdW5jdGlvbihpKXt2YXIgZCxiO2lmKCFpfHx0eXBlb2YgaSE9InN0cmluZyIpcmV0dXJuIG51bGw7dHJ5e2Q9bmV3IHQuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGksInRleHQveG1sIil9Y2F0Y2h7fXJldHVybiBiPWQmJmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF0sKCFkfHxiKSYmYy5lcnJvcigiSW52YWxpZCBYTUw6ICIrKGI/Yy5tYXAoYi5jaGlsZE5vZGVzLGZ1bmN0aW9uKHgpe3JldHVybiB4LnRleHRDb250ZW50fSkuam9pbihgCmApOmkpKSxkfTt2YXIgdWE9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLGNhPWZ1bmN0aW9uKGkpe2kuc3RvcFByb3BhZ2F0aW9uKCl9O2MuZXh0ZW5kKGMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oaSxkLGIseCl7dmFyIEEsSSxPLCQsVSxRLGR0LGZ0LGl0PVtifHxGXSx3dD1tLmNhbGwoaSwidHlwZSIpP2kudHlwZTppLE90PW0uY2FsbChpLCJuYW1lc3BhY2UiKT9pLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKEk9ZnQ9Tz1iPWJ8fEYsIShiLm5vZGVUeXBlPT09M3x8Yi5ub2RlVHlwZT09PTgpJiYhdWEudGVzdCh3dCtjLmV2ZW50LnRyaWdnZXJlZCkmJih3dC5pbmRleE9mKCIuIik+LTEmJihPdD13dC5zcGxpdCgiLiIpLHd0PU90LnNoaWZ0KCksT3Quc29ydCgpKSxVPXd0LmluZGV4T2YoIjoiKTwwJiYib24iK3d0LGk9aVtjLmV4cGFuZG9dP2k6bmV3IGMuRXZlbnQod3QsdHlwZW9mIGk9PSJvYmplY3QiJiZpKSxpLmlzVHJpZ2dlcj14PzI6MyxpLm5hbWVzcGFjZT1PdC5qb2luKCIuIiksaS5ybmFtZXNwYWNlPWkubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK090LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsaS5yZXN1bHQ9dm9pZCAwLGkudGFyZ2V0fHwoaS50YXJnZXQ9YiksZD1kPT1udWxsP1tpXTpjLm1ha2VBcnJheShkLFtpXSksZHQ9Yy5ldmVudC5zcGVjaWFsW3d0XXx8e30sISgheCYmZHQudHJpZ2dlciYmZHQudHJpZ2dlci5hcHBseShiLGQpPT09ITEpKSl7aWYoIXgmJiFkdC5ub0J1YmJsZSYmIVAoYikpe2ZvcigkPWR0LmRlbGVnYXRlVHlwZXx8d3QsdWEudGVzdCgkK3d0KXx8KEk9SS5wYXJlbnROb2RlKTtJO0k9SS5wYXJlbnROb2RlKWl0LnB1c2goSSksTz1JO089PT0oYi5vd25lckRvY3VtZW50fHxGKSYmaXQucHVzaChPLmRlZmF1bHRWaWV3fHxPLnBhcmVudFdpbmRvd3x8dCl9Zm9yKEE9MDsoST1pdFtBKytdKSYmIWkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZnQ9SSxpLnR5cGU9QT4xPyQ6ZHQuYmluZFR5cGV8fHd0LFE9KHZ0LmdldChJLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbaS50eXBlXSYmdnQuZ2V0KEksImhhbmRsZSIpLFEmJlEuYXBwbHkoSSxkKSxRPVUmJklbVV0sUSYmUS5hcHBseSYmQ3QoSSkmJihpLnJlc3VsdD1RLmFwcGx5KEksZCksaS5yZXN1bHQ9PT0hMSYmaS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gaS50eXBlPXd0LCF4JiYhaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFkdC5fZGVmYXVsdHx8ZHQuX2RlZmF1bHQuYXBwbHkoaXQucG9wKCksZCk9PT0hMSkmJkN0KGIpJiZVJiZrKGJbd3RdKSYmIVAoYikmJihPPWJbVV0sTyYmKGJbVV09bnVsbCksYy5ldmVudC50cmlnZ2VyZWQ9d3QsaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmdC5hZGRFdmVudExpc3RlbmVyKHd0LGNhKSxiW3d0XSgpLGkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih3dCxjYSksYy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLE8mJihiW1VdPU8pKSxpLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGksZCxiKXt2YXIgeD1jLmV4dGVuZChuZXcgYy5FdmVudCxiLHt0eXBlOmksaXNTaW11bGF0ZWQ6ITB9KTtjLmV2ZW50LnRyaWdnZXIoeCxudWxsLGQpfX0pLGMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQudHJpZ2dlcihpLGQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oaSxkKXt2YXIgYj10aGlzWzBdO2lmKGIpcmV0dXJuIGMuZXZlbnQudHJpZ2dlcihpLGQsYiwhMCl9fSk7dmFyIG9vPS9cW1xdJC8sZmE9L1xyP1xuL2csbG89L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLHVvPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBHbihpLGQsYix4KXt2YXIgQTtpZihBcnJheS5pc0FycmF5KGQpKWMuZWFjaChkLGZ1bmN0aW9uKEksTyl7Ynx8b28udGVzdChpKT94KGksTyk6R24oaSsiWyIrKHR5cGVvZiBPPT0ib2JqZWN0IiYmTyE9bnVsbD9JOiIiKSsiXSIsTyxiLHgpfSk7ZWxzZSBpZighYiYmZihkKT09PSJvYmplY3QiKWZvcihBIGluIGQpR24oaSsiWyIrQSsiXSIsZFtBXSxiLHgpO2Vsc2UgeChpLGQpfWMucGFyYW09ZnVuY3Rpb24oaSxkKXt2YXIgYix4PVtdLEE9ZnVuY3Rpb24oSSxPKXt2YXIgJD1rKE8pP08oKTpPO3hbeC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChJKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KCQ/PyIiKX07aWYoaT09bnVsbClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGkpfHxpLmpxdWVyeSYmIWMuaXNQbGFpbk9iamVjdChpKSljLmVhY2goaSxmdW5jdGlvbigpe0EodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYiBpbiBpKUduKGIsaVtiXSxkLEEpO3JldHVybiB4LmpvaW4oIiYiKX0sYy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGk9Yy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGk/Yy5tYWtlQXJyYXkoaSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBpPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhYyh0aGlzKS5pcygiOmRpc2FibGVkIikmJnVvLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFsby50ZXN0KGkpJiYodGhpcy5jaGVja2VkfHwhamUudGVzdChpKSl9KS5tYXAoZnVuY3Rpb24oaSxkKXt2YXIgYj1jKHRoaXMpLnZhbCgpO3JldHVybiBiPT1udWxsP251bGw6QXJyYXkuaXNBcnJheShiKT9jLm1hcChiLGZ1bmN0aW9uKHgpe3JldHVybntuYW1lOmQubmFtZSx2YWx1ZTp4LnJlcGxhY2UoZmEsYFxyCmApfX0pOntuYW1lOmQubmFtZSx2YWx1ZTpiLnJlcGxhY2UoZmEsYFxyCmApfX0pLmdldCgpfX0pO3ZhciBjbz0vJTIwL2csZm89LyMuKiQvLGhvPS8oWz8mXSlfPVteJl0qLyxwbz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL21nLGJvPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLHZvPS9eKD86R0VUfEhFQUQpJC8sbW89L15cL1wvLyxoYT17fSxYbj17fSxwYT0iKi8iLmNvbmNhdCgiKiIpLCRuPUYuY3JlYXRlRWxlbWVudCgiYSIpOyRuLmhyZWY9enIuaHJlZjtmdW5jdGlvbiBiYShpKXtyZXR1cm4gZnVuY3Rpb24oZCxiKXt0eXBlb2YgZCE9InN0cmluZyImJihiPWQsZD0iKiIpO3ZhciB4LEE9MCxJPWQudG9Mb3dlckNhc2UoKS5tYXRjaChCdCl8fFtdO2lmKGsoYikpZm9yKDt4PUlbQSsrXTspeFswXT09PSIrIj8oeD14LnNsaWNlKDEpfHwiKiIsKGlbeF09aVt4XXx8W10pLnVuc2hpZnQoYikpOihpW3hdPWlbeF18fFtdKS5wdXNoKGIpfX1mdW5jdGlvbiB2YShpLGQsYix4KXt2YXIgQT17fSxJPWk9PT1YbjtmdW5jdGlvbiBPKCQpe3ZhciBVO3JldHVybiBBWyRdPSEwLGMuZWFjaChpWyRdfHxbXSxmdW5jdGlvbihRLGR0KXt2YXIgZnQ9ZHQoZCxiLHgpO2lmKHR5cGVvZiBmdD09InN0cmluZyImJiFJJiYhQVtmdF0pcmV0dXJuIGQuZGF0YVR5cGVzLnVuc2hpZnQoZnQpLE8oZnQpLCExO2lmKEkpcmV0dXJuIShVPWZ0KX0pLFV9cmV0dXJuIE8oZC5kYXRhVHlwZXNbMF0pfHwhQVsiKiJdJiZPKCIqIil9ZnVuY3Rpb24gWm4oaSxkKXt2YXIgYix4LEE9Yy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihiIGluIGQpZFtiXSE9PXZvaWQgMCYmKChBW2JdP2k6eHx8KHg9e30pKVtiXT1kW2JdKTtyZXR1cm4geCYmYy5leHRlbmQoITAsaSx4KSxpfWZ1bmN0aW9uIGdvKGksZCxiKXtmb3IodmFyIHgsQSxJLE8sJD1pLmNvbnRlbnRzLFU9aS5kYXRhVHlwZXM7VVswXT09PSIqIjspVS5zaGlmdCgpLHg9PT12b2lkIDAmJih4PWkubWltZVR5cGV8fGQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZih4KXtmb3IoQSBpbiAkKWlmKCRbQV0mJiRbQV0udGVzdCh4KSl7VS51bnNoaWZ0KEEpO2JyZWFrfX1pZihVWzBdaW4gYilJPVVbMF07ZWxzZXtmb3IoQSBpbiBiKXtpZighVVswXXx8aS5jb252ZXJ0ZXJzW0ErIiAiK1VbMF1dKXtJPUE7YnJlYWt9T3x8KE89QSl9ST1JfHxPfWlmKEkpcmV0dXJuIEkhPT1VWzBdJiZVLnVuc2hpZnQoSSksYltJXX1mdW5jdGlvbiB5byhpLGQsYix4KXt2YXIgQSxJLE8sJCxVLFE9e30sZHQ9aS5kYXRhVHlwZXMuc2xpY2UoKTtpZihkdFsxXSlmb3IoTyBpbiBpLmNvbnZlcnRlcnMpUVtPLnRvTG93ZXJDYXNlKCldPWkuY29udmVydGVyc1tPXTtmb3IoST1kdC5zaGlmdCgpO0k7KWlmKGkucmVzcG9uc2VGaWVsZHNbSV0mJihiW2kucmVzcG9uc2VGaWVsZHNbSV1dPWQpLCFVJiZ4JiZpLmRhdGFGaWx0ZXImJihkPWkuZGF0YUZpbHRlcihkLGkuZGF0YVR5cGUpKSxVPUksST1kdC5zaGlmdCgpLEkpe2lmKEk9PT0iKiIpST1VO2Vsc2UgaWYoVSE9PSIqIiYmVSE9PUkpe2lmKE89UVtVKyIgIitJXXx8UVsiKiAiK0ldLCFPKXtmb3IoQSBpbiBRKWlmKCQ9QS5zcGxpdCgiICIpLCRbMV09PT1JJiYoTz1RW1UrIiAiKyRbMF1dfHxRWyIqICIrJFswXV0sTykpe089PT0hMD9PPVFbQV06UVtBXSE9PSEwJiYoST0kWzBdLGR0LnVuc2hpZnQoJFsxXSkpO2JyZWFrfX1pZihPIT09ITApaWYoTyYmaS50aHJvd3MpZD1PKGQpO2Vsc2UgdHJ5e2Q9TyhkKX1jYXRjaChmdCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6Tz9mdDoiTm8gY29udmVyc2lvbiBmcm9tICIrVSsiIHRvICIrSX19fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZH19Yy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpyLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOmJvLnRlc3QoenIucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6cGEsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOmMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihpLGQpe3JldHVybiBkP1puKFpuKGksYy5hamF4U2V0dGluZ3MpLGQpOlpuKGMuYWpheFNldHRpbmdzLGkpfSxhamF4UHJlZmlsdGVyOmJhKGhhKSxhamF4VHJhbnNwb3J0OmJhKFhuKSxhamF4OmZ1bmN0aW9uKGksZCl7dHlwZW9mIGk9PSJvYmplY3QiJiYoZD1pLGk9dm9pZCAwKSxkPWR8fHt9O3ZhciBiLHgsQSxJLE8sJCxVLFEsZHQsZnQsaXQ9Yy5hamF4U2V0dXAoe30sZCksd3Q9aXQuY29udGV4dHx8aXQsT3Q9aXQuY29udGV4dCYmKHd0Lm5vZGVUeXBlfHx3dC5qcXVlcnkpP2Mod3QpOmMuZXZlbnQsR3Q9Yy5EZWZlcnJlZCgpLE10PWMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGxlPWl0LnN0YXR1c0NvZGV8fHt9LG9lPXt9LE1lPXt9LFZlPSJjYW5jZWxlZCIscXQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihYdCl7dmFyIG5lO2lmKFUpe2lmKCFJKWZvcihJPXt9O25lPXBvLmV4ZWMoQSk7KUlbbmVbMV0udG9Mb3dlckNhc2UoKSsiICJdPShJW25lWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChuZVsyXSk7bmU9SVtYdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG5lPT1udWxsP251bGw6bmUuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIFU/QTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKFh0LG5lKXtyZXR1cm4gVT09bnVsbCYmKFh0PU1lW1h0LnRvTG93ZXJDYXNlKCldPU1lW1h0LnRvTG93ZXJDYXNlKCldfHxYdCxvZVtYdF09bmUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oWHQpe3JldHVybiBVPT1udWxsJiYoaXQubWltZVR5cGU9WHQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oWHQpe3ZhciBuZTtpZihYdClpZihVKXF0LmFsd2F5cyhYdFtxdC5zdGF0dXNdKTtlbHNlIGZvcihuZSBpbiBYdClsZVtuZV09W2xlW25lXSxYdFtuZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihYdCl7dmFyIG5lPVh0fHxWZTtyZXR1cm4gYiYmYi5hYm9ydChuZSksdXIoMCxuZSksdGhpc319O2lmKEd0LnByb21pc2UocXQpLGl0LnVybD0oKGl8fGl0LnVybHx8enIuaHJlZikrIiIpLnJlcGxhY2UobW8senIucHJvdG9jb2wrIi8vIiksaXQudHlwZT1kLm1ldGhvZHx8ZC50eXBlfHxpdC5tZXRob2R8fGl0LnR5cGUsaXQuZGF0YVR5cGVzPShpdC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEJ0KXx8WyIiXSxpdC5jcm9zc0RvbWFpbj09bnVsbCl7JD1GLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7JC5ocmVmPWl0LnVybCwkLmhyZWY9JC5ocmVmLGl0LmNyb3NzRG9tYWluPSRuLnByb3RvY29sKyIvLyIrJG4uaG9zdCE9JC5wcm90b2NvbCsiLy8iKyQuaG9zdH1jYXRjaHtpdC5jcm9zc0RvbWFpbj0hMH19aWYoaXQuZGF0YSYmaXQucHJvY2Vzc0RhdGEmJnR5cGVvZiBpdC5kYXRhIT0ic3RyaW5nIiYmKGl0LmRhdGE9Yy5wYXJhbShpdC5kYXRhLGl0LnRyYWRpdGlvbmFsKSksdmEoaGEsaXQsZCxxdCksVSlyZXR1cm4gcXQ7UT1jLmV2ZW50JiZpdC5nbG9iYWwsUSYmYy5hY3RpdmUrKz09PTAmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksaXQudHlwZT1pdC50eXBlLnRvVXBwZXJDYXNlKCksaXQuaGFzQ29udGVudD0hdm8udGVzdChpdC50eXBlKSx4PWl0LnVybC5yZXBsYWNlKGZvLCIiKSxpdC5oYXNDb250ZW50P2l0LmRhdGEmJml0LnByb2Nlc3NEYXRhJiYoaXQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJihpdC5kYXRhPWl0LmRhdGEucmVwbGFjZShjbywiKyIpKTooZnQ9aXQudXJsLnNsaWNlKHgubGVuZ3RoKSxpdC5kYXRhJiYoaXQucHJvY2Vzc0RhdGF8fHR5cGVvZiBpdC5kYXRhPT0ic3RyaW5nIikmJih4Kz0ocW4udGVzdCh4KT8iJiI6Ij8iKStpdC5kYXRhLGRlbGV0ZSBpdC5kYXRhKSxpdC5jYWNoZT09PSExJiYoeD14LnJlcGxhY2UoaG8sIiQxIiksZnQ9KHFuLnRlc3QoeCk/IiYiOiI/IikrIl89IitkYS5ndWlkKysrZnQpLGl0LnVybD14K2Z0KSxpdC5pZk1vZGlmaWVkJiYoYy5sYXN0TW9kaWZpZWRbeF0mJnF0LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixjLmxhc3RNb2RpZmllZFt4XSksYy5ldGFnW3hdJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbeF0pKSwoaXQuZGF0YSYmaXQuaGFzQ29udGVudCYmaXQuY29udGVudFR5cGUhPT0hMXx8ZC5jb250ZW50VHlwZSkmJnF0LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsaXQuY29udGVudFR5cGUpLHF0LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaXQuZGF0YVR5cGVzWzBdJiZpdC5hY2NlcHRzW2l0LmRhdGFUeXBlc1swXV0/aXQuYWNjZXB0c1tpdC5kYXRhVHlwZXNbMF1dKyhpdC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitwYSsiOyBxPTAuMDEiOiIiKTppdC5hY2NlcHRzWyIqIl0pO2ZvcihkdCBpbiBpdC5oZWFkZXJzKXF0LnNldFJlcXVlc3RIZWFkZXIoZHQsaXQuaGVhZGVyc1tkdF0pO2lmKGl0LmJlZm9yZVNlbmQmJihpdC5iZWZvcmVTZW5kLmNhbGwod3QscXQsaXQpPT09ITF8fFUpKXJldHVybiBxdC5hYm9ydCgpO2lmKFZlPSJhYm9ydCIsTXQuYWRkKGl0LmNvbXBsZXRlKSxxdC5kb25lKGl0LnN1Y2Nlc3MpLHF0LmZhaWwoaXQuZXJyb3IpLGI9dmEoWG4saXQsZCxxdCksIWIpdXIoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7aWYocXQucmVhZHlTdGF0ZT0xLFEmJk90LnRyaWdnZXIoImFqYXhTZW5kIixbcXQsaXRdKSxVKXJldHVybiBxdDtpdC5hc3luYyYmaXQudGltZW91dD4wJiYoTz10LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxdC5hYm9ydCgidGltZW91dCIpfSxpdC50aW1lb3V0KSk7dHJ5e1U9ITEsYi5zZW5kKG9lLHVyKX1jYXRjaChYdCl7aWYoVSl0aHJvdyBYdDt1cigtMSxYdCl9fWZ1bmN0aW9uIHVyKFh0LG5lLE1yLFluKXt2YXIgSGUsVnIsV2UsUWUsSmUsRGU9bmU7VXx8KFU9ITAsTyYmdC5jbGVhclRpbWVvdXQoTyksYj12b2lkIDAsQT1Zbnx8IiIscXQucmVhZHlTdGF0ZT1YdD4wPzQ6MCxIZT1YdD49MjAwJiZYdDwzMDB8fFh0PT09MzA0LE1yJiYoUWU9Z28oaXQscXQsTXIpKSwhSGUmJmMuaW5BcnJheSgic2NyaXB0IixpdC5kYXRhVHlwZXMpPi0xJiZjLmluQXJyYXkoImpzb24iLGl0LmRhdGFUeXBlcyk8MCYmKGl0LmNvbnZlcnRlcnNbInRleHQgc2NyaXB0Il09ZnVuY3Rpb24oKXt9KSxRZT15byhpdCxRZSxxdCxIZSksSGU/KGl0LmlmTW9kaWZpZWQmJihKZT1xdC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLEplJiYoYy5sYXN0TW9kaWZpZWRbeF09SmUpLEplPXF0LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksSmUmJihjLmV0YWdbeF09SmUpKSxYdD09PTIwNHx8aXQudHlwZT09PSJIRUFEIj9EZT0ibm9jb250ZW50IjpYdD09PTMwND9EZT0ibm90bW9kaWZpZWQiOihEZT1RZS5zdGF0ZSxWcj1RZS5kYXRhLFdlPVFlLmVycm9yLEhlPSFXZSkpOihXZT1EZSwoWHR8fCFEZSkmJihEZT0iZXJyb3IiLFh0PDAmJihYdD0wKSkpLHF0LnN0YXR1cz1YdCxxdC5zdGF0dXNUZXh0PShuZXx8RGUpKyIiLEhlP0d0LnJlc29sdmVXaXRoKHd0LFtWcixEZSxxdF0pOkd0LnJlamVjdFdpdGgod3QsW3F0LERlLFdlXSkscXQuc3RhdHVzQ29kZShsZSksbGU9dm9pZCAwLFEmJk90LnRyaWdnZXIoSGU/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbcXQsaXQsSGU/VnI6V2VdKSxNdC5maXJlV2l0aCh3dCxbcXQsRGVdKSxRJiYoT3QudHJpZ2dlcigiYWpheENvbXBsZXRlIixbcXQsaXRdKSwtLWMuYWN0aXZlfHxjLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gcXR9LGdldEpTT046ZnVuY3Rpb24oaSxkLGIpe3JldHVybiBjLmdldChpLGQsYiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gYy5nZXQoaSx2b2lkIDAsZCwic2NyaXB0Iil9fSksYy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGksZCl7Y1tkXT1mdW5jdGlvbihiLHgsQSxJKXtyZXR1cm4gayh4KSYmKEk9SXx8QSxBPXgseD12b2lkIDApLGMuYWpheChjLmV4dGVuZCh7dXJsOmIsdHlwZTpkLGRhdGFUeXBlOkksZGF0YTp4LHN1Y2Nlc3M6QX0sYy5pc1BsYWluT2JqZWN0KGIpJiZiKSl9fSksYy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGkpe3ZhciBkO2ZvcihkIGluIGkuaGVhZGVycylkLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIiYmKGkuY29udGVudFR5cGU9aS5oZWFkZXJzW2RdfHwiIil9KSxjLl9ldmFsVXJsPWZ1bmN0aW9uKGksZCxiKXtyZXR1cm4gYy5hamF4KHt1cmw6aSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih4KXtjLmdsb2JhbEV2YWwoeCxkLGIpfX0pfSxjLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihpKXt2YXIgZDtyZXR1cm4gdGhpc1swXSYmKGsoaSkmJihpPWkuY2FsbCh0aGlzWzBdKSksZD1jKGksdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZkLmluc2VydEJlZm9yZSh0aGlzWzBdKSxkLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzO2IuZmlyc3RFbGVtZW50Q2hpbGQ7KWI9Yi5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYn0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGkpe3JldHVybiBrKGkpP3RoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLndyYXBJbm5lcihpLmNhbGwodGhpcyxkKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jKHRoaXMpLGI9ZC5jb250ZW50cygpO2IubGVuZ3RoP2Iud3JhcEFsbChpKTpkLmFwcGVuZChpKX0pfSx3cmFwOmZ1bmN0aW9uKGkpe3ZhciBkPWsoaSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBBbGwoZD9pLmNhbGwodGhpcyxiKTppKX0pfSx1bndyYXA6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMucGFyZW50KGkpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLGMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihpKXtyZXR1cm4hYy5leHByLnBzZXVkb3MudmlzaWJsZShpKX0sYy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihpKXtyZXR1cm4hIShpLm9mZnNldFdpZHRofHxpLm9mZnNldEhlaWdodHx8aS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LGMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IHQuWE1MSHR0cFJlcXVlc3R9Y2F0Y2h7fX07dmFyIHdvPXswOjIwMCwxMjIzOjIwNH0sanI9Yy5hamF4U2V0dGluZ3MueGhyKCk7dy5jb3JzPSEhanImJiJ3aXRoQ3JlZGVudGlhbHMiaW4ganIsdy5hamF4PWpyPSEhanIsYy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBkLGI7aWYody5jb3JzfHxqciYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oeCxBKXt2YXIgSSxPPWkueGhyKCk7aWYoTy5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKEkgaW4gaS54aHJGaWVsZHMpT1tJXT1pLnhockZpZWxkc1tJXTtpLm1pbWVUeXBlJiZPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSwhaS5jcm9zc0RvbWFpbiYmIXhbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKHhbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoSSBpbiB4KU8uc2V0UmVxdWVzdEhlYWRlcihJLHhbSV0pO2Q9ZnVuY3Rpb24oJCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZCYmKGQ9Yj1PLm9ubG9hZD1PLm9uZXJyb3I9Ty5vbmFib3J0PU8ub250aW1lb3V0PU8ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsJD09PSJhYm9ydCI/Ty5hYm9ydCgpOiQ9PT0iZXJyb3IiP3R5cGVvZiBPLnN0YXR1cyE9Im51bWJlciI/QSgwLCJlcnJvciIpOkEoTy5zdGF0dXMsTy5zdGF0dXNUZXh0KTpBKHdvW08uc3RhdHVzXXx8Ty5zdGF0dXMsTy5zdGF0dXNUZXh0LChPLnJlc3BvbnNlVHlwZXx8InRleHQiKSE9PSJ0ZXh0Inx8dHlwZW9mIE8ucmVzcG9uc2VUZXh0IT0ic3RyaW5nIj97YmluYXJ5Ok8ucmVzcG9uc2V9Ont0ZXh0Ok8ucmVzcG9uc2VUZXh0fSxPLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxPLm9ubG9hZD1kKCksYj1PLm9uZXJyb3I9Ty5vbnRpbWVvdXQ9ZCgiZXJyb3IiKSxPLm9uYWJvcnQhPT12b2lkIDA/Ty5vbmFib3J0PWI6Ty5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtPLnJlYWR5U3RhdGU9PT00JiZ0LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkJiZiKCl9KX0sZD1kKCJhYm9ydCIpO3RyeXtPLnNlbmQoaS5oYXNDb250ZW50JiZpLmRhdGF8fG51bGwpfWNhdGNoKCQpe2lmKGQpdGhyb3cgJH19LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZCgpfX19KSxjLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oaSl7aS5jcm9zc0RvbWFpbiYmKGkuY29udGVudHMuc2NyaXB0PSExKX0pLGMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGkpe3JldHVybiBjLmdsb2JhbEV2YWwoaSksaX19fSksYy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGkpe2kuY2FjaGU9PT12b2lkIDAmJihpLmNhY2hlPSExKSxpLmNyb3NzRG9tYWluJiYoaS50eXBlPSJHRVQiKX0pLGMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihpKXtpZihpLmNyb3NzRG9tYWlufHxpLnNjcmlwdEF0dHJzKXt2YXIgZCxiO3JldHVybntzZW5kOmZ1bmN0aW9uKHgsQSl7ZD1jKCI8c2NyaXB0PiIpLmF0dHIoaS5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6aS5zY3JpcHRDaGFyc2V0LHNyYzppLnVybH0pLm9uKCJsb2FkIGVycm9yIixiPWZ1bmN0aW9uKEkpe2QucmVtb3ZlKCksYj1udWxsLEkmJkEoSS50eXBlPT09ImVycm9yIj80MDQ6MjAwLEkudHlwZSl9KSxGLmhlYWQuYXBwZW5kQ2hpbGQoZFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYigpfX19fSk7dmFyIG1hPVtdLEtuPS8oPSlcPyg/PSZ8JCl8XD9cPy87Yy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBpPW1hLnBvcCgpfHxjLmV4cGFuZG8rIl8iK2RhLmd1aWQrKztyZXR1cm4gdGhpc1tpXT0hMCxpfX0pLGMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oaSxkLGIpe3ZhciB4LEEsSSxPPWkuanNvbnAhPT0hMSYmKEtuLnRlc3QoaS51cmwpPyJ1cmwiOnR5cGVvZiBpLmRhdGE9PSJzdHJpbmciJiYoaS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpPT09MCYmS24udGVzdChpLmRhdGEpJiYiZGF0YSIpO2lmKE98fGkuZGF0YVR5cGVzWzBdPT09Impzb25wIilyZXR1cm4geD1pLmpzb25wQ2FsbGJhY2s9ayhpLmpzb25wQ2FsbGJhY2spP2kuanNvbnBDYWxsYmFjaygpOmkuanNvbnBDYWxsYmFjayxPP2lbT109aVtPXS5yZXBsYWNlKEtuLCIkMSIreCk6aS5qc29ucCE9PSExJiYoaS51cmwrPShxbi50ZXN0KGkudXJsKT8iJiI6Ij8iKStpLmpzb25wKyI9Iit4KSxpLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gSXx8Yy5lcnJvcih4KyIgd2FzIG5vdCBjYWxsZWQiKSxJWzBdfSxpLmRhdGFUeXBlc1swXT0ianNvbiIsQT10W3hdLHRbeF09ZnVuY3Rpb24oKXtJPWFyZ3VtZW50c30sYi5hbHdheXMoZnVuY3Rpb24oKXtBPT09dm9pZCAwP2ModCkucmVtb3ZlUHJvcCh4KTp0W3hdPUEsaVt4XSYmKGkuanNvbnBDYWxsYmFjaz1kLmpzb25wQ2FsbGJhY2ssbWEucHVzaCh4KSksSSYmayhBKSYmQShJWzBdKSxJPUE9dm9pZCAwfSksInNjcmlwdCJ9KSx3LmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBpPUYuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLGkuY2hpbGROb2Rlcy5sZW5ndGg9PT0yfSgpLGMucGFyc2VIVE1MPWZ1bmN0aW9uKGksZCxiKXtpZih0eXBlb2YgaSE9InN0cmluZyIpcmV0dXJuW107dHlwZW9mIGQ9PSJib29sZWFuIiYmKGI9ZCxkPSExKTt2YXIgeCxBLEk7cmV0dXJuIGR8fCh3LmNyZWF0ZUhUTUxEb2N1bWVudD8oZD1GLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikseD1kLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSx4LmhyZWY9Ri5sb2NhdGlvbi5ocmVmLGQuaGVhZC5hcHBlbmRDaGlsZCh4KSk6ZD1GKSxBPWF0LmV4ZWMoaSksST0hYiYmW10sQT9bZC5jcmVhdGVFbGVtZW50KEFbMV0pXTooQT1YaShbaV0sZCxJKSxJJiZJLmxlbmd0aCYmYyhJKS5yZW1vdmUoKSxjLm1lcmdlKFtdLEEuY2hpbGROb2RlcykpfSxjLmZuLmxvYWQ9ZnVuY3Rpb24oaSxkLGIpe3ZhciB4LEEsSSxPPXRoaXMsJD1pLmluZGV4T2YoIiAiKTtyZXR1cm4gJD4tMSYmKHg9bHIoaS5zbGljZSgkKSksaT1pLnNsaWNlKDAsJCkpLGsoZCk/KGI9ZCxkPXZvaWQgMCk6ZCYmdHlwZW9mIGQ9PSJvYmplY3QiJiYoQT0iUE9TVCIpLE8ubGVuZ3RoPjAmJmMuYWpheCh7dXJsOmksdHlwZTpBfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTpkfSkuZG9uZShmdW5jdGlvbihVKXtJPWFyZ3VtZW50cyxPLmh0bWwoeD9jKCI8ZGl2PiIpLmFwcGVuZChjLnBhcnNlSFRNTChVKSkuZmluZCh4KTpVKX0pLmFsd2F5cyhiJiZmdW5jdGlvbihVLFEpe08uZWFjaChmdW5jdGlvbigpe2IuYXBwbHkodGhpcyxJfHxbVS5yZXNwb25zZVRleHQsUSxVXSl9KX0pLHRoaXN9LGMuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKGkpe3JldHVybiBjLmdyZXAoYy50aW1lcnMsZnVuY3Rpb24oZCl7cmV0dXJuIGk9PT1kLmVsZW19KS5sZW5ndGh9LGMub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oaSxkLGIpe3ZhciB4LEEsSSxPLCQsVSxRLGR0PWMuY3NzKGksInBvc2l0aW9uIiksZnQ9YyhpKSxpdD17fTtkdD09PSJzdGF0aWMiJiYoaS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSwkPWZ0Lm9mZnNldCgpLEk9Yy5jc3MoaSwidG9wIiksVT1jLmNzcyhpLCJsZWZ0IiksUT0oZHQ9PT0iYWJzb2x1dGUifHxkdD09PSJmaXhlZCIpJiYoSStVKS5pbmRleE9mKCJhdXRvIik+LTEsUT8oeD1mdC5wb3NpdGlvbigpLE89eC50b3AsQT14LmxlZnQpOihPPXBhcnNlRmxvYXQoSSl8fDAsQT1wYXJzZUZsb2F0KFUpfHwwKSxrKGQpJiYoZD1kLmNhbGwoaSxiLGMuZXh0ZW5kKHt9LCQpKSksZC50b3AhPW51bGwmJihpdC50b3A9ZC50b3AtJC50b3ArTyksZC5sZWZ0IT1udWxsJiYoaXQubGVmdD1kLmxlZnQtJC5sZWZ0K0EpLCJ1c2luZyJpbiBkP2QudXNpbmcuY2FsbChpLGl0KTpmdC5jc3MoaXQpfX0sYy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihpKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBpPT09dm9pZCAwP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKEEpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGksQSl9KTt2YXIgZCxiLHg9dGhpc1swXTtpZih4KXJldHVybiB4LmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhkPXguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYj14Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDpkLnRvcCtiLnBhZ2VZT2Zmc2V0LGxlZnQ6ZC5sZWZ0K2IucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgaSxkLGIseD10aGlzWzBdLEE9e3RvcDowLGxlZnQ6MH07aWYoYy5jc3MoeCwicG9zaXRpb24iKT09PSJmaXhlZCIpZD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKGQ9dGhpcy5vZmZzZXQoKSxiPXgub3duZXJEb2N1bWVudCxpPXgub2Zmc2V0UGFyZW50fHxiLmRvY3VtZW50RWxlbWVudDtpJiYoaT09PWIuYm9keXx8aT09PWIuZG9jdW1lbnRFbGVtZW50KSYmYy5jc3MoaSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylpPWkucGFyZW50Tm9kZTtpJiZpIT09eCYmaS5ub2RlVHlwZT09PTEmJihBPWMoaSkub2Zmc2V0KCksQS50b3ArPWMuY3NzKGksImJvcmRlclRvcFdpZHRoIiwhMCksQS5sZWZ0Kz1jLmNzcyhpLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDpkLnRvcC1BLnRvcC1jLmNzcyh4LCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmQubGVmdC1BLmxlZnQtYy5jc3MoeCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgaT10aGlzLm9mZnNldFBhcmVudDtpJiZjLmNzcyhpLCJwb3NpdGlvbiIpPT09InN0YXRpYyI7KWk9aS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGl8fEVlfSl9fSksYy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGksZCl7dmFyIGI9ZD09PSJwYWdlWU9mZnNldCI7Yy5mbltpXT1mdW5jdGlvbih4KXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKEEsSSxPKXt2YXIgJDtpZihQKEEpPyQ9QTpBLm5vZGVUeXBlPT09OSYmKCQ9QS5kZWZhdWx0VmlldyksTz09PXZvaWQgMClyZXR1cm4gJD8kW2RdOkFbSV07JD8kLnNjcm9sbFRvKGI/JC5wYWdlWE9mZnNldDpPLGI/TzokLnBhZ2VZT2Zmc2V0KTpBW0ldPU99LGkseCxhcmd1bWVudHMubGVuZ3RoKX19KSxjLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oaSxkKXtjLmNzc0hvb2tzW2RdPUppKHcucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihiLHgpe2lmKHgpcmV0dXJuIHg9UnIoYixkKSxqbi50ZXN0KHgpP2MoYikucG9zaXRpb24oKVtkXSsicHgiOnh9KX0pLGMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGksZCl7Yy5lYWNoKHtwYWRkaW5nOiJpbm5lciIraSxjb250ZW50OmQsIiI6Im91dGVyIitpfSxmdW5jdGlvbihiLHgpe2MuZm5beF09ZnVuY3Rpb24oQSxJKXt2YXIgTz1hcmd1bWVudHMubGVuZ3RoJiYoYnx8dHlwZW9mIEEhPSJib29sZWFuIiksJD1ifHwoQT09PSEwfHxJPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oVSxRLGR0KXt2YXIgZnQ7cmV0dXJuIFAoVSk/eC5pbmRleE9mKCJvdXRlciIpPT09MD9VWyJpbm5lciIraV06VS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIraV06VS5ub2RlVHlwZT09PTk/KGZ0PVUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KFUuYm9keVsic2Nyb2xsIitpXSxmdFsic2Nyb2xsIitpXSxVLmJvZHlbIm9mZnNldCIraV0sZnRbIm9mZnNldCIraV0sZnRbImNsaWVudCIraV0pKTpkdD09PXZvaWQgMD9jLmNzcyhVLFEsJCk6Yy5zdHlsZShVLFEsZHQsJCl9LGQsTz9BOnZvaWQgMCxPKX19KX0pLGMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGksZCl7Yy5mbltkXT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5vbihkLGIpfX0pLGMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGksZCxiKXtyZXR1cm4gdGhpcy5vbihpLG51bGwsZCxiKX0sdW5iaW5kOmZ1bmN0aW9uKGksZCl7cmV0dXJuIHRoaXMub2ZmKGksbnVsbCxkKX0sZGVsZWdhdGU6ZnVuY3Rpb24oaSxkLGIseCl7cmV0dXJuIHRoaXMub24oZCxpLGIseCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oaSxkLGIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT90aGlzLm9mZihpLCIqKiIpOnRoaXMub2ZmKGQsaXx8IioqIixiKX0saG92ZXI6ZnVuY3Rpb24oaSxkKXtyZXR1cm4gdGhpcy5vbigibW91c2VlbnRlciIsaSkub24oIm1vdXNlbGVhdmUiLGR8fGkpfX0pLGMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihpLGQpe2MuZm5bZF09ZnVuY3Rpb24oYix4KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZCxudWxsLGIseCk6dGhpcy50cmlnZ2VyKGQpfX0pO3ZhciB4bz0vXltcc1x1RkVGRlx4QTBdK3woW15cc1x1RkVGRlx4QTBdKVtcc1x1RkVGRlx4QTBdKyQvZztjLnByb3h5PWZ1bmN0aW9uKGksZCl7dmFyIGIseCxBO2lmKHR5cGVvZiBkPT0ic3RyaW5nIiYmKGI9aVtkXSxkPWksaT1iKSwhIWsoaSkpcmV0dXJuIHg9cy5jYWxsKGFyZ3VtZW50cywyKSxBPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkoZHx8dGhpcyx4LmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSxBLmd1aWQ9aS5ndWlkPWkuZ3VpZHx8Yy5ndWlkKyssQX0sYy5ob2xkUmVhZHk9ZnVuY3Rpb24oaSl7aT9jLnJlYWR5V2FpdCsrOmMucmVhZHkoITApfSxjLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxjLnBhcnNlSlNPTj1KU09OLnBhcnNlLGMubm9kZU5hbWU9RyxjLmlzRnVuY3Rpb249ayxjLmlzV2luZG93PVAsYy5jYW1lbENhc2U9Z3QsYy50eXBlPWYsYy5ub3c9RGF0ZS5ub3csYy5pc051bWVyaWM9ZnVuY3Rpb24oaSl7dmFyIGQ9Yy50eXBlKGkpO3JldHVybihkPT09Im51bWJlciJ8fGQ9PT0ic3RyaW5nIikmJiFpc05hTihpLXBhcnNlRmxvYXQoaSkpfSxjLnRyaW09ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PW51bGw/IiI6KGkrIiIpLnJlcGxhY2UoeG8sIiQxIil9LHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIF9vPXQualF1ZXJ5LENvPXQuJDtyZXR1cm4gYy5ub0NvbmZsaWN0PWZ1bmN0aW9uKGkpe3JldHVybiB0LiQ9PT1jJiYodC4kPUNvKSxpJiZ0LmpRdWVyeT09PWMmJih0LmpRdWVyeT1fbyksY30sdHlwZW9mIGU+InUiJiYodC5qUXVlcnk9dC4kPWMpLGN9KX0pO3ZhciBIcz1pZShUYSgpKSxVbD1pZShhZSgpKTt2YXIga2w9aWUoYWUoKSwxKTt2YXIgemE9aWUoYWUoKSwxKTt2YXIgVz16YS5kZWZhdWx0LGJ0PWZ1bmN0aW9uKHQsZSl7aWYoYnQuZmFjdG9yeSh0LGUpKXJldHVybiBidDtpZih0aGlzIGluc3RhbmNlb2YgYnQpcmV0dXJuIFcodCkuRGF0YVRhYmxlKGUpO2U9dDt2YXIgcj10aGlzLG49ZT09PXZvaWQgMCxzPXRoaXMubGVuZ3RoO3JldHVybiBuJiYoZT17fSksdGhpcy5hcGk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFd0KHRoaXMpfSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYT17fSxsPXM+MT9PYShhLGUsITApOmUsdT0wLHAsdj10aGlzLmdldEF0dHJpYnV0ZSgiaWQiKSxtPSExLGc9YnQuZGVmYXVsdHMsVD1XKHRoaXMpO2lmKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9InRhYmxlIil7RmUobnVsbCwwLCJOb24tdGFibGUgbm9kZSBpbml0aWFsaXNhdGlvbiAoIit0aGlzLm5vZGVOYW1lKyIpIiwyKTtyZXR1cm59Vyh0aGlzKS50cmlnZ2VyKCJvcHRpb25zLmR0IixsKSxTYShnKSxXYShnLmNvbHVtbikscnIoZyxnLCEwKSxycihnLmNvbHVtbixnLmNvbHVtbiwhMCkscnIoZyxXLmV4dGVuZChsLFQuZGF0YSgpKSwhMCk7dmFyIHc9YnQuc2V0dGluZ3M7Zm9yKHU9MCxwPXcubGVuZ3RoO3U8cDt1Kyspe3ZhciBrPXdbdV07aWYoay5uVGFibGU9PXRoaXN8fGsublRIZWFkJiZrLm5USGVhZC5wYXJlbnROb2RlPT10aGlzfHxrLm5URm9vdCYmay5uVEZvb3QucGFyZW50Tm9kZT09dGhpcyl7dmFyIFA9bC5iUmV0cmlldmUhPT12b2lkIDA/bC5iUmV0cmlldmU6Zy5iUmV0cmlldmUsRj1sLmJEZXN0cm95IT09dm9pZCAwP2wuYkRlc3Ryb3k6Zy5iRGVzdHJveTtpZihufHxQKXJldHVybiBrLm9JbnN0YW5jZTtpZihGKXtuZXcgYnQuQXBpKGspLmRlc3Ryb3koKTticmVha31lbHNle0ZlKGssMCwiQ2Fubm90IHJlaW5pdGlhbGlzZSBEYXRhVGFibGUiLDMpO3JldHVybn19aWYoay5zVGFibGVJZD09dGhpcy5pZCl7dy5zcGxpY2UodSwxKTticmVha319KHY9PT1udWxsfHx2PT09IiIpJiYodj0iRGF0YVRhYmxlc19UYWJsZV8iK2J0LmV4dC5fdW5pcXVlKyssdGhpcy5pZD12KTt2YXIgaD1XLmV4dGVuZCghMCx7fSxidC5tb2RlbHMub1NldHRpbmdzLHtzRGVzdHJveVdpZHRoOlRbMF0uc3R5bGUud2lkdGgsc0luc3RhbmNlOnYsc1RhYmxlSWQ6dixjb2xncm91cDpXKCI8Y29sZ3JvdXA+IikucHJlcGVuZFRvKHRoaXMpLGZhc3REYXRhOmZ1bmN0aW9uKFoseSxfKXtyZXR1cm4gTmUoaCxaLHksXyl9fSk7aC5uVGFibGU9dGhpcyxoLm9Jbml0PWwsdy5wdXNoKGgpLGguYXBpPW5ldyBXdChoKSxoLm9JbnN0YW5jZT1yLmxlbmd0aD09PTE/cjpULmRhdGFUYWJsZSgpLFNhKGwpLGwuYUxlbmd0aE1lbnUmJiFsLmlEaXNwbGF5TGVuZ3RoJiYobC5pRGlzcGxheUxlbmd0aD1BcnJheS5pc0FycmF5KGwuYUxlbmd0aE1lbnVbMF0pP2wuYUxlbmd0aE1lbnVbMF1bMF06Vy5pc1BsYWluT2JqZWN0KGwuYUxlbmd0aE1lbnVbMF0pP2wuYUxlbmd0aE1lbnVbMF0udmFsdWU6bC5hTGVuZ3RoTWVudVswXSksbD1PYShXLmV4dGVuZCghMCx7fSxnKSxsKSxpcihoLm9GZWF0dXJlcyxsLFsiYlBhZ2luYXRlIiwiYkxlbmd0aENoYW5nZSIsImJGaWx0ZXIiLCJiU29ydCIsImJTb3J0TXVsdGkiLCJiSW5mbyIsImJQcm9jZXNzaW5nIiwiYkF1dG9XaWR0aCIsImJTb3J0Q2xhc3NlcyIsImJTZXJ2ZXJTaWRlIiwiYkRlZmVyUmVuZGVyIl0pLGlyKGgsbCxbImFqYXgiLCJmbkZvcm1hdE51bWJlciIsInNTZXJ2ZXJNZXRob2QiLCJhYVNvcnRpbmciLCJhYVNvcnRpbmdGaXhlZCIsImFMZW5ndGhNZW51Iiwic1BhZ2luYXRpb25UeXBlIiwiaVN0YXRlRHVyYXRpb24iLCJiU29ydENlbGxzVG9wIiwiaVRhYkluZGV4Iiwic0RvbSIsImZuU3RhdGVMb2FkQ2FsbGJhY2siLCJmblN0YXRlU2F2ZUNhbGxiYWNrIiwicmVuZGVyZXIiLCJzZWFyY2hEZWxheSIsInJvd0lkIiwiY2FwdGlvbiIsImxheW91dCIsWyJpQ29va2llRHVyYXRpb24iLCJpU3RhdGVEdXJhdGlvbiJdLFsib1NlYXJjaCIsIm9QcmV2aW91c1NlYXJjaCJdLFsiYW9TZWFyY2hDb2xzIiwiYW9QcmVTZWFyY2hDb2xzIl0sWyJpRGlzcGxheUxlbmd0aCIsIl9pRGlzcGxheUxlbmd0aCJdXSksaXIoaC5vU2Nyb2xsLGwsW1sic1Njcm9sbFgiLCJzWCJdLFsic1Njcm9sbFhJbm5lciIsInNYSW5uZXIiXSxbInNTY3JvbGxZIiwic1kiXSxbImJTY3JvbGxDb2xsYXBzZSIsImJDb2xsYXBzZSJdXSksaXIoaC5vTGFuZ3VhZ2UsbCwiZm5JbmZvQ2FsbGJhY2siKSxJZShoLCJhb0RyYXdDYWxsYmFjayIsbC5mbkRyYXdDYWxsYmFjayksSWUoaCwiYW9TdGF0ZVNhdmVQYXJhbXMiLGwuZm5TdGF0ZVNhdmVQYXJhbXMpLEllKGgsImFvU3RhdGVMb2FkUGFyYW1zIixsLmZuU3RhdGVMb2FkUGFyYW1zKSxJZShoLCJhb1N0YXRlTG9hZGVkIixsLmZuU3RhdGVMb2FkZWQpLEllKGgsImFvUm93Q2FsbGJhY2siLGwuZm5Sb3dDYWxsYmFjayksSWUoaCwiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siLGwuZm5DcmVhdGVkUm93KSxJZShoLCJhb0hlYWRlckNhbGxiYWNrIixsLmZuSGVhZGVyQ2FsbGJhY2spLEllKGgsImFvRm9vdGVyQ2FsbGJhY2siLGwuZm5Gb290ZXJDYWxsYmFjayksSWUoaCwiYW9Jbml0Q29tcGxldGUiLGwuZm5Jbml0Q29tcGxldGUpLEllKGgsImFvUHJlRHJhd0NhbGxiYWNrIixsLmZuUHJlRHJhd0NhbGxiYWNrKSxoLnJvd0lkRm49SXIobC5yb3dJZCksSG8oaCk7dmFyIG89aC5vQ2xhc3NlcztXLmV4dGVuZChvLGJ0LmV4dC5jbGFzc2VzLGwub0NsYXNzZXMpLFQuYWRkQ2xhc3Moby50YWJsZSksaC5vRmVhdHVyZXMuYlBhZ2luYXRlfHwobC5pRGlzcGxheVN0YXJ0PTApLGguaUluaXREaXNwbGF5U3RhcnQ9PT12b2lkIDAmJihoLmlJbml0RGlzcGxheVN0YXJ0PWwuaURpc3BsYXlTdGFydCxoLl9pRGlzcGxheVN0YXJ0PWwuaURpc3BsYXlTdGFydCk7dmFyIGY9aC5vTGFuZ3VhZ2U7Vy5leHRlbmQoITAsZixsLm9MYW5ndWFnZSksZi5zVXJsPyhXLmFqYXgoe2RhdGFUeXBlOiJqc29uIix1cmw6Zi5zVXJsLHN1Y2Nlc3M6ZnVuY3Rpb24oWil7cnIoZy5vTGFuZ3VhZ2UsWiksVy5leHRlbmQoITAsZixaLGgub0luaXQub0xhbmd1YWdlKSxadChoLG51bGwsImkxOG4iLFtoXSwhMCksdm4oaCl9LGVycm9yOmZ1bmN0aW9uKCl7RmUoaCwwLCJpMThuIGZpbGUgbG9hZGluZyBlcnJvciIsMjEpLHZuKGgpfX0pLG09ITApOlp0KGgsbnVsbCwiaTE4biIsW2hdKTt2YXIgQz1bXSxCPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIiksYz1ZYShoLEJbMF0pO2lmKGwuYW9Db2x1bW5zKUM9bC5hb0NvbHVtbnM7ZWxzZSBpZihjLmxlbmd0aClmb3IodT0wLHA9Y1swXS5sZW5ndGg7dTxwO3UrKylDLnB1c2gobnVsbCk7Zm9yKHU9MCxwPUMubGVuZ3RoO3U8cDt1KyspVWEoaCk7cW8oaCxsLmFvQ29sdW1uRGVmcyxDLGMsZnVuY3Rpb24oWix5KXt1aShoLFoseSl9KTt2YXIgej1ULmNoaWxkcmVuKCJ0Ym9keSIpLmZpbmQoInRyIikuZXEoMCk7aWYoei5sZW5ndGgpe3ZhciBHPWZ1bmN0aW9uKFoseSl7cmV0dXJuIFouZ2V0QXR0cmlidXRlKCJkYXRhLSIreSkhPT1udWxsP3k6bnVsbH07Vyh6WzBdKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbihaLHkpe3ZhciBfPWguYW9Db2x1bW5zW1pdO2lmKF98fEZlKGgsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLF8ubURhdGE9PT1aKXt2YXIgUz1HKHksInNvcnQiKXx8Ryh5LCJvcmRlciIpLE49Ryh5LCJmaWx0ZXIiKXx8Ryh5LCJzZWFyY2giKTsoUyE9PW51bGx8fE4hPT1udWxsKSYmKF8ubURhdGE9e186WisiLmRpc3BsYXkiLHNvcnQ6UyE9PW51bGw/WisiLkBkYXRhLSIrUzp2b2lkIDAsdHlwZTpTIT09bnVsbD9aKyIuQGRhdGEtIitTOnZvaWQgMCxmaWx0ZXI6TiE9PW51bGw/WisiLkBkYXRhLSIrTjp2b2lkIDB9LF8uX2lzQXJyYXlIb3N0PSEwLHVpKGgsWikpfX0pfXZhciBldD1oLm9GZWF0dXJlcyxFPWZ1bmN0aW9uKCl7aWYobC5hYVNvcnRpbmc9PT12b2lkIDApe3ZhciBaPWguYWFTb3J0aW5nO2Zvcih1PTAscD1aLmxlbmd0aDt1PHA7dSsrKVpbdV1bMV09aC5hb0NvbHVtbnNbdV0uYXNTb3J0aW5nWzBdfWZpKGgpLEllKGgsImFvRHJhd0NhbGxiYWNrIixmdW5jdGlvbigpeyhoLmJTb3J0ZWR8fF9lKGgpPT09InNzcCJ8fGV0LmJEZWZlclJlbmRlcikmJmZpKGgpfSk7dmFyIHk9VC5jaGlsZHJlbigiY2FwdGlvbiIpO2guY2FwdGlvbiYmKHkubGVuZ3RoPT09MCYmKHk9VygiPGNhcHRpb24vPiIpLmFwcGVuZFRvKFQpKSx5Lmh0bWwoaC5jYXB0aW9uKSkseS5sZW5ndGgmJih5WzBdLl9jYXB0aW9uU2lkZT15LmNzcygiY2FwdGlvbi1zaWRlIiksaC5jYXB0aW9uTm9kZT15WzBdKSxCLmxlbmd0aD09PTAmJihCPVcoIjx0aGVhZC8+IikuYXBwZW5kVG8oVCkpLGgublRIZWFkPUJbMF0sVygidHIiLEIpLmFkZENsYXNzKG8udGhlYWQucm93KTt2YXIgXz1ULmNoaWxkcmVuKCJ0Ym9keSIpO18ubGVuZ3RoPT09MCYmKF89VygiPHRib2R5Lz4iKS5pbnNlcnRBZnRlcihCKSksaC5uVEJvZHk9X1swXTt2YXIgUz1ULmNoaWxkcmVuKCJ0Zm9vdCIpO2lmKFMubGVuZ3RoPT09MCYmKFM9VygiPHRmb290Lz4iKS5hcHBlbmRUbyhUKSksaC5uVEZvb3Q9U1swXSxXKCJ0ciIsUykuYWRkQ2xhc3Moby50Zm9vdC5yb3cpLGwuYWFEYXRhKWZvcih1PTA7dTxsLmFhRGF0YS5sZW5ndGg7dSsrKXByKGgsbC5hYURhdGFbdV0pO2Vsc2UgX2UoaCk9PSJkb20iJiZ4aShoLFcoaC5uVEJvZHkpLmNoaWxkcmVuKCJ0ciIpKTtoLmFpRGlzcGxheT1oLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLGguYkluaXRpYWxpc2VkPSEwLG09PT0hMSYmdm4oaCl9O0llKGgsImFvRHJhd0NhbGxiYWNrIixJbiksbC5iU3RhdGVTYXZlPyhldC5iU3RhdGVTYXZlPSEwLHVsKGgsbCxFKSk6RSgpfSkscj1udWxsLHRoaXN9O2J0LmV4dD1RdD17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6YnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246YnQudmVyc2lvbn07Vy5leHRlbmQoUXQse2FmbkZpbHRlcmluZzpRdC5zZWFyY2gsYVR5cGVzOlF0LnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpRdC50eXBlLnNlYXJjaCxvU29ydDpRdC50eXBlLm9yZGVyLGFmblNvcnREYXRhOlF0Lm9yZGVyLGFvRmVhdHVyZXM6UXQuZmVhdHVyZSxvU3RkQ2xhc3NlczpRdC5jbGFzc2VzLG9QYWdpbmF0aW9uOlF0LnBhZ2VyfSk7Vy5leHRlbmQoYnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxlbmd0aDp7Y29udGFpbmVyOiJkdC1sZW5ndGgiLHNlbGVjdDoiZHQtaW5wdXQifSxvcmRlcjp7Y2FuQXNjOiJkdC1vcmRlcmFibGUtYXNjIixjYW5EZXNjOiJkdC1vcmRlcmFibGUtZGVzYyIsaXNBc2M6ImR0LW9yZGVyaW5nLWFzYyIsaXNEZXNjOiJkdC1vcmRlcmluZy1kZXNjIixub25lOiJkdC1vcmRlcmFibGUtbm9uZSIscG9zaXRpb246InNvcnRpbmdfIn0scHJvY2Vzc2luZzp7Y29udGFpbmVyOiJkdC1wcm9jZXNzaW5nIn0sc2Nyb2xsaW5nOntib2R5OiJkdC1zY3JvbGwtYm9keSIsY29udGFpbmVyOiJkdC1zY3JvbGwiLGZvb3Rlcjp7c2VsZjoiZHQtc2Nyb2xsLWZvb3QiLGlubmVyOiJkdC1zY3JvbGwtZm9vdElubmVyIn0saGVhZGVyOntzZWxmOiJkdC1zY3JvbGwtaGVhZCIsaW5uZXI6ImR0LXNjcm9sbC1oZWFkSW5uZXIifX0sc2VhcmNoOntjb250YWluZXI6ImR0LXNlYXJjaCIsaW5wdXQ6ImR0LWlucHV0In0sdGFibGU6ImRhdGFUYWJsZSIsdGJvZHk6e2NlbGw6IiIscm93OiIifSx0aGVhZDp7Y2VsbDoiIixyb3c6IiJ9LHRmb290OntjZWxsOiIiLHJvdzoiIn0scGFnaW5nOnthY3RpdmU6ImN1cnJlbnQiLGJ1dHRvbjoiZHQtcGFnaW5nLWJ1dHRvbiIsY29udGFpbmVyOiJkdC1wYWdpbmciLGRpc2FibGVkOiJkaXNhYmxlZCJ9fSk7dmFyIFF0LFd0LEl0LEp0LGFpPXt9LExvPS9bXHJcblx1MjAyOF0vZyxwaT0vPC4qPz4vZyx6bz0vXlxkezIsNH1bLi8tXVxkezEsMn1bLi8tXVxkezEsMn0oW1QgXXsxfVxkezEsMn1bOi5dXGR7Mn0oWy46XVxkezJ9KT8pPyQvLGpvPW5ldyBSZWdFeHAoIihcXCIrWyIvIiwiLiIsIioiLCIrIiwiPyIsInwiLCIoIiwiKSIsIlsiLCJdIiwieyIsIn0iLCJcXCIsIiQiLCJeIiwiLSJdLmpvaW4oInxcXCIpKyIpIiwiZyIpLGJpPS9bJ1x1MDBBMCwkwqPigqzCpSVcdTIwMDlcdTIwMkZcdTIwQkRcdTIwYTlcdTIwQkFyZmvJg86eXS9naSxaZT1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dD09PSEwfHx0PT09Ii0ifSxqYT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LDEwKTtyZXR1cm4haXNOYU4oZSkmJmlzRmluaXRlKHQpP2U6bnVsbH0sTWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWlbZV18fChhaVtlXT1uZXcgUmVnRXhwKGNpKGUpLCJnIikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmZSE9PSIuIj90LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoYWlbZV0sIi4iKTp0fSx2aT1mdW5jdGlvbih0LGUscil7dmFyIG49dHlwZW9mIHQscz1uPT09InN0cmluZyI7cmV0dXJuIG49PT0ibnVtYmVyInx8bj09PSJiaWdpbnQifHxaZSh0KT8hMDooZSYmcyYmKHQ9TWEodCxlKSksciYmcyYmKHQ9dC5yZXBsYWNlKGJpLCIiKSksIWlzTmFOKHBhcnNlRmxvYXQodCkpJiZpc0Zpbml0ZSh0KSl9LE1vPWZ1bmN0aW9uKHQpe3JldHVybiBaZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifSxWYT1mdW5jdGlvbih0LGUscil7aWYoWmUodCkpcmV0dXJuITA7aWYodHlwZW9mIHQ9PSJzdHJpbmciJiZ0Lm1hdGNoKC88KGlucHV0fHNlbGVjdCkvaSkpcmV0dXJuIG51bGw7dmFyIG49TW8odCk7cmV0dXJuIG4mJnZpKEFyKHQpLGUscik/ITA6bnVsbH0seGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVtdLHM9MCxhPXQubGVuZ3RoO2lmKHIhPT12b2lkIDApZm9yKDtzPGE7cysrKXRbc10mJnRbc11bZV0mJm4ucHVzaCh0W3NdW2VdW3JdKTtlbHNlIGZvcig7czxhO3MrKyl0W3NdJiZuLnB1c2godFtzXVtlXSk7cmV0dXJuIG59LFhyPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPVtdLGE9MCxsPWUubGVuZ3RoO2lmKG4hPT12b2lkIDApZm9yKDthPGw7YSsrKXRbZVthXV1bcl0mJnMucHVzaCh0W2VbYV1dW3JdW25dKTtlbHNlIGZvcig7YTxsO2ErKyl0W2VbYV1dJiZzLnB1c2godFtlW2FdXVtyXSk7cmV0dXJuIHN9LGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9W10sbjtlPT09dm9pZCAwPyhlPTAsbj10KToobj1lLGU9dCk7Zm9yKHZhciBzPWU7czxuO3MrKylyLnB1c2gocyk7cmV0dXJuIHJ9LEhhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47cisrKXRbcl0mJmUucHVzaCh0W3JdKTtyZXR1cm4gZX0sQXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShwaSwiIikucmVwbGFjZSgvPHNjcmlwdC9pLCIiKX0sU3I9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuam9pbigiLCIpKSx0eXBlb2YgdD09InN0cmluZyI/dC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKTp0fSxtbj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDt2YXIgcj10Lm5vcm1hbGl6ZSgiTkZEIik7cmV0dXJuIHIubGVuZ3RoIT09dC5sZW5ndGg/KGU9PT0hMD90KyIgIjoiIikrci5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywiIik6cn0sVm89ZnVuY3Rpb24odCl7aWYodC5sZW5ndGg8MilyZXR1cm4hMDtmb3IodmFyIGU9dC5zbGljZSgpLnNvcnQoKSxyPWVbMF0sbj0xLHM9ZS5sZW5ndGg7bjxzO24rKyl7aWYoZVtuXT09PXIpcmV0dXJuITE7cj1lW25dfXJldHVybiEwfSxocj1mdW5jdGlvbih0KXtpZihBcnJheS5mcm9tJiZTZXQpcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh0KSk7aWYoVm8odCkpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT1bXSxyLG4scz10Lmxlbmd0aCxhLGw9MDt0OmZvcihuPTA7bjxzO24rKyl7Zm9yKHI9dFtuXSxhPTA7YTxsO2ErKylpZihlW2FdPT09ciljb250aW51ZSB0O2UucHVzaChyKSxsKyt9cmV0dXJuIGV9LG1pPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyltaSh0LGVbcl0pO2Vsc2UgdC5wdXNoKGUpO3JldHVybiB0fTtmdW5jdGlvbiBEcih0LGUpe2UmJmUuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ImJnQuY2xhc3NMaXN0LmFkZChyKX0pfWJ0LnV0aWw9e2RpYWNyaXRpY3M6ZnVuY3Rpb24odCxlKXt2YXIgcj10eXBlb2YgdDtpZihyIT09ImZ1bmN0aW9uIilyZXR1cm4gbW4odCxlKTttbj10fSxkZWJvdW5jZTpmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscz1hcmd1bWVudHM7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dChmdW5jdGlvbigpe3QuYXBwbHkobixzKX0sZXx8MjUwKX19LHRocm90dGxlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSE9PXZvaWQgMD9lOjIwMCxuLHM7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxsPStuZXcgRGF0ZSx1PWFyZ3VtZW50cztuJiZsPG4rcj8oY2xlYXJUaW1lb3V0KHMpLHM9c2V0VGltZW91dChmdW5jdGlvbigpe249dm9pZCAwLHQuYXBwbHkoYSx1KX0scikpOihuPWwsdC5hcHBseShhLHUpKX19LGVzY2FwZVJlZ2V4OmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2Uoam8sIlxcJDEiKX0sc2V0OmZ1bmN0aW9uKHQpe2lmKFcuaXNQbGFpbk9iamVjdCh0KSlyZXR1cm4gYnQudXRpbC5zZXQodC5fKTtpZih0PT09bnVsbClyZXR1cm4gZnVuY3Rpb24oKXt9O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbihyLG4scyl7dChyLCJzZXQiLG4scyl9O2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQuaW5kZXhPZigiLiIpIT09LTF8fHQuaW5kZXhPZigiWyIpIT09LTF8fHQuaW5kZXhPZigiKCIpIT09LTEpKXt2YXIgZT1mdW5jdGlvbihyLG4scyl7Zm9yKHZhciBhPUFhKHMpLGwsdT1hW2EubGVuZ3RoLTFdLHAsdixtLGcsVD0wLHc9YS5sZW5ndGgtMTtUPHc7VCsrKXtpZihhW1RdPT09Il9fcHJvdG9fXyJ8fGFbVF09PT0iY29uc3RydWN0b3IiKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBwcm90b3R5cGUgdmFsdWVzIik7aWYocD1hW1RdLm1hdGNoKFVyKSx2PWFbVF0ubWF0Y2goVHIpLHApe2lmKGFbVF09YVtUXS5yZXBsYWNlKFVyLCIiKSxyW2FbVF1dPVtdLGw9YS5zbGljZSgpLGwuc3BsaWNlKDAsVCsxKSxnPWwuam9pbigiLiIpLEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBrPTAsUD1uLmxlbmd0aDtrPFA7aysrKW09e30sZShtLG5ba10sZyksclthW1RdXS5wdXNoKG0pO2Vsc2UgclthW1RdXT1uO3JldHVybn1lbHNlIHYmJihhW1RdPWFbVF0ucmVwbGFjZShUciwiIikscj1yW2FbVF1dKG4pKTsoclthW1RdXT09PW51bGx8fHJbYVtUXV09PT12b2lkIDApJiYoclthW1RdXT17fSkscj1yW2FbVF1dfXUubWF0Y2goVHIpP3I9clt1LnJlcGxhY2UoVHIsIiIpXShuKTpyW3UucmVwbGFjZShVciwiIildPW59O3JldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBlKHIsbix0KX19ZWxzZSByZXR1cm4gZnVuY3Rpb24ocixuKXtyW3RdPW59fSxnZXQ6ZnVuY3Rpb24odCl7aWYoVy5pc1BsYWluT2JqZWN0KHQpKXt2YXIgZT17fTtyZXR1cm4gVy5lYWNoKHQsZnVuY3Rpb24obixzKXtzJiYoZVtuXT1idC51dGlsLmdldChzKSl9KSxmdW5jdGlvbihuLHMsYSxsKXt2YXIgdT1lW3NdfHxlLl87cmV0dXJuIHUhPT12b2lkIDA/dShuLHMsYSxsKTpufX1lbHNle2lmKHQ9PT1udWxsKXJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbn07aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIGZ1bmN0aW9uKG4scyxhLGwpe3JldHVybiB0KG4scyxhLGwpfTtpZih0eXBlb2YgdD09InN0cmluZyImJih0LmluZGV4T2YoIi4iKSE9PS0xfHx0LmluZGV4T2YoIlsiKSE9PS0xfHx0LmluZGV4T2YoIigiKSE9PS0xKSl7dmFyIHI9ZnVuY3Rpb24obixzLGEpe3ZhciBsLHUscCx2O2lmKGEhPT0iIilmb3IodmFyIG09QWEoYSksZz0wLFQ9bS5sZW5ndGg7ZzxUO2crKyl7aWYobD1tW2ddLm1hdGNoKFVyKSx1PW1bZ10ubWF0Y2goVHIpLGwpe2lmKG1bZ109bVtnXS5yZXBsYWNlKFVyLCIiKSxtW2ddIT09IiImJihuPW5bbVtnXV0pLHA9W10sbS5zcGxpY2UoMCxnKzEpLHY9bS5qb2luKCIuIiksQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIHc9MCxrPW4ubGVuZ3RoO3c8azt3KyspcC5wdXNoKHIoblt3XSxzLHYpKTt2YXIgUD1sWzBdLnN1YnN0cmluZygxLGxbMF0ubGVuZ3RoLTEpO249UD09PSIiP3A6cC5qb2luKFApO2JyZWFrfWVsc2UgaWYodSl7bVtnXT1tW2ddLnJlcGxhY2UoVHIsIiIpLG49blttW2ddXSgpO2NvbnRpbnVlfWlmKG49PT1udWxsfHxuW21bZ11dPT09bnVsbClyZXR1cm4gbnVsbDtpZihuPT09dm9pZCAwfHxuW21bZ11dPT09dm9pZCAwKXJldHVybjtuPW5bbVtnXV19cmV0dXJuIG59O3JldHVybiBmdW5jdGlvbihuLHMpe3JldHVybiByKG4scyx0KX19ZWxzZSByZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG5bdF19fX0sc3RyaXBIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKGU9PT0iZnVuY3Rpb24iKXtBcj10O3JldHVybn1lbHNlIGlmKGU9PT0ic3RyaW5nIilyZXR1cm4gQXIodCk7cmV0dXJuIHR9LGVzY2FwZUh0bWw6ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7aWYoZT09PSJmdW5jdGlvbiIpe1NyPXQ7cmV0dXJufWVsc2UgaWYoZT09PSJzdHJpbmcifHxBcnJheS5pc0FycmF5KHQpKXJldHVybiBTcih0KTtyZXR1cm4gdH0sdW5pcXVlOmhyfTtmdW5jdGlvbiBDbih0KXt2YXIgZT0iYSBhYSBhaSBhbyBhcyBiIGZuIGkgbSBvIHMgIixyLG4scz17fTtXLmVhY2godCxmdW5jdGlvbihhKXtyPWEubWF0Y2goL14oW15BLVpdKz8pKFtBLVpdKS8pLHImJmUuaW5kZXhPZihyWzFdKyIgIikhPT0tMSYmKG49YS5yZXBsYWNlKHJbMF0sclsyXS50b0xvd2VyQ2FzZSgpKSxzW25dPWEsclsxXT09PSJvIiYmQ24odFthXSkpfSksdC5faHVuZ2FyaWFuTWFwPXN9ZnVuY3Rpb24gcnIodCxlLHIpe3QuX2h1bmdhcmlhbk1hcHx8Q24odCk7dmFyIG47Vy5lYWNoKGUsZnVuY3Rpb24ocyl7bj10Ll9odW5nYXJpYW5NYXBbc10sbiE9PXZvaWQgMCYmKHJ8fGVbbl09PT12b2lkIDApJiYobi5jaGFyQXQoMCk9PT0ibyI/KGVbbl18fChlW25dPXt9KSxXLmV4dGVuZCghMCxlW25dLGVbc10pLHJyKHRbbl0sZVtuXSxyKSk6ZVtuXT1lW3NdKX0pfXZhciB5ZT1mdW5jdGlvbih0LGUscil7dFtlXSE9PXZvaWQgMCYmKHRbcl09dFtlXSl9O2Z1bmN0aW9uIFNhKHQpe3llKHQsIm9yZGVyaW5nIiwiYlNvcnQiKSx5ZSh0LCJvcmRlck11bHRpIiwiYlNvcnRNdWx0aSIpLHllKHQsIm9yZGVyQ2xhc3NlcyIsImJTb3J0Q2xhc3NlcyIpLHllKHQsIm9yZGVyQ2VsbHNUb3AiLCJiU29ydENlbGxzVG9wIikseWUodCwib3JkZXIiLCJhYVNvcnRpbmciKSx5ZSh0LCJvcmRlckZpeGVkIiwiYWFTb3J0aW5nRml4ZWQiKSx5ZSh0LCJwYWdpbmciLCJiUGFnaW5hdGUiKSx5ZSh0LCJwYWdpbmdUeXBlIiwic1BhZ2luYXRpb25UeXBlIikseWUodCwicGFnZUxlbmd0aCIsImlEaXNwbGF5TGVuZ3RoIikseWUodCwic2VhcmNoaW5nIiwiYkZpbHRlciIpLHR5cGVvZiB0LnNTY3JvbGxYPT0iYm9vbGVhbiImJih0LnNTY3JvbGxYPXQuc1Njcm9sbFg/IjEwMCUiOiIiKSx0eXBlb2YgdC5zY3JvbGxYPT0iYm9vbGVhbiImJih0LnNjcm9sbFg9dC5zY3JvbGxYPyIxMDAlIjoiIik7dmFyIGU9dC5hb1NlYXJjaENvbHM7aWYoZSlmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspZVtyXSYmcnIoYnQubW9kZWxzLm9TZWFyY2gsZVtyXSk7dC5zZXJ2ZXJTaWRlJiYhdC5zZWFyY2hEZWxheSYmKHQuc2VhcmNoRGVsYXk9NDAwKX1mdW5jdGlvbiBXYSh0KXt5ZSh0LCJvcmRlcmFibGUiLCJiU29ydGFibGUiKSx5ZSh0LCJvcmRlckRhdGEiLCJhRGF0YVNvcnQiKSx5ZSh0LCJvcmRlclNlcXVlbmNlIiwiYXNTb3J0aW5nIikseWUodCwib3JkZXJEYXRhVHlwZSIsInNvcnREYXRhVHlwZSIpO3ZhciBlPXQuYURhdGFTb3J0O3R5cGVvZiBlPT0ibnVtYmVyIiYmIUFycmF5LmlzQXJyYXkoZSkmJih0LmFEYXRhU29ydD1bZV0pfWZ1bmN0aW9uIEhvKHQpe2lmKCFidC5fX2Jyb3dzZXIpe3ZhciBlPXt9O2J0Ll9fYnJvd3Nlcj1lO3ZhciByPVcoIjxkaXYvPiIpLmNzcyh7cG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0Oi0xKndpbmRvdy5wYWdlWE9mZnNldCxoZWlnaHQ6MSx3aWR0aDoxLG92ZXJmbG93OiJoaWRkZW4ifSkuYXBwZW5kKFcoIjxkaXYvPiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MSxsZWZ0OjEsd2lkdGg6MTAwLG92ZXJmbG93OiJzY3JvbGwifSkuYXBwZW5kKFcoIjxkaXYvPiIpLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDoxMH0pKSkuYXBwZW5kVG8oImJvZHkiKSxuPXIuY2hpbGRyZW4oKSxzPW4uY2hpbGRyZW4oKTtlLmJhcldpZHRoPW5bMF0ub2Zmc2V0V2lkdGgtblswXS5jbGllbnRXaWR0aCxlLmJTY3JvbGxiYXJMZWZ0PU1hdGgucm91bmQocy5vZmZzZXQoKS5sZWZ0KSE9PTEsci5yZW1vdmUoKX1XLmV4dGVuZCh0Lm9Ccm93c2VyLGJ0Ll9fYnJvd3NlciksdC5vU2Nyb2xsLmlCYXJXaWR0aD1idC5fX2Jyb3dzZXIuYmFyV2lkdGh9ZnVuY3Rpb24gVWEodCl7dmFyIGU9YnQuZGVmYXVsdHMuY29sdW1uLHI9dC5hb0NvbHVtbnMubGVuZ3RoLG49Vy5leHRlbmQoe30sYnQubW9kZWxzLm9Db2x1bW4sZSx7YURhdGFTb3J0OmUuYURhdGFTb3J0P2UuYURhdGFTb3J0OltyXSxtRGF0YTplLm1EYXRhP2UubURhdGE6cixpZHg6cixzZWFyY2hGaXhlZDp7fSxjb2xFbDpXKCI8Y29sPiIpfSk7dC5hb0NvbHVtbnMucHVzaChuKTt2YXIgcz10LmFvUHJlU2VhcmNoQ29scztzW3JdPVcuZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vU2VhcmNoLHNbcl0pfWZ1bmN0aW9uIHVpKHQsZSxyKXt2YXIgbj10LmFvQ29sdW1uc1tlXTtpZihyIT1udWxsKXtXYShyKSxycihidC5kZWZhdWx0cy5jb2x1bW4sciwhMCksci5tRGF0YVByb3AhPT12b2lkIDAmJiFyLm1EYXRhJiYoci5tRGF0YT1yLm1EYXRhUHJvcCksci5zVHlwZSYmKG4uX3NNYW51YWxUeXBlPXIuc1R5cGUpLHIuY2xhc3NOYW1lJiYhci5zQ2xhc3MmJihyLnNDbGFzcz1yLmNsYXNzTmFtZSk7dmFyIHM9bi5zQ2xhc3M7Vy5leHRlbmQobixyKSxpcihuLHIsInNXaWR0aCIsInNXaWR0aE9yaWciKSxzIT09bi5zQ2xhc3MmJihuLnNDbGFzcz1zKyIgIituLnNDbGFzcyksci5pRGF0YVNvcnQhPT12b2lkIDAmJihuLmFEYXRhU29ydD1bci5pRGF0YVNvcnRdKSxpcihuLHIsImFEYXRhU29ydCIpfXZhciBhPW4ubURhdGEsbD1JcihhKTtpZihuLm1SZW5kZXImJkFycmF5LmlzQXJyYXkobi5tUmVuZGVyKSl7dmFyIHU9bi5tUmVuZGVyLnNsaWNlKCkscD11LnNoaWZ0KCk7bi5tUmVuZGVyPWJ0LnJlbmRlcltwXS5hcHBseSh3aW5kb3csdSl9bi5fcmVuZGVyPW4ubVJlbmRlcj9JcihuLm1SZW5kZXIpOm51bGw7dmFyIHY9ZnVuY3Rpb24obSl7cmV0dXJuIHR5cGVvZiBtPT0ic3RyaW5nIiYmbS5pbmRleE9mKCJAIikhPT0tMX07bi5fYkF0dHJTcmM9Vy5pc1BsYWluT2JqZWN0KGEpJiYodihhLnNvcnQpfHx2KGEudHlwZSl8fHYoYS5maWx0ZXIpKSxuLl9zZXR0ZXI9bnVsbCxuLmZuR2V0RGF0YT1mdW5jdGlvbihtLGcsVCl7dmFyIHc9bChtLGcsdm9pZCAwLFQpO3JldHVybiBuLl9yZW5kZXImJmc/bi5fcmVuZGVyKHcsZyxtLFQpOnd9LG4uZm5TZXREYXRhPWZ1bmN0aW9uKG0sZyxUKXtyZXR1cm4gZnIoYSkobSxnLFQpfSx0eXBlb2YgYSE9Im51bWJlciImJiFuLl9pc0FycmF5SG9zdCYmKHQuX3Jvd1JlYWRPYmplY3Q9ITApLHQub0ZlYXR1cmVzLmJTb3J0fHwobi5iU29ydGFibGU9ITEpfWZ1bmN0aW9uIFRuKHQpe2lsKHQpLFdvKHQpO3ZhciBlPXQub1Njcm9sbDsoZS5zWSE9PSIifHxlLnNYIT09IiIpJiZ0cyh0KSxadCh0LG51bGwsImNvbHVtbi1zaXppbmciLFt0XSl9ZnVuY3Rpb24gV28odCl7Zm9yKHZhciBlPXQuYW9Db2x1bW5zLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49R2EodCxbcl0sITEsITEpO2Vbcl0uY29sRWwuY3NzKCJ3aWR0aCIsbil9fWZ1bmN0aW9uIHFhKHQsZSl7dmFyIHI9Z2kodCwiYlZpc2libGUiKTtyZXR1cm4gdHlwZW9mIHJbZV09PSJudW1iZXIiP3JbZV06bnVsbH1mdW5jdGlvbiAkcih0LGUpe3ZhciByPWdpKHQsImJWaXNpYmxlIiksbj1yLmluZGV4T2YoZSk7cmV0dXJuIG4hPT0tMT9uOm51bGx9ZnVuY3Rpb24ga24odCl7dmFyIGU9dC5hb0hlYWRlcixyPXQuYW9Db2x1bW5zLG49MDtpZihlLmxlbmd0aClmb3IodmFyIHM9MCxhPWVbMF0ubGVuZ3RoO3M8YTtzKyspcltzXS5iVmlzaWJsZSYmVyhlWzBdW3NdLmNlbGwpLmNzcygiZGlzcGxheSIpIT09Im5vbmUiJiZuKys7cmV0dXJuIG59ZnVuY3Rpb24gZ2kodCxlKXt2YXIgcj1bXTtyZXR1cm4gdC5hb0NvbHVtbnMubWFwKGZ1bmN0aW9uKG4scyl7bltlXSYmci5wdXNoKHMpfSkscn1mdW5jdGlvbiB5aSh0KXt2YXIgZT10LmFvQ29sdW1ucyxyPXQuYW9EYXRhLG49YnQuZXh0LnR5cGUuZGV0ZWN0LHMsYSxsLHUscCx2LG0sZyxUO2ZvcihzPTAsYT1lLmxlbmd0aDtzPGE7cysrKXtpZihtPWVbc10sVD1bXSwhbS5zVHlwZSYmbS5fc01hbnVhbFR5cGUpbS5zVHlwZT1tLl9zTWFudWFsVHlwZTtlbHNlIGlmKCFtLnNUeXBlKXtmb3IobD0wLHU9bi5sZW5ndGg7bDx1O2wrKyl7Zm9yKHA9MCx2PXIubGVuZ3RoO3A8diYmIShyW3BdJiYoVFtwXT09PXZvaWQgMCYmKFRbcF09TmUodCxwLHMsInR5cGUiKSksZz1uW2xdKFRbcF0sdCksIWcmJmwhPT1uLmxlbmd0aC0yfHxnPT09Imh0bWwiJiYhWmUoVFtwXSkpKTtwKyspO2lmKGcpe20uc1R5cGU9ZzticmVha319bS5zVHlwZXx8KG0uc1R5cGU9InN0cmluZyIpfXZhciB3PVF0LnR5cGUuY2xhc3NOYW1lW20uc1R5cGVdO3cmJihEYSh0LmFvSGVhZGVyLHMsdyksRGEodC5hb0Zvb3RlcixzLHcpKTt2YXIgaz1RdC50eXBlLnJlbmRlclttLnNUeXBlXTtrJiYhbS5fcmVuZGVyJiYobS5fcmVuZGVyPWJ0LnV0aWwuZ2V0KGspLFVvKHQscykpfX1mdW5jdGlvbiBVbyh0LGUpe2Zvcih2YXIgcj10LmFvRGF0YSxuPTA7bjxyLmxlbmd0aDtuKyspaWYocltuXS5uVHIpe3ZhciBzPU5lKHQsbixlLCJkaXNwbGF5Iik7cltuXS5kaXNwbGF5RGF0YVtlXT1zLGduKHJbbl0uYW5DZWxsc1tlXSxzKX19ZnVuY3Rpb24gRGEodCxlLHIpe3QuZm9yRWFjaChmdW5jdGlvbihuKXtuW2VdJiZuW2VdLnVuaXF1ZSYmRHIobltlXS5jZWxsLHIpfSl9ZnVuY3Rpb24gcW8odCxlLHIsbixzKXt2YXIgYSxsLHUscCx2LG0sZyxUPXQuYW9Db2x1bW5zO2lmKHIpZm9yKGE9MCxsPXIubGVuZ3RoO2E8bDthKyspclthXSYmclthXS5uYW1lJiYoVFthXS5zTmFtZT1yW2FdLm5hbWUpO2lmKGUpZm9yKGE9ZS5sZW5ndGgtMTthPj0wO2EtLSl7Zz1lW2FdO3ZhciB3PWcudGFyZ2V0IT09dm9pZCAwP2cudGFyZ2V0OmcudGFyZ2V0cyE9PXZvaWQgMD9nLnRhcmdldHM6Zy5hVGFyZ2V0cztmb3IoQXJyYXkuaXNBcnJheSh3KXx8KHc9W3ddKSx1PTAscD13Lmxlbmd0aDt1PHA7dSsrKXt2YXIgaz13W3VdO2lmKHR5cGVvZiBrPT0ibnVtYmVyIiYmaz49MCl7Zm9yKDtULmxlbmd0aDw9azspVWEodCk7cyhrLGcpfWVsc2UgaWYodHlwZW9mIGs9PSJudW1iZXIiJiZrPDApcyhULmxlbmd0aCtrLGcpO2Vsc2UgaWYodHlwZW9mIGs9PSJzdHJpbmciKWZvcih2PTAsbT1ULmxlbmd0aDt2PG07disrKWs9PT0iX2FsbCI/cyh2LGcpOmsuaW5kZXhPZigiOm5hbWUiKSE9PS0xP1Rbdl0uc05hbWU9PT1rLnJlcGxhY2UoIjpuYW1lIiwiIikmJnModixnKTpuLmZvckVhY2goZnVuY3Rpb24oUCl7aWYoUFt2XSl7dmFyIEY9VyhQW3ZdLmNlbGwpO2subWF0Y2goL15bYS16XVtcdy1dKiQvaSkmJihrPSIuIitrKSxGLmlzKGspJiZzKHYsZyl9fSl9fWlmKHIpZm9yKGE9MCxsPXIubGVuZ3RoO2E8bDthKyspcyhhLHJbYV0pfWZ1bmN0aW9uIEdhKHQsZSxyLG4pe0FycmF5LmlzQXJyYXkoZSl8fChlPXdpKGUpKTtmb3IodmFyIHM9MCxhLGw9dC5hb0NvbHVtbnMsdT0wLHA9ZS5sZW5ndGg7dTxwO3UrKyl7dmFyIHY9bFtlW3VdXSxtPXI/di5zV2lkdGhPcmlnOnYuc1dpZHRoO2lmKCEoIW4mJnYuYlZpc2libGU9PT0hMSkpe2lmKG09PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIG09PSJudW1iZXIiKWE9InB4IixzKz1tO2Vsc2V7dmFyIGc9bS5tYXRjaCgvKFtcZFwuXSspKFteXGRdKikvKTtnJiYocys9Z1sxXSoxLGE9Zy5sZW5ndGg9PT0zP2dbMl06InB4Iil9fX1yZXR1cm4gcythfWZ1bmN0aW9uIHdpKHQpe3ZhciBlPVcodCkuY2xvc2VzdCgiW2RhdGEtZHQtY29sdW1uXSIpLmF0dHIoImRhdGEtZHQtY29sdW1uIik7cmV0dXJuIGU/ZS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gcioxfSk6W119ZnVuY3Rpb24gcHIodCxlLHIsbil7dmFyIHM9dC5hb0RhdGEubGVuZ3RoLGE9Vy5leHRlbmQoITAse30sYnQubW9kZWxzLm9Sb3cse3NyYzpyPyJkb20iOiJkYXRhIixpZHg6c30pO2EuX2FEYXRhPWUsdC5hb0RhdGEucHVzaChhKTtmb3IodmFyIGw9dC5hb0NvbHVtbnMsdT0wLHA9bC5sZW5ndGg7dTxwO3UrKylsW3VdLnNUeXBlPW51bGw7dC5haURpc3BsYXlNYXN0ZXIucHVzaChzKTt2YXIgdj10LnJvd0lkRm4oZSk7cmV0dXJuIHYhPT12b2lkIDAmJih0LmFJZHNbdl09YSksKHJ8fCF0Lm9GZWF0dXJlcy5iRGVmZXJSZW5kZXIpJiYkYSh0LHMscixuKSxzfWZ1bmN0aW9uIHhpKHQsZSl7dmFyIHI7cmV0dXJuIGUgaW5zdGFuY2VvZiBXfHwoZT1XKGUpKSxlLm1hcChmdW5jdGlvbihuLHMpe3JldHVybiByPVhhKHQscykscHIodCxyLmRhdGEscyxyLmNlbGxzKX0pfWZ1bmN0aW9uIE5lKHQsZSxyLG4pe249PT0ic2VhcmNoIj9uPSJmaWx0ZXIiOm49PT0ib3JkZXIiJiYobj0ic29ydCIpO3ZhciBzPXQuaURyYXcsYT10LmFvQ29sdW1uc1tyXSxsPXQuYW9EYXRhW2VdLl9hRGF0YSx1PWEuc0RlZmF1bHRDb250ZW50LHA9YS5mbkdldERhdGEobCxuLHtzZXR0aW5nczp0LHJvdzplLGNvbDpyfSk7aWYobiE9PSJkaXNwbGF5IiYmcCYmdHlwZW9mIHA9PSJvYmplY3QiJiZwLm5vZGVOYW1lJiYocD1wLmlubmVySFRNTCkscD09PXZvaWQgMClyZXR1cm4gdC5pRHJhd0Vycm9yIT1zJiZ1PT09bnVsbCYmKEZlKHQsMCwiUmVxdWVzdGVkIHVua25vd24gcGFyYW1ldGVyICIrKHR5cGVvZiBhLm1EYXRhPT0iZnVuY3Rpb24iPyJ7ZnVuY3Rpb259IjoiJyIrYS5tRGF0YSsiJyIpKyIgZm9yIHJvdyAiK2UrIiwgY29sdW1uICIrciw0KSx0LmlEcmF3RXJyb3I9cyksdTtpZigocD09PWx8fHA9PT1udWxsKSYmdSE9PW51bGwmJm4hPT12b2lkIDApcD11O2Vsc2UgaWYodHlwZW9mIHA9PSJmdW5jdGlvbiIpcmV0dXJuIHAuY2FsbChsKTtpZihwPT09bnVsbCYmbj09PSJkaXNwbGF5IilyZXR1cm4iIjtpZihuPT09ImZpbHRlciIpe3ZhciB2PWJ0LmV4dC50eXBlLnNlYXJjaDt2W2Euc1R5cGVdJiYocD12W2Euc1R5cGVdKHApKX1yZXR1cm4gcH1mdW5jdGlvbiBHbyh0LGUscixuKXt2YXIgcz10LmFvQ29sdW1uc1tyXSxhPXQuYW9EYXRhW2VdLl9hRGF0YTtzLmZuU2V0RGF0YShhLG4se3NldHRpbmdzOnQscm93OmUsY29sOnJ9KX1mdW5jdGlvbiBnbih0LGUpe2UmJnR5cGVvZiBlPT0ib2JqZWN0IiYmZS5ub2RlTmFtZT9XKHQpLmVtcHR5KCkuYXBwZW5kKGUpOnQuaW5uZXJIVE1MPWV9dmFyIFVyPS9cWy4qP1xdJC8sVHI9L1woXCkkLztmdW5jdGlvbiBBYSh0KXt2YXIgZT10Lm1hdGNoKC8oXFwufFteLl0pKy9nKXx8WyIiXTtyZXR1cm4gZS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIucmVwbGFjZSgvXFxcLi9nLCIuIil9KX12YXIgSXI9YnQudXRpbC5nZXQsZnI9YnQudXRpbC5zZXQ7ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHhlKHQuYW9EYXRhLCJfYURhdGEiKX1mdW5jdGlvbiBfaSh0KXt0LmFvRGF0YS5sZW5ndGg9MCx0LmFpRGlzcGxheU1hc3Rlci5sZW5ndGg9MCx0LmFpRGlzcGxheS5sZW5ndGg9MCx0LmFJZHM9e319ZnVuY3Rpb24gU24odCxlLHIsbil7dmFyIHM9dC5hb0RhdGFbZV0sYSxsO2lmKHMuX2FTb3J0RGF0YT1udWxsLHMuX2FGaWx0ZXJEYXRhPW51bGwscy5kaXNwbGF5RGF0YT1udWxsLHI9PT0iZG9tInx8KCFyfHxyPT09ImF1dG8iKSYmcy5zcmM9PT0iZG9tIilzLl9hRGF0YT1YYSh0LHMsbixuPT09dm9pZCAwP3ZvaWQgMDpzLl9hRGF0YSkuZGF0YTtlbHNle3ZhciB1PXMuYW5DZWxscyxwPUNpKHQsZSk7aWYodSlpZihuIT09dm9pZCAwKWduKHVbbl0scFtuXSk7ZWxzZSBmb3IoYT0wLGw9dS5sZW5ndGg7YTxsO2ErKylnbih1W2FdLHBbYV0pfXZhciB2PXQuYW9Db2x1bW5zO2lmKG4hPT12b2lkIDApdltuXS5zVHlwZT1udWxsLHZbbl0ubWF4TGVuU3RyaW5nPW51bGw7ZWxzZXtmb3IoYT0wLGw9di5sZW5ndGg7YTxsO2ErKyl2W2FdLnNUeXBlPW51bGwsdlthXS5tYXhMZW5TdHJpbmc9bnVsbDtaYSh0LHMpfX1mdW5jdGlvbiBYYSh0LGUscixuKXt2YXIgcz1bXSxhPWUuZmlyc3RDaGlsZCxsLHUscD0wLHYsbT10LmFvQ29sdW1ucyxnPXQuX3Jvd1JlYWRPYmplY3Q7bj1uIT09dm9pZCAwP246Zz97fTpbXTt2YXIgVD1mdW5jdGlvbihvLGYpe2lmKHR5cGVvZiBvPT0ic3RyaW5nIil7dmFyIEM9by5pbmRleE9mKCJAIik7aWYoQyE9PS0xKXt2YXIgQj1vLnN1YnN0cmluZyhDKzEpLGM9ZnIobyk7YyhuLGYuZ2V0QXR0cmlidXRlKEIpKX19fSx3PWZ1bmN0aW9uKG8pe2lmKHI9PT12b2lkIDB8fHI9PT1wKWlmKHU9bVtwXSx2PW8uaW5uZXJIVE1MLnRyaW0oKSx1JiZ1Ll9iQXR0clNyYyl7dmFyIGY9ZnIodS5tRGF0YS5fKTtmKG4sdiksVCh1Lm1EYXRhLnNvcnQsbyksVCh1Lm1EYXRhLnR5cGUsbyksVCh1Lm1EYXRhLmZpbHRlcixvKX1lbHNlIGc/KHUuX3NldHRlcnx8KHUuX3NldHRlcj1mcih1Lm1EYXRhKSksdS5fc2V0dGVyKG4sdikpOm5bcF09djtwKyt9O2lmKGEpZm9yKDthOylsPWEubm9kZU5hbWUudG9VcHBlckNhc2UoKSwobD09IlREInx8bD09IlRIIikmJih3KGEpLHMucHVzaChhKSksYT1hLm5leHRTaWJsaW5nO2Vsc2V7cz1lLmFuQ2VsbHM7Zm9yKHZhciBrPTAsUD1zLmxlbmd0aDtrPFA7aysrKXcoc1trXSl9dmFyIEY9ZS5maXJzdENoaWxkP2U6ZS5uVHI7aWYoRil7dmFyIGg9Ri5nZXRBdHRyaWJ1dGUoImlkIik7aCYmZnIodC5yb3dJZCkobixoKX1yZXR1cm57ZGF0YTpuLGNlbGxzOnN9fWZ1bmN0aW9uIENpKHQsZSl7bGV0IHI9dC5hb0RhdGFbZV0sbj10LmFvQ29sdW1ucztpZighci5kaXNwbGF5RGF0YSl7ci5kaXNwbGF5RGF0YT1bXTtmb3IodmFyIHM9MCxhPW4ubGVuZ3RoO3M8YTtzKyspci5kaXNwbGF5RGF0YS5wdXNoKE5lKHQsZSxzLCJkaXNwbGF5IikpfXJldHVybiByLmRpc3BsYXlEYXRhfWZ1bmN0aW9uICRhKHQsZSxyLG4pe3ZhciBzPXQuYW9EYXRhW2VdLGE9cy5fYURhdGEsbD1bXSx1LHAsdixtLGcsVCx3PXQub0NsYXNzZXMudGJvZHkucm93O2lmKHMublRyPT09bnVsbCl7Zm9yKHU9cnx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxzLm5Ucj11LHMuYW5DZWxscz1sLERyKHUsdyksdS5fRFRfUm93SW5kZXg9ZSxaYSh0LHMpLG09MCxnPXQuYW9Db2x1bW5zLmxlbmd0aDttPGc7bSsrKXt2PXQuYW9Db2x1bW5zW21dLFQ9IShyJiZuW21dKSxwPVQ/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh2LnNDZWxsVHlwZSk6blttXSxwfHxGZSh0LDAsIkluY29ycmVjdCBjb2x1bW4gY291bnQiLDE4KSxwLl9EVF9DZWxsSW5kZXg9e3JvdzplLGNvbHVtbjptfSxsLnB1c2gocCk7dmFyIGs9Q2kodCxlKTsoVHx8KHYubVJlbmRlcnx8di5tRGF0YSE9PW0pJiYoIVcuaXNQbGFpbk9iamVjdCh2Lm1EYXRhKXx8di5tRGF0YS5fIT09bSsiLmRpc3BsYXkiKSkmJmduKHAsa1ttXSksdi5iVmlzaWJsZSYmVD91LmFwcGVuZENoaWxkKHApOiF2LmJWaXNpYmxlJiYhVCYmcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLHYuZm5DcmVhdGVkQ2VsbCYmdi5mbkNyZWF0ZWRDZWxsLmNhbGwodC5vSW5zdGFuY2UscCxOZSh0LGUsbSksYSxlLG0pfVp0KHQsImFvUm93Q3JlYXRlZENhbGxiYWNrIiwicm93LWNyZWF0ZWQiLFt1LGEsZSxsXSl9ZWxzZSBEcihzLm5Ucix3KX1mdW5jdGlvbiBaYSh0LGUpe3ZhciByPWUublRyLG49ZS5fYURhdGE7aWYocil7dmFyIHM9dC5yb3dJZEZuKG4pO2lmKHMmJihyLmlkPXMpLG4uRFRfUm93Q2xhc3Mpe3ZhciBhPW4uRFRfUm93Q2xhc3Muc3BsaXQoIiAiKTtlLl9fcm93Yz1lLl9fcm93Yz9ocihlLl9fcm93Yy5jb25jYXQoYSkpOmEsVyhyKS5yZW1vdmVDbGFzcyhlLl9fcm93Yy5qb2luKCIgIikpLmFkZENsYXNzKG4uRFRfUm93Q2xhc3MpfW4uRFRfUm93QXR0ciYmVyhyKS5hdHRyKG4uRFRfUm93QXR0ciksbi5EVF9Sb3dEYXRhJiZXKHIpLmRhdGEobi5EVF9Sb3dEYXRhKX19ZnVuY3Rpb24gUGEodCxlKXt2YXIgcj10Lm9DbGFzc2VzLG49dC5hb0NvbHVtbnMscyxhLGwsdT1lPT09ImhlYWRlciI/dC5uVEhlYWQ6dC5uVEZvb3QscD1lPT09ImhlYWRlciI/InNUaXRsZSI6ZTtpZih1KXtpZigoZT09PSJoZWFkZXIifHx4ZSh0LmFvQ29sdW1ucyxwKS5qb2luKCIiKSkmJihsPVcoInRyIix1KSxsLmxlbmd0aHx8KGw9VygiPHRyLz4iKS5hcHBlbmRUbyh1KSksbC5sZW5ndGg9PT0xKSl7dmFyIHY9VygidGQsIHRoIixsKTtmb3Iocz12Lmxlbmd0aCxhPW4ubGVuZ3RoO3M8YTtzKyspVygiPHRoLz4iKS5odG1sKG5bc11bcF18fCIiKS5hcHBlbmRUbyhsKX12YXIgbT1ZYSh0LHUsITApO2U9PT0iaGVhZGVyIj90LmFvSGVhZGVyPW06dC5hb0Zvb3Rlcj1tLFcodSkuY2hpbGRyZW4oInRyIikuYXR0cigicm9sZSIsInJvdyIpLFcodSkuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRoLCB0ZCIpLmVhY2goZnVuY3Rpb24oKXt4bih0LGUpKHQsVyh0aGlzKSxyKX0pfX1mdW5jdGlvbiBLYSh0LGUscil7dmFyIG4scyxhLGw9W10sdT1bXSxwPXQuYW9Db2x1bW5zLHY9cC5sZW5ndGgsbSxnO2lmKGUpe2ZvcihyfHwocj1lcih2KS5maWx0ZXIoZnVuY3Rpb24oayl7cmV0dXJuIHBba10uYlZpc2libGV9KSksbj0wO248ZS5sZW5ndGg7bisrKWxbbl09ZVtuXS5zbGljZSgpLmZpbHRlcihmdW5jdGlvbihrLFApe3JldHVybiByLmluY2x1ZGVzKFApfSksdS5wdXNoKFtdKTtmb3Iobj0wO248bC5sZW5ndGg7bisrKWZvcihzPTA7czxsW25dLmxlbmd0aDtzKyspaWYobT0xLGc9MSx1W25dW3NdPT09dm9pZCAwKXtmb3IoYT1sW25dW3NdLmNlbGw7bFtuK21dIT09dm9pZCAwJiZsW25dW3NdLmNlbGw9PWxbbittXVtzXS5jZWxsOyl1W24rbV1bc109bnVsbCxtKys7Zm9yKDtsW25dW3MrZ10hPT12b2lkIDAmJmxbbl1bc10uY2VsbD09bFtuXVtzK2ddLmNlbGw7KXtmb3IodmFyIFQ9MDtUPG07VCsrKXVbbitUXVtzK2ddPW51bGw7ZysrfXZhciB3PVcoInNwYW4uZHQtY29sdW1uLXRpdGxlIixhKTt1W25dW3NdPXtjZWxsOmEsY29sc3BhbjpnLHJvd3NwYW46bSx0aXRsZTp3Lmxlbmd0aD93Lmh0bWwoKTpXKGEpLmh0bWwoKX19cmV0dXJuIHV9fWZ1bmN0aW9uIHluKHQsZSl7Zm9yKHZhciByPUthKHQsZSksbixzLGE9MDthPGUubGVuZ3RoO2ErKyl7aWYobj1lW2FdLnJvdyxuKWZvcig7cz1uLmZpcnN0Q2hpbGQ7KW4ucmVtb3ZlQ2hpbGQocyk7Zm9yKHZhciBsPTA7bDxyW2FdLmxlbmd0aDtsKyspe3ZhciB1PXJbYV1bbF07dSYmVyh1LmNlbGwpLmFwcGVuZFRvKG4pLmF0dHIoInJvd3NwYW4iLHUucm93c3BhbikuYXR0cigiY29sc3BhbiIsdS5jb2xzcGFuKX19fWZ1bmN0aW9uIEZyKHQsZSl7Wm8odCk7dmFyIHI9WnQodCwiYW9QcmVEcmF3Q2FsbGJhY2siLCJwcmVEcmF3IixbdF0pO2lmKHIuaW5kZXhPZighMSkhPT0tMSl7QmUodCwhMSk7cmV0dXJufXZhciBuPVtdLHM9MCxhPV9lKHQpPT0ic3NwIixsPXQuYWlEaXNwbGF5LHU9dC5faURpc3BsYXlTdGFydCxwPXQuZm5EaXNwbGF5RW5kKCksdj10LmFvQ29sdW1ucyxtPVcodC5uVEJvZHkpO2lmKHQuYkRyYXdpbmc9ITAsIWEpdC5pRHJhdysrO2Vsc2UgaWYoIXQuYkRlc3Ryb3lpbmcmJiFlKXt0LmlEcmF3PT09MCYmbS5lbXB0eSgpLmFwcGVuZChGYSh0KSksS28odCk7cmV0dXJufWlmKGwubGVuZ3RoIT09MClmb3IodmFyIGc9YT8wOnUsVD1hP3QuYW9EYXRhLmxlbmd0aDpwLHc9Zzt3PFQ7dysrKXt2YXIgaz1sW3ddLFA9dC5hb0RhdGFba107UC5uVHI9PT1udWxsJiYkYSh0LGspO2Zvcih2YXIgRj1QLm5UcixoPTA7aDx2Lmxlbmd0aDtoKyspe3ZhciBvPXZbaF0sZj1QLmFuQ2VsbHNbaF07RHIoZixRdC50eXBlLmNsYXNzTmFtZVtvLnNUeXBlXSksRHIoZixvLnNDbGFzcyksRHIoZix0Lm9DbGFzc2VzLnRib2R5LmNlbGwpfVp0KHQsImFvUm93Q2FsbGJhY2siLG51bGwsW0YsUC5fYURhdGEscyx3LGtdKSxuLnB1c2goRikscysrfWVsc2UgblswXT1GYSh0KTtadCh0LCJhb0hlYWRlckNhbGxiYWNrIiwiaGVhZGVyIixbVyh0Lm5USGVhZCkuY2hpbGRyZW4oInRyIilbMF0sSWEodCksdSxwLGxdKSxadCh0LCJhb0Zvb3RlckNhbGxiYWNrIiwiZm9vdGVyIixbVyh0Lm5URm9vdCkuY2hpbGRyZW4oInRyIilbMF0sSWEodCksdSxwLGxdKSxtLmNoaWxkcmVuKCkuZGV0YWNoKCksbS5hcHBlbmQoVyhuKSksVyh0Lm5UYWJsZVdyYXBwZXIpLnRvZ2dsZUNsYXNzKCJkdC1lbXB0eS1mb290ZXIiLFcoInRyIix0Lm5URm9vdCkubGVuZ3RoPT09MCksWnQodCwiYW9EcmF3Q2FsbGJhY2siLCJkcmF3IixbdF0sITApLHQuYlNvcnRlZD0hMSx0LmJGaWx0ZXJlZD0hMSx0LmJEcmF3aW5nPSExfWZ1bmN0aW9uIFByKHQsZSxyKXt2YXIgbj10Lm9GZWF0dXJlcyxzPW4uYlNvcnQsYT1uLmJGaWx0ZXI7KHI9PT12b2lkIDB8fHI9PT0hMCkmJihzJiZTaSh0KSxhP0dyKHQsdC5vUHJldmlvdXNTZWFyY2gpOnQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkpLGUhPT0hMCYmKHQuX2lEaXNwbGF5U3RhcnQ9MCksdC5fZHJhd0hvbGQ9ZSxGcih0KSx0Ll9kcmF3SG9sZD0hMX1mdW5jdGlvbiBGYSh0KXt2YXIgZT10Lm9MYW5ndWFnZSxyPWUuc1plcm9SZWNvcmRzLG49X2UodCk7cmV0dXJuIHQuaURyYXc8MSYmbj09PSJzc3AifHx0LmlEcmF3PD0xJiZuPT09ImFqYXgiP3I9ZS5zTG9hZGluZ1JlY29yZHM6ZS5zRW1wdHlUYWJsZSYmdC5mblJlY29yZHNUb3RhbCgpPT09MCYmKHI9ZS5zRW1wdHlUYWJsZSksVygiPHRyLz4iKS5hcHBlbmQoVygiPHRkIC8+Iix7Y29sU3Bhbjprbih0KSxjbGFzczp0Lm9DbGFzc2VzLmVtcHR5LnJvd30pLmh0bWwocikpWzBdfWZ1bmN0aW9uIEJhKHQsZSxyKXt2YXIgbj17fTtXLmVhY2goZSxmdW5jdGlvbihwLHYpe2lmKHYhPT1udWxsKXt2YXIgbT1wLnJlcGxhY2UoLyhbQS1aXSkvZywiICQxIikuc3BsaXQoIiAiKTtuW21bMF1dfHwoblttWzBdXT17fSk7dmFyIGc9bS5sZW5ndGg9PT0xPyJmdWxsIjptWzFdLnRvTG93ZXJDYXNlKCksVD1uW21bMF1dLHc9ZnVuY3Rpb24oUCxGKXtXLmlzUGxhaW5PYmplY3QoRik/T2JqZWN0LmtleXMoRikubWFwKGZ1bmN0aW9uKGgpe1AucHVzaCh7ZmVhdHVyZTpoLG9wdHM6RltoXX0pfSk6UC5wdXNoKEYpfTtpZigoIVRbZ118fCFUW2ddLmNvbnRlbnRzKSYmKFRbZ109e2NvbnRlbnRzOltdfSksQXJyYXkuaXNBcnJheSh2KSlmb3IodmFyIGs9MDtrPHYubGVuZ3RoO2srKyl3KFRbZ10uY29udGVudHMsdltrXSk7ZWxzZSB3KFRbZ10uY29udGVudHMsdik7QXJyYXkuaXNBcnJheShUW2ddLmNvbnRlbnRzKXx8KFRbZ10uY29udGVudHM9W1RbZ10uY29udGVudHNdKX19KTt2YXIgcz1PYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAuaW5kZXhPZihyKSE9PTA/bnVsbDp7bmFtZTpwLHZhbDpuW3BdfX0pLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gcCE9PW51bGx9KTtzLnNvcnQoZnVuY3Rpb24ocCx2KXt2YXIgbT1wLm5hbWUucmVwbGFjZSgvW14wLTldL2csIiIpKjEsZz12Lm5hbWUucmVwbGFjZSgvW14wLTldL2csIiIpKjE7cmV0dXJuIGctbX0pLHI9PT0iYm90dG9tIiYmcy5yZXZlcnNlKCk7Zm9yKHZhciBhPVtdLGw9MCx1PXMubGVuZ3RoO2w8dTtsKyspc1tsXS52YWwuZnVsbCYmKGEucHVzaCh7ZnVsbDpzW2xdLnZhbC5mdWxsfSksTmEodCxhW2EubGVuZ3RoLTFdKSxkZWxldGUgc1tsXS52YWwuZnVsbCksT2JqZWN0LmtleXMoc1tsXS52YWwpLmxlbmd0aCYmKGEucHVzaChzW2xdLnZhbCksTmEodCxhW2EubGVuZ3RoLTFdKSk7cmV0dXJuIGF9ZnVuY3Rpb24gTmEodCxlKXt2YXIgcj1mdW5jdGlvbihzLGEpe3JldHVybiBRdC5mZWF0dXJlc1tzXXx8RmUodCwwLCJVbmtub3duIGZlYXR1cmU6ICIrcyksUXQuZmVhdHVyZXNbc10uYXBwbHkodGhpcyxbdCxhXSl9LG49ZnVuY3Rpb24ocyl7Zm9yKHZhciBhPWVbc10uY29udGVudHMsbD0wLHU9YS5sZW5ndGg7bDx1O2wrKylpZihhW2xdKXtpZih0eXBlb2YgYVtsXT09InN0cmluZyIpYVtsXT1yKGFbbF0sbnVsbCk7ZWxzZSBpZihXLmlzUGxhaW5PYmplY3QoYVtsXSkpYVtsXT1yKGFbbF0uZmVhdHVyZSxhW2xdLm9wdHMpO2Vsc2UgaWYodHlwZW9mIGFbbF0ubm9kZT09ImZ1bmN0aW9uIilhW2xdPWFbbF0ubm9kZSh0KTtlbHNlIGlmKHR5cGVvZiBhW2xdPT0iZnVuY3Rpb24iKXt2YXIgcD1hW2xdKHQpO2FbbF09dHlwZW9mIHAubm9kZT09ImZ1bmN0aW9uIj9wLm5vZGUoKTpwfX1lbHNlIGNvbnRpbnVlfTtXLmVhY2goZSxmdW5jdGlvbihzKXtuKHMpfSl9ZnVuY3Rpb24gWG8odCl7dmFyIGU9dC5vQ2xhc3NlcyxyPVcodC5uVGFibGUpLG49VygiPGRpdi8+IikuYXR0cih7aWQ6dC5zVGFibGVJZCsiX3dyYXBwZXIiLGNsYXNzOmUuY29udGFpbmVyfSkuaW5zZXJ0QmVmb3JlKHIpO3QublRhYmxlV3JhcHBlcj1uWzBdO3ZhciBzPUJhKHQsdC5sYXlvdXQsInRvcCIpLGE9QmEodCx0LmxheW91dCwiYm90dG9tIiksbD14bih0LCJsYXlvdXQiKTt0LnNEb20/JG8odCx0LnNEb20sbik6KHMuZm9yRWFjaChmdW5jdGlvbih1KXtsKHQsbix1KX0pLGwodCxuLHtmdWxsOnt0YWJsZTohMCxjb250ZW50czpbSmEodCldfX0pLGEuZm9yRWFjaChmdW5jdGlvbih1KXtsKHQsbix1KX0pKSxubCh0KX1mdW5jdGlvbiAkbyh0LGUscil7Zm9yKHZhciBuPWUubWF0Y2goLygiLio/Iil8KCcuKj8nKXwuL2cpLHMsYSxsLHUscCx2PTA7djxuLmxlbmd0aDt2Kyspe2lmKHM9bnVsbCxhPW5bdl0sYT09IjwiKXtpZihsPVcoIjxkaXYvPiIpLHU9blt2KzFdLHVbMF09PSInInx8dVswXT09JyInKXtwPXUucmVwbGFjZSgvWyciXS9nLCIiKTt2YXIgbT0iIixnO2lmKHAuaW5kZXhPZigiLiIpIT0tMSl7dmFyIFQ9cC5zcGxpdCgiLiIpO209VFswXSxnPVRbMV19ZWxzZSBwWzBdPT0iIyI/bT1wOmc9cDtsLmF0dHIoImlkIixtLnN1YnN0cmluZygxKSkuYWRkQ2xhc3MoZyksdisrfXIuYXBwZW5kKGwpLHI9bH1lbHNlIGE9PSI+Ij9yPXIucGFyZW50KCk6YT09InQiP3M9SmEodCk6YnQuZXh0LmZlYXR1cmUuZm9yRWFjaChmdW5jdGlvbih3KXthPT13LmNGZWF0dXJlJiYocz13LmZuSW5pdCh0KSl9KTtzJiZyLmFwcGVuZChzKX19ZnVuY3Rpb24gWWEodCxlLHIpe3ZhciBuPXQuYW9Db2x1bW5zLHM9VyhlKS5jaGlsZHJlbigidHIiKSxhLGwsdSxwLHYsbSxnLFQsdyxrLFA9ZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRoZWFkIixGPVtdLGgsbz1mdW5jdGlvbih6LEcsZXQpe2Zvcih2YXIgRT16W0ddO0VbZXRdOylldCsrO3JldHVybiBldH07Zm9yKHU9MCxtPXMubGVuZ3RoO3U8bTt1KyspRi5wdXNoKFtdKTtmb3IodT0wLG09cy5sZW5ndGg7dTxtO3UrKylmb3IoYT1zW3VdLFQ9MCxsPWEuZmlyc3RDaGlsZDtsOyl7aWYobC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT0iVEQifHxsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PSJUSCIpe3ZhciBmPVtdO2lmKHc9bC5nZXRBdHRyaWJ1dGUoImNvbHNwYW4iKSoxLGs9bC5nZXRBdHRyaWJ1dGUoInJvd3NwYW4iKSoxLHc9IXd8fHc9PT0wfHx3PT09MT8xOncsaz0ha3x8az09PTB8fGs9PT0xPzE6ayxnPW8oRix1LFQpLGg9dz09PTEscil7aWYoaCl7dWkodCxnLFcobCkuZGF0YSgpKTt2YXIgQz1uW2ddLEI9bC5nZXRBdHRyaWJ1dGUoIndpZHRoIil8fG51bGwsYz1sLnN0eWxlLndpZHRoLm1hdGNoKC93aWR0aDpccyooXGQrW3B4ZW0lXSspLyk7YyYmKEI9Y1sxXSksQy5zV2lkdGhPcmlnPUMuc1dpZHRofHxCLFA/KEMuc1RpdGxlIT09bnVsbCYmIUMuYXV0b1RpdGxlJiYobC5pbm5lckhUTUw9Qy5zVGl0bGUpLCFDLnNUaXRsZSYmaCYmKEMuc1RpdGxlPWwuaW5uZXJIVE1MLnJlcGxhY2UoLzwuKj8+L2csIiIpLEMuYXV0b1RpdGxlPSEwKSk6Qy5mb290ZXImJihsLmlubmVySFRNTD1DLmZvb3RlciksQy5hcmlhVGl0bGV8fChDLmFyaWFUaXRsZT1XKGwpLmF0dHIoImFyaWEtbGFiZWwiKXx8Qy5zVGl0bGUpLEMuY2xhc3NOYW1lJiZXKGwpLmFkZENsYXNzKEMuY2xhc3NOYW1lKX1XKCJzcGFuLmR0LWNvbHVtbi10aXRsZSIsbCkubGVuZ3RoPT09MCYmVygiPHNwYW4+IikuYWRkQ2xhc3MoImR0LWNvbHVtbi10aXRsZSIpLmFwcGVuZChsLmNoaWxkTm9kZXMpLmFwcGVuZFRvKGwpLFAmJlcoInNwYW4uZHQtY29sdW1uLW9yZGVyIixsKS5sZW5ndGg9PT0wJiZXKCI8c3Bhbj4iKS5hZGRDbGFzcygiZHQtY29sdW1uLW9yZGVyIikuYXBwZW5kVG8obCl9Zm9yKHY9MDt2PHc7disrKXtmb3IocD0wO3A8aztwKyspRlt1K3BdW2crdl09e2NlbGw6bCx1bmlxdWU6aH0sRlt1K3BdLnJvdz1hO2YucHVzaChnK3YpfWwuc2V0QXR0cmlidXRlKCJkYXRhLWR0LWNvbHVtbiIsaHIoZikuam9pbigiLCIpKX1sPWwubmV4dFNpYmxpbmd9cmV0dXJuIEZ9ZnVuY3Rpb24gWm8odCl7dmFyIGU9X2UodCk9PSJzc3AiLHI9dC5pSW5pdERpc3BsYXlTdGFydDtyIT09dm9pZCAwJiZyIT09LTEmJih0Ll9pRGlzcGxheVN0YXJ0PWU/cjpyPj10LmZuUmVjb3Jkc0Rpc3BsYXkoKT8wOnIsdC5pSW5pdERpc3BsYXlTdGFydD0tMSl9ZnVuY3Rpb24gVGkodCxlLHIpe3ZhciBuLHM9dC5hamF4LGE9dC5vSW5zdGFuY2UsbD1mdW5jdGlvbihtKXt2YXIgZz10LmpxWEhSP3QuanFYSFIuc3RhdHVzOm51bGw7KG09PT1udWxsfHx0eXBlb2YgZz09Im51bWJlciImJmc9PTIwNCkmJihtPXt9LERuKHQsbSxbXSkpO3ZhciBUPW0uZXJyb3J8fG0uc0Vycm9yO1QmJkZlKHQsMCxUKSx0Lmpzb249bSxadCh0LG51bGwsInhociIsW3QsbSx0LmpxWEhSXSwhMCkscihtKX07aWYoVy5pc1BsYWluT2JqZWN0KHMpJiZzLmRhdGEpe249cy5kYXRhO3ZhciB1PXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oZSx0KTpuO2U9dHlwZW9mIG49PSJmdW5jdGlvbiImJnU/dTpXLmV4dGVuZCghMCxlLHUpLGRlbGV0ZSBzLmRhdGF9dmFyIHA9e3VybDp0eXBlb2Ygcz09InN0cmluZyI/czoiIixkYXRhOmUsc3VjY2VzczpsLGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOnQuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihtLGcpe3ZhciBUPVp0KHQsbnVsbCwieGhyIixbdCxudWxsLHQuanFYSFJdLCEwKTtULmluZGV4T2YoITApPT09LTEmJihnPT0icGFyc2VyZXJyb3IiP0ZlKHQsMCwiSW52YWxpZCBKU09OIHJlc3BvbnNlIiwxKTptLnJlYWR5U3RhdGU9PT00JiZGZSh0LDAsIkFqYXggZXJyb3IiLDcpKSxCZSh0LCExKX19O2lmKFcuaXNQbGFpbk9iamVjdChzKSYmVy5leHRlbmQocCxzKSx0Lm9BamF4RGF0YT1lLFp0KHQsbnVsbCwicHJlWGhyIixbdCxlLHBdLCEwKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIil0LmpxWEhSPXMuY2FsbChhLGUsbCx0KTtlbHNlIGlmKHMudXJsPT09IiIpe3ZhciB2PXt9O2J0LnV0aWwuc2V0KHMuZGF0YVNyYykodixbXSksbCh2KX1lbHNlIHQuanFYSFI9Vy5hamF4KHApLG4mJihzLmRhdGE9bil9ZnVuY3Rpb24gS28odCl7dC5pRHJhdysrLEJlKHQsITApLFRpKHQsWW8odCksZnVuY3Rpb24oZSl7UW8odCxlKX0pfWZ1bmN0aW9uIFlvKHQpe3ZhciBlPXQuYW9Db2x1bW5zLHI9dC5vRmVhdHVyZXMsbj10Lm9QcmV2aW91c1NlYXJjaCxzPXQuYW9QcmVTZWFyY2hDb2xzLGE9ZnVuY3Rpb24obCx1KXtyZXR1cm4gdHlwZW9mIGVbbF1bdV09PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjplW2xdW3VdfTtyZXR1cm57ZHJhdzp0LmlEcmF3LGNvbHVtbnM6ZS5tYXAoZnVuY3Rpb24obCx1KXtyZXR1cm57ZGF0YTphKHUsIm1EYXRhIiksbmFtZTpsLnNOYW1lLHNlYXJjaGFibGU6bC5iU2VhcmNoYWJsZSxvcmRlcmFibGU6bC5iU29ydGFibGUsc2VhcmNoOnt2YWx1ZTpzW3VdLnNlYXJjaCxyZWdleDpzW3VdLnJlZ2V4LGZpeGVkOk9iamVjdC5rZXlzKGwuc2VhcmNoRml4ZWQpLm1hcChmdW5jdGlvbihwKXtyZXR1cm57bmFtZTpwLHRlcm06bC5zZWFyY2hGaXhlZFtwXS50b1N0cmluZygpfX0pfX19KSxvcmRlcjpBbih0KS5tYXAoZnVuY3Rpb24obCl7cmV0dXJue2NvbHVtbjpsLmNvbCxkaXI6bC5kaXIsbmFtZTphKGwuY29sLCJzTmFtZSIpfX0pLHN0YXJ0OnQuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOnIuYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLHNlYXJjaDp7dmFsdWU6bi5zZWFyY2gscmVnZXg6bi5yZWdleCxmaXhlZDpPYmplY3Qua2V5cyh0LnNlYXJjaEZpeGVkKS5tYXAoZnVuY3Rpb24obCl7cmV0dXJue25hbWU6bCx0ZXJtOnQuc2VhcmNoRml4ZWRbbF0udG9TdHJpbmcoKX19KX19fWZ1bmN0aW9uIFFvKHQsZSl7dmFyIHI9RG4odCxlKSxuPXNpKHQsImRyYXciLGUpLHM9c2kodCwicmVjb3Jkc1RvdGFsIixlKSxhPXNpKHQsInJlY29yZHNGaWx0ZXJlZCIsZSk7aWYobiE9PXZvaWQgMCl7aWYobioxPHQuaURyYXcpcmV0dXJuO3QuaURyYXc9bioxfXJ8fChyPVtdKSxfaSh0KSx0Ll9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KHMsMTApLHQuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChhLDEwKTtmb3IodmFyIGw9MCx1PXIubGVuZ3RoO2w8dTtsKyspcHIodCxyW2xdKTt0LmFpRGlzcGxheT10LmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLEZyKHQsITApLHduKHQpLEJlKHQsITEpfWZ1bmN0aW9uIERuKHQsZSxyKXt2YXIgbj0iZGF0YSI7aWYoVy5pc1BsYWluT2JqZWN0KHQuYWpheCkmJnQuYWpheC5kYXRhU3JjIT09dm9pZCAwKXt2YXIgcz10LmFqYXguZGF0YVNyYzt0eXBlb2Ygcz09InN0cmluZyJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iP249czpzLmRhdGEhPT12b2lkIDAmJihuPXMuZGF0YSl9aWYoIXIpcmV0dXJuIG49PT0iZGF0YSI/ZS5hYURhdGF8fGVbbl06biE9PSIiP0lyKG4pKGUpOmU7ZnIobikoZSxyKX1mdW5jdGlvbiBzaSh0LGUscil7dmFyIG49Vy5pc1BsYWluT2JqZWN0KHQuYWpheCk/dC5hamF4LmRhdGFTcmM6bnVsbDtpZihuJiZuW2VdKXJldHVybiBJcihuW2VdKShyKTt2YXIgcz0iIjtyZXR1cm4gZT09PSJkcmF3Ij9zPSJzRWNobyI6ZT09PSJyZWNvcmRzVG90YWwiP3M9ImlUb3RhbFJlY29yZHMiOmU9PT0icmVjb3Jkc0ZpbHRlcmVkIiYmKHM9ImlUb3RhbERpc3BsYXlSZWNvcmRzIikscltzXSE9PXZvaWQgMD9yW3NdOnJbZV19ZnVuY3Rpb24gR3IodCxlKXt2YXIgcj10LmFvUHJlU2VhcmNoQ29scztpZih5aSh0KSxfZSh0KSE9InNzcCIpe3JsKHQpLHQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkscG4odC5haURpc3BsYXksdCxlLnNlYXJjaCxlKSxXLmVhY2godC5zZWFyY2hGaXhlZCxmdW5jdGlvbihhLGwpe3BuKHQuYWlEaXNwbGF5LHQsbCx7fSl9KTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHM9cltuXTtwbih0LmFpRGlzcGxheSx0LHMuc2VhcmNoLHMsbiksVy5lYWNoKHQuYW9Db2x1bW5zW25dLnNlYXJjaEZpeGVkLGZ1bmN0aW9uKGEsbCl7cG4odC5haURpc3BsYXksdCxsLHt9LG4pfSl9Sm8odCl9dC5iRmlsdGVyZWQ9ITAsWnQodCxudWxsLCJzZWFyY2giLFt0XSl9ZnVuY3Rpb24gSm8odCl7Zm9yKHZhciBlPWJ0LmV4dC5zZWFyY2gscj10LmFpRGlzcGxheSxuLHMsYT0wLGw9ZS5sZW5ndGg7YTxsO2ErKyl7Zm9yKHZhciB1PVtdLHA9MCx2PXIubGVuZ3RoO3A8djtwKyspcz1yW3BdLG49dC5hb0RhdGFbc10sZVthXSh0LG4uX2FGaWx0ZXJEYXRhLHMsbi5fYURhdGEscCkmJnUucHVzaChzKTtyLmxlbmd0aD0wLHIucHVzaC5hcHBseShyLHUpfX1mdW5jdGlvbiBwbih0LGUscixuLHMpe2lmKHIhPT0iIilmb3IodmFyIGE9MCxsPXR5cGVvZiByPT0iZnVuY3Rpb24iP3I6bnVsbCx1PXIgaW5zdGFuY2VvZiBSZWdFeHA/cjpsP251bGw6dGwocixuKTthPHQubGVuZ3RoOyl7dmFyIHA9ZS5hb0RhdGFbdFthXV0sdj1zPT09dm9pZCAwP3AuX3NGaWx0ZXJSb3c6cC5fYUZpbHRlckRhdGFbc107KGwmJiFsKHYscC5fYURhdGEsdFthXSxzKXx8dSYmIXUudGVzdCh2KSkmJih0LnNwbGljZShhLDEpLGEtLSksYSsrfX1mdW5jdGlvbiB0bCh0LGUpe3ZhciByPVtdLG49Vy5leHRlbmQoe30se2JvdW5kYXJ5OiExLGNhc2VJbnNlbnNpdGl2ZTohMCxleGFjdDohMSxyZWdleDohMSxzbWFydDohMH0sZSk7aWYodHlwZW9mIHQhPSJzdHJpbmciJiYodD10LnRvU3RyaW5nKCkpLHQ9bW4odCksbi5leGFjdClyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrY2kodCkrIiQiLG4uY2FzZUluc2Vuc2l0aXZlPyJpIjoiIik7aWYodD1uLnJlZ2V4P3Q6Y2kodCksbi5zbWFydCl7dmFyIHM9dC5tYXRjaCgvIT9bIlx1MjAxQ11bXiJcdTIwMURdK1siXHUyMDFEXXxbXiBdKy9nKXx8WyIiXSxhPXMubWFwKGZ1bmN0aW9uKHApe3ZhciB2PSExLG07cmV0dXJuIHAuY2hhckF0KDApPT09IiEiJiYodj0hMCxwPXAuc3Vic3RyaW5nKDEpKSxwLmNoYXJBdCgwKT09PSciJz8obT1wLm1hdGNoKC9eIiguKikiJC8pLHA9bT9tWzFdOnApOnAuY2hhckF0KDApPT09Ilx1MjAxQyImJihtPXAubWF0Y2goL15cdTIwMUMoLiopXHUyMDFEJC8pLHA9bT9tWzFdOnApLHYmJihwLmxlbmd0aD4xJiZyLnB1c2goIig/ISIrcCsiKSIpLHA9IiIpLHAucmVwbGFjZSgnIicsIiIpfSksbD1yLmxlbmd0aD9yLmpvaW4oIiIpOiIiLHU9bi5ib3VuZGFyeT8iXFxiIjoiIjt0PSJeKD89Lio/Iit1K2Euam9pbigiKSg/PS4qPyIrdSkrIikoIitsKyIuKSokIn1yZXR1cm4gbmV3IFJlZ0V4cCh0LG4uY2FzZUluc2Vuc2l0aXZlPyJpIjoiIil9dmFyIGNpPWJ0LnV0aWwuZXNjYXBlUmVnZXgsYm49VygiPGRpdj4iKVswXSxlbD1ibi50ZXh0Q29udGVudCE9PXZvaWQgMDtmdW5jdGlvbiBybCh0KXtmb3IodmFyIGU9dC5hb0NvbHVtbnMscj10LmFvRGF0YSxuLHMsYSxsLHUscCx2PSExLG09MDttPHIubGVuZ3RoO20rKylpZihyW21dJiYocD1yW21dLCFwLl9hRmlsdGVyRGF0YSkpe2ZvcihsPVtdLHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspbj1lW3NdLG4uYlNlYXJjaGFibGU/KHU9TmUodCxtLHMsImZpbHRlciIpLHU9PT1udWxsJiYodT0iIiksdHlwZW9mIHUhPSJzdHJpbmciJiZ1LnRvU3RyaW5nJiYodT11LnRvU3RyaW5nKCkpKTp1PSIiLHUuaW5kZXhPZiYmdS5pbmRleE9mKCImIikhPT0tMSYmKGJuLmlubmVySFRNTD11LHU9ZWw/Ym4udGV4dENvbnRlbnQ6Ym4uaW5uZXJUZXh0KSx1LnJlcGxhY2UmJih1PXUucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiIpKSxsLnB1c2godSk7cC5fYUZpbHRlckRhdGE9bCxwLl9zRmlsdGVyUm93PWwuam9pbigiICAiKSx2PSEwfXJldHVybiB2fWZ1bmN0aW9uIHZuKHQpe3ZhciBlLHI9dC5pSW5pdERpc3BsYXlTdGFydDtpZighdC5iSW5pdGlhbGlzZWQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2bih0KX0sMjAwKTtyZXR1cm59UGEodCwiaGVhZGVyIiksUGEodCwiZm9vdGVyIikseW4odCx0LmFvSGVhZGVyKSx5bih0LHQuYW9Gb290ZXIpLFhvKHQpLHNsKHQpLGVzKHQpLEJlKHQsITApLFp0KHQsbnVsbCwicHJlSW5pdCIsW3RdLCEwKSxQcih0KTt2YXIgbj1fZSh0KTtuIT0ic3NwIiYmKG49PSJhamF4Ij9UaSh0LHt9LGZ1bmN0aW9uKHMpe3ZhciBhPURuKHQscyk7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKylwcih0LGFbZV0pO3QuaUluaXREaXNwbGF5U3RhcnQ9cixQcih0KSxCZSh0LCExKSx3bih0KX0sdCk6KHduKHQpLEJlKHQsITEpKSl9ZnVuY3Rpb24gd24odCl7aWYoIXQuX2JJbml0Q29tcGxldGUpe3ZhciBlPVt0LHQuanNvbl07dC5fYkluaXRDb21wbGV0ZT0hMCxUbih0KSxadCh0LG51bGwsInBsdWdpbi1pbml0IixlLCEwKSxadCh0LCJhb0luaXRDb21wbGV0ZSIsImluaXQiLGUsITApfX1mdW5jdGlvbiBRYSh0LGUpe3ZhciByPXBhcnNlSW50KGUsMTApO3QuX2lEaXNwbGF5TGVuZ3RoPXIsaXModCksWnQodCxudWxsLCJsZW5ndGgiLFt0LHJdKX1mdW5jdGlvbiBraSh0LGUscil7dmFyIG49dC5faURpc3BsYXlTdGFydCxzPXQuX2lEaXNwbGF5TGVuZ3RoLGE9dC5mblJlY29yZHNEaXNwbGF5KCk7aWYoYT09PTB8fHM9PT0tMSluPTA7ZWxzZSBpZih0eXBlb2YgZT09Im51bWJlciIpbj1lKnMsbj5hJiYobj0wKTtlbHNlIGlmKGU9PSJmaXJzdCIpbj0wO2Vsc2UgaWYoZT09InByZXZpb3VzIiluPXM+PTA/bi1zOjAsbjwwJiYobj0wKTtlbHNlIGlmKGU9PSJuZXh0IiluK3M8YSYmKG4rPXMpO2Vsc2UgaWYoZT09Imxhc3QiKW49TWF0aC5mbG9vcigoYS0xKS9zKSpzO2Vsc2V7aWYoZT09PSJlbGxpcHNpcyIpcmV0dXJuO0ZlKHQsMCwiVW5rbm93biBwYWdpbmcgYWN0aW9uOiAiK2UsNSl9dmFyIGw9dC5faURpc3BsYXlTdGFydCE9PW47cmV0dXJuIHQuX2lEaXNwbGF5U3RhcnQ9bixadCh0LG51bGwsbD8icGFnZSI6InBhZ2UtbmMiLFt0XSksbCYmciYmRnIodCksbH1mdW5jdGlvbiBubCh0KXt2YXIgZT10Lm5UYWJsZTtpZih0Lm9GZWF0dXJlcy5iUHJvY2Vzc2luZyl7dmFyIHI9VygiPGRpdi8+Iix7aWQ6dC5zVGFibGVJZCsiX3Byb2Nlc3NpbmciLGNsYXNzOnQub0NsYXNzZXMucHJvY2Vzc2luZy5jb250YWluZXIscm9sZToic3RhdHVzIn0pLmh0bWwodC5vTGFuZ3VhZ2Uuc1Byb2Nlc3NpbmcpLmFwcGVuZCgiPGRpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PiIpLmluc2VydEJlZm9yZShlKTtXKGUpLm9uKCJwcm9jZXNzaW5nLmR0LkRUIixmdW5jdGlvbihuLHMsYSl7ci5jc3MoImRpc3BsYXkiLGE/ImJsb2NrIjoibm9uZSIpfSl9fWZ1bmN0aW9uIEJlKHQsZSl7WnQodCxudWxsLCJwcm9jZXNzaW5nIixbdCxlXSl9ZnVuY3Rpb24gSmEodCl7dmFyIGU9Vyh0Lm5UYWJsZSkscj10Lm9TY3JvbGw7aWYoci5zWD09PSIiJiZyLnNZPT09IiIpcmV0dXJuIHQublRhYmxlO3ZhciBuPXIuc1gscz1yLnNZLGE9dC5vQ2xhc3Nlcy5zY3JvbGxpbmcsbD10LmNhcHRpb25Ob2RlLHU9bD9sLl9jYXB0aW9uU2lkZTpudWxsLHA9VyhlWzBdLmNsb25lTm9kZSghMSkpLHY9VyhlWzBdLmNsb25lTm9kZSghMSkpLG09ZS5jaGlsZHJlbigidGZvb3QiKSxnPSI8ZGl2Lz4iLFQ9ZnVuY3Rpb24obyl7cmV0dXJuIG8/bnIobyk6bnVsbH07bS5sZW5ndGh8fChtPW51bGwpO3ZhciB3PVcoZyx7Y2xhc3M6YS5jb250YWluZXJ9KS5hcHBlbmQoVyhnLHtjbGFzczphLmhlYWRlci5zZWxmfSkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcjowLHdpZHRoOm4/VChuKToiMTAwJSJ9KS5hcHBlbmQoVyhnLHtjbGFzczphLmhlYWRlci5pbm5lcn0pLmNzcyh7ImJveC1zaXppbmciOiJjb250ZW50LWJveCIsd2lkdGg6ci5zWElubmVyfHwiMTAwJSJ9KS5hcHBlbmQocC5yZW1vdmVBdHRyKCJpZCIpLmNzcygibWFyZ2luLWxlZnQiLDApLmFwcGVuZCh1PT09InRvcCI/bDpudWxsKS5hcHBlbmQoZS5jaGlsZHJlbigidGhlYWQiKSkpKSkuYXBwZW5kKFcoZyx7Y2xhc3M6YS5ib2R5fSkuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLG92ZXJmbG93OiJhdXRvIix3aWR0aDpUKG4pfSkuYXBwZW5kKGUpKTttJiZ3LmFwcGVuZChXKGcse2NsYXNzOmEuZm9vdGVyLnNlbGZ9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLGJvcmRlcjowLHdpZHRoOm4/VChuKToiMTAwJSJ9KS5hcHBlbmQoVyhnLHtjbGFzczphLmZvb3Rlci5pbm5lcn0pLmFwcGVuZCh2LnJlbW92ZUF0dHIoImlkIikuY3NzKCJtYXJnaW4tbGVmdCIsMCkuYXBwZW5kKHU9PT0iYm90dG9tIj9sOm51bGwpLmFwcGVuZChlLmNoaWxkcmVuKCJ0Zm9vdCIpKSkpKTt2YXIgaz13LmNoaWxkcmVuKCksUD1rWzBdLEY9a1sxXSxoPW0/a1syXTpudWxsO3JldHVybiBXKEYpLm9uKCJzY3JvbGwuRFQiLGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5zY3JvbGxMZWZ0O1Auc2Nyb2xsTGVmdD1vLG0mJihoLnNjcm9sbExlZnQ9byl9KSxXKCJ0aCwgdGQiLFApLm9uKCJmb2N1cyIsZnVuY3Rpb24oKXt2YXIgbz1QLnNjcm9sbExlZnQ7Ri5zY3JvbGxMZWZ0PW8sbSYmKEYuc2Nyb2xsTGVmdD1vKX0pLFcoRikuY3NzKCJtYXgtaGVpZ2h0IixzKSxyLmJDb2xsYXBzZXx8VyhGKS5jc3MoImhlaWdodCIscyksdC5uU2Nyb2xsSGVhZD1QLHQublNjcm9sbEJvZHk9Rix0Lm5TY3JvbGxGb290PWgsdC5hb0RyYXdDYWxsYmFjay5wdXNoKHRzKSx3WzBdfWZ1bmN0aW9uIHRzKHQpe3ZhciBlPXQub1Njcm9sbCxyPWUuaUJhcldpZHRoLG49Vyh0Lm5TY3JvbGxIZWFkKSxzPW4uY2hpbGRyZW4oImRpdiIpLGE9cy5jaGlsZHJlbigidGFibGUiKSxsPXQublNjcm9sbEJvZHksdT1XKGwpLHA9Vyh0Lm5TY3JvbGxGb290KSx2PXAuY2hpbGRyZW4oImRpdiIpLG09di5jaGlsZHJlbigidGFibGUiKSxnPVcodC5uVEhlYWQpLFQ9Vyh0Lm5UYWJsZSksdz10Lm5URm9vdCYmVygidGgsIHRkIix0Lm5URm9vdCkubGVuZ3RoP1codC5uVEZvb3QpOm51bGwsaz10Lm9Ccm93c2VyLFAsRixoPWwuc2Nyb2xsSGVpZ2h0PmwuY2xpZW50SGVpZ2h0O2lmKHQuc2Nyb2xsQmFyVmlzIT09aCYmdC5zY3JvbGxCYXJWaXMhPT12b2lkIDApe3Quc2Nyb2xsQmFyVmlzPWgsVG4odCk7cmV0dXJufWVsc2UgdC5zY3JvbGxCYXJWaXM9aDtpZihULmNoaWxkcmVuKCJ0aGVhZCwgdGZvb3QiKS5yZW1vdmUoKSxQPWcuY2xvbmUoKS5wcmVwZW5kVG8oVCksUC5maW5kKCJ0aCwgdGQiKS5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpLFAuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIiksdyYmKEY9dy5jbG9uZSgpLnByZXBlbmRUbyhUKSxGLmZpbmQoIltpZF0iKS5yZW1vdmVBdHRyKCJpZCIpKSx0LmFpRGlzcGxheS5sZW5ndGgpe3ZhciBvPVQuZmluZCgidGJvZHkgdHIiKS5lcSgwKS5maW5kKCJ0aCwgdGQiKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gVyh0aGlzKS5vdXRlcldpZHRoKCl9KTtXKCJjb2wiLHQuY29sZ3JvdXApLmVhY2goZnVuY3Rpb24oYyl7dmFyIHo9dGhpcy5zdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpO3ohPT1vW2NdJiYodGhpcy5zdHlsZS53aWR0aD1vW2NdKyJweCIpfSl9YS5maW5kKCJjb2xncm91cCIpLnJlbW92ZSgpLGEuYXBwZW5kKHQuY29sZ3JvdXAuY2xvbmUoKSksdyYmKG0uZmluZCgiY29sZ3JvdXAiKS5yZW1vdmUoKSxtLmFwcGVuZCh0LmNvbGdyb3VwLmNsb25lKCkpKSxXKCJ0aCwgdGQiLFApLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMuY2hpbGROb2Rlcykud3JhcEFsbCgnPGRpdiBjbGFzcz0iZHQtc2Nyb2xsLXNpemluZyI+Jyl9KSx3JiZXKCJ0aCwgdGQiLEYpLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMuY2hpbGROb2Rlcykud3JhcEFsbCgnPGRpdiBjbGFzcz0iZHQtc2Nyb2xsLXNpemluZyI+Jyl9KTt2YXIgZj1NYXRoLmZsb29yKFQuaGVpZ2h0KCkpPmwuY2xpZW50SGVpZ2h0fHx1LmNzcygib3ZlcmZsb3cteSIpPT0ic2Nyb2xsIixDPSJwYWRkaW5nIisoay5iU2Nyb2xsYmFyTGVmdD8iTGVmdCI6IlJpZ2h0IiksQj1ULm91dGVyV2lkdGgoKTthLmNzcygid2lkdGgiLG5yKEIpKSxzLmNzcygid2lkdGgiLG5yKEIpKS5jc3MoQyxmP3IrInB4IjoiMHB4IiksdyYmKG0uY3NzKCJ3aWR0aCIsbnIoQikpLHYuY3NzKCJ3aWR0aCIsbnIoQikpLmNzcyhDLGY/cisicHgiOiIwcHgiKSksVC5jaGlsZHJlbigiY29sZ3JvdXAiKS5wcmVwZW5kVG8oVCksdS50cmlnZ2VyKCJzY3JvbGwiKSwodC5iU29ydGVkfHx0LmJGaWx0ZXJlZCkmJiF0Ll9kcmF3SG9sZCYmKGwuc2Nyb2xsVG9wPTApfWZ1bmN0aW9uIGlsKHQpe2lmKHQub0ZlYXR1cmVzLmJBdXRvV2lkdGgpe3ZhciBlPXQublRhYmxlLHI9dC5hb0NvbHVtbnMsbj10Lm9TY3JvbGwscz1uLnNZLGE9bi5zWCxsPW4uc1hJbm5lcix1PWdpKHQsImJWaXNpYmxlIikscD1lLmdldEF0dHJpYnV0ZSgid2lkdGgiKSx2PWUucGFyZW50Tm9kZSxtLGcsVCx3PWUuc3R5bGUud2lkdGg7dyYmdy5pbmRleE9mKCIlIikhPT0tMSYmKHA9dyksWnQodCxudWxsLCJjb2x1bW4tY2FsYyIse3Zpc2libGU6dX0sITEpO3ZhciBrPVcoZS5jbG9uZU5vZGUoKSkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikucmVtb3ZlQXR0cigiaWQiKTtrLmFwcGVuZCgiPHRib2R5PiIpO3ZhciBQPVcoIjx0ci8+IikuYXBwZW5kVG8oay5maW5kKCJ0Ym9keSIpKTtmb3Ioay5hcHBlbmQoVyh0Lm5USGVhZCkuY2xvbmUoKSkuYXBwZW5kKFcodC5uVEZvb3QpLmNsb25lKCkpLGsuZmluZCgidGZvb3QgdGgsIHRmb290IHRkIikuY3NzKCJ3aWR0aCIsIiIpLGsuZmluZCgidGhlYWQgdGgsIHRoZWFkIHRkIikuZWFjaChmdW5jdGlvbigpe3ZhciBldD1HYSh0LHRoaXMsITAsITEpO2V0Pyh0aGlzLnN0eWxlLndpZHRoPWV0LGEmJlcodGhpcykuYXBwZW5kKFcoIjxkaXYvPiIpLmNzcyh7d2lkdGg6ZXQsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjowLGhlaWdodDoxfSkpKTp0aGlzLnN0eWxlLndpZHRoPSIifSksbT0wO208dS5sZW5ndGg7bSsrKXtUPXVbbV0sZz1yW1RdO3ZhciBGPWFsKHQsVCksaD1RdC50eXBlLmNsYXNzTmFtZVtnLnNUeXBlXSxvPUYrZy5zQ29udGVudFBhZGRpbmcsZj1GLmluZGV4T2YoIjwiKT09PS0xP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKG8pOm87VygiPHRkLz4iKS5hZGRDbGFzcyhoKS5hZGRDbGFzcyhnLnNDbGFzcykuYXBwZW5kKGYpLmFwcGVuZFRvKFApfVcoIltuYW1lXSIsaykucmVtb3ZlQXR0cigibmFtZSIpO3ZhciBDPVcoIjxkaXYvPiIpLmNzcyhhfHxzP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxoZWlnaHQ6MSxyaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifTp7fSkuYXBwZW5kKGspLmFwcGVuZFRvKHYpO2EmJmw/ay53aWR0aChsKTphPyhrLmNzcygid2lkdGgiLCJhdXRvIiksay5yZW1vdmVBdHRyKCJ3aWR0aCIpLGsud2lkdGgoKTx2LmNsaWVudFdpZHRoJiZwJiZrLndpZHRoKHYuY2xpZW50V2lkdGgpKTpzP2sud2lkdGgodi5jbGllbnRXaWR0aCk6cCYmay53aWR0aChwKTt2YXIgQj0wLGM9ay5maW5kKCJ0Ym9keSB0ciIpLmVxKDApLmNoaWxkcmVuKCk7Zm9yKG09MDttPHUubGVuZ3RoO20rKyl7dmFyIHo9Y1ttXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtCKz16LHJbdVttXV0uc1dpZHRoPW5yKHopfWlmKGUuc3R5bGUud2lkdGg9bnIoQiksQy5yZW1vdmUoKSxwJiYoZS5zdHlsZS53aWR0aD1ucihwKSksKHB8fGEpJiYhdC5fcmVzekV2dCl7dmFyIEc9ZnVuY3Rpb24oKXtXKHdpbmRvdykub24oInJlc2l6ZS5EVC0iK3Quc0luc3RhbmNlLGJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt0LmJEZXN0cm95aW5nfHxUbih0KX0pKX07RygpLHQuX3Jlc3pFdnQ9ITB9fX1mdW5jdGlvbiBhbCh0LGUpe3ZhciByPXQuYW9Db2x1bW5zW2VdO2lmKCFyLm1heExlblN0cmluZyl7Zm9yKHZhciBuLHM9IiIsYT0tMSxsPTAsdT10LmFpRGlzcGxheU1hc3Rlci5sZW5ndGg7bDx1O2wrKyl7dmFyIHA9dC5haURpc3BsYXlNYXN0ZXJbbF0sdj1DaSh0LHApW2VdLG09diYmdHlwZW9mIHY9PSJvYmplY3QiJiZ2Lm5vZGVUeXBlP3YuaW5uZXJIVE1MOnYrIiI7bT1tLnJlcGxhY2UoL2lkPSIuKj8iL2csIiIpLnJlcGxhY2UoL25hbWU9Ii4qPyIvZywiIiksbj1BcihtKS5yZXBsYWNlKC8mbmJzcDsvZywiICIpLG4ubGVuZ3RoPmEmJihzPW0sYT1uLmxlbmd0aCl9ci5tYXhMZW5TdHJpbmc9c31yZXR1cm4gci5tYXhMZW5TdHJpbmd9ZnVuY3Rpb24gbnIodCl7cmV0dXJuIHQ9PT1udWxsPyIwcHgiOnR5cGVvZiB0PT0ibnVtYmVyIj90PDA/IjBweCI6dCsicHgiOnQubWF0Y2goL1xkJC8pP3QrInB4Ijp0fWZ1bmN0aW9uIGVzKHQpe3ZhciBlPXQuYW9Db2x1bW5zO2Zvcih0LmNvbGdyb3VwLmVtcHR5KCksUGU9MDtQZTxlLmxlbmd0aDtQZSsrKWVbUGVdLmJWaXNpYmxlJiZ0LmNvbGdyb3VwLmFwcGVuZChlW1BlXS5jb2xFbCl9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dC5uVEhlYWQscj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInRyIiksbj10LmJTb3J0Q2VsbHNUb3Ascz0nOm5vdChbZGF0YS1kdC1vcmRlcj0iZGlzYWJsZSJdKTpub3QoW2RhdGEtZHQtb3JkZXI9Imljb24tb25seSJdKSc7bj09PSEwP2U9clswXTpuPT09ITEmJihlPXJbci5sZW5ndGgtMV0pLHJzKHQsZSxlPT09dC5uVEhlYWQ/InRyIitzKyIgdGgiK3MrIiwgdHIiK3MrIiB0ZCIrczoidGgiK3MrIiwgdGQiK3MpO3ZhciBhPVtdO3FyKHQsYSx0LmFhU29ydGluZyksdC5hYVNvcnRpbmc9YX1mdW5jdGlvbiBycyh0LGUscixuLHMpe25zKGUscixmdW5jdGlvbihhKXt2YXIgbD0hMSx1PW49PT12b2lkIDA/d2koYS50YXJnZXQpOltuXTtpZih1Lmxlbmd0aCl7Zm9yKHZhciBwPTAsdj11Lmxlbmd0aDtwPHY7cCsrKXt2YXIgbT1sbCh0LHVbcF0scCxhLnNoaWZ0S2V5KTtpZihtIT09ITEmJihsPSEwKSx0LmFhU29ydGluZy5sZW5ndGg9PT0xJiZ0LmFhU29ydGluZ1swXVsxXT09PSIiKWJyZWFrfWwmJihCZSh0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7U2kodCksb2wodCksUHIodCwhMSwhMSksQmUodCwhMSkscyYmcygpfSwwKSl9fSl9ZnVuY3Rpb24gb2wodCl7dmFyIGU9dC5haURpc3BsYXkscj10LmFpRGlzcGxheU1hc3RlcixuPXt9LHM9e30sYTtmb3IoYT0wO2E8ci5sZW5ndGg7YSsrKW5bclthXV09YTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXNbZVthXV09bltlW2FdXTtlLnNvcnQoZnVuY3Rpb24obCx1KXtyZXR1cm4gc1tsXS1zW3VdfSl9ZnVuY3Rpb24gcXIodCxlLHIpe3ZhciBuPWZ1bmN0aW9uKGEpe2lmKFcuaXNQbGFpbk9iamVjdChhKSl7aWYoYS5pZHghPT12b2lkIDApZS5wdXNoKFthLmlkeCxhLmRpcl0pO2Vsc2UgaWYoYS5uYW1lKXt2YXIgbD14ZSh0LmFvQ29sdW1ucywic05hbWUiKSx1PWwuaW5kZXhPZihhLm5hbWUpO3UhPT0tMSYmZS5wdXNoKFt1LGEuZGlyXSl9fWVsc2UgZS5wdXNoKGEpfTtpZihXLmlzUGxhaW5PYmplY3QocikpbihyKTtlbHNlIGlmKHIubGVuZ3RoJiZ0eXBlb2YgclswXT09Im51bWJlciIpbihyKTtlbHNlIGlmKHIubGVuZ3RoKWZvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKW4ocltzXSl9ZnVuY3Rpb24gQW4odCl7dmFyIGUscixuLHM9W10sYT1idC5leHQudHlwZS5vcmRlcixsPXQuYW9Db2x1bW5zLHUscCx2LG0sZz10LmFhU29ydGluZ0ZpeGVkLFQ9Vy5pc1BsYWluT2JqZWN0KGcpLHc9W107aWYoIXQub0ZlYXR1cmVzLmJTb3J0KXJldHVybiBzO2ZvcihBcnJheS5pc0FycmF5KGcpJiZxcih0LHcsZyksVCYmZy5wcmUmJnFyKHQsdyxnLnByZSkscXIodCx3LHQuYWFTb3J0aW5nKSxUJiZnLnBvc3QmJnFyKHQsdyxnLnBvc3QpLGU9MDtlPHcubGVuZ3RoO2UrKylpZihtPXdbZV1bMF0sbFttXSlmb3IodT1sW21dLmFEYXRhU29ydCxyPTAsbj11Lmxlbmd0aDtyPG47cisrKXA9dVtyXSx2PWxbcF0uc1R5cGV8fCJzdHJpbmciLHdbZV0uX2lkeD09PXZvaWQgMCYmKHdbZV0uX2lkeD1sW3BdLmFzU29ydGluZy5pbmRleE9mKHdbZV1bMV0pKSx3W2VdWzFdJiZzLnB1c2goe3NyYzptLGNvbDpwLGRpcjp3W2VdWzFdLGluZGV4OndbZV0uX2lkeCx0eXBlOnYsZm9ybWF0dGVyOmFbdisiLXByZSJdLHNvcnRlcjphW3YrIi0iK3dbZV1bMV1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gU2kodCxlLHIpe3ZhciBuLHMsYSxsPVtdLHU9YnQuZXh0LnR5cGUub3JkZXIscD10LmFvRGF0YSx2LG09dC5haURpc3BsYXlNYXN0ZXIsZztpZih5aSh0KSxlIT09dm9pZCAwKXt2YXIgVD10LmFvQ29sdW1uc1tlXTtnPVt7c3JjOmUsY29sOmUsZGlyOnIsaW5kZXg6MCx0eXBlOlQuc1R5cGUsZm9ybWF0dGVyOnVbVC5zVHlwZSsiLXByZSJdLHNvcnRlcjp1W1Quc1R5cGUrIi0iK3JdfV0sbT1tLnNsaWNlKCl9ZWxzZSBnPUFuKHQpO2ZvcihuPTAscz1nLmxlbmd0aDtuPHM7bisrKXY9Z1tuXSxkbCh0LHYuY29sKTtpZihfZSh0KSE9InNzcCImJmcubGVuZ3RoIT09MCl7Zm9yKG49MCxhPW0ubGVuZ3RoO248YTtuKyspbFtuXT1uO2cubGVuZ3RoJiZnWzBdLmRpcj09PSJkZXNjIiYmbC5yZXZlcnNlKCksbS5zb3J0KGZ1bmN0aW9uKHcsayl7dmFyIFAsRixoLG8sZixDPWcubGVuZ3RoLEI9cFt3XS5fYVNvcnREYXRhLGM9cFtrXS5fYVNvcnREYXRhO2ZvcihoPTA7aDxDO2grKylpZihmPWdbaF0sUD1CW2YuY29sXSxGPWNbZi5jb2xdLGYuc29ydGVyKXtpZihvPWYuc29ydGVyKFAsRiksbyE9PTApcmV0dXJuIG99ZWxzZSBpZihvPVA8Rj8tMTpQPkY/MTowLG8hPT0wKXJldHVybiBmLmRpcj09PSJhc2MiP286LW87cmV0dXJuIFA9bFt3XSxGPWxba10sUDxGPy0xOlA+Rj8xOjB9KX1lbHNlIGcubGVuZ3RoPT09MCYmbS5zb3J0KGZ1bmN0aW9uKHcsayl7cmV0dXJuIHc8az8tMTp3Pms/MTowfSk7cmV0dXJuIGU9PT12b2lkIDAmJih0LmJTb3J0ZWQ9ITAsWnQodCxudWxsLCJvcmRlciIsW3QsZ10pKSxtfWZ1bmN0aW9uIGxsKHQsZSxyLG4pe3ZhciBzPXQuYW9Db2x1bW5zW2VdLGE9dC5hYVNvcnRpbmcsbD1zLmFzU29ydGluZyx1LHA9ZnVuY3Rpb24obSxnKXt2YXIgVD1tLl9pZHg7cmV0dXJuIFQ9PT12b2lkIDAmJihUPWwuaW5kZXhPZihtWzFdKSksVCsxPGwubGVuZ3RoP1QrMTpnP251bGw6MH07aWYoIXMuYlNvcnRhYmxlKXJldHVybiExO2lmKHR5cGVvZiBhWzBdPT0ibnVtYmVyIiYmKGE9dC5hYVNvcnRpbmc9W2FdKSwobnx8cikmJnQub0ZlYXR1cmVzLmJTb3J0TXVsdGkpe3ZhciB2PXhlKGEsIjAiKS5pbmRleE9mKGUpO3YhPT0tMT8odT1wKGFbdl0sITApLHU9PT1udWxsJiZhLmxlbmd0aD09PTEmJih1PTApLHU9PT1udWxsP2Euc3BsaWNlKHYsMSk6KGFbdl1bMV09bFt1XSxhW3ZdLl9pZHg9dSkpOm4/KGEucHVzaChbZSxsWzBdLDBdKSxhW2EubGVuZ3RoLTFdLl9pZHg9MCk6KGEucHVzaChbZSxhWzBdWzFdLDBdKSxhW2EubGVuZ3RoLTFdLl9pZHg9MCl9ZWxzZSBhLmxlbmd0aCYmYVswXVswXT09ZT8odT1wKGFbMF0pLGEubGVuZ3RoPTEsYVswXVsxXT1sW3VdLGFbMF0uX2lkeD11KTooYS5sZW5ndGg9MCxhLnB1c2goW2UsbFswXV0pLGFbMF0uX2lkeD0wKX1mdW5jdGlvbiBmaSh0KXt2YXIgZT10LmFMYXN0U29ydCxyPXQub0NsYXNzZXMub3JkZXIucG9zaXRpb24sbj1Bbih0KSxzPXQub0ZlYXR1cmVzLGEsbCx1O2lmKHMuYlNvcnQmJnMuYlNvcnRDbGFzc2VzKXtmb3IoYT0wLGw9ZS5sZW5ndGg7YTxsO2ErKyl1PWVbYV0uc3JjLFcoeGUodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5yZW1vdmVDbGFzcyhyKyhhPDI/YSsxOjMpKTtmb3IoYT0wLGw9bi5sZW5ndGg7YTxsO2ErKyl1PW5bYV0uc3JjLFcoeGUodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5hZGRDbGFzcyhyKyhhPDI/YSsxOjMpKX10LmFMYXN0U29ydD1ufWZ1bmN0aW9uIGRsKHQsZSl7dmFyIHI9dC5hb0NvbHVtbnNbZV0sbj1idC5leHQub3JkZXJbci5zU29ydERhdGFUeXBlXSxzO24mJihzPW4uY2FsbCh0Lm9JbnN0YW5jZSx0LGUsJHIodCxlKSkpO2Zvcih2YXIgYSxsLHU9YnQuZXh0LnR5cGUub3JkZXJbci5zVHlwZSsiLXByZSJdLHA9dC5hb0RhdGEsdj0wO3Y8cC5sZW5ndGg7disrKXBbdl0mJihhPXBbdl0sYS5fYVNvcnREYXRhfHwoYS5fYVNvcnREYXRhPVtdKSwoIWEuX2FTb3J0RGF0YVtlXXx8bikmJihsPW4/c1t2XTpOZSh0LHYsZSwic29ydCIpLGEuX2FTb3J0RGF0YVtlXT11P3UobCx0KTpsKSl9ZnVuY3Rpb24gSW4odCl7aWYoIXQuX2JMb2FkaW5nU3RhdGUpe3ZhciBlPXt0aW1lOituZXcgRGF0ZSxzdGFydDp0Ll9pRGlzcGxheVN0YXJ0LGxlbmd0aDp0Ll9pRGlzcGxheUxlbmd0aCxvcmRlcjpXLmV4dGVuZCghMCxbXSx0LmFhU29ydGluZyksc2VhcmNoOlcuZXh0ZW5kKHt9LHQub1ByZXZpb3VzU2VhcmNoKSxjb2x1bW5zOnQuYW9Db2x1bW5zLm1hcChmdW5jdGlvbihyLG4pe3JldHVybnt2aXNpYmxlOnIuYlZpc2libGUsc2VhcmNoOlcuZXh0ZW5kKHt9LHQuYW9QcmVTZWFyY2hDb2xzW25dKX19KX07dC5vU2F2ZWRTdGF0ZT1lLFp0KHQsImFvU3RhdGVTYXZlUGFyYW1zIiwic3RhdGVTYXZlUGFyYW1zIixbdCxlXSksdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSYmIXQuYkRlc3Ryb3lpbmcmJnQuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsZSl9fWZ1bmN0aW9uIHVsKHQsZSxyKXtpZighdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSl7cigpO3JldHVybn12YXIgbj1mdW5jdGlvbihhKXtoaSh0LGEscil9LHM9dC5mblN0YXRlTG9hZENhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxuKTtyZXR1cm4gcyE9PXZvaWQgMCYmaGkodCxzLHIpLCEwfWZ1bmN0aW9uIGhpKHQsZSxyKXt2YXIgbixzLGE9dC5hb0NvbHVtbnM7dC5fYkxvYWRpbmdTdGF0ZT0hMDt2YXIgbD10Ll9iSW5pdENvbXBsZXRlP25ldyBidC5BcGkodCk6bnVsbDtpZighZXx8IWUudGltZSl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxyKCk7cmV0dXJufXZhciB1PXQuaVN0YXRlRHVyYXRpb247aWYodT4wJiZlLnRpbWU8K25ldyBEYXRlLXUqMWUzKXt0Ll9iTG9hZGluZ1N0YXRlPSExLHIoKTtyZXR1cm59dmFyIHA9WnQodCwiYW9TdGF0ZUxvYWRQYXJhbXMiLCJzdGF0ZUxvYWRQYXJhbXMiLFt0LGVdKTtpZihwLmluZGV4T2YoITEpIT09LTEpe3QuX2JMb2FkaW5nU3RhdGU9ITEscigpO3JldHVybn1pZihlLmNvbHVtbnMmJmEubGVuZ3RoIT09ZS5jb2x1bW5zLmxlbmd0aCl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxyKCk7cmV0dXJufWlmKHQub0xvYWRlZFN0YXRlPVcuZXh0ZW5kKCEwLHt9LGUpLFp0KHQsbnVsbCwic3RhdGVMb2FkSW5pdCIsW3QsZV0sITApLGUubGVuZ3RoIT09dm9pZCAwJiYobD9sLnBhZ2UubGVuKGUubGVuZ3RoKTp0Ll9pRGlzcGxheUxlbmd0aD1lLmxlbmd0aCksZS5zdGFydCE9PXZvaWQgMCYmKGw9PT1udWxsPyh0Ll9pRGlzcGxheVN0YXJ0PWUuc3RhcnQsdC5pSW5pdERpc3BsYXlTdGFydD1lLnN0YXJ0KTpraSh0LGUuc3RhcnQvdC5faURpc3BsYXlMZW5ndGgpKSxlLm9yZGVyIT09dm9pZCAwJiYodC5hYVNvcnRpbmc9W10sVy5lYWNoKGUub3JkZXIsZnVuY3Rpb24obSxnKXt0LmFhU29ydGluZy5wdXNoKGdbMF0+PWEubGVuZ3RoP1swLGdbMV1dOmcpfSkpLGUuc2VhcmNoIT09dm9pZCAwJiZXLmV4dGVuZCh0Lm9QcmV2aW91c1NlYXJjaCxlLnNlYXJjaCksZS5jb2x1bW5zKXtmb3Iobj0wLHM9ZS5jb2x1bW5zLmxlbmd0aDtuPHM7bisrKXt2YXIgdj1lLmNvbHVtbnNbbl07di52aXNpYmxlIT09dm9pZCAwJiYobD9sLmNvbHVtbihuKS52aXNpYmxlKHYudmlzaWJsZSwhMSk6YVtuXS5iVmlzaWJsZT12LnZpc2libGUpLHYuc2VhcmNoIT09dm9pZCAwJiZXLmV4dGVuZCh0LmFvUHJlU2VhcmNoQ29sc1tuXSx2LnNlYXJjaCl9bCYmbC5jb2x1bW5zLmFkanVzdCgpfXQuX2JMb2FkaW5nU3RhdGU9ITEsWnQodCwiYW9TdGF0ZUxvYWRlZCIsInN0YXRlTG9hZGVkIixbdCxlXSkscigpfWZ1bmN0aW9uIEZlKHQsZSxyLG4pe2lmKHI9IkRhdGFUYWJsZXMgd2FybmluZzogIisodD8idGFibGUgaWQ9Iit0LnNUYWJsZUlkKyIgLSAiOiIiKStyLG4mJihyKz0iLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vIituKSxlKXdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cocik7ZWxzZXt2YXIgcz1idC5leHQsYT1zLnNFcnJNb2RlfHxzLmVyck1vZGU7aWYodCYmWnQodCxudWxsLCJkdC1lcnJvciIsW3QsbixyXSwhMCksYT09ImFsZXJ0IilhbGVydChyKTtlbHNle2lmKGE9PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKHIpO3R5cGVvZiBhPT0iZnVuY3Rpb24iJiZhKHQsbixyKX19fWZ1bmN0aW9uIGlyKHQsZSxyLG4pe2lmKEFycmF5LmlzQXJyYXkocikpe1cuZWFjaChyLGZ1bmN0aW9uKHMsYSl7QXJyYXkuaXNBcnJheShhKT9pcih0LGUsYVswXSxhWzFdKTppcih0LGUsYSl9KTtyZXR1cm59bj09PXZvaWQgMCYmKG49ciksZVtyXSE9PXZvaWQgMCYmKHRbbl09ZVtyXSl9ZnVuY3Rpb24gT2EodCxlLHIpe3ZhciBuO2Zvcih2YXIgcyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYobj1lW3NdLFcuaXNQbGFpbk9iamVjdChuKT8oVy5pc1BsYWluT2JqZWN0KHRbc10pfHwodFtzXT17fSksVy5leHRlbmQoITAsdFtzXSxuKSk6ciYmcyE9PSJkYXRhIiYmcyE9PSJhYURhdGEiJiZBcnJheS5pc0FycmF5KG4pP3Rbc109bi5zbGljZSgpOnRbc109bik7cmV0dXJuIHR9ZnVuY3Rpb24gbnModCxlLHIpe1codCkub24oImNsaWNrLkRUIixlLGZ1bmN0aW9uKG4pe3Iobil9KS5vbigia2V5cHJlc3MuRFQiLGUsZnVuY3Rpb24obil7bi53aGljaD09PTEzJiYobi5wcmV2ZW50RGVmYXVsdCgpLHIobikpfSkub24oInNlbGVjdHN0YXJ0LkRUIixlLGZ1bmN0aW9uKCl7cmV0dXJuITF9KX1mdW5jdGlvbiBJZSh0LGUscil7ciYmdFtlXS5wdXNoKHIpfWZ1bmN0aW9uIFp0KHQsZSxyLG4scyl7dmFyIGE9W107aWYoZSYmKGE9dFtlXS5zbGljZSgpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAuYXBwbHkodC5vSW5zdGFuY2Usbil9KSksciE9PW51bGwpe3ZhciBsPVcuRXZlbnQocisiLmR0IiksdT1XKHQublRhYmxlKTtsLmR0PXQuYXBpLHVbcz8idHJpZ2dlciI6InRyaWdnZXJIYW5kbGVyIl0obCxuKSxzJiZ1LnBhcmVudHMoImJvZHkiKS5sZW5ndGg9PT0wJiZXKCJib2R5IikudHJpZ2dlcihsLG4pLGEucHVzaChsLnJlc3VsdCl9cmV0dXJuIGF9ZnVuY3Rpb24gaXModCl7dmFyIGU9dC5faURpc3BsYXlTdGFydCxyPXQuZm5EaXNwbGF5RW5kKCksbj10Ll9pRGlzcGxheUxlbmd0aDtlPj1yJiYoZT1yLW4pLGUtPWUlbiwobj09PS0xfHxlPDApJiYoZT0wKSx0Ll9pRGlzcGxheVN0YXJ0PWV9ZnVuY3Rpb24geG4odCxlKXt2YXIgcj10LnJlbmRlcmVyLG49YnQuZXh0LnJlbmRlcmVyW2VdO3JldHVybiBXLmlzUGxhaW5PYmplY3QocikmJnJbZV0/bltyW2VdXXx8bi5fOnR5cGVvZiByPT0ic3RyaW5nIiYmbltyXXx8bi5ffWZ1bmN0aW9uIF9lKHQpe3JldHVybiB0Lm9GZWF0dXJlcy5iU2VydmVyU2lkZT8ic3NwIjp0LmFqYXg/ImFqYXgiOiJkb20ifWZ1bmN0aW9uIERpKHQsZSxyKXt2YXIgbj10LmZuRm9ybWF0TnVtYmVyLHM9dC5faURpc3BsYXlTdGFydCsxLGE9dC5faURpc3BsYXlMZW5ndGgsbD10LmZuUmVjb3Jkc0Rpc3BsYXkoKSx1PXQuZm5SZWNvcmRzVG90YWwoKSxwPWE9PT0tMTtyZXR1cm4gZS5yZXBsYWNlKC9fU1RBUlRfL2csbi5jYWxsKHQscykpLnJlcGxhY2UoL19FTkRfL2csbi5jYWxsKHQsdC5mbkRpc3BsYXlFbmQoKSkpLnJlcGxhY2UoL19NQVhfL2csbi5jYWxsKHQsdSkpLnJlcGxhY2UoL19UT1RBTF8vZyxuLmNhbGwodCxsKSkucmVwbGFjZSgvX1BBR0VfL2csbi5jYWxsKHQscD8xOk1hdGguY2VpbChzL2EpKSkucmVwbGFjZSgvX1BBR0VTXy9nLG4uY2FsbCh0LHA/MTpNYXRoLmNlaWwobC9hKSkpLnJlcGxhY2UoL19FTlRSSUVTXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLHIpKS5yZXBsYWNlKC9fRU5UUklFUy1NQVhfL2csdC5hcGkuaTE4bigiZW50cmllcyIsIiIsdSkpLnJlcGxhY2UoL19FTlRSSUVTLVRPVEFMXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLGwpKX12YXIgQWk9W10sZmU9QXJyYXkucHJvdG90eXBlLGNsPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj1idC5zZXR0aW5ncyxzPXhlKG4sIm5UYWJsZSIpO2lmKHQpe2lmKHQublRhYmxlJiZ0Lm9GZWF0dXJlcylyZXR1cm5bdF07aWYodC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRhYmxlIilyZXR1cm4gZT1zLmluZGV4T2YodCksZSE9PS0xP1tuW2VdXTpudWxsO2lmKHQmJnR5cGVvZiB0LnNldHRpbmdzPT0iZnVuY3Rpb24iKXJldHVybiB0LnNldHRpbmdzKCkudG9BcnJheSgpO3R5cGVvZiB0PT0ic3RyaW5nIj9yPVcodCkuZ2V0KCk6dCBpbnN0YW5jZW9mIFcmJihyPXQuZ2V0KCkpfWVsc2UgcmV0dXJuW107aWYocilyZXR1cm4gbi5maWx0ZXIoZnVuY3Rpb24oYSxsKXtyZXR1cm4gci5pbmNsdWRlcyhzW2xdKX0pfTtXdD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFd0KSlyZXR1cm4gbmV3IFd0KHQsZSk7dmFyIHI9W10sbj1mdW5jdGlvbihsKXt2YXIgdT1jbChsKTt1JiZyLnB1c2guYXBwbHkocix1KX07aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MCxhPXQubGVuZ3RoO3M8YTtzKyspbih0W3NdKTtlbHNlIG4odCk7dGhpcy5jb250ZXh0PXIubGVuZ3RoPjE/aHIocik6cixlJiZ0aGlzLnB1c2guYXBwbHkodGhpcyxlKSx0aGlzLnNlbGVjdG9yPXtyb3dzOm51bGwsY29sczpudWxsLG9wdHM6bnVsbH0sV3QuZXh0ZW5kKHRoaXMsdGhpcyxBaSl9O2J0LkFwaT1XdDtXLmV4dGVuZChXdC5wcm90b3R5cGUse2FueTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvdW50KCkhPT0wfSxjb250ZXh0OltdLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpLmxlbmd0aH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoO2U8cjtlKyspdC5jYWxsKHRoaXMsdGhpc1tlXSxlLHRoaXMpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIGUubGVuZ3RoPnQ/bmV3IFd0KGVbdF0sdGhpc1t0XSk6bnVsbH0sZmlsdGVyOmZ1bmN0aW9uKHQpe3ZhciBlPWZlLmZpbHRlci5jYWxsKHRoaXMsdCx0aGlzKTtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCxlKX0sZmxhdHRlbjpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHQuY29uY2F0LmFwcGx5KHQsdGhpcy50b0FycmF5KCkpKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW3RdfSxqb2luOmZlLmpvaW4saW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5kZXhPZih0KSE9PS0xfSxpbmRleE9mOmZlLmluZGV4T2YsaXRlcmF0b3I6ZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9W10sYSxsLHUscCx2LG09dGhpcy5jb250ZXh0LGcsVCx3LGs9dGhpcy5zZWxlY3Rvcjtmb3IodHlwZW9mIHQ9PSJzdHJpbmciJiYobj1yLHI9ZSxlPXQsdD0hMSksbD0wLHU9bS5sZW5ndGg7bDx1O2wrKyl7dmFyIFA9bmV3IFd0KG1bbF0pO2lmKGU9PT0idGFibGUiKWE9ci5jYWxsKFAsbVtsXSxsKSxhIT09dm9pZCAwJiZzLnB1c2goYSk7ZWxzZSBpZihlPT09ImNvbHVtbnMifHxlPT09InJvd3MiKWE9ci5jYWxsKFAsbVtsXSx0aGlzW2xdLGwpLGEhPT12b2lkIDAmJnMucHVzaChhKTtlbHNlIGlmKGU9PT0iZXZlcnkifHxlPT09ImNvbHVtbiJ8fGU9PT0iY29sdW1uLXJvd3MifHxlPT09InJvdyJ8fGU9PT0iY2VsbCIpZm9yKFQ9dGhpc1tsXSxlPT09ImNvbHVtbi1yb3dzIiYmKGc9UG4obVtsXSxrLm9wdHMpKSxwPTAsdj1ULmxlbmd0aDtwPHY7cCsrKXc9VFtwXSxlPT09ImNlbGwiP2E9ci5jYWxsKFAsbVtsXSx3LnJvdyx3LmNvbHVtbixsLHApOmE9ci5jYWxsKFAsbVtsXSx3LGwscCxnKSxhIT09dm9pZCAwJiZzLnB1c2goYSl9aWYocy5sZW5ndGh8fG4pe3ZhciBGPW5ldyBXdChtLHQ/cy5jb25jYXQuYXBwbHkoW10scyk6cyksaD1GLnNlbGVjdG9yO3JldHVybiBoLnJvd3M9ay5yb3dzLGguY29scz1rLmNvbHMsaC5vcHRzPWsub3B0cyxGfXJldHVybiB0aGlzfSxsYXN0SW5kZXhPZjpmZS5sYXN0SW5kZXhPZixsZW5ndGg6MCxtYXA6ZnVuY3Rpb24odCl7dmFyIGU9ZmUubWFwLmNhbGwodGhpcyx0LHRoaXMpO3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LGUpfSxwbHVjazpmdW5jdGlvbih0KXt2YXIgZT1idC51dGlsLmdldCh0KTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIGUocil9KX0scG9wOmZlLnBvcCxwdXNoOmZlLnB1c2gscmVkdWNlOmZlLnJlZHVjZSxyZWR1Y2VSaWdodDpmZS5yZWR1Y2VSaWdodCxyZXZlcnNlOmZlLnJldmVyc2Usc2VsZWN0b3I6bnVsbCxzaGlmdDpmZS5zaGlmdCxzbGljZTpmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHRoaXMpfSxzb3J0OmZlLnNvcnQsc3BsaWNlOmZlLnNwbGljZSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGZlLnNsaWNlLmNhbGwodGhpcyl9LHRvJDpmdW5jdGlvbigpe3JldHVybiBXKHRoaXMpfSx0b0pRdWVyeTpmdW5jdGlvbigpe3JldHVybiBXKHRoaXMpfSx1bmlxdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCxocih0aGlzLnRvQXJyYXkoKSkpfSx1bnNoaWZ0OmZlLnVuc2hpZnR9KTtmdW5jdGlvbiBmbCh0LGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0fHx0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIFd0LmV4dGVuZChuLG4sci5tZXRob2RFeHQpLG59fWZ1bmN0aW9uIGhsKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl0ubmFtZT09PWUpcmV0dXJuIHRbcl07cmV0dXJuIG51bGx9d2luZG93Ll9fYXBpU3RydWN0PUFpO1d0LmV4dGVuZD1mdW5jdGlvbih0LGUscil7aWYoISghci5sZW5ndGh8fCFlfHwhKGUgaW5zdGFuY2VvZiBXdCkmJiFlLl9fZHRfd3JhcHBlcikpe3ZhciBuLHMsYTtmb3Iobj0wLHM9ci5sZW5ndGg7bjxzO24rKylhPXJbbl0sZVthLm5hbWVdPWEudHlwZT09PSJmdW5jdGlvbiI/ZmwodCxhLnZhbCxhKTphLnR5cGU9PT0ib2JqZWN0Ij97fTphLnZhbCxlW2EubmFtZV0uX19kdF93cmFwcGVyPSEwLFd0LmV4dGVuZCh0LGVbYS5uYW1lXSxhLnByb3BFeHQpfX07V3QucmVnaXN0ZXI9SXQ9ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspV3QucmVnaXN0ZXIodFtyXSxlKTtyZXR1cm59dmFyIHMsYSxsPXQuc3BsaXQoIi4iKSx1PUFpLHAsdjtmb3Iocz0wLGE9bC5sZW5ndGg7czxhO3MrKyl7dj1sW3NdLmluZGV4T2YoIigpIikhPT0tMSxwPXY/bFtzXS5yZXBsYWNlKCIoKSIsIiIpOmxbc107dmFyIG09aGwodSxwKTttfHwobT17bmFtZTpwLHZhbDp7fSxtZXRob2RFeHQ6W10scHJvcEV4dDpbXSx0eXBlOiJvYmplY3QifSx1LnB1c2gobSkpLHM9PT1hLTE/KG0udmFsPWUsbS50eXBlPXR5cGVvZiBlPT0iZnVuY3Rpb24iPyJmdW5jdGlvbiI6Vy5pc1BsYWluT2JqZWN0KGUpPyJvYmplY3QiOiJvdGhlciIpOnU9dj9tLm1ldGhvZEV4dDptLnByb3BFeHR9fTtXdC5yZWdpc3RlclBsdXJhbD1KdD1mdW5jdGlvbih0LGUscil7V3QucmVnaXN0ZXIodCxyKSxXdC5yZWdpc3RlcihlLGZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG49PT10aGlzP3RoaXM6biBpbnN0YW5jZW9mIFd0P24ubGVuZ3RoP0FycmF5LmlzQXJyYXkoblswXSk/bmV3IFd0KG4uY29udGV4dCxuWzBdKTpuWzBdOnZvaWQgMDpufSl9O3ZhciBhcz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocyl7dmFyIGE9YXMocyxlKTtyLnB1c2guYXBwbHkocixhKX0pLHIuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzfSl9aWYodHlwZW9mIHQ9PSJudW1iZXIiKXJldHVybltlW3RdXTt2YXIgbj1lLm1hcChmdW5jdGlvbihzKXtyZXR1cm4gcy5uVGFibGV9KTtyZXR1cm4gVyhuKS5maWx0ZXIodCkubWFwKGZ1bmN0aW9uKCl7dmFyIHM9bi5pbmRleE9mKHRoaXMpO3JldHVybiBlW3NdfSkudG9BcnJheSgpfTtJdCgidGFibGVzKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0IT1udWxsP25ldyBXdChhcyh0LHRoaXMuY29udGV4dCkpOnRoaXN9KTtJdCgidGFibGUoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50YWJsZXModCkscj1lLmNvbnRleHQ7cmV0dXJuIHIubGVuZ3RoP25ldyBXdChyWzBdKTplfSk7W1sibm9kZXMiLCJub2RlIiwiblRhYmxlIl0sWyJib2R5IiwiYm9keSIsIm5UQm9keSJdLFsiaGVhZGVyIiwiaGVhZGVyIiwiblRIZWFkIl0sWyJmb290ZXIiLCJmb290ZXIiLCJuVEZvb3QiXV0uZm9yRWFjaChmdW5jdGlvbih0KXtKdCgidGFibGVzKCkuIit0WzBdKyIoKSIsInRhYmxlKCkuIit0WzFdKyIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3JldHVybiBlW3RbMl1dfSwxKX0pfSk7W1siaGVhZGVyIiwiYW9IZWFkZXIiXSxbImZvb3RlciIsImFvRm9vdGVyIl1dLmZvckVhY2goZnVuY3Rpb24odCl7SXQoInRhYmxlKCkuIit0WzBdKyIuc3RydWN0dXJlKCkiLGZ1bmN0aW9uKGUpe3ZhciByPXRoaXMuY29sdW1ucyhlKS5pbmRleGVzKCkuZmxhdHRlbigpLG49dGhpcy5jb250ZXh0WzBdO3JldHVybiBLYShuLG5bdFsxXV0scil9KX0pO0p0KCJ0YWJsZXMoKS5jb250YWluZXJzKCkiLCJ0YWJsZSgpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7cmV0dXJuIHQublRhYmxlV3JhcHBlcn0sMSl9KTtJdCgidGFibGVzKCkuZXZlcnkoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIsbil7dC5jYWxsKGUudGFibGUobiksbil9KX0pO0l0KCJjYXB0aW9uKCkiLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5jb250ZXh0O2lmKHQ9PT12b2lkIDApe3ZhciBuPXJbMF0uY2FwdGlvbk5vZGU7cmV0dXJuIG4mJnIubGVuZ3RoP24uaW5uZXJIVE1MOm51bGx9cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihzKXt2YXIgYT1XKHMublRhYmxlKSxsPVcocy5jYXB0aW9uTm9kZSksdT1XKHMublRhYmxlV3JhcHBlcik7aWYobC5sZW5ndGh8fChsPVcoIjxjYXB0aW9uLz4iKS5odG1sKHQpLHMuY2FwdGlvbk5vZGU9bFswXSxlfHwoYS5wcmVwZW5kKGwpLGU9bC5jc3MoImNhcHRpb24tc2lkZSIpKSksbC5odG1sKHQpLGUmJihsLmNzcygiY2FwdGlvbi1zaWRlIixlKSxsWzBdLl9jYXB0aW9uU2lkZT1lKSx1LmZpbmQoImRpdi5kYXRhVGFibGVzX3Njcm9sbCIpLmxlbmd0aCl7dmFyIHA9ZT09PSJ0b3AiPyJIZWFkIjoiRm9vdCI7dS5maW5kKCJkaXYuZGF0YVRhYmxlc19zY3JvbGwiK3ArIiB0YWJsZSIpLnByZXBlbmQobCl9ZWxzZSBhLnByZXBlbmQobCl9LDEpfSk7SXQoImNhcHRpb24ubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGg/dFswXS5jYXB0aW9uTm9kZTpudWxsfSk7SXQoImRyYXcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXt0PT09InBhZ2UiP0ZyKGUpOih0eXBlb2YgdD09InN0cmluZyImJih0PXQhPT0iZnVsbC1ob2xkIiksUHIoZSx0PT09ITEpKX0pfSk7SXQoInBhZ2UoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5wYWdlLmluZm8oKS5wYWdlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtraShlLHQpfSl9KTtJdCgicGFnZS5pbmZvKCkiLGZ1bmN0aW9uKCl7aWYodGhpcy5jb250ZXh0Lmxlbmd0aCE9PTApe3ZhciB0PXRoaXMuY29udGV4dFswXSxlPXQuX2lEaXNwbGF5U3RhcnQscj10Lm9GZWF0dXJlcy5iUGFnaW5hdGU/dC5faURpc3BsYXlMZW5ndGg6LTEsbj10LmZuUmVjb3Jkc0Rpc3BsYXkoKSxzPXI9PT0tMTtyZXR1cm57cGFnZTpzPzA6TWF0aC5mbG9vcihlL3IpLHBhZ2VzOnM/MTpNYXRoLmNlaWwobi9yKSxzdGFydDplLGVuZDp0LmZuRGlzcGxheUVuZCgpLGxlbmd0aDpyLHJlY29yZHNUb3RhbDp0LmZuUmVjb3Jkc1RvdGFsKCkscmVjb3Jkc0Rpc3BsYXk6bixzZXJ2ZXJTaWRlOl9lKHQpPT09InNzcCJ9fX0pO0l0KCJwYWdlLmxlbigpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHQubGVuZ3RoIT09MD90aGlzLmNvbnRleHRbMF0uX2lEaXNwbGF5TGVuZ3RoOnZvaWQgMDp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7UWEoZSx0KX0pfSk7dmFyIHNzPWZ1bmN0aW9uKHQsZSxyKXtpZihyKXt2YXIgbj1uZXcgV3QodCk7bi5vbmUoImRyYXciLGZ1bmN0aW9uKCl7cihuLmFqYXguanNvbigpKX0pfWlmKF9lKHQpPT0ic3NwIilQcih0LGUpO2Vsc2V7QmUodCwhMCk7dmFyIHM9dC5qcVhIUjtzJiZzLnJlYWR5U3RhdGUhPT00JiZzLmFib3J0KCksVGkodCx7fSxmdW5jdGlvbihhKXtfaSh0KTtmb3IodmFyIGw9RG4odCxhKSx1PTAscD1sLmxlbmd0aDt1PHA7dSsrKXByKHQsbFt1XSk7UHIodCxlKSx3bih0KSxCZSh0LCExKX0pfX07SXQoImFqYXguanNvbigpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtpZih0Lmxlbmd0aD4wKXJldHVybiB0WzBdLmpzb259KTtJdCgiYWpheC5wYXJhbXMoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHQ7aWYodC5sZW5ndGg+MClyZXR1cm4gdFswXS5vQWpheERhdGF9KTtJdCgiYWpheC5yZWxvYWQoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe3NzKHIsZT09PSExLHQpfSl9KTtJdCgiYWpheC51cmwoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiB0PT09dm9pZCAwP2UubGVuZ3RoPT09MD92b2lkIDA6KGU9ZVswXSxXLmlzUGxhaW5PYmplY3QoZS5hamF4KT9lLmFqYXgudXJsOmUuYWpheCk6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe1cuaXNQbGFpbk9iamVjdChyLmFqYXgpP3IuYWpheC51cmw9dDpyLmFqYXg9dH0pfSk7SXQoImFqYXgudXJsKCkubG9hZCgpIixmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7c3MocixlPT09ITEsdCl9KX0pO3ZhciBJaT1mdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPVtdLGwsdSxwLHYsbSxnLFQ9dHlwZW9mIGU7Zm9yKCghZXx8VD09PSJzdHJpbmcifHxUPT09ImZ1bmN0aW9uInx8ZS5sZW5ndGg9PT12b2lkIDApJiYoZT1bZV0pLHA9MCx2PWUubGVuZ3RoO3A8djtwKyspZm9yKHU9ZVtwXSYmZVtwXS5zcGxpdCYmIWVbcF0ubWF0Y2goL1tbKDpdLyk/ZVtwXS5zcGxpdCgiLCIpOltlW3BdXSxtPTAsZz11Lmxlbmd0aDttPGc7bSsrKWw9cih0eXBlb2YgdVttXT09InN0cmluZyI/dVttXS50cmltKCk6dVttXSksbD1sLmZpbHRlcihmdW5jdGlvbihrKXtyZXR1cm4gayE9bnVsbH0pLGwmJmwubGVuZ3RoJiYoYT1hLmNvbmNhdChsKSk7dmFyIHc9UXQuc2VsZWN0b3JbdF07aWYody5sZW5ndGgpZm9yKHA9MCx2PXcubGVuZ3RoO3A8djtwKyspYT13W3BdKG4scyxhKTtyZXR1cm4gaHIoYSl9LFBpPWZ1bmN0aW9uKHQpe3JldHVybiB0fHwodD17fSksdC5maWx0ZXImJnQuc2VhcmNoPT09dm9pZCAwJiYodC5zZWFyY2g9dC5maWx0ZXIpLFcuZXh0ZW5kKHtzZWFyY2g6Im5vbmUiLG9yZGVyOiJjdXJyZW50IixwYWdlOiJhbGwifSx0KX0sRmk9ZnVuY3Rpb24odCl7bGV0IGU9bmV3IFd0KHQuY29udGV4dFswXSk7cmV0dXJuIHQubGVuZ3RoJiZlLnB1c2godFswXSksZS5zZWxlY3Rvcj10LnNlbGVjdG9yLGUubGVuZ3RoJiZlWzBdLmxlbmd0aD4xJiZlWzBdLnNwbGljZSgxKSxlfSxQbj1mdW5jdGlvbih0LGUpe3ZhciByLG4scyxhPVtdLGw9dC5haURpc3BsYXksdT10LmFpRGlzcGxheU1hc3RlcixwPWUuc2VhcmNoLHY9ZS5vcmRlcixtPWUucGFnZTtpZihfZSh0KT09InNzcCIpcmV0dXJuIHA9PT0icmVtb3ZlZCI/W106ZXIoMCx1Lmxlbmd0aCk7aWYobT09ImN1cnJlbnQiKWZvcihyPXQuX2lEaXNwbGF5U3RhcnQsbj10LmZuRGlzcGxheUVuZCgpO3I8bjtyKyspYS5wdXNoKGxbcl0pO2Vsc2UgaWYodj09ImN1cnJlbnQifHx2PT0iYXBwbGllZCIpe2lmKHA9PSJub25lIilhPXUuc2xpY2UoKTtlbHNlIGlmKHA9PSJhcHBsaWVkIilhPWwuc2xpY2UoKTtlbHNlIGlmKHA9PSJyZW1vdmVkIil7dmFyIGc9e307Zm9yKHI9MCxuPWwubGVuZ3RoO3I8bjtyKyspZ1tsW3JdXT1udWxsO3UuZm9yRWFjaChmdW5jdGlvbih3KXtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZyx3KXx8YS5wdXNoKHcpfSl9fWVsc2UgaWYodj09ImluZGV4Inx8dj09Im9yaWdpbmFsIilmb3Iocj0wLG49dC5hb0RhdGEubGVuZ3RoO3I8bjtyKyspdC5hb0RhdGFbcl0mJihwPT0ibm9uZSI/YS5wdXNoKHIpOihzPWwuaW5kZXhPZihyKSwocz09PS0xJiZwPT0icmVtb3ZlZCJ8fHM+PTAmJnA9PSJhcHBsaWVkIikmJmEucHVzaChyKSkpO2Vsc2UgaWYodHlwZW9mIHY9PSJudW1iZXIiKXt2YXIgVD1TaSh0LHYsImFzYyIpO2lmKHA9PT0ibm9uZSIpYT1UO2Vsc2UgZm9yKHI9MDtyPFQubGVuZ3RoO3IrKylzPWwuaW5kZXhPZihUW3JdKSwocz09PS0xJiZwPT0icmVtb3ZlZCJ8fHM+PTAmJnA9PSJhcHBsaWVkIikmJmEucHVzaChUW3JdKX1yZXR1cm4gYX0scGw9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLHM9ZnVuY3Rpb24odSl7dmFyIHA9amEodSksdj10LmFvRGF0YTtpZihwIT09bnVsbCYmIXIpcmV0dXJuW3BdO2lmKG58fChuPVBuKHQscikpLHAhPT1udWxsJiZuLmluZGV4T2YocCkhPT0tMSlyZXR1cm5bcF07aWYodT09bnVsbHx8dT09PSIiKXJldHVybiBuO2lmKHR5cGVvZiB1PT0iZnVuY3Rpb24iKXJldHVybiBuLm1hcChmdW5jdGlvbihQKXt2YXIgRj12W1BdO3JldHVybiB1KFAsRi5fYURhdGEsRi5uVHIpP1A6bnVsbH0pO2lmKHUubm9kZU5hbWUpe3ZhciBtPXUuX0RUX1Jvd0luZGV4LGc9dS5fRFRfQ2VsbEluZGV4O2lmKG0hPT12b2lkIDApcmV0dXJuIHZbbV0mJnZbbV0ublRyPT09dT9bbV06W107aWYoZylyZXR1cm4gdltnLnJvd10mJnZbZy5yb3ddLm5Ucj09PXUucGFyZW50Tm9kZT9bZy5yb3ddOltdO3ZhciBUPVcodSkuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKTtyZXR1cm4gVC5sZW5ndGg/W1QuZGF0YSgiZHQtcm93IildOltdfWlmKHR5cGVvZiB1PT0ic3RyaW5nIiYmdS5jaGFyQXQoMCk9PT0iIyIpe3ZhciB3PXQuYUlkc1t1LnJlcGxhY2UoL14jLywiIildO2lmKHchPT12b2lkIDApcmV0dXJuW3cuaWR4XX12YXIgaz1IYShYcih0LmFvRGF0YSxuLCJuVHIiKSk7cmV0dXJuIFcoaykuZmlsdGVyKHUpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLl9EVF9Sb3dJbmRleH0pLnRvQXJyYXkoKX0sYT1JaSgicm93IixlLHMsdCxyKTtpZihyLm9yZGVyPT09ImN1cnJlbnQifHxyLm9yZGVyPT09ImFwcGxpZWQiKXt2YXIgbD10LmFpRGlzcGxheU1hc3RlcjthLnNvcnQoZnVuY3Rpb24odSxwKXtyZXR1cm4gbC5pbmRleE9mKHUpLWwuaW5kZXhPZihwKX0pfXJldHVybiBhfTtJdCgicm93cygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpXLmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1QaShlKTt2YXIgcj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7cmV0dXJuIHBsKG4sdCxlKX0sMSk7cmV0dXJuIHIuc2VsZWN0b3Iucm93cz10LHIuc2VsZWN0b3Iub3B0cz1lLHJ9KTtJdCgicm93cygpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0RhdGFbZV0ublRyfHx2b2lkIDB9LDEpfSk7SXQoInJvd3MoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInJvd3MiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhyKHQuYW9EYXRhLGUsIl9hRGF0YSIpfSwxKX0pO0p0KCJyb3dzKCkuY2FjaGUoKSIsInJvdygpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUscil7dmFyIG49ZS5hb0RhdGFbcl07cmV0dXJuIHQ9PT0ic2VhcmNoIj9uLl9hRmlsdGVyRGF0YTpuLl9hU29ydERhdGF9LDEpfSk7SnQoInJvd3MoKS5pbnZhbGlkYXRlKCkiLCJyb3coKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUscil7U24oZSxyLHQpfSl9KTtKdCgicm93cygpLmluZGV4ZXMoKSIsInJvdygpLmluZGV4KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0sMSl9KTtKdCgicm93cygpLmlkcygpIiwicm93KCkuaWQoKSIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9dGhpcy5jb250ZXh0LG49MCxzPXIubGVuZ3RoO248cztuKyspZm9yKHZhciBhPTAsbD10aGlzW25dLmxlbmd0aDthPGw7YSsrKXt2YXIgdT1yW25dLnJvd0lkRm4ocltuXS5hb0RhdGFbdGhpc1tuXVthXV0uX2FEYXRhKTtlLnB1c2goKHQ9PT0hMD8iIyI6IiIpK3UpfXJldHVybiBuZXcgV3QocixlKX0pO0p0KCJyb3dzKCkucmVtb3ZlKCkiLCJyb3coKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbih0LGUpe3ZhciByPXQuYW9EYXRhLG49cltlXSxzPXQuYWlEaXNwbGF5TWFzdGVyLmluZGV4T2YoZSk7cyE9PS0xJiZ0LmFpRGlzcGxheU1hc3Rlci5zcGxpY2UocywxKSxzPXQuYWlEaXNwbGF5LmluZGV4T2YoZSkscyE9PS0xJiZ0LmFpRGlzcGxheS5zcGxpY2UocywxKSx0Ll9pUmVjb3Jkc0Rpc3BsYXk+MCYmdC5faVJlY29yZHNEaXNwbGF5LS0saXModCk7dmFyIGE9dC5yb3dJZEZuKG4uX2FEYXRhKTthIT09dm9pZCAwJiZkZWxldGUgdC5hSWRzW2FdLHJbZV09bnVsbH0pLHRoaXN9KTtJdCgicm93cy5hZGQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4pe3ZhciBzLGEsbCx1PVtdO2ZvcihhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXM9dFthXSxzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP3UucHVzaCh4aShuLHMpWzBdKTp1LnB1c2gocHIobixzKSk7cmV0dXJuIHV9LDEpLHI9dGhpcy5yb3dzKC0xKTtyZXR1cm4gci5wb3AoKSxyLnB1c2guYXBwbHkocixlKSxyfSk7SXQoInJvdygpIixmdW5jdGlvbih0LGUpe3JldHVybiBGaSh0aGlzLnJvd3ModCxlKSl9KTtJdCgicm93KCkuZGF0YSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMClyZXR1cm4gZS5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0aGlzWzBdLmxlbmd0aD9lWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE6dm9pZCAwO3ZhciByPWVbMF0uYW9EYXRhW3RoaXNbMF1dO3JldHVybiByLl9hRGF0YT10LEFycmF5LmlzQXJyYXkodCkmJnIublRyJiZyLm5Uci5pZCYmZnIoZVswXS5yb3dJZCkodCxyLm5Uci5pZCksU24oZVswXSx0aGlzWzBdLCJkYXRhIiksdGhpc30pO0l0KCJyb3coKS5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdGhpcy5sZW5ndGgmJnRoaXNbMF0ubGVuZ3RoJiZ0WzBdLmFvRGF0YVt0aGlzWzBdXS5uVHJ8fG51bGx9KTtJdCgicm93LmFkZCgpIixmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgVyYmdC5sZW5ndGgmJih0PXRbMF0pO3ZhciBlPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09IlRSIj94aShyLHQpWzBdOnByKHIsdCl9KTtyZXR1cm4gdGhpcy5yb3coZVswXSl9KTtXKGRvY3VtZW50KS5vbigicGx1Z2luLWluaXQuZHQiLGZ1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IFd0KGUpO3Iub24oInN0YXRlU2F2ZVBhcmFtcy5EVCIsZnVuY3Rpb24obixzLGEpe2Zvcih2YXIgbD1zLnJvd0lkRm4sdT1zLmFpRGlzcGxheU1hc3RlcixwPVtdLHY9MDt2PHUubGVuZ3RoO3YrKyl7dmFyIG09dVt2XSxnPXMuYW9EYXRhW21dO2cuX2RldGFpbHNTaG93JiZwLnB1c2goIiMiK2woZy5fYURhdGEpKX1hLmNoaWxkUm93cz1wfSksci5vbigic3RhdGVMb2FkZWQuRFQiLGZ1bmN0aW9uKG4scyxhKXtFYShyLGEpfSksRWEocixyLnN0YXRlLmxvYWRlZCgpKX0pO3ZhciBFYT1mdW5jdGlvbih0LGUpe2UmJmUuY2hpbGRSb3dzJiZ0LnJvd3MoZS5jaGlsZFJvd3MubWFwKGZ1bmN0aW9uKHIpe3JldHVybiByLnJlcGxhY2UoLzovZywiXFw6Iil9KSkuZXZlcnkoZnVuY3Rpb24oKXtadCh0LnNldHRpbmdzKClbMF0sbnVsbCwicmVxdWVzdENoaWxkIixbdGhpc10pfSl9LGJsPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPVtdLGE9ZnVuY3Rpb24obCx1KXtpZihBcnJheS5pc0FycmF5KGwpfHxsIGluc3RhbmNlb2YgVyl7Zm9yKHZhciBwPTAsdj1sLmxlbmd0aDtwPHY7cCsrKWEobFtwXSx1KTtyZXR1cm59aWYobC5ub2RlTmFtZSYmbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIilsLnNldEF0dHJpYnV0ZSgiZGF0YS1kdC1yb3ciLGUuaWR4KSxzLnB1c2gobCk7ZWxzZXt2YXIgbT1XKCI8dHI+PHRkPjwvdGQ+PC90cj4iKS5hdHRyKCJkYXRhLWR0LXJvdyIsZS5pZHgpLmFkZENsYXNzKHUpO1coInRkIixtKS5hZGRDbGFzcyh1KS5odG1sKGwpWzBdLmNvbFNwYW49a24odCkscy5wdXNoKG1bMF0pfX07YShyLG4pLGUuX2RldGFpbHMmJmUuX2RldGFpbHMuZGV0YWNoKCksZS5fZGV0YWlscz1XKHMpLGUuX2RldGFpbHNTaG93JiZlLl9kZXRhaWxzLmluc2VydEFmdGVyKGUublRyKX0sb3M9YnQudXRpbC50aHJvdHRsZShmdW5jdGlvbih0KXtJbih0WzBdKX0sNTAwKSxCaT1mdW5jdGlvbih0LGUpe3ZhciByPXQuY29udGV4dDtpZihyLmxlbmd0aCl7dmFyIG49clswXS5hb0RhdGFbZSE9PXZvaWQgMD9lOnRbMF1dO24mJm4uX2RldGFpbHMmJihuLl9kZXRhaWxzLnJlbW92ZSgpLG4uX2RldGFpbHNTaG93PXZvaWQgMCxuLl9kZXRhaWxzPXZvaWQgMCxXKG4ublRyKS5yZW1vdmVDbGFzcygiZHQtaGFzQ2hpbGQiKSxvcyhyKSl9fSxscz1mdW5jdGlvbih0LGUpe3ZhciByPXQuY29udGV4dDtpZihyLmxlbmd0aCYmdC5sZW5ndGgpe3ZhciBuPXJbMF0uYW9EYXRhW3RbMF1dO24uX2RldGFpbHMmJihuLl9kZXRhaWxzU2hvdz1lLGU/KG4uX2RldGFpbHMuaW5zZXJ0QWZ0ZXIobi5uVHIpLFcobi5uVHIpLmFkZENsYXNzKCJkdC1oYXNDaGlsZCIpKToobi5fZGV0YWlscy5kZXRhY2goKSxXKG4ublRyKS5yZW1vdmVDbGFzcygiZHQtaGFzQ2hpbGQiKSksWnQoclswXSxudWxsLCJjaGlsZFJvdyIsW2UsdC5yb3codFswXSldKSx2bChyWzBdKSxvcyhyKSl9fSx2bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgV3QodCkscj0iLmR0LkRUX2RldGFpbHMiLG49ImRyYXciK3Iscz0iY29sdW1uLXNpemluZyIrcixhPSJkZXN0cm95IityLGw9dC5hb0RhdGE7ZS5vZmYobisiICIrcysiICIrYSkseGUobCwiX2RldGFpbHMiKS5sZW5ndGg+MCYmKGUub24obixmdW5jdGlvbih1LHApe3Q9PT1wJiZlLnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuZXEoMCkuZWFjaChmdW5jdGlvbih2KXt2YXIgbT1sW3ZdO20uX2RldGFpbHNTaG93JiZtLl9kZXRhaWxzLmluc2VydEFmdGVyKG0ublRyKX0pfSksZS5vbihzLGZ1bmN0aW9uKHUscCl7aWYodD09PXApZm9yKHZhciB2LG09a24ocCksZz0wLFQ9bC5sZW5ndGg7ZzxUO2crKyl2PWxbZ10sdiYmdi5fZGV0YWlscyYmdi5fZGV0YWlscy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHc9Vyh0aGlzKS5jaGlsZHJlbigidGQiKTt3Lmxlbmd0aD09MSYmdy5hdHRyKCJjb2xzcGFuIixtKX0pfSksZS5vbihhLGZ1bmN0aW9uKHUscCl7aWYodD09PXApZm9yKHZhciB2PTAsbT1sLmxlbmd0aDt2PG07disrKWxbdl0mJmxbdl0uX2RldGFpbHMmJkJpKGUsdil9KSl9LG1sPSIiLFpyPW1sKyJyb3coKS5jaGlsZCIsRm49WnIrIigpIjtJdChGbixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9yLmxlbmd0aCYmdGhpcy5sZW5ndGgmJnJbMF0uYW9EYXRhW3RoaXNbMF1dP3JbMF0uYW9EYXRhW3RoaXNbMF1dLl9kZXRhaWxzOnZvaWQgMDoodD09PSEwP3RoaXMuY2hpbGQuc2hvdygpOnQ9PT0hMT9CaSh0aGlzKTpyLmxlbmd0aCYmdGhpcy5sZW5ndGgmJmJsKHJbMF0sclswXS5hb0RhdGFbdGhpc1swXV0sdCxlKSx0aGlzKX0pO0l0KFtacisiLnNob3coKSIsRm4rIi5zaG93KCkiXSxmdW5jdGlvbigpe3JldHVybiBscyh0aGlzLCEwKSx0aGlzfSk7SXQoW1pyKyIuaGlkZSgpIixGbisiLmhpZGUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIGxzKHRoaXMsITEpLHRoaXN9KTtJdChbWnIrIi5yZW1vdmUoKSIsRm4rIi5yZW1vdmUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIEJpKHRoaXMpLHRoaXN9KTtJdChacisiLmlzU2hvd24oKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHQ7cmV0dXJuIHQubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmdFswXS5hb0RhdGFbdGhpc1swXV0uX2RldGFpbHNTaG93fHwhMX0pO3ZhciBnbD0vXihbXjpdKyk6KG5hbWV8dGl0bGV8dmlzSWR4fHZpc2libGUpJC8sTmk9ZnVuY3Rpb24odCxlLHIsbixzLGEpe2Zvcih2YXIgbD1bXSx1PTAscD1zLmxlbmd0aDt1PHA7dSsrKWwucHVzaChOZSh0LHNbdV0sZSxhKSk7cmV0dXJuIGx9LHlsPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LmFvQ29sdW1ucyxzPXhlKG4sInNOYW1lIiksYT14ZShuLCJzVGl0bGUiKSxsPWJ0LnV0aWwuZ2V0KCJbXS5bXS5jZWxsIikodC5hb0hlYWRlciksdT1ocihtaShbXSxsKSkscD1mdW5jdGlvbih2KXt2YXIgbT1qYSh2KTtpZih2PT09IiIpcmV0dXJuIGVyKG4ubGVuZ3RoKTtpZihtIT09bnVsbClyZXR1cm5bbT49MD9tOm4ubGVuZ3RoK21dO2lmKHR5cGVvZiB2PT0iZnVuY3Rpb24iKXt2YXIgZz1Qbih0LHIpO3JldHVybiBuLm1hcChmdW5jdGlvbihoLG8pe3JldHVybiB2KG8sTmkodCxvLDAsMCxnKSk/bzpudWxsfSl9dmFyIFQ9dHlwZW9mIHY9PSJzdHJpbmciP3YubWF0Y2goZ2wpOiIiO2lmKFQpc3dpdGNoKFRbMl0pe2Nhc2UidmlzSWR4IjpjYXNlInZpc2libGUiOnZhciB3PXBhcnNlSW50KFRbMV0sMTApO2lmKHc8MCl7dmFyIGs9bi5tYXAoZnVuY3Rpb24oaCxvKXtyZXR1cm4gaC5iVmlzaWJsZT9vOm51bGx9KTtyZXR1cm5ba1trLmxlbmd0aCt3XV19cmV0dXJuW3FhKHQsdyldO2Nhc2UibmFtZSI6cmV0dXJuIHMubWFwKGZ1bmN0aW9uKGgsbyl7cmV0dXJuIGg9PT1UWzFdP286bnVsbH0pO2Nhc2UidGl0bGUiOnJldHVybiBhLm1hcChmdW5jdGlvbihoLG8pe3JldHVybiBoPT09VFsxXT9vOm51bGx9KTtkZWZhdWx0OnJldHVybltdfWlmKHYubm9kZU5hbWUmJnYuX0RUX0NlbGxJbmRleClyZXR1cm5bdi5fRFRfQ2VsbEluZGV4LmNvbHVtbl07dmFyIFA9Vyh1KS5maWx0ZXIodikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHdpKHRoaXMpfSkudG9BcnJheSgpO2lmKFAubGVuZ3RofHwhdi5ub2RlTmFtZSlyZXR1cm4gUDt2YXIgRj1XKHYpLmNsb3Nlc3QoIipbZGF0YS1kdC1jb2x1bW5dIik7cmV0dXJuIEYubGVuZ3RoP1tGLmRhdGEoImR0LWNvbHVtbiIpXTpbXX07cmV0dXJuIElpKCJjb2x1bW4iLGUscCx0LHIpfSx3bD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5hb0NvbHVtbnMscz1uW2VdLGE9dC5hb0RhdGEsbCx1LHAsdjtpZihyPT09dm9pZCAwKXJldHVybiBzLmJWaXNpYmxlO2lmKHMuYlZpc2libGU9PT1yKXJldHVybiExO2lmKHIpe3ZhciBtPXhlKG4sImJWaXNpYmxlIikuaW5kZXhPZighMCxlKzEpO2Zvcih1PTAscD1hLmxlbmd0aDt1PHA7dSsrKWFbdV0mJih2PWFbdV0ublRyLGw9YVt1XS5hbkNlbGxzLHYmJnYuaW5zZXJ0QmVmb3JlKGxbZV0sbFttXXx8bnVsbCkpfWVsc2UgVyh4ZSh0LmFvRGF0YSwiYW5DZWxscyIsZSkpLmRldGFjaCgpO3JldHVybiBzLmJWaXNpYmxlPXIsZXModCksITB9O0l0KCJjb2x1bW5zKCkiLGZ1bmN0aW9uKHQsZSl7dD09PXZvaWQgMD90PSIiOlcuaXNQbGFpbk9iamVjdCh0KSYmKGU9dCx0PSIiKSxlPVBpKGUpO3ZhciByPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXtyZXR1cm4geWwobix0LGUpfSwxKTtyZXR1cm4gci5zZWxlY3Rvci5jb2xzPXQsci5zZWxlY3Rvci5vcHRzPWUscn0pO0p0KCJjb2x1bW5zKCkuaGVhZGVyKCkiLCJjb2x1bW4oKS5oZWFkZXIoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmFvSGVhZGVyLHM9dCE9PXZvaWQgMD90OmUuYlNvcnRDZWxsc1RvcD8wOm4ubGVuZ3RoLTE7cmV0dXJuIG5bc11bcl0uY2VsbH0sMSl9KTtKdCgiY29sdW1ucygpLmZvb3RlcigpIiwiY29sdW1uKCkuZm9vdGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUscil7dmFyIG49ZS5hb0Zvb3RlcjtyZXR1cm4gbi5sZW5ndGg/ZS5hb0Zvb3Rlclt0IT09dm9pZCAwP3Q6MF1bcl0uY2VsbDpudWxsfSwxKX0pO0p0KCJjb2x1bW5zKCkuZGF0YSgpIiwiY29sdW1uKCkuZGF0YSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsTmksMSl9KTtKdCgiY29sdW1ucygpLnJlbmRlcigpIiwiY29sdW1uKCkucmVuZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxyLG4scyxhKXtyZXR1cm4gTmkoZSxyLG4scyxhLHQpfSwxKX0pO0p0KCJjb2x1bW5zKCkuZGF0YVNyYygpIiwiY29sdW1uKCkuZGF0YVNyYygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdLm1EYXRhfSwxKX0pO0p0KCJjb2x1bW5zKCkuY2FjaGUoKSIsImNvbHVtbigpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxyLG4scyxhKXtyZXR1cm4gWHIoZS5hb0RhdGEsYSx0PT09InNlYXJjaCI/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiLHIpfSwxKX0pO0p0KCJjb2x1bW5zKCkuaW5pdCgpIiwiY29sdW1uKCkuaW5pdCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdfSwxKX0pO0p0KCJjb2x1bW5zKCkubm9kZXMoKSIsImNvbHVtbigpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbih0LGUscixuLHMpe3JldHVybiBYcih0LmFvRGF0YSxzLCJhbkNlbGxzIixlKX0sMSl9KTtKdCgiY29sdW1ucygpLnRpdGxlcygpIiwiY29sdW1uKCkudGl0bGUoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihyLG4pe3R5cGVvZiB0PT0ibnVtYmVyIiYmKGU9dCx0PXZvaWQgMCk7dmFyIHM9Vygic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLHRoaXMuY29sdW1uKG4pLmhlYWRlcihlKSk7cmV0dXJuIHQhPT12b2lkIDA/KHMuaHRtbCh0KSx0aGlzKTpzLmh0bWwoKX0sMSl9KTtKdCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXt2YXIgcj10LmFvQ29sdW1uc1tlXS5zVHlwZTtyZXR1cm4gcnx8eWkodCkscn0sMSl9KTtKdCgiY29sdW1ucygpLnZpc2libGUoKSIsImNvbHVtbigpLnZpc2libGUoKSIsZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49W10scz10aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGEsbCl7aWYodD09PXZvaWQgMClyZXR1cm4gYS5hb0NvbHVtbnNbbF0uYlZpc2libGU7d2woYSxsLHQpJiZuLnB1c2gobCl9KTtyZXR1cm4gdCE9PXZvaWQgMCYmdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEpe3luKGEsYS5hb0hlYWRlcikseW4oYSxhLmFvRm9vdGVyKSxhLmFpRGlzcGxheS5sZW5ndGh8fFcoYS5uVEJvZHkpLmZpbmQoInRkW2NvbHNwYW5dIikuYXR0cigiY29sc3BhbiIsa24oYSkpLEluKGEpLHIuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24obCx1KXtuLmluY2x1ZGVzKHUpJiZadChsLG51bGwsImNvbHVtbi12aXNpYmlsaXR5IixbbCx1LHQsZV0pfSksbi5sZW5ndGgmJihlPT09dm9pZCAwfHxlKSYmci5jb2x1bW5zLmFkanVzdCgpfSksc30pO0p0KCJjb2x1bW5zKCkud2lkdGhzKCkiLCJjb2x1bW4oKS53aWR0aCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29sdW1ucygiOnZpc2libGUiKS5jb3VudCgpLGU9VygiPHRyPiIpLmh0bWwoIjx0ZD4iK0FycmF5KHQpLmpvaW4oIjwvdGQ+PHRkPiIpKyI8L3RkPiIpO1codGhpcy50YWJsZSgpLmJvZHkoKSkuYXBwZW5kKGUpO3ZhciByPWUuY2hpbGRyZW4oKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gVyh0aGlzKS5vdXRlcldpZHRoKCl9KTtyZXR1cm4gZS5yZW1vdmUoKSx0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKG4scyl7dmFyIGE9JHIobixzKTtyZXR1cm4gYSE9PW51bGw/clthXTowfSwxKX0pO0p0KCJjb2x1bW5zKCkuaW5kZXhlcygpIiwiY29sdW1uKCkuaW5kZXgoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxyKXtyZXR1cm4gdD09PSJ2aXNpYmxlIj8kcihlLHIpOnJ9LDEpfSk7SXQoImNvbHVtbnMuYWRqdXN0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtUbih0KX0sMSl9KTtJdCgiY29sdW1uLmluZGV4KCkiLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy5jb250ZXh0Lmxlbmd0aCE9PTApe3ZhciByPXRoaXMuY29udGV4dFswXTtpZih0PT09ImZyb21WaXNpYmxlInx8dD09PSJ0b0RhdGEiKXJldHVybiBxYShyLGUpO2lmKHQ9PT0iZnJvbURhdGEifHx0PT09InRvVmlzaWJsZSIpcmV0dXJuICRyKHIsZSl9fSk7SXQoImNvbHVtbigpIixmdW5jdGlvbih0LGUpe3JldHVybiBGaSh0aGlzLmNvbHVtbnModCxlKSl9KTt2YXIgeGw9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuYW9EYXRhLHM9UG4odCxyKSxhPUhhKFhyKG4scywiYW5DZWxscyIpKSxsPVcobWkoW10sYSkpLHUscD10LmFvQ29sdW1ucy5sZW5ndGgsdixtLGcsVCx3LGssUD1mdW5jdGlvbihGKXt2YXIgaD10eXBlb2YgRj09ImZ1bmN0aW9uIjtpZihGPT1udWxsfHxoKXtmb3Iodj1bXSxtPTAsZz1zLmxlbmd0aDttPGc7bSsrKWZvcih1PXNbbV0sVD0wO1Q8cDtUKyspdz17cm93OnUsY29sdW1uOlR9LGg/KGs9blt1XSxGKHcsTmUodCx1LFQpLGsuYW5DZWxscz9rLmFuQ2VsbHNbVF06bnVsbCkmJnYucHVzaCh3KSk6di5wdXNoKHcpO3JldHVybiB2fWlmKFcuaXNQbGFpbk9iamVjdChGKSlyZXR1cm4gRi5jb2x1bW4hPT12b2lkIDAmJkYucm93IT09dm9pZCAwJiZzLmluZGV4T2YoRi5yb3cpIT09LTE/W0ZdOltdO3ZhciBvPWwuZmlsdGVyKEYpLm1hcChmdW5jdGlvbihmLEMpe3JldHVybntyb3c6Qy5fRFRfQ2VsbEluZGV4LnJvdyxjb2x1bW46Qy5fRFRfQ2VsbEluZGV4LmNvbHVtbn19KS50b0FycmF5KCk7cmV0dXJuIG8ubGVuZ3RofHwhRi5ub2RlTmFtZT9vOihrPVcoRikuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKSxrLmxlbmd0aD9be3JvdzprLmRhdGEoImR0LXJvdyIpLGNvbHVtbjprLmRhdGEoImR0LWNvbHVtbiIpfV06W10pfTtyZXR1cm4gSWkoImNlbGwiLGUsUCx0LHIpfTtJdCgiY2VsbHMoKSIsZnVuY3Rpb24odCxlLHIpe2lmKFcuaXNQbGFpbk9iamVjdCh0KSYmKHQucm93PT09dm9pZCAwPyhyPXQsdD1udWxsKToocj1lLGU9bnVsbCkpLFcuaXNQbGFpbk9iamVjdChlKSYmKHI9ZSxlPW51bGwpLGU9PW51bGwpcmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihUKXtyZXR1cm4geGwoVCx0LFBpKHIpKX0pO3ZhciBuPXI/e3BhZ2U6ci5wYWdlLG9yZGVyOnIub3JkZXIsc2VhcmNoOnIuc2VhcmNofTp7fSxzPXRoaXMuY29sdW1ucyhlLG4pLGE9dGhpcy5yb3dzKHQsbiksbCx1LHAsdixtPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihULHcpe3ZhciBrPVtdO2ZvcihsPTAsdT1hW3ddLmxlbmd0aDtsPHU7bCsrKWZvcihwPTAsdj1zW3ddLmxlbmd0aDtwPHY7cCsrKWsucHVzaCh7cm93OmFbd11bbF0sY29sdW1uOnNbd11bcF19KTtyZXR1cm4ga30sMSksZz1yJiZyLnNlbGVjdGVkP3RoaXMuY2VsbHMobSxyKTptO3JldHVybiBXLmV4dGVuZChnLnNlbGVjdG9yLHtjb2xzOmUscm93czp0LG9wdHM6cn0pLGd9KTtKdCgiY2VsbHMoKS5ub2RlcygpIiwiY2VsbCgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuYW9EYXRhW2VdO3JldHVybiBuJiZuLmFuQ2VsbHM/bi5hbkNlbGxzW3JdOnZvaWQgMH0sMSl9KTtJdCgiY2VsbHMoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gTmUodCxlLHIpfSwxKX0pO0p0KCJjZWxscygpLmNhY2hlKCkiLCJjZWxsKCkuY2FjaGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9dD09PSJzZWFyY2giPyJfYUZpbHRlckRhdGEiOiJfYVNvcnREYXRhIix0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuYW9EYXRhW3JdW3RdW25dfSwxKX0pO0p0KCJjZWxscygpLnJlbmRlcigpIiwiY2VsbCgpLnJlbmRlcigpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxyLG4pe3JldHVybiBOZShlLHIsbix0KX0sMSl9KTtKdCgiY2VsbHMoKS5pbmRleGVzKCkiLCJjZWxsKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLHIpe3JldHVybntyb3c6ZSxjb2x1bW46cixjb2x1bW5WaXNpYmxlOiRyKHQscil9fSwxKX0pO0p0KCJjZWxscygpLmludmFsaWRhdGUoKSIsImNlbGwoKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLHIsbil7U24oZSxyLHQsbil9KX0pO0l0KCJjZWxsKCkiLGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gRmkodGhpcy5jZWxscyh0LGUscikpfSk7SXQoImNlbGwoKS5kYXRhKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dCxyPXRoaXNbMF07cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGgmJnIubGVuZ3RoP05lKGVbMF0sclswXS5yb3csclswXS5jb2x1bW4pOnZvaWQgMDooR28oZVswXSxyWzBdLnJvdyxyWzBdLmNvbHVtbix0KSxTbihlWzBdLHJbMF0ucm93LCJkYXRhIixyWzBdLmNvbHVtbiksdGhpcyl9KTtJdCgib3JkZXIoKSIsZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmNvbnRleHQsbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0PT09dm9pZCAwP3IubGVuZ3RoIT09MD9yWzBdLmFhU29ydGluZzp2b2lkIDA6KHR5cGVvZiB0PT0ibnVtYmVyIj90PVtbdCxlXV06bi5sZW5ndGg+MSYmKHQ9biksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3MuYWFTb3J0aW5nPUFycmF5LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9KSl9KTtJdCgib3JkZXIubGlzdGVuZXIoKSIsZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7cnMobix0LHt9LGUscil9KX0pO0l0KCJvcmRlci5maXhlZCgpIixmdW5jdGlvbih0KXtpZighdCl7dmFyIGU9dGhpcy5jb250ZXh0LHI9ZS5sZW5ndGg/ZVswXS5hYVNvcnRpbmdGaXhlZDp2b2lkIDA7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/e3ByZTpyfTpyfXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7bi5hYVNvcnRpbmdGaXhlZD1XLmV4dGVuZCghMCx7fSx0KX0pfSk7SXQoWyJjb2x1bW5zKCkub3JkZXIoKSIsImNvbHVtbigpLm9yZGVyKCkiXSxmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0P3RoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyLG4pe3IuYWFTb3J0aW5nPWVbbl0ubWFwKGZ1bmN0aW9uKHMpe3JldHVybltzLHRdfSl9KTp0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIsbil7Zm9yKHZhciBzPUFuKHIpLGE9MCxsPXMubGVuZ3RoO2E8bDthKyspaWYoc1thXS5jb2w9PT1uKXJldHVybiBzW2FdLmRpcjtyZXR1cm4gbnVsbH0sMSl9KTtKdCgiY29sdW1ucygpLm9yZGVyYWJsZSgpIiwiY29sdW1uKCkub3JkZXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUscil7dmFyIG49ZS5hb0NvbHVtbnNbcl07cmV0dXJuIHQ/bi5hc1NvcnRpbmc6bi5iU29ydGFibGV9LDEpfSk7SXQoInByb2Nlc3NpbmcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtCZShlLHQpfSl9KTtJdCgic2VhcmNoKCkiLGZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9zLmxlbmd0aCE9PTA/c1swXS5vUHJldmlvdXNTZWFyY2guc2VhcmNoOnZvaWQgMDp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYSl7YS5vRmVhdHVyZXMuYkZpbHRlciYmKHR5cGVvZiBlPT0ib2JqZWN0Ij9HcihhLFcuZXh0ZW5kKGEub1ByZXZpb3VzU2VhcmNoLGUse3NlYXJjaDp0fSkpOkdyKGEsVy5leHRlbmQoYS5vUHJldmlvdXNTZWFyY2gse3NlYXJjaDp0LHJlZ2V4OmU9PT1udWxsPyExOmUsc21hcnQ6cj09PW51bGw/ITA6cixjYXNlSW5zZW5zaXRpdmU6bj09PW51bGw/ITA6bn0pKSl9KX0pO0l0KCJzZWFyY2guZml4ZWQoKSIsZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLml0ZXJhdG9yKCEwLCJ0YWJsZSIsZnVuY3Rpb24obil7dmFyIHM9bi5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBzW3RdO2U9PT1udWxsP2RlbGV0ZSBzW3RdOnNbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhzKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP3JbMF06cn0pO0p0KCJjb2x1bW5zKCkuc2VhcmNoKCkiLCJjb2x1bW4oKS5zZWFyY2goKSIsZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocyxhKXt2YXIgbD1zLmFvUHJlU2VhcmNoQ29scztpZih0PT09dm9pZCAwKXJldHVybiBsW2FdLnNlYXJjaDtzLm9GZWF0dXJlcy5iRmlsdGVyJiYodHlwZW9mIGU9PSJvYmplY3QiP1cuZXh0ZW5kKGxbYV0sZSx7c2VhcmNoOnR9KTpXLmV4dGVuZChsW2FdLHtzZWFyY2g6dCxyZWdleDplPT09bnVsbD8hMTplLHNtYXJ0OnI9PT1udWxsPyEwOnIsY2FzZUluc2Vuc2l0aXZlOm49PT1udWxsPyEwOm59KSxHcihzLHMub1ByZXZpb3VzU2VhcmNoKSl9KX0pO0l0KFsiY29sdW1ucygpLnNlYXJjaC5maXhlZCgpIiwiY29sdW1uKCkuc2VhcmNoLmZpeGVkKCkiXSxmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaXRlcmF0b3IoITAsImNvbHVtbiIsZnVuY3Rpb24obixzKXt2YXIgYT1uLmFvQ29sdW1uc1tzXS5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBhW3RdO2U9PT1udWxsP2RlbGV0ZSBhW3RdOmFbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhhKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP3JbMF06cn0pO0l0KCJzdGF0ZSgpIixmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoP3RoaXMuY29udGV4dFswXS5vU2F2ZWRTdGF0ZTpudWxsO3ZhciByPVcuZXh0ZW5kKCEwLHt9LHQpO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7ZSE9PSExJiYoci50aW1lPStuZXcgRGF0ZSsxMDApLGhpKG4scixmdW5jdGlvbigpe30pfSl9KTtJdCgic3RhdGUuY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3QuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQse30pfSl9KTtJdCgic3RhdGUubG9hZGVkKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLm9Mb2FkZWRTdGF0ZTpudWxsfSk7SXQoInN0YXRlLnNhdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe0luKHQpfSl9KTtidC51c2U9ZnVuY3Rpb24odCxlKXtlPT09ImxpYiJ8fHQuZm4/Vz10OmU9PSJ3aW4ifHx0LmRvY3VtZW50Pyh3aW5kb3c9dCxkb2N1bWVudD10LmRvY3VtZW50KTooZT09PSJkYXRldGltZSJ8fHQudHlwZT09PSJEYXRlVGltZSIpJiYoYnQuRGF0ZVRpbWU9dCl9O2J0LmZhY3Rvcnk9ZnVuY3Rpb24odCxlKXt2YXIgcj0hMTtyZXR1cm4gdCYmdC5kb2N1bWVudCYmKHdpbmRvdz10LGRvY3VtZW50PXQuZG9jdW1lbnQpLGUmJmUuZm4mJmUuZm4uanF1ZXJ5JiYoVz1lLHI9ITApLHJ9O2J0LnZlcnNpb25DaGVjaz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lP2Uuc3BsaXQoIi4iKTpidC52ZXJzaW9uLnNwbGl0KCIuIiksbj10LnNwbGl0KCIuIikscyxhLGw9MCx1PW4ubGVuZ3RoO2w8dTtsKyspaWYocz1wYXJzZUludChyW2xdLDEwKXx8MCxhPXBhcnNlSW50KG5bbF0sMTApfHwwLHMhPT1hKXJldHVybiBzPmE7cmV0dXJuITB9O2J0LmlzRGF0YVRhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPVcodCkuZ2V0KDApLHI9ITE7cmV0dXJuIHQgaW5zdGFuY2VvZiBidC5BcGk/ITA6KFcuZWFjaChidC5zZXR0aW5ncyxmdW5jdGlvbihuLHMpe3ZhciBhPXMublNjcm9sbEhlYWQ/VygidGFibGUiLHMublNjcm9sbEhlYWQpWzBdOm51bGwsbD1zLm5TY3JvbGxGb290P1coInRhYmxlIixzLm5TY3JvbGxGb290KVswXTpudWxsOyhzLm5UYWJsZT09PWV8fGE9PT1lfHxsPT09ZSkmJihyPSEwKX0pLHIpfTtidC50YWJsZXM9ZnVuY3Rpb24odCl7dmFyIGU9ITE7Vy5pc1BsYWluT2JqZWN0KHQpJiYoZT10LmFwaSx0PXQudmlzaWJsZSk7dmFyIHI9YnQuc2V0dGluZ3MuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhKCF0fHx0JiZXKG4ublRhYmxlKS5pcygiOnZpc2libGUiKSl9KS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ublRhYmxlfSk7cmV0dXJuIGU/bmV3IFd0KHIpOnJ9O2J0LmNhbWVsVG9IdW5nYXJpYW49cnI7SXQoIiQoKSIsZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnJvd3MoZSkubm9kZXMoKSxuPVcocik7cmV0dXJuIFcoW10uY29uY2F0KG4uZmlsdGVyKHQpLnRvQXJyYXkoKSxuLmZpbmQodCkudG9BcnJheSgpKSl9KTtXLmVhY2goWyJvbiIsIm9uZSIsIm9mZiJdLGZ1bmN0aW9uKHQsZSl7SXQoZSsiKCkiLGZ1bmN0aW9uKCl7dmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyWzBdPXJbMF0uc3BsaXQoL1xzLykubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLm1hdGNoKC9cLmR0XGIvKT9zOnMrIi5kdCJ9KS5qb2luKCIgIik7dmFyIG49Vyh0aGlzLnRhYmxlcygpLm5vZGVzKCkpO3JldHVybiBuW2VdLmFwcGx5KG4sciksdGhpc30pfSk7SXQoImNsZWFyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtfaSh0KX0pfSk7SXQoImVycm9yKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7RmUoZSwwLHQpfSl9KTtJdCgic2V0dGluZ3MoKSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFd0KHRoaXMuY29udGV4dCx0aGlzLmNvbnRleHQpfSk7SXQoImluaXQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHQ7cmV0dXJuIHQubGVuZ3RoP3RbMF0ub0luaXQ6bnVsbH0pO0l0KCJkYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtyZXR1cm4geGUodC5hb0RhdGEsIl9hRGF0YSIpfSkuZmxhdHRlbigpfSk7SXQoInRyaWdnZXIoKSIsZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7cmV0dXJuIFp0KG4sbnVsbCx0LGUscil9KS5mbGF0dGVuKCl9KTtJdCgicmVhZHkoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiB0P3RoaXMudGFibGVzKCkuZXZlcnkoZnVuY3Rpb24oKXt0aGlzLmNvbnRleHRbMF0uX2JJbml0Q29tcGxldGU/dC5jYWxsKHRoaXMpOnRoaXMub24oImluaXQiLGZ1bmN0aW9uKCl7dC5jYWxsKHRoaXMpfSl9KTplLmxlbmd0aD9lWzBdLl9iSW5pdENvbXBsZXRlfHwhMTpudWxsfSk7SXQoImRlc3Ryb3koKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9dHx8ITEsdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3ZhciByPWUub0NsYXNzZXMsbj1lLm5UYWJsZSxzPWUublRCb2R5LGE9ZS5uVEhlYWQsbD1lLm5URm9vdCx1PVcobikscD1XKHMpLHY9VyhlLm5UYWJsZVdyYXBwZXIpLG09ZS5hb0RhdGEubWFwKGZ1bmN0aW9uKEYpe3JldHVybiBGP0YublRyOm51bGx9KSxnPXIub3JkZXI7ZS5iRGVzdHJveWluZz0hMCxadChlLCJhb0Rlc3Ryb3lDYWxsYmFjayIsImRlc3Ryb3kiLFtlXSwhMCksdHx8bmV3IFd0KGUpLmNvbHVtbnMoKS52aXNpYmxlKCEwKSx2Lm9mZigiLkRUIikuZmluZCgiOm5vdCh0Ym9keSAqKSIpLm9mZigiLkRUIiksVyh3aW5kb3cpLm9mZigiLkRULSIrZS5zSW5zdGFuY2UpLG4hPWEucGFyZW50Tm9kZSYmKHUuY2hpbGRyZW4oInRoZWFkIikuZGV0YWNoKCksdS5hcHBlbmQoYSkpLGwmJm4hPWwucGFyZW50Tm9kZSYmKHUuY2hpbGRyZW4oInRmb290IikuZGV0YWNoKCksdS5hcHBlbmQobCkpLGUuY29sZ3JvdXAucmVtb3ZlKCksZS5hYVNvcnRpbmc9W10sZS5hYVNvcnRpbmdGaXhlZD1bXSxmaShlKSxXKCJ0aCwgdGQiLGEpLnJlbW92ZUNsYXNzKGcuY2FuQXNjKyIgIitnLmNhbkRlc2MrIiAiK2cuaXNBc2MrIiAiK2cuaXNEZXNjKS5jc3MoIndpZHRoIiwiIikscC5jaGlsZHJlbigpLmRldGFjaCgpLHAuYXBwZW5kKG0pO3ZhciBUPWUublRhYmxlV3JhcHBlci5wYXJlbnROb2RlLHc9ZS5uVGFibGVXcmFwcGVyLm5leHRTaWJsaW5nLGs9dD8icmVtb3ZlIjoiZGV0YWNoIjt1W2tdKCksdltrXSgpLCF0JiZUJiYoVC5pbnNlcnRCZWZvcmUobix3KSx1LmNzcygid2lkdGgiLGUuc0Rlc3Ryb3lXaWR0aCkucmVtb3ZlQ2xhc3Moci50YWJsZSkpO3ZhciBQPWJ0LnNldHRpbmdzLmluZGV4T2YoZSk7UCE9PS0xJiZidC5zZXR0aW5ncy5zcGxpY2UoUCwxKX0pfSk7Vy5lYWNoKFsiY29sdW1uIiwicm93IiwiY2VsbCJdLGZ1bmN0aW9uKHQsZSl7SXQoZSsicygpLmV2ZXJ5KCkiLGZ1bmN0aW9uKHIpe3ZhciBuPXRoaXMuc2VsZWN0b3Iub3B0cyxzPXRoaXMsYSxsPTA7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImV2ZXJ5IixmdW5jdGlvbih1LHAsdil7YT1zW2VdKHAsbiksZT09PSJjZWxsIj9yLmNhbGwoYSxhWzBdWzBdLnJvdyxhWzBdWzBdLmNvbHVtbix2LGwpOnIuY2FsbChhLHAsdixsKSxsKyt9KX0pfSk7SXQoImkxOG4oKSIsZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuY29udGV4dFswXSxzPUlyKHQpKG4ub0xhbmd1YWdlKTtyZXR1cm4gcz09PXZvaWQgMCYmKHM9ZSksVy5pc1BsYWluT2JqZWN0KHMpJiYocz1yIT09dm9pZCAwJiZzW3JdIT09dm9pZCAwP3Nbcl06cy5fKSx0eXBlb2Ygcz09InN0cmluZyI/cy5yZXBsYWNlKCIlZCIscik6c30pO2J0LnZlcnNpb249IjIuMC4yIjtidC5zZXR0aW5ncz1bXTtidC5tb2RlbHM9e307YnQubW9kZWxzLm9TZWFyY2g9e2Nhc2VJbnNlbnNpdGl2ZTohMCxzZWFyY2g6IiIscmVnZXg6ITEsc21hcnQ6ITAscmV0dXJuOiExfTtidC5tb2RlbHMub1Jvdz17blRyOm51bGwsYW5DZWxsczpudWxsLF9hRGF0YTpbXSxfYVNvcnREYXRhOm51bGwsX2FGaWx0ZXJEYXRhOm51bGwsX3NGaWx0ZXJSb3c6bnVsbCxzcmM6bnVsbCxpZHg6LTEsZGlzcGxheURhdGE6bnVsbH07YnQubW9kZWxzLm9Db2x1bW49e2lkeDpudWxsLGFEYXRhU29ydDpudWxsLGFzU29ydGluZzpudWxsLGJTZWFyY2hhYmxlOm51bGwsYlNvcnRhYmxlOm51bGwsYlZpc2libGU6bnVsbCxfc01hbnVhbFR5cGU6bnVsbCxfYkF0dHJTcmM6ITEsZm5DcmVhdGVkQ2VsbDpudWxsLGZuR2V0RGF0YTpudWxsLGZuU2V0RGF0YTpudWxsLG1EYXRhOm51bGwsbVJlbmRlcjpudWxsLHNDbGFzczpudWxsLHNDb250ZW50UGFkZGluZzpudWxsLHNEZWZhdWx0Q29udGVudDpudWxsLHNOYW1lOm51bGwsc1NvcnREYXRhVHlwZToic3RkIixzU29ydGluZ0NsYXNzOm51bGwsc1RpdGxlOm51bGwsc1R5cGU6bnVsbCxzV2lkdGg6bnVsbCxzV2lkdGhPcmlnOm51bGwsbWF4TGVuU3RyaW5nOm51bGwsc2VhcmNoRml4ZWQ6bnVsbH07YnQuZGVmYXVsdHM9e2FhRGF0YTpudWxsLGFhU29ydGluZzpbWzAsImFzYyJdXSxhYVNvcnRpbmdGaXhlZDpbXSxhamF4Om51bGwsYUxlbmd0aE1lbnU6WzEwLDI1LDUwLDEwMF0sYW9Db2x1bW5zOm51bGwsYW9Db2x1bW5EZWZzOm51bGwsYW9TZWFyY2hDb2xzOltdLGJBdXRvV2lkdGg6ITAsYkRlZmVyUmVuZGVyOiEwLGJEZXN0cm95OiExLGJGaWx0ZXI6ITAsYkluZm86ITAsYkxlbmd0aENoYW5nZTohMCxiUGFnaW5hdGU6ITAsYlByb2Nlc3Npbmc6ITEsYlJldHJpZXZlOiExLGJTY3JvbGxDb2xsYXBzZTohMSxiU2VydmVyU2lkZTohMSxiU29ydDohMCxiU29ydE11bHRpOiEwLGJTb3J0Q2VsbHNUb3A6bnVsbCxiU29ydENsYXNzZXM6ITAsYlN0YXRlU2F2ZTohMSxmbkNyZWF0ZWRSb3c6bnVsbCxmbkRyYXdDYWxsYmFjazpudWxsLGZuRm9vdGVyQ2FsbGJhY2s6bnVsbCxmbkZvcm1hdE51bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygpLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csdGhpcy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyl9LGZuSGVhZGVyQ2FsbGJhY2s6bnVsbCxmbkluZm9DYWxsYmFjazpudWxsLGZuSW5pdENvbXBsZXRlOm51bGwsZm5QcmVEcmF3Q2FsbGJhY2s6bnVsbCxmblJvd0NhbGxiYWNrOm51bGwsZm5TdGF0ZUxvYWRDYWxsYmFjazpmdW5jdGlvbih0KXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoKHQuaVN0YXRlRHVyYXRpb249PT0tMT9zZXNzaW9uU3RvcmFnZTpsb2NhbFN0b3JhZ2UpLmdldEl0ZW0oIkRhdGFUYWJsZXNfIit0LnNJbnN0YW5jZSsiXyIrbG9jYXRpb24ucGF0aG5hbWUpKX1jYXRjaHtyZXR1cm57fX19LGZuU3RhdGVMb2FkUGFyYW1zOm51bGwsZm5TdGF0ZUxvYWRlZDpudWxsLGZuU3RhdGVTYXZlQ2FsbGJhY2s6ZnVuY3Rpb24odCxlKXt0cnl7KHQuaVN0YXRlRHVyYXRpb249PT0tMT9zZXNzaW9uU3RvcmFnZTpsb2NhbFN0b3JhZ2UpLnNldEl0ZW0oIkRhdGFUYWJsZXNfIit0LnNJbnN0YW5jZSsiXyIrbG9jYXRpb24ucGF0aG5hbWUsSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319LGZuU3RhdGVTYXZlUGFyYW1zOm51bGwsaVN0YXRlRHVyYXRpb246NzIwMCxpRGlzcGxheUxlbmd0aDoxMCxpRGlzcGxheVN0YXJ0OjAsaVRhYkluZGV4OjAsb0NsYXNzZXM6e30sb0xhbmd1YWdlOntvQXJpYTp7b3JkZXJhYmxlOiI6IEFjdGl2YXRlIHRvIHNvcnQiLG9yZGVyYWJsZVJldmVyc2U6IjogQWN0aXZhdGUgdG8gaW52ZXJ0IHNvcnRpbmciLG9yZGVyYWJsZVJlbW92ZToiOiBBY3RpdmF0ZSB0byByZW1vdmUgc29ydGluZyIscGFnaW5hdGU6e2ZpcnN0OiJGaXJzdCIsbGFzdDoiTGFzdCIsbmV4dDoiTmV4dCIscHJldmlvdXM6IlByZXZpb3VzIn19LG9QYWdpbmF0ZTp7c0ZpcnN0OiJceEFCIixzTGFzdDoiXHhCQiIsc05leHQ6Ilx1MjAzQSIsc1ByZXZpb3VzOiJcdTIwMzkifSxlbnRyaWVzOntfOiJlbnRyaWVzIiwxOiJlbnRyeSJ9LHNFbXB0eVRhYmxlOiJObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZSIsc0luZm86IlNob3dpbmcgX1NUQVJUXyB0byBfRU5EXyBvZiBfVE9UQUxfIF9FTlRSSUVTLVRPVEFMXyIsc0luZm9FbXB0eToiU2hvd2luZyAwIHRvIDAgb2YgMCBfRU5UUklFUy1UT1RBTF8iLHNJbmZvRmlsdGVyZWQ6IihmaWx0ZXJlZCBmcm9tIF9NQVhfIHRvdGFsIF9FTlRSSUVTLU1BWF8pIixzSW5mb1Bvc3RGaXg6IiIsc0RlY2ltYWw6IiIsc1Rob3VzYW5kczoiLCIsc0xlbmd0aE1lbnU6Il9NRU5VXyBfRU5UUklFU18gcGVyIHBhZ2UiLHNMb2FkaW5nUmVjb3JkczoiTG9hZGluZy4uLiIsc1Byb2Nlc3Npbmc6IiIsc1NlYXJjaDoiU2VhcmNoOiIsc1NlYXJjaFBsYWNlaG9sZGVyOiIiLHNVcmw6IiIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIn0sb1NlYXJjaDpXLmV4dGVuZCh7fSxidC5tb2RlbHMub1NlYXJjaCksbGF5b3V0Ont0b3BTdGFydDoicGFnZUxlbmd0aCIsdG9wRW5kOiJzZWFyY2giLGJvdHRvbVN0YXJ0OiJpbmZvIixib3R0b21FbmQ6InBhZ2luZyJ9LHNEb206bnVsbCxzZWFyY2hEZWxheTpudWxsLHNQYWdpbmF0aW9uVHlwZToiZnVsbF9udW1iZXJzIixzU2Nyb2xsWDoiIixzU2Nyb2xsWElubmVyOiIiLHNTY3JvbGxZOiIiLHNTZXJ2ZXJNZXRob2Q6IkdFVCIscmVuZGVyZXI6bnVsbCxyb3dJZDoiRFRfUm93SWQiLGNhcHRpb246bnVsbH07Q24oYnQuZGVmYXVsdHMpO2J0LmRlZmF1bHRzLmNvbHVtbj17YURhdGFTb3J0Om51bGwsaURhdGFTb3J0Oi0xLGFyaWFUaXRsZToiIixhc1NvcnRpbmc6WyJhc2MiLCJkZXNjIiwiIl0sYlNlYXJjaGFibGU6ITAsYlNvcnRhYmxlOiEwLGJWaXNpYmxlOiEwLGZuQ3JlYXRlZENlbGw6bnVsbCxtRGF0YTpudWxsLG1SZW5kZXI6bnVsbCxzQ2VsbFR5cGU6InRkIixzQ2xhc3M6IiIsc0NvbnRlbnRQYWRkaW5nOiIiLHNEZWZhdWx0Q29udGVudDpudWxsLHNOYW1lOiIiLHNTb3J0RGF0YVR5cGU6InN0ZCIsc1RpdGxlOm51bGwsc1R5cGU6bnVsbCxzV2lkdGg6bnVsbH07Q24oYnQuZGVmYXVsdHMuY29sdW1uKTtidC5tb2RlbHMub1NldHRpbmdzPXtvRmVhdHVyZXM6e2JBdXRvV2lkdGg6bnVsbCxiRGVmZXJSZW5kZXI6bnVsbCxiRmlsdGVyOm51bGwsYkluZm86ITAsYkxlbmd0aENoYW5nZTohMCxiUGFnaW5hdGU6bnVsbCxiUHJvY2Vzc2luZzpudWxsLGJTZXJ2ZXJTaWRlOm51bGwsYlNvcnQ6bnVsbCxiU29ydE11bHRpOm51bGwsYlNvcnRDbGFzc2VzOm51bGwsYlN0YXRlU2F2ZTpudWxsfSxvU2Nyb2xsOntiQ29sbGFwc2U6bnVsbCxpQmFyV2lkdGg6MCxzWDpudWxsLHNYSW5uZXI6bnVsbCxzWTpudWxsfSxvTGFuZ3VhZ2U6e2ZuSW5mb0NhbGxiYWNrOm51bGx9LG9Ccm93c2VyOntiU2Nyb2xsYmFyTGVmdDohMSxiYXJXaWR0aDowfSxhamF4Om51bGwsYWFuRmVhdHVyZXM6W10sYW9EYXRhOltdLGFpRGlzcGxheTpbXSxhaURpc3BsYXlNYXN0ZXI6W10sYUlkczp7fSxhb0NvbHVtbnM6W10sYW9IZWFkZXI6W10sYW9Gb290ZXI6W10sb1ByZXZpb3VzU2VhcmNoOnt9LHNlYXJjaEZpeGVkOnt9LGFvUHJlU2VhcmNoQ29sczpbXSxhYVNvcnRpbmc6bnVsbCxhYVNvcnRpbmdGaXhlZDpbXSxzRGVzdHJveVdpZHRoOjAsYW9Sb3dDYWxsYmFjazpbXSxhb0hlYWRlckNhbGxiYWNrOltdLGFvRm9vdGVyQ2FsbGJhY2s6W10sYW9EcmF3Q2FsbGJhY2s6W10sYW9Sb3dDcmVhdGVkQ2FsbGJhY2s6W10sYW9QcmVEcmF3Q2FsbGJhY2s6W10sYW9Jbml0Q29tcGxldGU6W10sYW9TdGF0ZVNhdmVQYXJhbXM6W10sYW9TdGF0ZUxvYWRQYXJhbXM6W10sYW9TdGF0ZUxvYWRlZDpbXSxzVGFibGVJZDoiIixuVGFibGU6bnVsbCxuVEhlYWQ6bnVsbCxuVEZvb3Q6bnVsbCxuVEJvZHk6bnVsbCxuVGFibGVXcmFwcGVyOm51bGwsYkluaXRpYWxpc2VkOiExLGFvT3BlblJvd3M6W10sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiJ0d29fYnV0dG9uIixwYWdpbmdDb250cm9sczowLGlTdGF0ZUR1cmF0aW9uOjAsYW9TdGF0ZVNhdmU6W10sYW9TdGF0ZUxvYWQ6W10sb1NhdmVkU3RhdGU6bnVsbCxvTG9hZGVkU3RhdGU6bnVsbCxiQWpheERhdGFHZXQ6ITAsanFYSFI6bnVsbCxqc29uOnZvaWQgMCxvQWpheERhdGE6dm9pZCAwLHNTZXJ2ZXJNZXRob2Q6bnVsbCxmbkZvcm1hdE51bWJlcjpudWxsLGFMZW5ndGhNZW51Om51bGwsaURyYXc6MCxiRHJhd2luZzohMSxpRHJhd0Vycm9yOi0xLF9pRGlzcGxheUxlbmd0aDoxMCxfaURpc3BsYXlTdGFydDowLF9pUmVjb3Jkc1RvdGFsOjAsX2lSZWNvcmRzRGlzcGxheTowLG9DbGFzc2VzOnt9LGJGaWx0ZXJlZDohMSxiU29ydGVkOiExLGJTb3J0Q2VsbHNUb3A6bnVsbCxvSW5pdDpudWxsLGFvRGVzdHJveUNhbGxiYWNrOltdLGZuUmVjb3Jkc1RvdGFsOmZ1bmN0aW9uKCl7cmV0dXJuIF9lKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc1RvdGFsKjE6dGhpcy5haURpc3BsYXlNYXN0ZXIubGVuZ3RofSxmblJlY29yZHNEaXNwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIF9lKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc0Rpc3BsYXkqMTp0aGlzLmFpRGlzcGxheS5sZW5ndGh9LGZuRGlzcGxheUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lEaXNwbGF5TGVuZ3RoLGU9dGhpcy5faURpc3BsYXlTdGFydCxyPWUrdCxuPXRoaXMuYWlEaXNwbGF5Lmxlbmd0aCxzPXRoaXMub0ZlYXR1cmVzLGE9cy5iUGFnaW5hdGU7cmV0dXJuIHMuYlNlcnZlclNpZGU/YT09PSExfHx0PT09LTE/ZStuOk1hdGgubWluKGUrdCx0aGlzLl9pUmVjb3Jkc0Rpc3BsYXkpOiFhfHxyPm58fHQ9PT0tMT9uOnJ9LG9JbnN0YW5jZTpudWxsLHNJbnN0YW5jZTpudWxsLGlUYWJJbmRleDowLG5TY3JvbGxIZWFkOm51bGwsblNjcm9sbEZvb3Q6bnVsbCxhTGFzdFNvcnQ6W10sb1BsdWdpbnM6e30scm93SWRGbjpudWxsLHJvd0lkOm51bGwsY2FwdGlvbjoiIixjYXB0aW9uTm9kZTpudWxsLGNvbGdyb3VwOm51bGx9O2J0LmV4dD1RdD17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6YnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246YnQudmVyc2lvbn07Vy5leHRlbmQoUXQse2FmbkZpbHRlcmluZzpRdC5zZWFyY2gsYVR5cGVzOlF0LnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpRdC50eXBlLnNlYXJjaCxvU29ydDpRdC50eXBlLm9yZGVyLGFmblNvcnREYXRhOlF0Lm9yZGVyLGFvRmVhdHVyZXM6UXQuZmVhdHVyZSxvU3RkQ2xhc3NlczpRdC5jbGFzc2VzLG9QYWdpbmF0aW9uOlF0LnBhZ2VyfSk7Vy5leHRlbmQoYnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxlbmd0aDp7Y29udGFpbmVyOiJkdC1sZW5ndGgiLHNlbGVjdDoiZHQtaW5wdXQifSxvcmRlcjp7Y2FuQXNjOiJkdC1vcmRlcmFibGUtYXNjIixjYW5EZXNjOiJkdC1vcmRlcmFibGUtZGVzYyIsaXNBc2M6ImR0LW9yZGVyaW5nLWFzYyIsaXNEZXNjOiJkdC1vcmRlcmluZy1kZXNjIixub25lOiJkdC1vcmRlcmFibGUtbm9uZSIscG9zaXRpb246InNvcnRpbmdfIn0scHJvY2Vzc2luZzp7Y29udGFpbmVyOiJkdC1wcm9jZXNzaW5nIn0sc2Nyb2xsaW5nOntib2R5OiJkdC1zY3JvbGwtYm9keSIsY29udGFpbmVyOiJkdC1zY3JvbGwiLGZvb3Rlcjp7c2VsZjoiZHQtc2Nyb2xsLWZvb3QiLGlubmVyOiJkdC1zY3JvbGwtZm9vdElubmVyIn0saGVhZGVyOntzZWxmOiJkdC1zY3JvbGwtaGVhZCIsaW5uZXI6ImR0LXNjcm9sbC1oZWFkSW5uZXIifX0sc2VhcmNoOntjb250YWluZXI6ImR0LXNlYXJjaCIsaW5wdXQ6ImR0LWlucHV0In0sdGFibGU6ImRhdGFUYWJsZSIsdGJvZHk6e2NlbGw6IiIscm93OiIifSx0aGVhZDp7Y2VsbDoiIixyb3c6IiJ9LHRmb290OntjZWxsOiIiLHJvdzoiIn0scGFnaW5nOnthY3RpdmU6ImN1cnJlbnQiLGJ1dHRvbjoiZHQtcGFnaW5nLWJ1dHRvbiIsY29udGFpbmVyOiJkdC1wYWdpbmciLGRpc2FibGVkOiJkaXNhYmxlZCJ9fSk7dmFyIF9sPWJ0LmV4dC5wYWdlcjtXLmV4dGVuZChfbCx7c2ltcGxlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmV2aW91cyIsIm5leHQiXX0sZnVsbDpmdW5jdGlvbigpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIsIm5leHQiLCJsYXN0Il19LG51bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bIm51bWJlcnMiXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiXX0sZnVsbF9udW1iZXJzOmZ1bmN0aW9uKCl7cmV0dXJuWyJmaXJzdCIsInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiLCJsYXN0Il19LGZpcnN0X2xhc3Q6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibGFzdCJdfSxmaXJzdF9sYXN0X251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibnVtYmVycyIsImxhc3QiXX0sX251bWJlcnM6aHMsbnVtYmVyc19sZW5ndGg6N30pO1cuZXh0ZW5kKCEwLGJ0LmV4dC5yZW5kZXJlcix7cGFnaW5nQnV0dG9uOntfOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9dC5vQ2xhc3Nlcy5wYWdpbmcsbD1bYS5idXR0b25dLHU7cmV0dXJuIG4mJmwucHVzaChhLmFjdGl2ZSkscyYmbC5wdXNoKGEuZGlzYWJsZWQpLGU9PT0iZWxsaXBzaXMiP3U9VygnPHNwYW4gY2xhc3M9ImVsbGlwc2lzIj48L3NwYW4+JykuaHRtbChyKVswXTp1PVcoIjxidXR0b24+Iix7Y2xhc3M6bC5qb2luKCIgIikscm9sZToibGluayIsdHlwZToiYnV0dG9uIn0pLmh0bWwocikse2Rpc3BsYXk6dSxjbGlja2VyOnV9fX0scGFnaW5nQ29udGFpbmVyOntfOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9fX0pO3ZhciBCbj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gWmUocil8fHR5cGVvZiByIT0ic3RyaW5nInx8KHI9ci5yZXBsYWNlKExvLCIgIiksdCYmKHI9QXIocikpLGUmJihyPW1uKHIsITEpKSkscn19O2Z1bmN0aW9uIGRzKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcV10vZywiXyIpfWZ1bmN0aW9uIFJhKHQsZSxyLG4scyl7cmV0dXJuIHdpbmRvdy5tb21lbnQ/dFtlXShzKTp3aW5kb3cubHV4b24/dFtyXShzKTpuP3Rbbl0ocyk6dH12YXIgTGE9ITE7ZnVuY3Rpb24gX24odCxlLHIpe3ZhciBuO2lmKHdpbmRvdy5tb21lbnQpe2lmKG49d2luZG93Lm1vbWVudC51dGModCxlLHIsITApLCFuLmlzVmFsaWQoKSlyZXR1cm4gbnVsbH1lbHNlIGlmKHdpbmRvdy5sdXhvbil7aWYobj1lJiZ0eXBlb2YgdD09InN0cmluZyI/d2luZG93Lmx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXQodCxlKTp3aW5kb3cubHV4b24uRGF0ZVRpbWUuZnJvbUlTTyh0KSwhbi5pc1ZhbGlkKXJldHVybiBudWxsO24uc2V0TG9jYWxlKHIpfWVsc2UgZT8oTGF8fGFsZXJ0KCJEYXRhVGFibGVzIHdhcm5pbmc6IEZvcm1hdHRlZCBkYXRlIHdpdGhvdXQgTW9tZW50LmpzIG9yIEx1eG9uIC0gaHR0cHM6Ly9kYXRhdGFibGVzLm5ldC90bi8xNyIpLExhPSEwKTpuPW5ldyBEYXRlKHQpO3JldHVybiBufWZ1bmN0aW9uIG9pKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbixzKXthcmd1bWVudHMubGVuZ3RoPT09MD8obj0iZW4iLHI9bnVsbCxlPW51bGwpOmFyZ3VtZW50cy5sZW5ndGg9PT0xPyhuPSJlbiIscj1lLGU9bnVsbCk6YXJndW1lbnRzLmxlbmd0aD09PTImJihuPXIscj1lLGU9bnVsbCk7dmFyIGE9ImRhdGV0aW1lIisocj8iLSIrZHMocik6IiIpO3JldHVybiBidC5leHQudHlwZS5vcmRlclthXXx8YnQudHlwZShhLHtkZXRlY3Q6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PT1hP2E6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24obCl7cmV0dXJuIGwudmFsdWVPZigpfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KSxmdW5jdGlvbihsLHUpe2lmKGw9PW51bGwpaWYocz09PSItLW5vdyIpe3ZhciBwPW5ldyBEYXRlO2w9bmV3IERhdGUoRGF0ZS5VVEMocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSxwLmdldERhdGUoKSxwLmdldEhvdXJzKCkscC5nZXRNaW51dGVzKCkscC5nZXRTZWNvbmRzKCkpKX1lbHNlIGw9IiI7aWYodT09PSJ0eXBlIilyZXR1cm4gYTtpZihsPT09IiIpcmV0dXJuIHUhPT0ic29ydCI/IiI6X24oIjAwMDAtMDEtMDEgMDA6MDA6MDAiLG51bGwsbik7aWYociE9PW51bGwmJmU9PT1yJiZ1IT09InNvcnQiJiZ1IT09InR5cGUiJiYhKGwgaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbDt2YXIgdj1fbihsLGUsbik7aWYodj09PW51bGwpcmV0dXJuIGw7aWYodT09PSJzb3J0IilyZXR1cm4gdjt2YXIgbT1yPT09bnVsbD9SYSh2LCJ0b0RhdGUiLCJ0b0pTRGF0ZSIsIiIpW3RdKCk6UmEodiwiZm9ybWF0IiwidG9Gb3JtYXQiLCJ0b0lTT1N0cmluZyIscik7cmV0dXJuIHU9PT0iZGlzcGxheSI/U3IobSk6bX19fXZhciB1cz0iLCIsY3M9Ii4iO2lmKHdpbmRvdy5JbnRsIT09dm9pZCAwKXRyeXtmb3Ioa3I9bmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0VG9QYXJ0cygxMDAwMDAuMSksUGU9MDtQZTxrci5sZW5ndGg7UGUrKylrcltQZV0udHlwZT09PSJncm91cCI/dXM9a3JbUGVdLnZhbHVlOmtyW1BlXS50eXBlPT09ImRlY2ltYWwiJiYoY3M9a3JbUGVdLnZhbHVlKX1jYXRjaHt9dmFyIGtyLFBlO2J0LmRhdGV0aW1lPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ImRhdGV0aW1lLWRldGVjdC0iK2RzKHQpO2V8fChlPSJlbiIpLGJ0LmV4dC50eXBlLm9yZGVyW3JdfHxidC50eXBlKHIse2RldGVjdDpmdW5jdGlvbihuKXt2YXIgcz1fbihuLHQsZSk7cmV0dXJuIG49PT0iInx8cz9yOiExfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKG4pe3JldHVybiBfbihuLHQsZSl8fDB9fSxjbGFzc05hbWU6ImR0LXJpZ2h0In0pfTtidC5yZW5kZXI9e2RhdGU6b2koInRvTG9jYWxlRGF0ZVN0cmluZyIpLGRhdGV0aW1lOm9pKCJ0b0xvY2FsZVN0cmluZyIpLHRpbWU6b2koInRvTG9jYWxlVGltZVN0cmluZyIpLG51bWJlcjpmdW5jdGlvbih0LGUscixuLHMpe3JldHVybiB0PT1udWxsJiYodD11cyksZT09bnVsbCYmKGU9Y3MpLHtkaXNwbGF5OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ibnVtYmVyIiYmdHlwZW9mIGEhPSJzdHJpbmcifHxhPT09IiJ8fGE9PT1udWxsKXJldHVybiBhO3ZhciBsPWE8MD8iLSI6IiIsdT1wYXJzZUZsb2F0KGEpLHA9TWF0aC5hYnModSk7aWYocD49MWUxMXx8cDwxZS00JiZwIT09MCl7dmFyIHY9dS50b0V4cG9uZW50aWFsKHIpLnNwbGl0KC9lXCs/Lyk7cmV0dXJuIHZbMF0rIiB4IDEwPHN1cD4iK3ZbMV0rIjwvc3VwPiJ9aWYoaXNOYU4odSkpcmV0dXJuIFNyKGEpO3U9dS50b0ZpeGVkKHIpLGE9TWF0aC5hYnModSk7dmFyIG09cGFyc2VJbnQoYSwxMCksZz1yP2UrKGEtbSkudG9GaXhlZChyKS5zdWJzdHJpbmcoMik6IiI7cmV0dXJuIG09PT0wJiZwYXJzZUZsb2F0KGcpPT09MCYmKGw9IiIpLGwrKG58fCIiKSttLnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0KStnKyhzfHwiIil9fX0sdGV4dDpmdW5jdGlvbigpe3JldHVybntkaXNwbGF5OlNyLGZpbHRlcjpTcn19fTt2YXIgaGU9YnQuZXh0LnR5cGU7YnQudHlwZT1mdW5jdGlvbih0LGUscil7aWYoIWUpcmV0dXJue2NsYXNzTmFtZTpoZS5jbGFzc05hbWVbdF0sZGV0ZWN0OmhlLmRldGVjdC5maW5kKGZ1bmN0aW9uKGwpe3JldHVybiBsLm5hbWU9PT10fSksb3JkZXI6e3ByZTpoZS5vcmRlclt0KyItcHJlIl0sYXNjOmhlLm9yZGVyW3QrIi1hc2MiXSxkZXNjOmhlLm9yZGVyW3QrIi1kZXNjIl19LHJlbmRlcjpoZS5yZW5kZXJbdF0sc2VhcmNoOmhlLnNlYXJjaFt0XX07dmFyIG49ZnVuY3Rpb24obCx1KXtoZVtsXVt0XT11fSxzPWZ1bmN0aW9uKGwpe3ZhciB1PWZ1bmN0aW9uKHYsbSl7dmFyIGc9bCh2LG0pO3JldHVybiBnPT09ITA/dDpnfTtPYmplY3QuZGVmaW5lUHJvcGVydHkodSwibmFtZSIse3ZhbHVlOnR9KTt2YXIgcD1oZS5kZXRlY3QuZmluZEluZGV4KGZ1bmN0aW9uKHYpe3JldHVybiB2Lm5hbWU9PT10fSk7cD09PS0xP2hlLmRldGVjdC51bnNoaWZ0KHUpOmhlLmRldGVjdC5zcGxpY2UocCwxLHUpfSxhPWZ1bmN0aW9uKGwpe2hlLm9yZGVyW3QrIi1wcmUiXT1sLnByZSxoZS5vcmRlclt0KyItYXNjIl09bC5hc2MsaGUub3JkZXJbdCsiLWRlc2MiXT1sLmRlc2N9O3I9PT12b2lkIDAmJihyPWUsZT1udWxsKSxlPT09ImNsYXNzTmFtZSI/bigiY2xhc3NOYW1lIixyKTplPT09ImRldGVjdCI/cyhyKTplPT09Im9yZGVyIj9hKHIpOmU9PT0icmVuZGVyIj9uKCJyZW5kZXIiLHIpOmU9PT0ic2VhcmNoIj9uKCJzZWFyY2giLHIpOmV8fChyLmNsYXNzTmFtZSYmbigiY2xhc3NOYW1lIixyLmNsYXNzTmFtZSksci5kZXRlY3QhPT12b2lkIDAmJnMoci5kZXRlY3QpLHIub3JkZXImJmEoci5vcmRlciksci5yZW5kZXIhPT12b2lkIDAmJm4oInJlbmRlciIsci5yZW5kZXIpLHIuc2VhcmNoIT09dm9pZCAwJiZuKCJzZWFyY2giLHIuc2VhcmNoKSl9O2J0LnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGhlLmRldGVjdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pfTtidC50eXBlKCJzdHJpbmciLHtkZXRlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIn0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXtyZXR1cm4gWmUodCk/IiI6dHlwZW9mIHQ9PSJzdHJpbmciP3QudG9Mb3dlckNhc2UoKTp0LnRvU3RyaW5nP3QudG9TdHJpbmcoKToiIn19LHNlYXJjaDpCbighMSwhMCl9KTtidC50eXBlKCJodG1sIix7ZGV0ZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBaZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIjwiKSE9PS0xPyJodG1sIjpudWxsfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQpe3JldHVybiBaZSh0KT8iIjp0LnJlcGxhY2U/QXIodCkudHJpbSgpLnRvTG93ZXJDYXNlKCk6dCsiIn19LHNlYXJjaDpCbighMCwhMCl9KTtidC50eXBlKCJkYXRlIix7Y2xhc3NOYW1lOiJkdC10eXBlLWRhdGUiLGRldGVjdDpmdW5jdGlvbih0KXtpZih0JiYhKHQgaW5zdGFuY2VvZiBEYXRlKSYmIXpvLnRlc3QodCkpcmV0dXJuIG51bGw7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gZSE9PW51bGwmJiFpc05hTihlKXx8WmUodCk/ImRhdGUiOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gaXNOYU4oZSk/LTEvMDplfX19KTtidC50eXBlKCJodG1sLW51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFZhKHQsciwhMCk/Imh0bWwtbnVtLWZtdCI6bnVsbH0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBObih0LHIscGksYmkpfX0sc2VhcmNoOkJuKCEwLCEwKX0pO2J0LnR5cGUoImh0bWwtbnVtIix7Y2xhc3NOYW1lOiJkdC10eXBlLW51bWVyaWMiLGRldGVjdDpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBWYSh0LHIpPyJodG1sLW51bSI6bnVsbH0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBObih0LHIscGkpfX0sc2VhcmNoOkJuKCEwLCEwKX0pO2J0LnR5cGUoIm51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIHZpKHQsciwhMCk/Im51bS1mbXQiOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gTm4odCxyLGJpKX19fSk7YnQudHlwZSgibnVtIix7Y2xhc3NOYW1lOiJkdC10eXBlLW51bWVyaWMiLGRldGVjdDpmdW5jdGlvbih0LGUpe3ZhciByPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiB2aSh0LHIpPyJudW0iOm51bGx9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gTm4odCxyKX19fSk7dmFyIE5uPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQhPT0wJiYoIXR8fHQ9PT0iLSIpKXJldHVybi0xLzA7dmFyIHM9dHlwZW9mIHQ7cmV0dXJuIHM9PT0ibnVtYmVyInx8cz09PSJiaWdpbnQiP3Q6KGUmJih0PU1hKHQsZSkpLHQucmVwbGFjZSYmKHImJih0PXQucmVwbGFjZShyLCIiKSksbiYmKHQ9dC5yZXBsYWNlKG4sIiIpKSksdCoxKX07Vy5leHRlbmQoITAsYnQuZXh0LnJlbmRlcmVyLHtmb290ZXI6e186ZnVuY3Rpb24odCxlLHIpe2UuYWRkQ2xhc3Moci50Zm9vdC5jZWxsKX19LGhlYWRlcjp7XzpmdW5jdGlvbih0LGUscil7ZS5hZGRDbGFzcyhyLnRoZWFkLmNlbGwpLHQub0ZlYXR1cmVzLmJTb3J0fHxlLmFkZENsYXNzKHIub3JkZXIubm9uZSk7dmFyIG49dC5iU29ydENlbGxzVG9wLHM9ZS5jbG9zZXN0KCJ0aGVhZCIpLmZpbmQoInRyIiksYT1lLnBhcmVudCgpLmluZGV4KCk7ZS5hdHRyKCJkYXRhLWR0LW9yZGVyIik9PT0iZGlzYWJsZSJ8fGUucGFyZW50KCkuYXR0cigiZGF0YS1kdC1vcmRlciIpPT09ImRpc2FibGUifHxuPT09ITAmJmEhPT0wfHxuPT09ITEmJmEhPT1zLmxlbmd0aC0xfHxXKHQublRhYmxlKS5vbigib3JkZXIuZHQuRFQiLGZ1bmN0aW9uKGwsdSxwKXtpZih0PT09dSl7dmFyIHY9ci5vcmRlcixtPXUuYXBpLmNvbHVtbnMoZSksZz10LmFvQ29sdW1uc1ttLmZsYXR0ZW4oKVswXV0sVD1tLm9yZGVyYWJsZSgpLmluY2x1ZGVzKCEwKSx3PSIiLGs9bS5pbmRleGVzKCksUD1tLm9yZGVyYWJsZSghMCkuZmxhdHRlbigpLEY9cC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIEIuY29sfSkuam9pbigiLCIpO2UucmVtb3ZlQ2xhc3Modi5pc0FzYysiICIrdi5pc0Rlc2MpLnRvZ2dsZUNsYXNzKHYubm9uZSwhVCkudG9nZ2xlQ2xhc3Modi5jYW5Bc2MsVCYmUC5pbmNsdWRlcygiYXNjIikpLnRvZ2dsZUNsYXNzKHYuY2FuRGVzYyxUJiZQLmluY2x1ZGVzKCJkZXNjIikpO3ZhciBoPUYuaW5kZXhPZihrLnRvQXJyYXkoKS5qb2luKCIsIikpO2lmKGghPT0tMSl7dmFyIG89bS5vcmRlcigpO2UuYWRkQ2xhc3Moby5pbmNsdWRlcygiYXNjIik/di5pc0FzYzoiIitvLmluY2x1ZGVzKCJkZXNjIik/di5pc0Rlc2M6IiIpfWlmKGg9PT0wJiZGLmxlbmd0aD09PWsuY291bnQoKSl7dmFyIGY9cFswXSxDPWcuYXNTb3J0aW5nO2UuYXR0cigiYXJpYS1zb3J0IixmLmRpcj09PSJhc2MiPyJhc2NlbmRpbmciOiJkZXNjZW5kaW5nIiksdz1DW2YuaW5kZXgrMV0/IlJldmVyc2UiOiJSZW1vdmUifWVsc2UgZS5yZW1vdmVBdHRyKCJhcmlhLXNvcnQiKTtlLmF0dHIoImFyaWEtbGFiZWwiLFQ/Zy5hcmlhVGl0bGUrdS5hcGkuaTE4bigib0FyaWEub3JkZXJhYmxlIit3KTpnLmFyaWFUaXRsZSksVCYmKGUuZmluZCgiLmR0LWNvbHVtbi10aXRsZSIpLmF0dHIoInJvbGUiLCJidXR0b24iKSxlLmF0dHIoInRhYmluZGV4IiwwKSl9fSl9fSxsYXlvdXQ6e186ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVcoIjxkaXYvPiIpLmFkZENsYXNzKCJkdC1sYXlvdXQtcm93IikuYXBwZW5kVG8oZSk7Vy5lYWNoKHIsZnVuY3Rpb24ocyxhKXt2YXIgbD1hLnRhYmxlPyIiOiJkdC0iK3MrIiAiO2EudGFibGUmJm4uYWRkQ2xhc3MoImR0LWxheW91dC10YWJsZSIpLFcoIjxkaXYvPiIpLmF0dHIoe2lkOmEuaWR8fG51bGwsY2xhc3M6ImR0LWxheW91dC1jZWxsICIrbCsoYS5jbGFzc05hbWV8fCIiKX0pLmFwcGVuZChhLmNvbnRlbnRzKS5hcHBlbmRUbyhuKX0pfX19KTtidC5mZWF0dXJlPXt9O2J0LmZlYXR1cmUucmVnaXN0ZXI9ZnVuY3Rpb24odCxlLHIpe2J0LmV4dC5mZWF0dXJlc1t0XT1lLHImJlF0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6cixmbkluaXQ6ZX0pfTtidC5mZWF0dXJlLnJlZ2lzdGVyKCJpbmZvIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iSW5mbylyZXR1cm4gbnVsbDt2YXIgcj10Lm9MYW5ndWFnZSxuPXQuc1RhYmxlSWQscz1XKCI8ZGl2Lz4iLHtjbGFzczp0Lm9DbGFzc2VzLmluZm8uY29udGFpbmVyfSk7cmV0dXJuIGU9Vy5leHRlbmQoe2NhbGxiYWNrOnIuZm5JbmZvQ2FsbGJhY2ssZW1wdHk6ci5zSW5mb0VtcHR5LHBvc3RmaXg6ci5zSW5mb1Bvc3RGaXgsc2VhcmNoOnIuc0luZm9GaWx0ZXJlZCx0ZXh0OnIuc0luZm99LGUpLHQuYW9EcmF3Q2FsbGJhY2sucHVzaChmdW5jdGlvbihhKXtDbChhLGUscyl9KSxXKCIjIituKyJfaW5mbyIsdC5uV3JhcHBlcikubGVuZ3RofHwocy5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIixpZDpuKyJfaW5mbyIscm9sZToic3RhdHVzIn0pLFcodC5uVGFibGUpLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLG4rIl9pbmZvIikpLHN9LCJpIik7ZnVuY3Rpb24gQ2wodCxlLHIpe3ZhciBuPXQuX2lEaXNwbGF5U3RhcnQrMSxzPXQuZm5EaXNwbGF5RW5kKCksYT10LmZuUmVjb3Jkc1RvdGFsKCksbD10LmZuUmVjb3Jkc0Rpc3BsYXkoKSx1PWw/ZS50ZXh0OmUuZW1wdHk7bCE9PWEmJih1Kz0iICIrZS5zZWFyY2gpLHUrPWUucG9zdGZpeCx1PURpKHQsdSksZS5jYWxsYmFjayYmKHU9ZS5jYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsbixzLGEsbCx1KSksci5odG1sKHUpLFp0KHQsbnVsbCwiaW5mbyIsW3QsclswXSx1XSl9dmFyIGxpPTA7YnQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iRmlsdGVyKXJldHVybiBudWxsO3ZhciByPXQub0NsYXNzZXMuc2VhcmNoLG49dC5zVGFibGVJZCxzPXQub0xhbmd1YWdlLGE9dC5vUHJldmlvdXNTZWFyY2gsbD0nPGlucHV0IHR5cGU9InNlYXJjaCIgY2xhc3M9Iicrci5pbnB1dCsnIi8+JztlPVcuZXh0ZW5kKHtwbGFjZWhvbGRlcjpzLnNTZWFyY2hQbGFjZWhvbGRlcix0ZXh0OnMuc1NlYXJjaH0sZSksZS50ZXh0LmluZGV4T2YoIl9JTlBVVF8iKT09PS0xJiYoZS50ZXh0Kz0iX0lOUFVUXyIpLGUudGV4dD1EaSh0LGUudGV4dCk7dmFyIHU9ZS50ZXh0Lm1hdGNoKC9fSU5QVVRfJC8pLHA9ZS50ZXh0Lm1hdGNoKC9eX0lOUFVUXy8pLHY9ZS50ZXh0LnJlcGxhY2UoL19JTlBVVF8vLCIiKSxtPSI8bGFiZWw+IitlLnRleHQrIjwvbGFiZWw+IjtwP209Il9JTlBVVF88bGFiZWw+Iit2KyI8L2xhYmVsPiI6dSYmKG09IjxsYWJlbD4iK3YrIjwvbGFiZWw+X0lOUFVUXyIpO3ZhciBnPVcoIjxkaXY+IikuYWRkQ2xhc3Moci5jb250YWluZXIpLmFwcGVuZChtLnJlcGxhY2UoL19JTlBVVF8vLGwpKTtnLmZpbmQoImxhYmVsIikuYXR0cigiZm9yIiwiZHQtc2VhcmNoLSIrbGkpLGcuZmluZCgiaW5wdXQiKS5hdHRyKCJpZCIsImR0LXNlYXJjaC0iK2xpKSxsaSsrO3ZhciBUPWZ1bmN0aW9uKFApe3ZhciBGPXRoaXMudmFsdWU7YS5yZXR1cm4mJlAua2V5IT09IkVudGVyInx8RiE9YS5zZWFyY2gmJihhLnNlYXJjaD1GLEdyKHQsYSksdC5faURpc3BsYXlTdGFydD0wLEZyKHQpKX0sdz10LnNlYXJjaERlbGF5IT09bnVsbD90LnNlYXJjaERlbGF5OjAsaz1XKCJpbnB1dCIsZykudmFsKGEuc2VhcmNoKS5hdHRyKCJwbGFjZWhvbGRlciIsZS5wbGFjZWhvbGRlcikub24oImtleXVwLkRUIHNlYXJjaC5EVCBpbnB1dC5EVCBwYXN0ZS5EVCBjdXQuRFQiLHc/YnQudXRpbC5kZWJvdW5jZShULHcpOlQpLm9uKCJtb3VzZXVwLkRUIixmdW5jdGlvbihQKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5jYWxsKGtbMF0sUCl9LDEwKX0pLm9uKCJrZXlwcmVzcy5EVCIsZnVuY3Rpb24oUCl7aWYoUC5rZXlDb2RlPT0xMylyZXR1cm4hMX0pLmF0dHIoImFyaWEtY29udHJvbHMiLG4pO3JldHVybiBXKHQublRhYmxlKS5vbigic2VhcmNoLmR0LkRUIixmdW5jdGlvbihQLEYpe3Q9PT1GJiZrWzBdIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmay52YWwodHlwZW9mIGEuc2VhcmNoIT0iZnVuY3Rpb24iP2Euc2VhcmNoOiIiKX0pLGd9LCJmIik7YnQuZmVhdHVyZS5yZWdpc3RlcigicGFnaW5nIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iUGFnaW5hdGUpcmV0dXJuIG51bGw7ZT1XLmV4dGVuZCh7bnVtYmVyczpidC5leHQucGFnZXIubnVtYmVyc19sZW5ndGgsdHlwZTp0LnNQYWdpbmF0aW9uVHlwZX0sZSk7dmFyIHI9VygiPGRpdi8+IikuYWRkQ2xhc3ModC5vQ2xhc3Nlcy5wYWdpbmcuY29udGFpbmVyKyIgcGFnaW5nXyIrZS50eXBlKSxuPWZ1bmN0aW9uKCl7ZnModCxyLGUpfTtyZXR1cm4gdC5hb0RyYXdDYWxsYmFjay5wdXNoKG4pLFcodC5uVGFibGUpLm9uKCJjb2x1bW4tc2l6aW5nLmR0LkRUIixuKSxyfSwicCIpO2Z1bmN0aW9uIGZzKHQsZSxyKXtpZih0Ll9iSW5pdENvbXBsZXRlKXtmb3IodmFyIG49YnQuZXh0LnBhZ2VyW3IudHlwZV0scz10Lm9MYW5ndWFnZS5vQXJpYS5wYWdpbmF0ZXx8e30sYT10Ll9pRGlzcGxheVN0YXJ0LGw9dC5faURpc3BsYXlMZW5ndGgsdT10LmZuUmVjb3Jkc0Rpc3BsYXkoKSxwPWw9PT0tMSx2PXA/MDpNYXRoLmNlaWwoYS9sKSxtPXA/MTpNYXRoLmNlaWwodS9sKSxnPW4oKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGY9PT0ibnVtYmVycyI/aHModixtLHIubnVtYmVycyk6Zn0pLmZsYXQoKSxUPVtdLHc9MDt3PGcubGVuZ3RoO3crKyl7dmFyIGs9Z1t3XSxQPVRsKHQsayx2LG0pLEY9eG4odCwicGFnaW5nQnV0dG9uIikodCxrLFAuZGlzcGxheSxQLmFjdGl2ZSxQLmRpc2FibGVkKTtXKEYuY2xpY2tlcikuYXR0cih7ImFyaWEtY29udHJvbHMiOnQuc1RhYmxlSWQsImFyaWEtZGlzYWJsZWQiOlAuZGlzYWJsZWQ/InRydWUiOm51bGwsImFyaWEtY3VycmVudCI6UC5hY3RpdmU/InBhZ2UiOm51bGwsImFyaWEtbGFiZWwiOnNba10sImRhdGEtZHQtaWR4IjprLHRhYkluZGV4OlAuZGlzYWJsZWQ/LTE6dC5pVGFiSW5kZXh9KSx0eXBlb2YgayE9Im51bWJlciImJlcoRi5jbGlja2VyKS5hZGRDbGFzcyhrKSxucyhGLmNsaWNrZXIse2FjdGlvbjprfSxmdW5jdGlvbihmKXtmLnByZXZlbnREZWZhdWx0KCksa2kodCxmLmRhdGEuYWN0aW9uLCEwKX0pLFQucHVzaChGLmRpc3BsYXkpfXZhciBoPXhuKHQsInBhZ2luZ0NvbnRhaW5lciIpKHQsVCksbz1lLmZpbmQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuZGF0YSgiZHQtaWR4Iik7ZS5lbXB0eSgpLmFwcGVuZChoKSxvIT09dm9pZCAwJiZlLmZpbmQoIltkYXRhLWR0LWlkeD0iK28rIl0iKS50cmlnZ2VyKCJmb2N1cyIpLFQubGVuZ3RoJiZyLm51bWJlcnM+MSYmVyhlKS5oZWlnaHQoKT49VyhUWzBdKS5vdXRlckhlaWdodCgpKjItMTAmJmZzKHQsZSxXLmV4dGVuZCh7fSxyLHtudW1iZXJzOnIubnVtYmVycy0yfSkpfX1mdW5jdGlvbiBUbCh0LGUscixuKXt2YXIgcz10Lm9MYW5ndWFnZS5vUGFnaW5hdGUsYT17ZGlzcGxheToiIixhY3RpdmU6ITEsZGlzYWJsZWQ6ITF9O3N3aXRjaChlKXtjYXNlImVsbGlwc2lzIjphLmRpc3BsYXk9IiYjeDIwMjY7IixhLmRpc2FibGVkPSEwO2JyZWFrO2Nhc2UiZmlyc3QiOmEuZGlzcGxheT1zLnNGaXJzdCxyPT09MCYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UicHJldmlvdXMiOmEuZGlzcGxheT1zLnNQcmV2aW91cyxyPT09MCYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibmV4dCI6YS5kaXNwbGF5PXMuc05leHQsKG49PT0wfHxyPT09bi0xKSYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibGFzdCI6YS5kaXNwbGF5PXMuc0xhc3QsKG49PT0wfHxyPT09bi0xKSYmKGEuZGlzYWJsZWQ9ITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGU9PSJudW1iZXIiJiYoYS5kaXNwbGF5PXQuZm5Gb3JtYXROdW1iZXIoZSsxKSxyPT09ZSYmKGEuYWN0aXZlPSEwKSk7YnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gaHModCxlLHIpe3ZhciBuPVtdLHM9TWF0aC5mbG9vcihyLzIpO3JldHVybiBlPD1yP249ZXIoMCxlKTpyPT09MT9uPVt0XTpyPT09Mz90PD0xP249WzAsMSwiZWxsaXBzaXMiXTp0Pj1lLTI/KG49ZXIoZS0yLGUpLG4udW5zaGlmdCgiZWxsaXBzaXMiKSk6bj1bImVsbGlwc2lzIix0LCJlbGxpcHNpcyJdOnQ8PXM/KG49ZXIoMCxyLTIpLG4ucHVzaCgiZWxsaXBzaXMiLGUtMSkpOnQ+PWUtMS1zPyhuPWVyKGUtKHItMiksZSksbi51bnNoaWZ0KDAsImVsbGlwc2lzIikpOihuPWVyKHQtcysyLHQrcy0xKSxuLnB1c2goImVsbGlwc2lzIixlLTEpLG4udW5zaGlmdCgwLCJlbGxpcHNpcyIpKSxufXZhciBkaT0wO2J0LmZlYXR1cmUucmVnaXN0ZXIoInBhZ2VMZW5ndGgiLGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5vRmVhdHVyZXM7aWYoIXIuYlBhZ2luYXRlfHwhci5iTGVuZ3RoQ2hhbmdlKXJldHVybiBudWxsO2U9Vy5leHRlbmQoe21lbnU6dC5hTGVuZ3RoTWVudSx0ZXh0OnQub0xhbmd1YWdlLnNMZW5ndGhNZW51fSxlKTt2YXIgbj10Lm9DbGFzc2VzLmxlbmd0aCxzPXQuc1RhYmxlSWQsYT1lLm1lbnUsbD1bXSx1PVtdLHA7aWYoQXJyYXkuaXNBcnJheShhWzBdKSlsPWFbMF0sdT1hWzFdO2Vsc2UgZm9yKHA9MDtwPGEubGVuZ3RoO3ArKylXLmlzUGxhaW5PYmplY3QoYVtwXSk/KGwucHVzaChhW3BdLnZhbHVlKSx1LnB1c2goYVtwXS5sYWJlbCkpOihsLnB1c2goYVtwXSksdS5wdXNoKGFbcF0pKTt2YXIgdj1lLnRleHQubWF0Y2goL19NRU5VXyQvKSxtPWUudGV4dC5tYXRjaCgvXl9NRU5VXy8pLGc9ZS50ZXh0LnJlcGxhY2UoL19NRU5VXy8sIiIpLFQ9IjxsYWJlbD4iK2UudGV4dCsiPC9sYWJlbD4iO20/VD0iX01FTlVfPGxhYmVsPiIrZysiPC9sYWJlbD4iOnYmJihUPSI8bGFiZWw+IitnKyI8L2xhYmVsPl9NRU5VXyIpO3ZhciB3PVcoIjxkaXYvPiIpLmFkZENsYXNzKG4uY29udGFpbmVyKS5hcHBlbmQoVC5yZXBsYWNlKCJfTUVOVV8iLCI8c3Bhbj48L3NwYW4+IikpLGs9W107dy5maW5kKCJsYWJlbCIpWzBdLmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbihoKXtoLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUmJmsucHVzaCh7ZWw6aCx0ZXh0OmgudGV4dENvbnRlbnR9KX0pO3ZhciBQPWZ1bmN0aW9uKGgpe2suZm9yRWFjaChmdW5jdGlvbihvKXtvLmVsLnRleHRDb250ZW50PURpKHQsby50ZXh0LGgpfSl9LEY9VygiPHNlbGVjdC8+Iix7bmFtZTpzKyJfbGVuZ3RoIiwiYXJpYS1jb250cm9scyI6cyxjbGFzczpuLnNlbGVjdH0pO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspRlswXVtwXT1uZXcgT3B0aW9uKHR5cGVvZiB1W3BdPT0ibnVtYmVyIj90LmZuRm9ybWF0TnVtYmVyKHVbcF0pOnVbcF0sbFtwXSk7cmV0dXJuIHcuZmluZCgibGFiZWwiKS5hdHRyKCJmb3IiLCJkdC1sZW5ndGgtIitkaSksRi5hdHRyKCJpZCIsImR0LWxlbmd0aC0iK2RpKSxkaSsrLHcuZmluZCgic3BhbiIpLnJlcGxhY2VXaXRoKEYpLFcoInNlbGVjdCIsdykudmFsKHQuX2lEaXNwbGF5TGVuZ3RoKS5vbigiY2hhbmdlLkRUIixmdW5jdGlvbigpe1FhKHQsVyh0aGlzKS52YWwoKSksRnIodCl9KSxXKHQublRhYmxlKS5vbigibGVuZ3RoLmR0LkRUIixmdW5jdGlvbihoLG8sZil7dD09PW8mJihXKCJzZWxlY3QiLHcpLnZhbChmKSxQKGYpKX0pLFAodC5faURpc3BsYXlMZW5ndGgpLHd9LCJsIik7Vy5mbi5kYXRhVGFibGU9YnQ7YnQuJD1XO1cuZm4uZGF0YVRhYmxlU2V0dGluZ3M9YnQuc2V0dGluZ3M7Vy5mbi5kYXRhVGFibGVFeHQ9YnQuZXh0O1cuZm4uRGF0YVRhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBXKHRoaXMpLmRhdGFUYWJsZSh0KS5hcGkoKX07Vy5lYWNoKGJ0LGZ1bmN0aW9uKHQsZSl7Vy5mbi5EYXRhVGFibGVbdF09ZX0pO3ZhciBzdD1idDt2YXIgS2U9c3Q7dmFyIEZsPWllKGFlKCksMSk7dmFyIG1zPWllKGFlKCksMSk7dmFyIGh0PW1zLmRlZmF1bHQsU2w9MCxEbD0wLENlPXN0LmV4dC5idXR0b25zLE9pPW51bGw7ZnVuY3Rpb24gRWkodCxlLHIpe2h0LmZuLmFuaW1hdGU/dC5zdG9wKCkuZmFkZUluKGUscik6KHQuY3NzKCJkaXNwbGF5IiwiYmxvY2siKSxyJiZyLmNhbGwodCkpfWZ1bmN0aW9uIFJpKHQsZSxyKXtodC5mbi5hbmltYXRlP3Quc3RvcCgpLmZhZGVPdXQoZSxyKToodC5jc3MoImRpc3BsYXkiLCJub25lIiksciYmci5jYWxsKHQpKX12YXIgcmU9ZnVuY3Rpb24odCxlKXtpZighc3QudmVyc2lvbkNoZWNrKCIyIikpdGhyb3ciV2FybmluZzogQnV0dG9ucyByZXF1aXJlcyBEYXRhVGFibGVzIDIgb3IgbmV3ZXIiO2lmKCEodGhpcyBpbnN0YW5jZW9mIHJlKSlyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG5ldyByZShyLHQpLmNvbnRhaW5lcigpfTt0eXBlb2YgZT4idSImJihlPXt9KSxlPT09ITAmJihlPXt9KSxBcnJheS5pc0FycmF5KGUpJiYoZT17YnV0dG9uczplfSksdGhpcy5jPWh0LmV4dGVuZCghMCx7fSxyZS5kZWZhdWx0cyxlKSxlLmJ1dHRvbnMmJih0aGlzLmMuYnV0dG9ucz1lLmJ1dHRvbnMpLHRoaXMucz17ZHQ6bmV3IHN0LkFwaSh0KSxidXR0b25zOltdLGxpc3RlbktleXM6IiIsbmFtZXNwYWNlOiJkdGIiK1NsKyt9LHRoaXMuZG9tPXtjb250YWluZXI6aHQoIjwiK3RoaXMuYy5kb20uY29udGFpbmVyLnRhZysiLz4iKS5hZGRDbGFzcyh0aGlzLmMuZG9tLmNvbnRhaW5lci5jbGFzc05hbWUpfSx0aGlzLl9jb25zdHJ1Y3RvcigpfTtodC5leHRlbmQocmUucHJvdG90eXBlLHthY3Rpb246ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGU9PT12b2lkIDA/ci5jb25mLmFjdGlvbjooci5jb25mLmFjdGlvbj1lLHRoaXMpfSxhY3RpdmU6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9ub2RlVG9CdXR0b24odCksbj10aGlzLmMuZG9tLmJ1dHRvbi5hY3RpdmUscz1odChyLm5vZGUpO3JldHVybiByLmluQ29sbGVjdGlvbiYmdGhpcy5jLmRvbS5jb2xsZWN0aW9uLmJ1dHRvbiYmdGhpcy5jLmRvbS5jb2xsZWN0aW9uLmJ1dHRvbi5hY3RpdmUhPT12b2lkIDAmJihuPXRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24uYWN0aXZlKSxlPT09dm9pZCAwP3MuaGFzQ2xhc3Mobik6KHMudG9nZ2xlQ2xhc3MobixlPT09dm9pZCAwPyEwOmUpLHRoaXMpfSxhZGQ6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucy5idXR0b25zO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7Zm9yKHZhciBzPWUuc3BsaXQoIi0iKSxhPXRoaXMucyxsPTAsdT1zLmxlbmd0aC0xO2w8dTtsKyspYT1hLmJ1dHRvbnNbc1tsXSoxXTtuPWEuYnV0dG9ucyxlPXNbcy5sZW5ndGgtMV0qMX1yZXR1cm4gdGhpcy5fZXhwYW5kQnV0dG9uKG4sdCx0IT09dm9pZCAwP3Quc3BsaXQ6dm9pZCAwLCh0PT09dm9pZCAwfHx0LnNwbGl0PT09dm9pZCAwfHx0LnNwbGl0Lmxlbmd0aD09PTApJiZhIT09dm9pZCAwLCExLGUpLChyPT09dm9pZCAwfHxyPT09ITApJiZ0aGlzLl9kcmF3KCksdGhpc30sY29sbGVjdGlvblJlYnVpbGQ6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9ub2RlVG9CdXR0b24odCk7aWYoZSE9PXZvaWQgMCl7dmFyIG47Zm9yKG49ci5idXR0b25zLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlKHIuYnV0dG9uc1tuXS5ub2RlKTtmb3Ioci5jb25mLnByZWZpeEJ1dHRvbnMmJmUudW5zaGlmdC5hcHBseShlLHIuY29uZi5wcmVmaXhCdXR0b25zKSxyLmNvbmYucG9zdGZpeEJ1dHRvbnMmJmUucHVzaC5hcHBseShlLHIuY29uZi5wb3N0Zml4QnV0dG9ucyksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcz1lW25dO3RoaXMuX2V4cGFuZEJ1dHRvbihyLmJ1dHRvbnMscyxzIT09dm9pZCAwJiZzLmNvbmZpZyE9PXZvaWQgMCYmcy5jb25maWcuc3BsaXQhPT12b2lkIDAsITAscy5wYXJlbnRDb25mIT09dm9pZCAwJiZzLnBhcmVudENvbmYuc3BsaXQhPT12b2lkIDAsbnVsbCxzLnBhcmVudENvbmYpfX10aGlzLl9kcmF3KHIuY29sbGVjdGlvbixyLmJ1dHRvbnMpfSxjb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxkaXNhYmxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVUb0J1dHRvbih0KTtyZXR1cm4gaHQoZS5ub2RlKS5hZGRDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCkucHJvcCgiZGlzYWJsZWQiLCEwKSx0aGlzfSxkZXN0cm95OmZ1bmN0aW9uKCl7aHQoImJvZHkiKS5vZmYoImtleXVwLiIrdGhpcy5zLm5hbWVzcGFjZSk7dmFyIHQ9dGhpcy5zLmJ1dHRvbnMuc2xpY2UoKSxlLHI7Zm9yKGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspdGhpcy5yZW1vdmUodFtlXS5ub2RlKTt0aGlzLmRvbS5jb250YWluZXIucmVtb3ZlKCk7dmFyIG49dGhpcy5zLmR0LnNldHRpbmdzKClbMF07Zm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspaWYobi5pbnN0PT09dGhpcyl7bi5zcGxpY2UoZSwxKTticmVha31yZXR1cm4gdGhpc30sZW5hYmxlOmZ1bmN0aW9uKHQsZSl7aWYoZT09PSExKXJldHVybiB0aGlzLmRpc2FibGUodCk7dmFyIHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBodChyLm5vZGUpLnJlbW92ZUNsYXNzKHRoaXMuYy5kb20uYnV0dG9uLmRpc2FibGVkKS5wcm9wKCJkaXNhYmxlZCIsITEpLHRoaXN9LGluZGV4OmZ1bmN0aW9uKHQsZSxyKXtlfHwoZT0iIixyPXRoaXMucy5idXR0b25zKTtmb3IodmFyIG49MCxzPXIubGVuZ3RoO248cztuKyspe3ZhciBhPXJbbl0uYnV0dG9ucztpZihyW25dLm5vZGU9PT10KXJldHVybiBlK247aWYoYSYmYS5sZW5ndGgpe3ZhciBsPXRoaXMuaW5kZXgodCxuKyItIixhKTtpZihsIT09bnVsbClyZXR1cm4gbH19cmV0dXJuIG51bGx9LG5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLm5hbWV9LG5vZGU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcjt2YXIgZT10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGh0KGUubm9kZSl9LHByb2Nlc3Npbmc6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnMuZHQsbj10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGU9PT12b2lkIDA/aHQobi5ub2RlKS5oYXNDbGFzcygicHJvY2Vzc2luZyIpOihodChuLm5vZGUpLnRvZ2dsZUNsYXNzKCJwcm9jZXNzaW5nIixlKSxodChyLnRhYmxlKCkubm9kZSgpKS50cmlnZ2VySGFuZGxlcigiYnV0dG9ucy1wcm9jZXNzaW5nLmR0IixbZSxyLmJ1dHRvbih0KSxyLGh0KHQpLG4uY29uZl0pLHRoaXMpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbm9kZVRvQnV0dG9uKHQpLHI9dGhpcy5fbm9kZVRvSG9zdCh0KSxuPXRoaXMucy5kdDtpZihlLmJ1dHRvbnMubGVuZ3RoKWZvcih2YXIgcz1lLmJ1dHRvbnMubGVuZ3RoLTE7cz49MDtzLS0pdGhpcy5yZW1vdmUoZS5idXR0b25zW3NdLm5vZGUpO2UuY29uZi5kZXN0cm95aW5nPSEwLGUuY29uZi5kZXN0cm95JiZlLmNvbmYuZGVzdHJveS5jYWxsKG4uYnV0dG9uKHQpLG4saHQodCksZS5jb25mKSx0aGlzLl9yZW1vdmVLZXkoZS5jb25mKSxodChlLm5vZGUpLnJlbW92ZSgpO3ZhciBhPWh0LmluQXJyYXkoZSxyKTtyZXR1cm4gci5zcGxpY2UoYSwxKSx0aGlzfSx0ZXh0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpLG49ci50ZXh0Tm9kZSxzPXRoaXMucy5kdCxhPWh0KHIubm9kZSksbD1mdW5jdGlvbih1KXtyZXR1cm4gdHlwZW9mIHU9PSJmdW5jdGlvbiI/dShzLGEsci5jb25mKTp1fTtyZXR1cm4gZT09PXZvaWQgMD9sKHIuY29uZi50ZXh0KTooci5jb25mLnRleHQ9ZSxuLmh0bWwobChlKSksdGhpcyl9LF9jb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQscj1lLnNldHRpbmdzKClbMF0sbj10aGlzLmMuYnV0dG9ucztyLl9idXR0b25zfHwoci5fYnV0dG9ucz1bXSksci5fYnV0dG9ucy5wdXNoKHtpbnN0OnRoaXMsbmFtZTp0aGlzLmMubmFtZX0pO2Zvcih2YXIgcz0wLGE9bi5sZW5ndGg7czxhO3MrKyl0aGlzLmFkZChuW3NdKTtlLm9uKCJkZXN0cm95IixmdW5jdGlvbihsLHUpe3U9PT1yJiZ0LmRlc3Ryb3koKX0pLGh0KCJib2R5Iikub24oImtleXVwLiIrdGhpcy5zLm5hbWVzcGFjZSxmdW5jdGlvbihsKXtpZighZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpe3ZhciB1PVN0cmluZy5mcm9tQ2hhckNvZGUobC5rZXlDb2RlKS50b0xvd2VyQ2FzZSgpO3Qucy5saXN0ZW5LZXlzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih1KSE9PS0xJiZ0Ll9rZXlwcmVzcyh1LGwpfX0pfSxfYWRkS2V5OmZ1bmN0aW9uKHQpe3Qua2V5JiYodGhpcy5zLmxpc3RlbktleXMrPWh0LmlzUGxhaW5PYmplY3QodC5rZXkpP3Qua2V5LmtleTp0LmtleSl9LF9kcmF3OmZ1bmN0aW9uKHQsZSl7dHx8KHQ9dGhpcy5kb20uY29udGFpbmVyLGU9dGhpcy5zLmJ1dHRvbnMpLHQuY2hpbGRyZW4oKS5kZXRhY2goKTtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdC5hcHBlbmQoZVtyXS5pbnNlcnRlciksdC5hcHBlbmQoIiAiKSxlW3JdLmJ1dHRvbnMmJmVbcl0uYnV0dG9ucy5sZW5ndGgmJnRoaXMuX2RyYXcoZVtyXS5jb2xsZWN0aW9uLGVbcl0uYnV0dG9ucyl9LF9leHBhbmRCdXR0b246ZnVuY3Rpb24odCxlLHIsbixzLGEsbCl7dmFyIHU9dGhpcy5zLmR0LHA9ITEsdj10aGlzLmMuZG9tLmNvbGxlY3Rpb24sbT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2U9PT12b2lkIDAmJihtPUFycmF5LmlzQXJyYXkocik/cjpbcl0pO2Zvcih2YXIgZz0wLFQ9bS5sZW5ndGg7ZzxUO2crKyl7dmFyIHc9dGhpcy5fcmVzb2x2ZUV4dGVuZHMobVtnXSk7aWYodyl7aWYocD0hISh3LmNvbmZpZyYmdy5jb25maWcuc3BsaXQpLEFycmF5LmlzQXJyYXkodykpe3RoaXMuX2V4cGFuZEJ1dHRvbih0LHcsayE9PXZvaWQgMCYmay5jb25mIT09dm9pZCAwP2suY29uZi5zcGxpdDp2b2lkIDAsbixsIT09dm9pZCAwJiZsLnNwbGl0IT09dm9pZCAwLGEsbCk7Y29udGludWV9dmFyIGs9dGhpcy5fYnVpbGRCdXR0b24odyxuLHcuc3BsaXQhPT12b2lkIDB8fHcuY29uZmlnIT09dm9pZCAwJiZ3LmNvbmZpZy5zcGxpdCE9PXZvaWQgMCxzKTtpZihrKXtpZihhIT1udWxsPyh0LnNwbGljZShhLDAsayksYSsrKTp0LnB1c2goayksay5jb25mLmJ1dHRvbnMmJihrLmNvbGxlY3Rpb249aHQoIjwiK3YuY29udGFpbmVyLmNvbnRlbnQudGFnKyIvPiIpLGsuY29uZi5fY29sbGVjdGlvbj1rLmNvbGxlY3Rpb24saHQoay5ub2RlKS5hcHBlbmQodi5hY3Rpb24uZHJvcEh0bWwpLHRoaXMuX2V4cGFuZEJ1dHRvbihrLmJ1dHRvbnMsay5jb25mLmJ1dHRvbnMsay5jb25mLnNwbGl0LCFwLHAsYSxrLmNvbmYpKSxrLmNvbmYuc3BsaXQpe2suY29sbGVjdGlvbj1odCgiPCIrdi5jb250YWluZXIudGFnKyIvPiIpLGsuY29uZi5fY29sbGVjdGlvbj1rLmNvbGxlY3Rpb247Zm9yKHZhciBQPTA7UDxrLmNvbmYuc3BsaXQubGVuZ3RoO1ArKyl7dmFyIEY9ay5jb25mLnNwbGl0W1BdO3R5cGVvZiBGPT0ib2JqZWN0IiYmKEYucGFyZW50PWwsRi5jb2xsZWN0aW9uTGF5b3V0PT09dm9pZCAwJiYoRi5jb2xsZWN0aW9uTGF5b3V0PWsuY29uZi5jb2xsZWN0aW9uTGF5b3V0KSxGLmRyb3B1cD09PXZvaWQgMCYmKEYuZHJvcHVwPWsuY29uZi5kcm9wdXApLEYuZmFkZT09PXZvaWQgMCYmKEYuZmFkZT1rLmNvbmYuZmFkZSkpfXRoaXMuX2V4cGFuZEJ1dHRvbihrLmJ1dHRvbnMsay5jb25mLmJ1dHRvbnMsay5jb25mLnNwbGl0LCFwLHAsYSxrLmNvbmYpfWsuY29uZi5wYXJlbnQ9bCx3LmluaXQmJncuaW5pdC5jYWxsKHUuYnV0dG9uKGsubm9kZSksdSxodChrLm5vZGUpLHcpfX19fSxfYnVpbGRCdXR0b246ZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9dGhpcyxhPXRoaXMuYy5kb20sbCx1PXRoaXMucy5kdCxwPWZ1bmN0aW9uKGV0KXtyZXR1cm4gdHlwZW9mIGV0PT0iZnVuY3Rpb24iP2V0KHUsZyx0KTpldH0sdj1odC5leHRlbmQoITAse30sYS5idXR0b24pO2lmKGUmJnImJmEuY29sbGVjdGlvbi5zcGxpdD9odC5leHRlbmQoITAsdixhLmNvbGxlY3Rpb24uc3BsaXQuYWN0aW9uKTpufHxlP2h0LmV4dGVuZCghMCx2LGEuY29sbGVjdGlvbi5idXR0b24pOnImJmh0LmV4dGVuZCghMCx2LGEuc3BsaXQuYnV0dG9uKSx0LnNwYWNlcil7dmFyIG09aHQoIjwiK3Yuc3BhY2VyLnRhZysiLz4iKS5hZGRDbGFzcygiZHQtYnV0dG9uLXNwYWNlciAiK3Quc3R5bGUrIiAiK3Yuc3BhY2VyLmNsYXNzTmFtZSkuaHRtbChwKHQudGV4dCkpO3JldHVybntjb25mOnQsbm9kZTptLGluc2VydGVyOm0sYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0OnIsY29sbGVjdGlvbjpudWxsLHRleHROb2RlOm19fWlmKHQuYXZhaWxhYmxlJiYhdC5hdmFpbGFibGUodSx0KSYmIXQuaHRtbClyZXR1cm4hMTt2YXIgZztpZih0Lmh0bWwpZz1odCh0Lmh0bWwpO2Vsc2V7dmFyIFQ9ZnVuY3Rpb24oZXQsRSxaLHksXyl7eS5hY3Rpb24uY2FsbChFLmJ1dHRvbihaKSxldCxFLFoseSxfKSxodChFLnRhYmxlKCkubm9kZSgpKS50cmlnZ2VySGFuZGxlcigiYnV0dG9ucy1hY3Rpb24uZHQiLFtFLmJ1dHRvbihaKSxFLFoseV0pfSx3PWZ1bmN0aW9uKGV0LEUsWix5KXt5LmFzeW5jPyhzLnByb2Nlc3NpbmcoWlswXSwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe1QoZXQsRSxaLHksZnVuY3Rpb24oKXtzLnByb2Nlc3NpbmcoWlswXSwhMSl9KX0seS5hc3luYykpOlQoZXQsRSxaLHksZnVuY3Rpb24oKXt9KX0saz10LnRhZ3x8di50YWcsUD10LmNsaWNrQmx1cnM9PT12b2lkIDA/ITA6dC5jbGlja0JsdXJzO2lmKGc9aHQoIjwiK2srIi8+IikuYWRkQ2xhc3Modi5jbGFzc05hbWUpLmF0dHIoInRhYmluZGV4Iix0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5pVGFiSW5kZXgpLmF0dHIoImFyaWEtY29udHJvbHMiLHRoaXMucy5kdC50YWJsZSgpLm5vZGUoKS5pZCkub24oImNsaWNrLmR0YiIsZnVuY3Rpb24oZXQpe2V0LnByZXZlbnREZWZhdWx0KCksIWcuaGFzQ2xhc3Modi5kaXNhYmxlZCkmJnQuYWN0aW9uJiZ3KGV0LHUsZyx0KSxQJiZnLnRyaWdnZXIoImJsdXIiKX0pLm9uKCJrZXlwcmVzcy5kdGIiLGZ1bmN0aW9uKGV0KXtldC5rZXlDb2RlPT09MTMmJihldC5wcmV2ZW50RGVmYXVsdCgpLCFnLmhhc0NsYXNzKHYuZGlzYWJsZWQpJiZ0LmFjdGlvbiYmdyhldCx1LGcsdCkpfSksay50b0xvd2VyQ2FzZSgpPT09ImEiJiZnLmF0dHIoImhyZWYiLCIjIiksay50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiImJmcuYXR0cigidHlwZSIsImJ1dHRvbiIpLHYubGluZXIudGFnKXt2YXIgRj1odCgiPCIrdi5saW5lci50YWcrIi8+IikuaHRtbChwKHQudGV4dCkpLmFkZENsYXNzKHYubGluZXIuY2xhc3NOYW1lKTt2LmxpbmVyLnRhZy50b0xvd2VyQ2FzZSgpPT09ImEiJiZGLmF0dHIoImhyZWYiLCIjIiksZy5hcHBlbmQoRiksbD1GfWVsc2UgZy5odG1sKHAodC50ZXh0KSksbD1nO3QuZW5hYmxlZD09PSExJiZnLmFkZENsYXNzKHYuZGlzYWJsZWQpLHQuY2xhc3NOYW1lJiZnLmFkZENsYXNzKHQuY2xhc3NOYW1lKSx0LnRpdGxlQXR0ciYmZy5hdHRyKCJ0aXRsZSIscCh0LnRpdGxlQXR0cikpLHQuYXR0ciYmZy5hdHRyKHQuYXR0ciksdC5uYW1lc3BhY2V8fCh0Lm5hbWVzcGFjZT0iLmR0LWJ1dHRvbi0iK0RsKyspLHQuY29uZmlnIT09dm9pZCAwJiZ0LmNvbmZpZy5zcGxpdCYmKHQuc3BsaXQ9dC5jb25maWcuc3BsaXQpfXZhciBoPXRoaXMuYy5kb20uYnV0dG9uQ29udGFpbmVyLG87aCYmaC50YWc/bz1odCgiPCIraC50YWcrIi8+IikuYWRkQ2xhc3MoaC5jbGFzc05hbWUpLmFwcGVuZChnKTpvPWcsdGhpcy5fYWRkS2V5KHQpLHRoaXMuYy5idXR0b25DcmVhdGVkJiYobz10aGlzLmMuYnV0dG9uQ3JlYXRlZCh0LG8pKTt2YXIgZjtpZihyKXt2YXIgQz1lP2h0LmV4dGVuZCghMCx0aGlzLmMuZG9tLnNwbGl0LHRoaXMuYy5kb20uY29sbGVjdGlvbi5zcGxpdCk6dGhpcy5jLmRvbS5zcGxpdCxCPUMud3JhcHBlcjtmPWh0KCI8IitCLnRhZysiLz4iKS5hZGRDbGFzcyhCLmNsYXNzTmFtZSkuYXBwZW5kKGcpO3ZhciBjPWh0LmV4dGVuZCh0LHthbGlnbjpDLmRyb3Bkb3duLmFsaWduLGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIiwiYXJpYS1leHBhbmRlZCI6ITF9LGNsYXNzTmFtZTpDLmRyb3Bkb3duLmNsYXNzTmFtZSxjbG9zZUJ1dHRvbjohMSxzcGxpdEFsaWduQ2xhc3M6Qy5kcm9wZG93bi5zcGxpdEFsaWduQ2xhc3MsdGV4dDpDLmRyb3Bkb3duLnRleHR9KTt0aGlzLl9hZGRLZXkoYyk7dmFyIHo9ZnVuY3Rpb24oZXQsRSxaLHkpe0NlLnNwbGl0LmFjdGlvbi5jYWxsKEUuYnV0dG9uKGYpLGV0LEUsWix5KSxodChFLnRhYmxlKCkubm9kZSgpKS50cmlnZ2VySGFuZGxlcigiYnV0dG9ucy1hY3Rpb24uZHQiLFtFLmJ1dHRvbihaKSxFLFoseV0pLFouYXR0cigiYXJpYS1leHBhbmRlZCIsITApfSxHPWh0KCc8YnV0dG9uIGNsYXNzPSInK0MuZHJvcGRvd24uY2xhc3NOYW1lKycgZHQtYnV0dG9uIj48L2J1dHRvbj4nKS5odG1sKEMuZHJvcGRvd24uZHJvcEh0bWwpLm9uKCJjbGljay5kdGIiLGZ1bmN0aW9uKGV0KXtldC5wcmV2ZW50RGVmYXVsdCgpLGV0LnN0b3BQcm9wYWdhdGlvbigpLEcuaGFzQ2xhc3Modi5kaXNhYmxlZCl8fHooZXQsdSxHLGMpLFAmJkcudHJpZ2dlcigiYmx1ciIpfSkub24oImtleXByZXNzLmR0YiIsZnVuY3Rpb24oZXQpe2V0LmtleUNvZGU9PT0xMyYmKGV0LnByZXZlbnREZWZhdWx0KCksRy5oYXNDbGFzcyh2LmRpc2FibGVkKXx8eihldCx1LEcsYykpfSk7dC5zcGxpdC5sZW5ndGg9PT0wJiZHLmFkZENsYXNzKCJkdGItaGlkZS1kcm9wIiksZi5hcHBlbmQoRykuYXR0cihjLmF0dHIpfXJldHVybntjb25mOnQsbm9kZTpyP2YuZ2V0KDApOmcuZ2V0KDApLGluc2VydGVyOnI/ZjpvLGJ1dHRvbnM6W10saW5Db2xsZWN0aW9uOmUsaXNTcGxpdDpyLGluU3BsaXQ6bixjb2xsZWN0aW9uOm51bGwsdGV4dE5vZGU6bH19LF9ub2RlVG9CdXR0b246ZnVuY3Rpb24odCxlKXtlfHwoZT10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtpZihlW3JdLm5vZGU9PT10KXJldHVybiBlW3JdO2lmKGVbcl0uYnV0dG9ucy5sZW5ndGgpe3ZhciBzPXRoaXMuX25vZGVUb0J1dHRvbih0LGVbcl0uYnV0dG9ucyk7aWYocylyZXR1cm4gc319fSxfbm9kZVRvSG9zdDpmdW5jdGlvbih0LGUpe2V8fChlPXRoaXMucy5idXR0b25zKTtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2lmKGVbcl0ubm9kZT09PXQpcmV0dXJuIGU7aWYoZVtyXS5idXR0b25zLmxlbmd0aCl7dmFyIHM9dGhpcy5fbm9kZVRvSG9zdCh0LGVbcl0uYnV0dG9ucyk7aWYocylyZXR1cm4gc319fSxfa2V5cHJlc3M6ZnVuY3Rpb24odCxlKXtpZighZS5fYnV0dG9uc0hhbmRsZWQpe3ZhciByPWZ1bmN0aW9uKHMsYSl7aWYocy5rZXkpe2lmKHMua2V5PT09dCllLl9idXR0b25zSGFuZGxlZD0hMCxodChhKS5jbGljaygpO2Vsc2UgaWYoaHQuaXNQbGFpbk9iamVjdChzLmtleSkpe2lmKHMua2V5LmtleSE9PXR8fHMua2V5LnNoaWZ0S2V5JiYhZS5zaGlmdEtleXx8cy5rZXkuYWx0S2V5JiYhZS5hbHRLZXl8fHMua2V5LmN0cmxLZXkmJiFlLmN0cmxLZXl8fHMua2V5Lm1ldGFLZXkmJiFlLm1ldGFLZXkpcmV0dXJuO2UuX2J1dHRvbnNIYW5kbGVkPSEwLGh0KGEpLmNsaWNrKCl9fX0sbj1mdW5jdGlvbihzKXtmb3IodmFyIGE9MCxsPXMubGVuZ3RoO2E8bDthKyspcihzW2FdLmNvbmYsc1thXS5ub2RlKSxzW2FdLmJ1dHRvbnMubGVuZ3RoJiZuKHNbYV0uYnV0dG9ucyl9O24odGhpcy5zLmJ1dHRvbnMpfX0sX3JlbW92ZUtleTpmdW5jdGlvbih0KXtpZih0LmtleSl7dmFyIGU9aHQuaXNQbGFpbk9iamVjdCh0LmtleSk/dC5rZXkua2V5OnQua2V5LHI9dGhpcy5zLmxpc3RlbktleXMuc3BsaXQoIiIpLG49aHQuaW5BcnJheShlLHIpO3Iuc3BsaWNlKG4sMSksdGhpcy5zLmxpc3RlbktleXM9ci5qb2luKCIiKX19LF9yZXNvbHZlRXh0ZW5kczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dGhpcy5zLmR0LG4scyxhPWZ1bmN0aW9uKG0pe2Zvcih2YXIgZz0wOyFodC5pc1BsYWluT2JqZWN0KG0pJiYhQXJyYXkuaXNBcnJheShtKTspe2lmKG09PT12b2lkIDApcmV0dXJuO2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKXtpZihtPW0uY2FsbChlLHIsdCksIW0pcmV0dXJuITF9ZWxzZSBpZih0eXBlb2YgbT09InN0cmluZyIpe2lmKCFDZVttXSlyZXR1cm57aHRtbDptfTttPUNlW21dfWlmKGcrKyxnPjMwKXRocm93IkJ1dHRvbnM6IFRvbyBtYW55IGl0ZXJhdGlvbnMifXJldHVybiBBcnJheS5pc0FycmF5KG0pP206aHQuZXh0ZW5kKHt9LG0pfTtmb3IodD1hKHQpO3QmJnQuZXh0ZW5kOyl7aWYoIUNlW3QuZXh0ZW5kXSl0aHJvdyJDYW5ub3QgZXh0ZW5kIHVua25vd24gYnV0dG9uIHR5cGU6ICIrdC5leHRlbmQ7dmFyIGw9YShDZVt0LmV4dGVuZF0pO2lmKEFycmF5LmlzQXJyYXkobCkpcmV0dXJuIGw7aWYoIWwpcmV0dXJuITE7dmFyIHU9bC5jbGFzc05hbWU7dC5jb25maWchPT12b2lkIDAmJmwuY29uZmlnIT09dm9pZCAwJiYodC5jb25maWc9aHQuZXh0ZW5kKHt9LGwuY29uZmlnLHQuY29uZmlnKSksdD1odC5leHRlbmQoe30sbCx0KSx1JiZ0LmNsYXNzTmFtZSE9PXUmJih0LmNsYXNzTmFtZT11KyIgIit0LmNsYXNzTmFtZSksdC5leHRlbmQ9bC5leHRlbmR9dmFyIHA9dC5wb3N0Zml4QnV0dG9ucztpZihwKWZvcih0LmJ1dHRvbnN8fCh0LmJ1dHRvbnM9W10pLG49MCxzPXAubGVuZ3RoO248cztuKyspdC5idXR0b25zLnB1c2gocFtuXSk7dmFyIHY9dC5wcmVmaXhCdXR0b25zO2lmKHYpZm9yKHQuYnV0dG9uc3x8KHQuYnV0dG9ucz1bXSksbj0wLHM9di5sZW5ndGg7bjxzO24rKyl0LmJ1dHRvbnMuc3BsaWNlKG4sMCx2W25dKTtyZXR1cm4gdH0sX3BvcG92ZXI6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUscz10aGlzLmMsYT0hMSxsPWh0LmV4dGVuZCh7YWxpZ246ImJ1dHRvbi1sZWZ0IixhdXRvQ2xvc2U6ITEsYmFja2dyb3VuZDohMCxiYWNrZ3JvdW5kQ2xhc3NOYW1lOiJkdC1idXR0b24tYmFja2dyb3VuZCIsY2xvc2VCdXR0b246ITAsY29udGFpbmVyQ2xhc3NOYW1lOnMuZG9tLmNvbGxlY3Rpb24uY29udGFpbmVyLmNsYXNzTmFtZSxjb250ZW50Q2xhc3NOYW1lOnMuZG9tLmNvbGxlY3Rpb24uY29udGFpbmVyLmNvbnRlbnQuY2xhc3NOYW1lLGNvbGxlY3Rpb25MYXlvdXQ6IiIsY29sbGVjdGlvblRpdGxlOiIiLGRyb3B1cDohMSxmYWRlOjQwMCxwb3BvdmVyVGl0bGU6IiIscmlnaHRBbGlnbkNsYXNzTmFtZToiZHQtYnV0dG9uLXJpZ2h0Iix0YWc6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIudGFnfSxyKSx1PWwudGFnKyIuIitsLmNvbnRhaW5lckNsYXNzTmFtZS5yZXBsYWNlKC8gL2csIi4iKSxwPWUubm9kZSgpLHY9ZnVuY3Rpb24oKXthPSEwLFJpKGh0KHUpLGwuZmFkZSxmdW5jdGlvbigpe2h0KHRoaXMpLmRldGFjaCgpfSksaHQobi5idXR0b25zKCdbYXJpYS1oYXNwb3B1cD0iZGlhbG9nIl1bYXJpYS1leHBhbmRlZD0idHJ1ZSJdJykubm9kZXMoKSkuYXR0cigiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksaHQoImRpdi5kdC1idXR0b24tYmFja2dyb3VuZCIpLm9mZigiY2xpY2suZHRiLWNvbGxlY3Rpb24iKSxyZS5iYWNrZ3JvdW5kKCExLGwuYmFja2dyb3VuZENsYXNzTmFtZSxsLmZhZGUscCksaHQod2luZG93KS5vZmYoInJlc2l6ZS5yZXNpemUuZHRiLWNvbGxlY3Rpb24iKSxodCgiYm9keSIpLm9mZigiLmR0Yi1jb2xsZWN0aW9uIiksbi5vZmYoImJ1dHRvbnMtYWN0aW9uLmItaW50ZXJuYWwiKSxuLm9mZigiZGVzdHJveSIpfTtpZih0PT09ITEpe3YoKTtyZXR1cm59dmFyIG09aHQobi5idXR0b25zKCdbYXJpYS1oYXNwb3B1cD0iZGlhbG9nIl1bYXJpYS1leHBhbmRlZD0idHJ1ZSJdJykubm9kZXMoKSk7bS5sZW5ndGgmJihwLmNsb3Nlc3QodSkubGVuZ3RoJiYocD1tLmVxKDApKSx2KCkpO3ZhciBnPWh0KCIuZHQtYnV0dG9uIix0KS5sZW5ndGgsVD0iIjtnPT09Mz9UPSJkdGItYjMiOmc9PT0yP1Q9ImR0Yi1iMiI6Zz09PTEmJihUPSJkdGItYjEiKTt2YXIgdz1odCgiPCIrbC50YWcrIi8+IikuYWRkQ2xhc3MobC5jb250YWluZXJDbGFzc05hbWUpLmFkZENsYXNzKGwuY29sbGVjdGlvbkxheW91dCkuYWRkQ2xhc3MobC5zcGxpdEFsaWduQ2xhc3MpLmFkZENsYXNzKFQpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5hdHRyKHsiYXJpYS1tb2RhbCI6ITAscm9sZToiZGlhbG9nIn0pO3Q9aHQodCkuYWRkQ2xhc3MobC5jb250ZW50Q2xhc3NOYW1lKS5hdHRyKCJyb2xlIiwibWVudSIpLmFwcGVuZFRvKHcpLHAuYXR0cigiYXJpYS1leHBhbmRlZCIsInRydWUiKSxwLnBhcmVudHMoImJvZHkiKVswXSE9PWRvY3VtZW50LmJvZHkmJihwPWRvY3VtZW50LmJvZHkubGFzdENoaWxkKSxsLnBvcG92ZXJUaXRsZT93LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0LWJ1dHRvbi1jb2xsZWN0aW9uLXRpdGxlIj4nK2wucG9wb3ZlclRpdGxlKyI8L2Rpdj4iKTpsLmNvbGxlY3Rpb25UaXRsZSYmdy5wcmVwZW5kKCc8ZGl2IGNsYXNzPSJkdC1idXR0b24tY29sbGVjdGlvbi10aXRsZSI+JytsLmNvbGxlY3Rpb25UaXRsZSsiPC9kaXY+IiksbC5jbG9zZUJ1dHRvbiYmdy5wcmVwZW5kKCc8ZGl2IGNsYXNzPSJkdGItcG9wb3Zlci1jbG9zZSI+JnRpbWVzOzwvZGl2PicpLmFkZENsYXNzKCJkdGItY29sbGVjdGlvbi1jbG9zZWFibGUiKSxFaSh3Lmluc2VydEFmdGVyKHApLGwuZmFkZSk7dmFyIGs9aHQoZS50YWJsZSgpLmNvbnRhaW5lcigpKSxQPXcuY3NzKCJwb3NpdGlvbiIpO2lmKChsLnNwYW49PT0iY29udGFpbmVyInx8bC5hbGlnbj09PSJkdC1jb250YWluZXIiKSYmKHA9cC5wYXJlbnQoKSx3LmNzcygid2lkdGgiLGsud2lkdGgoKSkpLFA9PT0iYWJzb2x1dGUiKXt2YXIgRj1odChwWzBdLm9mZnNldFBhcmVudCksaD1wLnBvc2l0aW9uKCksbz1wLm9mZnNldCgpLGY9Ri5vZmZzZXQoKSxDPUYucG9zaXRpb24oKSxCPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKEZbMF0pO2YuaGVpZ2h0PUYub3V0ZXJIZWlnaHQoKSxmLndpZHRoPUYud2lkdGgoKStwYXJzZUZsb2F0KEIucGFkZGluZ0xlZnQpLGYucmlnaHQ9Zi5sZWZ0K2Yud2lkdGgsZi5ib3R0b209Zi50b3ArZi5oZWlnaHQ7dmFyIGM9aC50b3ArcC5vdXRlckhlaWdodCgpLHo9aC5sZWZ0O3cuY3NzKHt0b3A6YyxsZWZ0Onp9KSxCPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHdbMF0pO3ZhciBHPXcub2Zmc2V0KCk7Ry5oZWlnaHQ9dy5vdXRlckhlaWdodCgpLEcud2lkdGg9dy5vdXRlcldpZHRoKCksRy5yaWdodD1HLmxlZnQrRy53aWR0aCxHLmJvdHRvbT1HLnRvcCtHLmhlaWdodCxHLm1hcmdpblRvcD1wYXJzZUZsb2F0KEIubWFyZ2luVG9wKSxHLm1hcmdpbkJvdHRvbT1wYXJzZUZsb2F0KEIubWFyZ2luQm90dG9tKSxsLmRyb3B1cCYmKGM9aC50b3AtRy5oZWlnaHQtRy5tYXJnaW5Ub3AtRy5tYXJnaW5Cb3R0b20pLChsLmFsaWduPT09ImJ1dHRvbi1yaWdodCJ8fHcuaGFzQ2xhc3MobC5yaWdodEFsaWduQ2xhc3NOYW1lKSkmJih6PWgubGVmdC1HLndpZHRoK3Aub3V0ZXJXaWR0aCgpKSwobC5hbGlnbj09PSJkdC1jb250YWluZXIifHxsLmFsaWduPT09ImNvbnRhaW5lciIpJiZ6PGgubGVmdCYmKHo9LWgubGVmdCksQy5sZWZ0K3orRy53aWR0aD5odCh3aW5kb3cpLndpZHRoKCkmJih6PWh0KHdpbmRvdykud2lkdGgoKS1HLndpZHRoLUMubGVmdCksby5sZWZ0K3o8MCYmKHo9LW8ubGVmdCksQy50b3ArYytHLmhlaWdodD5odCh3aW5kb3cpLmhlaWdodCgpK2h0KHdpbmRvdykuc2Nyb2xsVG9wKCkmJihjPWgudG9wLUcuaGVpZ2h0LUcubWFyZ2luVG9wLUcubWFyZ2luQm90dG9tKSxDLnRvcCtjPGh0KHdpbmRvdykuc2Nyb2xsVG9wKCkmJihjPWgudG9wK3Aub3V0ZXJIZWlnaHQoKSksdy5jc3Moe3RvcDpjLGxlZnQ6en0pfWVsc2V7dmFyIGV0PWZ1bmN0aW9uKCl7dmFyIEU9aHQod2luZG93KS5oZWlnaHQoKS8yLFo9dy5oZWlnaHQoKS8yO1o+RSYmKFo9RSksdy5jc3MoIm1hcmdpblRvcCIsWiotMSl9O2V0KCksaHQod2luZG93KS5vbigicmVzaXplLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbigpe2V0KCl9KX1sLmJhY2tncm91bmQmJnJlLmJhY2tncm91bmQoITAsbC5iYWNrZ3JvdW5kQ2xhc3NOYW1lLGwuZmFkZSxsLmJhY2tncm91bmRIb3N0fHxwKSxodCgiZGl2LmR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikub24oImNsaWNrLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbigpe30pLGwuYXV0b0Nsb3NlJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5vbigiYnV0dG9ucy1hY3Rpb24uYi1pbnRlcm5hbCIsZnVuY3Rpb24oRSxaLHksXyl7X1swXSE9PXBbMF0mJnYoKX0pfSwwKSxodCh3KS50cmlnZ2VyKCJidXR0b25zLXBvcG92ZXIuZHQiKSxuLm9uKCJkZXN0cm95Iix2KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT0hMSxodCgiYm9keSIpLm9uKCJjbGljay5kdGItY29sbGVjdGlvbiIsZnVuY3Rpb24oRSl7aWYoIWEpe3ZhciBaPWh0LmZuLmFkZEJhY2s/ImFkZEJhY2siOiJhbmRTZWxmIix5PWh0KEUudGFyZ2V0KS5wYXJlbnQoKVswXTsoIWh0KEUudGFyZ2V0KS5wYXJlbnRzKClbWl0oKS5maWx0ZXIodCkubGVuZ3RoJiYhaHQoeSkuaGFzQ2xhc3MoImR0LWJ1dHRvbnMiKXx8aHQoRS50YXJnZXQpLmhhc0NsYXNzKCJkdC1idXR0b24tYmFja2dyb3VuZCIpKSYmdigpfX0pLm9uKCJrZXl1cC5kdGItY29sbGVjdGlvbiIsZnVuY3Rpb24oRSl7RS5rZXlDb2RlPT09MjcmJnYoKX0pLm9uKCJrZXlkb3duLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXt2YXIgWj1odCgiYSwgYnV0dG9uIix0KSx5PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7RS5rZXlDb2RlPT09OSYmKFouaW5kZXgoeSk9PT0tMT8oWi5maXJzdCgpLmZvY3VzKCksRS5wcmV2ZW50RGVmYXVsdCgpKTpFLnNoaWZ0S2V5P3k9PT1aWzBdJiYoWi5sYXN0KCkuZm9jdXMoKSxFLnByZXZlbnREZWZhdWx0KCkpOnk9PT1aLmxhc3QoKVswXSYmKFouZmlyc3QoKS5mb2N1cygpLEUucHJldmVudERlZmF1bHQoKSkpfSl9LDApfX0pO3JlLmJhY2tncm91bmQ9ZnVuY3Rpb24odCxlLHIsbil7cj09PXZvaWQgMCYmKHI9NDAwKSxufHwobj1kb2N1bWVudC5ib2R5KSx0P0VpKGh0KCI8ZGl2Lz4iKS5hZGRDbGFzcyhlKS5jc3MoImRpc3BsYXkiLCJub25lIikuaW5zZXJ0QWZ0ZXIobikscik6UmkoaHQoImRpdi4iK2UpLHIsZnVuY3Rpb24oKXtodCh0aGlzKS5yZW1vdmVDbGFzcyhlKS5yZW1vdmUoKX0pfTtyZS5pbnN0YW5jZVNlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7aWYodD09bnVsbClyZXR1cm4gaHQubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdH0pO3ZhciByPVtdLG49aHQubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0pLHM9ZnVuY3Rpb24oYSl7aWYoQXJyYXkuaXNBcnJheShhKSl7Zm9yKHZhciBsPTAsdT1hLmxlbmd0aDtsPHU7bCsrKXMoYVtsXSk7cmV0dXJufWlmKHR5cGVvZiBhPT0ic3RyaW5nIilpZihhLmluZGV4T2YoIiwiKSE9PS0xKXMoYS5zcGxpdCgiLCIpKTtlbHNle3ZhciBwPWh0LmluQXJyYXkoYS50cmltKCksbik7cCE9PS0xJiZyLnB1c2goZVtwXS5pbnN0KX1lbHNlIHR5cGVvZiBhPT0ibnVtYmVyIj9yLnB1c2goZVthXS5pbnN0KTp0eXBlb2YgYT09Im9iamVjdCImJnIucHVzaChhKX07cmV0dXJuIHModCkscn07cmUuYnV0dG9uU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9W10sbj1mdW5jdGlvbihwLHYsbSl7Zm9yKHZhciBnLFQsdz0wLGs9di5sZW5ndGg7dzxrO3crKylnPXZbd10sZyYmKFQ9bSE9PXZvaWQgMD9tK3c6dysiIixwLnB1c2goe25vZGU6Zy5ub2RlLG5hbWU6Zy5jb25mLm5hbWUsaWR4OlR9KSxnLmJ1dHRvbnMmJm4ocCxnLmJ1dHRvbnMsVCsiLSIpKX0scz1mdW5jdGlvbihwLHYpe3ZhciBtLGcsVD1bXTtuKFQsdi5zLmJ1dHRvbnMpO3ZhciB3PWh0Lm1hcChULGZ1bmN0aW9uKG8pe3JldHVybiBvLm5vZGV9KTtpZihBcnJheS5pc0FycmF5KHApfHxwIGluc3RhbmNlb2YgaHQpe2ZvcihtPTAsZz1wLmxlbmd0aDttPGc7bSsrKXMocFttXSx2KTtyZXR1cm59aWYocD09bnVsbHx8cD09PSIqIilmb3IobT0wLGc9VC5sZW5ndGg7bTxnO20rKylyLnB1c2goe2luc3Q6dixub2RlOlRbbV0ubm9kZX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJudW1iZXIiKXYucy5idXR0b25zW3BdJiZyLnB1c2goe2luc3Q6dixub2RlOnYucy5idXR0b25zW3BdLm5vZGV9KTtlbHNlIGlmKHR5cGVvZiBwPT0ic3RyaW5nIilpZihwLmluZGV4T2YoIiwiKSE9PS0xKXt2YXIgaz1wLnNwbGl0KCIsIik7Zm9yKG09MCxnPWsubGVuZ3RoO208ZzttKyspcyhrW21dLnRyaW0oKSx2KX1lbHNlIGlmKHAubWF0Y2goL15cZCsoXC1cZCspKiQvKSl7dmFyIFA9aHQubWFwKFQsZnVuY3Rpb24obyl7cmV0dXJuIG8uaWR4fSk7ci5wdXNoKHtpbnN0OnYsbm9kZTpUW2h0LmluQXJyYXkocCxQKV0ubm9kZX0pfWVsc2UgaWYocC5pbmRleE9mKCI6bmFtZSIpIT09LTEpe3ZhciBGPXAucmVwbGFjZSgiOm5hbWUiLCIiKTtmb3IobT0wLGc9VC5sZW5ndGg7bTxnO20rKylUW21dLm5hbWU9PT1GJiZyLnB1c2goe2luc3Q6dixub2RlOlRbbV0ubm9kZX0pfWVsc2UgaHQodykuZmlsdGVyKHApLmVhY2goZnVuY3Rpb24oKXtyLnB1c2goe2luc3Q6dixub2RlOnRoaXN9KX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJvYmplY3QiJiZwLm5vZGVOYW1lKXt2YXIgaD1odC5pbkFycmF5KHAsdyk7aCE9PS0xJiZyLnB1c2goe2luc3Q6dixub2RlOndbaF19KX19LGE9MCxsPXQubGVuZ3RoO2E8bDthKyspe3ZhciB1PXRbYV07cyhlLHUpfXJldHVybiByfTtyZS5zdHJpcERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmcifHwodD10LnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksIiIpLHQ9dC5yZXBsYWNlKC88IVwtXC0uKj9cLVwtPi9nLCIiKSwoIWV8fGUuc3RyaXBIdG1sKSYmKHQ9dC5yZXBsYWNlKC88W14+XSo+L2csIiIpKSwoIWV8fGUudHJpbSkmJih0PXQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpKSwoIWV8fGUuc3RyaXBOZXdsaW5lcykmJih0PXQucmVwbGFjZSgvXG4vZywiICIpKSwoIWV8fGUuZGVjb2RlRW50aXRpZXMpJiYoT2k/dD1PaSh0KTooYnMuaW5uZXJIVE1MPXQsdD1icy52YWx1ZSkpKSx0fTtyZS5lbnRpdHlEZWNvZGVyPWZ1bmN0aW9uKHQpe09pPXR9O3JlLmRlZmF1bHRzPXtidXR0b25zOlsiY29weSIsImV4Y2VsIiwiY3N2IiwicGRmIiwicHJpbnQiXSxuYW1lOiJtYWluIix0YWJJbmRleDowLGRvbTp7Y29udGFpbmVyOnt0YWc6ImRpdiIsY2xhc3NOYW1lOiJkdC1idXR0b25zIn0sY29sbGVjdGlvbjp7YWN0aW9uOntkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nfSxjb250YWluZXI6e2NsYXNzTmFtZToiZHQtYnV0dG9uLWNvbGxlY3Rpb24iLGNvbnRlbnQ6e2NsYXNzTmFtZToiIix0YWc6ImRpdiJ9LHRhZzoiZGl2In19LGJ1dHRvbjp7dGFnOiJidXR0b24iLGNsYXNzTmFtZToiZHQtYnV0dG9uIixhY3RpdmU6ImR0LWJ1dHRvbi1hY3RpdmUiLGRpc2FibGVkOiJkaXNhYmxlZCIsc3BhY2VyOntjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGFjZXIiLHRhZzoic3BhbiJ9LGxpbmVyOnt0YWc6InNwYW4iLGNsYXNzTmFtZToiIn19LHNwbGl0OnthY3Rpb246e2NsYXNzTmFtZToiZHQtYnV0dG9uLXNwbGl0LWRyb3AtYnV0dG9uIGR0LWJ1dHRvbiIsdGFnOiJidXR0b24ifSxkcm9wZG93bjp7YWxpZ246InNwbGl0LXJpZ2h0IixjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGxpdC1kcm9wIixkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nLHNwbGl0QWxpZ25DbGFzczoiZHQtYnV0dG9uLXNwbGl0LWxlZnQiLHRhZzoiYnV0dG9uIn0sd3JhcHBlcjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tc3BsaXQiLHRhZzoiZGl2In19fX07cmUudmVyc2lvbj0iMy4wLjEiO2h0LmV4dGVuZChDZSx7Y29sbGVjdGlvbjp7dGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIil9LGNsYXNzTmFtZToiYnV0dG9ucy1jb2xsZWN0aW9uIixjbG9zZUJ1dHRvbjohMSxpbml0OmZ1bmN0aW9uKHQsZSl7ZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuKXtuLl9jb2xsZWN0aW9uLnBhcmVudHMoImJvZHkiKS5sZW5ndGg/dGhpcy5wb3BvdmVyKCExLG4pOnRoaXMucG9wb3ZlcihuLl9jb2xsZWN0aW9uLG4pLHQudHlwZT09PSJrZXlwcmVzcyImJmh0KCJhLCBidXR0b24iLG4uX2NvbGxlY3Rpb24pLmVxKDApLmZvY3VzKCl9LGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIn19LHNwbGl0Ont0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuc3BsaXQiLCJTcGxpdCIpfSxjbGFzc05hbWU6ImJ1dHRvbnMtc3BsaXQiLGNsb3NlQnV0dG9uOiExLGluaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuKXt0aGlzLnBvcG92ZXIobi5fY29sbGVjdGlvbixuKX0sYXR0cjp7ImFyaWEtaGFzcG9wdXAiOiJkaWFsb2cifX0sY29weTpmdW5jdGlvbigpe2lmKENlLmNvcHlIdG1sNSlyZXR1cm4iY29weUh0bWw1In0sY3N2OmZ1bmN0aW9uKHQsZSl7aWYoQ2UuY3N2SHRtbDUmJkNlLmNzdkh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJjc3ZIdG1sNSJ9LGV4Y2VsOmZ1bmN0aW9uKHQsZSl7aWYoQ2UuZXhjZWxIdG1sNSYmQ2UuZXhjZWxIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4iZXhjZWxIdG1sNSJ9LHBkZjpmdW5jdGlvbih0LGUpe2lmKENlLnBkZkh0bWw1JiZDZS5wZGZIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4icGRmSHRtbDUifSxwYWdlTGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXS5hTGVuZ3RoTWVudSxyPVtdLG49W10scz1mdW5jdGlvbih1KXtyZXR1cm4gdS5pMThuKCJidXR0b25zLnBhZ2VMZW5ndGgiLHsiLTEiOiJTaG93IGFsbCByb3dzIixfOiJTaG93ICVkIHJvd3MifSx1LnBhZ2UubGVuKCkpfTtpZihBcnJheS5pc0FycmF5KGVbMF0pKXI9ZVswXSxuPWVbMV07ZWxzZSBmb3IodmFyIGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIGw9ZVthXTtodC5pc1BsYWluT2JqZWN0KGwpPyhyLnB1c2gobC52YWx1ZSksbi5wdXNoKGwubGFiZWwpKTooci5wdXNoKGwpLG4ucHVzaChsKSl9cmV0dXJue2V4dGVuZDoiY29sbGVjdGlvbiIsdGV4dDpzLGNsYXNzTmFtZToiYnV0dG9ucy1wYWdlLWxlbmd0aCIsYXV0b0Nsb3NlOiEwLGJ1dHRvbnM6aHQubWFwKHIsZnVuY3Rpb24odSxwKXtyZXR1cm57dGV4dDpuW3BdLGNsYXNzTmFtZToiYnV0dG9uLXBhZ2UtbGVuZ3RoIixhY3Rpb246ZnVuY3Rpb24odixtKXttLnBhZ2UubGVuKHUpLmRyYXcoKX0saW5pdDpmdW5jdGlvbih2LG0sZyl7dmFyIFQ9dGhpcyx3PWZ1bmN0aW9uKCl7VC5hY3RpdmUodi5wYWdlLmxlbigpPT09dSl9O3Yub24oImxlbmd0aC5kdCIrZy5uYW1lc3BhY2UsdyksdygpfSxkZXN0cm95OmZ1bmN0aW9uKHYsbSxnKXt2Lm9mZigibGVuZ3RoLmR0IitnLm5hbWVzcGFjZSl9fX0pLGluaXQ6ZnVuY3Rpb24odSxwLHYpe3ZhciBtPXRoaXM7dS5vbigibGVuZ3RoLmR0Iit2Lm5hbWVzcGFjZSxmdW5jdGlvbigpe20udGV4dCh2LnRleHQpfSl9LGRlc3Ryb3k6ZnVuY3Rpb24odSxwLHYpe3Uub2ZmKCJsZW5ndGguZHQiK3YubmFtZXNwYWNlKX19fSxzcGFjZXI6e3N0eWxlOiJlbXB0eSIsc3BhY2VyOiEwLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5zcGFjZXIiLCIiKX19fSk7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkiLGZ1bmN0aW9uKHQsZSl7ZT09PXZvaWQgMCYmKGU9dCx0PXZvaWQgMCksdGhpcy5zZWxlY3Rvci5idXR0b25Hcm91cD10O3ZhciByPXRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihuKXtpZihuLl9idXR0b25zKXJldHVybiByZS5idXR0b25TZWxlY3RvcihyZS5pbnN0YW5jZVNlbGVjdG9yKHQsbi5fYnV0dG9ucyksZSl9LCEwKTtyZXR1cm4gci5fZ3JvdXBTZWxlY3Rvcj10LHJ9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuYnV0dG9ucyh0LGUpO3JldHVybiByLmxlbmd0aD4xJiZyLnNwbGljZSgxLHIubGVuZ3RoKSxyfSk7c3QuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aXZlKCkiLCJidXR0b24oKS5hY3RpdmUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3RpdmUoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aXZlKGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aW9uKCkiLCJidXR0b24oKS5hY3Rpb24oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3Rpb24oZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aW9uKGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuY29sbGVjdGlvblJlYnVpbGQoKSIsImJ1dHRvbigpLmNvbGxlY3Rpb25SZWJ1aWxkKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdHlwZW9mIHRbcl09PSJvYmplY3QiJiYodFtyXS5wYXJlbnRDb25mPWUpO2UuaW5zdC5jb2xsZWN0aW9uUmVidWlsZChlLm5vZGUsdCl9KX0pO3N0LkFwaS5yZWdpc3RlcihbImJ1dHRvbnMoKS5lbmFibGUoKSIsImJ1dHRvbigpLmVuYWJsZSgpIl0sZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuZW5hYmxlKGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyKFsiYnV0dG9ucygpLmRpc2FibGUoKSIsImJ1dHRvbigpLmRpc2FibGUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt0Lmluc3QuZGlzYWJsZSh0Lm5vZGUpfSl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpLmluZGV4KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9bnVsbDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciByPWUuaW5zdC5pbmRleChlLm5vZGUpO3IhPT1udWxsJiYodD1yKX0pLHR9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5ub2RlcygpIiwiYnV0dG9uKCkubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PWh0KCk7cmV0dXJuIGh0KHRoaXMuZWFjaChmdW5jdGlvbihlKXt0PXQuYWRkKGUuaW5zdC5ub2RlKGUubm9kZSkpfSkpLHR9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5wcm9jZXNzaW5nKCkiLCJidXR0b24oKS5wcm9jZXNzaW5nKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluc3QucHJvY2Vzc2luZyhlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5wcm9jZXNzaW5nKGUubm9kZSx0KX0pfSk7c3QuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkudGV4dCgpIiwiYnV0dG9uKCkudGV4dCgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LnRleHQoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QudGV4dChlLm5vZGUsdCl9KX0pO3N0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnRyaWdnZXIoKSIsImJ1dHRvbigpLnRyaWdnZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5ub2RlKHQubm9kZSkudHJpZ2dlcigiY2xpY2siKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b24oKS5wb3BvdmVyKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHIpe3JldHVybiByLmluc3QuX3BvcG92ZXIodCx0aGlzLmJ1dHRvbih0aGlzWzBdLm5vZGUpLGUpfSl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKS5jb250YWluZXJzKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9aHQoKSxlPXRoaXMuX2dyb3VwU2VsZWN0b3I7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihyKXtpZihyLl9idXR0b25zKWZvcih2YXIgbj1yZS5pbnN0YW5jZVNlbGVjdG9yKGUsci5fYnV0dG9ucykscz0wLGE9bi5sZW5ndGg7czxhO3MrKyl0PXQuYWRkKG5bc10uY29udGFpbmVyKCkpfSksdH0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9ucygpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcnMoKS5lcSgwKX0pO3N0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkuYWRkKCkiLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLmNvbnRleHQ7aWYobi5sZW5ndGgpe3ZhciBzPXJlLmluc3RhbmNlU2VsZWN0b3IodGhpcy5fZ3JvdXBTZWxlY3RvcixuWzBdLl9idXR0b25zKTtzLmxlbmd0aCYmc1swXS5hZGQoZSx0LHIpfXJldHVybiB0aGlzLmJ1dHRvbih0aGlzLl9ncm91cFNlbGVjdG9yLHQpfSk7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkuZGVzdHJveSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsdWNrKCJpbnN0IikudW5pcXVlKCkuZWFjaChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pLHRoaXN9KTtzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5yZW1vdmUoKSIsImJ1dHRvbnMoKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5yZW1vdmUodC5ub2RlKX0pLHRoaXN9KTt2YXIgS3I7c3QuQXBpLnJlZ2lzdGVyKCJidXR0b25zLmluZm8oKSIsZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXM7cmV0dXJuIHQ9PT0hMT8odGhpcy5vZmYoImRlc3Ryb3kuYnRuLWluZm8iKSxSaShodCgiI2RhdGF0YWJsZXNfYnV0dG9uc19pbmZvIiksNDAwLGZ1bmN0aW9uKCl7aHQodGhpcykucmVtb3ZlKCl9KSxjbGVhclRpbWVvdXQoS3IpLEtyPW51bGwsdGhpcyk6KEtyJiZjbGVhclRpbWVvdXQoS3IpLGh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5sZW5ndGgmJmh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5yZW1vdmUoKSx0PXQ/IjxoMj4iK3QrIjwvaDI+IjoiIixFaShodCgnPGRpdiBpZD0iZGF0YXRhYmxlc19idXR0b25zX2luZm8iIGNsYXNzPSJkdC1idXR0b24taW5mbyIvPicpLmh0bWwodCkuYXBwZW5kKGh0KCI8ZGl2Lz4iKVt0eXBlb2YgZT09InN0cmluZyI/Imh0bWwiOiJhcHBlbmQiXShlKSkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmFwcGVuZFRvKCJib2R5IikpLHIhPT12b2lkIDAmJnIhPT0wJiYoS3I9c2V0VGltZW91dChmdW5jdGlvbigpe24uYnV0dG9ucy5pbmZvKCExKX0scikpLHRoaXMub24oImRlc3Ryb3kuYnRuLWluZm8iLGZ1bmN0aW9uKCl7bi5idXR0b25zLmluZm8oITEpfSksdGhpcyl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0RGF0YSgpIixmdW5jdGlvbih0KXtpZih0aGlzLmNvbnRleHQubGVuZ3RoKXJldHVybiBQbChuZXcgc3QuQXBpKHRoaXMuY29udGV4dFswXSksdCl9KTtzdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0SW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdHx8KHQ9e30pLHtmaWxlbmFtZTpBbCh0LHRoaXMpLHRpdGxlOklsKHQsdGhpcyksbWVzc2FnZVRvcDpwcyh0aGlzLHQsdC5tZXNzYWdlfHx0Lm1lc3NhZ2VUb3AsInRvcCIpLG1lc3NhZ2VCb3R0b206cHModGhpcyx0LHQubWVzc2FnZUJvdHRvbSwiYm90dG9tIil9fSk7dmFyIEFsPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5maWxlbmFtZT09PSIqIiYmdC50aXRsZSE9PSIqIiYmdC50aXRsZSE9PXZvaWQgMCYmdC50aXRsZSE9PW51bGwmJnQudGl0bGUhPT0iIj90LnRpdGxlOnQuZmlsZW5hbWU7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiImJihyPXIodCxlKSkscj09bnVsbClyZXR1cm4gbnVsbDtyLmluZGV4T2YoIioiKSE9PS0xJiYocj1yLnJlcGxhY2UoIioiLGh0KCJoZWFkID4gdGl0bGUiKS50ZXh0KCkpLnRyaW0oKSkscj1yLnJlcGxhY2UoL1teYS16QS1aMC05X1x1MDBBMS1cdUZGRkZcLixcLV8gIVwoXCldL2csIiIpO3ZhciBuPUxpKHQuZXh0ZW5zaW9uLHQsZSk7cmV0dXJuIG58fChuPSIiKSxyK259LExpPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD09bnVsbD9udWxsOnR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSxyKTp0fSxJbD1mdW5jdGlvbih0LGUpe3ZhciByPUxpKHQudGl0bGUsdCxlKTtyZXR1cm4gcj09PW51bGw/bnVsbDpyLmluZGV4T2YoIioiKSE9PS0xP3IucmVwbGFjZSgiKiIsaHQoImhlYWQgPiB0aXRsZSIpLnRleHQoKXx8IkV4cG9ydGVkIGRhdGEiKTpyfSxwcz1mdW5jdGlvbih0LGUscixuKXt2YXIgcz1MaShyLGUsdCk7aWYocz09PW51bGwpcmV0dXJuIG51bGw7dmFyIGE9aHQoImNhcHRpb24iLHQudGFibGUoKS5jb250YWluZXIoKSkuZXEoMCk7aWYocz09PSIqIil7dmFyIGw9YS5jc3MoImNhcHRpb24tc2lkZSIpO3JldHVybiBsIT09bj9udWxsOmEubGVuZ3RoP2EudGV4dCgpOiIifXJldHVybiBzfSxicz1odCgiPHRleHRhcmVhLz4iKVswXSxQbD1mdW5jdGlvbih0LGUpe3ZhciByPWh0LmV4dGVuZCghMCx7fSx7cm93czpudWxsLGNvbHVtbnM6IiIsbW9kaWZpZXI6e3NlYXJjaDoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSxvcnRob2dvbmFsOiJkaXNwbGF5IixzdHJpcEh0bWw6ITAsc3RyaXBOZXdsaW5lczohMCxkZWNvZGVFbnRpdGllczohMCx0cmltOiEwLGZvcm1hdDp7aGVhZGVyOmZ1bmN0aW9uKEMpe3JldHVybiByZS5zdHJpcERhdGEoQyxyKX0sZm9vdGVyOmZ1bmN0aW9uKEMpe3JldHVybiByZS5zdHJpcERhdGEoQyxyKX0sYm9keTpmdW5jdGlvbihDKXtyZXR1cm4gcmUuc3RyaXBEYXRhKEMscil9fSxjdXN0b21pemVEYXRhOm51bGx9LGUpLG49dC5jb2x1bW5zKHIuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihDKXt2YXIgQj10LmNvbHVtbihDKTtyZXR1cm4gci5mb3JtYXQuaGVhZGVyKEIudGl0bGUoKSxDLEIuaGVhZGVyKCkpfSkudG9BcnJheSgpLHM9dC50YWJsZSgpLmZvb3RlcigpP3QuY29sdW1ucyhyLmNvbHVtbnMpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oQyl7dmFyIEI9dC5jb2x1bW4oQykuZm9vdGVyKCksYz0iIjtpZihCKXt2YXIgej1odCgiLmR0LWNvbHVtbi10aXRsZSIsQik7Yz16Lmxlbmd0aD96Lmh0bWwoKTpodChCKS5odG1sKCl9cmV0dXJuIHIuZm9ybWF0LmZvb3RlcihjLEMsQil9KS50b0FycmF5KCk6bnVsbCxhPWh0LmV4dGVuZCh7fSxyLm1vZGlmaWVyKTt0LnNlbGVjdCYmdHlwZW9mIHQuc2VsZWN0LmluZm89PSJmdW5jdGlvbiImJmEuc2VsZWN0ZWQ9PT12b2lkIDAmJnQucm93cyhyLnJvd3MsaHQuZXh0ZW5kKHtzZWxlY3RlZDohMH0sYSkpLmFueSgpJiZodC5leHRlbmQoYSx7c2VsZWN0ZWQ6ITB9KTtmb3IodmFyIGw9dC5yb3dzKHIucm93cyxhKS5pbmRleGVzKCkudG9BcnJheSgpLHU9dC5jZWxscyhsLHIuY29sdW1ucyx7b3JkZXI6YS5vcmRlcn0pLHA9dS5yZW5kZXIoci5vcnRob2dvbmFsKS50b0FycmF5KCksdj11Lm5vZGVzKCkudG9BcnJheSgpLG09dS5pbmRleGVzKCkudG9BcnJheSgpLGc9dC5jb2x1bW5zKHIuY29sdW1ucykuY291bnQoKSxUPWc+MD9wLmxlbmd0aC9nOjAsdz1bXSxrPTAsUD0wLEY9VDtQPEY7UCsrKXtmb3IodmFyIGg9W2ddLG89MDtvPGc7bysrKWhbb109ci5mb3JtYXQuYm9keShwW2tdLG1ba10ucm93LG1ba10uY29sdW1uLHZba10pLGsrKzt3W1BdPWh9dmFyIGY9e2hlYWRlcjpuLGhlYWRlclN0cnVjdHVyZTp2cyhyLmZvcm1hdC5oZWFkZXIsdC50YWJsZSgpLmhlYWRlci5zdHJ1Y3R1cmUoci5jb2x1bW5zKSksZm9vdGVyOnMsZm9vdGVyU3RydWN0dXJlOnZzKHIuZm9ybWF0LmZvb3Rlcix0LnRhYmxlKCkuZm9vdGVyLnN0cnVjdHVyZShyLmNvbHVtbnMpKSxib2R5Ond9O3JldHVybiByLmN1c3RvbWl6ZURhdGEmJnIuY3VzdG9taXplRGF0YShmKSxmfTtmdW5jdGlvbiB2cyh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWZvcih2YXIgbj0wO248ZVtyXS5sZW5ndGg7bisrKXt2YXIgcz1lW3JdW25dO3MmJihzLnRpdGxlPXQocy50aXRsZSxuLHMuY2VsbCkpfXJldHVybiBlfWh0LmZuLmRhdGFUYWJsZS5CdXR0b25zPXJlO2h0LmZuLkRhdGFUYWJsZS5CdXR0b25zPXJlO2h0KGRvY3VtZW50KS5vbigiaW5pdC5kdCBwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24odCxlKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQuYnV0dG9uc3x8c3QuZGVmYXVsdHMuYnV0dG9ucztyJiYhZS5fYnV0dG9ucyYmbmV3IHJlKGUscikuY29udGFpbmVyKCl9fSk7ZnVuY3Rpb24gZ3ModCxlKXt2YXIgcj1uZXcgc3QuQXBpKHQpLG49ZXx8ci5pbml0KCkuYnV0dG9uc3x8c3QuZGVmYXVsdHMuYnV0dG9ucztyZXR1cm4gbmV3IHJlKHIsbikuY29udGFpbmVyKCl9c3QuZXh0LmZlYXR1cmUucHVzaCh7Zm5Jbml0OmdzLGNGZWF0dXJlOiJCIn0pO3N0LmZlYXR1cmUmJnN0LmZlYXR1cmUucmVnaXN0ZXIoImJ1dHRvbnMiLGdzKTt2YXIgeHM9aWUoYWUoKSwxKTt2YXIgc2U9eHMuZGVmYXVsdCxfcyxDcztmdW5jdGlvbiB6aSgpe3JldHVybiBfc3x8d2luZG93LkpTWmlwfWZ1bmN0aW9uIGppKCl7cmV0dXJuIENzfHx3aW5kb3cucGRmTWFrZX1zdC5CdXR0b25zLnBkZk1ha2U9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIGppKCk7Q3M9dH07c3QuQnV0dG9ucy5qc3ppcD1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gemkoKTtfcz10fTt2YXIgRW49ZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2lmKCEodHlwZW9mIHQ+InUifHx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmL01TSUUgWzEtOV1cLi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkpe3ZhciBlPXQuZG9jdW1lbnQscj1mdW5jdGlvbigpe3JldHVybiB0LlVSTHx8dC53ZWJraXRVUkx8fHR9LG49ZS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJhIikscz0iZG93bmxvYWQiaW4gbixhPWZ1bmN0aW9uKGgpe3ZhciBvPW5ldyBNb3VzZUV2ZW50KCJjbGljayIpO2guZGlzcGF0Y2hFdmVudChvKX0sbD0vY29uc3RydWN0b3IvaS50ZXN0KHQuSFRNTEVsZW1lbnQpfHx0LnNhZmFyaSx1PS9DcmlPU1wvW1xkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscD1mdW5jdGlvbihoKXsodC5zZXRJbW1lZGlhdGV8fHQuc2V0VGltZW91dCkoZnVuY3Rpb24oKXt0aHJvdyBofSwwKX0sdj0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixtPTFlMyo0MCxnPWZ1bmN0aW9uKGgpe3ZhciBvPWZ1bmN0aW9uKCl7dHlwZW9mIGg9PSJzdHJpbmciP3IoKS5yZXZva2VPYmplY3RVUkwoaCk6aC5yZW1vdmUoKX07c2V0VGltZW91dChvLG0pfSxUPWZ1bmN0aW9uKGgsbyxmKXtvPVtdLmNvbmNhdChvKTtmb3IodmFyIEM9by5sZW5ndGg7Qy0tOyl7dmFyIEI9aFsib24iK29bQ11dO2lmKHR5cGVvZiBCPT0iZnVuY3Rpb24iKXRyeXtCLmNhbGwoaCxmfHxoKX1jYXRjaChjKXtwKGMpfX19LHc9ZnVuY3Rpb24oaCl7cmV0dXJuL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGgudHlwZSk/bmV3IEJsb2IoWyJcdUZFRkYiLGhdLHt0eXBlOmgudHlwZX0pOmh9LGs9ZnVuY3Rpb24oaCxvLGYpe2Z8fChoPXcoaCkpO3ZhciBDPXRoaXMsQj1oLnR5cGUsYz1CPT09dix6LEc9ZnVuY3Rpb24oKXtUKEMsIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgd3JpdGVlbmQiLnNwbGl0KCIgIikpfSxldD1mdW5jdGlvbigpe2lmKCh1fHxjJiZsKSYmdC5GaWxlUmVhZGVyKXt2YXIgRT1uZXcgRmlsZVJlYWRlcjtFLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciB5PXU/RS5yZXN1bHQ6RS5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywiZGF0YTphdHRhY2htZW50L2ZpbGU7IiksXz10Lm9wZW4oeSwiX2JsYW5rIik7X3x8KHQubG9jYXRpb24uaHJlZj15KSx5PXZvaWQgMCxDLnJlYWR5U3RhdGU9Qy5ET05FLEcoKX0sRS5yZWFkQXNEYXRhVVJMKGgpLEMucmVhZHlTdGF0ZT1DLklOSVQ7cmV0dXJufWlmKHp8fCh6PXIoKS5jcmVhdGVPYmplY3RVUkwoaCkpLGMpdC5sb2NhdGlvbi5ocmVmPXo7ZWxzZXt2YXIgWj10Lm9wZW4oeiwiX2JsYW5rIik7Wnx8KHQubG9jYXRpb24uaHJlZj16KX1DLnJlYWR5U3RhdGU9Qy5ET05FLEcoKSxnKHopfTtpZihDLnJlYWR5U3RhdGU9Qy5JTklULHMpe3o9cigpLmNyZWF0ZU9iamVjdFVSTChoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5ocmVmPXosbi5kb3dubG9hZD1vLGEobiksRygpLGcoeiksQy5yZWFkeVN0YXRlPUMuRE9ORX0pO3JldHVybn1ldCgpfSxQPWsucHJvdG90eXBlLEY9ZnVuY3Rpb24oaCxvLGYpe3JldHVybiBuZXcgayhoLG98fGgubmFtZXx8ImRvd25sb2FkIixmKX07cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYj9mdW5jdGlvbihoLG8sZil7cmV0dXJuIG89b3x8aC5uYW1lfHwiZG93bmxvYWQiLGZ8fChoPXcoaCkpLG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGgsbyl9OihQLmFib3J0PWZ1bmN0aW9uKCl7fSxQLnJlYWR5U3RhdGU9UC5JTklUPTAsUC5XUklUSU5HPTEsUC5ET05FPTIsUC5lcnJvcj1QLm9ud3JpdGVzdGFydD1QLm9ucHJvZ3Jlc3M9UC5vbndyaXRlPVAub25hYm9ydD1QLm9uZXJyb3I9UC5vbndyaXRlZW5kPW51bGwsRil9fSh0eXBlb2Ygc2VsZjwidSImJnNlbGZ8fHR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3d8fCh2b2lkIDApLmNvbnRlbnQpO3N0LmZpbGVTYXZlPUVuO3ZhciB5cz1mdW5jdGlvbih0KXt2YXIgZT0iU2hlZXQxIjtyZXR1cm4gdC5zaGVldE5hbWUmJihlPXQuc2hlZXROYW1lLnJlcGxhY2UoL1tcW1xdXCpcL1xcXD9cOl0vZywiIikpLGV9LFRzPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5ld2xpbmU/dC5uZXdsaW5lOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MvKT9gXHIKYDpgCmB9LGtzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9VHMoZSksbj10LmJ1dHRvbnMuZXhwb3J0RGF0YShlLmV4cG9ydE9wdGlvbnMpLHM9ZS5maWVsZEJvdW5kYXJ5LGE9ZS5maWVsZFNlcGFyYXRvcixsPW5ldyBSZWdFeHAocywiZyIpLHU9ZS5lc2NhcGVDaGFyIT09dm9pZCAwP2UuZXNjYXBlQ2hhcjoiXFwiLHA9ZnVuY3Rpb24oayl7Zm9yKHZhciBQPSIiLEY9MCxoPWsubGVuZ3RoO0Y8aDtGKyspRj4wJiYoUCs9YSksUCs9cz9zKygiIitrW0ZdKS5yZXBsYWNlKGwsdStzKStzOmtbRl07cmV0dXJuIFB9LHY9IiIsbT0iIixnPVtdO2UuaGVhZGVyJiYodj1uLmhlYWRlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIHAoay5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrciksZS5mb290ZXImJm4uZm9vdGVyJiYobT1uLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIHAoay5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrcik7Zm9yKHZhciBUPTAsdz1uLmJvZHkubGVuZ3RoO1Q8dztUKyspZy5wdXNoKHAobi5ib2R5W1RdKSk7cmV0dXJue3N0cjp2K2cuam9pbihyKStyK20scm93czpnLmxlbmd0aH19LFNzPWZ1bmN0aW9uKCl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSE9PS0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpPT09LTEmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKT09PS0xO2lmKCF0KXJldHVybiExO3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC8oXGQrXC5cZCspLyk7cmV0dXJuISEoZSYmZS5sZW5ndGg+MSYmZVsxXSoxPDYwMy4xKX07ZnVuY3Rpb24gUXIodCl7Zm9yKHZhciBlPTY1LHI9OTAsbj1yLWUrMSxzPSIiO3Q+PTA7KXM9U3RyaW5nLmZyb21DaGFyQ29kZSh0JW4rZSkrcyx0PU1hdGguZmxvb3IodC9uKS0xO3JldHVybiBzfXRyeXtSbj1uZXcgWE1MU2VyaWFsaXplcn1jYXRjaHt9dmFyIFJuLFlyO2Z1bmN0aW9uIERzKHQsZSl7WXI9PT12b2lkIDAmJihZcj1Sbi5zZXJpYWxpemVUb1N0cmluZyhuZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhBc1sieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIl0sInRleHQveG1sIikpLmluZGV4T2YoInhtbG5zOnIiKT09PS0xKSxzZS5lYWNoKGUsZnVuY3Rpb24ocixuKXtpZihzZS5pc1BsYWluT2JqZWN0KG4pKXt2YXIgcz10LmZvbGRlcihyKTtEcyhzLG4pfWVsc2V7aWYoWXIpe3ZhciBhPW4uY2hpbGROb2Rlc1swXSxsLHUscD1bXTtmb3IobD1hLmF0dHJpYnV0ZXMubGVuZ3RoLTE7bD49MDtsLS0pe3ZhciB2PWEuYXR0cmlidXRlc1tsXS5ub2RlTmFtZSxtPWEuYXR0cmlidXRlc1tsXS5ub2RlVmFsdWU7di5pbmRleE9mKCI6IikhPT0tMSYmKHAucHVzaCh7bmFtZTp2LHZhbHVlOm19KSxhLnJlbW92ZUF0dHJpYnV0ZSh2KSl9Zm9yKGw9MCx1PXAubGVuZ3RoO2w8dTtsKyspe3ZhciBnPW4uY3JlYXRlQXR0cmlidXRlKHBbbF0ubmFtZS5yZXBsYWNlKCI6IiwiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKTtnLnZhbHVlPXBbbF0udmFsdWUsYS5zZXRBdHRyaWJ1dGVOb2RlKGcpfX12YXIgVD1Sbi5zZXJpYWxpemVUb1N0cmluZyhuKTtZciYmKFQuaW5kZXhPZigiPD94bWwiKT09PS0xJiYoVD0nPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PicrVCksVD1ULnJlcGxhY2UoL19kdF9iX25hbWVzcGFjZV90b2tlbl8vZywiOiIpLFQ9VC5yZXBsYWNlKC94bWxuczpOU1tcZF0rPSIiIE5TW1xkXSs6L2csIiIpKSxUPVQucmVwbGFjZSgvPChbXjw+XSo/KSB4bWxucz0iIihbXjw+XSo/KT4vZywiPCQxICQyPiIpLHQuZmlsZShyLFQpfX0pfWZ1bmN0aW9uIFRlKHQsZSxyKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIHImJihyLmF0dHImJnNlKG4pLmF0dHIoci5hdHRyKSxyLmNoaWxkcmVuJiZzZS5lYWNoKHIuY2hpbGRyZW4sZnVuY3Rpb24ocyxhKXtuLmFwcGVuZENoaWxkKGEpfSksci50ZXh0IT09bnVsbCYmci50ZXh0IT09dm9pZCAwJiZuLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoci50ZXh0KSkpLG59ZnVuY3Rpb24gQmwodCxlKXt2YXIgcj10LmhlYWRlcltlXS5sZW5ndGgsbixzLGE7dC5mb290ZXImJnQuZm9vdGVyW2VdJiZ0LmZvb3RlcltlXS5sZW5ndGg+ciYmKHI9dC5mb290ZXJbZV0ubGVuZ3RoKTtmb3IodmFyIGw9MCx1PXQuYm9keS5sZW5ndGg7bDx1O2wrKyl7dmFyIHA9dC5ib2R5W2xdW2VdO2lmKGE9cCE9bnVsbD9wLnRvU3RyaW5nKCk6IiIsYS5pbmRleE9mKGAKYCkhPT0tMT8ocz1hLnNwbGl0KGAKYCkscy5zb3J0KGZ1bmN0aW9uKHYsbSl7cmV0dXJuIG0ubGVuZ3RoLXYubGVuZ3RofSksbj1zWzBdLmxlbmd0aCk6bj1hLmxlbmd0aCxuPnImJihyPW4pLHI+NDApcmV0dXJuIDU0fXJldHVybiByKj0xLjM1LHI+Nj9yOjZ9dmFyIEFzPXsiX3JlbHMvLnJlbHMiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+PFJlbGF0aW9uc2hpcCBJZD0icklkMSIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudCIgVGFyZ2V0PSJ4bC93b3JrYm9vay54bWwiLz48L1JlbGF0aW9uc2hpcHM+JywieGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+PFJlbGF0aW9uc2hpcCBJZD0icklkMSIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXQiIFRhcmdldD0id29ya3NoZWV0cy9zaGVldDEueG1sIi8+PFJlbGF0aW9uc2hpcCBJZD0icklkMiIgVHlwZT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zdHlsZXMiIFRhcmdldD0ic3R5bGVzLnhtbCIvPjwvUmVsYXRpb25zaGlwcz4nLCJbQ29udGVudF9UeXBlc10ueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxUeXBlcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIj48RGVmYXVsdCBFeHRlbnNpb249InhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIgLz48RGVmYXVsdCBFeHRlbnNpb249InJlbHMiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIgLz48RGVmYXVsdCBFeHRlbnNpb249ImpwZWciIENvbnRlbnRUeXBlPSJpbWFnZS9qcGVnIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtib29rLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWwiIC8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvc3R5bGVzLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWwiIC8+PC9UeXBlcz4nLCJ4bC93b3JrYm9vay54bWwiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtib29rIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iIHhtbG5zOnI9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMiPjxmaWxlVmVyc2lvbiBhcHBOYW1lPSJ4bCIgbGFzdEVkaXRlZD0iNSIgbG93ZXN0RWRpdGVkPSI1IiBydXBCdWlsZD0iMjQ4MTYiLz48d29ya2Jvb2tQciBzaG93SW5rQW5ub3RhdGlvbj0iMCIgYXV0b0NvbXByZXNzUGljdHVyZXM9IjAiLz48Ym9va1ZpZXdzPjx3b3JrYm9va1ZpZXcgeFdpbmRvdz0iMCIgeVdpbmRvdz0iMCIgd2luZG93V2lkdGg9IjI1NjAwIiB3aW5kb3dIZWlnaHQ9IjE5MDIwIiB0YWJSYXRpbz0iNTAwIi8+PC9ib29rVmlld3M+PHNoZWV0cz48c2hlZXQgbmFtZT0iU2hlZXQxIiBzaGVldElkPSIxIiByOmlkPSJySWQxIi8+PC9zaGVldHM+PGRlZmluZWROYW1lcy8+PC93b3JrYm9vaz4nLCJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiOic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIiB4bWxuczptYz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiIG1jOklnbm9yYWJsZT0ieDE0YWMiIHhtbG5zOngxNGFjPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMDkvOS9hYyI+PHNoZWV0RGF0YS8+PG1lcmdlQ2VsbHMgY291bnQ9IjAiLz48L3dvcmtzaGVldD4nLCJ4bC9zdHlsZXMueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3R5bGVTaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczptYz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiIG1jOklnbm9yYWJsZT0ieDE0YWMiIHhtbG5zOngxNGFjPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMDkvOS9hYyI+PG51bUZtdHMgY291bnQ9IjYiPjxudW1GbXQgbnVtRm10SWQ9IjE2NCIgZm9ybWF0Q29kZT0iWyQkLTQwOV0jLCMjMC4wMDstWyQkLTQwOV0jLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NSIgZm9ybWF0Q29kZT0iJnF1b3Q7XHhBMyZxdW90OyMsIyMwLjAwIi8+PG51bUZtdCBudW1GbXRJZD0iMTY2IiBmb3JtYXRDb2RlPSJbJFx1MjBBQy0yXSAjLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NyIgZm9ybWF0Q29kZT0iMC4wJSIvPjxudW1GbXQgbnVtRm10SWQ9IjE2OCIgZm9ybWF0Q29kZT0iIywjIzA7KCMsIyMwKSIvPjxudW1GbXQgbnVtRm10SWQ9IjE2OSIgZm9ybWF0Q29kZT0iIywjIzAuMDA7KCMsIyMwLjAwKSIvPjwvbnVtRm10cz48Zm9udHMgY291bnQ9IjUiIHgxNGFjOmtub3duRm9udHM9IjEiPjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxjb2xvciByZ2I9IkZGRkZGRkZGIiAvPjwvZm9udD48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PGIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxpIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48dSAvPjwvZm9udD48L2ZvbnRzPjxmaWxscyBjb3VudD0iNiI+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9Im5vbmUiIC8+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkZEOUQ5RDkiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJGRkQ5OTc5NSIgLz48YmdDb2xvciBpbmRleGVkPSI2NCIgLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9ImZmYzZlZmNlIiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iZmZjNmNmZWYiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PC9maWxscz48Ym9yZGVycyBjb3VudD0iMiI+PGJvcmRlcj48bGVmdCAvPjxyaWdodCAvPjx0b3AgLz48Ym90dG9tIC8+PGRpYWdvbmFsIC8+PC9ib3JkZXI+PGJvcmRlciBkaWFnb25hbFVwPSJmYWxzZSIgZGlhZ29uYWxEb3duPSJmYWxzZSI+PGxlZnQgc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvbGVmdD48cmlnaHQgc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvcmlnaHQ+PHRvcCBzdHlsZT0idGhpbiI+PGNvbG9yIGF1dG89IjEiIC8+PC90b3A+PGJvdHRvbSBzdHlsZT0idGhpbiI+PGNvbG9yIGF1dG89IjEiIC8+PC9ib3R0b20+PGRpYWdvbmFsIC8+PC9ib3JkZXI+PC9ib3JkZXJzPjxjZWxsU3R5bGVYZnMgY291bnQ9IjEiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiAvPjwvY2VsbFN0eWxlWGZzPjxjZWxsWGZzIGNvdW50PSI2OCI+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJsZWZ0Ii8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJjZW50ZXIiLz48L3hmPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5QWxpZ25tZW50PSIxIj48YWxpZ25tZW50IGhvcml6b250YWw9InJpZ2h0Ii8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJmaWxsIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCB0ZXh0Um90YXRpb249IjkwIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCB3cmFwVGV4dD0iMSIvPjwveGY+PHhmIG51bUZtdElkPSI5IiAgIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY0IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NSIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjYiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY3IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2OCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjkiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMyIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSI0IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjEiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMiIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PC9jZWxsWGZzPjxjZWxsU3R5bGVzIGNvdW50PSIxIj48Y2VsbFN0eWxlIG5hbWU9Ik5vcm1hbCIgeGZJZD0iMCIgYnVpbHRpbklkPSIwIiAvPjwvY2VsbFN0eWxlcz48ZHhmcyBjb3VudD0iMCIgLz48dGFibGVTdHlsZXMgY291bnQ9IjAiIGRlZmF1bHRUYWJsZVN0eWxlPSJUYWJsZVN0eWxlTWVkaXVtOSIgZGVmYXVsdFBpdm90U3R5bGU9IlBpdm90U3R5bGVNZWRpdW00IiAvPjwvc3R5bGVTaGVldD4nfSx3cz1be21hdGNoOi9eXC0/XGQrXC5cZCUkLyxzdHlsZTo2MCxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQvMTAwfX0se21hdGNoOi9eXC0/XGQrXC4/XGQqJSQvLHN0eWxlOjU2LGZtdDpmdW5jdGlvbih0KXtyZXR1cm4gdC8xMDB9fSx7bWF0Y2g6L15cLT9cJFtcZCxdKy4/XGQqJC8sc3R5bGU6NTd9LHttYXRjaDovXlwtP8KjW1xkLF0rLj9cZCokLyxzdHlsZTo1OH0se21hdGNoOi9eXC0/4oKsW1xkLF0rLj9cZCokLyxzdHlsZTo1OX0se21hdGNoOi9eXC0/XGQrJC8sc3R5bGU6NjV9LHttYXRjaDovXlwtP1xkK1wuXGR7Mn0kLyxzdHlsZTo2Nn0se21hdGNoOi9eXChbXGQsXStcKSQvLHN0eWxlOjYxLGZtdDpmdW5jdGlvbih0KXtyZXR1cm4tMSp0LnJlcGxhY2UoL1tcKFwpXS9nLCIiKX19LHttYXRjaDovXlwoW1xkLF0rXC5cZHsyfVwpJC8sc3R5bGU6NjIsZm10OmZ1bmN0aW9uKHQpe3JldHVybi0xKnQucmVwbGFjZSgvW1woXCldL2csIiIpfX0se21hdGNoOi9eXC0/W1xkLF0rJC8sc3R5bGU6NjN9LHttYXRjaDovXlwtP1tcZCxdK1wuXGR7Mn0kLyxzdHlsZTo2NH0se21hdGNoOi9eW1xkXXs0fVwtWzAxXVtcZF1cLVswMTIzXVtcZF0kLyxzdHlsZTo2NyxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoMjU1NjkrRGF0ZS5wYXJzZSh0KS8oODY0MDAqMWUzKSl9fV0sT249ZnVuY3Rpb24odCxlLHIsbixzKXt2YXIgYT1zZSgibWVyZ2VDZWxscyIsdCk7YVswXS5hcHBlbmRDaGlsZChUZSh0LCJtZXJnZUNlbGwiLHthdHRyOntyZWY6UXIocikrZSsiOiIrUXIocitzLTEpKyhlK24tMSl9fSkpLGEuYXR0cigiY291bnQiLHBhcnNlRmxvYXQoYS5hdHRyKCJjb3VudCIpKSsxKX07c3QuZXh0LmJ1dHRvbnMuY29weUh0bWw1PXtjbGFzc05hbWU6ImJ1dHRvbnMtY29weSBidXR0b25zLWh0bWw1Iix0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29weSIsIkNvcHkiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9a3MoZSxuKSxsPWUuYnV0dG9ucy5leHBvcnRJbmZvKG4pLHU9VHMobikscD1hLnN0cix2PXNlKCI8ZGl2Lz4iKS5jc3Moe2hlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjB9KTtsLnRpdGxlJiYocD1sLnRpdGxlK3UrdStwKSxsLm1lc3NhZ2VUb3AmJihwPWwubWVzc2FnZVRvcCt1K3UrcCksbC5tZXNzYWdlQm90dG9tJiYocD1wK3UrdStsLm1lc3NhZ2VCb3R0b20pLG4uY3VzdG9taXplJiYocD1uLmN1c3RvbWl6ZShwLG4sZSkpO3ZhciBtPXNlKCI8dGV4dGFyZWEgcmVhZG9ubHkvPiIpLnZhbChwKS5hcHBlbmRUbyh2KTtpZihkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoImNvcHkiKSl7di5hcHBlbmRUbyhlLnRhYmxlKCkuY29udGFpbmVyKCkpLG1bMF0uZm9jdXMoKSxtWzBdLnNlbGVjdCgpO3RyeXt2YXIgZz1kb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpO2lmKHYucmVtb3ZlKCksZyl7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLmNvcHlUaXRsZSIsIkNvcHkgdG8gY2xpcGJvYXJkIiksZS5pMThuKCJidXR0b25zLmNvcHlTdWNjZXNzIix7MToiQ29waWVkIG9uZSByb3cgdG8gY2xpcGJvYXJkIixfOiJDb3BpZWQgJWQgcm93cyB0byBjbGlwYm9hcmQifSxhLnJvd3MpLDJlMykscygpO3JldHVybn19Y2F0Y2h7fX12YXIgVD1zZSgiPHNwYW4+IitlLmkxOG4oImJ1dHRvbnMuY29weUtleXMiLCJQcmVzcyA8aT5jdHJsPC9pPiBvciA8aT5cdTIzMTg8L2k+ICsgPGk+QzwvaT4gdG8gY29weSB0aGUgdGFibGUgZGF0YTxicj50byB5b3VyIHN5c3RlbSBjbGlwYm9hcmQuPGJyPjxicj5UbyBjYW5jZWwsIGNsaWNrIHRoaXMgbWVzc2FnZSBvciBwcmVzcyBlc2NhcGUuIikrIjwvc3Bhbj4iKS5hcHBlbmQodik7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLmNvcHlUaXRsZSIsIkNvcHkgdG8gY2xpcGJvYXJkIiksVCwwKSxtWzBdLmZvY3VzKCksbVswXS5zZWxlY3QoKTt2YXIgdz1zZShUKS5jbG9zZXN0KCIuZHQtYnV0dG9uLWluZm8iKSxrPWZ1bmN0aW9uKCl7dy5vZmYoImNsaWNrLmJ1dHRvbnMtY29weSIpLHNlKGRvY3VtZW50KS5vZmYoIi5idXR0b25zLWNvcHkiKSxlLmJ1dHRvbnMuaW5mbyghMSl9O3cub24oImNsaWNrLmJ1dHRvbnMtY29weSIsayksc2UoZG9jdW1lbnQpLm9uKCJrZXlkb3duLmJ1dHRvbnMtY29weSIsZnVuY3Rpb24oUCl7UC5rZXlDb2RlPT09MjcmJihrKCkscygpKX0pLm9uKCJjb3B5LmJ1dHRvbnMtY29weSBjdXQuYnV0dG9ucy1jb3B5IixmdW5jdGlvbigpe2soKSxzKCl9KX0sYXN5bmM6MTAwLGV4cG9ydE9wdGlvbnM6e30sZmllbGRTZXBhcmF0b3I6IgkiLGZpZWxkQm91bmRhcnk6IiIsaGVhZGVyOiEwLGZvb3RlcjohMCx0aXRsZToiKiIsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiJ9O3N0LmV4dC5idXR0b25zLmNzdkh0bWw1PXtib206ITEsY2xhc3NOYW1lOiJidXR0b25zLWNzdiBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJndpbmRvdy5CbG9ifSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY3N2IiwiQ1NWIil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPWtzKGUsbikuc3RyLGw9ZS5idXR0b25zLmV4cG9ydEluZm8obiksdT1uLmNoYXJzZXQ7bi5jdXN0b21pemUmJihhPW4uY3VzdG9taXplKGEsbixlKSksdSE9PSExPyh1fHwodT1kb2N1bWVudC5jaGFyYWN0ZXJTZXR8fGRvY3VtZW50LmNoYXJzZXQpLHUmJih1PSI7Y2hhcnNldD0iK3UpKTp1PSIiLG4uYm9tJiYoYT0iXHVGRUZGIithKSxFbihuZXcgQmxvYihbYV0se3R5cGU6InRleHQvY3N2Iit1fSksbC5maWxlbmFtZSwhMCkscygpfSxhc3luYzoxMDAsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLmNzdiIsZXhwb3J0T3B0aW9uczp7fSxmaWVsZFNlcGFyYXRvcjoiLCIsZmllbGRCb3VuZGFyeTonIicsZXNjYXBlQ2hhcjonIicsY2hhcnNldDpudWxsLGhlYWRlcjohMCxmb290ZXI6ITB9O3N0LmV4dC5idXR0b25zLmV4Y2VsSHRtbDU9e2NsYXNzTmFtZToiYnV0dG9ucy1leGNlbCBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJnppKCkhPT12b2lkIDAmJiFTcygpJiZSbn0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmV4Y2VsIiwiRXhjZWwiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxyLG4scyl7dmFyIGE9MCxsLHUscD1mdW5jdGlvbih5KXt2YXIgXz1Bc1t5XTtyZXR1cm4gc2UucGFyc2VYTUwoXyl9LHY9cCgieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIiksbT12LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzaGVldERhdGEiKVswXSxnPXtfcmVsczp7Ii5yZWxzIjpwKCJfcmVscy8ucmVscyIpfSx4bDp7X3JlbHM6eyJ3b3JrYm9vay54bWwucmVscyI6cCgieGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMiKX0sIndvcmtib29rLnhtbCI6cCgieGwvd29ya2Jvb2sueG1sIiksInN0eWxlcy54bWwiOnAoInhsL3N0eWxlcy54bWwiKSx3b3Jrc2hlZXRzOnsic2hlZXQxLnhtbCI6dn19LCJbQ29udGVudF9UeXBlc10ueG1sIjpwKCJbQ29udGVudF9UeXBlc10ueG1sIil9LFQ9ZS5idXR0b25zLmV4cG9ydERhdGEobi5leHBvcnRPcHRpb25zKSx3LGssUD1mdW5jdGlvbih5KXt3PWErMSxrPVRlKHYsInJvdyIse2F0dHI6e3I6d319KTtmb3IodmFyIF89MCxTPXkubGVuZ3RoO188UztfKyspe3ZhciBOPVFyKF8pKyIiK3csUj1udWxsO2lmKHlbX109PT1udWxsfHx5W19dPT09dm9pZCAwfHx5W19dPT09IiIpaWYobi5jcmVhdGVFbXB0eUNlbGxzPT09ITApeVtfXT0iIjtlbHNlIGNvbnRpbnVlO3ZhciBMPXlbX107eVtfXT10eXBlb2YgeVtfXS50cmltPT0iZnVuY3Rpb24iP3lbX10udHJpbSgpOnlbX107Zm9yKHZhciBYPTAsaj13cy5sZW5ndGg7WDxqO1grKyl7dmFyIHE9d3NbWF07aWYoeVtfXS5tYXRjaCYmIXlbX10ubWF0Y2goL14wXGQrLykmJnlbX10ubWF0Y2gocS5tYXRjaCkpe3ZhciBhdD15W19dLnJlcGxhY2UoL1teXGRcLlwtXS9nLCIiKTtxLmZtdCYmKGF0PXEuZm10KGF0KSksUj1UZSh2LCJjIix7YXR0cjp7cjpOLHM6cS5zdHlsZX0sY2hpbGRyZW46W1RlKHYsInYiLHt0ZXh0OmF0fSldfSk7YnJlYWt9fWlmKCFSKWlmKHR5cGVvZiB5W19dPT0ibnVtYmVyInx8eVtfXS5tYXRjaCYmeVtfXS5tYXRjaCgvXi0/XGQrKFwuXGQrKT8oW2VFXVwtP1xkKyk/JC8pJiYheVtfXS5tYXRjaCgvXjBcZCsvKSlSPVRlKHYsImMiLHthdHRyOnt0OiJuIixyOk59LGNoaWxkcmVuOltUZSh2LCJ2Iix7dGV4dDp5W19dfSldfSk7ZWxzZXt2YXIgSj1MLnJlcGxhY2U/TC5yZXBsYWNlKC9bXHgwMC1ceDA5XHgwQlx4MENceDBFLVx4MUZceDdGLVx4OUZdL2csIiIpOkw7Uj1UZSh2LCJjIix7YXR0cjp7dDoiaW5saW5lU3RyIixyOk59LGNoaWxkcmVuOntyb3c6VGUodiwiaXMiLHtjaGlsZHJlbjp7cm93OlRlKHYsInQiLHt0ZXh0OkosYXR0cjp7InhtbDpzcGFjZSI6InByZXNlcnZlIn19KX19KX19KX1rLmFwcGVuZENoaWxkKFIpfW0uYXBwZW5kQ2hpbGQoayksYSsrfSxGPWZ1bmN0aW9uKHkpe3kuZm9yRWFjaChmdW5jdGlvbihfKXtQKF8ubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBTP1MudGl0bGU6IiJ9KSxhKSxzZSgicm93Omxhc3QgYyIsdikuYXR0cigicyIsIjIiKSxfLmZvckVhY2goZnVuY3Rpb24oUyxOKXtTJiYoUy5jb2xTcGFuPjF8fFMucm93U3Bhbj4xKSYmT24odixhLE4sUy5yb3dTcGFuLFMuY29sU3Bhbil9KX0pfTtuLmN1c3RvbWl6ZURhdGEmJm4uY3VzdG9taXplRGF0YShUKTt2YXIgaD1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhuKTtoLnRpdGxlJiYoUChbaC50aXRsZV0sYSksT24odixhLDAsMSxULmhlYWRlci5sZW5ndGgpLHNlKCJyb3c6bGFzdCBjIix2KS5hdHRyKCJzIiwiNTEiKSksaC5tZXNzYWdlVG9wJiYoUChbaC5tZXNzYWdlVG9wXSxhKSxPbih2LGEsMCwxLFQuaGVhZGVyLmxlbmd0aCkpLG4uaGVhZGVyJiZGKFQuaGVhZGVyU3RydWN0dXJlKSxsPWE7Zm9yKHZhciBvPTAsZj1ULmJvZHkubGVuZ3RoO288ZjtvKyspUChULmJvZHlbb10sYSk7dT1hLG4uZm9vdGVyJiZULmZvb3RlciYmRihULmZvb3RlclN0cnVjdHVyZSksaC5tZXNzYWdlQm90dG9tJiYoUChbaC5tZXNzYWdlQm90dG9tXSxhKSxPbih2LGEsMCwxLFQuaGVhZGVyLmxlbmd0aCkpO3ZhciBDPVRlKHYsImNvbHMiKTtzZSgid29ya3NoZWV0Iix2KS5wcmVwZW5kKEMpO2Zvcih2YXIgQj0wLGM9VC5oZWFkZXIubGVuZ3RoO0I8YztCKyspQy5hcHBlbmRDaGlsZChUZSh2LCJjb2wiLHthdHRyOnttaW46QisxLG1heDpCKzEsd2lkdGg6QmwoVCxCKSxjdXN0b21XaWR0aDoxfX0pKTt2YXIgej1nLnhsWyJ3b3JrYm9vay54bWwiXTtzZSgic2hlZXRzIHNoZWV0Iix6KS5hdHRyKCJuYW1lIix5cyhuKSksbi5hdXRvRmlsdGVyJiYoc2UoIm1lcmdlQ2VsbHMiLHYpLmJlZm9yZShUZSh2LCJhdXRvRmlsdGVyIix7YXR0cjp7cmVmOiJBIitsKyI6IitRcihULmhlYWRlci5sZW5ndGgtMSkrdX19KSksc2UoImRlZmluZWROYW1lcyIseikuYXBwZW5kKFRlKHosImRlZmluZWROYW1lIix7YXR0cjp7bmFtZToiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIixsb2NhbFNoZWV0SWQ6IjAiLGhpZGRlbjoxfSx0ZXh0OnlzKG4pKyIhJEEkIitsKyI6IitRcihULmhlYWRlci5sZW5ndGgtMSkrdX0pKSksbi5jdXN0b21pemUmJm4uY3VzdG9taXplKGcsbixlKSxzZSgibWVyZ2VDZWxscyIsdikuY2hpbGRyZW4oKS5sZW5ndGg9PT0wJiZzZSgibWVyZ2VDZWxscyIsdikucmVtb3ZlKCk7dmFyIEc9emkoKSxldD1uZXcgRyxFPXtjb21wcmVzc2lvbjoiREVGTEFURSIsdHlwZToiYmxvYiIsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0In07RHMoZXQsZyk7dmFyIFo9aC5maWxlbmFtZTtaPjE3NSYmKFo9Wi5zdWJzdHIoMCwxNzUpKSxldC5nZW5lcmF0ZUFzeW5jP2V0LmdlbmVyYXRlQXN5bmMoRSkudGhlbihmdW5jdGlvbih5KXtFbih5LFopLHMoKX0pOihFbihldC5nZW5lcmF0ZShFKSxaKSxzKCkpfSxhc3luYzoxMDAsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLnhsc3giLGV4cG9ydE9wdGlvbnM6e30saGVhZGVyOiEwLGZvb3RlcjohMCx0aXRsZToiKiIsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiIsY3JlYXRlRW1wdHlDZWxsczohMSxhdXRvRmlsdGVyOiExLHNoZWV0TmFtZToiIn07c3QuZXh0LmJ1dHRvbnMucGRmSHRtbDU9e2NsYXNzTmFtZToiYnV0dG9ucy1wZGYgYnV0dG9ucy1odG1sNSIsYXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5GaWxlUmVhZGVyIT09dm9pZCAwJiZqaSgpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMucGRmIiwiUERGIil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPWUuYnV0dG9ucy5leHBvcnREYXRhKG4uZXhwb3J0T3B0aW9ucyksbD1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhuKSx1PVtdO24uaGVhZGVyJiZhLmhlYWRlclN0cnVjdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe3UucHVzaChULm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdz97dGV4dDp3LnRpdGxlLGNvbFNwYW46dy5jb2xzcGFuLHJvd1NwYW46dy5yb3dzcGFuLHN0eWxlOiJ0YWJsZUhlYWRlciJ9Ont9fSkpfSk7Zm9yKHZhciBwPTAsdj1hLmJvZHkubGVuZ3RoO3A8djtwKyspdS5wdXNoKGEuYm9keVtwXS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJue3RleHQ6VD09bnVsbD8iIjp0eXBlb2YgVD09InN0cmluZyI/VDpULnRvU3RyaW5nKCl9fSkpO24uZm9vdGVyJiZhLmZvb3RlclN0cnVjdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe3UucHVzaChULm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdz97dGV4dDp3LnRpdGxlLGNvbFNwYW46dy5jb2xzcGFuLHJvd1NwYW46dy5yb3dzcGFuLHN0eWxlOiJ0YWJsZUhlYWRlciJ9Ont9fSkpfSk7dmFyIG09e3BhZ2VTaXplOm4ucGFnZVNpemUscGFnZU9yaWVudGF0aW9uOm4ub3JpZW50YXRpb24sY29udGVudDpbe3N0eWxlOiJ0YWJsZSIsdGFibGU6e2hlYWRlclJvd3M6YS5oZWFkZXJTdHJ1Y3R1cmUubGVuZ3RoLGZvb3RlclJvd3M6YS5mb290ZXJTdHJ1Y3R1cmUubGVuZ3RoLGJvZHk6dX0sbGF5b3V0OntoTGluZVdpZHRoOmZ1bmN0aW9uKFQsdyl7cmV0dXJuIFQ9PT0wfHxUPT09dy50YWJsZS5ib2R5Lmxlbmd0aD8wOi41fSx2TGluZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhMaW5lQ29sb3I6ZnVuY3Rpb24oVCx3KXtyZXR1cm4gVD09PXcudGFibGUuaGVhZGVyUm93c3x8VD09PXcudGFibGUuYm9keS5sZW5ndGgtdy50YWJsZS5mb290ZXJSb3dzPyIjMzMzIjoiI2RkZCJ9LGZpbGxDb2xvcjpmdW5jdGlvbihUKXtyZXR1cm4gVDxhLmhlYWRlclN0cnVjdHVyZS5sZW5ndGg/IiNmZmYiOlQlMj09PTA/IiNmM2YzZjMiOm51bGx9LHBhZGRpbmdUb3A6ZnVuY3Rpb24oKXtyZXR1cm4gNX0scGFkZGluZ0JvdHRvbTpmdW5jdGlvbigpe3JldHVybiA1fX19XSxzdHlsZXM6e3RhYmxlSGVhZGVyOntib2xkOiEwLGZvbnRTaXplOjExLGFsaWdubWVudDoiY2VudGVyIn0sdGFibGVGb290ZXI6e2JvbGQ6ITAsZm9udFNpemU6MTF9LHRhYmxlOnttYXJnaW46WzAsNSwwLDVdfSx0aXRsZTp7YWxpZ25tZW50OiJjZW50ZXIiLGZvbnRTaXplOjEzfSxtZXNzYWdlOnt9fSxkZWZhdWx0U3R5bGU6e2ZvbnRTaXplOjEwfX07bC5tZXNzYWdlVG9wJiZtLmNvbnRlbnQudW5zaGlmdCh7dGV4dDpsLm1lc3NhZ2VUb3Asc3R5bGU6Im1lc3NhZ2UiLG1hcmdpbjpbMCwwLDAsMTJdfSksbC5tZXNzYWdlQm90dG9tJiZtLmNvbnRlbnQucHVzaCh7dGV4dDpsLm1lc3NhZ2VCb3R0b20sc3R5bGU6Im1lc3NhZ2UiLG1hcmdpbjpbMCwwLDAsMTJdfSksbC50aXRsZSYmbS5jb250ZW50LnVuc2hpZnQoe3RleHQ6bC50aXRsZSxzdHlsZToidGl0bGUiLG1hcmdpbjpbMCwwLDAsMTJdfSksbi5jdXN0b21pemUmJm4uY3VzdG9taXplKG0sbixlKTt2YXIgZz1qaSgpLmNyZWF0ZVBkZihtKTtuLmRvd25sb2FkPT09Im9wZW4iJiYhU3MoKT9nLm9wZW4oKTpnLmRvd25sb2FkKGwuZmlsZW5hbWUpLHMoKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIucGRmIixleHBvcnRPcHRpb25zOnt9LG9yaWVudGF0aW9uOiJwb3J0cmFpdCIscGFnZVNpemU6bmF2aWdhdG9yLmxhbmd1YWdlPT09ImVuLVVTInx8bmF2aWdhdG9yLmxhbmd1YWdlPT09ImVuLUNBIj8iTEVUVEVSIjoiQTQiLGhlYWRlcjohMCxmb290ZXI6ITAsbWVzc2FnZVRvcDoiKiIsbWVzc2FnZUJvdHRvbToiKiIsY3VzdG9taXplOm51bGwsZG93bmxvYWQ6ImRvd25sb2FkIn07dmFyIElzPWllKGFlKCksMSk7dmFyIE5yPUlzLmRlZmF1bHQsQnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLE5sPWZ1bmN0aW9uKHQpe3ZhciBlPU5yKHQpLmNsb25lKClbMF07cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJsaW5rIiYmKGUuaHJlZj1QcyhlLmhyZWYpKSxlLm91dGVySFRNTH0sUHM9ZnVuY3Rpb24odCl7QnIuaHJlZj10O3ZhciBlPUJyLmhvc3Q7cmV0dXJuIGUuaW5kZXhPZigiLyIpPT09LTEmJkJyLnBhdGhuYW1lLmluZGV4T2YoIi8iKSE9PTAmJihlKz0iLyIpLEJyLnByb3RvY29sKyIvLyIrZStCci5wYXRobmFtZStCci5zZWFyY2h9O3N0LmV4dC5idXR0b25zLnByaW50PXtjbGFzc05hbWU6ImJ1dHRvbnMtcHJpbnQiLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5wcmludCIsIlByaW50Iil9LGFjdGlvbjpmdW5jdGlvbih0LGUscixuLHMpe3ZhciBhPWUuYnV0dG9ucy5leHBvcnREYXRhKE5yLmV4dGVuZCh7ZGVjb2RlRW50aXRpZXM6ITF9LG4uZXhwb3J0T3B0aW9ucykpLGw9ZS5idXR0b25zLmV4cG9ydEluZm8obiksdT1lLmNvbHVtbnMobi5leHBvcnRPcHRpb25zLmNvbHVtbnMpLm5vZGVzKCkubWFwKGZ1bmN0aW9uKGgpe3JldHVybiBoLmNsYXNzTmFtZX0pLnRvQXJyYXkoKSxwPWZ1bmN0aW9uKGgsbyl7Zm9yKHZhciBmPSI8dHI+IixDPTAsQj1oLmxlbmd0aDtDPEI7QysrKXt2YXIgYz1oW0NdPT09bnVsbHx8aFtDXT09PXZvaWQgMD8iIjpoW0NdLHo9dVtDXT8nY2xhc3M9IicrdVtDXSsnIic6IiI7Zis9IjwiK28rIiAiK3orIj4iK2MrIjwvIitvKyI+In1yZXR1cm4gZisiPC90cj4ifSx2PSc8dGFibGUgY2xhc3M9IicrZS50YWJsZSgpLm5vZGUoKS5jbGFzc05hbWUrJyI+JztpZihuLmhlYWRlcil7dmFyIG09YS5oZWFkZXJTdHJ1Y3R1cmUubWFwKGZ1bmN0aW9uKGgpe3JldHVybiI8dHI+IitoLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gbz8nPHRoIGNvbHNwYW49Iicrby5jb2xzcGFuKyciIHJvd3NwYW49Iicrby5yb3dzcGFuKyciPicrby50aXRsZSsiPC90aD4iOiIifSkuam9pbigiIikrIjwvdHI+In0pO3YrPSI8dGhlYWQ+IittLmpvaW4oIiIpKyI8L3RoZWFkPiJ9dis9Ijx0Ym9keT4iO2Zvcih2YXIgZz0wLFQ9YS5ib2R5Lmxlbmd0aDtnPFQ7ZysrKXYrPXAoYS5ib2R5W2ddLCJ0ZCIpO2lmKHYrPSI8L3Rib2R5PiIsbi5mb290ZXImJmEuZm9vdGVyKXt2YXIgdz1hLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oaCl7cmV0dXJuIjx0cj4iK2gubWFwKGZ1bmN0aW9uKG8pe3JldHVybiBvPyc8dGggY29sc3Bhbj0iJytvLmNvbHNwYW4rJyIgcm93c3Bhbj0iJytvLnJvd3NwYW4rJyI+JytvLnRpdGxlKyI8L3RoPiI6IiJ9KS5qb2luKCIiKSsiPC90cj4ifSk7dis9Ijx0Zm9vdD4iK3cuam9pbigiIikrIjwvdGZvb3Q+In12Kz0iPC90YWJsZT4iO3ZhciBrPXdpbmRvdy5vcGVuKCIiLCIiKTtpZighayl7ZS5idXR0b25zLmluZm8oZS5pMThuKCJidXR0b25zLnByaW50RXJyb3JUaXRsZSIsIlVuYWJsZSB0byBvcGVuIHByaW50IHZpZXciKSxlLmkxOG4oImJ1dHRvbnMucHJpbnRFcnJvck1zZyIsIlBsZWFzZSBhbGxvdyBwb3B1cHMgaW4geW91ciBicm93c2VyIGZvciB0aGlzIHNpdGUgdG8gYmUgYWJsZSB0byB2aWV3IHRoZSBwcmludCB2aWV3LiIpLDVlMyk7cmV0dXJufWsuZG9jdW1lbnQuY2xvc2UoKTt2YXIgUD0iPHRpdGxlPiIrbC50aXRsZSsiPC90aXRsZT4iO05yKCJzdHlsZSwgbGluayIpLmVhY2goZnVuY3Rpb24oKXtQKz1ObCh0aGlzKX0pO3RyeXtrLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPVB9Y2F0Y2h7TnIoay5kb2N1bWVudC5oZWFkKS5odG1sKFApfWsuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxoMT4iK2wudGl0bGUrIjwvaDE+PGRpdj4iKyhsLm1lc3NhZ2VUb3B8fCIiKSsiPC9kaXY+Iit2KyI8ZGl2PiIrKGwubWVzc2FnZUJvdHRvbXx8IiIpKyI8L2Rpdj4iLE5yKGsuZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoImR0LXByaW50LXZpZXciKSxOcigiaW1nIixrLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oaCxvKXtvLnNldEF0dHJpYnV0ZSgic3JjIixQcyhvLmdldEF0dHJpYnV0ZSgic3JjIikpKX0pLG4uY3VzdG9taXplJiZuLmN1c3RvbWl6ZShrLG4sZSk7dmFyIEY9ZnVuY3Rpb24oKXtuLmF1dG9QcmludCYmKGsucHJpbnQoKSxrLmNsb3NlKCkpfTtrLnNldFRpbWVvdXQoRiwxZTMpLHMoKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITAsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTt2YXIgT2w9aWUoYWUoKSwxKTt2YXIgRnM9aWUoYWUoKSwxKTt2YXIgYXI9RnMuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiByKGwpe3Q9bCxlPXQuZm4uZGF0YVRhYmxlfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCh1LHApe3ZhciB2PXRoaXM7aWYoIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJGaXhlZENvbHVtbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIik7dmFyIG09bmV3IGUuQXBpKHUpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxsLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxsLmRlZmF1bHRzLHApLHRoaXMucz17ZHQ6bSxydGw6dChtLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCJ9LHAmJnAubGVmdENvbHVtbnMhPT12b2lkIDAmJihwLmxlZnQ9cC5sZWZ0Q29sdW1ucykscCYmcC5sZWZ0IT09dm9pZCAwJiYodGhpcy5jW3RoaXMucy5ydGw/ImVuZCI6InN0YXJ0Il09cC5sZWZ0KSxwJiZwLnJpZ2h0Q29sdW1ucyE9PXZvaWQgMCYmKHAucmlnaHQ9cC5yaWdodENvbHVtbnMpLHAmJnAucmlnaHQhPT12b2lkIDAmJih0aGlzLmNbdGhpcy5zLnJ0bD8ic3RhcnQiOiJlbmQiXT1wLnJpZ2h0KSx0aGlzLmRvbT17Ym90dG9tQmxvY2tlcjp0KCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3R0b21CbG9ja2VyKSx0b3BCbG9ja2VyOnQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcEJsb2NrZXIpLHNjcm9sbGVyOnQoImRpdi5kdC1zY3JvbGwtYm9keSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpfSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT8odGhpcy5fYWRkU3R5bGVzKCksdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpKTptLm9uZSgiaW5pdC5kdC5kdGZjIixmdW5jdGlvbigpe3YuX2FkZFN0eWxlcygpLHYuX3NldEtleVRhYmxlTGlzdGVuZXIoKX0pLG0ub24oImNvbHVtbi1zaXppbmcuZHQuZHRmYyBjb2x1bW4tcmVvcmRlci5kdC5kdGZjIGRyYXcuZHQuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gdi5fYWRkU3R5bGVzKCl9KTt2YXIgZz1lLnV0aWwuZGVib3VuY2UoZnVuY3Rpb24oKXt2Ll9hZGRTdHlsZXMoKX0sNTApO3JldHVybiBtLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGZjIixmdW5jdGlvbigpe2coKX0pLHRoaXMuZG9tLnNjcm9sbGVyLm9uKCJzY3JvbGwuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gdi5fc2Nyb2xsKCl9KSx0aGlzLl9zY3JvbGwoKSxtLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucz10aGlzLG0ub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7cmV0dXJuIHYuX2Rlc3Ryb3koKX0pLHRoaXN9cmV0dXJuIGwucHJvdG90eXBlLmVuZD1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXZvaWQgMD8odT49MCYmdTw9dGhpcy5zLmR0LmNvbHVtbnMoKS5jb3VudCgpJiYodGhpcy5jLmVuZD11LHRoaXMuX2FkZFN0eWxlcygpKSx0aGlzKTp0aGlzLmMuZW5kfSxsLnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuZW5kKHUpOnRoaXMuc3RhcnQodSl9LGwucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuc3RhcnQodSk6dGhpcy5lbmQodSl9LGwucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHUpe3JldHVybiB1IT09dm9pZCAwPyh1Pj0wJiZ1PD10aGlzLnMuZHQuY29sdW1ucygpLmNvdW50KCkmJih0aGlzLmMuc3RhcnQ9dSx0aGlzLl9hZGRTdHlsZXMoKSksdGhpcyk6dGhpcy5jLnN0YXJ0fSxsLnByb3RvdHlwZS5fYWRkU3R5bGVzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5zLmR0LHA9dGhpcyx2PXRoaXMucy5kdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksbT11LnRhYmxlKCkuaGVhZGVyLnN0cnVjdHVyZSgiOnZpc2libGUiKSxnPXUudGFibGUoKS5mb290ZXIuc3RydWN0dXJlKCI6dmlzaWJsZSIpLFQ9dS5jb2x1bW5zKCI6dmlzaWJsZSIpLndpZHRocygpLnRvQXJyYXkoKSx3PXQodS50YWJsZSgpLm5vZGUoKSkuY2xvc2VzdCgiZGl2LmR0LXNjcm9sbCIpLGs9dCh1LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKVswXSxQPXRoaXMucy5ydGwsRj10aGlzLmMuc3RhcnQsaD10aGlzLmMuZW5kLG89UD9oOkYsZj1QP0Y6aCxDPXUuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtpZih3Lmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ay5vZmZzZXRXaWR0aD09PWsuY2xpZW50V2lkdGgmJihDPTApLHUuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihldCl7dmFyIEU9dS5jb2x1bW4uaW5kZXgoInRvVmlzaWJsZSIsZXQpLFo7RTxGPyhaPXAuX3N1bShULEUpLHAuX2ZpeENvbHVtbihFLFosInN0YXJ0IixtLGcsQykpOkU+PXYtaD8oWj1wLl9zdW0oVCx2LUUtMSwhMCkscC5fZml4Q29sdW1uKEUsWiwiZW5kIixtLGcsQykpOnAuX2ZpeENvbHVtbihFLDAsIm5vbmUiLG0sZyxDKX0pLHQodS50YWJsZSgpLm5vZGUoKSkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRTdGFydCxGPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkRW5kLGg+MCkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRMZWZ0LG8+MCkudG9nZ2xlQ2xhc3MocC5jbGFzc2VzLnRhYmxlRml4ZWRSaWdodCxmPjApO3ZhciBCPXUudGFibGUoKS5oZWFkZXIoKSxjPXUudGFibGUoKS5mb290ZXIoKSx6PXQoQikub3V0ZXJIZWlnaHQoKSxHPXQoYykub3V0ZXJIZWlnaHQoKTt0aGlzLmRvbS50b3BCbG9ja2VyLmFwcGVuZFRvKHcpLmNzcygidG9wIiwwKS5jc3ModGhpcy5zLnJ0bD8ibGVmdCI6InJpZ2h0IiwwKS5jc3MoImhlaWdodCIseikuY3NzKCJ3aWR0aCIsQysxKS5jc3MoImRpc3BsYXkiLEM/ImJsb2NrIjoibm9uZSIpLGMmJnRoaXMuZG9tLmJvdHRvbUJsb2NrZXIuYXBwZW5kVG8odykuY3NzKCJib3R0b20iLDApLmNzcyh0aGlzLnMucnRsPyJsZWZ0IjoicmlnaHQiLDApLmNzcygiaGVpZ2h0IixHKS5jc3MoIndpZHRoIixDKzEpLmNzcygiZGlzcGxheSIsQz8iYmxvY2siOiJub25lIil9LGwucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zLmR0Lm9mZigiLmR0ZmMiKSx0aGlzLmRvbS5zY3JvbGxlci5vZmYoIi5kdGZjIiksdCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0VuZCsiICIrdGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nTGVmdCsiICIrdGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nU3RhcnQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1JpZ2h0KSx0aGlzLmRvbS5ib3R0b21CbG9ja2VyLnJlbW92ZSgpLHRoaXMuZG9tLnRvcEJsb2NrZXIucmVtb3ZlKCl9LGwucHJvdG90eXBlLl9maXhDb2x1bW49ZnVuY3Rpb24odSxwLHYsbSxnLFQpe3ZhciB3PXRoaXMsaz10aGlzLnMuZHQsUD1mdW5jdGlvbihGLGgpe2lmKHY9PT0ibm9uZSIpRi5jc3MoInBvc2l0aW9uIiwiIikuY3NzKCJsZWZ0IiwiIikuY3NzKCJyaWdodCIsIiIpLnJlbW92ZUNsYXNzKHcuY2xhc3Nlcy5maXhlZEVuZCsiICIrdy5jbGFzc2VzLmZpeGVkTGVmdCsiICIrdy5jbGFzc2VzLmZpeGVkUmlnaHQrIiAiK3cuY2xhc3Nlcy5maXhlZFN0YXJ0KTtlbHNle3ZhciBvPXY9PT0ic3RhcnQiPyJsZWZ0IjoicmlnaHQiO3cucy5ydGwmJihvPXY9PT0ic3RhcnQiPyJyaWdodCI6ImxlZnQiKTt2YXIgZj1wO3Y9PT0iZW5kIiYmKGg9PT0iaGVhZGVyInx8aD09PSJmb290ZXIiKSYmKGYrPVQpLEYuY3NzKCJwb3NpdGlvbiIsInN0aWNreSIpLmNzcyhvLGYpLmFkZENsYXNzKHY9PT0ic3RhcnQiP3cuY2xhc3Nlcy5maXhlZFN0YXJ0OncuY2xhc3Nlcy5maXhlZEVuZCkuYWRkQ2xhc3Mobz09PSJsZWZ0Ij93LmNsYXNzZXMuZml4ZWRMZWZ0OncuY2xhc3Nlcy5maXhlZFJpZ2h0KX19O20uZm9yRWFjaChmdW5jdGlvbihGKXtGW3VdJiZQKHQoRlt1XS5jZWxsKSwiaGVhZGVyIil9KSxQKGsuY29sdW1uKHUrIjp2aXNpYmxlIix7cGFnZToiY3VycmVudCJ9KS5ub2RlcygpLnRvJCgpLCJib2R5IiksZyYmZy5mb3JFYWNoKGZ1bmN0aW9uKEYpe0ZbdV0mJlAodChGW3VdLmNlbGwpLCJmb290ZXIiKX0pfSxsLnByb3RvdHlwZS5fc2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5kb20uc2Nyb2xsZXJbMF07aWYodSl7dmFyIHA9dCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLmFkZCh0aGlzLnMuZHQudGFibGUoKS5oZWFkZXIoKS5wYXJlbnROb2RlKS5hZGQodGhpcy5zLmR0LnRhYmxlKCkuZm9vdGVyKCkucGFyZW50Tm9kZSkuYWRkKCJkaXYuZHQtc2Nyb2xsLWhlYWRJbm5lciB0YWJsZSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpLmFkZCgiZGl2LmR0LXNjcm9sbC1mb290SW5uZXIgdGFibGUiLHRoaXMucy5kdC50YWJsZSgpLmNvbnRhaW5lcigpKSx2PXUuc2Nyb2xsTGVmdCxtPSF0aGlzLnMucnRsLGc9diE9PTAsVD11LnNjcm9sbFdpZHRoPnUuY2xpZW50V2lkdGgrTWF0aC5hYnModikrMTtwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1N0YXJ0LGcpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nRW5kLFQpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nTGVmdCxnJiZtfHxUJiYhbSkscC50b2dnbGVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdSaWdodCxUJiZtfHxnJiYhbSl9fSxsLnByb3RvdHlwZS5fc2V0S2V5VGFibGVMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB1PXRoaXM7dGhpcy5zLmR0Lm9uKCJrZXktZm9jdXMuZHQuZHRmYyIsZnVuY3Rpb24ocCx2LG0pe3ZhciBnLFQ9dChtLm5vZGUoKSkub2Zmc2V0KCksdz11LmRvbS5zY3JvbGxlclswXSxrPXQodCh1LnMuZHQudGFibGUoKS5ub2RlKCkpLmNsb3Nlc3QoImRpdi5kdC1zY3JvbGwtYm9keSIpKTtpZih1LmMuc3RhcnQ+MCl7dmFyIFA9dCh1LnMuZHQuY29sdW1uKHUuYy5zdGFydC0xKS5oZWFkZXIoKSksRj1QLm9mZnNldCgpLGg9UC5vdXRlcldpZHRoKCk7dChtLm5vZGUoKSkuaGFzQ2xhc3ModS5jbGFzc2VzLmZpeGVkTGVmdCk/ay5zY3JvbGxMZWZ0KDApOlQubGVmdDxGLmxlZnQraCYmKGc9ay5zY3JvbGxMZWZ0KCksay5zY3JvbGxMZWZ0KGctKEYubGVmdCtoLVQubGVmdCkpKX1pZih1LmMuZW5kPjApe3ZhciBvPXUucy5kdC5jb2x1bW5zKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGgsZj10KG0ubm9kZSgpKS5vdXRlcldpZHRoKCksQz10KHUucy5kdC5jb2x1bW4oby11LmMuZW5kKS5oZWFkZXIoKSksQj1DLm9mZnNldCgpO3QobS5ub2RlKCkpLmhhc0NsYXNzKHUuY2xhc3Nlcy5maXhlZFJpZ2h0KT9rLnNjcm9sbExlZnQody5zY3JvbGxXaWR0aC13LmNsaWVudFdpZHRoKTpULmxlZnQrZj5CLmxlZnQmJihnPWsuc2Nyb2xsTGVmdCgpLGsuc2Nyb2xsTGVmdChnLShCLmxlZnQtKFQubGVmdCtmKSkpKX19KX0sbC5wcm90b3R5cGUuX3N1bT1mdW5jdGlvbih1LHAsdil7cmV0dXJuIHY9PT12b2lkIDAmJih2PSExKSx2JiYodT11LnNsaWNlKCkucmV2ZXJzZSgpKSx1LnNsaWNlKDAscCkucmVkdWNlKGZ1bmN0aW9uKG0sZyl7cmV0dXJuIG0rZ30sMCl9LGwudmVyc2lvbj0iNS4wLjAiLGwuY2xhc3Nlcz17Ym90dG9tQmxvY2tlcjoiZHRmYy1ib3R0b20tYmxvY2tlciIsZml4ZWRFbmQ6ImR0ZmMtZml4ZWQtZW5kIixmaXhlZExlZnQ6ImR0ZmMtZml4ZWQtbGVmdCIsZml4ZWRSaWdodDoiZHRmYy1maXhlZC1yaWdodCIsZml4ZWRTdGFydDoiZHRmYy1maXhlZC1zdGFydCIsdGFibGVGaXhlZEVuZDoiZHRmYy1oYXMtZW5kIix0YWJsZUZpeGVkTGVmdDoiZHRmYy1oYXMtbGVmdCIsdGFibGVGaXhlZFJpZ2h0OiJkdGZjLWhhcy1yaWdodCIsdGFibGVGaXhlZFN0YXJ0OiJkdGZjLWhhcy1zdGFydCIsdGFibGVTY3JvbGxpbmdFbmQ6ImR0ZmMtc2Nyb2xsaW5nLWVuZCIsdGFibGVTY3JvbGxpbmdMZWZ0OiJkdGZjLXNjcm9sbGluZy1sZWZ0Iix0YWJsZVNjcm9sbGluZ1JpZ2h0OiJkdGZjLXNjcm9sbGluZy1yaWdodCIsdGFibGVTY3JvbGxpbmdTdGFydDoiZHRmYy1zY3JvbGxpbmctc3RhcnQiLHRvcEJsb2NrZXI6ImR0ZmMtdG9wLWJsb2NrZXIifSxsLmRlZmF1bHRzPXtpMThuOntidXR0b246IkZpeGVkQ29sdW1ucyJ9LHN0YXJ0OjEsZW5kOjB9LGx9KCk7cihhciksYXIuZm4uZGF0YVRhYmxlLkZpeGVkQ29sdW1ucz1uLGFyLmZuLkRhdGFUYWJsZS5GaXhlZENvbHVtbnM9bjt2YXIgcz1zdC5BcGkucmVnaXN0ZXI7cygiZml4ZWRDb2x1bW5zKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxzKCJmaXhlZENvbHVtbnMoKS5zdGFydCgpIixmdW5jdGlvbihsKXt2YXIgdT10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KHUuX2ZpeGVkQ29sdW1ucy5zdGFydChsKSx0aGlzKTp1Ll9maXhlZENvbHVtbnMuc3RhcnQoKX0pLHMoImZpeGVkQ29sdW1ucygpLmVuZCgpIixmdW5jdGlvbihsKXt2YXIgdT10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KHUuX2ZpeGVkQ29sdW1ucy5lbmQobCksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLmVuZCgpfSkscygiZml4ZWRDb2x1bW5zKCkubGVmdCgpIixmdW5jdGlvbihsKXt2YXIgdT10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KHUuX2ZpeGVkQ29sdW1ucy5sZWZ0KGwpLHRoaXMpOnUuX2ZpeGVkQ29sdW1ucy5sZWZ0KCl9KSxzKCJmaXhlZENvbHVtbnMoKS5yaWdodCgpIixmdW5jdGlvbihsKXt2YXIgdT10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwhPT12b2lkIDA/KHUuX2ZpeGVkQ29sdW1ucy5yaWdodChsKSx0aGlzKTp1Ll9maXhlZENvbHVtbnMucmlnaHQoKX0pLHN0LmV4dC5idXR0b25zLmZpeGVkQ29sdW1ucz17YWN0aW9uOmZ1bmN0aW9uKGwsdSxwLHYpe2FyKHApLmF0dHIoImFjdGl2ZSIpPyhhcihwKS5yZW1vdmVBdHRyKCJhY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdS5maXhlZENvbHVtbnMoKS5zdGFydCgwKSx1LmZpeGVkQ29sdW1ucygpLmVuZCgwKSk6KGFyKHApLmF0dHIoImFjdGl2ZSIsInRydWUiKS5hZGRDbGFzcygiYWN0aXZlIiksdS5maXhlZENvbHVtbnMoKS5zdGFydCh2LmNvbmZpZy5zdGFydCksdS5maXhlZENvbHVtbnMoKS5lbmQodi5jb25maWcuZW5kKSl9LGNvbmZpZzp7c3RhcnQ6MSxlbmQ6MH0saW5pdDpmdW5jdGlvbihsLHUscCl7bC5zZXR0aW5ncygpWzBdLl9maXhlZENvbHVtbnM9PT12b2lkIDAmJmEobC5zZXR0aW5ncygpLHApLGFyKHUpLmF0dHIoImFjdGl2ZSIsInRydWUiKS5hZGRDbGFzcygiYWN0aXZlIiksbC5idXR0b24odSkudGV4dChwLnRleHR8fGwuaTE4bigiYnV0dG9ucy5maXhlZENvbHVtbnMiLGwuc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zLmMuaTE4bi5idXR0b24pKX0sdGV4dDpudWxsfTtmdW5jdGlvbiBhKGwsdSl7dT09PXZvaWQgMCYmKHU9bnVsbCk7dmFyIHA9bmV3IHN0LkFwaShsKSx2PXV8fHAuaW5pdCgpLmZpeGVkQ29sdW1uc3x8c3QuZGVmYXVsdHMuZml4ZWRDb2x1bW5zLG09bmV3IG4ocCx2KTtyZXR1cm4gbX1hcihkb2N1bWVudCkub24oInBsdWdpbi1pbml0LmR0IixmdW5jdGlvbihsLHUpe2wubmFtZXNwYWNlPT09ImR0IiYmKHUub0luaXQuZml4ZWRDb2x1bW5zfHxzdC5kZWZhdWx0cy5maXhlZENvbHVtbnMpJiYodS5fZml4ZWRDb2x1bW5zfHxhKHUsbnVsbCkpfSl9KSgpO3ZhciBMbD1pZShhZSgpLDEpO3ZhciBCcz1pZShhZSgpLDEpO3ZhciBqdD1Ccy5kZWZhdWx0LEVsPTAsUmw9MCxicj1mdW5jdGlvbih0LGUpe2lmKCFzdC52ZXJzaW9uQ2hlY2t8fCFzdC52ZXJzaW9uQ2hlY2soIjEuMTAuOCIpKXRocm93IktleVRhYmxlIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMC44IG9yIG5ld2VyIjt0aGlzLmM9anQuZXh0ZW5kKCEwLHt9LHN0LmRlZmF1bHRzLmtleVRhYmxlLGJyLmRlZmF1bHRzLGUpLHRoaXMucz17ZHQ6bmV3IHN0LkFwaSh0KSxkdERyYXdpbmc6ITEsZW5hYmxlOiEwLGZvY3VzRHJhdzohMSx3YWl0aW5nRm9yRHJhdzohMSxsYXN0Rm9jdXM6bnVsbCxuYW1lc3BhY2U6Ii5rZXlUYWJsZS0iK0VsKyssdGFiSW5wdXQ6bnVsbH0sdGhpcy5kb209e307dmFyIHI9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sbj1yLmtleXRhYmxlO2lmKG4pcmV0dXJuIG47ci5rZXl0YWJsZT10aGlzLHRoaXMuX2NvbnN0cnVjdG9yKCl9O2p0LmV4dGVuZChici5wcm90b3R5cGUse2JsdXI6ZnVuY3Rpb24oKXt0aGlzLl9ibHVyKCl9LGVuYWJsZTpmdW5jdGlvbih0KXt0aGlzLnMuZW5hYmxlPXR9LGVuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmVuYWJsZX0sZm9jdXM6ZnVuY3Rpb24odCxlKXt0aGlzLl9mb2N1cyh0aGlzLnMuZHQuY2VsbCh0LGUpKX0sZm9jdXNlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnMubGFzdEZvY3VzO2lmKCFlKXJldHVybiExO3ZhciByPXRoaXMucy5sYXN0Rm9jdXMuY2VsbC5pbmRleCgpO3JldHVybiB0LnJvdz09PXIucm93JiZ0LmNvbHVtbj09PXIuY29sdW1ufSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl90YWJJbnB1dCgpO3ZhciB0PXRoaXMsZT10aGlzLnMuZHQscj1qdChlLnRhYmxlKCkubm9kZSgpKSxuPXRoaXMucy5uYW1lc3BhY2Uscz0hMTtpZihyLmNzcygicG9zaXRpb24iKT09PSJzdGF0aWMiJiZyLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLGp0KGUudGFibGUoKS5ib2R5KCkpLm9uKCJjbGljayIrbiwidGgsIHRkIixmdW5jdGlvbih1KXtpZih0LnMuZW5hYmxlIT09ITEpe3ZhciBwPWUuY2VsbCh0aGlzKTtwLmFueSgpJiZ0Ll9mb2N1cyhwLG51bGwsITEsdSl9fSksanQoZG9jdW1lbnQpLm9uKCJrZXlkb3duIituLGZ1bmN0aW9uKHUpeyFzJiYhdC5zLmR0RHJhd2luZz90Ll9rZXkodSk6dS5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy5jLmJsdXJhYmxlJiZqdChkb2N1bWVudCkub24oIm1vdXNlZG93biIrbixmdW5jdGlvbih1KXtqdCh1LnRhcmdldCkucGFyZW50cygiLmRhdGFUYWJsZXNfZmlsdGVyLCAuZHQtc2VhcmNoIikubGVuZ3RoJiZ0Ll9ibHVyKCksIWp0KHUudGFyZ2V0KS5wYXJlbnRzKCkuZmlsdGVyKGUudGFibGUoKS5jb250YWluZXIoKSkubGVuZ3RoJiYoanQodS50YXJnZXQpLnBhcmVudHMoImRpdi5EVEUiKS5sZW5ndGh8fGp0KHUudGFyZ2V0KS5wYXJlbnRzKCJkaXYuZWRpdG9yLWRhdGV0aW1lIikubGVuZ3RofHxqdCh1LnRhcmdldCkucGFyZW50cygiZGl2LmR0LWRhdGV0aW1lIikubGVuZ3RofHxqdCh1LnRhcmdldCkucGFyZW50cygpLmZpbHRlcigiLkRURkNfQ2xvbmVkIikubGVuZ3RofHx0Ll9ibHVyKCkpfSksdGhpcy5jLmVkaXRvcil7dmFyIGE9dGhpcy5jLmVkaXRvcjthLm9uKCJvcGVuLmtleVRhYmxlTWFpbiIsZnVuY3Rpb24odSxwLHYpe3AhPT0iaW5saW5lIiYmdC5zLmVuYWJsZSYmKHQuZW5hYmxlKCExKSxhLm9uZSgiY2xvc2UiK24sZnVuY3Rpb24oKXt0LmVuYWJsZSghMCl9KSl9KSx0aGlzLmMuZWRpdE9uRm9jdXMmJmUub24oImtleS1mb2N1cyIrbisiIGtleS1yZWZvY3VzIituLGZ1bmN0aW9uKHUscCx2LG0pe3QuX2VkaXRvcihudWxsLG0sITApfSksZS5vbigia2V5IituLGZ1bmN0aW9uKHUscCx2LG0sZyl7dC5fZWRpdG9yKHYsZywhMSl9KSxqdChlLnRhYmxlKCkuYm9keSgpKS5vbigiZGJsY2xpY2siK24sInRoLCB0ZCIsZnVuY3Rpb24odSl7aWYodC5zLmVuYWJsZSE9PSExKXt2YXIgcD1lLmNlbGwodGhpcyk7cC5hbnkoKSYmKHQucy5sYXN0Rm9jdXMmJnRoaXMhPT10LnMubGFzdEZvY3VzLmNlbGwubm9kZSgpfHx0Ll9lZGl0b3IobnVsbCx1LCEwKSl9fSksYS5vbigicHJlU3VibWl0IixmdW5jdGlvbigpe3M9ITB9KS5vbigicHJlU3VibWl0Q2FuY2VsbGVkIixmdW5jdGlvbigpe3M9ITF9KS5vbigic3VibWl0Q29tcGxldGUiLGZ1bmN0aW9uKCl7cz0hMX0pfWUub24oInN0YXRlU2F2ZVBhcmFtcyIrbixmdW5jdGlvbih1LHAsdil7di5rZXlUYWJsZT10LnMubGFzdEZvY3VzP3Qucy5sYXN0Rm9jdXMuY2VsbC5pbmRleCgpOm51bGx9KSxlLm9uKCJjb2x1bW4tdmlzaWJpbGl0eSIrbixmdW5jdGlvbih1KXt0Ll90YWJJbnB1dCgpfSksZS5vbigiY29sdW1uLXJlb3JkZXIiK24sZnVuY3Rpb24odSxwLHYpe3ZhciBtPXQucy5sYXN0Rm9jdXM7aWYobSYmbS5jZWxsKXt2YXIgZz1tLnJlbGF0aXZlLmNvbHVtbjttLmNlbGxbMF1bMF0uY29sdW1uPXYubWFwcGluZy5pbmRleE9mKGcpLG0ucmVsYXRpdmUuY29sdW1uPXYubWFwcGluZy5pbmRleE9mKGcpfX0pLGUub24oInByZURyYXciK24rIiBzY3JvbGxlci13aWxsLWRyYXciK24sZnVuY3Rpb24odSl7dC5zLmR0RHJhd2luZz0hMH0pLGUub24oImRyYXciK24sZnVuY3Rpb24odSl7aWYodC5zLmR0RHJhd2luZz0hMSx0Ll90YWJJbnB1dCgpLCF0LnMuZm9jdXNEcmF3KXt2YXIgcD10LnMubGFzdEZvY3VzO2lmKHApe3ZhciB2PXQucy5sYXN0Rm9jdXMucmVsYXRpdmUsbT1lLnBhZ2UuaW5mbygpLGc9di5yb3c7aWYobS5yZWNvcmRzRGlzcGxheT09PTB8fGc8bS5zdGFydHx8Zz5tLnN0YXJ0K20ubGVuZ3RoKXJldHVybjtnPj1tLnJlY29yZHNEaXNwbGF5JiYoZz1tLnJlY29yZHNEaXNwbGF5LTEpLHQuX2ZvY3VzKGcsdi5jb2x1bW4sITAsdSl9fX0pLHRoaXMuYy5jbGlwYm9hcmQmJnRoaXMuX2NsaXBib2FyZCgpLGUub24oImRlc3Ryb3kiK24sZnVuY3Rpb24oKXt0Ll9ibHVyKCEwKSxlLm9mZihuKSxqdChlLnRhYmxlKCkuYm9keSgpKS5vZmYoImNsaWNrIituLCJ0aCwgdGQiKS5vZmYoImRibGNsaWNrIituLCJ0aCwgdGQiKSxqdChkb2N1bWVudCkub2ZmKCJtb3VzZWRvd24iK24pLm9mZigia2V5ZG93biIrbikub2ZmKCJjb3B5IituKS5vZmYoInBhc3RlIituKX0pO3ZhciBsPWUuc3RhdGUubG9hZGVkKCk7bCYmbC5rZXlUYWJsZT9lLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXt2YXIgdT1lLmNlbGwobC5rZXlUYWJsZSk7dS5hbnkoKSYmdS5mb2N1cygpfSk6dGhpcy5jLmZvY3VzJiZlLmNlbGwodGhpcy5jLmZvY3VzKS5mb2N1cygpfSxfYmx1cjpmdW5jdGlvbih0KXtpZighKCF0aGlzLnMuZW5hYmxlfHwhdGhpcy5zLmxhc3RGb2N1cykpe3ZhciBlPXRoaXMucy5sYXN0Rm9jdXMuY2VsbDtqdChlLm5vZGUoKSkucmVtb3ZlQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSksdGhpcy5zLmxhc3RGb2N1cz1udWxsLHR8fCh0aGlzLl91cGRhdGVGaXhlZENvbHVtbnMoZS5pbmRleCgpLmNvbHVtbiksdGhpcy5fZW1pdEV2ZW50KCJrZXktYmx1ciIsW3RoaXMucy5kdCxlXSkpfX0sX2NsaXBib2FyZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXRoaXMscj10aGlzLnMubmFtZXNwYWNlLG49dGhpcy5jLmNsaXBib2FyZDt3aW5kb3cuZ2V0U2VsZWN0aW9uJiYoKG49PT0hMHx8bi5jb3B5KSYmanQoZG9jdW1lbnQpLm9uKCJjb3B5IityLGZ1bmN0aW9uKHMpe3ZhciBhPXMub3JpZ2luYWxFdmVudCxsPXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLHU9ZS5zLmxhc3RGb2N1czshbCYmdSYmKGEuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIix1LmNlbGwucmVuZGVyKGUuYy5jbGlwYm9hcmRPcnRob2dvbmFsKSksYS5wcmV2ZW50RGVmYXVsdCgpKX0pLChuPT09ITB8fG4ucGFzdGUpJiZqdChkb2N1bWVudCkub24oInBhc3RlIityLGZ1bmN0aW9uKHMpe3ZhciBhPXMub3JpZ2luYWxFdmVudCxsPWUucy5sYXN0Rm9jdXMsdT1kb2N1bWVudC5hY3RpdmVFbGVtZW50LHA9ZS5jLmVkaXRvcix2O2lmKGwmJighdXx8dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJvZHkiKSlpZihhLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsaXBib2FyZERhdGEmJndpbmRvdy5jbGlwYm9hcmREYXRhLmdldERhdGE/dj13aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik6YS5jbGlwYm9hcmREYXRhJiZhLmNsaXBib2FyZERhdGEuZ2V0RGF0YSYmKHY9YS5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQvcGxhaW4iKSkscCl7dmFyIG09ZS5faW5saW5lT3B0aW9ucyhsLmNlbGwuaW5kZXgoKSk7cC5pbmxpbmUobS5jZWxsLG0uZmllbGQsbS5vcHRpb25zKS5zZXQocC5kaXNwbGF5ZWQoKVswXSx2KS5zdWJtaXQoKX1lbHNlIGwuY2VsbC5kYXRhKHYpLHQuZHJhdyghMSl9KSl9LF9jb2x1bW5zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zLmR0LGU9dC5jb2x1bW5zKHRoaXMuYy5jb2x1bW5zKS5pbmRleGVzKCkscj1bXTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmV2ZXJ5KGZ1bmN0aW9uKG4pe2UuaW5kZXhPZihuKSE9PS0xJiZyLnB1c2gobil9KSxyfSxfZWRpdG9yOmZ1bmN0aW9uKHQsZSxyKXtpZih0aGlzLnMubGFzdEZvY3VzJiYhKGUmJmUudHlwZT09PSJkcmF3Iikpe3ZhciBuPXRoaXMscz10aGlzLnMuZHQsYT10aGlzLmMuZWRpdG9yLGw9dGhpcy5zLmxhc3RGb2N1cy5jZWxsLHU9dGhpcy5zLm5hbWVzcGFjZSsiZSIrUmwrKztpZighanQoImRpdi5EVEUiLGwubm9kZSgpKS5sZW5ndGgmJiEodCE9PW51bGwmJih0Pj0wJiZ0PD05fHx0PT09MTF8fHQ9PT0xMnx8dD49MTQmJnQ8PTMxfHx0Pj0xMTImJnQ8PTEyM3x8dD49MTI3JiZ0PD0xNTkpKSl7ZSYmKGUuc3RvcFByb3BhZ2F0aW9uKCksdD09PTEzJiZlLnByZXZlbnREZWZhdWx0KCkpO3ZhciBwPWZ1bmN0aW9uKCl7dmFyIHY9bi5faW5saW5lT3B0aW9ucyhsLmluZGV4KCkpO2Eub25lKCJvcGVuIit1LGZ1bmN0aW9uKCl7YS5vZmYoImNhbmNlbE9wZW4iK3UpLHJ8fGp0KCJkaXYuRFRFX0ZpZWxkX0lucHV0Q29udHJvbCBpbnB1dCwgZGl2LkRURV9GaWVsZF9JbnB1dENvbnRyb2wgdGV4dGFyZWEiKS5zZWxlY3QoKSxzLmtleXMuZW5hYmxlKHI/InRhYi1vbmx5IjoibmF2aWdhdGlvbi1vbmx5Iikscy5vbigia2V5LWJsdXIuZWRpdG9yIixmdW5jdGlvbihtLGcsVCl7YS5zLmVkaXRPcHRzLm9uQmx1ciE9PSJzdWJtaXQiJiZhLmRpc3BsYXllZCgpJiZULm5vZGUoKT09PWwubm9kZSgpJiZhLnN1Ym1pdCgpfSksciYmanQocy50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGRDbGFzcygiZHRrLWZvY3VzLWFsdCIpLGEub24oInByZVN1Ym1pdENhbmNlbGxlZCIrdSxmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuLl9mb2N1cyhsLG51bGwsITEpfSw1MCl9KSxhLm9uKCJzdWJtaXRVbnN1Y2Nlc3NmdWwiK3UsZnVuY3Rpb24oKXtuLl9mb2N1cyhsLG51bGwsITEpfSksYS5vbmUoImNsb3NlIit1LGZ1bmN0aW9uKCl7cy5rZXlzLmVuYWJsZSghMCkscy5vZmYoImtleS1ibHVyLmVkaXRvciIpLGEub2ZmKHUpLGp0KHMudGFibGUoKS5jb250YWluZXIoKSkucmVtb3ZlQ2xhc3MoImR0ay1mb2N1cy1hbHQiKSxuLnMucmV0dXJuU3VibWl0JiYobi5zLnJldHVyblN1Ym1pdD0hMSxuLl9lbWl0RXZlbnQoImtleS1yZXR1cm4tc3VibWl0IixbcyxsXSkpfSl9KS5vbmUoImNhbmNlbE9wZW4iK3UsZnVuY3Rpb24oKXthLm9mZih1KX0pLmlubGluZSh2LmNlbGwsdi5maWVsZCx2Lm9wdGlvbnMpfTt0PT09MTM/KHI9ITAsanQoZG9jdW1lbnQpLm9uZSgia2V5dXAiLGZ1bmN0aW9uKCl7cCgpfSkpOnAoKX19fSxfaW5saW5lT3B0aW9uczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jLmVkaXRvck9wdGlvbnM/dGhpcy5jLmVkaXRvck9wdGlvbnModCk6e2NlbGw6dCxmaWVsZDp2b2lkIDAsb3B0aW9uczp2b2lkIDB9fSxfZW1pdEV2ZW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucy5kdC5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIsbil7cmV0dXJuIGp0KHIublRhYmxlKS50cmlnZ2VySGFuZGxlcih0LGUpfSl9LF9mb2N1czpmdW5jdGlvbih0LGUscixuKXt2YXIgcz10aGlzLGE9dGhpcy5zLmR0LGw9YS5wYWdlLmluZm8oKSx1PXRoaXMucy5sYXN0Rm9jdXM7aWYobnx8KG49bnVsbCksISF0aGlzLnMuZW5hYmxlKXtpZih0eXBlb2YgdCE9Im51bWJlciIpe2lmKCF0LmFueSgpKXJldHVybjt2YXIgcD10LmluZGV4KCk7aWYoZT1wLmNvbHVtbix0PWEucm93cyh7ZmlsdGVyOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5pbmRleGVzKCkuaW5kZXhPZihwLnJvdyksdDwwKXJldHVybjtsLnNlcnZlclNpZGUmJih0Kz1sLnN0YXJ0KX1pZihsLmxlbmd0aCE9PS0xJiYodDxsLnN0YXJ0fHx0Pj1sLnN0YXJ0K2wubGVuZ3RoKSl7dGhpcy5zLmZvY3VzRHJhdz0hMCx0aGlzLnMud2FpdGluZ0ZvckRyYXc9ITAsYS5vbmUoImRyYXciLGZ1bmN0aW9uKCl7cy5zLmZvY3VzRHJhdz0hMSxzLnMud2FpdGluZ0ZvckRyYXc9ITEscy5fZm9jdXModCxlLHZvaWQgMCxuKX0pLnBhZ2UoTWF0aC5mbG9vcih0L2wubGVuZ3RoKSkuZHJhdyghMSk7cmV0dXJufWlmKGp0LmluQXJyYXkoZSx0aGlzLl9jb2x1bW5zKCkpIT09LTEpe2wuc2VydmVyU2lkZSYmKHQtPWwuc3RhcnQpO3ZhciB2PWEuY2VsbHMobnVsbCxlLHtzZWFyY2g6ImFwcGxpZWQiLG9yZGVyOiJhcHBsaWVkIn0pLmZsYXR0ZW4oKSxtPWEuY2VsbCh2W3RdKSxnPXRoaXMuX2VtaXRFdmVudCgia2V5LXByZWZvY3VzIixbdGhpcy5zLmR0LG0sbnx8bnVsbF0pO2lmKGcuaW5kZXhPZighMSk9PT0tMSl7aWYodSl7aWYodS5ub2RlPT09bS5ub2RlKCkpe3RoaXMuX2VtaXRFdmVudCgia2V5LXJlZm9jdXMiLFt0aGlzLnMuZHQsbSxufHxudWxsXSk7cmV0dXJufXRoaXMuX2JsdXIoKX10aGlzLl9yZW1vdmVPdGhlckZvY3VzKCk7dmFyIFQ9anQobS5ub2RlKCkpO2lmKFQuYWRkQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSksdGhpcy5fdXBkYXRlRml4ZWRDb2x1bW5zKGUpLHI9PT12b2lkIDB8fHI9PT0hMCl7dGhpcy5fc2Nyb2xsKGp0KHdpbmRvdyksanQoZG9jdW1lbnQuYm9keSksVCwib2Zmc2V0Iik7dmFyIHc9YS50YWJsZSgpLmJvZHkoKS5wYXJlbnROb2RlO2lmKHchPT1hLnRhYmxlKCkuaGVhZGVyKCkucGFyZW50Tm9kZSl7dmFyIGs9anQody5wYXJlbnROb2RlKTt0aGlzLl9zY3JvbGwoayxrLFQsInBvc2l0aW9uIil9fXZhciBQPWEucGFnZS5pbmZvKCk7dGhpcy5zLmxhc3RGb2N1cz17Y2VsbDptLG5vZGU6bS5ub2RlKCkscmVsYXRpdmU6e3JvdzpQLnN0YXJ0K2Eucm93cyh7cGFnZToiY3VycmVudCJ9KS5pbmRleGVzKCkuaW5kZXhPZihtLmluZGV4KCkucm93KSxjb2x1bW46bS5pbmRleCgpLmNvbHVtbn19LHRoaXMuX2VtaXRFdmVudCgia2V5LWZvY3VzIixbdGhpcy5zLmR0LG0sbnx8bnVsbF0pLGEuc3RhdGUuc2F2ZSgpfX19fSxfa2V5OmZ1bmN0aW9uKHQpe2lmKHRoaXMucy53YWl0aW5nRm9yRHJhdyl7dC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn1pZighanQodC50YXJnZXQpLmNsb3Nlc3QoIi5kdGUtaW5saW5lQWRkIikubGVuZ3RoKXt2YXIgZT10aGlzLnMuZW5hYmxlO3RoaXMucy5yZXR1cm5TdWJtaXQ9KGU9PT0ibmF2aWdhdGlvbi1vbmx5Inx8ZT09PSJ0YWItb25seSIpJiZ0LmtleUNvZGU9PT0xMzt2YXIgcj1lPT09ITB8fGU9PT0ibmF2aWdhdGlvbi1vbmx5IjtpZihlJiYhKCh0LmtleUNvZGU9PT0wfHx0LmN0cmxLZXl8fHQubWV0YUtleXx8dC5hbHRLZXkpJiYhKHQuY3RybEtleSYmdC5hbHRLZXkpKSl7dmFyIG49dGhpcy5zLmxhc3RGb2N1cztpZihuKXtpZighdGhpcy5zLmR0LmNlbGwobi5ub2RlKS5hbnkoKSl7dGhpcy5zLmxhc3RGb2N1cz1udWxsO3JldHVybn12YXIgcz10aGlzLGE9dGhpcy5zLmR0LGw9ISF0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vU2Nyb2xsLnNZO2lmKCEodGhpcy5jLmtleXMmJmp0LmluQXJyYXkodC5rZXlDb2RlLHRoaXMuYy5rZXlzKT09PS0xKSlzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDk6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe3MuX3NoaWZ0KHQsdC5zaGlmdEtleT8ibGVmdCI6InJpZ2h0IiwhMCl9KTticmVhaztjYXNlIDI3OmlmKGp0KG4ubm9kZSkuZmluZCgiZGl2LkRURSIpLmxlbmd0aClyZXR1cm47dGhpcy5jLmJsdXJhYmxlJiZlPT09ITAmJnRoaXMuX2JsdXIoKTticmVhaztjYXNlIDMzOmNhc2UgMzQ6ciYmIWwmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7YS5wYWdlKHQua2V5Q29kZT09PTMzPyJwcmV2aW91cyI6Im5leHQiKS5kcmF3KCExKX0pKTticmVhaztjYXNlIDM1OmNhc2UgMzY6ciYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXt2YXIgdT1hLmNlbGxzKHtwYWdlOiJjdXJyZW50In0pLmluZGV4ZXMoKSxwPXMuX2NvbHVtbnMoKTtzLl9mb2N1cyhhLmNlbGwodVt0LmtleUNvZGU9PT0zNT91Lmxlbmd0aC0xOnBbMF1dKSxudWxsLCEwLHQpfSkpO2JyZWFrO2Nhc2UgMzc6ciYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwibGVmdCIpfSk7YnJlYWs7Y2FzZSAzODpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJ1cCIpfSk7YnJlYWs7Y2FzZSAzOTpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJyaWdodCIpfSk7YnJlYWs7Y2FzZSA0MDpyJiZ0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LCJkb3duIil9KTticmVhaztjYXNlIDExMzppZih0aGlzLmMuZWRpdG9yKXt0aGlzLl9lZGl0b3IobnVsbCx0LCEwKTticmVha31kZWZhdWx0OmU9PT0hMCYmdGhpcy5fZW1pdEV2ZW50KCJrZXkiLFthLHQua2V5Q29kZSx0aGlzLnMubGFzdEZvY3VzLmNlbGwsdF0pO2JyZWFrfX19fX0sX2tleUFjdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmMuZWRpdG9yO2UmJmUubW9kZSgpP2Uuc3VibWl0KHQpOnQoKX0sX3JlbW92ZU90aGVyRm9jdXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnMuZHQudGFibGUoKS5ub2RlKCk7anQuZm4uZGF0YVRhYmxlLnRhYmxlcyh7YXBpOiEwfSkuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXt0aGlzLnRhYmxlKCkubm9kZSgpIT09dCYmdGhpcy5jZWxsLmJsdXIoKX0pfSxfc2Nyb2xsOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBzPXJbbl0oKSxhPXIub3V0ZXJIZWlnaHQoKSxsPXIub3V0ZXJXaWR0aCgpLHU9ZS5zY3JvbGxUb3AoKSxwPWUuc2Nyb2xsTGVmdCgpLHY9dC5oZWlnaHQoKSxtPXQud2lkdGgoKTtuPT09InBvc2l0aW9uIiYmKHMudG9wKz1wYXJzZUludChyLmNsb3Nlc3QoInRhYmxlIikuY3NzKCJ0b3AiKSwxMCkpLHMudG9wPHUmJnMudG9wK2E+dS01JiZlLnNjcm9sbFRvcChzLnRvcCkscy5sZWZ0PHAmJmUuc2Nyb2xsTGVmdChzLmxlZnQpLHMudG9wK2E+dSt2JiZzLnRvcDx1K3YrNSYmYTx2JiZlLnNjcm9sbFRvcChzLnRvcCthLXYpLHMubGVmdCtsPnArbSYmbDxtJiZlLnNjcm9sbExlZnQocy5sZWZ0K2wtbSl9LF9zaGlmdDpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5zLmR0LHM9bi5wYWdlLmluZm8oKSxhPXMucmVjb3Jkc0Rpc3BsYXksbD10aGlzLl9jb2x1bW5zKCksdT10aGlzLnMubGFzdEZvY3VzO2lmKHUpe3ZhciBwPXUuY2VsbDtpZihwKXt2YXIgdj1uLnJvd3Moe2ZpbHRlcjoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSkuaW5kZXhlcygpLmluZGV4T2YocC5pbmRleCgpLnJvdyk7cy5zZXJ2ZXJTaWRlJiYodis9cy5zdGFydCk7dmFyIG09bi5jb2x1bW5zKGwpLmluZGV4ZXMoKS5pbmRleE9mKHAuaW5kZXgoKS5jb2x1bW4pLGc9dixUPWxbbV07anQobi50YWJsZSgpLm5vZGUoKSkuY3NzKCJkaXJlY3Rpb24iKT09PSJydGwiJiYoZT09PSJyaWdodCI/ZT0ibGVmdCI6ZT09PSJsZWZ0IiYmKGU9InJpZ2h0IikpLGU9PT0icmlnaHQiP20+PWwubGVuZ3RoLTE/KGcrKyxUPWxbMF0pOlQ9bFttKzFdOmU9PT0ibGVmdCI/bT09PTA/KGctLSxUPWxbbC5sZW5ndGgtMV0pOlQ9bFttLTFdOmU9PT0idXAiP2ctLTplPT09ImRvd24iJiZnKyssZz49MCYmZzxhJiZqdC5pbkFycmF5KFQsbCkhPT0tMT8odCYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzKGcsVCwhMCx0KSk6IXJ8fCF0aGlzLmMuYmx1cmFibGU/dCYmdC5wcmV2ZW50RGVmYXVsdCgpOnRoaXMuX2JsdXIoKX19fSxfdGFiSW5wdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LHI9dGhpcy5jLnRhYkluZGV4IT09bnVsbD90aGlzLmMudGFiSW5kZXg6ZS5zZXR0aW5ncygpWzBdLmlUYWJJbmRleDtpZihyIT0tMSl7aWYoIXRoaXMucy50YWJJbnB1dCl7dmFyIG49anQoJzxkaXY+PGlucHV0IHR5cGU9InRleHQiIHRhYmluZGV4PSInK3IrJyIvPjwvZGl2PicpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixoZWlnaHQ6MSx3aWR0aDowLG92ZXJmbG93OiJoaWRkZW4ifSk7bi5jaGlsZHJlbigpLm9uKCJmb2N1cyIsZnVuY3Rpb24oYSl7dmFyIGw9ZS5jZWxsKCI6ZXEoMCkiLHQuX2NvbHVtbnMoKSx7cGFnZToiY3VycmVudCJ9KTtsLmFueSgpJiZ0Ll9mb2N1cyhsLG51bGwsITAsYSl9KSx0aGlzLnMudGFiSW5wdXQ9bn12YXIgcz10aGlzLnMuZHQuY2VsbCgiOmVxKDApIiwiMDp2aXNpYmxlIix7cGFnZToiY3VycmVudCIsb3JkZXI6ImN1cnJlbnQifSkubm9kZSgpO3MmJmp0KHMpLnByZXBlbmQodGhpcy5zLnRhYklucHV0KX19LF91cGRhdGVGaXhlZENvbHVtbnM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmR0LHI9ZS5zZXR0aW5ncygpWzBdO2lmKHIuX29GaXhlZENvbHVtbnMpe3ZhciBuPXIuX29GaXhlZENvbHVtbnMucy5pTGVmdENvbHVtbnMscz1yLmFvQ29sdW1ucy5sZW5ndGgtci5fb0ZpeGVkQ29sdW1ucy5zLmlSaWdodENvbHVtbnM7KHQ8bnx8dD49cykmJmUuZml4ZWRDb2x1bW5zKCkudXBkYXRlKCl9fX0pO2JyLmRlZmF1bHRzPXtibHVyYWJsZTohMCxjbGFzc05hbWU6ImZvY3VzIixjbGlwYm9hcmQ6ITAsY2xpcGJvYXJkT3J0aG9nb25hbDoiZGlzcGxheSIsY29sdW1uczoiIixlZGl0b3I6bnVsbCxlZGl0T25Gb2N1czohMSxlZGl0b3JPcHRpb25zOm51bGwsZm9jdXM6bnVsbCxrZXlzOm51bGwsdGFiSW5kZXg6bnVsbH07YnIudmVyc2lvbj0iMi4xMi4wIjtqdC5mbi5kYXRhVGFibGUuS2V5VGFibGU9YnI7anQuZm4uRGF0YVRhYmxlLktleVRhYmxlPWJyO3N0LkFwaS5yZWdpc3RlcigiY2VsbC5ibHVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXt0LmtleXRhYmxlJiZ0LmtleXRhYmxlLmJsdXIoKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJjZWxsKCkuZm9jdXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLHIpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuZm9jdXMoZSxyKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJrZXlzLmRpc2FibGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuZW5hYmxlKCExKX0pfSk7c3QuQXBpLnJlZ2lzdGVyKCJrZXlzLmVuYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uua2V5dGFibGUmJmUua2V5dGFibGUuZW5hYmxlKHQ9PT12b2lkIDA/ITA6dCl9KX0pO3N0LkFwaS5yZWdpc3Rlcigia2V5cy5lbmFibGVkKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gZS5sZW5ndGgmJmVbMF0ua2V5dGFibGU/ZVswXS5rZXl0YWJsZS5lbmFibGVkKCk6ITF9KTtzdC5BcGkucmVnaXN0ZXIoImtleXMubW92ZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uua2V5dGFibGUmJmUua2V5dGFibGUuX3NoaWZ0KG51bGwsdCwhMSl9KX0pO3N0LmV4dC5zZWxlY3Rvci5jZWxsLnB1c2goZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUuZm9jdXNlZCxzPXQua2V5dGFibGUsYT1bXTtpZighc3x8bj09PXZvaWQgMClyZXR1cm4gcjtmb3IodmFyIGw9MCx1PXIubGVuZ3RoO2w8dTtsKyspKG49PT0hMCYmcy5mb2N1c2VkKHJbbF0pfHxuPT09ITEmJiFzLmZvY3VzZWQocltsXSkpJiZhLnB1c2gocltsXSk7cmV0dXJuIGF9KTtqdChkb2N1bWVudCkub24oInByZUluaXQuZHQuZHRrIixmdW5jdGlvbih0LGUscil7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LmtleXMscz1zdC5kZWZhdWx0cy5rZXlzO2lmKG58fHMpe3ZhciBhPWp0LmV4dGVuZCh7fSxzLG4pO24hPT0hMSYmbmV3IGJyKGUsYSl9fX0pO3ZhciB6bD1pZShhZSgpLDEpO3ZhciBOcz1pZShhZSgpLDEpO3ZhciBPZT1Ocy5kZWZhdWx0LHZyPWZ1bmN0aW9uKHQsZSl7aWYoIXN0LnZlcnNpb25DaGVja3x8IXN0LnZlcnNpb25DaGVjaygiMS4xMSIpKXRocm93IlJvd0dyb3VwIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMSBvciBuZXdlciI7dGhpcy5jPU9lLmV4dGVuZCghMCx7fSxzdC5kZWZhdWx0cy5yb3dHcm91cCx2ci5kZWZhdWx0cyxlKSx0aGlzLnM9e2R0Om5ldyBzdC5BcGkodCl9LHRoaXMuZG9tPXt9O3ZhciByPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLG49ci5yb3dHcm91cDtpZihuKXJldHVybiBuO3Iucm93R3JvdXA9dGhpcyx0aGlzLl9jb25zdHJ1Y3RvcigpfTtPZS5leHRlbmQodnIucHJvdG90eXBlLHtkYXRhU3JjOmZ1bmN0aW9uKHQpe2lmKHQ9PT12b2lkIDApcmV0dXJuIHRoaXMuYy5kYXRhU3JjO3ZhciBlPXRoaXMucy5kdDtyZXR1cm4gdGhpcy5jLmRhdGFTcmM9dCxPZShlLnRhYmxlKCkubm9kZSgpKS50cmlnZ2VySGFuZGxlcigicm93Z3JvdXAtZGF0YXNyYy5kdCIsW2UsdF0pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLmVuYWJsZT0hMSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT90aGlzLmRpc2FibGUoKToodGhpcy5jLmVuYWJsZT0hMCx0aGlzKX0sZW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuZW5hYmxlfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LHI9ZS5zZXR0aW5ncygpWzBdO2Uub24oImRyYXcuZHRyZyIsZnVuY3Rpb24obixzKXt0LmMuZW5hYmxlJiZyPT09cyYmdC5fZHJhdygpfSksZS5vbigiY29sdW1uLXZpc2liaWxpdHkuZHQuZHRyZyByZXNwb25zaXZlLXJlc2l6ZS5kdC5kdHJnIixmdW5jdGlvbigpe3QuX2FkanVzdENvbHNwYW4oKX0pLGUub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZS5vZmYoIi5kdHJnIil9KX0sX2FkanVzdENvbHNwYW46ZnVuY3Rpb24oKXtPZSgidHIuIit0aGlzLmMuY2xhc3NOYW1lLHRoaXMucy5kdC50YWJsZSgpLmJvZHkoKSkuZmluZCgidGg6dmlzaWJsZSwgdGQ6dmlzaWJsZSIpLmF0dHIoImNvbHNwYW4iLHRoaXMuX2NvbHNwYW4oKSl9LF9jb2xzcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdC5jb2x1bW5zKCkudmlzaWJsZSgpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApfSxfZHJhdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXRoaXMuX2dyb3VwKDAsdC5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmluZGV4ZXMoKSk7dGhpcy5fZ3JvdXBEaXNwbGF5KDAsZSl9LF9ncm91cDpmdW5jdGlvbih0LGUpe3ZhciByPUFycmF5LmlzQXJyYXkodGhpcy5jLmRhdGFTcmMpP3RoaXMuYy5kYXRhU3JjOlt0aGlzLmMuZGF0YVNyY10sbj1zdC51dGlsLmdldChyW3RdKSxzPXRoaXMucy5kdCxhLGwsdSxwLHY9W10sbT10aGlzO2Zvcih1PTAscD1lLmxlbmd0aDt1PHA7dSsrKXt2YXIgZz1lW3VdLFQ9cy5yb3coZykuZGF0YSgpO2E9bihULHQpLGE9PW51bGwmJihhPW0uYy5lbXB0eURhdGFHcm91cCksKGw9PT12b2lkIDB8fGEhPT1sKSYmKHYucHVzaCh7ZGF0YVBvaW50OmEscm93czpbXX0pLGw9YSksdlt2Lmxlbmd0aC0xXS5yb3dzLnB1c2goZyl9aWYoclt0KzFdIT09dm9pZCAwKWZvcih1PTAscD12Lmxlbmd0aDt1PHA7dSsrKXZbdV0uY2hpbGRyZW49dGhpcy5fZ3JvdXAodCsxLHZbdV0ucm93cyk7cmV0dXJuIHZ9LF9ncm91cERpc3BsYXk6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5zLmR0LG4scz0wLGE9ZS5sZW5ndGg7czxhO3MrKyl7dmFyIGw9ZVtzXSx1PWwuZGF0YVBvaW50LHAsdj1sLnJvd3M7dGhpcy5jLnN0YXJ0UmVuZGVyJiYobj10aGlzLmMuc3RhcnRSZW5kZXIuY2FsbCh0aGlzLHIucm93cyh2KSx1LHQpLHA9dGhpcy5fcm93V3JhcChuLHRoaXMuYy5zdGFydENsYXNzTmFtZSx0KSxwJiZwLmluc2VydEJlZm9yZShyLnJvdyh2WzBdKS5ub2RlKCkpKSx0aGlzLmMuZW5kUmVuZGVyJiYobj10aGlzLmMuZW5kUmVuZGVyLmNhbGwodGhpcyxyLnJvd3ModiksdSx0KSxwPXRoaXMuX3Jvd1dyYXAobix0aGlzLmMuZW5kQ2xhc3NOYW1lLHQpLHAmJnAuaW5zZXJ0QWZ0ZXIoci5yb3codlt2Lmxlbmd0aC0xXSkubm9kZSgpKSksbC5jaGlsZHJlbiYmdGhpcy5fZ3JvdXBEaXNwbGF5KHQrMSxsLmNoaWxkcmVuKX19LF9yb3dXcmFwOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbjtyZXR1cm4odD09PW51bGx8fHQ9PT0iIikmJih0PXRoaXMuYy5lbXB0eURhdGFHcm91cCksdD09bnVsbD9udWxsOih0eXBlb2YgdD09Im9iamVjdCImJnQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI/bj1PZSh0KTp0IGluc3RhbmNlb2YgT2UmJnQubGVuZ3RoJiZ0WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idHIiP249dDpuPU9lKCI8dHIvPiIpLmFwcGVuZChPZSgiPHRoLz4iKS5hdHRyKCJjb2xzcGFuIix0aGlzLl9jb2xzcGFuKCkpLmF0dHIoInNjb3BlIiwicm93IikuYXBwZW5kKHQpKSxuLmFkZENsYXNzKHRoaXMuYy5jbGFzc05hbWUpLmFkZENsYXNzKGUpLmFkZENsYXNzKCJkdHJnLWxldmVsLSIrcikpfX0pO3ZyLmRlZmF1bHRzPXtjbGFzc05hbWU6ImR0cmctZ3JvdXAiLGRhdGFTcmM6MCxlbXB0eURhdGFHcm91cDoiTm8gZ3JvdXAiLGVuYWJsZTohMCxlbmRDbGFzc05hbWU6ImR0cmctZW5kIixlbmRSZW5kZXI6bnVsbCxzdGFydENsYXNzTmFtZToiZHRyZy1zdGFydCIsc3RhcnRSZW5kZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZX19O3ZyLnZlcnNpb249IjEuNS4wIjtPZS5mbi5kYXRhVGFibGUuUm93R3JvdXA9dnI7T2UuZm4uRGF0YVRhYmxlLlJvd0dyb3VwPXZyO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5kaXNhYmxlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXt0LnJvd0dyb3VwJiZ0LnJvd0dyb3VwLmVuYWJsZSghMSl9KX0pO3N0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5lbmFibGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLnJvd0dyb3VwJiZlLnJvd0dyb3VwLmVuYWJsZSh0PT09dm9pZCAwPyEwOnQpfSl9KTtzdC5BcGkucmVnaXN0ZXIoInJvd0dyb3VwKCkuZW5hYmxlZCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGgmJnRbMF0ucm93R3JvdXA/dFswXS5yb3dHcm91cC5lbmFibGVkKCk6ITF9KTtzdC5BcGkucmVnaXN0ZXIoInJvd0dyb3VwKCkuZGF0YVNyYygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0ucm93R3JvdXAuZGF0YVNyYygpOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLnJvd0dyb3VwJiZlLnJvd0dyb3VwLmRhdGFTcmModCl9KX0pO09lKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHJnIixmdW5jdGlvbih0LGUscil7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LnJvd0dyb3VwLHM9c3QuZGVmYXVsdHMucm93R3JvdXA7aWYobnx8cyl7dmFyIGE9T2UuZXh0ZW5kKHt9LHMsbik7biE9PSExJiZuZXcgdnIoZSxhKX19fSk7dmFyIGpsPWllKGFlKCksMSk7dmFyIE9zPWllKGFlKCksMSk7dmFyIHNyPU9zLmRlZmF1bHQ7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0LGU7ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cubW9tZW50fWZ1bmN0aW9uIG4oKXtyZXR1cm4gd2luZG93Lmx1eG9ufWZ1bmN0aW9uIHMoaCl7dD1oLGU9aC5mbi5kYXRhVGFibGV9dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKG8sZixDLEIsYyx6LEcpe0I9PT12b2lkIDAmJihCPTApLGM9PT12b2lkIDAmJihjPTEpLHo9PT12b2lkIDAmJih6PXZvaWQgMCksRz09PXZvaWQgMCYmKEc9ITEpO3ZhciBldD10aGlzO2lmKCFlfHwhZS52ZXJzaW9uQ2hlY2t8fCFlLnZlcnNpb25DaGVjaygiMS4xMC4wIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMCBvciBuZXdlciIpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxoLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxoLmRlZmF1bHRzLHQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2hCdWlsZGVyLGYpO3ZhciBFPXRoaXMuYy5pMThuO2lmKHRoaXMucz17Y29uZGl0aW9uOnZvaWQgMCxjb25kaXRpb25zOnt9LGRhdGE6dm9pZCAwLGRhdGFJZHg6LTEsZGF0YVBvaW50czpbXSxkYXRlRm9ybWF0OiExLGRlcHRoOmMsZHQ6byxmaWxsZWQ6ITEsaW5kZXg6QixsaXZlU2VhcmNoOkcsb3JpZ0RhdGE6dm9pZCAwLHByZXZlbnRSZWRyYXc6ITEsc2VydmVyRGF0YTp6LHRvcEdyb3VwOkMsdHlwZToiIix2YWx1ZTpbXX0sdGhpcy5kb209e2J1dHRvbnM6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbkNvbnRhaW5lciksY29uZGl0aW9uOnQoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb25kaXRpb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYykuYXR0cigiYXV0b2NvbXBsZXRlIiwiaGFja2luZyIpLGNvbmRpdGlvblRpdGxlOnQoJzxvcHRpb24gdmFsdWU9IiIgZGlzYWJsZWQgc2VsZWN0ZWQgaGlkZGVuLz4nKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbiIsRS5jb25kaXRpb24pKSxjb250YWluZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbnRhaW5lciksZGF0YTp0KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGF0YSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxkYXRhVGl0bGU6dCgnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuZGF0YSIsRS5kYXRhKSksZGVmYXVsdFZhbHVlOnQoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxkZWxldGU6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5kZWxldGUiLEUuZGVsZXRlKSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRlbGV0ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmRlbGV0ZVRpdGxlIixFLmRlbGV0ZVRpdGxlKSkuYXR0cigidHlwZSIsImJ1dHRvbiIpLGlucHV0Q29udDp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaW5wdXRDb250KSxsZWZ0OnQoIjxidXR0b24vPiIpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubGVmdCIsRS5sZWZ0KSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxlZnQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInRpdGxlIix0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sZWZ0VGl0bGUiLEUubGVmdFRpdGxlKSkuYXR0cigidHlwZSIsImJ1dHRvbiIpLHJpZ2h0OnQoIjxidXR0b24vPiIpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIucmlnaHQiLEUucmlnaHQpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucmlnaHQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInRpdGxlIix0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5yaWdodFRpdGxlIixFLnJpZ2h0VGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksdmFsdWU6W3QoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KV0sdmFsdWVUaXRsZTp0KCc8b3B0aW9uIHZhbHVlPSItLXZhbHVlVGl0bGUtLSIgZGlzYWJsZWQgc2VsZWN0ZWQgaGlkZGVuLz4nKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnZhbHVlIixFLnZhbHVlKSl9LHRoaXMuYy5ncmV5c2NhbGUpe3RoaXMuZG9tLmRhdGEuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20uY29uZGl0aW9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpLHRoaXMuZG9tLmRlZmF1bHRWYWx1ZS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIFo9MCx5PXRoaXMuZG9tLnZhbHVlO1o8eS5sZW5ndGg7WisrKXt2YXIgXz15W1pdO18uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSl9fXJldHVybiB0KHdpbmRvdykub24oInJlc2l6ZS5kdHNiIixlLnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtldC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pKSx0aGlzLl9idWlsZENyaXRlcmlhKCksdGhpc31yZXR1cm4gaC5fZXNjYXBlSFRNTD1mdW5jdGlvbihvKXtyZXR1cm4gby50b1N0cmluZygpLnJlcGxhY2UoLyZhbXA7L2csIiYiKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpfSxoLnByb3RvdHlwZS5kb1NlYXJjaD1mdW5jdGlvbigpe3RoaXMuYy5saXZlU2VhcmNoJiZ0aGlzLnMuZHQuZHJhdygpfSxoLnBhcnNlTnVtRm10PWZ1bmN0aW9uKG8pe3JldHVybitvLnJlcGxhY2UoLyg/IV4tKVteMC05Ll0vZywiIil9LGgucHJvdG90eXBlLnVwZGF0ZUFycm93cz1mdW5jdGlvbihvKXtvPT09dm9pZCAwJiYobz0hMSksdGhpcy5kb20uY29udGFpbmVyLmNoaWxkcmVuKCkuZGV0YWNoKCksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5kYXRhKS5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uKS5hcHBlbmQodGhpcy5kb20uaW5wdXRDb250KSx0aGlzLnNldExpc3RlbmVycygpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIik7Zm9yKHZhciBmPTE7Zjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7ZisrKXRoaXMuZG9tLmlucHV0Q29udC5hcHBlbmQodGhpcy5kb20udmFsdWVbZl0pLHQodGhpcy5kb20udmFsdWVbZl0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZGVwdGg+MSYmdGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20ubGVmdCksKHRoaXMuYy5kZXB0aExpbWl0PT09ITF8fHRoaXMucy5kZXB0aDx0aGlzLmMuZGVwdGhMaW1pdCkmJm8/dGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20ucmlnaHQpOnRoaXMuZG9tLnJpZ2h0LnJlbW92ZSgpLHRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmRlbGV0ZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5idXR0b25zKX0saC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmRhdGEub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmNvbmRpdGlvbi5vZmYoIi5kdHNiIiksdGhpcy5kb20uZGVsZXRlLm9mZigiLmR0c2IiKTtmb3IodmFyIG89MCxmPXRoaXMuZG9tLnZhbHVlO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO0Mub2ZmKCIuZHRzYiIpfXRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmUoKX0saC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKG8sZil7dmFyIEM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sQj10aGlzLnMuY29uZGl0aW9uc1t0aGlzLnMuY29uZGl0aW9uXTtpZih0aGlzLnMuY29uZGl0aW9uIT09dm9pZCAwJiZCIT09dm9pZCAwKXt2YXIgYz1vW3RoaXMucy5kYXRhSWR4XTtpZih0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIifHxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpKXt2YXIgej1bb1t0aGlzLnMuZGF0YUlkeF1dO2lmKEMub0xhbmd1YWdlLnNEZWNpbWFsIT09IiImJih6PW9bdGhpcy5zLmRhdGFJZHhdLnNwbGl0KEMub0xhbmd1YWdlLnNEZWNpbWFsKSksQy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKWZvcih2YXIgRz0wO0c8ei5sZW5ndGg7RysrKXpbR109eltHXS5yZXBsYWNlKEMub0xhbmd1YWdlLnNUaG91c2FuZHMsIiwiKTtjPXouam9pbigiLiIpfWlmKHRoaXMuYy5vcnRob2dvbmFsLnNlYXJjaCE9PSJmaWx0ZXIiJiYoYz1DLmZhc3REYXRhKGYsdGhpcy5zLmRhdGFJZHgsdHlwZW9mIHRoaXMuYy5vcnRob2dvbmFsPT0ic3RyaW5nIj90aGlzLmMub3J0aG9nb25hbDp0aGlzLmMub3J0aG9nb25hbC5zZWFyY2gpKSx0aGlzLnMudHlwZT09PSJhcnJheSIpe0FycmF5LmlzQXJyYXkoYyl8fChjPVtjXSksYy5zb3J0KCk7Zm9yKHZhciBldD0wLEU9YztldDxFLmxlbmd0aDtldCsrKXt2YXIgWj1FW2V0XTtaJiZ0eXBlb2YgWj09InN0cmluZyImJihaPVoucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiAiKSl9fWVsc2UgYyE9PW51bGwmJnR5cGVvZiBjPT0ic3RyaW5nIiYmKGM9Yy5yZXBsYWNlKC9bXHJcblx1MjAyOF0vZywiICIpKTtyZXR1cm4gdGhpcy5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmdHlwZW9mIGM9PSJzdHJpbmciJiYoYz1jLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKSksYz09PW51bGwmJihjPSIiKSxCLnNlYXJjaChjLHRoaXMucy52YWx1ZSx0aGlzKX19LGgucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obyl7bz09PXZvaWQgMCYmKG89ITEpO3ZhciBmLEM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF07aWYodGhpcy5zLnR5cGUhPT1udWxsJiZ0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIifHxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl7dmFyIEI9W3RoaXMucy52YWx1ZVtmXS50b1N0cmluZygpXTtpZihDLm9MYW5ndWFnZS5zRGVjaW1hbCE9PSIiJiYoQj10aGlzLnMudmFsdWVbZl0uc3BsaXQoQy5vTGFuZ3VhZ2Uuc0RlY2ltYWwpKSxDLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpZm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXT1CW2NdLnJlcGxhY2UoQy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcywiLCIpO3RoaXMucy52YWx1ZVtmXT1CLmpvaW4oIi4iKX1lbHNlIGlmKHRoaXMucy50eXBlIT09bnVsbCYmbyl7aWYodGhpcy5zLnR5cGUuaW5jbHVkZXMoImRhdGUiKXx8dGhpcy5zLnR5cGUuaW5jbHVkZXMoInRpbWUiKSlmb3IoZj0wO2Y8dGhpcy5zLnZhbHVlLmxlbmd0aDtmKyspdGhpcy5zLnZhbHVlW2ZdLm1hdGNoKC9eXGR7NH0tKFswXVxkfDFbMC0yXSktKFswLTJdXGR8M1swMV0pJC9nKT09PW51bGwmJih0aGlzLnMudmFsdWVbZl09IiIpO2Vsc2UgaWYodGhpcy5zLnR5cGUuaW5jbHVkZXMoIm1vbWVudCIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl0aGlzLnMudmFsdWVbZl0mJnRoaXMucy52YWx1ZVtmXS5sZW5ndGg+MCYmcigpKHRoaXMucy52YWx1ZVtmXSx0aGlzLnMuZGF0ZUZvcm1hdCwhMCkuaXNWYWxpZCgpJiYodGhpcy5zLnZhbHVlW2ZdPXIoKSh0aGlzLnMudmFsdWVbZl0sdGhpcy5zLmRhdGVGb3JtYXQpLmZvcm1hdCgiWVlZWS1NTS1ERCBISDptbTpzcyIpKTtlbHNlIGlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpKWZvcihmPTA7Zjx0aGlzLnMudmFsdWUubGVuZ3RoO2YrKyl0aGlzLnMudmFsdWVbZl0mJnRoaXMucy52YWx1ZVtmXS5sZW5ndGg+MCYmbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQodGhpcy5zLnZhbHVlW2ZdLHRoaXMucy5kYXRlRm9ybWF0KS5pbnZhbGlkPT09bnVsbCYmKHRoaXMucy52YWx1ZVtmXT1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdCh0aGlzLnMudmFsdWVbZl0sdGhpcy5zLmRhdGVGb3JtYXQpLnRvRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIikpfWlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0iKSYmdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKGY9MDtmPHRoaXMucy52YWx1ZS5sZW5ndGg7ZisrKXRoaXMucy52YWx1ZVtmXT10aGlzLnMudmFsdWVbZl0ucmVwbGFjZSgvW14wLTkuXC1dL2csIiIpO3JldHVybntjb25kaXRpb246dGhpcy5zLmNvbmRpdGlvbixkYXRhOnRoaXMucy5kYXRhLG9yaWdEYXRhOnRoaXMucy5vcmlnRGF0YSx0eXBlOnRoaXMucy50eXBlLHZhbHVlOnRoaXMucy52YWx1ZS5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHohPW51bGw/ei50b1N0cmluZygpOnp9KX19LGgucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxoLnByb3RvdHlwZS5wYXJzZU51bWJlcj1mdW5jdGlvbihvKXt2YXIgZj10aGlzLnMuZHQuaTE4bigiZGVjaW1hbCIpO3JldHVybiBmJiZmIT09Ii4iJiYobz1vLnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoZiwiLiIpKSwrby5yZXBsYWNlKC8oPyFeLSlbXjAtOS5dL2csIiIpfSxoLnByb3RvdHlwZS5wb3B1bGF0ZT1mdW5jdGlvbigpe3RoaXMuX3BvcHVsYXRlRGF0YSgpLHRoaXMucy5kYXRhSWR4IT09LTEmJih0aGlzLl9wb3B1bGF0ZUNvbmRpdGlvbigpLHRoaXMucy5jb25kaXRpb24hPT12b2lkIDAmJnRoaXMuX3BvcHVsYXRlVmFsdWUoKSl9LGgucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obyl7dmFyIGY9ITEsQyxCO2lmKHRoaXMuX3BvcHVsYXRlRGF0YSgpLG8uZGF0YSE9PXZvaWQgMCl7dmFyIGM9dGhpcy5jbGFzc2VzLml0YWxpYyx6PXRoaXMuZG9tLmRhdGE7dGhpcy5kb20uZGF0YS5jaGlsZHJlbigib3B0aW9uIikuZWFjaChmdW5jdGlvbigpeyFmJiYodCh0aGlzKS50ZXh0KCk9PT1vLmRhdGF8fG8ub3JpZ0RhdGEmJnQodGhpcykucHJvcCgib3JpZ0RhdGEiKT09PW8ub3JpZ0RhdGEpPyh0KHRoaXMpLnByb3AoInNlbGVjdGVkIiwhMCksei5yZW1vdmVDbGFzcyhjKSxmPSEwLEM9cGFyc2VJbnQodCh0aGlzKS52YWwoKSwxMCkpOnQodGhpcykucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX0pfWlmKGYpe3RoaXMucy5kYXRhPW8uZGF0YSx0aGlzLnMub3JpZ0RhdGE9by5vcmlnRGF0YSx0aGlzLnMuZGF0YUlkeD1DLHRoaXMuYy5vcnRob2dvbmFsPXRoaXMuX2dldE9wdGlvbnMoKS5vcnRob2dvbmFsLHRoaXMuZG9tLmRhdGFUaXRsZS5yZW1vdmUoKSx0aGlzLl9wb3B1bGF0ZUNvbmRpdGlvbigpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZSgpO3ZhciBHPXZvaWQgMCxldD10aGlzLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbiIpO2ZvcihCPTA7QjxldC5sZW5ndGg7QisrKXt2YXIgRT10KGV0W0JdKTtvLmNvbmRpdGlvbiE9PXZvaWQgMCYmRS52YWwoKT09PW8uY29uZGl0aW9uJiZ0eXBlb2Ygby5jb25kaXRpb249PSJzdHJpbmciPyhFLnByb3AoInNlbGVjdGVkIiwhMCksRz1FLnZhbCgpKTpFLnJlbW92ZVByb3AoInNlbGVjdGVkIil9aWYodGhpcy5zLmNvbmRpdGlvbj1HLHRoaXMucy5jb25kaXRpb24hPT12b2lkIDApe2Zvcih0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZSgpLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSxCPTA7QjxldC5sZW5ndGg7QisrKXt2YXIgWj10KGV0W0JdKTtaLnZhbCgpIT09dGhpcy5zLmNvbmRpdGlvbiYmWi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfXRoaXMuX3BvcHVsYXRlVmFsdWUobyl9ZWxzZSB0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcmVwZW5kVG8odGhpcy5kb20uY29uZGl0aW9uKS5wcm9wKCJzZWxlY3RlZCIsITApfX0saC5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5kYXRhLnVuYmluZCgiY2hhbmdlIikub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe28uZG9tLmRhdGFUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgZj1vLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24uIitvLmNsYXNzZXMub3B0aW9uKSxDPTA7QzxmLmxlbmd0aDtDKyspe3ZhciBCPXQoZltDXSk7Qi52YWwoKT09PW8uZG9tLmRhdGEudmFsKCk/KG8uZG9tLmRhdGEucmVtb3ZlQ2xhc3Moby5jbGFzc2VzLml0YWxpYyksQi5wcm9wKCJzZWxlY3RlZCIsITApLG8ucy5kYXRhSWR4PStCLnZhbCgpLG8ucy5kYXRhPUIudGV4dCgpLG8ucy5vcmlnRGF0YT1CLnByb3AoIm9yaWdEYXRhIiksby5jLm9ydGhvZ29uYWw9by5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsby5fY2xlYXJDb25kaXRpb24oKSxvLl9jbGVhclZhbHVlKCksby5fcG9wdWxhdGVDb25kaXRpb24oKSxvLnMuZmlsbGVkJiYoby5zLmZpbGxlZD0hMSxvLmRvU2VhcmNoKCksby5zZXRMaXN0ZW5lcnMoKSksby5zLmR0LnN0YXRlLnNhdmUoKSk6Qi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pLHRoaXMuZG9tLmNvbmRpdGlvbi51bmJpbmQoImNoYW5nZSIpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXtvLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgZj1vLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbi4iK28uY2xhc3Nlcy5vcHRpb24pLEM9MDtDPGYubGVuZ3RoO0MrKyl7dmFyIEI9dChmW0NdKTtpZihCLnZhbCgpPT09by5kb20uY29uZGl0aW9uLnZhbCgpKXtvLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3Moby5jbGFzc2VzLml0YWxpYyksQi5wcm9wKCJzZWxlY3RlZCIsITApO2Zvcih2YXIgYz1CLnZhbCgpLHo9MCxHPU9iamVjdC5rZXlzKG8ucy5jb25kaXRpb25zKTt6PEcubGVuZ3RoO3orKyl7dmFyIGV0PUdbel07aWYoZXQ9PT1jKXtvLnMuY29uZGl0aW9uPWM7YnJlYWt9fW8uX2NsZWFyVmFsdWUoKSxvLl9wb3B1bGF0ZVZhbHVlKCk7Zm9yKHZhciBFPTAsWj1vLmRvbS52YWx1ZTtFPFoubGVuZ3RoO0UrKyl7dmFyIHk9WltFXTtvLnMuZmlsbGVkJiZ5IT09dm9pZCAwJiZvLmRvbS5pbnB1dENvbnQuaGFzKHlbMF0pLmxlbmd0aCE9PTAmJihvLnMuZmlsbGVkPSExLG8uZG9TZWFyY2goKSxvLnNldExpc3RlbmVycygpKX0oby5kb20udmFsdWUubGVuZ3RoPT09MHx8by5kb20udmFsdWUubGVuZ3RoPT09MSYmby5kb20udmFsdWVbMF09PT12b2lkIDApJiZvLmRvU2VhcmNoKCl9ZWxzZSBCLnJlbW92ZVByb3AoInNlbGVjdGVkIil9fSl9LGgucHJvdG90eXBlLnNldHVwQnV0dG9ucz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbm5lcldpZHRoPjU1MCl7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy52ZXJ0aWNhbCksdGhpcy5kb20uYnV0dG9ucy5jc3MoImxlZnQiLG51bGwpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJ0b3AiLG51bGwpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZlcnRpY2FsKSx0aGlzLmRvbS5idXR0b25zLmNzcygibGVmdCIsdGhpcy5kb20uZGF0YS5pbm5lcldpZHRoKCkpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJ0b3AiLHRoaXMuZG9tLmRhdGEucG9zaXRpb24oKS50b3ApfSxoLnByb3RvdHlwZS5fYnVpbGRDcml0ZXJpYT1mdW5jdGlvbigpe3RoaXMuZG9tLmRhdGEuYXBwZW5kKHRoaXMuZG9tLmRhdGFUaXRsZSksdGhpcy5kb20uY29uZGl0aW9uLmFwcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5kYXRhKS5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uKSx0aGlzLmRvbS5pbnB1dENvbnQuZW1wdHkoKTtmb3IodmFyIG89MCxmPXRoaXMuZG9tLnZhbHVlO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO0MuYXBwZW5kKHRoaXMuZG9tLnZhbHVlVGl0bGUpLHRoaXMuZG9tLmlucHV0Q29udC5hcHBlbmQoQyl9dGhpcy5kb20uYnV0dG9ucy5hcHBlbmQodGhpcy5kb20uZGVsZXRlKS5hcHBlbmQodGhpcy5kb20ucmlnaHQpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uaW5wdXRDb250KS5hcHBlbmQodGhpcy5kb20uYnV0dG9ucyksdGhpcy5zZXRMaXN0ZW5lcnMoKX0saC5wcm90b3R5cGUuX2NsZWFyQ29uZGl0aW9uPWZ1bmN0aW9uKCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSx0aGlzLmRvbS5jb25kaXRpb24ucHJlcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSkucHJvcCgic2VsZWN0ZWRJbmRleCIsMCksdGhpcy5zLmNvbmRpdGlvbnM9e30sdGhpcy5zLmNvbmRpdGlvbj12b2lkIDB9LGgucHJvdG90eXBlLl9jbGVhclZhbHVlPWZ1bmN0aW9uKCl7dmFyIG87aWYodGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCl7aWYodGhpcy5kb20udmFsdWUubGVuZ3RoPjAmJnRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwKWZvcih2YXIgZj0wLEM9dGhpcy5kb20udmFsdWU7ZjxDLmxlbmd0aDtmKyspbz1DW2ZdLG8hPT12b2lkIDAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvLnJlbW92ZSgpfSw1MCk7aWYodGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxoLnVwZGF0ZUxpc3RlbmVyKSksdGhpcy5kb20udmFsdWUubGVuZ3RoPjAmJnRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwKXt0aGlzLmRvbS5pbnB1dENvbnQuZW1wdHkoKS5hcHBlbmQodGhpcy5kb20udmFsdWVbMF0pLmluc2VydEFmdGVyKHRoaXMuZG9tLmNvbmRpdGlvbiksdCh0aGlzLmRvbS52YWx1ZVswXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpO2Zvcih2YXIgQj0xO0I8dGhpcy5kb20udmFsdWUubGVuZ3RoO0IrKyl0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKHRoaXMuZG9tLnZhbHVlW0JdKSx0KHRoaXMuZG9tLnZhbHVlW0JdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIil9fWVsc2V7Zm9yKHZhciBjPTAsej10aGlzLmRvbS52YWx1ZTtjPHoubGVuZ3RoO2MrKylvPXpbY10sbyE9PXZvaWQgMCYmc2V0VGltZW91dChmdW5jdGlvbigpe28ucmVtb3ZlKCl9LDUwKTt0aGlzLmRvbS52YWx1ZVRpdGxlLnByb3AoInNlbGVjdGVkIiwhMCksdGhpcy5kb20uZGVmYXVsdFZhbHVlLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlKS5pbnNlcnRBZnRlcih0aGlzLmRvbS5jb25kaXRpb24pfXRoaXMucy52YWx1ZT1bXSx0aGlzLmRvbS52YWx1ZT1bdCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlLmNsb25lKCkpXX0saC5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgbz10aGlzLnMuZHQ7cmV0dXJuIHQuZXh0ZW5kKCEwLHt9LGguZGVmYXVsdHMsby5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuZGF0YUlkeF0uc2VhcmNoQnVpbGRlcil9LGgucHJvdG90eXBlLl9wb3B1bGF0ZUNvbmRpdGlvbj1mdW5jdGlvbigpe3ZhciBvPVtdLGY9T2JqZWN0LmtleXModGhpcy5zLmNvbmRpdGlvbnMpLmxlbmd0aCxDPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucyxCPSt0aGlzLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb246c2VsZWN0ZWQiKS52YWwoKSxjLHo7aWYoZj09PTApe2lmKHRoaXMucy50eXBlPXRoaXMucy5kdC5jb2x1bW4oQikudHlwZSgpLEMhPT12b2lkIDApe3ZhciBHPUNbQl07Ry5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMCYmRy5zZWFyY2hCdWlsZGVyVHlwZSE9PW51bGw/dGhpcy5zLnR5cGU9Ry5zZWFyY2hCdWlsZGVyVHlwZToodGhpcy5zLnR5cGU9PT12b2lkIDB8fHRoaXMucy50eXBlPT09bnVsbCkmJih0aGlzLnMudHlwZT1HLnNUeXBlKX0odGhpcy5zLnR5cGU9PT1udWxsfHx0aGlzLnMudHlwZT09PXZvaWQgMCkmJih0LmZuLmRhdGFUYWJsZS5leHQub0FwaSYmdC5mbi5kYXRhVGFibGUuZXh0Lm9BcGkuX2ZuQ29sdW1uVHlwZXModGhpcy5zLmR0LnNldHRpbmdzKClbMF0pLHRoaXMucy50eXBlPXRoaXMucy5kdC5jb2x1bW4oQikudHlwZSgpKSx0aGlzLmRvbS5jb25kaXRpb24ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5lbXB0eSgpLmFwcGVuZCh0aGlzLmRvbS5jb25kaXRpb25UaXRsZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYyksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKTt2YXIgZXQ9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0xhbmd1YWdlLnNEZWNpbWFsO2V0IT09IiImJnRoaXMucy50eXBlLmluZGV4T2YoZXQpPT09dGhpcy5zLnR5cGUubGVuZ3RoLWV0Lmxlbmd0aCYmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0tZm10Iik/dGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShldCwiIik6dGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiYodGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShldCwiIikpKTt2YXIgRT10aGlzLmMuY29uZGl0aW9uc1t0aGlzLnMudHlwZV0hPT12b2lkIDA/dGhpcy5jLmNvbmRpdGlvbnNbdGhpcy5zLnR5cGVdOnRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT90aGlzLmMuY29uZGl0aW9ucy5tb21lbnQ6dGhpcy5zLnR5cGUuaW5jbHVkZXMoImx1eG9uIik/dGhpcy5jLmNvbmRpdGlvbnMubHV4b246dGhpcy5jLmNvbmRpdGlvbnMuc3RyaW5nO3RoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT90aGlzLnMuZGF0ZUZvcm1hdD10aGlzLnMudHlwZS5yZXBsYWNlKC9tb21lbnQtL2csIiIpOnRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpJiYodGhpcy5zLmRhdGVGb3JtYXQ9dGhpcy5zLnR5cGUucmVwbGFjZSgvbHV4b24tL2csIiIpKTtmb3IodmFyIFo9MCx5PU9iamVjdC5rZXlzKEUpO1o8eS5sZW5ndGg7WisrKWlmKGM9eVtaXSxFW2NdIT09bnVsbCl7aWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJkVbY10uaW5pdD09PWguaW5pdFNlbGVjdCl7dmFyIF89Q1tCXTt0aGlzLnMuc2VydmVyRGF0YSYmdGhpcy5zLnNlcnZlckRhdGFbXy5kYXRhXT8oRVtjXS5pbml0PWguaW5pdFNlbGVjdFNTUCxFW2NdLmlucHV0VmFsdWU9aC5pbnB1dFZhbHVlU2VsZWN0LEVbY10uaXNJbnB1dFZhbGlkPWguaXNJbnB1dFZhbGlkU2VsZWN0KTooRVtjXS5pbml0PWguaW5pdElucHV0LEVbY10uaW5wdXRWYWx1ZT1oLmlucHV0VmFsdWVJbnB1dCxFW2NdLmlzSW5wdXRWYWxpZD1oLmlzSW5wdXRWYWxpZElucHV0KX10aGlzLnMuY29uZGl0aW9uc1tjXT1FW2NdLHo9RVtjXS5jb25kaXRpb25OYW1lLHR5cGVvZiB6PT0iZnVuY3Rpb24iJiYoej16KHRoaXMucy5kdCx0aGlzLmMuaTE4bikpLG8ucHVzaCh0KCI8b3B0aW9uPiIse3RleHQ6eix2YWx1ZTpjfSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykpfX1lbHNlIGlmKGY+MCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCkucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtmb3IodmFyIFM9MCxOPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKTtTPE4ubGVuZ3RoO1MrKyl7Yz1OW1NdO3ZhciBSPXRoaXMucy5jb25kaXRpb25zW2NdLmNvbmRpdGlvbk5hbWU7dHlwZW9mIFI9PSJmdW5jdGlvbiImJihSPVIodGhpcy5zLmR0LHRoaXMuYy5pMThuKSk7dmFyIEw9dCgiPG9wdGlvbj4iLHt0ZXh0OlIsdmFsdWU6Y30pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5vcHRpb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ub3RJdGFsaWMpO3RoaXMucy5jb25kaXRpb24hPT12b2lkIDAmJnRoaXMucy5jb25kaXRpb249PT1SJiYoTC5wcm9wKCJzZWxlY3RlZCIsITApLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSksby5wdXNoKEwpfX1lbHNle3RoaXMuZG9tLmNvbmRpdGlvbi5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtyZXR1cm59Zm9yKHZhciBYPTAsaj1vO1g8ai5sZW5ndGg7WCsrKXt2YXIgcT1qW1hdO3RoaXMuZG9tLmNvbmRpdGlvbi5hcHBlbmQocSl9aWYoQ1tCXS5zZWFyY2hCdWlsZGVyJiZDW0JdLnNlYXJjaEJ1aWxkZXIuZGVmYXVsdENvbmRpdGlvbil7dmFyIGF0PUNbQl0uc2VhcmNoQnVpbGRlci5kZWZhdWx0Q29uZGl0aW9uO2lmKHR5cGVvZiBhdD09Im51bWJlciIpdGhpcy5kb20uY29uZGl0aW9uLnByb3AoInNlbGVjdGVkSW5kZXgiLGF0KSx0aGlzLmRvbS5jb25kaXRpb24udHJpZ2dlcigiY2hhbmdlIik7ZWxzZSBpZih0eXBlb2YgYXQ9PSJzdHJpbmciKWZvcih2YXIgSj0wO0o8by5sZW5ndGg7SisrKWZvcih2YXIgdHQ9MCx5dD1PYmplY3Qua2V5cyh0aGlzLnMuY29uZGl0aW9ucyk7dHQ8eXQubGVuZ3RoO3R0Kyspe3ZhciBUdD15dFt0dF07aWYoej10aGlzLnMuY29uZGl0aW9uc1tUdF0uY29uZGl0aW9uTmFtZSwodHlwZW9mIHo9PSJzdHJpbmciP3o6eih0aGlzLnMuZHQsdGhpcy5jLmkxOG4pKT09PW9bSl0udGV4dCgpJiZUdD09PWF0KXt0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsdGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCkudG9BcnJheSgpLmluZGV4T2Yob1tKXVswXSkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLHRoaXMuZG9tLmNvbmRpdGlvbi50cmlnZ2VyKCJjaGFuZ2UiKSxKPW8ubGVuZ3RoO2JyZWFrfX19ZWxzZSB0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsMCl9LGgucHJvdG90eXBlLl9wb3B1bGF0ZURhdGE9ZnVuY3Rpb24oKXt2YXIgbz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnMsZj10aGlzLnMuZHQuY29sdW1ucyh0aGlzLmMuY29sdW1ucykuaW5kZXhlcygpLnRvQXJyYXkoKTt0aGlzLmRvbS5kYXRhLmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLmRhdGFUaXRsZSk7Zm9yKHZhciBDPTA7QzxvLmxlbmd0aDtDKyspaWYodGhpcy5jLmNvbHVtbnM9PT0hMHx8Zi5pbmNsdWRlcyhDKSl7dmFyIEI9b1tDXSxjPXtpbmRleDpDLG9yaWdEYXRhOkIuZGF0YSx0ZXh0OihCLnNlYXJjaEJ1aWxkZXJUaXRsZXx8Qi5zVGl0bGUpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKX07dGhpcy5kb20uZGF0YS5hcHBlbmQodCgiPG9wdGlvbj4iLHt0ZXh0OmMudGV4dCx2YWx1ZTpjLmluZGV4fSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykucHJvcCgib3JpZ0RhdGEiLEIuZGF0YSkucHJvcCgic2VsZWN0ZWQiLHRoaXMucy5kYXRhSWR4PT09Yy5pbmRleCkpLHRoaXMucy5kYXRhSWR4PT09Yy5pbmRleCYmdGhpcy5kb20uZGF0YVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIil9fSxoLnByb3RvdHlwZS5fcG9wdWxhdGVWYWx1ZT1mdW5jdGlvbihvKXt2YXIgZj10aGlzLEM9dGhpcy5zLmZpbGxlZCxCO3RoaXMucy5maWxsZWQ9ITEsc2V0VGltZW91dChmdW5jdGlvbigpe2YuZG9tLmRlZmF1bHRWYWx1ZS5yZW1vdmUoKX0sNTApO2Zvcih2YXIgYz1mdW5jdGlvbihaKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WiE9PXZvaWQgMCYmWi5yZW1vdmUoKX0sNTApfSx6PTAsRz10aGlzLmRvbS52YWx1ZTt6PEcubGVuZ3RoO3orKyl7dmFyIGV0PUdbel07YyhldCl9dmFyIEU9dGhpcy5kb20uaW5wdXRDb250LmNoaWxkcmVuKCk7aWYoRS5sZW5ndGg+MSlmb3IoQj0wO0I8RS5sZW5ndGg7QisrKXQoRVtCXSkucmVtb3ZlKCk7Zm9yKG8hPT12b2lkIDAmJnRoaXMucy5kdC5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oWil7Zi5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW1pdLnNUaXRsZT09PW8uZGF0YSYmKGYucy5kYXRhSWR4PVopfSksdGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxoLnVwZGF0ZUxpc3RlbmVyLG8hPT12b2lkIDA/by52YWx1ZTp2b2lkIDApKSxvIT09dm9pZCAwJiZvLnZhbHVlIT09dm9pZCAwJiYodGhpcy5zLnZhbHVlPW8udmFsdWUpLHRoaXMuZG9tLmlucHV0Q29udC5lbXB0eSgpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS5hcHBlbmRUbyh0aGlzLmRvbS5pbnB1dENvbnQpLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKSxCPTE7Qjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7QisrKXQodGhpcy5kb20udmFsdWVbQl0pLmluc2VydEFmdGVyKHRoaXMuZG9tLnZhbHVlW0ItMV0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZmlsbGVkPXRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmlzSW5wdXRWYWxpZCh0aGlzLmRvbS52YWx1ZSx0aGlzKSx0aGlzLnNldExpc3RlbmVycygpLCF0aGlzLnMucHJldmVudFJlZHJhdyYmQyE9PXRoaXMucy5maWxsZWQmJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8dGhpcy5kb1NlYXJjaCgpLHRoaXMuc2V0TGlzdGVuZXJzKCkpfSxoLnByb3RvdHlwZS5fdGhyb3R0bGU9ZnVuY3Rpb24obyxmKXtmPT09dm9pZCAwJiYoZj0yMDApO3ZhciBDPW51bGwsQj1udWxsLGM9dGhpcztyZXR1cm4gZj09PW51bGwmJihmPTIwMCksZnVuY3Rpb24oKXtmb3IodmFyIHo9W10sRz0wO0c8YXJndW1lbnRzLmxlbmd0aDtHKyspeltHXT1hcmd1bWVudHNbR107dmFyIGV0PStuZXcgRGF0ZTtDIT09bnVsbCYmZXQ8QytmP2NsZWFyVGltZW91dChCKTpDPWV0LEI9c2V0VGltZW91dChmdW5jdGlvbigpe0M9bnVsbCxvLmFwcGx5KGMseil9LGYpfX0saC52ZXJzaW9uPSIxLjEuMCIsaC5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixidXR0b25Db250YWluZXI6ImR0c2ItYnV0dG9uQ29udGFpbmVyIixjb25kaXRpb246ImR0c2ItY29uZGl0aW9uIixjb250YWluZXI6ImR0c2ItY3JpdGVyaWEiLGRhdGE6ImR0c2ItZGF0YSIsZGVsZXRlOiJkdHNiLWRlbGV0ZSIsZHJvcERvd246ImR0c2ItZHJvcERvd24iLGdyZXlzY2FsZToiZHRzYi1ncmV5c2NhbGUiLGlucHV0OiJkdHNiLWlucHV0IixpbnB1dENvbnQ6ImR0c2ItaW5wdXRDb250IixpdGFsaWM6ImR0c2ItaXRhbGljIixqb2luZXI6ImR0c3Atam9pbmVyIixsZWZ0OiJkdHNiLWxlZnQiLG5vdEl0YWxpYzoiZHRzYi1ub3RJdGFsaWMiLG9wdGlvbjoiZHRzYi1vcHRpb24iLHJpZ2h0OiJkdHNiLXJpZ2h0IixzZWxlY3Q6ImR0c2Itc2VsZWN0Iix2YWx1ZToiZHRzYi12YWx1ZSIsdmVydGljYWw6ImR0c2ItdmVydGljYWwifSxoLmluaXRTZWxlY3Q9ZnVuY3Rpb24obyxmLEMsQil7Qz09PXZvaWQgMCYmKEM9bnVsbCksQj09PXZvaWQgMCYmKEI9ITEpO3ZhciBjPW8uZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLHo9by5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLEc9by5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGE7by5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBldD10KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3MoaC5jbGFzc2VzLml0YWxpYykuYWRkQ2xhc3MoaC5jbGFzc2VzLnNlbGVjdCkuYXBwZW5kKG8uZG9tLnZhbHVlVGl0bGUpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZUNsYXNzKGguY2xhc3Nlcy5pdGFsaWMpLGYobyx0aGlzKX0pO28uYy5ncmV5c2NhbGUmJmV0LmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpO2Zvcih2YXIgRT1bXSxaPVtdLHk9MCxfPXo7eTxfLmxlbmd0aDt5Kyspe3ZhciBTPV9beV0sTj1HKFMsYyx0eXBlb2Ygby5jLm9ydGhvZ29uYWw9PSJzdHJpbmciP28uYy5vcnRob2dvbmFsOm8uYy5vcnRob2dvbmFsLnNlYXJjaCksUj17ZmlsdGVyOnR5cGVvZiBOPT0ic3RyaW5nIj9OLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIgIik6TixpbmRleDpTLHRleHQ6RyhTLGMsdHlwZW9mIG8uYy5vcnRob2dvbmFsPT0ic3RyaW5nIj9vLmMub3J0aG9nb25hbDpvLmMub3J0aG9nb25hbC5kaXNwbGF5KX07by5zLnR5cGU9PT0iYXJyYXkiJiYoUi5maWx0ZXI9QXJyYXkuaXNBcnJheShSLmZpbHRlcik/Ui5maWx0ZXI6W1IuZmlsdGVyXSxSLnRleHQ9QXJyYXkuaXNBcnJheShSLnRleHQpP1IudGV4dDpbUi50ZXh0XSk7dmFyIEw9ZnVuY3Rpb24oSix0dCl7by5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmSiE9PW51bGwmJnR5cGVvZiBKPT0ic3RyaW5nIiYmSi5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik7dmFyIHl0PXQoIjxvcHRpb24+Iix7dHlwZTpBcnJheS5pc0FycmF5KEopPyJBcnJheSI6IlN0cmluZyIsdmFsdWU6Sn0pLmRhdGEoInNidiIsSikuYWRkQ2xhc3Moby5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3Moby5jbGFzc2VzLm5vdEl0YWxpYykuaHRtbCh0eXBlb2YgdHQ9PSJzdHJpbmciP3R0LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTp0dCksVHQ9eXQudmFsKCk7RS5pbmRleE9mKFR0KT09PS0xJiYoRS5wdXNoKFR0KSxaLnB1c2goeXQpLEMhPT1udWxsJiZBcnJheS5pc0FycmF5KENbMF0pJiYoQ1swXT1DWzBdLnNvcnQoKS5qb2luKCIsIikpLEMhPT1udWxsJiZ5dC52YWwoKT09PUNbMF0mJih5dC5wcm9wKCJzZWxlY3RlZCIsITApLGV0LnJlbW92ZUNsYXNzKGguY2xhc3Nlcy5pdGFsaWMpLG8uZG9tLnZhbHVlVGl0bGUucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKSkpfTtpZihCKWZvcih2YXIgWD0wO1g8Ui5maWx0ZXIubGVuZ3RoO1grKylMKFIuZmlsdGVyW1hdLFIudGV4dFtYXSk7ZWxzZSBMKFIuZmlsdGVyLEFycmF5LmlzQXJyYXkoUi50ZXh0KT9SLnRleHQuam9pbigiLCAiKTpSLnRleHQpfVouc29ydChmdW5jdGlvbihKLHR0KXtpZihvLnMudHlwZT09PSJhcnJheSJ8fG8ucy50eXBlPT09InN0cmluZyJ8fG8ucy50eXBlPT09Imh0bWwiKXJldHVybiBKLnZhbCgpPHR0LnZhbCgpPy0xOkoudmFsKCk+dHQudmFsKCk/MTowO2lmKG8ucy50eXBlPT09Im51bSJ8fG8ucy50eXBlPT09Imh0bWwtbnVtIilyZXR1cm4rSi52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik8K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8tMTorSi52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8xOjA7aWYoby5zLnR5cGU9PT0ibnVtLWZtdCJ8fG8ucy50eXBlPT09Imh0bWwtbnVtLWZtdCIpcmV0dXJuK0oudmFsKCkucmVwbGFjZSgvW14wLTkuXS9nLCIiKTwrdHQudmFsKCkucmVwbGFjZSgvW14wLTkuXS9nLCIiKT8tMTorSi52YWwoKS5yZXBsYWNlKC9bXjAtOS5dL2csIiIpPit0dC52YWwoKS5yZXBsYWNlKC9bXjAtOS5dL2csIiIpPzE6MH0pO2Zvcih2YXIgaj0wLHE9WjtqPHEubGVuZ3RoO2orKyl7dmFyIGF0PXFbal07ZXQuYXBwZW5kKGF0KX1yZXR1cm4gZXR9LGguaW5pdFNlbGVjdFNTUD1mdW5jdGlvbihvLGYsQyl7Qz09PXZvaWQgMCYmKEM9bnVsbCksby5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBCPXQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyhoLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyhoLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQoby5kb20udmFsdWVUaXRsZSkub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoaC5jbGFzc2VzLml0YWxpYyksZihvLHRoaXMpfSk7by5jLmdyZXlzY2FsZSYmQi5hZGRDbGFzcyhoLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIGM9W10sej0wLEc9by5zLnNlcnZlckRhdGFbby5zLm9yaWdEYXRhXTt6PEcubGVuZ3RoO3orKyl7dmFyIGV0PUdbel0sRT1ldC52YWx1ZSxaPWV0LmxhYmVsLHk9ZnVuY3Rpb24oUixMKXtvLnMudHlwZS5pbmNsdWRlcygiaHRtbCIpJiZSIT09bnVsbCYmdHlwZW9mIFI9PSJzdHJpbmciJiZSLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTt2YXIgWD10KCI8b3B0aW9uPiIse3R5cGU6QXJyYXkuaXNBcnJheShSKT8iQXJyYXkiOiJTdHJpbmciLHZhbHVlOlJ9KS5kYXRhKCJzYnYiLFIpLmFkZENsYXNzKG8uY2xhc3Nlcy5vcHRpb24pLmFkZENsYXNzKG8uY2xhc3Nlcy5ub3RJdGFsaWMpLmh0bWwodHlwZW9mIEw9PSJzdHJpbmciP0wucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpOkwpO2MucHVzaChYKSxDIT09bnVsbCYmWC52YWwoKT09PUNbMF0mJihYLnByb3AoInNlbGVjdGVkIiwhMCksQi5yZW1vdmVDbGFzcyhoLmNsYXNzZXMuaXRhbGljKSxvLmRvbS52YWx1ZVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIikpfTt5KEUsWil9Zm9yKHZhciBfPTAsUz1jO188Uy5sZW5ndGg7XysrKXt2YXIgTj1TW19dO0IuYXBwZW5kKE4pfXJldHVybiBCfSxoLmluaXRTZWxlY3RBcnJheT1mdW5jdGlvbihvLGYsQyl7cmV0dXJuIEM9PT12b2lkIDAmJihDPW51bGwpLGguaW5pdFNlbGVjdChvLGYsQywhMCl9LGguaW5pdElucHV0PWZ1bmN0aW9uKG8sZixDKXtDPT09dm9pZCAwJiYoQz1udWxsKTt2YXIgQj1vLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSxjPXQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoaC5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhoLmNsYXNzZXMuaW5wdXQpLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLG8uX3Rocm90dGxlKGZ1bmN0aW9uKHope3ZhciBHPXoua2V5Q29kZXx8ei53aGljaDtyZXR1cm4gZihvLHRoaXMsRyl9LEI9PT1udWxsPzEwMDpCKSk7cmV0dXJuIG8uYy5ncmV5c2NhbGUmJmMuYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSksQyE9PW51bGwmJmMudmFsKENbMF0pLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksY30saC5pbml0MklucHV0PWZ1bmN0aW9uKG8sZixDKXtDPT09dm9pZCAwJiYoQz1udWxsKTt2YXIgQj1vLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSxjPVt0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmlucHV0KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixvLl90aHJvdHRsZShmdW5jdGlvbih6KXt2YXIgRz16LmtleUNvZGV8fHoud2hpY2g7cmV0dXJuIGYobyx0aGlzLEcpfSxCPT09bnVsbD8xMDA6QikpLHQoIjxzcGFuPiIpLmFkZENsYXNzKG8uY2xhc3Nlcy5qb2luZXIpLmh0bWwoby5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWVKb2luZXIiLG8uYy5pMThuLnZhbHVlSm9pbmVyKSksdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5pbnB1dCkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsby5fdGhyb3R0bGUoZnVuY3Rpb24oeil7dmFyIEc9ei5rZXlDb2RlfHx6LndoaWNoO3JldHVybiBmKG8sdGhpcyxHKX0sQj09PW51bGw/MTAwOkIpKV07cmV0dXJuIG8uYy5ncmV5c2NhbGUmJihjWzBdLmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpLGNbMl0uYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSkpLEMhPT1udWxsJiYoY1swXS52YWwoQ1swXSksY1syXS52YWwoQ1sxXSkpLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksY30saC5pbml0RGF0ZT1mdW5jdGlvbihvLGYsQyl7Qz09PXZvaWQgMCYmKEM9bnVsbCk7dmFyIEI9by5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksYz1vLnMuZHQuaTE4bigiZGF0ZXRpbWUiLHt9KSx6PXQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoaC5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhoLmNsYXNzZXMuaW5wdXQpLmR0RGF0ZVRpbWUoe2F0dGFjaFRvOiJpbnB1dCIsZm9ybWF0Om8ucy5kYXRlRm9ybWF0P28ucy5kYXRlRm9ybWF0OnZvaWQgMCxpMThuOmN9KS5vbigiY2hhbmdlLmR0c2IiLG8uX3Rocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sQj09PW51bGw/MTAwOkIpKS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixmdW5jdGlvbihHKXtvLl90aHJvdHRsZShmdW5jdGlvbigpe3ZhciBldD1HLmtleUNvZGV8fEcud2hpY2g7cmV0dXJuIGYobyx0aGlzLGV0KX0sQj09PW51bGw/MTAwOkIpfSk7cmV0dXJuIG8uYy5ncmV5c2NhbGUmJnouYWRkQ2xhc3MoaC5jbGFzc2VzLmdyZXlzY2FsZSksQyE9PW51bGwmJnoudmFsKENbMF0pLG8ucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksen0saC5pbml0Tm9WYWx1ZT1mdW5jdGlvbihvKXtyZXR1cm4gby5zLmR0Lm9uZSgiZHJhdy5kdHNiIixmdW5jdGlvbigpe28ucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSxbXX0saC5pbml0MkRhdGU9ZnVuY3Rpb24obyxmLEMpe3ZhciBCPXRoaXM7Qz09PXZvaWQgMCYmKEM9bnVsbCk7dmFyIGM9by5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksej1vLnMuZHQuaTE4bigiZGF0ZXRpbWUiLHt9KSxHPVt0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGguY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoaC5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpvLnMuZGF0ZUZvcm1hdD9vLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjp6fSkub24oImNoYW5nZS5kdHNiIixjIT09bnVsbD9zdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sYyk6ZnVuY3Rpb24oKXtmKG8sQil9KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixmdW5jdGlvbihldCl7c3QudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3ZhciBFPWV0LmtleUNvZGV8fGV0LndoaWNoO3JldHVybiBmKG8sdGhpcyxFKX0sYz09PW51bGw/MDpjKX0pLHQoIjxzcGFuPiIpLmFkZENsYXNzKG8uY2xhc3Nlcy5qb2luZXIpLmh0bWwoby5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWVKb2luZXIiLG8uYy5pMThuLnZhbHVlSm9pbmVyKSksdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhoLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGguY2xhc3Nlcy5pbnB1dCkuZHREYXRlVGltZSh7YXR0YWNoVG86ImlucHV0Iixmb3JtYXQ6by5zLmRhdGVGb3JtYXQ/by5zLmRhdGVGb3JtYXQ6dm9pZCAwLGkxOG46en0pLm9uKCJjaGFuZ2UuZHRzYiIsYyE9PW51bGw/c3QudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBmKG8sdGhpcyl9LGMpOmZ1bmN0aW9uKCl7ZihvLEIpfSkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsIW8uYy5lbnRlclNlYXJjaCYmIShvLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2ghPT12b2lkIDAmJm8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaC5yZXR1cm4pJiZjIT09bnVsbD9zdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGYobyx0aGlzKX0sYyk6ZnVuY3Rpb24oZXQpe3ZhciBFPWV0LmtleUNvZGV8fGV0LndoaWNoO2YobyxCLEUpfSldO3JldHVybiBvLmMuZ3JleXNjYWxlJiYoR1swXS5hZGRDbGFzcyhoLmNsYXNzZXMuZ3JleXNjYWxlKSxHWzJdLmFkZENsYXNzKGguY2xhc3Nlcy5ncmV5c2NhbGUpKSxDIT09bnVsbCYmQy5sZW5ndGg+MCYmKEdbMF0udmFsKENbMF0pLEdbMl0udmFsKENbMV0pKSxvLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7by5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLEd9LGguaXNJbnB1dFZhbGlkU2VsZWN0PWZ1bmN0aW9uKG8pe2Zvcih2YXIgZj0hMCxDPTAsQj1vO0M8Qi5sZW5ndGg7QysrKXt2YXIgYz1CW0NdO2MuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmxlbmd0aD09PWMuY2hpbGRyZW4oIm9wdGlvbiIpLmxlbmd0aC1jLmNoaWxkcmVuKCJvcHRpb24uIitoLmNsYXNzZXMubm90SXRhbGljKS5sZW5ndGgmJmMuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmxlbmd0aD09PTEmJmMuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpWzBdPT09Yy5jaGlsZHJlbigib3B0aW9uIilbMF0mJihmPSExKX1yZXR1cm4gZn0saC5pc0lucHV0VmFsaWRJbnB1dD1mdW5jdGlvbihvKXtmb3IodmFyIGY9ITAsQz0wLEI9bztDPEIubGVuZ3RoO0MrKyl7dmFyIGM9QltDXTtjLmlzKCJpbnB1dCIpJiZjLnZhbCgpLmxlbmd0aD09PTAmJihmPSExKX1yZXR1cm4gZn0saC5pbnB1dFZhbHVlU2VsZWN0PWZ1bmN0aW9uKG8pe2Zvcih2YXIgZj1bXSxDPTAsQj1vO0M8Qi5sZW5ndGg7QysrKXt2YXIgYz1CW0NdO2MuaXMoInNlbGVjdCIpJiZmLnB1c2goaC5fZXNjYXBlSFRNTChjLmNoaWxkcmVuKCJvcHRpb246c2VsZWN0ZWQiKS5kYXRhKCJzYnYiKSkpfXJldHVybiBmfSxoLmlucHV0VmFsdWVJbnB1dD1mdW5jdGlvbihvKXtmb3IodmFyIGY9W10sQz0wLEI9bztDPEIubGVuZ3RoO0MrKyl7dmFyIGM9QltDXTtjLmlzKCJpbnB1dCIpJiZmLnB1c2goaC5fZXNjYXBlSFRNTChjLnZhbCgpKSl9cmV0dXJuIGZ9LGgudXBkYXRlTGlzdGVuZXI9ZnVuY3Rpb24obyxmLEMpe3ZhciBCPW8ucy5jb25kaXRpb25zW28ucy5jb25kaXRpb25dLGM7aWYoby5zLmZpbGxlZD1CLmlzSW5wdXRWYWxpZChvLmRvbS52YWx1ZSxvKSxvLnMudmFsdWU9Qi5pbnB1dFZhbHVlKG8uZG9tLnZhbHVlLG8pLCFvLnMuZmlsbGVkKXsoIW8uYy5lbnRlclNlYXJjaCYmIShvLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2ghPT12b2lkIDAmJm8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaC5yZXR1cm4pfHxDPT09MTMpJiZvLmRvU2VhcmNoKCk7cmV0dXJufWZvcihBcnJheS5pc0FycmF5KG8ucy52YWx1ZSl8fChvLnMudmFsdWU9W28ucy52YWx1ZV0pLGM9MDtjPG8ucy52YWx1ZS5sZW5ndGg7YysrKUFycmF5LmlzQXJyYXkoby5zLnZhbHVlW2NdKSYmby5zLnZhbHVlW2NdLnNvcnQoKTt2YXIgej1udWxsLEc9bnVsbDtmb3IoYz0wO2M8by5kb20udmFsdWUubGVuZ3RoO2MrKylmPT09by5kb20udmFsdWVbY11bMF0mJih6PWMsZi5zZWxlY3Rpb25TdGFydCE9PXZvaWQgMCYmKEc9Zi5zZWxlY3Rpb25TdGFydCkpOyghby5jLmVudGVyU2VhcmNoJiYhKG8ucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmby5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybil8fEM9PT0xMykmJm8uZG9TZWFyY2goKSx6IT09bnVsbCYmKG8uZG9tLnZhbHVlW3pdLnJlbW92ZUNsYXNzKG8uY2xhc3Nlcy5pdGFsaWMpLG8uZG9tLnZhbHVlW3pdLmZvY3VzKCksRyE9PW51bGwmJm8uZG9tLnZhbHVlW3pdWzBdLnNldFNlbGVjdGlvblJhbmdlKEcsRykpfSxoLmRhdGVDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMiLGYuY29uZGl0aW9ucy5kYXRlLmVxdWFscyl9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG89PT1mWzBdfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdCIsZi5jb25kaXRpb25zLmRhdGUubm90KX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG89by5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbyE9PWZbMF19fSwiPCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUiLGYuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSl9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG88ZlswXX19LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmFmdGVyIixmLmNvbmRpdGlvbnMuZGF0ZS5hZnRlcil9LGluaXQ6aC5pbml0RGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLG8+ZlswXX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuIixmLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuKX0saW5pdDpoLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvPW8ucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLGZbMF08ZlsxXT9mWzBdPD1vJiZvPD1mWzFdOmZbMV08PW8mJm88PWZbMF19fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsZi5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6aC5pbml0MkRhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gbz1vLnJlcGxhY2UoLyhcL3wtfCwpL2csIi0iKSxmWzBdPGZbMV0/IShmWzBdPD1vJiZvPD1mWzFdKTohKGZbMV08PW8mJm88PWZbMF0pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsfHxvLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGYuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIShvPT1udWxsfHxvLmxlbmd0aD09PTApfX19LGgubW9tZW50RGF0ZUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVxdWFscyIsZi5jb25kaXRpb25zLmRhdGUuZXF1YWxzKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKT09PXIoKShmWzBdLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixmLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiByKCkobyxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpIT09cigpKGZbMF0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsZi5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTxyKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYWZ0ZXIiLGYuY29uZGl0aW9ucy5kYXRlLmFmdGVyKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gcigpKG8sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKT5yKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGYuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmguaW5pdDJEYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1yKCkobyxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLGM9cigpKGZbMF0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKSx6PXIoKShmWzFdLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCk7cmV0dXJuIGM8ej9jPD1CJiZCPD16Ono8PUImJkI8PWN9fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsZi5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6aC5pbml0MkRhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3ZhciBCPXIoKShvLEMucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksYz1yKCkoZlswXSxDLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLHo9cigpKGZbMV0sQy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTtyZXR1cm4gYzx6PyEoK2M8PStCJiYrQjw9K3opOiEoK3o8PStCJiYrQjw9K2MpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsfHxvLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGYuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIShvPT1udWxsfHxvLmxlbmd0aD09PTApfX19LGgubHV4b25EYXRlQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZXF1YWxzIixmLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBuKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cz09PW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMF0sQy5zLmRhdGVGb3JtYXQpLnRzfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdCIsZi5jb25kaXRpb25zLmRhdGUubm90KX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHMhPT1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50c319LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsZi5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpoLmluaXREYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gbigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHM8bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoZlswXSxDLnMuZGF0ZUZvcm1hdCkudHN9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5hZnRlciIsZi5jb25kaXRpb25zLmRhdGUuYWZ0ZXIpfSxpbml0OmguaW5pdERhdGUsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBuKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cz5uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50c319LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuIixmLmNvbmRpdGlvbnMuZGF0ZS5iZXR3ZWVuKX0saW5pdDpoLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7dmFyIEI9bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQobyxDLnMuZGF0ZUZvcm1hdCkudHMsYz1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChmWzBdLEMucy5kYXRlRm9ybWF0KS50cyx6PW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMV0sQy5zLmRhdGVGb3JtYXQpLnRzO3JldHVybiBjPHo/Yzw9QiYmQjw9ejp6PD1CJiZCPD1jfX0sIiFiZXR3ZWVuIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdEJldHdlZW4iLGYuY29uZGl0aW9ucy5kYXRlLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJEYXRlLGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1uKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChvLEMucy5kYXRlRm9ybWF0KS50cyxjPW4oKS5EYXRlVGltZS5mcm9tRm9ybWF0KGZbMF0sQy5zLmRhdGVGb3JtYXQpLnRzLHo9bigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoZlsxXSxDLnMuZGF0ZUZvcm1hdCkudHM7cmV0dXJuIGM8ej8hKCtjPD0rQiYmK0I8PSt6KTohKCt6PD0rQiYmK0I8PStjKX19LG51bGw6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSIsZi5jb25kaXRpb25zLmRhdGUuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5IixmLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSl9LGluaXQ6aC5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKG8pe3JldHVybiEobz09bnVsbHx8by5sZW5ndGg9PT0wKX19fSxoLm51bUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzIixmLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyl9LGluaXQ6aC5pbml0U2VsZWN0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4rbz09K2ZbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3QiLGYuY29uZGl0aW9ucy5udW1iZXIubm90KX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitvIT0rZlswXX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubHQiLGYuY29uZGl0aW9ucy5udW1iZXIubHQpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK288K2ZbMF19fSwiPD0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdGUiLGYuY29uZGl0aW9ucy5udW1iZXIubHRlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitvPD0rZlswXX19LCI+PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSIsZi5jb25kaXRpb25zLm51bWJlci5ndGUpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK28+PStmWzBdfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ndCIsZi5jb25kaXRpb25zLm51bWJlci5ndCl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4rbz4rZlswXX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmJldHdlZW4iLGYuY29uZGl0aW9ucy5udW1iZXIuYmV0d2Vlbil9LGluaXQ6aC5pbml0MklucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuK2ZbMF08K2ZbMV0/K2ZbMF08PStvJiYrbzw9K2ZbMV06K2ZbMV08PStvJiYrbzw9K2ZbMF19fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RCZXR3ZWVuIixmLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybitmWzBdPCtmWzFdPyEoK2ZbMF08PStvJiYrbzw9K2ZbMV0pOiEoK2ZbMV08PStvJiYrbzw9K2ZbMF0pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5udW1GbXRDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyIsZi5jb25kaXRpb25zLm51bWJlci5lcXVhbHMpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXtyZXR1cm4gQy5wYXJzZU51bWJlcihvKT09PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3QiLGYuY29uZGl0aW9ucy5udW1iZXIubm90KX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobykhPT1DLnBhcnNlTnVtYmVyKGZbMF0pfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdCIsZi5jb25kaXRpb25zLm51bWJlci5sdCl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmLEMpe3JldHVybiBDLnBhcnNlTnVtYmVyKG8pPEMucGFyc2VOdW1iZXIoZlswXSl9fSwiPD0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdGUiLGYuY29uZGl0aW9ucy5udW1iZXIubHRlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk8PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiPj0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ndGUiLGYuY29uZGl0aW9ucy5udW1iZXIuZ3RlKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk+PUMucGFyc2VOdW1iZXIoZlswXSl9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0IixmLmNvbmRpdGlvbnMubnVtYmVyLmd0KX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7cmV0dXJuIEMucGFyc2VOdW1iZXIobyk+Qy5wYXJzZU51bWJlcihmWzBdKX19LGJldHdlZW46e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmJldHdlZW4iLGYuY29uZGl0aW9ucy5udW1iZXIuYmV0d2Vlbil9LGluaXQ6aC5pbml0MklucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZixDKXt2YXIgQj1DLnBhcnNlTnVtYmVyKG8pLGM9Qy5wYXJzZU51bWJlcihmWzBdKSx6PUMucGFyc2VOdW1iZXIoZlsxXSk7cmV0dXJuK2M8K3o/K2M8PStCJiYrQjw9K3o6K3o8PStCJiYrQjw9K2N9fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RCZXR3ZWVuIixmLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4pfSxpbml0OmguaW5pdDJJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYsQyl7dmFyIEI9Qy5wYXJzZU51bWJlcihvKSxjPUMucGFyc2VOdW1iZXIoZlswXSksej1DLnBhcnNlTnVtYmVyKGZbMV0pO3JldHVybitjPCt6PyEoK2M8PStCJiYrQjw9K3opOiEoK3o8PStCJiYrQjw9K2MpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkiLGYuY29uZGl0aW9ucy5udW1iZXIubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5zdHJpbmdDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuc3RyaW5nLmVxdWFscyIsZi5jb25kaXRpb25zLnN0cmluZy5lcXVhbHMpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG89PT1mWzBdfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90IixmLmNvbmRpdGlvbnMuc3RyaW5nLm5vdCl9LGluaXQ6aC5pbml0U2VsZWN0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvIT09ZlswXX19LHN0YXJ0czp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuc3RhcnRzV2l0aCIsZi5jb25kaXRpb25zLnN0cmluZy5zdGFydHNXaXRoKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmWzBdLnRvTG93ZXJDYXNlKCkpPT09MH19LCIhc3RhcnRzIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90U3RhcnRzV2l0aCIsZi5jb25kaXRpb25zLnN0cmluZy5ub3RTdGFydHNXaXRoKX0saW5pdDpoLmluaXRJbnB1dCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihvLGYpe3JldHVybiBvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmWzBdLnRvTG93ZXJDYXNlKCkpIT09MH19LGNvbnRhaW5zOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5jb250YWlucyIsZi5jb25kaXRpb25zLnN0cmluZy5jb250YWlucyl9LGluaXQ6aC5pbml0SW5wdXQsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZbMF0udG9Mb3dlckNhc2UoKSl9fSwiIWNvbnRhaW5zIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90Q29udGFpbnMiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90Q29udGFpbnMpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIW8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmWzBdLnRvTG93ZXJDYXNlKCkpfX0sZW5kczp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZW5kc1dpdGgiLGYuY29uZGl0aW9ucy5zdHJpbmcuZW5kc1dpdGgpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aChmWzBdLnRvTG93ZXJDYXNlKCkpfX0sIiFlbmRzIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90RW5kc1dpdGgiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90RW5kc1dpdGgpfSxpbml0OmguaW5pdElucHV0LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKG8sZil7cmV0dXJuIW8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aChmWzBdLnRvTG93ZXJDYXNlKCkpfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZW1wdHkiLGYuY29uZGl0aW9ucy5zdHJpbmcuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcubm90RW1wdHkiLGYuY29uZGl0aW9ucy5zdHJpbmcubm90RW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4hKG89PW51bGx8fG8ubGVuZ3RoPT09MCl9fX0saC5hcnJheUNvbmRpdGlvbnM9e2NvbnRhaW5zOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5LmNvbnRhaW5zIixmLmNvbmRpdGlvbnMuYXJyYXkuY29udGFpbnMpfSxpbml0OmguaW5pdFNlbGVjdEFycmF5LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pbmNsdWRlcyhmWzBdKX19LHdpdGhvdXQ6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkud2l0aG91dCIsZi5jb25kaXRpb25zLmFycmF5LndpdGhvdXQpfSxpbml0OmguaW5pdFNlbGVjdEFycmF5LGlucHV0VmFsdWU6aC5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpoLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pbmRleE9mKGZbMF0pPT09LTF9fSwiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obyxmKXtyZXR1cm4gby5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuZXF1YWxzIixmLmNvbmRpdGlvbnMuYXJyYXkuZXF1YWxzKX0saW5pdDpoLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpoLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmguaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihvLGYpe2lmKG8ubGVuZ3RoPT09ZlswXS5sZW5ndGgpe2Zvcih2YXIgQz0wO0M8by5sZW5ndGg7QysrKWlmKG9bQ10hPT1mWzBdW0NdKXJldHVybiExO3JldHVybiEwfXJldHVybiExfX0sIiE9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5ub3QiLGYuY29uZGl0aW9ucy5hcnJheS5ub3QpfSxpbml0OmguaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmguaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6aC5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKG8sZil7aWYoby5sZW5ndGg9PT1mWzBdLmxlbmd0aCl7Zm9yKHZhciBDPTA7QzxvLmxlbmd0aDtDKyspaWYob1tDXSE9PWZbMF1bQ10pcmV0dXJuITA7cmV0dXJuITF9cmV0dXJuITB9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKG8sZil7cmV0dXJuIG8uaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5LmVtcHR5IixmLmNvbmRpdGlvbnMuYXJyYXkuZW1wdHkpfSxpbml0OmguaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbHx8by5sZW5ndGg9PT0wfX0sIiFudWxsIjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihvLGYpe3JldHVybiBvLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5ub3RFbXB0eSIsZi5jb25kaXRpb25zLmFycmF5Lm5vdEVtcHR5KX0saW5pdDpoLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obyl7cmV0dXJuIG8hPW51bGwmJm8ubGVuZ3RoIT09MH19fSxoLmRlZmF1bHRzPXtjb2x1bW5zOiEwLGNvbmRpdGlvbnM6e2FycmF5OmguYXJyYXlDb25kaXRpb25zLGRhdGU6aC5kYXRlQ29uZGl0aW9ucyxodG1sOmguc3RyaW5nQ29uZGl0aW9ucywiaHRtbC1udW0iOmgubnVtQ29uZGl0aW9ucywiaHRtbC1udW0tZm10IjpoLm51bUZtdENvbmRpdGlvbnMsbHV4b246aC5sdXhvbkRhdGVDb25kaXRpb25zLG1vbWVudDpoLm1vbWVudERhdGVDb25kaXRpb25zLG51bTpoLm51bUNvbmRpdGlvbnMsIm51bS1mbXQiOmgubnVtRm10Q29uZGl0aW9ucyxzdHJpbmc6aC5zdHJpbmdDb25kaXRpb25zfSxkZXB0aExpbWl0OiExLGVudGVyU2VhcmNoOiExLGZpbHRlckNoYW5nZWQ6dm9pZCAwLGdyZXlzY2FsZTohMSxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxpdmVTZWFyY2g6ITAsbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxofSgpLGwsdTtmdW5jdGlvbiBwKGgpe2w9aCx1PWguZm4uZGF0YVRhYmxlfXZhciB2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChvLGYsQyxCLGMseixHKXtpZihCPT09dm9pZCAwJiYoQj0wKSxjPT09dm9pZCAwJiYoYz0hMSksej09PXZvaWQgMCYmKHo9MSksRz09PXZvaWQgMCYmKEc9dm9pZCAwKSwhdXx8IXUudmVyc2lvbkNoZWNrfHwhdS52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtyZXR1cm4gdGhpcy5jbGFzc2VzPWwuZXh0ZW5kKCEwLHt9LGguY2xhc3NlcyksdGhpcy5jPWwuZXh0ZW5kKCEwLHt9LGguZGVmYXVsdHMsZiksdGhpcy5zPXtjcml0ZXJpYTpbXSxkZXB0aDp6LGR0Om8saW5kZXg6Qixpc0NoaWxkOmMsbG9naWM6dm9pZCAwLG9wdHM6ZixwcmV2ZW50UmVkcmF3OiExLHNlcnZlckRhdGE6Ryx0b0Ryb3A6dm9pZCAwLHRvcEdyb3VwOkN9LHRoaXMuZG9tPXthZGQ6bCgiPGJ1dHRvbi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmFkZCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNsZWFyOmwoIjxidXR0b24+JnRpbWVzPC9idXR0b24+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNsZWFyR3JvdXApLmF0dHIoInR5cGUiLCJidXR0b24iKSxjb250YWluZXI6bCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyb3VwKSxsb2dpYzpsKCI8YnV0dG9uPjxkaXYvPjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sb2dpYykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGxvZ2ljQ29udGFpbmVyOmwoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sb2dpY0NvbnRhaW5lciksc2VhcmNoOmwoIjxidXR0b24vPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2gpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHRoaXMucy50b3BHcm91cD09PXZvaWQgMCYmKHRoaXMucy50b3BHcm91cD10aGlzLmRvbS5jb250YWluZXIpLHRoaXMuX3NldHVwKCksdGhpc31yZXR1cm4gaC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmFkZC5vZmYoIi5kdHNiIiksdGhpcy5kb20ubG9naWMub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLnNlYXJjaC5vZmYoIi5kdHNiIiksdGhpcy5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZGVzdHJveSIpLnJlbW92ZSgpLHRoaXMucy5jcml0ZXJpYT1bXX0saC5wcm90b3R5cGUuZ2V0RGV0YWlscz1mdW5jdGlvbihvKXtpZihvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJue307Zm9yKHZhciBmPXtjcml0ZXJpYTpbXSxsb2dpYzp0aGlzLnMubG9naWN9LEM9MCxCPXRoaXMucy5jcml0ZXJpYTtDPEIubGVuZ3RoO0MrKyl7dmFyIGM9QltDXTtmLmNyaXRlcmlhLnB1c2goYy5jcml0ZXJpYS5nZXREZXRhaWxzKG8pKX1yZXR1cm4gZn0saC5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGgucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obyl7dmFyIGY7aWYoIShvLmNyaXRlcmlhPT09dm9pZCAwfHxvLmNyaXRlcmlhPT09bnVsbHx8QXJyYXkuaXNBcnJheShvLmNyaXRlcmlhKSYmby5jcml0ZXJpYS5sZW5ndGg9PT0wKSl7aWYodGhpcy5zLmxvZ2ljPW8ubG9naWMsdGhpcy5kb20ubG9naWMuY2hpbGRyZW4oKS5maXJzdCgpLmh0bWwodGhpcy5zLmxvZ2ljPT09Ik9SIj90aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKTp0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSxBcnJheS5pc0FycmF5KG8uY3JpdGVyaWEpKWZvcih2YXIgQz0wLEI9by5jcml0ZXJpYTtDPEIubGVuZ3RoO0MrKylmPUJbQ10sZi5sb2dpYyE9PXZvaWQgMD90aGlzLl9hZGRQcmV2R3JvdXAoZik6Zi5sb2dpYz09PXZvaWQgMCYmdGhpcy5fYWRkUHJldkNyaXRlcmlhKGYpO2Zvcih2YXIgYz0wLHo9dGhpcy5zLmNyaXRlcmlhO2M8ei5sZW5ndGg7YysrKWY9eltjXSxmLmNyaXRlcmlhIGluc3RhbmNlb2YgYSYmKGYuY3JpdGVyaWEudXBkYXRlQXJyb3dzKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg+MSksdGhpcy5fc2V0Q3JpdGVyaWFMaXN0ZW5lcnMoZi5jcml0ZXJpYSkpfX0saC5wcm90b3R5cGUucmVkcmF3Q29udGVudHM9ZnVuY3Rpb24oKXtpZighdGhpcy5zLnByZXZlbnRSZWRyYXcpe3RoaXMuZG9tLmNvbnRhaW5lci5jaGlsZHJlbigpLmRldGFjaCgpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20ubG9naWNDb250YWluZXIpLmFwcGVuZCh0aGlzLmRvbS5hZGQpLHRoaXMuYy5saXZlU2VhcmNofHx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnNlYXJjaCksdGhpcy5zLmNyaXRlcmlhLnNvcnQoZnVuY3Rpb24oQyxCKXtyZXR1cm4gQy5jcml0ZXJpYS5zLmluZGV4PEIuY3JpdGVyaWEucy5pbmRleD8tMTpDLmNyaXRlcmlhLnMuaW5kZXg+Qi5jcml0ZXJpYS5zLmluZGV4PzE6MH0pLHRoaXMuc2V0TGlzdGVuZXJzKCk7Zm9yKHZhciBvPTA7bzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO28rKyl7dmFyIGY9dGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhO2YgaW5zdGFuY2VvZiBhPyh0aGlzLnMuY3JpdGVyaWFbb10uaW5kZXg9byx0aGlzLnMuY3JpdGVyaWFbb10uY3JpdGVyaWEucy5pbmRleD1vLHRoaXMucy5jcml0ZXJpYVtvXS5jcml0ZXJpYS5kb20uY29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmRvbS5hZGQpLHRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKGYpLHRoaXMucy5jcml0ZXJpYVtvXS5jcml0ZXJpYS5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnJlYnVpbGQodGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLmdldERldGFpbHMoKSksdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnMucHJldmVudFJlZHJhdz0hMSk6ZiBpbnN0YW5jZW9mIGgmJmYucy5jcml0ZXJpYS5sZW5ndGg+MD8odGhpcy5zLmNyaXRlcmlhW29dLmluZGV4PW8sdGhpcy5zLmNyaXRlcmlhW29dLmNyaXRlcmlhLnMuaW5kZXg9byx0aGlzLnMuY3JpdGVyaWFbb10uY3JpdGVyaWEuZG9tLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSxmLnMucHJldmVudFJlZHJhdz10aGlzLnMucHJldmVudFJlZHJhdyxmLnJlZHJhd0NvbnRlbnRzKCksZi5zLnByZXZlbnRSZWRyYXc9ITEsdGhpcy5fc2V0R3JvdXBMaXN0ZW5lcnMoZikpOih0aGlzLnMuY3JpdGVyaWEuc3BsaWNlKG8sMSksby0tKX10aGlzLnNldHVwTG9naWMoKX19LGgucHJvdG90eXBlLnJlZHJhd0xvZ2ljPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPTAsZj10aGlzLnMuY3JpdGVyaWE7bzxmLmxlbmd0aDtvKyspe3ZhciBDPWZbb107Qy5jcml0ZXJpYSBpbnN0YW5jZW9mIGgmJkMuY3JpdGVyaWEucmVkcmF3TG9naWMoKX10aGlzLnNldHVwTG9naWMoKX0saC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKG8sZil7cmV0dXJuIHRoaXMucy5sb2dpYz09PSJBTkQiP3RoaXMuX2FuZFNlYXJjaChvLGYpOnRoaXMucy5sb2dpYz09PSJPUiI/dGhpcy5fb3JTZWFyY2gobyxmKTohMH0saC5wcm90b3R5cGUuc2V0dXBMb2dpYz1mdW5jdGlvbigpe2lmKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLnJlbW92ZSgpLHRoaXMuZG9tLmNsZWFyLnJlbW92ZSgpLHRoaXMucy5jcml0ZXJpYS5sZW5ndGg8MSl7dGhpcy5zLmlzQ2hpbGR8fCh0aGlzLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1kZXN0cm95IiksdGhpcy5kb20uY29udGFpbmVyLmNzcygibWFyZ2luLWxlZnQiLDApKSx0aGlzLmRvbS5zZWFyY2guY3NzKCJkaXNwbGF5Iiwibm9uZSIpO3JldHVybn10aGlzLmRvbS5jbGVhci5oZWlnaHQoIjBweCIpLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5jbGVhciksdGhpcy5zLmlzQ2hpbGR8fHRoaXMuZG9tLnNlYXJjaC5jc3MoImRpc3BsYXkiLCJpbmxpbmUtYmxvY2siKSx0aGlzLmRvbS5jb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS5sb2dpY0NvbnRhaW5lcik7Zm9yKHZhciBvPTAsZj10aGlzLnMuY3JpdGVyaWE7bzxmLmxlbmd0aDtvKyspe3ZhciBDPWZbb107Qy5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJkMuY3JpdGVyaWEuc2V0dXBCdXR0b25zKCl9dmFyIEI9dGhpcy5kb20uY29udGFpbmVyLm91dGVySGVpZ2h0KCktMTt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci53aWR0aChCKSx0aGlzLl9zZXRMb2dpY0xpc3RlbmVyKCksdGhpcy5kb20uY29udGFpbmVyLmNzcygibWFyZ2luLWxlZnQiLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm91dGVySGVpZ2h0KCEwKSk7dmFyIGM9dGhpcy5kb20ubG9naWNDb250YWluZXIub2Zmc2V0KCksej1jLmxlZnQsRz10aGlzLmRvbS5jb250YWluZXIub2Zmc2V0KCkubGVmdCxldD16LUcsRT16LWV0LXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm91dGVySGVpZ2h0KCEwKTt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vZmZzZXQoe2xlZnQ6RX0pO3ZhciBaPXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm5leHQoKSx5PWMudG9wLF89bChaKS5vZmZzZXQoKS50b3AsUz15LV8sTj15LVM7dGhpcy5kb20ubG9naWNDb250YWluZXIub2Zmc2V0KHt0b3A6Tn0pLHRoaXMuZG9tLmNsZWFyLm91dGVySGVpZ2h0KHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmhlaWdodCgpKSx0aGlzLl9zZXRDbGVhckxpc3RlbmVyKCl9LGgucHJvdG90eXBlLnNldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5kb20uYWRkLnVuYmluZCgiY2xpY2siKSx0aGlzLmRvbS5hZGQub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8ucy5pc0NoaWxkfHxvLmRvbS5jb250YWluZXIucHJlcGVuZChvLmRvbS5sb2dpY0NvbnRhaW5lciksby5hZGRDcml0ZXJpYSgpLG8uZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLG8ucy5kdC5zdGF0ZS5zYXZlKCksITF9KSx0aGlzLmRvbS5zZWFyY2gub2ZmKCJjbGljay5kdHNiIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5zLmR0LmRyYXcoKX0pO2Zvcih2YXIgZj0wLEM9dGhpcy5zLmNyaXRlcmlhO2Y8Qy5sZW5ndGg7ZisrKXt2YXIgQj1DW2ZdO0IuY3JpdGVyaWEuc2V0TGlzdGVuZXJzKCl9dGhpcy5fc2V0Q2xlYXJMaXN0ZW5lcigpLHRoaXMuX3NldExvZ2ljTGlzdGVuZXIoKX0saC5wcm90b3R5cGUuYWRkQ3JpdGVyaWE9ZnVuY3Rpb24obyl7bz09PXZvaWQgMCYmKG89bnVsbCk7dmFyIGY9bz09PW51bGw/dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDpvLnMuaW5kZXgsQz1uZXcgYSh0aGlzLnMuZHQsdGhpcy5zLm9wdHMsdGhpcy5zLnRvcEdyb3VwLGYsdGhpcy5zLmRlcHRoLHRoaXMucy5zZXJ2ZXJEYXRhLHRoaXMuYy5saXZlU2VhcmNoKTtvIT09bnVsbCYmKEMuYz1vLmMsQy5zPW8ucyxDLnMuZGVwdGg9dGhpcy5zLmRlcHRoLEMuY2xhc3Nlcz1vLmNsYXNzZXMpLEMucG9wdWxhdGUoKTtmb3IodmFyIEI9ITEsYz0wO2M8dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtjKyspYz09PTAmJnRoaXMucy5jcml0ZXJpYVtjXS5jcml0ZXJpYS5zLmluZGV4PkMucy5pbmRleD8oQy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKHRoaXMucy5jcml0ZXJpYVtjXS5jcml0ZXJpYS5kb20uY29udGFpbmVyKSxCPSEwKTpjPHRoaXMucy5jcml0ZXJpYS5sZW5ndGgtMSYmdGhpcy5zLmNyaXRlcmlhW2NdLmNyaXRlcmlhLnMuaW5kZXg8Qy5zLmluZGV4JiZ0aGlzLnMuY3JpdGVyaWFbYysxXS5jcml0ZXJpYS5zLmluZGV4PkMucy5pbmRleCYmKEMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKHRoaXMucy5jcml0ZXJpYVtjXS5jcml0ZXJpYS5kb20uY29udGFpbmVyKSxCPSEwKTtCfHxDLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSx0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6QyxpbmRleDpmfSksdGhpcy5zLmNyaXRlcmlhPXRoaXMucy5jcml0ZXJpYS5zb3J0KGZ1bmN0aW9uKEUsWil7cmV0dXJuIEUuY3JpdGVyaWEucy5pbmRleC1aLmNyaXRlcmlhLnMuaW5kZXh9KTtmb3IodmFyIHo9MCxHPXRoaXMucy5jcml0ZXJpYTt6PEcubGVuZ3RoO3orKyl7dmFyIGV0PUdbel07ZXQuY3JpdGVyaWEgaW5zdGFuY2VvZiBhJiZldC5jcml0ZXJpYS51cGRhdGVBcnJvd3ModGhpcy5zLmNyaXRlcmlhLmxlbmd0aD4xKX10aGlzLl9zZXRDcml0ZXJpYUxpc3RlbmVycyhDKSxDLnNldExpc3RlbmVycygpLHRoaXMuc2V0dXBMb2dpYygpfSxoLnByb3RvdHlwZS5jaGVja0ZpbGxlZD1mdW5jdGlvbigpe2Zvcih2YXIgbz0wLGY9dGhpcy5zLmNyaXRlcmlhO288Zi5sZW5ndGg7bysrKXt2YXIgQz1mW29dO2lmKEMuY3JpdGVyaWEgaW5zdGFuY2VvZiBhJiZDLmNyaXRlcmlhLnMuZmlsbGVkfHxDLmNyaXRlcmlhIGluc3RhbmNlb2YgaCYmQy5jcml0ZXJpYS5jaGVja0ZpbGxlZCgpKXJldHVybiEwfXJldHVybiExfSxoLnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe2Zvcih2YXIgbz0wLGY9MCxDPXRoaXMucy5jcml0ZXJpYTtmPEMubGVuZ3RoO2YrKyl7dmFyIEI9Q1tmXTtCLmNyaXRlcmlhIGluc3RhbmNlb2YgaD9vKz1CLmNyaXRlcmlhLmNvdW50KCk6bysrfXJldHVybiBvfSxoLnByb3RvdHlwZS5fYWRkUHJldkdyb3VwPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXMucy5jcml0ZXJpYS5sZW5ndGgsQz1uZXcgaCh0aGlzLnMuZHQsdGhpcy5jLHRoaXMucy50b3BHcm91cCxmLCEwLHRoaXMucy5kZXB0aCsxLHRoaXMucy5zZXJ2ZXJEYXRhKTt0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6QyxpbmRleDpmLGxvZ2ljOkMucy5sb2dpY30pLEMucmVidWlsZChvKSx0aGlzLnMuY3JpdGVyaWFbZl0uY3JpdGVyaWE9Qyx0aGlzLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLHRoaXMuX3NldEdyb3VwTGlzdGVuZXJzKEMpfSxoLnByb3RvdHlwZS5fYWRkUHJldkNyaXRlcmlhPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXMucy5jcml0ZXJpYS5sZW5ndGgsQz1uZXcgYSh0aGlzLnMuZHQsdGhpcy5zLm9wdHMsdGhpcy5zLnRvcEdyb3VwLGYsdGhpcy5zLmRlcHRoLHRoaXMucy5zZXJ2ZXJEYXRhKTtDLnBvcHVsYXRlKCksdGhpcy5zLmNyaXRlcmlhLnB1c2goe2NyaXRlcmlhOkMsaW5kZXg6Zn0pLEMucy5wcmV2ZW50UmVkcmF3PXRoaXMucy5wcmV2ZW50UmVkcmF3LEMucmVidWlsZChvKSxDLnMucHJldmVudFJlZHJhdz0hMSx0aGlzLnMuY3JpdGVyaWFbZl0uY3JpdGVyaWE9Qyx0aGlzLnMucHJldmVudFJlZHJhd3x8dGhpcy5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKX0saC5wcm90b3R5cGUuX2FuZFNlYXJjaD1mdW5jdGlvbihvLGYpe2lmKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybiEwO2Zvcih2YXIgQz0wLEI9dGhpcy5zLmNyaXRlcmlhO0M8Qi5sZW5ndGg7QysrKXt2YXIgYz1CW0NdO2lmKCEoYy5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJiFjLmNyaXRlcmlhLnMuZmlsbGVkKSYmIWMuY3JpdGVyaWEuc2VhcmNoKG8sZikpcmV0dXJuITF9cmV0dXJuITB9LGgucHJvdG90eXBlLl9vclNlYXJjaD1mdW5jdGlvbihvLGYpe2lmKHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybiEwO2Zvcih2YXIgQz0hMSxCPTAsYz10aGlzLnMuY3JpdGVyaWE7QjxjLmxlbmd0aDtCKyspe3ZhciB6PWNbQl07aWYoei5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJnouY3JpdGVyaWEucy5maWxsZWQpe2lmKEM9ITAsei5jcml0ZXJpYS5zZWFyY2gobyxmKSlyZXR1cm4hMH1lbHNlIGlmKHouY3JpdGVyaWEgaW5zdGFuY2VvZiBoJiZ6LmNyaXRlcmlhLmNoZWNrRmlsbGVkKCkmJihDPSEwLHouY3JpdGVyaWEuc2VhcmNoKG8sZikpKXJldHVybiEwfXJldHVybiFDfSxoLnByb3RvdHlwZS5fcmVtb3ZlQ3JpdGVyaWE9ZnVuY3Rpb24obyxmKXtmPT09dm9pZCAwJiYoZj0hMSk7dmFyIEM7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aDw9MSYmdGhpcy5zLmlzQ2hpbGQpdGhpcy5kZXN0cm95KCk7ZWxzZXt2YXIgQj12b2lkIDA7Zm9yKEM9MDtDPHRoaXMucy5jcml0ZXJpYS5sZW5ndGg7QysrKXRoaXMucy5jcml0ZXJpYVtDXS5pbmRleD09PW8ucy5pbmRleCYmKCFmfHx0aGlzLnMuY3JpdGVyaWFbQ10uY3JpdGVyaWEgaW5zdGFuY2VvZiBoKSYmKEI9Qyk7Zm9yKEIhPT12b2lkIDAmJnRoaXMucy5jcml0ZXJpYS5zcGxpY2UoQiwxKSxDPTA7Qzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO0MrKyl0aGlzLnMuY3JpdGVyaWFbQ10uaW5kZXg9Qyx0aGlzLnMuY3JpdGVyaWFbQ10uY3JpdGVyaWEucy5pbmRleD1DfX0saC5wcm90b3R5cGUuX3NldENyaXRlcmlhTGlzdGVuZXJzPWZ1bmN0aW9uKG8pe3ZhciBmPXRoaXM7by5kb20uZGVsZXRlLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtmLl9yZW1vdmVDcml0ZXJpYShvKSxvLmRvbS5jb250YWluZXIucmVtb3ZlKCk7Zm9yKHZhciBDPTAsQj1mLnMuY3JpdGVyaWE7QzxCLmxlbmd0aDtDKyspe3ZhciBjPUJbQ107Yy5jcml0ZXJpYSBpbnN0YW5jZW9mIGEmJmMuY3JpdGVyaWEudXBkYXRlQXJyb3dzKGYucy5jcml0ZXJpYS5sZW5ndGg+MSl9cmV0dXJuIG8uZGVzdHJveSgpLGYucy5kdC5kcmF3KCksZi5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSwhMX0pLG8uZG9tLnJpZ2h0LnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXt2YXIgQz1vLnMuaW5kZXgsQj1uZXcgaChmLnMuZHQsZi5zLm9wdHMsZi5zLnRvcEdyb3VwLG8ucy5pbmRleCwhMCxmLnMuZGVwdGgrMSxmLnMuc2VydmVyRGF0YSk7cmV0dXJuIEIuYWRkQ3JpdGVyaWEobyksZi5zLmNyaXRlcmlhW0NdLmNyaXRlcmlhPUIsZi5zLmNyaXRlcmlhW0NdLmxvZ2ljPSJBTkQiLGYucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksZi5fc2V0R3JvdXBMaXN0ZW5lcnMoQiksITF9KSxvLmRvbS5sZWZ0LnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtmLnMudG9Ecm9wPW5ldyBhKGYucy5kdCxmLnMub3B0cyxmLnMudG9wR3JvdXAsby5zLmluZGV4LHZvaWQgMCxmLnMuc2VydmVyRGF0YSksZi5zLnRvRHJvcC5zPW8ucyxmLnMudG9Ecm9wLmM9by5jLGYucy50b0Ryb3AuY2xhc3Nlcz1vLmNsYXNzZXMsZi5zLnRvRHJvcC5wb3B1bGF0ZSgpO3ZhciBDPWYucy50b0Ryb3Aucy5pbmRleDtyZXR1cm4gZi5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZHJvcENyaXRlcmlhIiksby5zLmluZGV4PUMsZi5fcmVtb3ZlQ3JpdGVyaWEobyksZi5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSxmLnMuZHQuZHJhdygpLCExfSl9LGgucHJvdG90eXBlLl9zZXRDbGVhckxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5jbGVhci51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8ucy5pc0NoaWxkPyhvLmRlc3Ryb3koKSxvLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLCExKTooby5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItY2xlYXJDb250ZW50cyIpLCExKX0pfSxoLnByb3RvdHlwZS5fc2V0R3JvdXBMaXN0ZW5lcnM9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztvLmRvbS5hZGQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3JldHVybiBmLnNldHVwTG9naWMoKSxmLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1hZGQiKSwhMX0pLG8uZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItYWRkIikub24oImR0c2ItYWRkLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGYuc2V0dXBMb2dpYygpLGYuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLCExfSksby5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1kZXN0cm95Iikub24oImR0c2ItZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe3JldHVybiBmLl9yZW1vdmVDcml0ZXJpYShvLCEwKSxvLmRvbS5jb250YWluZXIucmVtb3ZlKCksZi5zZXR1cExvZ2ljKCksITF9KSxvLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWRyb3BDcml0ZXJpYSIpLm9uKCJkdHNiLWRyb3BDcml0ZXJpYS5kdHNiIixmdW5jdGlvbigpe3ZhciBDPW8ucy50b0Ryb3A7cmV0dXJuIEMucy5pbmRleD1vLnMuaW5kZXgsQy51cGRhdGVBcnJvd3MoZi5zLmNyaXRlcmlhLmxlbmd0aD4xKSxmLmFkZENyaXRlcmlhKEMpLCExfSksby5zZXRMaXN0ZW5lcnMoKX0saC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLmRvbS5hZGQuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5hZGQiLHRoaXMuYy5pMThuLmFkZCkpLHRoaXMuZG9tLnNlYXJjaC5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnNlYXJjaCIsdGhpcy5jLmkxOG4uc2VhcmNoKSksdGhpcy5kb20ubG9naWMuY2hpbGRyZW4oKS5maXJzdCgpLmh0bWwodGhpcy5jLmxvZ2ljPT09Ik9SIj90aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKTp0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSx0aGlzLnMubG9naWM9dGhpcy5jLmxvZ2ljPT09Ik9SIj8iT1IiOiJBTkQiLHRoaXMuYy5ncmV5c2NhbGUmJnRoaXMuZG9tLmxvZ2ljLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpLHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5sb2dpYykuYXBwZW5kKHRoaXMuZG9tLmNsZWFyKSx0aGlzLnMuaXNDaGlsZCYmdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5sb2dpY0NvbnRhaW5lciksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5hZGQpLHRoaXMuYy5saXZlU2VhcmNofHx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnNlYXJjaCl9LGgucHJvdG90eXBlLl9zZXRMb2dpY0xpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5sb2dpYy51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5fdG9nZ2xlTG9naWMoKSxvLnMuZHQuZHJhdygpO2Zvcih2YXIgZj0wLEM9by5zLmNyaXRlcmlhO2Y8Qy5sZW5ndGg7ZisrKXt2YXIgQj1DW2ZdO0IuY3JpdGVyaWEuc2V0TGlzdGVuZXJzKCl9fSl9LGgucHJvdG90eXBlLl90b2dnbGVMb2dpYz1mdW5jdGlvbigpe3RoaXMucy5sb2dpYz09PSJPUiI/KHRoaXMucy5sb2dpYz0iQU5EIix0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY0FuZCIsdGhpcy5jLmkxOG4ubG9naWNBbmQpKSk6dGhpcy5zLmxvZ2ljPT09IkFORCImJih0aGlzLnMubG9naWM9Ik9SIix0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sb2dpY09yIix0aGlzLmMuaTE4bi5sb2dpY09yKSkpfSxoLnZlcnNpb249IjEuMS4wIixoLmNsYXNzZXM9e2FkZDoiZHRzYi1hZGQiLGJ1dHRvbjoiZHRzYi1idXR0b24iLGNsZWFyR3JvdXA6ImR0c2ItY2xlYXJHcm91cCIsZ3JleXNjYWxlOiJkdHNiLWdyZXlzY2FsZSIsZ3JvdXA6ImR0c2ItZ3JvdXAiLGlucHV0QnV0dG9uOiJkdHNiLWlwdGJ0biIsbG9naWM6ImR0c2ItbG9naWMiLGxvZ2ljQ29udGFpbmVyOiJkdHNiLWxvZ2ljQ29udGFpbmVyIixzZWFyY2g6ImR0c2Itc2VhcmNoIn0saC5kZWZhdWx0cz17Y29sdW1uczohMCxjb25kaXRpb25zOntkYXRlOmEuZGF0ZUNvbmRpdGlvbnMsaHRtbDphLnN0cmluZ0NvbmRpdGlvbnMsImh0bWwtbnVtIjphLm51bUNvbmRpdGlvbnMsImh0bWwtbnVtLWZtdCI6YS5udW1GbXRDb25kaXRpb25zLGx1eG9uOmEubHV4b25EYXRlQ29uZGl0aW9ucyxtb21lbnQ6YS5tb21lbnREYXRlQ29uZGl0aW9ucyxudW06YS5udW1Db25kaXRpb25zLCJudW0tZm10IjphLm51bUZtdENvbmRpdGlvbnMsc3RyaW5nOmEuc3RyaW5nQ29uZGl0aW9uc30sZGVwdGhMaW1pdDohMSxlbnRlclNlYXJjaDohMSxmaWx0ZXJDaGFuZ2VkOnZvaWQgMCxncmV5c2NhbGU6ITEsbGl2ZVNlYXJjaDohMCxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxvZ2ljOiJBTkQiLG9ydGhvZ29uYWw6e2Rpc3BsYXk6ImRpc3BsYXkiLHNlYXJjaDoiZmlsdGVyIn0scHJlRGVmaW5lZDohMX0saH0oKSxtLGc7ZnVuY3Rpb24gVChoKXttPWgsZz1oLmZuLkRhdGFUYWJsZX12YXIgdz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgobyxmKXt2YXIgQz10aGlzO2lmKCFnfHwhZy52ZXJzaW9uQ2hlY2t8fCFnLnZlcnNpb25DaGVjaygiMS4xMC4wIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hCdWlsZGVyIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMCBvciBuZXdlciIpO3ZhciBCPW5ldyBnLkFwaShvKTtpZih0aGlzLmNsYXNzZXM9bS5leHRlbmQoITAse30saC5jbGFzc2VzKSx0aGlzLmM9bS5leHRlbmQoITAse30saC5kZWZhdWx0cyxmKSx0aGlzLmRvbT17Y2xlYXJBbGw6bSgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPicrQi5pMThuKCJzZWFyY2hCdWlsZGVyLmNsZWFyQWxsIix0aGlzLmMuaTE4bi5jbGVhckFsbCkrIjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckFsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNvbnRhaW5lcjptKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSx0aXRsZTptKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGUpLHRpdGxlUm93Om0oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50aXRsZVJvdyksdG9wR3JvdXA6dm9pZCAwfSx0aGlzLnM9e2R0OkIsb3B0czpmLHNlYXJjaDp2b2lkIDAsc2VydmVyRGF0YTp2b2lkIDAsdG9wR3JvdXA6dm9pZCAwfSxCLnNldHRpbmdzKClbMF0uX3NlYXJjaEJ1aWxkZXI9PT12b2lkIDApcmV0dXJuIEIuc2V0dGluZ3MoKVswXS5fc2VhcmNoQnVpbGRlcj10aGlzLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYodGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oYyx6LEcpe3ZhciBldD1DLnMuZHQuc3RhdGUubG9hZGVkKCk7ZXQmJmV0LnNlYXJjaEJ1aWxkZXImJihHLnNlYXJjaEJ1aWxkZXI9Qy5fY29sbGFwc2VBcnJheShldC5zZWFyY2hCdWlsZGVyKSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNiIixmdW5jdGlvbihjLHosRyl7RyYmRy5zZWFyY2hCdWlsZGVyJiZHLnNlYXJjaEJ1aWxkZXIub3B0aW9ucyYmKEMucy5zZXJ2ZXJEYXRhPUcuc2VhcmNoQnVpbGRlci5vcHRpb25zKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zZXRVcCgpOkIub25lKCJpbml0LmR0IixmdW5jdGlvbigpe0MuX3NldFVwKCl9KSx0aGlzfXJldHVybiBoLnByb3RvdHlwZS5nZXREZXRhaWxzPWZ1bmN0aW9uKG8pe3JldHVybiBvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zLnRvcEdyb3VwLmdldERldGFpbHMobyl9LGgucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxoLnByb3RvdHlwZS5yZWJ1aWxkPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLmRvbS5jbGVhckFsbC5jbGljaygpLG89PW51bGw/dGhpczoodGhpcy5zLnRvcEdyb3VwLnMucHJldmVudFJlZHJhdz0hMCx0aGlzLnMudG9wR3JvdXAucmVidWlsZChvKSx0aGlzLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMuX2NoZWNrQ2xlYXIoKSx0aGlzLl91cGRhdGVUaXRsZSh0aGlzLnMudG9wR3JvdXAuY291bnQoKSksdGhpcy5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksdGhpcy5zLmR0LmRyYXcoITEpLHRoaXMucy50b3BHcm91cC5zZXRMaXN0ZW5lcnMoKSx0aGlzKX0saC5wcm90b3R5cGUuX2FwcGx5UHJlRGVmRGVmYXVsdHM9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztvLmNyaXRlcmlhIT09dm9pZCAwJiZvLmxvZ2ljPT09dm9pZCAwJiYoby5sb2dpYz0iQU5EIik7Zm9yKHZhciBDPWZ1bmN0aW9uKGV0KXtldC5jcml0ZXJpYSE9PXZvaWQgMD9ldD1CLl9hcHBseVByZURlZkRlZmF1bHRzKGV0KTpCLnMuZHQuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKEUpe2Yucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1tFXS5zVGl0bGU9PT1ldC5kYXRhJiYoZXQuZGF0YUlkeD1FKX0pfSxCPXRoaXMsYz0wLHo9by5jcml0ZXJpYTtjPHoubGVuZ3RoO2MrKyl7dmFyIEc9eltjXTtDKEcpfXJldHVybiBvfSxoLnByb3RvdHlwZS5fc2V0VXA9ZnVuY3Rpb24obyl7dmFyIGY9dGhpcztpZihvPT09dm9pZCAwJiYobz0hMCksdHlwZW9mIHRoaXMucy5kdC5jb2x1bW4oKS50eXBlIT0iZnVuY3Rpb24iJiZzdC5BcGkucmVnaXN0ZXJQbHVyYWwoImNvbHVtbnMoKS50eXBlcygpIiwiY29sdW1uKCkudHlwZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKF8sUyl7cmV0dXJuIF8uYW9Db2x1bW5zW1NdLnNUeXBlfSwxKX0pLCFnLkRhdGVUaW1lKXt2YXIgQz10aGlzLnMuZHQuY29sdW1ucygpLnR5cGVzKCkudG9BcnJheSgpO2lmKEM9PT12b2lkIDB8fEMuaW5jbHVkZXModm9pZCAwKXx8Qy5pbmNsdWRlcyhudWxsKSl7Qz1bXTtmb3IodmFyIEI9MCxjPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucztCPGMubGVuZ3RoO0IrKyl7dmFyIHo9Y1tCXTtDLnB1c2goei5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMD96LnNlYXJjaEJ1aWxkZXJUeXBlOnouc1R5cGUpfX12YXIgRz10aGlzLnMuZHQuY29sdW1ucygpLnRvQXJyYXkoKTsoQz09PXZvaWQgMHx8Qy5pbmNsdWRlcyh2b2lkIDApfHxDLmluY2x1ZGVzKG51bGwpKSYmKG0uZm4uZGF0YVRhYmxlLmV4dC5vQXBpJiZtLmZuLmRhdGFUYWJsZS5leHQub0FwaS5fZm5Db2x1bW5UeXBlcyh0aGlzLnMuZHQuc2V0dGluZ3MoKVswXSksQz10aGlzLnMuZHQuY29sdW1ucygpLnR5cGVzKCkudG9BcnJheSgpKTtmb3IodmFyIGV0PTA7ZXQ8R1swXS5sZW5ndGg7ZXQrKyl7dmFyIEU9R1swXVtldF0sWj1DW0VdO2lmKCh0aGlzLmMuY29sdW1ucz09PSEwfHxBcnJheS5pc0FycmF5KHRoaXMuYy5jb2x1bW5zKSYmdGhpcy5jLmNvbHVtbnMuaW5jbHVkZXMoZXQpKSYmKFouaW5jbHVkZXMoImRhdGUiKXx8Wi5pbmNsdWRlcygibW9tZW50Iil8fFouaW5jbHVkZXMoImx1eG9uIikpKXRocm93IGFsZXJ0KCJTZWFyY2hCdWlsZGVyIFJlcXVpcmVzIERhdGVUaW1lIHdoZW4gdXNlZCB3aXRoIGRhdGVzLiIpLG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRlVGltZSIpfX1pZih0aGlzLnMudG9wR3JvdXA9bmV3IHYodGhpcy5zLmR0LHRoaXMuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdGhpcy5zLnNlcnZlckRhdGEpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNiIixmdW5jdGlvbihfLFMsTil7Ti5zZWFyY2hCdWlsZGVyPWYuZ2V0RGV0YWlscygpLE4uc2Nyb2xsZXI/Ti5zdGFydD1mLnMuZHQuc3RhdGUoKS5zdGFydDpOLnBhZ2U9Zi5zLmR0LnBhZ2UoKX0pLHRoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c2IiLGZ1bmN0aW9uKF8sUyxOKXtmLnJlYnVpbGQoTi5zZWFyY2hCdWlsZGVyKX0pLHRoaXMuX2J1aWxkKCksdGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oXyxTLE4pe2Yucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYoTi5zZWFyY2hCdWlsZGVyPWYuX2NvbGxhcHNlQXJyYXkoZi5nZXREZXRhaWxzKCEwKSkpfSksdGhpcy5zLmR0Lm9uKGcudmVyc2lvbkNoZWNrKCIyIik/ImNvbHVtbnMtcmVvcmRlcmVkIjoiY29sdW1uLXJlb3JkZXIiLGZ1bmN0aW9uKCl7Zi5yZWJ1aWxkKGYuZ2V0RGV0YWlscygpKX0pLG8pe3ZhciB5PXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKTt5IT09bnVsbCYmeS5zZWFyY2hCdWlsZGVyIT09dm9pZCAwPyh0aGlzLnMudG9wR3JvdXAucmVidWlsZCh5LnNlYXJjaEJ1aWxkZXIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8KHkucGFnZT90aGlzLnMuZHQucGFnZSh5LnBhZ2UpLmRyYXcoInBhZ2UiKTp0aGlzLnMuZHQuc2Nyb2xsZXImJnkuc2Nyb2xsZXImJnRoaXMucy5kdC5zY3JvbGxlcigpLnNjcm9sbFRvUm93KHkuc2Nyb2xsZXIudG9wUm93KSksdGhpcy5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpKTp0aGlzLmMucHJlRGVmaW5lZCE9PSExJiYodGhpcy5jLnByZURlZmluZWQ9dGhpcy5fYXBwbHlQcmVEZWZEZWZhdWx0cyh0aGlzLmMucHJlRGVmaW5lZCksdGhpcy5yZWJ1aWxkKHRoaXMuYy5wcmVEZWZpbmVkKSl9dGhpcy5fc2V0RW1wdHlMaXN0ZW5lcigpLHRoaXMucy5kdC5zdGF0ZS5zYXZlKCl9LGgucHJvdG90eXBlLl9jb2xsYXBzZUFycmF5PWZ1bmN0aW9uKG8pe2lmKG8ubG9naWM9PT12b2lkIDApby52YWx1ZSE9PXZvaWQgMCYmKG8udmFsdWUuc29ydChmdW5jdGlvbihDLEIpe3JldHVybiBpc05hTigrQyl8fChDPStDLEI9K0IpLEM8Qj8tMTpCPEM/MTowfSksby52YWx1ZTE9by52YWx1ZVswXSxvLnZhbHVlMj1vLnZhbHVlWzFdKTtlbHNlIGZvcih2YXIgZj0wO2Y8by5jcml0ZXJpYS5sZW5ndGg7ZisrKW8uY3JpdGVyaWFbZl09dGhpcy5fY29sbGFwc2VBcnJheShvLmNyaXRlcmlhW2ZdKTtyZXR1cm4gb30saC5wcm90b3R5cGUuX3VwZGF0ZVRpdGxlPWZ1bmN0aW9uKG8pe3RoaXMuZG9tLnRpdGxlLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudGl0bGUiLHRoaXMuYy5pMThuLnRpdGxlLG8pKX0saC5wcm90b3R5cGUuX2J1aWxkPWZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmRvbS5jbGVhckFsbC5yZW1vdmUoKSx0aGlzLmRvbS5jb250YWluZXIuZW1wdHkoKTt2YXIgZj10aGlzLnMudG9wR3JvdXAuY291bnQoKTt0aGlzLl91cGRhdGVUaXRsZShmKSx0aGlzLmRvbS50aXRsZVJvdy5hcHBlbmQodGhpcy5kb20udGl0bGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLnRvcEdyb3VwPXRoaXMucy50b3BHcm91cC5nZXROb2RlKCksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS50b3BHcm91cCksdGhpcy5fc2V0UmVkcmF3TGlzdGVuZXIoKTt2YXIgQz10aGlzLnMuZHQudGFibGUoMCkubm9kZSgpO20uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5jbHVkZXModGhpcy5zLnNlYXJjaCl8fCh0aGlzLnMuc2VhcmNoPWZ1bmN0aW9uKEIsYyx6KXtyZXR1cm4gQi5uVGFibGUhPT1DPyEwOm8ucy50b3BHcm91cC5zZWFyY2goYyx6KX0sbS5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKHRoaXMucy5zZWFyY2gpKSx0aGlzLnMuZHQub24oImRlc3Ryb3kuZHRzYiIsZnVuY3Rpb24oKXtvLmRvbS5jb250YWluZXIucmVtb3ZlKCksby5kb20uY2xlYXJBbGwucmVtb3ZlKCk7Zm9yKHZhciBCPW0uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZihvLnMuc2VhcmNoKTtCIT09LTE7KW0uZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guc3BsaWNlKEIsMSksQj1tLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2Yoby5zLnNlYXJjaCk7by5zLmR0Lm9mZigiLmR0c2IiKSxtKG8ucy5kdC50YWJsZSgpLm5vZGUoKSkub2ZmKCIuZHRzYiIpfSl9LGgucHJvdG90eXBlLl9jaGVja0NsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zLnRvcEdyb3VwLnMuY3JpdGVyaWEubGVuZ3RoPjA/KHRoaXMuZG9tLmNsZWFyQWxsLmluc2VydEFmdGVyKHRoaXMuZG9tLnRpdGxlKSx0aGlzLl9zZXRDbGVhckxpc3RlbmVyKCkpOnRoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZSgpfSxoLnByb3RvdHlwZS5fZmlsdGVyQ2hhbmdlZD1mdW5jdGlvbihvKXt2YXIgZj10aGlzLmMuZmlsdGVyQ2hhbmdlZDt0eXBlb2YgZj09ImZ1bmN0aW9uIiYmZihvLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmJ1dHRvbiIsdGhpcy5jLmkxOG4uYnV0dG9uLG8pKX0saC5wcm90b3R5cGUuX3NldENsZWFyTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbz10aGlzO3RoaXMuZG9tLmNsZWFyQWxsLnVuYmluZCgiY2xpY2siKSx0aGlzLmRvbS5jbGVhckFsbC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gby5zLnRvcEdyb3VwPW5ldyB2KG8ucy5kdCxvLmMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG8ucy5zZXJ2ZXJEYXRhKSxvLl9idWlsZCgpLG8ucy5kdC5kcmF3KCksby5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpLG8uZG9tLmNsZWFyQWxsLnJlbW92ZSgpLG8uX3NldEVtcHR5TGlzdGVuZXIoKSxvLl9maWx0ZXJDaGFuZ2VkKDApLCExfSl9LGgucHJvdG90eXBlLl9zZXRSZWRyYXdMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3Q29udGVudHMuZHRzYiIsZnVuY3Rpb24oKXtvLl9jaGVja0NsZWFyKCksby5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksby5zLnRvcEdyb3VwLnNldHVwTG9naWMoKSxvLl9zZXRFbXB0eUxpc3RlbmVyKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKSxvLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8by5zLmR0LmRyYXcoKSxvLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdy5kdHNiIixmdW5jdGlvbigpe28uX2NoZWNrQ2xlYXIoKSxvLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSEwLG8ucy50b3BHcm91cC5yZWRyYXdDb250ZW50cygpLG8ucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITEsby5zLnRvcEdyb3VwLnNldHVwTG9naWMoKSxvLl9zZXRFbXB0eUxpc3RlbmVyKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKX0pLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1yZWRyYXdMb2dpYyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLXJlZHJhd0xvZ2ljLmR0c2IiLGZ1bmN0aW9uKCl7by5zLnRvcEdyb3VwLnJlZHJhd0xvZ2ljKCk7dmFyIGY9by5zLnRvcEdyb3VwLmNvdW50KCk7by5fdXBkYXRlVGl0bGUoZiksby5fZmlsdGVyQ2hhbmdlZChmKX0pLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1hZGQiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1hZGQuZHRzYiIsZnVuY3Rpb24oKXt2YXIgZj1vLnMudG9wR3JvdXAuY291bnQoKTtvLl91cGRhdGVUaXRsZShmKSxvLl9maWx0ZXJDaGFuZ2VkKGYpLG8uX2NoZWNrQ2xlYXIoKX0pLHRoaXMucy5kdC5vbigicG9zdEVkaXQuZHRzYiBwb3N0Q3JlYXRlLmR0c2IgcG9zdFJlbW92ZS5kdHNiIixmdW5jdGlvbigpe28ucy50b3BHcm91cC5yZWRyYXdDb250ZW50cygpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWNsZWFyQ29udGVudHMiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1jbGVhckNvbnRlbnRzLmR0c2IiLGZ1bmN0aW9uKCl7by5fc2V0VXAoITEpLG8uX2ZpbHRlckNoYW5nZWQoMCksby5zLmR0LmRyYXcoKX0pfSxoLnByb3RvdHlwZS5fc2V0RW1wdHlMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5zLnRvcEdyb3VwLmRvbS5hZGQub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7by5fY2hlY2tDbGVhcigpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe28uZG9tLmNsZWFyQWxsLnJlbW92ZSgpfSl9LGgudmVyc2lvbj0iMS43LjAiLGguY2xhc3Nlcz17YnV0dG9uOiJkdHNiLWJ1dHRvbiIsY2xlYXJBbGw6ImR0c2ItY2xlYXJBbGwiLGNvbnRhaW5lcjoiZHRzYi1zZWFyY2hCdWlsZGVyIixpbnB1dEJ1dHRvbjoiZHRzYi1pcHRidG4iLHRpdGxlOiJkdHNiLXRpdGxlIix0aXRsZVJvdzoiZHRzYi10aXRsZVJvdyJ9LGguZGVmYXVsdHM9e2NvbHVtbnM6ITAsY29uZGl0aW9uczp7ZGF0ZTphLmRhdGVDb25kaXRpb25zLGh0bWw6YS5zdHJpbmdDb25kaXRpb25zLCJodG1sLW51bSI6YS5udW1Db25kaXRpb25zLCJodG1sLW51bS1mbXQiOmEubnVtRm10Q29uZGl0aW9ucyxsdXhvbjphLmx1eG9uRGF0ZUNvbmRpdGlvbnMsbW9tZW50OmEubW9tZW50RGF0ZUNvbmRpdGlvbnMsbnVtOmEubnVtQ29uZGl0aW9ucywibnVtLWZtdCI6YS5udW1GbXRDb25kaXRpb25zLHN0cmluZzphLnN0cmluZ0NvbmRpdGlvbnN9LGRlcHRoTGltaXQ6ITEsZW50ZXJTZWFyY2g6ITEsZmlsdGVyQ2hhbmdlZDp2b2lkIDAsZ3JleXNjYWxlOiExLGxpdmVTZWFyY2g6ITAsaTE4bjp7YWRkOiJBZGQgQ29uZGl0aW9uIixidXR0b246ezA6IlNlYXJjaCBCdWlsZGVyIixfOiJTZWFyY2ggQnVpbGRlciAoJWQpIn0sY2xlYXJBbGw6IkNsZWFyIEFsbCIsY29uZGl0aW9uOiJDb25kaXRpb24iLGNvbmRpdGlvbnM6e2FycmF5Ontjb250YWluczoiQ29udGFpbnMiLGVtcHR5OiJFbXB0eSIsZXF1YWxzOiJFcXVhbHMiLG5vdDoiTm90Iixub3RFbXB0eToiTm90IEVtcHR5Iix3aXRob3V0OiJXaXRob3V0In0sZGF0ZTp7YWZ0ZXI6IkFmdGVyIixiZWZvcmU6IkJlZm9yZSIsYmV0d2VlbjoiQmV0d2VlbiIsZW1wdHk6IkVtcHR5IixlcXVhbHM6IkVxdWFscyIsbm90OiJOb3QiLG5vdEJldHdlZW46Ik5vdCBCZXR3ZWVuIixub3RFbXB0eToiTm90IEVtcHR5In0sbnVtYmVyOntiZXR3ZWVuOiJCZXR3ZWVuIixlbXB0eToiRW1wdHkiLGVxdWFsczoiRXF1YWxzIixndDoiR3JlYXRlciBUaGFuIixndGU6IkdyZWF0ZXIgVGhhbiBFcXVhbCBUbyIsbHQ6Ikxlc3MgVGhhbiIsbHRlOiJMZXNzIFRoYW4gRXF1YWwgVG8iLG5vdDoiTm90Iixub3RCZXR3ZWVuOiJOb3QgQmV0d2VlbiIsbm90RW1wdHk6Ik5vdCBFbXB0eSJ9LHN0cmluZzp7Y29udGFpbnM6IkNvbnRhaW5zIixlbXB0eToiRW1wdHkiLGVuZHNXaXRoOiJFbmRzIFdpdGgiLGVxdWFsczoiRXF1YWxzIixub3Q6Ik5vdCIsbm90Q29udGFpbnM6IkRvZXMgTm90IENvbnRhaW4iLG5vdEVtcHR5OiJOb3QgRW1wdHkiLG5vdEVuZHNXaXRoOiJEb2VzIE5vdCBFbmQgV2l0aCIsbm90U3RhcnRzV2l0aDoiRG9lcyBOb3QgU3RhcnQgV2l0aCIsc3RhcnRzV2l0aDoiU3RhcnRzIFdpdGgifX0sZGF0YToiRGF0YSIsZGVsZXRlOiImdGltZXMiLGRlbGV0ZVRpdGxlOiJEZWxldGUgZmlsdGVyaW5nIHJ1bGUiLGxlZnQ6IjwiLGxlZnRUaXRsZToiT3V0ZGVudCBjcml0ZXJpYSIsbG9naWNBbmQ6IkFuZCIsbG9naWNPcjoiT3IiLHJpZ2h0OiI+IixyaWdodFRpdGxlOiJJbmRlbnQgY3JpdGVyaWEiLHNlYXJjaDoiU2VhcmNoIix0aXRsZTp7MDoiQ3VzdG9tIFNlYXJjaCBCdWlsZGVyIixfOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LHZhbHVlOiJWYWx1ZSIsdmFsdWVKb2luZXI6ImFuZCJ9LGxvZ2ljOiJBTkQiLG9ydGhvZ29uYWw6e2Rpc3BsYXk6ImRpc3BsYXkiLHNlYXJjaDoiZmlsdGVyIn0scHJlRGVmaW5lZDohMX0saH0oKTtUKHNyKSxwKHNyKSxzKHNyKTt2YXIgaz1zci5mbi5kYXRhVGFibGU7c3QuU2VhcmNoQnVpbGRlcj13LGsuU2VhcmNoQnVpbGRlcj13LHN0Lkdyb3VwPXYsay5Hcm91cD12LHN0LkNyaXRlcmlhPWEsay5Dcml0ZXJpYT1hO3ZhciBQPXN0LkFwaS5yZWdpc3RlcjtzdC5leHQuc2VhcmNoQnVpbGRlcj17Y29uZGl0aW9uczp7fX0sc3QuZXh0LmJ1dHRvbnMuc2VhcmNoQnVpbGRlcj17YWN0aW9uOmZ1bmN0aW9uKGgsbyxmLEMpe3RoaXMucG9wb3ZlcihDLl9zZWFyY2hCdWlsZGVyLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pO3ZhciBCPUMuX3NlYXJjaEJ1aWxkZXIucy50b3BHcm91cDtCIT09dm9pZCAwJiZCLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cy1ub0RyYXciKSxCLnMuY3JpdGVyaWEubGVuZ3RoPT09MCYmc3IoIi4iK3NyLmZuLmRhdGFUYWJsZS5Hcm91cC5jbGFzc2VzLmFkZC5yZXBsYWNlKC8gL2csIi4iKSkuY2xpY2soKX0sY29uZmlnOnt9LGluaXQ6ZnVuY3Rpb24oaCxvLGYpe3ZhciBDPW5ldyBzdC5TZWFyY2hCdWlsZGVyKGgsc3IuZXh0ZW5kKHtmaWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKEIsYyl7aC5idXR0b24obykudGV4dChjKX19LGYuY29uZmlnKSk7aC5idXR0b24obykudGV4dChmLnRleHR8fGguaTE4bigic2VhcmNoQnVpbGRlci5idXR0b24iLEMuYy5pMThuLmJ1dHRvbiwwKSksZi5fc2VhcmNoQnVpbGRlcj1DfSx0ZXh0Om51bGx9LFAoInNlYXJjaEJ1aWxkZXIuZ2V0RGV0YWlscygpIixmdW5jdGlvbihoKXtoPT09dm9pZCAwJiYoaD0hMSk7dmFyIG89dGhpcy5jb250ZXh0WzBdO3JldHVybiBvLl9zZWFyY2hCdWlsZGVyP28uX3NlYXJjaEJ1aWxkZXIuZ2V0RGV0YWlscyhoKTpudWxsfSksUCgic2VhcmNoQnVpbGRlci5yZWJ1aWxkKCkiLGZ1bmN0aW9uKGgpe3ZhciBvPXRoaXMuY29udGV4dFswXTtyZXR1cm4gby5fc2VhcmNoQnVpbGRlcj09PXZvaWQgMD9udWxsOihvLl9zZWFyY2hCdWlsZGVyLnJlYnVpbGQoaCksdGhpcyl9KSxQKCJzZWFyY2hCdWlsZGVyLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3ZhciBoPXRoaXMuY29udGV4dFswXTtyZXR1cm4gaC5fc2VhcmNoQnVpbGRlcj9oLl9zZWFyY2hCdWlsZGVyLmdldE5vZGUoKTpudWxsfSk7ZnVuY3Rpb24gRihoLG8pe3ZhciBmPW5ldyBzdC5BcGkoaCksQz1vfHxmLmluaXQoKS5zZWFyY2hCdWlsZGVyfHxzdC5kZWZhdWx0cy5zZWFyY2hCdWlsZGVyLEI9bmV3IHcoZixDKSxjPUIuZ2V0Tm9kZSgpO3JldHVybiBjfXNyKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbihoLG8pe2gubmFtZXNwYWNlPT09ImR0IiYmKG8ub0luaXQuc2VhcmNoQnVpbGRlcnx8c3QuZGVmYXVsdHMuc2VhcmNoQnVpbGRlcikmJihvLl9zZWFyY2hCdWlsZGVyfHxGKG8pKX0pLHN0LmV4dC5mZWF0dXJlLnB1c2goe2NGZWF0dXJlOiJRIixmbkluaXQ6Rn0pLHN0LmZlYXR1cmUmJnN0LmZlYXR1cmUucmVnaXN0ZXIoInNlYXJjaEJ1aWxkZXIiLEYpfSkoKTt2YXIgTWw9aWUoYWUoKSwxKTt2YXIgRXM9aWUoYWUoKSwxKTt2YXIgcWU9RXMuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiByKHkpe3Q9eSxlPXkuZm4uZGF0YVRhYmxlfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geShfLFMsTixSLEwpe3ZhciBYPXRoaXM7aWYoTD09PXZvaWQgMCYmKEw9bnVsbCksIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIxLjEwLjAiKSl0aHJvdyBuZXcgRXJyb3IoIlNlYXJjaFBhbmUgcmVxdWlyZXMgRGF0YVRhYmxlcyAxLjEwIG9yIG5ld2VyIik7aWYoIWUuc2VsZWN0KXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBTZWxlY3QiKTt2YXIgaj1uZXcgZS5BcGkoXyk7dGhpcy5jbGFzc2VzPXQuZXh0ZW5kKCEwLHt9LHkuY2xhc3NlcyksdGhpcy5jPXQuZXh0ZW5kKCEwLHt9LHkuZGVmYXVsdHMsUyxMKSxTJiZTLmhpZGVDb3VudCYmUy52aWV3Q291bnQ9PT12b2lkIDAmJih0aGlzLmMudmlld0NvdW50PSF0aGlzLmMuaGlkZUNvdW50KTt2YXIgcT1qLmNvbHVtbnMoKS5lcSgwKS50b0FycmF5KCkubGVuZ3RoO3RoaXMucz17Y29sRXhpc3RzOk48cSxjb2xPcHRzOnZvaWQgMCxjdXN0b21QYW5lU2V0dGluZ3M6TCxkaXNwbGF5ZWQ6ITEsZHQ6aixkdFBhbmU6dm9pZCAwLGZpcnN0U2V0OiEwLGluZGV4Ok4saW5kZXhlczpbXSxsaXN0U2V0OiExLG5hbWU6dm9pZCAwLHJvd0RhdGE6e2FycmF5RmlsdGVyOltdLGFycmF5T3JpZ2luYWw6W10sYmluczp7fSxiaW5zT3JpZ2luYWw6e30sZmlsdGVyTWFwOm5ldyBNYXAsdG90YWxPcHRpb25zOjB9LHNjcm9sbFRvcDowLHNlYXJjaEZ1bmN0aW9uOnZvaWQgMCxzZWxlY3Rpb25zOltdLHNlcnZlclNlbGVjdDpbXSxzZXJ2ZXJTZWxlY3Rpbmc6ITEsdGFibGVMZW5ndGg6bnVsbCx1cGRhdGluZzohMX0sdGhpcy5zLmNvbE9wdHM9dGhpcy5zLmNvbEV4aXN0cz90aGlzLl9nZXRPcHRpb25zKCk6dGhpcy5fZ2V0Qm9udXNPcHRpb25zKCksdGhpcy5kb209e2J1dHRvbkdyb3VwOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b25Hcm91cCksY2xlYXI6dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPiYjMjE1OzwvYnV0dG9uPicpLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVCdXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckJ1dHRvbikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY2xlYXJQYW5lIix0aGlzLmMuaTE4bi5jbGVhclBhbmUpKSxjb2xsYXBzZUJ1dHRvbjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PHNwYW4gY2xhc3M9IicrdGhpcy5jbGFzc2VzLmNhcmV0KyciPiYjeDVlOzwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQnV0dG9uKSxjb250YWluZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbnRhaW5lcikuYWRkQ2xhc3ModGhpcy5zLmNvbE9wdHMuY2xhc3NOYW1lKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubGF5b3V0KyhwYXJzZUludCh0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMV0sMTApPDEwP3RoaXMuYy5sYXlvdXQ6dGhpcy5jLmxheW91dC5zcGxpdCgiLSIpWzBdKyItOSIpKS5hZGRDbGFzcyh0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZT90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZToiIiksY291bnRCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvdW50QnV0dG9uKSxkdFA6dCgnPHRhYmxlIHdpZHRoPSIxMDAlIj48dGhlYWQ+PHRyPjx0aD4nKyh0aGlzLnMuY29sRXhpc3RzP3QodGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmhlYWRlcigpKS50ZXh0KCk6dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXJ8fCJDdXN0b20gUGFuZSIpKyI8L3RoPjx0aC8+PC90cj48L3RoZWFkPjwvdGFibGU+IiksbG93ZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvdzIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pLG5hbWVCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hbWVCdXR0b24pLHBhbmVzQ29udGFpbmVyOnQoUiksc2VhcmNoQm94OnQoIjxpbnB1dC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVJbnB1dEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaCksc2VhcmNoQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3Bhbj48L3NwYW4+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaEljb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKSxzZWFyY2hDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2hDb250KSxzZWFyY2hMYWJlbENvbnQ6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaExhYmVsQ29udCksdG9wUm93OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50b3BSb3cpLHVwcGVyOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zdWJSb3cxKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKX0sdGhpcy5zLmNvbE9wdHMubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY29sT3B0cy5uYW1lOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm5hbWU6dGhpcy5zLm5hbWU9dGhpcy5zLmNvbEV4aXN0cz90KHRoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS5oZWFkZXIoKSkudGV4dCgpOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyfHwiQ3VzdG9tIFBhbmUiO3ZhciBhdD10aGlzLnMuZHQudGFibGUoMCkubm9kZSgpO3JldHVybiB0aGlzLnMuc2VhcmNoRnVuY3Rpb249ZnVuY3Rpb24oSix0dCx5dCl7aWYoWC5zLnNlbGVjdGlvbnMubGVuZ3RoPT09MHx8Si5uVGFibGUhPT1hdClyZXR1cm4hMDt2YXIgVHQ9bnVsbDtyZXR1cm4gWC5zLmNvbEV4aXN0cyYmKFR0PXR0W1gucy5pbmRleF0sWC5zLmNvbE9wdHMub3J0aG9nb25hbC5maWx0ZXIhPT0iZmlsdGVyIiYmKFR0PVgucy5yb3dEYXRhLmZpbHRlck1hcC5nZXQoeXQpLFR0IGluc3RhbmNlb2YgdC5mbi5kYXRhVGFibGUuQXBpJiYoVHQ9VHQudG9BcnJheSgpKSkpLFguX3NlYXJjaChUdCx5dCl9LHQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2gucHVzaCh0aGlzLnMuc2VhcmNoRnVuY3Rpb24pLHRoaXMuYy5jbGVhciYmdGhpcy5kb20uY2xlYXIub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIEo9WC5kb20uY29udGFpbmVyLmZpbmQoIi4iK1guY2xhc3Nlcy5zZWFyY2gucmVwbGFjZSgvXHMrL2csIi4iKSk7Si5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxYLmNsZWFyUGFuZSgpfSksdGhpcy5zLmR0Lm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIFguYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImJ1dHRvbnMtYWN0aW9uLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIFguYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImNvbHVtbi1yZW9yZGVyLmR0c3AiLGZ1bmN0aW9uKEosdHQseXQpe1gucy5pbmRleD15dC5tYXBwaW5nW1gucy5pbmRleF19KSx0aGlzfXJldHVybiB5LnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oXyxTLE4sUixMLFgsail7WHx8KFg9dGhpcy5zLnJvd0RhdGEuYmluc1tTXT90aGlzLnMucm93RGF0YS5iaW5zW1NdOjApLGp8fChqPXRoaXMuX2dldFNob3duKFMpKTtmb3IodmFyIHEsYXQ9MCxKPXRoaXMucy5pbmRleGVzO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTt0dC5maWx0ZXI9PT1TJiYocT10dC5pbmRleCl9cmV0dXJuIHE9PT12b2lkIDAmJihxPXRoaXMucy5pbmRleGVzLmxlbmd0aCx0aGlzLnMuaW5kZXhlcy5wdXNoKHtmaWx0ZXI6UyxpbmRleDpxfSkpLHRoaXMucy5kdFBhbmUucm93LmFkZCh7Y2xhc3NOYW1lOkwsZGlzcGxheTpfIT09IiI/Xzp0aGlzLmVtcHR5TWVzc2FnZSgpLGZpbHRlcjpTLGluZGV4OnEsc2hvd246aixzb3J0Ok4sdG90YWw6WCx0eXBlOlJ9KX0seS5wcm90b3R5cGUuYWRqdXN0VG9wUm93PWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3dzQ29udGFpbmVyLnJlcGxhY2UoL1xzKy9nLCIuIikpLFM9dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3cxLnJlcGxhY2UoL1xzKy9nLCIuIikpLE49dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy5zdWJSb3cyLnJlcGxhY2UoL1xzKy9nLCIuIikpLFI9dGhpcy5kb20uY29udGFpbmVyLmZpbmQoIi4iK3RoaXMuY2xhc3Nlcy50b3BSb3cucmVwbGFjZSgvXHMrL2csIi4iKSk7KHQoX1swXSkud2lkdGgoKTwyNTJ8fHQoUlswXSkud2lkdGgoKTwyNTIpJiZ0KF9bMF0pLndpZHRoKCkhPT0wPyh0KF9bMF0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3cpLHQoU1swXSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1NlYXJjaCksdChOWzBdKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93QnV0dG9uKSk6KHQoX1swXSkucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvdyksdChTWzBdKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKSx0KE5bMF0pLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTdWIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pKX0seS5wcm90b3R5cGUuY2xlYXJEYXRhPWZ1bmN0aW9uKCl7dGhpcy5zLnJvd0RhdGE9e2FycmF5RmlsdGVyOltdLGFycmF5T3JpZ2luYWw6W10sYmluczp7fSxiaW5zT3JpZ2luYWw6e30sZmlsdGVyTWFwOm5ldyBNYXAsdG90YWxPcHRpb25zOjB9fSx5LnByb3RvdHlwZS5jbGVhclBhbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCksdGhpcy51cGRhdGVUYWJsZSgpLHRoaXN9LHkucHJvdG90eXBlLmNvbGxhcHNlPWZ1bmN0aW9uKCl7dmFyIF89dGhpczshdGhpcy5zLmRpc3BsYXllZHx8IXRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMHx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2U9PT0hMXx8KHQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLmRvbS50b3BSb3cuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJvcmRlcmVkKSx0aGlzLmRvbS5uYW1lQnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY291bnRCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5zZWFyY2hCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucm90YXRlZCksdGhpcy5kb20udG9wUm93Lm9uZSgiY2xpY2suZHRzcCIsZnVuY3Rpb24oKXtyZXR1cm4gXy5zaG93KCl9KSx0aGlzLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKSl9LHkucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnMuZHRQYW5lJiZ0aGlzLnMuZHRQYW5lLm9mZigiLmR0c3AiKSx0aGlzLnMuZHQub2ZmKCIuZHRzcCIpLHRoaXMuZG9tLmNsZWFyLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5uYW1lQnV0dG9uLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb3VudEJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5vZmYoIi5kdHNwIiksdCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jb250YWluZXIuZGV0YWNoKCk7Zm9yKHZhciBfPXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZih0aGlzLnMuc2VhcmNoRnVuY3Rpb24pO18hPT0tMTspdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5zcGxpY2UoXywxKSxfPXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZih0aGlzLnMuc2VhcmNoRnVuY3Rpb24pO3RoaXMucy5kdFBhbmUmJnRoaXMucy5kdFBhbmUuZGVzdHJveSgpLHRoaXMucy5saXN0U2V0PSExfSx5LnByb3RvdHlwZS5lbXB0eU1lc3NhZ2U9ZnVuY3Rpb24oKXt2YXIgXz10aGlzLmMuaTE4bi5lbXB0eU1lc3NhZ2U7cmV0dXJuIHRoaXMuYy5lbXB0eU1lc3NhZ2UmJihfPXRoaXMuYy5lbXB0eU1lc3NhZ2UpLHRoaXMucy5jb2xPcHRzLmVtcHR5TWVzc2FnZSE9PSExJiZ0aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UhPT1udWxsJiYoXz10aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UpLHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eU1lc3NhZ2UiLF8pfSx5LnByb3RvdHlwZS5nZXRQYW5lQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0UGFuZT90aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg6MH0seS5wcm90b3R5cGUucmVidWlsZFBhbmU9ZnVuY3Rpb24oXyxTKXtfPT09dm9pZCAwJiYoXz1udWxsKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5jbGVhckRhdGEoKTt2YXIgTj1bXTt0aGlzLnMuc2VydmVyU2VsZWN0PVtdO3ZhciBSPW51bGw7cmV0dXJuIHRoaXMucy5kdFBhbmUmJihTJiYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGU/dGhpcy5zLnNlcnZlclNlbGVjdD10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKTpOPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpKSx0aGlzLnMuZHRQYW5lLmNsZWFyKCkuZGVzdHJveSgpLFI9dGhpcy5kb20uY29udGFpbmVyLnByZXYoKSx0aGlzLmRlc3Ryb3koKSx0aGlzLnMuZHRQYW5lPXZvaWQgMCx0LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaEZ1bmN0aW9uKSksdGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITEsdGhpcy5fYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJTZWxlY3Q6TixfLFIpLHRoaXN9LHkucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihfKXt0aGlzLmMubGF5b3V0PV8sdGhpcy5kb20uY29udGFpbmVyLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNob3cpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLmFkZENsYXNzKHRoaXMucy5jb2xPcHRzLmNsYXNzTmFtZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxheW91dCsocGFyc2VJbnQoXy5zcGxpdCgiLSIpWzFdLDEwKTwxMD9fOl8uc3BsaXQoIi0iKVswXSsiLTkiKSkuYWRkQ2xhc3ModGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyE9PW51bGwmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lOiIiKSx0aGlzLmFkanVzdFRvcFJvdygpfSx5LnByb3RvdHlwZS5zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgXz10aGlzO3RoaXMucy5kdFBhbmUmJih0aGlzLnMuZHRQYW5lLm9mZigic2VsZWN0LmR0c3AiKS5vbigic2VsZWN0LmR0c3AiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KF8ucy5kZXNlbGVjdFRpbWVvdXQpLF8uX3VwZGF0ZVNlbGVjdGlvbighXy5zLnVwZGF0aW5nKSxfLmRvbS5jbGVhci5yZW1vdmVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIil9KSx0aGlzLnMuZHRQYW5lLm9mZigiZGVzZWxlY3QuZHRzcCIpLm9uKCJkZXNlbGVjdC5kdHNwIixmdW5jdGlvbigpe18ucy5kZXNlbGVjdFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe18uX3VwZGF0ZVNlbGVjdGlvbighMCksXy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoPT09MCYmXy5kb20uY2xlYXIuYWRkQ2xhc3MoXy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKX0sNTApfSksdGhpcy5zLmZpcnN0U2V0JiYodGhpcy5zLmZpcnN0U2V0PSExLHRoaXMucy5kdC5vbigic3RhdGVTYXZlUGFyYW1zLmR0c3AiLGZ1bmN0aW9uKFMsTixSKXtpZih0LmlzRW1wdHlPYmplY3QoUikpe18ucy5kdFBhbmUuc3RhdGUuY2xlYXIoKTtyZXR1cm59dmFyIEwsWCxqPVtdLHEsYXQsSjtfLnMuZHRQYW5lJiYoaj1fLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLm1hcChmdW5jdGlvbih5dCl7cmV0dXJuIHl0LmZpbHRlciE9PW51bGw/eXQuZmlsdGVyLnRvU3RyaW5nKCk6bnVsbH0pLnRvQXJyYXkoKSxhdD1fLmRvbS5zZWFyY2hCb3gudmFsKCksWD1fLnMuZHRQYW5lLm9yZGVyKCksTD1fLnMucm93RGF0YS5iaW5zT3JpZ2luYWwsSj1fLnMucm93RGF0YS5hcnJheU9yaWdpbmFsLHE9Xy5kb20uY29sbGFwc2VCdXR0b24uaGFzQ2xhc3MoXy5jbGFzc2VzLnJvdGF0ZWQpKSxSLnNlYXJjaFBhbmVzPT09dm9pZCAwJiYoUi5zZWFyY2hQYW5lcz17fSksUi5zZWFyY2hQYW5lcy5wYW5lcz09PXZvaWQgMCYmKFIuc2VhcmNoUGFuZXMucGFuZXM9W10pO2Zvcih2YXIgdHQ9MDt0dDxSLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDt0dCsrKVIuc2VhcmNoUGFuZXMucGFuZXNbdHRdLmlkPT09Xy5zLmluZGV4JiYoUi5zZWFyY2hQYW5lcy5wYW5lcy5zcGxpY2UodHQsMSksdHQtLSk7Ui5zZWFyY2hQYW5lcy5wYW5lcy5wdXNoKHthcnJheUZpbHRlcjpKLGJpbnM6TCxjb2xsYXBzZWQ6cSxpZDpfLnMuaW5kZXgsb3JkZXI6WCxzZWFyY2hUZXJtOmF0LHNlbGVjdGVkOmp9KX0pKSx0aGlzLnMuZHRQYW5lLm9mZigidXNlci1zZWxlY3QuZHRzcCIpLm9uKCJ1c2VyLXNlbGVjdC5kdHNwIixmdW5jdGlvbihTLE4sUixMLFgpe1guc3RvcFByb3BhZ2F0aW9uKCl9KSx0aGlzLnMuZHRQYW5lLm9mZigiZHJhdy5kdHNwIikub24oImRyYXcuZHRzcCIsZnVuY3Rpb24oKXtyZXR1cm4gXy5hZGp1c3RUb3BSb3coKX0pLHRoaXMuZG9tLm5hbWVCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9Xy5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO18ucy5kdFBhbmUub3JkZXIoWzAsUz09PSJhc2MiPyJkZXNjIjoiYXNjIl0pLmRyYXcoKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9Xy5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO18ucy5kdFBhbmUub3JkZXIoWzEsUz09PSJhc2MiPyJkZXNjIjoiYXNjIl0pLmRyYXcoKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKFMpe1Muc3RvcFByb3BhZ2F0aW9uKCk7dmFyIE49dChfLnMuZHRQYW5lLnRhYmxlKCkuY29udGFpbmVyKCkpO04udG9nZ2xlQ2xhc3MoXy5jbGFzc2VzLmhpZGRlbiksXy5kb20udG9wUm93LnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5ib3JkZXJlZCksXy5kb20ubmFtZUJ1dHRvbi50b2dnbGVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLF8uZG9tLmNvdW50QnV0dG9uLnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksXy5kb20uc2VhcmNoQnV0dG9uLnRvZ2dsZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksXy5kb20uY29sbGFwc2VCdXR0b24udG9nZ2xlQ2xhc3MoXy5jbGFzc2VzLnJvdGF0ZWQpLE4uaGFzQ2xhc3MoXy5jbGFzc2VzLmhpZGRlbik/Xy5kb20udG9wUm93Lm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3JldHVybiBfLmRvbS5jb2xsYXBzZUJ1dHRvbi5jbGljaygpfSk6Xy5kb20udG9wUm93Lm9mZigiY2xpY2suZHRzcCIpLF8ucy5kdC5zdGF0ZS5zYXZlKCksXy5kb20udG9wUm93LnRyaWdnZXIoImNvbGxhcHNlLmR0c3BzIil9KSx0aGlzLmRvbS5jbGVhci5vZmYoImNsaWNrLmR0c3AiKS5vbigiY2xpY2suZHRzcCIsZnVuY3Rpb24oKXt2YXIgUz1fLmRvbS5jb250YWluZXIuZmluZCgiLiIrXy5jbGFzc2VzLnNlYXJjaC5yZXBsYWNlKC8gL2csIi4iKSk7Uy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxfLmNsZWFyUGFuZSgpfSksdGhpcy5kb20uc2VhcmNoQnV0dG9uLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3JldHVybiBfLmRvbS5zZWFyY2hCb3guZm9jdXMoKX0pLHRoaXMuZG9tLnNlYXJjaEJveC5vZmYoImNsaWNrLmR0c3AiKS5vbigiaW5wdXQuZHRzcCIsZnVuY3Rpb24oKXt2YXIgUz1fLmRvbS5zZWFyY2hCb3gudmFsKCk7Xy5zLmR0UGFuZS5zZWFyY2goUykuZHJhdygpLHR5cGVvZiBTPT0ic3RyaW5nIiYmKFMubGVuZ3RoPjB8fFMubGVuZ3RoPT09MCYmXy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoPjApP18uZG9tLmNsZWFyLnJlbW92ZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTpfLmRvbS5jbGVhci5hZGRDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLF8ucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLnMuZHRQYW5lLnNlbGVjdC5zdHlsZSh0aGlzLnMuY29sT3B0cy5kdE9wdHMmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWxlY3QmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWxlY3Quc3R5bGU/dGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdC5zdHlsZTp0aGlzLmMuZHRPcHRzJiZ0aGlzLmMuZHRPcHRzLnNlbGVjdCYmdGhpcy5jLmR0T3B0cy5zZWxlY3Quc3R5bGU/dGhpcy5jLmR0T3B0cy5zZWxlY3Quc3R5bGU6Im9zIikpfSx5LnByb3RvdHlwZS5fc2VydmVyUG9wdWxhdGU9ZnVuY3Rpb24oXyl7Xy50YWJsZUxlbmd0aD8odGhpcy5zLnRhYmxlTGVuZ3RoPV8udGFibGVMZW5ndGgsdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPXRoaXMucy50YWJsZUxlbmd0aCk6KHRoaXMucy50YWJsZUxlbmd0aD09PW51bGx8fHRoaXMucy5kdC5yb3dzKClbMF0ubGVuZ3RoPnRoaXMucy50YWJsZUxlbmd0aCkmJih0aGlzLnMudGFibGVMZW5ndGg9dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgsdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPXRoaXMucy50YWJsZUxlbmd0aCk7dmFyIFM9dGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmRhdGFTcmMoKTtpZihfLnNlYXJjaFBhbmVzLm9wdGlvbnNbU10pZm9yKHZhciBOPTAsUj1fLnNlYXJjaFBhbmVzLm9wdGlvbnNbU107TjxSLmxlbmd0aDtOKyspe3ZhciBMPVJbTl07dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIucHVzaCh7ZGlzcGxheTpMLmxhYmVsLGZpbHRlcjpMLnZhbHVlLHNvcnQ6TC5sYWJlbCx0eXBlOkwubGFiZWx9KSx0aGlzLnMucm93RGF0YS5iaW5zW0wudmFsdWVdPUwudG90YWx9dmFyIFg9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLGo9dGhpcy5fdW5pcXVlUmF0aW8oWCx0aGlzLnMudGFibGVMZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP2o+dGhpcy5jLnRocmVzaG9sZDpqPnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZCl8fHRoaXMucy5jb2xPcHRzLnNob3chPT0hMCYmWDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn10aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zLHRoaXMucy5kaXNwbGF5ZWQ9ITB9LHkucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLnMuZGlzcGxheWVkJiYodGhpcy5kb20udG9wUm93LnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5ib3JkZXJlZCksdGhpcy5kb20ubmFtZUJ1dHRvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLHRoaXMuZG9tLmNvdW50QnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLnJvdGF0ZWQpLHQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKSl9LHkucHJvdG90eXBlLl91bmlxdWVSYXRpbz1mdW5jdGlvbihfLFMpe3JldHVybiBTPjAmJih0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM+MCYmIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLnRhYmxlTGVuZ3RoPjApP18vdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zOjF9LHkucHJvdG90eXBlLnVwZGF0ZVRhYmxlPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBTLmZpbHRlcn0pO3RoaXMucy5zZWxlY3Rpb25zPV8sdGhpcy5fc2VhcmNoRXh0cmFzKCl9LHkucHJvdG90eXBlLl9nZXRDb21wYXJpc29uUm93cz1mdW5jdGlvbigpe3ZhciBfPXRoaXMucy5jb2xPcHRzLm9wdGlvbnM/dGhpcy5zLmNvbE9wdHMub3B0aW9uczp0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM/dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zOnZvaWQgMDtpZihfIT09dm9pZCAwKXt2YXIgUz10aGlzLnMuZHQucm93cygpLE49Uy5kYXRhKCkudG9BcnJheSgpLFI9W107dGhpcy5zLmR0UGFuZS5jbGVhcigpLHRoaXMucy5pbmRleGVzPVtdO2Zvcih2YXIgTD0wLFg9XztMPFgubGVuZ3RoO0wrKyl7dmFyIGo9WFtMXSxxPWoubGFiZWwhPT0iIj9qLmxhYmVsOnRoaXMuZW1wdHlNZXNzYWdlKCksYXQ9e2NsYXNzTmFtZTpqLmNsYXNzTmFtZSxkaXNwbGF5OnEsZmlsdGVyOnR5cGVvZiBqLnZhbHVlPT0iZnVuY3Rpb24iP2oudmFsdWU6W10sc29ydDpqLm9yZGVyIT09dm9pZCAwP2oub3JkZXI6cSx0b3RhbDowLHR5cGU6cX07aWYodHlwZW9mIGoudmFsdWU9PSJmdW5jdGlvbiIpe2Zvcih2YXIgSj0wO0o8Ti5sZW5ndGg7SisrKWoudmFsdWUuY2FsbCh0aGlzLnMuZHQsTltKXSxTWzBdW0pdKSYmYXQudG90YWwrKzt0eXBlb2YgYXQuZmlsdGVyIT0iZnVuY3Rpb24iJiZhdC5maWx0ZXIucHVzaChqLmZpbHRlcil9Ui5wdXNoKHRoaXMuYWRkUm93KGF0LmRpc3BsYXksYXQuZmlsdGVyLGF0LnNvcnQsYXQudHlwZSxhdC5jbGFzc05hbWUsYXQudG90YWwpKX1yZXR1cm4gUn19LHkucHJvdG90eXBlLl9nZXRNZXNzYWdlPWZ1bmN0aW9uKF8pe3JldHVybiB0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KS5yZXBsYWNlKC97dG90YWx9L2csXy50b3RhbCl9LHkucHJvdG90eXBlLl9nZXRTaG93bj1mdW5jdGlvbihfKXt9LHkucHJvdG90eXBlLl9nZXRQYW5lQ29uZmlnPWZ1bmN0aW9uKCl7dmFyIF89dGhpcyxTPWUuU2Nyb2xsZXIsTj10aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vTGFuZ3VhZ2U7cmV0dXJuIE4udXJsPXZvaWQgMCxOLnNVcmw9dm9pZCAwLHtjb2x1bW5EZWZzOlt7Y2xhc3NOYW1lOiJkdHNwLW5hbWVDb2x1bW4iLGRhdGE6ImRpc3BsYXkiLHJlbmRlcjpmdW5jdGlvbihSLEwsWCl7aWYoTD09PSJzb3J0IilyZXR1cm4gWC5zb3J0O2lmKEw9PT0idHlwZSIpcmV0dXJuIFgudHlwZTt2YXIgaj1fLl9nZXRNZXNzYWdlKFgpLHE9JzxzcGFuIGNsYXNzPSInK18uY2xhc3Nlcy5waWxsKyciPicraisiPC9zcGFuPiI7cmV0dXJuKCFfLmMudmlld0NvdW50fHwhXy5zLmNvbE9wdHMudmlld0NvdW50KSYmKHE9IiIpLEw9PT0iZmlsdGVyIj90eXBlb2YgUj09InN0cmluZyImJlIubWF0Y2goLzxbXj5dKj4vKSE9PW51bGw/Ui5yZXBsYWNlKC88W14+XSo+L2csIiIpOlI6JzxkaXYgY2xhc3M9IicrXy5jbGFzc2VzLm5hbWVDb250KyciPjxzcGFuIHRpdGxlPSInKyh0eXBlb2YgUj09InN0cmluZyImJlIubWF0Y2goLzxbXj5dKj4vKSE9PW51bGw/Ui5yZXBsYWNlKC88W14+XSo+L2csIiIpOlIpKyciIGNsYXNzPSInK18uY2xhc3Nlcy5uYW1lKyciPicrUisiPC9zcGFuPiIrcSsiPC9kaXY+In0sdGFyZ2V0czowLHR5cGU6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0/dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uX3NNYW51YWxUeXBlOm51bGx9LHtjbGFzc05hbWU6ImR0c3AtY291bnRDb2x1bW4gIit0aGlzLmNsYXNzZXMuYmFkZ2VQaWxsLGRhdGE6InRvdGFsIixzZWFyY2hhYmxlOiExLHRhcmdldHM6MSx2aXNpYmxlOiExfV0sZGVmZXJSZW5kZXI6ITAsaW5mbzohMSxsYW5ndWFnZTpOLHBhZ2luZzohIVMsc2Nyb2xsWDohMSxzY3JvbGxZOiIyMDBweCIsc2Nyb2xsZXI6ISFTLHNlbGVjdDohMCxzdGF0ZVNhdmU6ISF0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vRmVhdHVyZXMuYlN0YXRlU2F2ZX19LHkucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUYWJsZSgpLHRoaXMucy51cGRhdGluZz0hMCx0aGlzLnMuZHQuZHJhdygpLHRoaXMucy51cGRhdGluZz0hMX0seS5wcm90b3R5cGUuX3BvcHVsYXRlUGFuZUFycmF5PWZ1bmN0aW9uKF8sUyxOLFIpe1I9PT12b2lkIDAmJihSPXRoaXMucy5yb3dEYXRhLmJpbnMpO3ZhciBMPU4uZmFzdERhdGE7aWYodHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciKXt2YXIgWD1MKF8sdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwpO3RoaXMucy5yb3dEYXRhLmZpbHRlck1hcC5zZXQoXyxYKSx0aGlzLl9hZGRPcHRpb24oWCxYLFgsWCxTLFIpLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrfWVsc2V7dmFyIGo9TChfLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnNlYXJjaCk7aj09PW51bGwmJihqPSIiKSx0eXBlb2Ygaj09InN0cmluZyImJihqPWoucmVwbGFjZSgvPFtePl0qPi9nLCIiKSksdGhpcy5zLnJvd0RhdGEuZmlsdGVyTWFwLnNldChfLGopLFJbal0/KFJbal0rKyx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKyk6KFJbal09MSx0aGlzLl9hZGRPcHRpb24oaixMKF8sdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuZGlzcGxheSksTChfLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnNvcnQpLEwoXyx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC50eXBlKSxTLFIpLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKX19LHkucHJvdG90eXBlLl9yZWxvYWRTZWxlY3Q9ZnVuY3Rpb24oXyl7aWYoXyE9PXZvaWQgMCl7Zm9yKHZhciBTLE49MDtOPF8uc2VhcmNoUGFuZXMucGFuZXMubGVuZ3RoO04rKylpZihfLnNlYXJjaFBhbmVzLnBhbmVzW05dLmlkPT09dGhpcy5zLmluZGV4KXtTPU47YnJlYWt9aWYoUylmb3IodmFyIFI9dGhpcy5zLmR0UGFuZSxMPVIucm93cyh7b3JkZXI6ImluZGV4In0pLmRhdGEoKS5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEouZmlsdGVyIT09bnVsbD9KLmZpbHRlci50b1N0cmluZygpOm51bGx9KS50b0FycmF5KCksWD0wLGo9Xy5zZWFyY2hQYW5lcy5wYW5lc1tTXS5zZWxlY3RlZDtYPGoubGVuZ3RoO1grKyl7dmFyIHE9altYXSxhdD0tMTtxIT09bnVsbCYmKGF0PUwuaW5kZXhPZihxLnRvU3RyaW5nKCkpKSxhdD4tMSYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsUi5yb3coYXQpLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpfX19LHkucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oXyl7dmFyIFM9dGhpcyxOPWZ1bmN0aW9uKEwpe2lmKHN0LnZlcnNpb25DaGVjaygiMiIpKVMucy5kdC5wcm9jZXNzaW5nKEwpO2Vsc2V7dmFyIFg9Uy5zLmR0LnNldHRpbmdzKClbMF0saj1YLm9BcGk7ai5fZm5Qcm9jZXNzaW5nRGlzcGxheShYLCExKX19LFI9ZnVuY3Rpb24oKXtTLnMuc2Nyb2xsVG9wPXQoUy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKSkucGFyZW50KClbMF0uc2Nyb2xsVG9wLFMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYhUy5zLnVwZGF0aW5nP1Mucy5zZXJ2ZXJTZWxlY3Rpbmd8fChTLnMuc2VydmVyU2VsZWN0PVMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLFMucy5kdC5kcmF3KCExKSk6XyYmUy5fbWFrZVNlbGVjdGlvbigpLE4oITEpfTtOKCEwKSxzZXRUaW1lb3V0KFIsMSl9LHkucHJvdG90eXBlLl9hZGRPcHRpb249ZnVuY3Rpb24oXyxTLE4sUixMLFgpe2lmKEFycmF5LmlzQXJyYXkoXyl8fF8gaW5zdGFuY2VvZiBlLkFwaSl7aWYoXyBpbnN0YW5jZW9mIGUuQXBpJiYoXz1fLnRvQXJyYXkoKSxTPVMudG9BcnJheSgpKSxfLmxlbmd0aD09PVMubGVuZ3RoKXtmb3IodmFyIGo9MDtqPF8ubGVuZ3RoO2orKylYW19bal1dP1hbX1tqXV0rKzooWFtfW2pdXT0xLEwucHVzaCh7ZGlzcGxheTpTW2pdLGZpbHRlcjpfW2pdLHNvcnQ6TltqXSx0eXBlOlJbal19KSksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKys7cmV0dXJufXRocm93IG5ldyBFcnJvcigiZGlzcGxheSBhbmQgZmlsdGVyIG5vdCB0aGUgc2FtZSBsZW5ndGgiKX1lbHNlIHR5cGVvZiB0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsPT0ic3RyaW5nIj9YW19dPyhYW19dKyssdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspOihYW19dPTEsTC5wdXNoKHtkaXNwbGF5OlMsZmlsdGVyOl8sc29ydDpOLHR5cGU6Un0pLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKTpMLnB1c2goe2Rpc3BsYXk6UyxmaWx0ZXI6Xyxzb3J0Ok4sdHlwZTpSfSl9LHkucHJvdG90eXBlLl9idWlsZFBhbmU9ZnVuY3Rpb24oXyxTLE4pe3ZhciBSPXRoaXM7Xz09PXZvaWQgMCYmKF89W10pLFM9PT12b2lkIDAmJihTPW51bGwpLE49PT12b2lkIDAmJihOPW51bGwpLHRoaXMucy5zZWxlY3Rpb25zPVtdO3ZhciBMPXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKSxYO2lmKHRoaXMucy5saXN0U2V0JiYoTD10aGlzLnMuZHQuc3RhdGUoKSksdGhpcy5zLmNvbEV4aXN0cyl7dmFyIGo9LTE7aWYoTCYmTC5zZWFyY2hQYW5lcyYmTC5zZWFyY2hQYW5lcy5wYW5lcyl7Zm9yKHZhciBxPTA7cTxMLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDtxKyspaWYoTC5zZWFyY2hQYW5lcy5wYW5lc1txXS5pZD09PXRoaXMucy5pbmRleCl7aj1xO2JyZWFrfX1pZigodGhpcy5zLmNvbE9wdHMuc2hvdz09PSExfHx0aGlzLnMuY29sT3B0cy5zaG93IT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy5zaG93IT09ITApJiZqPT09LTEpcmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExLCExO2lmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09ITB8fGohPT0tMSkmJih0aGlzLnMuZGlzcGxheWVkPSEwKSwhdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJighU3x8IVMuc2VhcmNoUGFuZXN8fCFTLnNlYXJjaFBhbmVzLm9wdGlvbnMpKXt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5sZW5ndGg9PT0wJiYodGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zPTAsdGhpcy5fcG9wdWxhdGVQYW5lKCksdGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcix0aGlzLnMucm93RGF0YS5iaW5zT3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYmlucyk7dmFyIGF0PU9iamVjdC5rZXlzKHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbCkubGVuZ3RoLEo9dGhpcy5fdW5pcXVlUmF0aW8oYXQsdGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP0o+dGhpcy5jLnRocmVzaG9sZDpKPnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZCl8fHRoaXMucy5jb2xPcHRzLnNob3chPT0hMCYmYXQ8PTEpKXt0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5zLmRpc3BsYXllZD0hMTtyZXR1cm59dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zaG93KSx0aGlzLnMuZGlzcGxheWVkPSEwfWVsc2UgUyYmUy5zZWFyY2hQYW5lcyYmUy5zZWFyY2hQYW5lcy5vcHRpb25zJiZ0aGlzLl9zZXJ2ZXJQb3B1bGF0ZShTKX1lbHNlIHRoaXMucy5kaXNwbGF5ZWQ9ITA7dGhpcy5fZGlzcGxheVBhbmUoKSx0aGlzLnMubGlzdFNldHx8dGhpcy5kb20uZHRQLm9uKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcCIsZnVuY3Rpb24ocHQsbXQscnQpe3QuaXNFbXB0eU9iamVjdChSLnMuZHQuc3RhdGUubG9hZGVkKCkpJiZ0LmVhY2gocnQsZnVuY3Rpb24oZ3Qpe2RlbGV0ZSBydFtndF19KX0pLE4hPT1udWxsJiZ0aGlzLmRvbS5wYW5lc0NvbnRhaW5lci5oYXMoTikubGVuZ3RoPjA/dGhpcy5kb20uY29udGFpbmVyLmluc2VydEFmdGVyKE4pOnRoaXMuZG9tLnBhbmVzQ29udGFpbmVyLnByZXBlbmQodGhpcy5kb20uY29udGFpbmVyKTt2YXIgdHQ9dC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU7dC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU9Im5vbmUiLHRoaXMuZG9tLmR0UC5vbigiaW5pdC5kdCIsZnVuY3Rpb24ocHQsbXQpe3ZhciBydD1SLmRvbS5kdFAuRGF0YVRhYmxlKCksZ3Q9cnQuc2VsZWN0LnN0eWxlKCk7cnQuc2VsZWN0LnN0eWxlKGd0KX0pLHRoaXMucy5kdFBhbmU9dGhpcy5kb20uZHRQLkRhdGFUYWJsZSh0LmV4dGVuZCghMCx0aGlzLl9nZXRQYW5lQ29uZmlnKCksdGhpcy5jLmR0T3B0cyx0aGlzLnMuY29sT3B0cz90aGlzLnMuY29sT3B0cy5kdE9wdHM6e30sdGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8IXRoaXMucy5jb2xFeGlzdHM/e2NyZWF0ZWRSb3c6ZnVuY3Rpb24ocHQsbXQpe3QocHQpLmFkZENsYXNzKG10LmNsYXNzTmFtZSl9fTp2b2lkIDAsdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyE9PW51bGwmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzOnt9LHQuZm4uZGF0YVRhYmxlLnZlcnNpb25DaGVjaygiMiIpP3tsYXlvdXQ6e2JvdHRvbVN0YXJ0Om51bGwsYm90dG9tRW5kOm51bGwsdG9wU3RhcnQ6bnVsbCx0b3BFbmQ6bnVsbH19Ontkb206InQifSkpLHRoaXMuZG9tLmR0UC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGFibGUpO3ZhciB5dD0iQ3VzdG9tIFBhbmUiO2lmKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyP3l0PXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuaGVhZGVyOnRoaXMucy5jb2xPcHRzLmhlYWRlcj95dD10aGlzLnMuY29sT3B0cy5oZWFkZXI6dGhpcy5zLmNvbEV4aXN0cyYmKHl0PXQuZm4uZGF0YVRhYmxlLnZlcnNpb25DaGVjaygiMiIpP3RoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS50aXRsZSgpOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdLnNUaXRsZSkseXQ9dGhpcy5fZXNjYXBlSFRNTCh5dCksdGhpcy5kb20uc2VhcmNoQm94LmF0dHIoInBsYWNlaG9sZGVyIix5dCksdC5mbi5kYXRhVGFibGUuZXh0LmVyck1vZGU9dHQsdGhpcy5zLmNvbEV4aXN0cylmb3IodmFyIFR0PTAsQXQ9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIubGVuZ3RoO1R0PEF0O1R0KyspaWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe1g9dGhpcy5hZGRSb3codGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmRpc3BsYXksdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmZpbHRlcix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltUdF0uc29ydCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltUdF0udHlwZSk7Zm9yKHZhciBrdD0wLEx0PXRoaXMucy5zZXJ2ZXJTZWxlY3Q7a3Q8THQubGVuZ3RoO2t0Kyspe3ZhciBCdD1MdFtrdF07QnQuZmlsdGVyPT09dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLmZpbHRlciYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsWC5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExKX19ZWxzZSF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdP3RoaXMuYWRkUm93KHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1R0XS5kaXNwbGF5LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1R0XS5maWx0ZXIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLnNvcnQsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbVHRdLnR5cGUpOnRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLmFkZFJvdygiIiwiIiwiIiwiIik7KHRoaXMucy5jb2xPcHRzLm9wdGlvbnN8fHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucykmJnRoaXMuX2dldENvbXBhcmlzb25Sb3dzKCksdGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wLHRoaXMuYWRqdXN0VG9wUm93KCksdGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLnMubGlzdFNldD0hMDtmb3IodmFyICR0PTAsS3Q9XzskdDxLdC5sZW5ndGg7JHQrKyl7dmFyIEQ9S3RbJHRdO2lmKEQpZm9yKHZhciB1dD0wLG90PXRoaXMucy5kdFBhbmUucm93cygpLmluZGV4ZXMoKS50b0FycmF5KCk7dXQ8b3QubGVuZ3RoO3V0KyspWD1vdFt1dF0sdGhpcy5zLmR0UGFuZS5yb3coWCkuZGF0YSgpJiZELmZpbHRlcj09PXRoaXMucy5kdFBhbmUucm93KFgpLmRhdGEoKS5maWx0ZXImJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT8odGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCx0aGlzLnMuZHRQYW5lLnJvdyhYKS5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExKTp0aGlzLnMuZHRQYW5lLnJvdyhYKS5zZWxlY3QoKSl9aWYodGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJnRoaXMucy5kdFBhbmUuc2VhcmNoKHRoaXMuZG9tLnNlYXJjaEJveC52YWwoKSkuZHJhdygpLCh0aGlzLmMuaW5pdENvbGxhcHNlZCYmdGhpcy5zLmNvbE9wdHMuaW5pdENvbGxhcHNlZCE9PSExfHx0aGlzLnMuY29sT3B0cy5pbml0Q29sbGFwc2VkKSYmKHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMXx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2UpJiYodGhpcy5zLmR0UGFuZS5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP3RoaXMuY29sbGFwc2UoKTp0aGlzLnMuZHRQYW5lLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXtyZXR1cm4gUi5jb2xsYXBzZSgpfSkpLEwmJkwuc2VhcmNoUGFuZXMmJkwuc2VhcmNoUGFuZXMucGFuZXMmJighU3x8Uy5kcmF3PT09MSkpe3RoaXMuX3JlbG9hZFNlbGVjdChMKTtmb3IodmFyIEg9MCxNPUwuc2VhcmNoUGFuZXMucGFuZXM7SDxNLmxlbmd0aDtIKyspe3ZhciBZPU1bSF07WS5pZD09PXRoaXMucy5pbmRleCYmKFkuc2VhcmNoVGVybSYmWS5zZWFyY2hUZXJtLmxlbmd0aD4wJiZ0aGlzLmRvbS5zZWFyY2hCb3gudmFsKFkuc2VhcmNoVGVybSkudHJpZ2dlcigiaW5wdXQiKSxZLm9yZGVyJiZ0aGlzLnMuZHRQYW5lLm9yZGVyKFkub3JkZXIpLmRyYXcoKSxZLmNvbGxhcHNlZD90aGlzLmNvbGxhcHNlKCk6dGhpcy5zaG93KCkpfX1yZXR1cm4hMH0seS5wcm90b3R5cGUuX2Rpc3BsYXlQYW5lPWZ1bmN0aW9uKCl7dGhpcy5kb20uZHRQLmVtcHR5KCksdGhpcy5kb20udG9wUm93LmVtcHR5KCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcFJvdykscGFyc2VJbnQodGhpcy5jLmxheW91dC5zcGxpdCgiLSIpWzFdLDEwKT4zJiZ0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNtYWxsR2FwKSx0aGlzLmRvbS50b3BSb3cuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvd3NDb250YWluZXIpLmFwcGVuZCh0aGlzLmRvbS51cHBlci5hcHBlbmQodGhpcy5kb20uc2VhcmNoQ29udCkpLmFwcGVuZCh0aGlzLmRvbS5sb3dlci5hcHBlbmQodGhpcy5kb20uYnV0dG9uR3JvdXApKSwodGhpcy5jLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmNvbE9wdHMuZHRPcHRzJiZ0aGlzLnMuY29sT3B0cy5kdE9wdHMuc2VhcmNoaW5nPT09ITF8fCF0aGlzLmMuY29udHJvbHN8fCF0aGlzLnMuY29sT3B0cy5jb250cm9sc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZyE9PXZvaWQgMCYmIXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZykmJnRoaXMuZG9tLnNlYXJjaEJveC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUlucHV0QnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLHRoaXMuZG9tLnNlYXJjaEJveC5hcHBlbmRUbyh0aGlzLmRvbS5zZWFyY2hDb250KSx0aGlzLl9zZWFyY2hDb250U2V0dXAoKSx0aGlzLmMuY2xlYXImJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNsZWFyLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSx0aGlzLmMub3JkZXJhYmxlJiZ0aGlzLnMuY29sT3B0cy5vcmRlcmFibGUmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLm5hbWVCdXR0b24uYXBwZW5kVG8odGhpcy5kb20uYnV0dG9uR3JvdXApLHRoaXMuYy52aWV3Q291bnQmJnRoaXMucy5jb2xPcHRzLnZpZXdDb3VudCYmdGhpcy5jLm9yZGVyYWJsZSYmdGhpcy5zLmNvbE9wdHMub3JkZXJhYmxlJiZ0aGlzLmMuY29udHJvbHMmJnRoaXMucy5jb2xPcHRzLmNvbnRyb2xzJiZ0aGlzLmRvbS5jb3VudEJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksKHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5zLmNvbE9wdHMuY29sbGFwc2UhPT0hMXx8dGhpcy5zLmNvbE9wdHMuY29sbGFwc2UpJiZ0aGlzLmMuY29udHJvbHMmJnRoaXMucy5jb2xPcHRzLmNvbnRyb2xzJiZ0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmQodGhpcy5kb20udG9wUm93KS5hcHBlbmQodGhpcy5kb20uZHRQKS5zaG93KCl9LHkucHJvdG90eXBlLl9lc2NhcGVIVE1MPWZ1bmN0aW9uKF8pe3JldHVybiBfLnRvU3RyaW5nKCkucmVwbGFjZSgvJmFtcDsvZywiJiIpLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9LHkucHJvdG90eXBlLl9nZXRCb251c09wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgXz17dGhyZXNob2xkOm51bGx9O3JldHVybiB0LmV4dGVuZCghMCx7fSx5LmRlZmF1bHRzLF8sdGhpcy5jP3RoaXMuYzp7fSl9LHkucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0LFM9e2NvbGxhcHNlOm51bGwsZW1wdHlNZXNzYWdlOiExLGluaXRDb2xsYXBzZWQ6bnVsbCx0aHJlc2hvbGQ6bnVsbH0sTj1fLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uc2VhcmNoUGFuZXMsUj10LmV4dGVuZCghMCx7fSx5LmRlZmF1bHRzLFMsTik7cmV0dXJuIE4mJk4uaGlkZUNvdW50JiZOLnZpZXdDb3VudD09PXZvaWQgMCYmKFIudmlld0NvdW50PSFOLmhpZGVDb3VudCksUn0seS5wcm90b3R5cGUuX3BvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnM9e307dmFyIF89dGhpcy5zLmR0LmNvbnRleHRbMF07aWYoIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKWZvcih2YXIgUz0wLE49dGhpcy5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpO1M8Ti5sZW5ndGg7UysrKXt2YXIgUj1OW1NdO3RoaXMuX3BvcHVsYXRlUGFuZUFycmF5KFIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsXyl9fSx5LnByb3RvdHlwZS5fc2VhcmNoPWZ1bmN0aW9uKF8sUyl7Zm9yKHZhciBOPXRoaXMucy5jb2xPcHRzLFI9dGhpcy5zLmR0LEw9MCxYPXRoaXMucy5zZWxlY3Rpb25zO0w8WC5sZW5ndGg7TCsrKXt2YXIgaj1YW0xdO2lmKHR5cGVvZiBqPT0ic3RyaW5nIiYmdHlwZW9mIF89PSJzdHJpbmciJiYoaj10aGlzLl9lc2NhcGVIVE1MKGopKSxBcnJheS5pc0FycmF5KF8pKXtpZihOLmNvbWJpbmVyPT09ImFuZCIpe2lmKCFfLmluY2x1ZGVzKGopKXJldHVybiExfWVsc2UgaWYoXy5pbmNsdWRlcyhqKSlyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBqPT0iZnVuY3Rpb24iKXtpZihqLmNhbGwoUixSLnJvdyhTKS5kYXRhKCksUykpe2lmKE4uY29tYmluZXI9PT0ib3IiKXJldHVybiEwfWVsc2UgaWYoTi5jb21iaW5lcj09PSJhbmQiKXJldHVybiExfWVsc2UgaWYoXz09PWp8fCEodHlwZW9mIF89PSJzdHJpbmciJiZfLmxlbmd0aD09PTApJiZfPT1qfHxqPT09bnVsbCYmdHlwZW9mIF89PSJzdHJpbmciJiZfPT09IiIpcmV0dXJuITB9cmV0dXJuIE4uY29tYmluZXI9PT0iYW5kIn0seS5wcm90b3R5cGUuX3NlYXJjaENvbnRTZXR1cD1mdW5jdGlvbigpe3RoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLnNlYXJjaEJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5zZWFyY2hMYWJlbENvbnQpLHRoaXMuYy5kdE9wdHMuc2VhcmNoaW5nPT09ITF8fHRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZyE9PXZvaWQgMCYmIXRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuZHRPcHRzLnNlYXJjaGluZ3x8dGhpcy5kb20uc2VhcmNoTGFiZWxDb250LmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaENvbnQpfSx5LnByb3RvdHlwZS5fc2VhcmNoRXh0cmFzPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLnVwZGF0aW5nO3RoaXMucy51cGRhdGluZz0hMDt2YXIgUz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnBsdWNrKCJmaWx0ZXIiKS50b0FycmF5KCksTj1TLmluZGV4T2YodGhpcy5lbXB0eU1lc3NhZ2UoKSksUj10KHRoaXMucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSk7Tj4tMSYmKFNbTl09IiIpLFMubGVuZ3RoPjA/Ui5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0ZWQpOlMubGVuZ3RoPT09MCYmUi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0ZWQpLHRoaXMucy51cGRhdGluZz1ffSx5LnZlcnNpb249IjIuMS4yIix5LmNsYXNzZXM9e2JvcmRlcmVkOiJkdHNwLWJvcmRlcmVkIixidXR0b25Hcm91cDoiZHRzcC1idXR0b25Hcm91cCIsYnV0dG9uU3ViOiJkdHNwLWJ1dHRvblN1YiIsY2FyZXQ6ImR0c3AtY2FyZXQiLGNsZWFyOiJkdHNwLWNsZWFyIixjbGVhckFsbDoiZHRzcC1jbGVhckFsbCIsY2xlYXJCdXR0b246ImNsZWFyQnV0dG9uIixjb2xsYXBzZUFsbDoiZHRzcC1jb2xsYXBzZUFsbCIsY29sbGFwc2VCdXR0b246ImR0c3AtY29sbGFwc2VCdXR0b24iLGNvbnRhaW5lcjoiZHRzcC1zZWFyY2hQYW5lIixjb3VudEJ1dHRvbjoiZHRzcC1jb3VudEJ1dHRvbiIsZGlzYWJsZWRCdXR0b246ImR0c3AtZGlzYWJsZWRCdXR0b24iLGhpZGRlbjoiZHRzcC1oaWRkZW4iLGhpZGU6ImR0c3AtaGlkZSIsbGF5b3V0OiJkdHNwLSIsbmFtZToiZHRzcC1uYW1lIixuYW1lQnV0dG9uOiJkdHNwLW5hbWVCdXR0b24iLG5hbWVDb250OiJkdHNwLW5hbWVDb250IixuYXJyb3c6ImR0c3AtbmFycm93IixwYW5lQnV0dG9uOiJkdHNwLXBhbmVCdXR0b24iLHBhbmVJbnB1dEJ1dHRvbjoiZHRzcC1wYW5lSW5wdXRCdXR0b24iLHBpbGw6ImR0c3AtcGlsbCIscm90YXRlZDoiZHRzcC1yb3RhdGVkIixzZWFyY2g6ImR0c3Atc2VhcmNoIixzZWFyY2hDb250OiJkdHNwLXNlYXJjaENvbnQiLHNlYXJjaEljb246ImR0c3Atc2VhcmNoSWNvbiIsc2VhcmNoTGFiZWxDb250OiJkdHNwLXNlYXJjaEJ1dHRvbkNvbnQiLHNlbGVjdGVkOiJkdHNwLXNlbGVjdGVkIixzbWFsbEdhcDoiZHRzcC1zbWFsbEdhcCIsc3ViUm93MToiZHRzcC1zdWJSb3cxIixzdWJSb3cyOiJkdHNwLXN1YlJvdzIiLHN1YlJvd3NDb250YWluZXI6ImR0c3Atc3ViUm93c0NvbnRhaW5lciIsdGl0bGU6ImR0c3AtdGl0bGUiLHRvcFJvdzoiZHRzcC10b3BSb3cifSx5LmRlZmF1bHRzPXtjbGVhcjohMCxjb2xsYXBzZTohMCxjb21iaW5lcjoib3IiLGNvbnRhaW5lcjpmdW5jdGlvbihfKXtyZXR1cm4gXy50YWJsZSgpLmNvbnRhaW5lcigpfSxjb250cm9sczohMCxkdE9wdHM6e30sZW1wdHlNZXNzYWdlOm51bGwsaGlkZUNvdW50OiExLGkxOG46e2NsZWFyUGFuZToiJnRpbWVzOyIsY291bnQ6Int0b3RhbH0iLGVtcHR5TWVzc2FnZToiPGVtPk5vIGRhdGE8L2VtPiJ9LGluaXRDb2xsYXBzZWQ6ITEsbGF5b3V0OiJhdXRvIixuYW1lOnZvaWQgMCxvcmRlcmFibGU6ITAsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsZmlsdGVyOiJmaWx0ZXIiLGhpZGVDb3VudDohMSxzZWFyY2g6ImZpbHRlciIsc2hvdzp2b2lkIDAsc29ydDoic29ydCIsdGhyZXNob2xkOi42LHR5cGU6InR5cGUiLHZpZXdDb3VudDohMH0scHJlU2VsZWN0OltdLHRocmVzaG9sZDouNix2aWV3Q291bnQ6ITB9LHl9KCkscz13aW5kb3cmJndpbmRvdy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIHk9ZnVuY3Rpb24oXyxTKXtyZXR1cm4geT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oTixSKXtOLl9fcHJvdG9fXz1SfXx8ZnVuY3Rpb24oTixSKXtmb3IodmFyIEwgaW4gUilSLmhhc093blByb3BlcnR5KEwpJiYoTltMXT1SW0xdKX0seShfLFMpfTtyZXR1cm4gZnVuY3Rpb24oXyxTKXt5KF8sUyk7ZnVuY3Rpb24gTigpe3RoaXMuY29uc3RydWN0b3I9X31fLnByb3RvdHlwZT1TPT09bnVsbD9PYmplY3QuY3JlYXRlKFMpOihOLnByb3RvdHlwZT1TLnByb3RvdHlwZSxuZXcgTil9fSgpLGE9ZnVuY3Rpb24oeSl7cyhfLHkpO2Z1bmN0aW9uIF8oUyxOLFIsTCxYKXtyZXR1cm4geS5jYWxsKHRoaXMsUyxOLFIsTCxYKXx8dGhpc31yZXR1cm4gXy5wcm90b3R5cGUuX2VtcHR5UGFuZT1mdW5jdGlvbigpe3ZhciBTPXRoaXMucy5kdFBhbmU7aWYoc3QudmVyc2lvbkNoZWNrKCIyIikpe3ZhciBOPVMuc2VsZWN0Lmxhc3QoKSxSO3JldHVybiBOJiZTLnJvdyhOLnJvdykuYW55KCkmJihSPVMucm93KE4ucm93KS5kYXRhKCkuaW5kZXgpLFMucm93cygpLnJlbW92ZSgpLGZ1bmN0aW9uKCl7aWYoUiE9PXZvaWQgMCl7dmFyIEw9Uy5yb3coZnVuY3Rpb24oWCxqKXtyZXR1cm4gai5pbmRleD09PVJ9KS5pbmRleCgpO1Muc2VsZWN0Lmxhc3Qoe3JvdzpMLGNvbHVtbjowfSl9fX1yZXR1cm4gUy5yb3dzKCkucmVtb3ZlKCksZnVuY3Rpb24oKXt9fSxfLnByb3RvdHlwZS5fc2VydmVyUG9wdWxhdGU9ZnVuY3Rpb24oUyl7dmFyIE4sUixMO3RoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fSx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcj1bXSxTLnRhYmxlTGVuZ3RoIT09dm9pZCAwPyh0aGlzLnMudGFibGVMZW5ndGg9Uy50YWJsZUxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKToodGhpcy5zLnRhYmxlTGVuZ3RoPT09bnVsbHx8dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGg+dGhpcy5zLnRhYmxlTGVuZ3RoKSYmKHRoaXMucy50YWJsZUxlbmd0aD10aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKTt2YXIgWD10aGlzLnMuZHQuY29sdW1uKHRoaXMucy5pbmRleCkuZGF0YVNyYygpO2lmKFMuc2VhcmNoUGFuZXMub3B0aW9uc1tYXSE9PXZvaWQgMClmb3IodmFyIGo9MCxxPVMuc2VhcmNoUGFuZXMub3B0aW9uc1tYXTtqPHEubGVuZ3RoO2orKyl7dmFyIGF0PXFbal07dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIucHVzaCh7ZGlzcGxheTphdC5sYWJlbCxmaWx0ZXI6YXQudmFsdWUsc2hvd246K2F0LmNvdW50LHNvcnQ6YXQubGFiZWwsdG90YWw6K2F0LnRvdGFsLHR5cGU6YXQubGFiZWx9KSx0aGlzLnMucm93RGF0YS5iaW5zU2hvd25bYXQudmFsdWVdPSthdC5jb3VudCx0aGlzLnMucm93RGF0YS5iaW5zW2F0LnZhbHVlXT0rYXQudG90YWx9dmFyIEo9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLHR0PXRoaXMuX3VuaXF1ZVJhdGlvKEosdGhpcy5zLnRhYmxlTGVuZ3RoKTtpZighdGhpcy5zLmNvbE9wdHMuc2hvdyYmdGhpcy5zLmRpc3BsYXllZD09PSExJiYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZD09PW51bGw/dHQ+dGhpcy5jLnRocmVzaG9sZDp0dD50aGlzLnMuY29sT3B0cy50aHJlc2hvbGQpfHx0aGlzLnMuY29sT3B0cy5zaG93IT09ITAmJko8PTEpKXt0aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5zLmRpc3BsYXllZD0hMTtyZXR1cm59aWYodGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcix0aGlzLnMucm93RGF0YS5iaW5zT3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYmlucyx0aGlzLnMuZGlzcGxheWVkPSEwLHRoaXMucy5kdFBhbmUpe2Zvcih2YXIgeXQ9dGhpcy5zLnNlcnZlclNlbGVjdCxUdD10aGlzLl9lbXB0eVBhbmUoKSxBdD0wLGt0PXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyO0F0PGt0Lmxlbmd0aDtBdCsrKWlmKEw9a3RbQXRdLHRoaXMuX3Nob3VsZEFkZFJvdyhMKSl7Uj10aGlzLmFkZFJvdyhMLmRpc3BsYXksTC5maWx0ZXIsTC5zb3J0LEwudHlwZSk7Zm9yKHZhciBMdD0wO0x0PHl0Lmxlbmd0aDtMdCsrKWlmKE49eXRbTHRdLE4uZmlsdGVyPT09TC5maWx0ZXIpe3RoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITAsUi5zZWxlY3QoKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSExLHl0LnNwbGljZShMdCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKEwuZmlsdGVyKTticmVha319Zm9yKHZhciBCdD0wLCR0PXl0O0J0PCR0Lmxlbmd0aDtCdCsrKXtOPSR0W0J0XTtmb3IodmFyIEt0PTAsRD10aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsO0t0PEQubGVuZ3RoO0t0KyspTD1EW0t0XSxMLmZpbHRlcj09PU4uZmlsdGVyJiYoUj10aGlzLmFkZFJvdyhMLmRpc3BsYXksTC5maWx0ZXIsTC5zb3J0LEwudHlwZSksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxSLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEsdGhpcy5zLnNlbGVjdGlvbnMucHVzaChMLmZpbHRlcikpfXRoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCksdGhpcy5zLmR0UGFuZS5kcmF3KCksVHQoKX19LF8ucHJvdG90eXBlLnVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTtmb3IodmFyIFM9MCxOPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtTPE4ubGVuZ3RoO1MrKyl7dmFyIFI9TltTXTt0aGlzLl91cGRhdGVTaG93bihSLHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fWZvcih2YXIgTD1mdW5jdGlvbihKKXtKLnNob3duPXR5cGVvZiBYLnMucm93RGF0YS5iaW5zU2hvd25bSi5maWx0ZXJdPT0ibnVtYmVyIj9YLnMucm93RGF0YS5iaW5zU2hvd25bSi5maWx0ZXJdOjAsWC5zLmR0UGFuZS5yb3coZnVuY3Rpb24odHQseXQpe3JldHVybiB5dCYmeXQuaW5kZXg9PT1KLmluZGV4fSkuZGF0YShKKX0sWD10aGlzLGo9MCxxPXRoaXMucy5kdFBhbmUucm93cygpLmRhdGEoKS50b0FycmF5KCk7ajxxLmxlbmd0aDtqKyspe3ZhciBhdD1xW2pdO0woYXQpfXRoaXMucy5kdFBhbmUuZHJhdygpLHRoaXMucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3A9dGhpcy5zLnNjcm9sbFRvcH0sXy5wcm90b3R5cGUuX21ha2VTZWxlY3Rpb249ZnVuY3Rpb24oKXt9LF8ucHJvdG90eXBlLl9yZWxvYWRTZWxlY3Q9ZnVuY3Rpb24oKXt9LF8ucHJvdG90eXBlLl9zaG91bGRBZGRSb3c9ZnVuY3Rpb24oUyl7cmV0dXJuITB9LF8ucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmIXRoaXMucy51cGRhdGluZyYmIXRoaXMucy5zZXJ2ZXJTZWxlY3RpbmcmJih0aGlzLnMuc2VydmVyU2VsZWN0PXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpKX0sXy5wcm90b3R5cGUuX3VwZGF0ZVNob3duPWZ1bmN0aW9uKFMsTixSKXtSPT09dm9pZCAwJiYoUj10aGlzLnMucm93RGF0YS5iaW5zU2hvd24pO3ZhciBMPXR5cGVvZiB0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsPT0ic3RyaW5nIj90aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsOnRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc2VhcmNoLFg9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGEsaj1YKFMsdGhpcy5zLmluZGV4LEwpLHE9ZnVuY3Rpb24oeXQpe1JbeXRdP1JbeXRdKys6Ult5dF09MX07aWYoQXJyYXkuaXNBcnJheShqKSlmb3IodmFyIGF0PTAsSj1qO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTtxKHR0KX1lbHNlIHEoail9LF99KG4pLGw9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciB5PWZ1bmN0aW9uKF8sUyl7cmV0dXJuIHk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKE4sUil7Ti5fX3Byb3RvX189Un18fGZ1bmN0aW9uKE4sUil7Zm9yKHZhciBMIGluIFIpUi5oYXNPd25Qcm9wZXJ0eShMKSYmKE5bTF09UltMXSl9LHkoXyxTKX07cmV0dXJuIGZ1bmN0aW9uKF8sUyl7eShfLFMpO2Z1bmN0aW9uIE4oKXt0aGlzLmNvbnN0cnVjdG9yPV99Xy5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooTi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IE4pfX0oKSx1O2Z1bmN0aW9uIHAoeSl7dT15fXZhciB2PWZ1bmN0aW9uKHkpe2woXyx5KTtmdW5jdGlvbiBfKFMsTixSLEwsWCl7dmFyIGo9dGhpcyxxPXtpMThuOntjb3VudEZpbHRlcmVkOiJ7c2hvd259ICh7dG90YWx9KSJ9fTtyZXR1cm4gaj15LmNhbGwodGhpcyxTLHUuZXh0ZW5kKHEsTiksUixMLFgpfHx0aGlzLGp9cmV0dXJuIF8ucHJvdG90eXBlLl9nZXRNZXNzYWdlPWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudCIsdGhpcy5jLmkxOG4uY291bnQpLFI9dGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50RmlsdGVyZWQiLHRoaXMuYy5pMThuLmNvdW50RmlsdGVyZWQpO3JldHVybih0aGlzLnMuZmlsdGVyaW5nQWN0aXZlP1I6TikucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0sXy5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0sX30oYSksbT13aW5kb3cmJndpbmRvdy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIHk9ZnVuY3Rpb24oXyxTKXtyZXR1cm4geT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oTixSKXtOLl9fcHJvdG9fXz1SfXx8ZnVuY3Rpb24oTixSKXtmb3IodmFyIEwgaW4gUilSLmhhc093blByb3BlcnR5KEwpJiYoTltMXT1SW0xdKX0seShfLFMpfTtyZXR1cm4gZnVuY3Rpb24oXyxTKXt5KF8sUyk7ZnVuY3Rpb24gTigpe3RoaXMuY29uc3RydWN0b3I9X31fLnByb3RvdHlwZT1TPT09bnVsbD9PYmplY3QuY3JlYXRlKFMpOihOLnByb3RvdHlwZT1TLnByb3RvdHlwZSxuZXcgTil9fSgpLGc7ZnVuY3Rpb24gVCh5KXtnPXl9dmFyIHc9ZnVuY3Rpb24oeSl7bShfLHkpO2Z1bmN0aW9uIF8oUyxOLFIsTCxYKXt2YXIgaj10aGlzLHE9e2kxOG46e2NvdW50OiJ7c2hvd259In19O3JldHVybiBqPXkuY2FsbCh0aGlzLFMsZy5leHRlbmQocSxOKSxSLEwsWCl8fHRoaXMsan1yZXR1cm4gXy5wcm90b3R5cGUudXBkYXRlUm93cz1mdW5jdGlvbigpe3ZhciBTPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLE47aWYodGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zKXt0aGlzLl9nZXRDb21wYXJpc29uUm93cygpO2Zvcih2YXIgUj10aGlzLnMuZHRQYW5lLnJvd3MoKS50b0FycmF5KClbMF0sTD0wO0w8Ui5sZW5ndGg7TCsrKXt2YXIgWD10aGlzLnMuZHRQYW5lLnJvdyhSW0xdKSxqPVguZGF0YSgpO2lmKGohPT12b2lkIDApe2lmKGouc2hvd249PT0wKXtYLnJlbW92ZSgpLFI9dGhpcy5zLmR0UGFuZS5yb3dzKCkudG9BcnJheSgpWzBdLEwtLTtjb250aW51ZX1mb3IodmFyIHE9MCxhdD1TO3E8YXQubGVuZ3RoO3ErKylpZihOPWF0W3FdLGouZmlsdGVyPT09Ti5maWx0ZXIpe1guc2VsZWN0KCksUy5zcGxpY2UoTCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKGouZmlsdGVyKTticmVha319fX1lbHNle2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dGhpcy5fYWN0aXZlUG9wdWxhdGVQYW5lKCksdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9O2Zvcih2YXIgSj0wLHR0PXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtKPHR0Lmxlbmd0aDtKKyspe3ZhciB5dD10dFtKXTt0aGlzLl91cGRhdGVTaG93bih5dCx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXSx0aGlzLnMucm93RGF0YS5iaW5zU2hvd24pfX10aGlzLnMuZHRQYW5lLnJvd3MoKS5yZW1vdmUoKTtmb3IodmFyIFR0PTAsQXQ9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI7VHQ8QXQubGVuZ3RoO1R0Kyspe3ZhciBrdD1BdFtUdF07aWYoa3Quc2hvd24hPT0wKWZvcih2YXIgTHQ9dGhpcy5hZGRSb3coa3QuZGlzcGxheSxrdC5maWx0ZXIsa3Quc29ydCxrdC50eXBlLHZvaWQgMCksQnQ9MDtCdDxTLmxlbmd0aDtCdCsrKXt2YXIgJHQ9U1tCdF07aWYoJHQuZmlsdGVyPT09a3QuZmlsdGVyKXtMdC5zZWxlY3QoKSxTLnNwbGljZShCdCwxKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKGt0LmZpbHRlcik7YnJlYWt9fX1mb3IodmFyIEt0PTAsRD1TO0t0PEQubGVuZ3RoO0t0Kyspe049RFtLdF07Zm9yKHZhciB1dD0wLG90PXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw7dXQ8b3QubGVuZ3RoO3V0Kyspe3ZhciBIPW90W3V0XTtpZihILmZpbHRlcj09PU4uZmlsdGVyKXt2YXIgTT10aGlzLmFkZFJvdyhILmRpc3BsYXksSC5maWx0ZXIsSC5zb3J0LEgudHlwZSx2b2lkIDApO00uc2VsZWN0KCksdGhpcy5zLnNlbGVjdGlvbnMucHVzaChILmZpbHRlcil9fX19dGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHx0aGlzLnMuZHQuZHJhdyghMSl9LF8ucHJvdG90eXBlLl9hY3RpdmVQb3B1bGF0ZVBhbmU9ZnVuY3Rpb24oKXt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcj1bXSx0aGlzLnMucm93RGF0YS5iaW5zPXt9O3ZhciBTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSlmb3IodmFyIE49MCxSPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuaW5kZXhlcygpLnRvQXJyYXkoKTtOPFIubGVuZ3RoO04rKyl7dmFyIEw9UltOXTt0aGlzLl9wb3B1bGF0ZVBhbmVBcnJheShMLHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLFMpfX0sXy5wcm90b3R5cGUuX2dldENvbXBhcmlzb25Sb3dzPWZ1bmN0aW9uKCl7dmFyIFM9dGhpcy5zLmNvbE9wdHMub3B0aW9ucz90aGlzLnMuY29sT3B0cy5vcHRpb25zOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucz90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM6dm9pZCAwO2lmKFMhPT12b2lkIDApe3ZhciBOPXRoaXMucy5kdC5yb3dzKCksUj10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLEw9Ti5kYXRhKCkudG9BcnJheSgpLFg9Ui5kYXRhKCkudG9BcnJheSgpLGo9W107dGhpcy5zLmR0UGFuZS5jbGVhcigpLHRoaXMucy5pbmRleGVzPVtdO2Zvcih2YXIgcT0wLGF0PVM7cTxhdC5sZW5ndGg7cSsrKXt2YXIgSj1hdFtxXSx0dD1KLmxhYmVsIT09IiI/Si5sYWJlbDp0aGlzLmVtcHR5TWVzc2FnZSgpLHl0PXtjbGFzc05hbWU6Si5jbGFzc05hbWUsZGlzcGxheTp0dCxmaWx0ZXI6dHlwZW9mIEoudmFsdWU9PSJmdW5jdGlvbiI/Si52YWx1ZTpbXSxzaG93bjowLHNvcnQ6dHQsdG90YWw6MCx0eXBlOnR0fTtpZih0eXBlb2YgSi52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciBUdD0wO1R0PEwubGVuZ3RoO1R0KyspSi52YWx1ZS5jYWxsKHRoaXMucy5kdCxMW1R0XSxOWzBdW1R0XSkmJnl0LnRvdGFsKys7Zm9yKHZhciBBdD0wO0F0PFgubGVuZ3RoO0F0KyspSi52YWx1ZS5jYWxsKHRoaXMucy5kdCxYW0F0XSxSWzBdW0F0XSkmJnl0LnNob3duKys7dHlwZW9mIHl0LmZpbHRlciE9ImZ1bmN0aW9uIiYmeXQuZmlsdGVyLnB1c2goSi5maWx0ZXIpfWoucHVzaCh0aGlzLmFkZFJvdyh5dC5kaXNwbGF5LHl0LmZpbHRlcix5dC5zb3J0LHl0LnR5cGUseXQuY2xhc3NOYW1lLHl0LnRvdGFsLHl0LnNob3duKSl9cmV0dXJuIGp9fSxfLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0sXy5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0sXy5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4gUy5zaG93bj4wfSxffShhKSxrPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgeT1mdW5jdGlvbihfLFMpe3JldHVybiB5PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihOLFIpe04uX19wcm90b19fPVJ9fHxmdW5jdGlvbihOLFIpe2Zvcih2YXIgTCBpbiBSKVIuaGFzT3duUHJvcGVydHkoTCkmJihOW0xdPVJbTF0pfSx5KF8sUyl9O3JldHVybiBmdW5jdGlvbihfLFMpe3koXyxTKTtmdW5jdGlvbiBOKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ffV8ucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KE4ucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBOKX19KCksUDtmdW5jdGlvbiBGKHkpe1A9eX12YXIgaD1mdW5jdGlvbih5KXtrKF8seSk7ZnVuY3Rpb24gXyhTLE4sUixMLFgpe3ZhciBqPXRoaXMscT17aTE4bjp7Y291bnQ6Int0b3RhbH0iLGNvdW50RmlsdGVyZWQ6IntzaG93bn0gKHt0b3RhbH0pIn19O3JldHVybiBqPXkuY2FsbCh0aGlzLFMsUC5leHRlbmQocSxOKSxSLEwsWCl8fHRoaXMsan1yZXR1cm4gXy5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTt2YXIgUz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBOPTAsUj10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKS50b0FycmF5KCk7TjxSLmxlbmd0aDtOKyspe3ZhciBMPVJbTl07dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoTCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixTLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fSxfLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgTj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxSPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9SOk4pLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LF99KHcpLG8sZjtmdW5jdGlvbiBDKHkpe289eSxmPXkuZm4uZGF0YVRhYmxlfXZhciBCPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geShfLFMsTixSKXt2YXIgTD10aGlzO2lmKE49PT12b2lkIDAmJihOPSExKSxSPT09dm9pZCAwJiYoUj1uKSwhZnx8IWYudmVyc2lvbkNoZWNrfHwhZi52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighZi5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciBYPW5ldyBmLkFwaShfKTtpZih0aGlzLmNsYXNzZXM9by5leHRlbmQoITAse30seS5jbGFzc2VzKSx0aGlzLmM9by5leHRlbmQoITAse30seS5kZWZhdWx0cyxTKSx0aGlzLmRvbT17Y2xlYXJBbGw6bygnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY2xlYXJBbGwpLmh0bWwoWC5pMThuKCJzZWFyY2hQYW5lcy5jbGVhck1lc3NhZ2UiLHRoaXMuYy5pMThuLmNsZWFyTWVzc2FnZSkpLGNvbGxhcHNlQWxsOm8oJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQWxsKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2VNZXNzYWdlIix0aGlzLmMuaTE4bi5jb2xsYXBzZU1lc3NhZ2UpKSxjb250YWluZXI6bygiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVzKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMubG9hZE1lc3NhZ2UiLHRoaXMuYy5pMThuLmxvYWRNZXNzYWdlKSksZW1wdHlNZXNzYWdlOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5lbXB0eU1lc3NhZ2UpLHBhbmVzOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLHNob3dBbGw6bygnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2hvd0FsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5odG1sKFguaTE4bigic2VhcmNoUGFuZXMuc2hvd01lc3NhZ2UiLHRoaXMuYy5pMThuLnNob3dNZXNzYWdlKSksdGl0bGU6bygiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRpdGxlKSx0aXRsZVJvdzpvKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGVSb3cpfSx0aGlzLnM9e2NvbE9wdHM6W10sZHQ6WCxmaWx0ZXJDb3VudDowLG1pblBhbmVXaWR0aDoyNjAscGFnZTowLHBhZ2luZzohMSxwYWdpbmdTVDohMSxwYW5lQ2xhc3M6UixwYW5lczpbXSxzZWxlY3Rpb25MaXN0OltdLHNlcnZlckRhdGE6e30sc3RhdGVSZWFkOiExLHVwZGF0aW5nOiExfSwhWC5zZXR0aW5ncygpWzBdLl9zZWFyY2hQYW5lcyl7aWYobyhkb2N1bWVudCkub24oImRyYXcuZHQiLGZ1bmN0aW9uKHEpe0wuZG9tLmNvbnRhaW5lci5maW5kKHEudGFyZ2V0KS5sZW5ndGgmJkwuX3VwZGF0ZUZpbHRlckNvdW50KCl9KSx0aGlzLl9nZXRTdGF0ZSgpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgaj10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTt0aGlzLnMuZHQub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24ocSxhdCxKKXtpZihqPT09YXQpe0ouc2VhcmNoUGFuZXM9PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzPXt9KSxKLnNlYXJjaFBhbmVzX251bGw9PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzX251bGw9e30pO2Zvcih2YXIgdHQseXQ9MCxUdD1MLnMuc2VsZWN0aW9uTGlzdDt5dDxUdC5sZW5ndGg7eXQrKyl7dmFyIEF0PVR0W3l0XTt0dD1MLnMuZHQuY29sdW1uKEF0LmNvbHVtbikuZGF0YVNyYygpLEouc2VhcmNoUGFuZXNbdHRdPT09dm9pZCAwJiYoSi5zZWFyY2hQYW5lc1t0dF09e30pLEouc2VhcmNoUGFuZXNfbnVsbFt0dF09PT12b2lkIDAmJihKLnNlYXJjaFBhbmVzX251bGxbdHRdPXt9KTtmb3IodmFyIGt0PTA7a3Q8QXQucm93cy5sZW5ndGg7a3QrKylKLnNlYXJjaFBhbmVzW3R0XVtrdF09QXQucm93c1trdF0sSi5zZWFyY2hQYW5lc1t0dF1ba3RdPT09bnVsbD9KLnNlYXJjaFBhbmVzX251bGxbdHRdW2t0XT0hMDpKLnNlYXJjaFBhbmVzX251bGxbdHRdW2t0XT0hMX1MLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGg+MCYmKEouc2VhcmNoUGFuZXNMYXN0PXR0KSxKLnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6TC5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6TC5jLnZpZXdDb3VudCx2aWV3VG90YWw6TC5jLnZpZXdUb3RhbH19fSl9cmV0dXJuIHRoaXMuX3NldFhIUigpLFguc2V0dGluZ3MoKVswXS5fc2VhcmNoUGFuZXM9dGhpcyx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZXx8Tj90aGlzLl9wYW5lRGVjbGFyZShYLF8sUyk6WC5vbmUoInByZUluaXQuZHRzcHMiLGZ1bmN0aW9uKCl7TC5fcGFuZURlY2xhcmUoWCxfLFMpfSksdGhpc319cmV0dXJuIHkucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgXyxTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspXz1OW1NdLF8ucy5kdFBhbmUmJihfLnMuc2Nyb2xsVG9wPV8ucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3ApO3ZhciBSPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoL1xzKy9nLCIuIikpO1IuZWFjaChmdW5jdGlvbigpe28odGhpcykudmFsKCIiKS50cmlnZ2VyKCJpbnB1dCIpfSksdGhpcy5zLnNlbGVjdGlvbkxpc3Q9W107Zm9yKHZhciBMPVtdLFg9MCxqPXRoaXMucy5wYW5lcztYPGoubGVuZ3RoO1grKylfPWpbWF0sXy5zLmR0UGFuZSYmTC5wdXNoKF8uY2xlYXJQYW5lKCkpO3JldHVybiBMfSx5LnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0seS5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihfLFMpe189PT12b2lkIDAmJihfPSExKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5kb20uZW1wdHlNZXNzYWdlLmRldGFjaCgpLF89PT0hMSYmdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIE49W10sUj0wLEw9dGhpcy5zLnBhbmVzO1I8TC5sZW5ndGg7UisrKXt2YXIgWD1MW1JdOyhfPT09ITF8fFgucy5pbmRleD09PV8pJiYoWC5jbGVhckRhdGEoKSxYLnJlYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCxTKSx0aGlzLmRvbS5wYW5lcy5hcHBlbmQoWC5kb20uY29udGFpbmVyKSxOLnB1c2goWCkpfXJldHVybiB0aGlzLl91cGRhdGVTZWxlY3Rpb24oKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLHRoaXMuX2F0dGFjaFBhbmVDb250YWluZXIoKSx0aGlzLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzKCExKSx0aGlzLnMuZHQuZHJhdyghUyksdGhpcy5yZXNpemVQYW5lcygpLE4ubGVuZ3RoPT09MT9OWzBdOk59LHkucHJvdG90eXBlLnJlc2l6ZVBhbmVzPWZ1bmN0aW9uKCl7dmFyIF87aWYodGhpcy5jLmxheW91dD09PSJhdXRvIil7Zm9yKHZhciBTPW8odGhpcy5zLmR0LnNlYXJjaFBhbmVzLmNvbnRhaW5lcigpKS53aWR0aCgpLE49TWF0aC5mbG9vcihTL3RoaXMucy5taW5QYW5lV2lkdGgpLFI9MSxMPTAsWD1bXSxqPTAscT10aGlzLnMucGFuZXM7ajxxLmxlbmd0aDtqKyspXz1xW2pdLF8ucy5kaXNwbGF5ZWQmJlgucHVzaChfLnMuaW5kZXgpO3ZhciBhdD1YLmxlbmd0aDtpZihOPT09YXQpUj1OO2Vsc2UgZm9yKHZhciBKPU47Sj4xO0otLSl7dmFyIHR0PWF0JUo7aWYodHQ9PT0wKXtSPUosTD0wO2JyZWFrfWVsc2UgdHQ+TCYmKFI9SixMPXR0KX12YXIgeXQ9TCE9PTA/WC5zbGljZShYLmxlbmd0aC1MLFgubGVuZ3RoKTpbXTt0aGlzLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihrdCl7a3Qucy5kaXNwbGF5ZWQmJmt0LnJlc2l6ZSgiY29sdW1ucy0iKyh5dC5pbmNsdWRlcyhrdC5zLmluZGV4KT9MOlIpKX0pfWVsc2UgZm9yKHZhciBUdD0wLEF0PXRoaXMucy5wYW5lcztUdDxBdC5sZW5ndGg7VHQrKylfPUF0W1R0XSxfLmFkanVzdFRvcFJvdygpO3JldHVybiB0aGlzfSx5LnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihfKXt9LHkucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXt9LHkucHJvdG90eXBlLl9zZXRYSFI9ZnVuY3Rpb24oKXt2YXIgXz10aGlzLFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sTj1mdW5jdGlvbihSKXtSJiZSLnNlYXJjaFBhbmVzJiZSLnNlYXJjaFBhbmVzLm9wdGlvbnMmJihfLnMuc2VydmVyRGF0YT1SLF8ucy5zZXJ2ZXJEYXRhLnRhYmxlTGVuZ3RoPVIucmVjb3Jkc1RvdGFsLF8uX3NlcnZlclRvdGFscygpKX07dGhpcy5zLmR0Lm9uKCJ4aHIuZHRzcHMiLGZ1bmN0aW9uKFIsTCxYKXtTPT09TCYmTihYKX0pLE4odGhpcy5zLmR0LmFqYXguanNvbigpKX0seS5wcm90b3R5cGUuX3N0YXRlTG9hZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIF89dGhpcyxTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO3RoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c3BzIixmdW5jdGlvbihOLFIsTCl7aWYoIShMLnNlYXJjaFBhbmVzPT09dm9pZCAwfHxSIT09Uykpe2lmKF8uY2xlYXJTZWxlY3Rpb25zKCksXy5zLnNlbGVjdGlvbkxpc3Q9TC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P0wuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxMLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgWD0wLGo9TC5zZWFyY2hQYW5lcy5wYW5lcztYPGoubGVuZ3RoO1grKylmb3IodmFyIHE9altYXSxhdD0wLEo9Xy5zLnBhbmVzO2F0PEoubGVuZ3RoO2F0Kyspe3ZhciB0dD1KW2F0XTtxLmlkPT09dHQucy5pbmRleCYmdHQucy5kdFBhbmUmJih0dC5kb20uc2VhcmNoQm94LnZhbChxLnNlYXJjaFRlcm0pLHR0LnMuZHRQYW5lLm9yZGVyKHEub3JkZXIpKX1fLl9tYWtlU2VsZWN0aW9ucyhfLnMuc2VsZWN0aW9uTGlzdCl9fSl9LHkucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuc2VsZWN0aW9uTGlzdD1bXTtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtpZihOLnMuZHRQYW5lKXt2YXIgUj1OLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEwuZmlsdGVyfSk7Ui5sZW5ndGgmJnRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpOLnMuaW5kZXgscm93czpSfSl9fX0seS5wcm90b3R5cGUuX2F0dGFjaD1mdW5jdGlvbigpe3ZhciBfPXRoaXM7dGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLmRldGFjaCgpLmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5jLmNsZWFyJiZ0aGlzLmRvbS5jbGVhckFsbC5hcHBlbmRUbyh0aGlzLmRvbS50aXRsZVJvdykub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gXy5jbGVhclNlbGVjdGlvbnMoKX0pLHRoaXMuYy5jb2xsYXBzZSYmKHRoaXMuZG9tLnNob3dBbGwuYXBwZW5kVG8odGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLmNvbGxhcHNlQWxsLmFwcGVuZFRvKHRoaXMuZG9tLnRpdGxlUm93KSx0aGlzLl9zZXRDb2xsYXBzZUxpc3RlbmVyKCkpO2Zvcih2YXIgUz0wLE49dGhpcy5zLnBhbmVzO1M8Ti5sZW5ndGg7UysrKXt2YXIgUj1OW1NdO3RoaXMuZG9tLnBhbmVzLmFwcGVuZChSLmRvbS5jb250YWluZXIpfXRoaXMuZG9tLmNvbnRhaW5lci50ZXh0KCIiKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSkuYXBwZW5kKHRoaXMuZG9tLnRpdGxlUm93KS5hcHBlbmQodGhpcy5kb20ucGFuZXMpLHRoaXMucy5wYW5lcy5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBMLnNldExpc3RlbmVycygpfSksbygiZGl2LiIrdGhpcy5jbGFzc2VzLmNvbnRhaW5lcikubGVuZ3RoPT09MCYmdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmRUbyh0aGlzLnMuZHQpfSx5LnByb3RvdHlwZS5fYXR0YWNoTWVzc2FnZT1mdW5jdGlvbigpe3ZhciBfO3RyeXtfPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eVBhbmVzIix0aGlzLmMuaTE4bi5lbXB0eVBhbmVzKX1jYXRjaHtfPW51bGx9aWYoXz09PW51bGwpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLHRoaXMuZG9tLnRpdGxlUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRlKSx0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuaHRtbChfKS5hcHBlbmRUbyh0aGlzLmRvbS5jb250YWluZXIpfSx5LnByb3RvdHlwZS5fYXR0YWNoUGFuZUNvbnRhaW5lcj1mdW5jdGlvbigpe2Zvcih2YXIgXz0wLFM9dGhpcy5zLnBhbmVzO188Uy5sZW5ndGg7XysrKXt2YXIgTj1TW19dO2lmKE4ucy5kaXNwbGF5ZWQ9PT0hMCl7dGhpcy5fYXR0YWNoKCk7cmV0dXJufX10aGlzLl9hdHRhY2hNZXNzYWdlKCl9LHkucHJvdG90eXBlLl9jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBfPSEwLFM9ITAsTj0wLFI9dGhpcy5zLnBhbmVzO048Ui5sZW5ndGg7TisrKXt2YXIgTD1SW05dO0wucy5kaXNwbGF5ZWQmJihMLmRvbS5jb2xsYXBzZUJ1dHRvbi5oYXNDbGFzcyhMLmNsYXNzZXMucm90YXRlZCk/KHRoaXMuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLFM9ITEpOih0aGlzLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksXz0hMSkpfV8mJnRoaXMuZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksUyYmdGhpcy5kb20uc2hvd0FsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpfSx5LnByb3RvdHlwZS5fY2hlY2tNZXNzYWdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBfPTAsUz10aGlzLnMucGFuZXM7XzxTLmxlbmd0aDtfKyspe3ZhciBOPVNbX107aWYoTi5zLmRpc3BsYXllZD09PSEwKXt0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuZGV0YWNoKCksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn19dGhpcy5fYXR0YWNoTWVzc2FnZSgpfSx5LnByb3RvdHlwZS5fY29sbGFwc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtOLmNvbGxhcHNlKCl9fSx5LnByb3RvdHlwZS5fZmluZFBhbmU9ZnVuY3Rpb24oXyl7Zm9yKHZhciBTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspe3ZhciBSPU5bU107aWYoXz09PVIucy5uYW1lKXJldHVybiBSfX0seS5wcm90b3R5cGUuX2dldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIF89dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpO18mJl8uc2VhcmNoUGFuZXMmJl8uc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PV8uc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCl9LHkucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9ucz1mdW5jdGlvbihfKXtmb3IodmFyIFM9MCxOPV87UzxOLmxlbmd0aDtTKyspe2Zvcih2YXIgUj1OW1NdLEw9dm9pZCAwLFg9MCxqPXRoaXMucy5wYW5lcztYPGoubGVuZ3RoO1grKyl7dmFyIHE9altYXTtpZihxLnMuaW5kZXg9PT1SLmNvbHVtbil7TD1xO2JyZWFrfX1pZihMJiZMLnMuZHRQYW5lKXtmb3IodmFyIGF0PTA7YXQ8TC5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7YXQrKylSLnJvd3MuaW5jbHVkZXModHlwZW9mIEwucy5kdFBhbmUucm93KGF0KS5kYXRhKCkuZmlsdGVyPT0iZnVuY3Rpb24iP0wucy5kdFBhbmUuY2VsbChhdCwwKS5kYXRhKCk6TC5zLmR0UGFuZS5yb3coYXQpLmRhdGEoKS5maWx0ZXIpJiZMLnMuZHRQYW5lLnJvdyhhdCkuc2VsZWN0KCk7TC51cGRhdGVUYWJsZSgpfX19LHkucHJvdG90eXBlLl9wYW5lRGVjbGFyZT1mdW5jdGlvbihfLFMsTil7dmFyIFI9dGhpcztfLmNvbHVtbnModGhpcy5jLmNvbHVtbnMubGVuZ3RoPjA/dGhpcy5jLmNvbHVtbnM6dm9pZCAwKS5lcSgwKS5lYWNoKGZ1bmN0aW9uKHEpe1Iucy5wYW5lcy5wdXNoKG5ldyBSLnMucGFuZUNsYXNzKFMsTixxLFIuZG9tLnBhbmVzKSl9KTtmb3IodmFyIEw9Xy5jb2x1bW5zKCkuZXEoMCkudG9BcnJheSgpLmxlbmd0aCxYPTA7WDx0aGlzLmMucGFuZXMubGVuZ3RoO1grKyl7dmFyIGo9TCtYO3RoaXMucy5wYW5lcy5wdXNoKG5ldyB0aGlzLnMucGFuZUNsYXNzKFMsTixqLHRoaXMuZG9tLnBhbmVzLHRoaXMuYy5wYW5lc1tYXSkpfXRoaXMuYy5vcmRlci5sZW5ndGg+MCYmKHRoaXMucy5wYW5lcz10aGlzLmMub3JkZXIubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBSLl9maW5kUGFuZShxKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zdGFydHVwKF8pOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvSW5pdENvbXBsZXRlLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gUi5fc3RhcnR1cChfKX0pfSx5LnByb3RvdHlwZS5fc2V0Q29sbGFwc2VMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBfPXRoaXM7dGhpcy5kb20uY29sbGFwc2VBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtfLl9jb2xsYXBzZUFsbCgpLF8uZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksXy5kb20uc2hvd0FsbC5yZW1vdmVDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksXy5zLmR0LnN0YXRlLnNhdmUoKX0pLHRoaXMuZG9tLnNob3dBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtfLl9zaG93QWxsKCksXy5kb20uc2hvd0FsbC5hZGRDbGFzcyhfLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLF8uZG9tLmNvbGxhcHNlQWxsLnJlbW92ZUNsYXNzKF8uY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKSxfLnMuZHQuc3RhdGUuc2F2ZSgpfSk7Zm9yKHZhciBTPTAsTj10aGlzLnMucGFuZXM7UzxOLmxlbmd0aDtTKyspe3ZhciBSPU5bU107Ui5kb20udG9wUm93Lm9mZigiY29sbGFwc2UuZHRzcHMiKS5vbigiY29sbGFwc2UuZHRzcHMiLGZ1bmN0aW9uKCl7cmV0dXJuIF8uX2NoZWNrQ29sbGFwc2UoKX0pfXRoaXMuX2NoZWNrQ29sbGFwc2UoKX0seS5wcm90b3R5cGUuX3Nob3dBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIF89MCxTPXRoaXMucy5wYW5lcztfPFMubGVuZ3RoO18rKyl7dmFyIE49U1tfXTtOLnNob3coKX19LHkucHJvdG90eXBlLl9zdGFydHVwPWZ1bmN0aW9uKF8pe3ZhciBTPXRoaXM7dGhpcy5fYXR0YWNoKCksdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIE49dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sUj0wLEw9dGhpcy5zLnBhbmVzO1I8TC5sZW5ndGg7UisrKXt2YXIgWD1MW1JdO1gucmVidWlsZFBhbmUoT2JqZWN0LmtleXModGhpcy5zLnNlcnZlckRhdGEpLmxlbmd0aD4wP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCksdGhpcy5kb20ucGFuZXMuYXBwZW5kKFguZG9tLmNvbnRhaW5lcil9dGhpcy5jLmxheW91dD09PSJhdXRvIiYmdGhpcy5yZXNpemVQYW5lcygpO3ZhciBqPXRoaXMucy5kdC5zdGF0ZS5sb2FkZWQoKTshdGhpcy5zLnN0YXRlUmVhZCYmaiYmdGhpcy5zLmR0LnBhZ2Uoai5zdGFydC90aGlzLnMuZHQucGFnZS5sZW4oKSkuZHJhdygicGFnZSIpLHRoaXMucy5zdGF0ZVJlYWQ9ITAsdGhpcy5fY2hlY2tNZXNzYWdlKCksXy5vbigicHJlRHJhdy5kdHNwcyIsZnVuY3Rpb24oKXshUy5zLnVwZGF0aW5nJiYhUy5zLnBhZ2luZyYmKFMuX3VwZGF0ZUZpbHRlckNvdW50KCksUy5fdXBkYXRlU2VsZWN0aW9uKCkpLFMucy5wYWdpbmc9ITF9KSxvKHdpbmRvdykub24oInJlc2l6ZS5kdHNwcyIsZi51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIFMucmVzaXplUGFuZXMoKX0pKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNwcyIsZnVuY3Rpb24oYXQsSix0dCl7Sj09PU4mJih0dC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzPXt9KSx0dC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0PVMucy5zZWxlY3Rpb25MaXN0KX0pLHRoaXMuX3N0YXRlTG9hZExpc3RlbmVyKCksXy5vZmYoInBhZ2UuZHRzcHMgcGFnZS1uYy5kdHNwcyIpLm9uKCJwYWdlLmR0c3BzIHBhZ2UtbmMuZHRzcHMiLGZ1bmN0aW9uKGF0LEope1Mucy5wYWdpbmc9ITAsUy5zLnBhZ2luZ1NUPSEwLFMucy5wYWdlPVMucy5kdC5wYWdlKCl9KSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT9fLm9mZigicHJlWGhyLmR0c3BzIikub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oYXQsSix0dCl7aWYoSj09PU4pe3R0LnNlYXJjaFBhbmVzfHwodHQuc2VhcmNoUGFuZXM9e30pLHR0LnNlYXJjaFBhbmVzX251bGx8fCh0dC5zZWFyY2hQYW5lc19udWxsPXt9KTtmb3IodmFyIHl0PTAsVHQ9MCxBdD1TLnMucGFuZXM7VHQ8QXQubGVuZ3RoO1R0Kyspe3ZhciBrdD1BdFtUdF0sTHQ9Uy5zLmR0LmNvbHVtbihrdC5zLmluZGV4KS5kYXRhU3JjKCk7aWYodHQuc2VhcmNoUGFuZXNbTHRdfHwodHQuc2VhcmNoUGFuZXNbTHRdPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsW0x0XXx8KHR0LnNlYXJjaFBhbmVzX251bGxbTHRdPXt9KSxrdC5zLmR0UGFuZSlmb3IodmFyIEJ0PWt0LnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSwkdD0wOyR0PEJ0Lmxlbmd0aDskdCsrKXR0LnNlYXJjaFBhbmVzW0x0XVskdF09QnRbJHRdLmZpbHRlcix0dC5zZWFyY2hQYW5lc1tMdF1bJHRdP3R0LnNlYXJjaFBhbmVzX251bGxbTHRdWyR0XT0hMTp0dC5zZWFyY2hQYW5lc19udWxsW0x0XVskdF09ITAseXQrK315dD4wJiYoeXQhPT1TLnMuZmlsdGVyQ291bnQ/KHR0LnN0YXJ0PTAsUy5zLnBhZ2U9MCk6dHQuc3RhcnQ9Uy5zLnBhZ2UqUy5zLmR0LnBhZ2UubGVuKCksUy5zLmR0LnBhZ2UoUy5zLnBhZ2UpLFMucy5maWx0ZXJDb3VudD15dCksUy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJih0dC5zZWFyY2hQYW5lc0xhc3Q9Uy5zLmR0LmNvbHVtbihTLnMuc2VsZWN0aW9uTGlzdFtTLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGgtMV0uY29sdW1uKS5kYXRhU3JjKCkpLHR0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Uy5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Uy5jLnZpZXdDb3VudCx2aWV3VG90YWw6Uy5jLnZpZXdUb3RhbH19fSk6Xy5vbigicHJlWGhyLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBTLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihhdCl7cmV0dXJuIGF0LmNsZWFyRGF0YSgpfSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNwcyIsZnVuY3Rpb24oYXQsSil7aWYoSi5uVGFibGU9PT1TLnMuZHQudGFibGUoKS5ub2RlKCkmJiFTLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dmFyIHR0PSExO1Mucy5kdC5vbmUoInByZURyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7aWYoIXR0KXt2YXIgeXQ9Uy5zLmR0LnBhZ2UoKTt0dD0hMCxTLnMudXBkYXRpbmc9ITAsUy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIFR0PTAsQXQ9Uy5zLnBhbmVzO1R0PEF0Lmxlbmd0aDtUdCsrKXt2YXIga3Q9QXRbVHRdO2t0LmNsZWFyRGF0YSgpLGt0LnJlYnVpbGRQYW5lKHZvaWQgMCwhMCksUy5kb20ucGFuZXMuYXBwZW5kKGt0LmRvbS5jb250YWluZXIpfVMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHxTLnMuZHQuZHJhdygpLFMucy51cGRhdGluZz0hMSxTLl91cGRhdGVTZWxlY3Rpb24oKSxTLl9jaGVja01lc3NhZ2UoKSxTLnMuZHQub25lKCJkcmF3LmR0c3BzIixmdW5jdGlvbigpe1Mucy51cGRhdGluZz0hMCxTLnMuZHQucGFnZSh5dCkuZHJhdyghMSksUy5zLnVwZGF0aW5nPSExfSl9fSl9fSk7dmFyIHE9dGhpcy5jLnByZVNlbGVjdDtqJiZqLnNlYXJjaFBhbmVzJiZqLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3QmJihxPWouc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCksdGhpcy5fbWFrZVNlbGVjdGlvbnMocSksdGhpcy5fdXBkYXRlRmlsdGVyQ291bnQoKSxfLm9uKCJkZXN0cm95LmR0c3BzIixmdW5jdGlvbihhdCxKKXtpZihKPT09Til7Zm9yKHZhciB0dD0wLHl0PVMucy5wYW5lczt0dDx5dC5sZW5ndGg7dHQrKyl7dmFyIFR0PXl0W3R0XTtUdC5kZXN0cm95KCl9Xy5vZmYoIi5kdHNwcyIpLFMuZG9tLnNob3dBbGwub2ZmKCIuZHRzcHMiKSxTLmRvbS5jbGVhckFsbC5vZmYoIi5kdHNwcyIpLFMuZG9tLmNvbGxhcHNlQWxsLm9mZigiLmR0c3BzIiksbyhfLnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNwcyIpLFMuZG9tLmNvbnRhaW5lci5kZXRhY2goKSxTLmNsZWFyU2VsZWN0aW9ucygpfX0pLHRoaXMuYy5jb2xsYXBzZSYmdGhpcy5fc2V0Q29sbGFwc2VMaXN0ZW5lcigpLHRoaXMuYy5jbGVhciYmdGhpcy5kb20uY2xlYXJBbGwub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gUy5jbGVhclNlbGVjdGlvbnMoKX0pLE4uX3NlYXJjaFBhbmVzPXRoaXMsdGhpcy5zLmR0LnN0YXRlLnNhdmUoKX0seS5wcm90b3R5cGUuX3VwZGF0ZUZpbHRlckNvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBfPTAsUz0wLE49MCxSPXRoaXMucy5wYW5lcztOPFIubGVuZ3RoO04rKyl7dmFyIEw9UltOXTtMLnMuZHRQYW5lJiYoXys9TC5nZXRQYW5lQ291bnQoKSxMLnMuZHRQYW5lLnNlYXJjaCgpJiZTKyspfXRoaXMuZG9tLnRpdGxlLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLnRpdGxlIix0aGlzLmMuaTE4bi50aXRsZSxfKSksdGhpcy5jLmZpbHRlckNoYW5nZWQmJnR5cGVvZiB0aGlzLmMuZmlsdGVyQ2hhbmdlZD09ImZ1bmN0aW9uIiYmdGhpcy5jLmZpbHRlckNoYW5nZWQuY2FsbCh0aGlzLnMuZHQsXyksXz09PTAmJlM9PT0wP3RoaXMuZG9tLmNsZWFyQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIik6dGhpcy5kb20uY2xlYXJBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfSx5LnZlcnNpb249IjIuMy4wIix5LmNsYXNzZXM9e2NsZWFyOiJkdHNwLWNsZWFyIixjbGVhckFsbDoiZHRzcC1jbGVhckFsbCIsY29sbGFwc2VBbGw6ImR0c3AtY29sbGFwc2VBbGwiLGNvbnRhaW5lcjoiZHRzcC1zZWFyY2hQYW5lcyIsZGlzYWJsZWRCdXR0b246ImR0c3AtZGlzYWJsZWRCdXR0b24iLGVtcHR5TWVzc2FnZToiZHRzcC1lbXB0eU1lc3NhZ2UiLGhpZGU6ImR0c3AtaGlkZGVuIixwYW5lczoiZHRzcC1wYW5lc0NvbnRhaW5lciIsc2VhcmNoOiJkdHNwLXNlYXJjaCIsc2hvd0FsbDoiZHRzcC1zaG93QWxsIix0aXRsZToiZHRzcC10aXRsZSIsdGl0bGVSb3c6ImR0c3AtdGl0bGVSb3cifSx5LmRlZmF1bHRzPXtjYXNjYWRlUGFuZXM6ITEsY2xlYXI6ITAsY29sbGFwc2U6ITAsY29sdW1uczpbXSxjb250YWluZXI6ZnVuY3Rpb24oXyl7cmV0dXJuIF8udGFibGUoKS5jb250YWluZXIoKX0sZmlsdGVyQ2hhbmdlZDp2b2lkIDAsaTE4bjp7Y2xlYXJNZXNzYWdlOiJDbGVhciBBbGwiLGNsZWFyUGFuZToiJnRpbWVzOyIsY29sbGFwc2U6ezA6IlNlYXJjaFBhbmVzIixfOiJTZWFyY2hQYW5lcyAoJWQpIn0sY29sbGFwc2VNZXNzYWdlOiJDb2xsYXBzZSBBbGwiLGNvdW50OiJ7dG90YWx9IixlbXB0eU1lc3NhZ2U6IjxlbT5ObyBkYXRhPC9lbT4iLGVtcHR5UGFuZXM6Ik5vIFNlYXJjaFBhbmVzIixsb2FkTWVzc2FnZToiTG9hZGluZyBTZWFyY2ggUGFuZXMuLi4iLHNob3dNZXNzYWdlOiJTaG93IEFsbCIsdGl0bGU6IkZpbHRlcnMgQWN0aXZlIC0gJWQifSxsYXlvdXQ6ImF1dG8iLG9yZGVyOltdLHBhbmVzOltdLHByZVNlbGVjdDpbXSx2aWV3Q291bnQ6ITAsdmlld1RvdGFsOiExfSx5fSgpLGM9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciB5PWZ1bmN0aW9uKF8sUyl7cmV0dXJuIHk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKE4sUil7Ti5fX3Byb3RvX189Un18fGZ1bmN0aW9uKE4sUil7Zm9yKHZhciBMIGluIFIpUi5oYXNPd25Qcm9wZXJ0eShMKSYmKE5bTF09UltMXSl9LHkoXyxTKX07cmV0dXJuIGZ1bmN0aW9uKF8sUyl7eShfLFMpO2Z1bmN0aW9uIE4oKXt0aGlzLmNvbnN0cnVjdG9yPV99Xy5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooTi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IE4pfX0oKSx6PWZ1bmN0aW9uKHkpe2MoXyx5KTtmdW5jdGlvbiBfKFMsTixSKXtSPT09dm9pZCAwJiYoUj0hMSk7dmFyIEw9dGhpcyxYO04uY2FzY2FkZVBhbmVzJiZOLnZpZXdUb3RhbD9YPWg6Ti5jYXNjYWRlUGFuZXM/WD13Ok4udmlld1RvdGFsJiYoWD12KSxMPXkuY2FsbCh0aGlzLFMsTixSLFgpfHx0aGlzO3ZhciBqPUwucy5kdCxxPWouc3RhdGUubG9hZGVkKCksYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTC5faW5pdFNlbGVjdGlvbkxpc3RlbmVycyghMCxxJiZxLnNlYXJjaFBhbmVzJiZxLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3Q/cS5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0OkwuYy5wcmVTZWxlY3QpfTtyZXR1cm4gai5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP2F0KCk6ai5vZmYoImluaXQuZHRzcHMiKS5vbigiaW5pdC5kdHNwcyIsYXQpLEx9cmV0dXJuIF8ucHJvdG90eXBlLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzPWZ1bmN0aW9uKFMsTil7Uz09PXZvaWQgMCYmKFM9ITApLE49PT12b2lkIDAmJihOPVtdKSxTJiYodGhpcy5zLnNlbGVjdGlvbkxpc3Q9Tik7Zm9yKHZhciBSPTAsTD10aGlzLnMucGFuZXM7UjxMLmxlbmd0aDtSKyspe3ZhciBYPUxbUl07WC5zLmRpc3BsYXllZCYmWC5zLmR0UGFuZS5vZmYoInNlbGVjdC5kdHNwIikub24oInNlbGVjdC5kdHNwIix0aGlzLl91cGRhdGUoWCkpLm9mZigiZGVzZWxlY3QuZHRzcCIpLm9uKCJkZXNlbGVjdC5kdHNwIix0aGlzLl91cGRhdGVUaW1lb3V0KFgpKX10aGlzLnMuZHQub2ZmKCJkcmF3LmR0c3BzIikub24oImRyYXcuZHRzcHMiLHRoaXMuX3VwZGF0ZSgpKSx0aGlzLl91cGRhdGVTZWxlY3Rpb25MaXN0KCl9LF8ucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXtmb3IodmFyIFM9MCxOPXRoaXMucy5wYW5lcztTPE4ubGVuZ3RoO1MrKyl7dmFyIFI9TltTXTtpZihSLnMuY29sT3B0cy5zaG93KXt2YXIgTD10aGlzLnMuZHQuY29sdW1uKFIucy5pbmRleCkuZGF0YVNyYygpLFg9ITA7aWYodGhpcy5zLnNlcnZlckRhdGEuc2VhcmNoUGFuZXMub3B0aW9uc1tMXSlmb3IodmFyIGo9MCxxPXRoaXMucy5zZXJ2ZXJEYXRhLnNlYXJjaFBhbmVzLm9wdGlvbnNbTF07ajxxLmxlbmd0aDtqKyspe3ZhciBhdD1xW2pdO2lmKGF0LnRvdGFsIT09YXQuY291bnQpe1g9ITE7YnJlYWt9fVIucy5maWx0ZXJpbmdBY3RpdmU9IVgsUi5fc2VydmVyUG9wdWxhdGUodGhpcy5zLnNlcnZlckRhdGEpfX19LF8ucHJvdG90eXBlLl9zdGF0ZUxvYWRMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBTPXRoaXMsTj1mdW5jdGlvbihSLEwsWCl7aWYoWC5zZWFyY2hQYW5lcyE9PXZvaWQgMCl7aWYoUy5zLnNlbGVjdGlvbkxpc3Q9WC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P1guc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxYLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgaj0wLHE9WC5zZWFyY2hQYW5lcy5wYW5lcztqPHEubGVuZ3RoO2orKylmb3IodmFyIGF0PXFbal0sSj0wLHR0PVMucy5wYW5lcztKPHR0Lmxlbmd0aDtKKyspe3ZhciB5dD10dFtKXTthdC5pZD09PXl0LnMuaW5kZXgmJnl0LnMuZHRQYW5lJiYoeXQuZG9tLnNlYXJjaEJveC52YWwoYXQuc2VhcmNoVGVybSkseXQucy5kdFBhbmUub3JkZXIoYXQub3JkZXIpKX1TLl91cGRhdGVTZWxlY3Rpb25MaXN0KCl9fTt0aGlzLnMuZHQub2ZmKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcHMiLE4pLm9uKCJzdGF0ZUxvYWRQYXJhbXMuZHRzcHMiLE4pfSxfLnByb3RvdHlwZS5fdXBkYXRlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7fSxfLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXM7cmV0dXJuIFM9PT12b2lkIDAmJihTPXZvaWQgMCksZnVuY3Rpb24oKXtTJiZjbGVhclRpbWVvdXQoUy5zLmRlc2VsZWN0VGltZW91dCksTi5fdXBkYXRlU2VsZWN0aW9uTGlzdChTKX19LF8ucHJvdG90eXBlLl91cGRhdGVUaW1lb3V0PWZ1bmN0aW9uKFMpe3ZhciBOPXRoaXM7cmV0dXJuIFM9PT12b2lkIDAmJihTPXZvaWQgMCksZnVuY3Rpb24oKXtyZXR1cm4gUz9TLnMuZGVzZWxlY3RUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gTi5fdXBkYXRlU2VsZWN0aW9uTGlzdChTKX0sNTApOk4uX3VwZGF0ZVNlbGVjdGlvbkxpc3QoKX19LF8ucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb25MaXN0PWZ1bmN0aW9uKFMpe2lmKFM9PT12b2lkIDAmJihTPXZvaWQgMCksdGhpcy5zLnBhZ2luZ1NUKXt0aGlzLnMucGFnaW5nU1Q9ITE7cmV0dXJufWVsc2UgaWYodGhpcy5zLnVwZGF0aW5nfHxTJiZTLnMuc2VydmVyU2VsZWN0aW5nKXJldHVybjtpZihTIT09dm9pZCAwKXt0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmUy5fdXBkYXRlU2VsZWN0aW9uKCk7dmFyIE49Uy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubWFwKGZ1bmN0aW9uKFIpe3JldHVybiBSLmZpbHRlcn0pO3RoaXMucy5zZWxlY3Rpb25MaXN0PXRoaXMucy5zZWxlY3Rpb25MaXN0LmZpbHRlcihmdW5jdGlvbihSKXtyZXR1cm4gUi5jb2x1bW4hPT1TLnMuaW5kZXh9KSxOLmxlbmd0aD4wPyh0aGlzLnMuc2VsZWN0aW9uTGlzdC5wdXNoKHtjb2x1bW46Uy5zLmluZGV4LHJvd3M6Tn0pLFMuZG9tLmNsZWFyLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKSk6Uy5kb20uY2xlYXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSx0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLmR0LmRyYXcoITEpfXRoaXMuX3JlbWFrZVNlbGVjdGlvbnMoKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpfSxfLnByb3RvdHlwZS5fcmVtYWtlU2VsZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBTLE47aWYodGhpcy5zLnVwZGF0aW5nPSEwLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt0aGlzLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGg+MCYmKE49dGhpcy5zLnBhbmVzW3RoaXMucy5zZWxlY3Rpb25MaXN0W3RoaXMucy5zZWxlY3Rpb25MaXN0Lmxlbmd0aC0xXS5jb2x1bW5dKTtmb3IodmFyIEN0PTAseHQ9dGhpcy5zLnBhbmVzO0N0PHh0Lmxlbmd0aDtDdCsrKVM9eHRbQ3RdLFMucy5kaXNwbGF5ZWQmJighTnx8Uy5zLmluZGV4IT09Ti5zLmluZGV4KSYmUy51cGRhdGVSb3dzKCl9ZWxzZXt2YXIgUj10aGlzLnMuc2VsZWN0aW9uTGlzdCxMPSExO3RoaXMuY2xlYXJTZWxlY3Rpb25zKCksdGhpcy5zLmR0LmRyYXcoITEpLHRoaXMucy5kdC5yb3dzKCkudG9BcnJheSgpWzBdLmxlbmd0aD50aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLnRvQXJyYXkoKVswXS5sZW5ndGgmJihMPSEwKSx0aGlzLnMuc2VsZWN0aW9uTGlzdD1SO2Zvcih2YXIgWD0wLGo9dGhpcy5zLnBhbmVzO1g8ai5sZW5ndGg7WCsrKU49altYXSxOLnMuZGlzcGxheWVkJiYoTi5zLmZpbHRlcmluZ0FjdGl2ZT1MLE4udXBkYXRlUm93cygpKTtmb3IodmFyIHE9MCxhdD10aGlzLnMuc2VsZWN0aW9uTGlzdDtxPGF0Lmxlbmd0aDtxKyspe3ZhciBKPWF0W3FdO049bnVsbDtmb3IodmFyIHR0PTAseXQ9dGhpcy5zLnBhbmVzO3R0PHl0Lmxlbmd0aDt0dCsrKXt2YXIgVHQ9eXRbdHRdO2lmKFR0LnMuaW5kZXg9PT1KLmNvbHVtbil7Tj1UdDticmVha319aWYoTi5zLmR0UGFuZSl7Zm9yKHZhciBBdD1OLnMuZHRQYW5lLnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLGt0PTA7a3Q8Si5yb3dzLmxlbmd0aDtrdCsrKXtmb3IodmFyIEx0PSExLEJ0PTAsJHQ9QXQ7QnQ8JHQubGVuZ3RoO0J0Kyspe3ZhciBLdD0kdFtCdF0sRD1OLnMuZHRQYW5lLnJvdyhLdCksdXQ9RC5kYXRhKCk7Si5yb3dzW2t0XT09PXV0LmZpbHRlciYmKEQuc2VsZWN0KCksTHQ9ITApfUx0fHwoSi5yb3dzLnNwbGljZShrdCwxKSxrdC0tKX1pZihOLnMuc2VsZWN0aW9ucz1KLnJvd3MsSi5yb3dzLmxlbmd0aCE9PTApe3RoaXMucy5kdC5kcmF3KCk7Zm9yKHZhciBvdD0hMSxIPTAsTT0wLFk9MCxwdD0wLG10PXRoaXMucy5wYW5lcztwdDxtdC5sZW5ndGg7cHQrKylTPW10W3B0XSxTLnMuZHRQYW5lJiYoSCs9Uy5nZXRQYW5lQ291bnQoKSxIPk0mJihZKyssTT1IKSk7b3Q9SD4wO2Zvcih2YXIgcnQ9MCxndD10aGlzLnMucGFuZXM7cnQ8Z3QubGVuZ3RoO3J0KyspUz1ndFtydF0sUy5zLmRpc3BsYXllZCYmKEx8fE4ucy5pbmRleCE9PVMucy5pbmRleHx8IW90P1Mucy5maWx0ZXJpbmdBY3RpdmU9b3R8fEw6WT09PTEmJihTLnMuZmlsdGVyaW5nQWN0aXZlPSExKSxTLnMuaW5kZXghPT1OLnMuaW5kZXgmJlMudXBkYXRlUm93cygpKX19fXRoaXMucy5kdC5kcmF3KCExKX10aGlzLnMudXBkYXRpbmc9ITF9LF99KEIpO3IocWUpLEMocWUpLHAocWUpLFQocWUpLEYocWUpO3ZhciBHPXFlLmZuLmRhdGFUYWJsZTtHLlNlYXJjaFBhbmVzPUIsc3QuU2VhcmNoUGFuZXM9QixHLlNlYXJjaFBhbmVzU1Q9eixzdC5TZWFyY2hQYW5lc1NUPXosRy5TZWFyY2hQYW5lPW4sc3QuU2VhcmNoUGFuZT1uLEcuU2VhcmNoUGFuZVZpZXdUb3RhbD12LHN0LlNlYXJjaFBhbmVWaWV3VG90YWw9dixHLlNlYXJjaFBhbmVDYXNjYWRlPXcsc3QuU2VhcmNoUGFuZUNhc2NhZGU9dyxHLlNlYXJjaFBhbmVDYXNjYWRlVmlld1RvdGFsPWgsc3QuU2VhcmNoUGFuZUNhc2NhZGVWaWV3VG90YWw9aDt2YXIgZXQ9cWUuZm4uZGF0YVRhYmxlLkFwaS5yZWdpc3RlcjtldCgic2VhcmNoUGFuZXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGV0KCJzZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHkpe3kuX3NlYXJjaFBhbmVzJiZ5Ll9zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0pfSksZXQoInNlYXJjaFBhbmVzLnJlYnVpbGRQYW5lKCkiLGZ1bmN0aW9uKHksXyl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihTKXtTLl9zZWFyY2hQYW5lcyYmUy5fc2VhcmNoUGFuZXMucmVidWlsZCh5LF8pfSl9KSxldCgic2VhcmNoUGFuZXMucmVzaXplUGFuZXMoKSIsZnVuY3Rpb24oKXt2YXIgeT10aGlzLmNvbnRleHRbMF07cmV0dXJuIHkuX3NlYXJjaFBhbmVzP3kuX3NlYXJjaFBhbmVzLnJlc2l6ZVBhbmVzKCk6bnVsbH0pLGV0KCJzZWFyY2hQYW5lcy5jb250YWluZXIoKSIsZnVuY3Rpb24oKXt2YXIgeT10aGlzLmNvbnRleHRbMF07cmV0dXJuIHkuX3NlYXJjaFBhbmVzP3kuX3NlYXJjaFBhbmVzLmdldE5vZGUoKTpudWxsfSksc3QuZXh0LmJ1dHRvbnMuc2VhcmNoUGFuZXNDbGVhcj17YWN0aW9uOmZ1bmN0aW9uKHksXyl7Xy5zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0sdGV4dDoiQ2xlYXIgUGFuZXMifSxzdC5leHQuYnV0dG9ucy5zZWFyY2hQYW5lcz17YWN0aW9uOmZ1bmN0aW9uKHksXyxTLE4pe3ZhciBSPXRoaXMsTD10aGlzO04uX3BhbmVzPyh0aGlzLnBvcG92ZXIoTi5fcGFuZXMuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSksTi5fcGFuZXMucmVidWlsZCh2b2lkIDAsITApKToodGhpcy5wcm9jZXNzaW5nKCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RShfLFMsTiksUi5wb3BvdmVyKE4uX3BhbmVzLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pLE4uX3BhbmVzLnJlYnVpbGQodm9pZCAwLCEwKSxxZSgidGFibGUuZGF0YVRhYmxlIixOLl9wYW5lcy5nZXROb2RlKCkpLkRhdGFUYWJsZSgpLmNvbHVtbnMuYWRqdXN0KCksTC5wcm9jZXNzaW5nKCExKX0sMTApKX0saW5pdDpmdW5jdGlvbih5LF8sUyl7eS5idXR0b24oXykudGV4dChTLnRleHR8fHkuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2UiLCJTZWFyY2hQYW5lcyIsMCkpLCh5LmluaXQoKS5zdGF0ZVNhdmV8fFMuZGVsYXlJbml0PT09ITEpJiZFKHksXyxTKX0sY29uZmlnOnt9LHRleHQ6IiIsZGVsYXlJbml0OiEwfTtmdW5jdGlvbiBFKHksXyxTKXt2YXIgTj1xZS5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oTCl7eS5idXR0b24oXykudGV4dCh5LmkxOG4oInNlYXJjaFBhbmVzLmNvbGxhcHNlIix5LmNvbnRleHRbMF0ub0xhbmd1YWdlLnNlYXJjaFBhbmVzIT09dm9pZCAwP3kuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc2VhcmNoUGFuZXMuY29sbGFwc2U6eS5jb250ZXh0WzBdLl9zZWFyY2hQYW5lcy5jLmkxOG4uY29sbGFwc2UsTCkpfX0sUy5jb25maWcpLFI9TiYmKE4uY2FzY2FkZVBhbmVzfHxOLnZpZXdUb3RhbCk/bmV3IHN0LlNlYXJjaFBhbmVzU1QoeSxOKTpuZXcgc3QuU2VhcmNoUGFuZXMoeSxOKTt5LmJ1dHRvbihfKS50ZXh0KFMudGV4dHx8eS5pMThuKCJzZWFyY2hQYW5lcy5jb2xsYXBzZSIsUi5jLmkxOG4uY29sbGFwc2UsMCkpLFMuX3BhbmVzPVJ9ZnVuY3Rpb24gWih5LF8sUyl7Xz09PXZvaWQgMCYmKF89bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpO3ZhciBOPW5ldyBHLkFwaSh5KSxSPV98fE4uaW5pdCgpLnNlYXJjaFBhbmVzfHxHLmRlZmF1bHRzLnNlYXJjaFBhbmVzLEw9UiYmKFIuY2FzY2FkZVBhbmVzfHxSLnZpZXdUb3RhbCk/bmV3IHooTixSLFMpOm5ldyBCKE4sUixTKSxYPUwuZ2V0Tm9kZSgpO3JldHVybiBYfXFlKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbih5LF8pe3kubmFtZXNwYWNlPT09ImR0IiYmKF8ub0luaXQuc2VhcmNoUGFuZXN8fHN0LmRlZmF1bHRzLnNlYXJjaFBhbmVzKSYmKF8uX3NlYXJjaFBhbmVzfHxaKF8sbnVsbCwhMCkpfSksc3QuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlAiLGZuSW5pdDpafSksc3QuZmVhdHVyZSYmc3QuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoUGFuZXMiLFopfSkoKTt2YXIgV2w9aWUoYWUoKSwxKTt2YXIgTXM9aWUoYWUoKSwxKTt2YXIgUnQ9TXMuZGVmYXVsdDtzdC5zZWxlY3Q9e307c3Quc2VsZWN0LnZlcnNpb249IjIuMC4wIjtzdC5zZWxlY3QuaW5pdD1mdW5jdGlvbih0KXt2YXIgZT10LnNldHRpbmdzKClbMF07aWYoIXN0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IFNlbGVjdCByZXF1aXJlcyBEYXRhVGFibGVzIDIgb3IgbmV3ZXIiO2lmKCFlLl9zZWxlY3Qpe3ZhciByPXQuc3RhdGUubG9hZGVkKCksbj1mdW5jdGlvbihGLGgsbyl7aWYoIShvPT09bnVsbHx8by5zZWxlY3Q9PT12b2lkIDApKXtpZih0LnJvd3Moe3NlbGVjdGVkOiEwfSkuYW55KCkmJnQucm93cygpLmRlc2VsZWN0KCksby5zZWxlY3Qucm93cyE9PXZvaWQgMCYmdC5yb3dzKG8uc2VsZWN0LnJvd3MpLnNlbGVjdCgpLHQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5jb2x1bW5zKCkuZGVzZWxlY3QoKSxvLnNlbGVjdC5jb2x1bW5zIT09dm9pZCAwJiZ0LmNvbHVtbnMoby5zZWxlY3QuY29sdW1ucykuc2VsZWN0KCksdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5jZWxscygpLmRlc2VsZWN0KCksby5zZWxlY3QuY2VsbHMhPT12b2lkIDApZm9yKHZhciBmPTA7ZjxvLnNlbGVjdC5jZWxscy5sZW5ndGg7ZisrKXQuY2VsbChvLnNlbGVjdC5jZWxsc1tmXS5yb3csby5zZWxlY3QuY2VsbHNbZl0uY29sdW1uKS5zZWxlY3QoKTt0LnN0YXRlLnNhdmUoKX19O3Qub24oInN0YXRlU2F2ZVBhcmFtcyIsZnVuY3Rpb24oRixoLG8pe28uc2VsZWN0PXt9LG8uc2VsZWN0LnJvd3M9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmlkcyghMCkudG9BcnJheSgpLG8uc2VsZWN0LmNvbHVtbnM9dC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pWzBdLG8uc2VsZWN0LmNlbGxzPXQuY2VsbHMoe3NlbGVjdGVkOiEwfSlbMF0ubWFwKGZ1bmN0aW9uKGYpe3JldHVybntyb3c6dC5yb3coZi5yb3cpLmlkKCEwKSxjb2x1bW46Zi5jb2x1bW59fSl9KS5vbigic3RhdGVMb2FkUGFyYW1zIixuKS5vbmUoImluaXQiLGZ1bmN0aW9uKCl7bih2b2lkIDAsdm9pZCAwLHIpfSk7dmFyIHM9ZS5vSW5pdC5zZWxlY3QsYT1zdC5kZWZhdWx0cy5zZWxlY3QsbD1zPT09dm9pZCAwP2E6cyx1PSJyb3ciLHA9ImFwaSIsdj0hMSxtPSEwLGc9ITAsVD0idGQsIHRoIix3PSJzZWxlY3RlZCIsaz0hMCxQPSExO2UuX3NlbGVjdD17aW5mb0VsczpbXX0sbD09PSEwPyhwPSJvcyIsUD0hMCk6dHlwZW9mIGw9PSJzdHJpbmciPyhwPWwsUD0hMCk6UnQuaXNQbGFpbk9iamVjdChsKSYmKGwuYmx1cmFibGUhPT12b2lkIDAmJih2PWwuYmx1cmFibGUpLGwudG9nZ2xlYWJsZSE9PXZvaWQgMCYmKG09bC50b2dnbGVhYmxlKSxsLmluZm8hPT12b2lkIDAmJihnPWwuaW5mbyksbC5pdGVtcyE9PXZvaWQgMCYmKHU9bC5pdGVtcyksbC5zdHlsZSE9PXZvaWQgMD8ocD1sLnN0eWxlLFA9ITApOihwPSJvcyIsUD0hMCksbC5zZWxlY3RvciE9PXZvaWQgMCYmKFQ9bC5zZWxlY3RvciksbC5jbGFzc05hbWUhPT12b2lkIDAmJih3PWwuY2xhc3NOYW1lKSxsLmhlYWRlckNoZWNrYm94IT09dm9pZCAwJiYoaz1sLmhlYWRlckNoZWNrYm94KSksdC5zZWxlY3Quc2VsZWN0b3IoVCksdC5zZWxlY3QuaXRlbXModSksdC5zZWxlY3Quc3R5bGUocCksdC5zZWxlY3QuYmx1cmFibGUodiksdC5zZWxlY3QudG9nZ2xlYWJsZShtKSx0LnNlbGVjdC5pbmZvKGcpLGUuX3NlbGVjdC5jbGFzc05hbWU9dywhUCYmUnQodC50YWJsZSgpLm5vZGUoKSkuaGFzQ2xhc3MoInNlbGVjdGFibGUiKSYmdC5zZWxlY3Quc3R5bGUoIm9zIiksayYmKHpzKHQpLHQub24oImluaXQiLGZ1bmN0aW9uKCl7enModCl9KSl9fTtmdW5jdGlvbiBScyh0LGUscil7dmFyIG4scyxhLGw9ZnVuY3Rpb24ocCx2KXtpZihwPnYpe3ZhciBtPXY7dj1wLHA9bX12YXIgZz0hMTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmluZGV4ZXMoKS5maWx0ZXIoZnVuY3Rpb24oVCl7cmV0dXJuIFQ9PT1wJiYoZz0hMCksVD09PXY/KGc9ITEsITApOmd9KX0sdT1mdW5jdGlvbihwLHYpe3ZhciBtPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKTtpZihtLmluZGV4T2YocCk+bS5pbmRleE9mKHYpKXt2YXIgZz12O3Y9cCxwPWd9dmFyIFQ9ITE7cmV0dXJuIG0uZmlsdGVyKGZ1bmN0aW9uKHcpe3JldHVybiB3PT09cCYmKFQ9ITApLHc9PT12PyhUPSExLCEwKTpUfSl9OyF0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiYhcj8ocz1sKDAsZS5jb2x1bW4pLGE9dSgwLGUucm93KSk6KHM9bChyLmNvbHVtbixlLmNvbHVtbiksYT11KHIucm93LGUucm93KSksbj10LmNlbGxzKGEscykuZmxhdHRlbigpLHQuY2VsbHMoZSx7c2VsZWN0ZWQ6ITB9KS5hbnkoKT90LmNlbGxzKG4pLmRlc2VsZWN0KCk6dC5jZWxscyhuKS5zZWxlY3QoKX1mdW5jdGlvbiBXaSh0KXt2YXIgZT10LnNldHRpbmdzKClbMF0scj1lLl9zZWxlY3Quc2VsZWN0b3I7UnQodC50YWJsZSgpLmNvbnRhaW5lcigpKS5vZmYoIm1vdXNlZG93bi5kdFNlbGVjdCIscikub2ZmKCJtb3VzZXVwLmR0U2VsZWN0IixyKS5vZmYoImNsaWNrLmR0U2VsZWN0IixyKSxSdCgiYm9keSIpLm9mZigiY2xpY2suZHRTZWxlY3QiK1VpKHQudGFibGUoKS5ub2RlKCkpKX1mdW5jdGlvbiBWcyh0KXt2YXIgZT1SdCh0LnRhYmxlKCkuY29udGFpbmVyKCkpLHI9dC5zZXR0aW5ncygpWzBdLG49ci5fc2VsZWN0LnNlbGVjdG9yLHM7ZS5vbigibW91c2Vkb3duLmR0U2VsZWN0IixuLGZ1bmN0aW9uKGEpeyhhLnNoaWZ0S2V5fHxhLm1ldGFLZXl8fGEuY3RybEtleSkmJmUuY3NzKCItbW96LXVzZXItc2VsZWN0Iiwibm9uZSIpLm9uZSgic2VsZWN0c3RhcnQuZHRTZWxlY3QiLG4sZnVuY3Rpb24oKXtyZXR1cm4hMX0pLHdpbmRvdy5nZXRTZWxlY3Rpb24mJihzPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSl9KS5vbigibW91c2V1cC5kdFNlbGVjdCIsbixmdW5jdGlvbigpe2UuY3NzKCItbW96LXVzZXItc2VsZWN0IiwiIil9KS5vbigiY2xpY2suZHRTZWxlY3QiLG4sZnVuY3Rpb24oYSl7dmFyIGw9dC5zZWxlY3QuaXRlbXMoKSx1O2lmKHMpe3ZhciBwPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZigoIXAuYW5jaG9yTm9kZXx8UnQocC5hbmNob3JOb2RlKS5jbG9zZXN0KCJ0YWJsZSIpWzBdPT09dC50YWJsZSgpLm5vZGUoKSkmJnAhPT1zKXJldHVybn12YXIgdj10LnNldHRpbmdzKClbMF0sbT10LnRhYmxlKCkuY29udGFpbmVyKCk7aWYoUnQoYS50YXJnZXQpLmNsb3Nlc3QoImRpdi5kdC1jb250YWluZXIiKVswXT09bSl7dmFyIGc9dC5jZWxsKFJ0KGEudGFyZ2V0KS5jbG9zZXN0KCJ0ZCwgdGgiKSk7aWYoZy5hbnkoKSl7dmFyIFQ9UnQuRXZlbnQoInVzZXItc2VsZWN0LmR0Iik7aWYoR2UodCxULFtsLGcsYV0pLCFULmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgdz1nLmluZGV4KCk7bD09PSJyb3ciPyh1PXcucm93LE1pKGEsdCx2LCJyb3ciLHUpKTpsPT09ImNvbHVtbiI/KHU9Zy5pbmRleCgpLmNvbHVtbixNaShhLHQsdiwiY29sdW1uIix1KSk6bD09PSJjZWxsIiYmKHU9Zy5pbmRleCgpLE1pKGEsdCx2LCJjZWxsIix1KSksdi5fc2VsZWN0X2xhc3RDZWxsPXd9fX19KSxSdCgiYm9keSIpLm9uKCJjbGljay5kdFNlbGVjdCIrVWkodC50YWJsZSgpLm5vZGUoKSksZnVuY3Rpb24oYSl7aWYoci5fc2VsZWN0LmJsdXJhYmxlKXtpZihSdChhLnRhcmdldCkucGFyZW50cygpLmZpbHRlcih0LnRhYmxlKCkuY29udGFpbmVyKCkpLmxlbmd0aHx8UnQoYS50YXJnZXQpLnBhcmVudHMoImh0bWwiKS5sZW5ndGg9PT0wfHxSdChhLnRhcmdldCkucGFyZW50cygiZGl2LkRURSIpLmxlbmd0aClyZXR1cm47dmFyIGw9UnQuRXZlbnQoInNlbGVjdC1ibHVyLmR0Iik7aWYoR2UodCxsLFthLnRhcmdldCxhXSksbC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47SnIociwhMCl9fSl9ZnVuY3Rpb24gR2UodCxlLHIsbil7biYmIXQuZmxhdHRlbigpLmxlbmd0aHx8KHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9ZSsiLmR0Iiksci51bnNoaWZ0KHQpLFJ0KHQudGFibGUoKS5ub2RlKCkpLnRyaWdnZXIoZSxyKSl9ZnVuY3Rpb24gTHModCxlKXtpZighKHQuc2VsZWN0LnN0eWxlKCk9PT0iYXBpInx8dC5zZWxlY3QuaW5mbygpPT09ITEpKXt2YXIgcj10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCxuPXQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLGE9ZnVuY3Rpb24odixtLGcpe3YuYXBwZW5kKFJ0KCc8c3BhbiBjbGFzcz0ic2VsZWN0LWl0ZW0iLz4nKS5hcHBlbmQodC5pMThuKCJzZWxlY3QuIittKyJzIix7XzoiJWQgIittKyJzIHNlbGVjdGVkIiwwOiIiLDE6IjEgIittKyIgc2VsZWN0ZWQifSxnKSkpfSxsPVJ0KGUpLHU9UnQoJzxzcGFuIGNsYXNzPSJzZWxlY3QtaW5mbyIvPicpO2EodSwicm93IixyKSxhKHUsImNvbHVtbiIsbiksYSh1LCJjZWxsIixzKTt2YXIgcD1sLmNoaWxkcmVuKCJzcGFuLnNlbGVjdC1pbmZvIik7cC5sZW5ndGgmJnAucmVtb3ZlKCksdS50ZXh0KCkhPT0iIiYmbC5hcHBlbmQodSl9fWZ1bmN0aW9uIHpzKHQpe3QuY29sdW1ucygiLmR0LXNlbGVjdCIpLmV2ZXJ5KGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWFkZXIoKTtpZighUnQoImlucHV0IixlKS5sZW5ndGgpe3ZhciByPVJ0KCI8aW5wdXQ+IikuYXR0cih7Y2xhc3M6ImR0LXNlbGVjdC1jaGVja2JveCIsdHlwZToiY2hlY2tib3giLCJhcmlhLWxhYmVsIjp0LmkxOG4oInNlbGVjdC5hcmlhLmhlYWRlckNoZWNrYm94Iil8fCJTZWxlY3QgYWxsIHJvd3MifSkuYXBwZW5kVG8oZSkub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ/dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKG4pe24uc3RvcFByb3BhZ2F0aW9uKCl9KTt0Lm9uKCJkcmF3IHNlbGVjdCBkZXNlbGVjdCIsZnVuY3Rpb24obixzLGEpe2lmKGE9PT0icm93Inx8IWEpe3ZhciBsPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5jb3VudCgpLHU9dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQiLHNlbGVjdGVkOiEwfSkuY291bnQoKSxwPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmNvdW50KCk7dSYmdTw9bCYmdT09PXA/ci5wcm9wKCJjaGVja2VkIiwhMCkucHJvcCgiaW5kZXRlcm1pbmF0ZSIsITEpOnU9PT0wJiZsPT09MD9yLnByb3AoImNoZWNrZWQiLCExKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMSk6ci5wcm9wKCJjaGVja2VkIiwhMSkucHJvcCgiaW5kZXRlcm1pbmF0ZSIsITApfX0pfX0pfWZ1bmN0aW9uIFZsKHQpe3ZhciBlPW5ldyBzdC5BcGkodCk7dC5fc2VsZWN0X2luaXQ9ITAsdC5hb1Jvd0NyZWF0ZWRDYWxsYmFjay5wdXNoKGZ1bmN0aW9uKHIsbixzKXt2YXIgYSxsLHU9dC5hb0RhdGFbc107Zm9yKHUuX3NlbGVjdF9zZWxlY3RlZCYmUnQocikuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSksYT0wLGw9dC5hb0NvbHVtbnMubGVuZ3RoO2E8bDthKyspKHQuYW9Db2x1bW5zW2FdLl9zZWxlY3Rfc2VsZWN0ZWR8fHUuX3NlbGVjdGVkX2NlbGxzJiZ1Ll9zZWxlY3RlZF9jZWxsc1thXSkmJlJ0KHUuYW5DZWxsc1thXSkuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSl9KSxlLm9uKCJwcmVYaHIuZHQuZHRTZWxlY3QiLGZ1bmN0aW9uKHIsbil7aWYobj09PWUuc2V0dGluZ3MoKVswXSl7dmFyIHM9ZS5yb3dzKHtzZWxlY3RlZDohMH0pLmlkcyghMCkuZmlsdGVyKGZ1bmN0aW9uKGwpe3JldHVybiBsIT09dm9pZCAwfSksYT1lLmNlbGxzKHtzZWxlY3RlZDohMH0pLmVxKDApLm1hcChmdW5jdGlvbihsKXt2YXIgdT1lLnJvdyhsLnJvdykuaWQoITApO3JldHVybiB1P3tyb3c6dSxjb2x1bW46bC5jb2x1bW59OnZvaWQgMH0pLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gbCE9PXZvaWQgMH0pO2Uub25lKCJkcmF3LmR0LmR0U2VsZWN0IixmdW5jdGlvbigpe2Uucm93cyhzKS5zZWxlY3QoKSxhLmFueSgpJiZhLmVhY2goZnVuY3Rpb24obCl7ZS5jZWxscyhsLnJvdyxsLmNvbHVtbikuc2VsZWN0KCl9KX0pfX0pLGUub24oImluZm8uZHQiLGZ1bmN0aW9uKHIsbixzKXtuLl9zZWxlY3QuaW5mb0Vscy5pbmNsdWRlcyhzKXx8bi5fc2VsZWN0LmluZm9FbHMucHVzaChzKSxMcyhlLHMpfSksZS5vbigic2VsZWN0LmR0U2VsZWN0LmR0IGRlc2VsZWN0LmR0U2VsZWN0LmR0IixmdW5jdGlvbigpe3QuX3NlbGVjdC5pbmZvRWxzLmZvckVhY2goZnVuY3Rpb24ocil7THMoZSxyKX0pLGUuc3RhdGUuc2F2ZSgpfSksZS5vbigiZGVzdHJveS5kdFNlbGVjdCIsZnVuY3Rpb24oKXtSdChlLnJvd3Moe3NlbGVjdGVkOiEwfSkubm9kZXMoKSkucmVtb3ZlQ2xhc3MoZS5zZXR0aW5ncygpWzBdLl9zZWxlY3QuY2xhc3NOYW1lKSxXaShlKSxlLm9mZigiLmR0U2VsZWN0IiksUnQoImJvZHkiKS5vZmYoIi5kdFNlbGVjdCIrVWkoZS50YWJsZSgpLm5vZGUoKSkpfSl9ZnVuY3Rpb24ganModCxlLHIsbil7dmFyIHM9dFtlKyJzIl0oe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCksYT1zLmluZGV4T2YobiksbD1zLmluZGV4T2Yocik7aWYoIXRbZSsicyJdKHtzZWxlY3RlZDohMH0pLmFueSgpJiZhPT09LTEpcy5zcGxpY2Uocy5pbmRleE9mKHIpKzEscy5sZW5ndGgpO2Vsc2V7aWYoYT5sKXt2YXIgdT1sO2w9YSxhPXV9cy5zcGxpY2UobCsxLHMubGVuZ3RoKSxzLnNwbGljZSgwLGEpfXRbZV0ocix7c2VsZWN0ZWQ6ITB9KS5hbnkoKT8ocy5zcGxpY2Uocy5pbmRleE9mKHIpLDEpLHRbZSsicyJdKHMpLmRlc2VsZWN0KCkpOnRbZSsicyJdKHMpLnNlbGVjdCgpfWZ1bmN0aW9uIEpyKHQsZSl7aWYoZXx8dC5fc2VsZWN0LnN0eWxlPT09InNpbmdsZSIpe3ZhciByPW5ldyBzdC5BcGkodCk7ci5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCksci5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCksci5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpfX1mdW5jdGlvbiBNaSh0LGUscixuLHMpe3ZhciBhPWUuc2VsZWN0LnN0eWxlKCksbD1lLnNlbGVjdC50b2dnbGVhYmxlKCksdT1lW25dKHMse3NlbGVjdGVkOiEwfSkuYW55KCk7aWYoISh1JiYhbCkpaWYoYT09PSJvcyIpaWYodC5jdHJsS2V5fHx0Lm1ldGFLZXkpZVtuXShzKS5zZWxlY3QoIXUpO2Vsc2UgaWYodC5zaGlmdEtleSluPT09ImNlbGwiP1JzKGUscyxyLl9zZWxlY3RfbGFzdENlbGx8fG51bGwpOmpzKGUsbixzLHIuX3NlbGVjdF9sYXN0Q2VsbD9yLl9zZWxlY3RfbGFzdENlbGxbbl06bnVsbCk7ZWxzZXt2YXIgcD1lW24rInMiXSh7c2VsZWN0ZWQ6ITB9KTt1JiZwLmZsYXR0ZW4oKS5sZW5ndGg9PT0xP2Vbbl0ocykuZGVzZWxlY3QoKToocC5kZXNlbGVjdCgpLGVbbl0ocykuc2VsZWN0KCkpfWVsc2UgYT09Im11bHRpK3NoaWZ0IiYmdC5zaGlmdEtleT9uPT09ImNlbGwiP1JzKGUscyxyLl9zZWxlY3RfbGFzdENlbGx8fG51bGwpOmpzKGUsbixzLHIuX3NlbGVjdF9sYXN0Q2VsbD9yLl9zZWxlY3RfbGFzdENlbGxbbl06bnVsbCk6ZVtuXShzKS5zZWxlY3QoIXUpfWZ1bmN0aW9uIFVpKHQpe3JldHVybiB0LmlkLnJlcGxhY2UoL1teYS16QS1aMC05XC1cX10vZywiLSIpfVJ0LmVhY2goW3t0eXBlOiJyb3ciLHByb3A6ImFvRGF0YSJ9LHt0eXBlOiJjb2x1bW4iLHByb3A6ImFvQ29sdW1ucyJ9XSxmdW5jdGlvbih0LGUpe3N0LmV4dC5zZWxlY3RvcltlLnR5cGVdLnB1c2goZnVuY3Rpb24ocixuLHMpe3ZhciBhPW4uc2VsZWN0ZWQsbCx1PVtdO2lmKGEhPT0hMCYmYSE9PSExKXJldHVybiBzO2Zvcih2YXIgcD0wLHY9cy5sZW5ndGg7cDx2O3ArKylsPXJbZS5wcm9wXVtzW3BdXSxsJiYoYT09PSEwJiZsLl9zZWxlY3Rfc2VsZWN0ZWQ9PT0hMHx8YT09PSExJiYhbC5fc2VsZWN0X3NlbGVjdGVkKSYmdS5wdXNoKHNbcF0pO3JldHVybiB1fSl9KTtzdC5leHQuc2VsZWN0b3IuY2VsbC5wdXNoKGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLnNlbGVjdGVkLHMsYT1bXTtpZihuPT09dm9pZCAwKXJldHVybiByO2Zvcih2YXIgbD0wLHU9ci5sZW5ndGg7bDx1O2wrKylzPXQuYW9EYXRhW3JbbF0ucm93XSxzJiYobj09PSEwJiZzLl9zZWxlY3RlZF9jZWxscyYmcy5fc2VsZWN0ZWRfY2VsbHNbcltsXS5jb2x1bW5dPT09ITB8fG49PT0hMSYmKCFzLl9zZWxlY3RlZF9jZWxsc3x8IXMuX3NlbGVjdGVkX2NlbGxzW3JbbF0uY29sdW1uXSkpJiZhLnB1c2gocltsXSk7cmV0dXJuIGF9KTt2YXIgemU9c3QuQXBpLnJlZ2lzdGVyLEVyPXN0LkFwaS5yZWdpc3RlclBsdXJhbDt6ZSgic2VsZWN0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtzdC5zZWxlY3QuaW5pdChuZXcgc3QuQXBpKHQpKX0pfSk7emUoInNlbGVjdC5ibHVyYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5ibHVyYWJsZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0LmJsdXJhYmxlPXR9KX0pO3plKCJzZWxlY3QudG9nZ2xlYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC50b2dnbGVhYmxlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QudG9nZ2xlYWJsZT10fSl9KTt6ZSgic2VsZWN0LmluZm8oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3QuaW5mbzp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0LmluZm89dH0pfSk7emUoInNlbGVjdC5pdGVtcygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5pdGVtczp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0Lml0ZW1zPXQsR2UobmV3IHN0LkFwaShlKSwic2VsZWN0SXRlbXMiLFt0XSl9KX0pO3plKCJzZWxlY3Quc3R5bGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5jb250ZXh0WzBdLl9zZWxlY3Quc3R5bGU6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdHx8c3Quc2VsZWN0LmluaXQobmV3IHN0LkFwaShlKSksZS5fc2VsZWN0X2luaXR8fFZsKGUpLGUuX3NlbGVjdC5zdHlsZT10O3ZhciByPW5ldyBzdC5BcGkoZSk7V2kociksdCE9PSJhcGkiJiZWcyhyKSxHZShuZXcgc3QuQXBpKGUpLCJzZWxlY3RTdHlsZSIsW3RdKX0pfSk7emUoInNlbGVjdC5zZWxlY3RvcigpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5zZWxlY3Rvcjp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7V2kobmV3IHN0LkFwaShlKSksZS5fc2VsZWN0LnNlbGVjdG9yPXQsZS5fc2VsZWN0LnN0eWxlIT09ImFwaSImJlZzKG5ldyBzdC5BcGkoZSkpfSl9KTt6ZSgic2VsZWN0Lmxhc3QoKSIsZnVuY3Rpb24odCl7bGV0IGU9dGhpcy5jb250ZXh0WzBdO3JldHVybiB0PyhlLl9zZWxlY3RfbGFzdENlbGw9dCx0aGlzKTplLl9zZWxlY3RfbGFzdENlbGx9KTtFcigicm93cygpLnNlbGVjdCgpIiwicm93KCkuc2VsZWN0KCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQ9PT0hMT90aGlzLmRlc2VsZWN0KCk6KHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24ocixuKXtKcihyKTt2YXIgcz1yLmFvRGF0YVtuXSxhPXIuYW9Db2x1bW5zO1J0KHMublRyKS5hZGRDbGFzcyhyLl9zZWxlY3QuY2xhc3NOYW1lKSxzLl9zZWxlY3Rfc2VsZWN0ZWQ9ITA7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDtsKyspe3ZhciB1PWFbbF07dS5zVHlwZT09PSJzZWxlY3QtY2hlY2tib3giJiYoUnQoImlucHV0LmR0LXNlbGVjdC1jaGVja2JveCIscy5hbkNlbGxzW2xdKS5wcm9wKCJjaGVja2VkIiwhMCkscy5fYVNvcnREYXRhW2xdPW51bGwpfX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyLG4pe0dlKGUsInNlbGVjdCIsWyJyb3ciLGVbbl1dLCEwKX0pLHRoaXMpfSk7emUoInJvdygpLnNlbGVjdGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdO3JldHVybiEhKHQmJnRoaXMubGVuZ3RoJiZ0LmFvRGF0YVt0aGlzWzBdXSYmdC5hb0RhdGFbdGhpc1swXV0uX3NlbGVjdF9zZWxlY3RlZCl9KTtFcigiY29sdW1ucygpLnNlbGVjdCgpIiwiY29sdW1uKCkuc2VsZWN0KCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQ9PT0hMT90aGlzLmRlc2VsZWN0KCk6KHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocixuKXtKcihyKSxyLmFvQ29sdW1uc1tuXS5fc2VsZWN0X3NlbGVjdGVkPSEwO3ZhciBzPW5ldyBzdC5BcGkocikuY29sdW1uKG4pO1J0KHMuaGVhZGVyKCkpLmFkZENsYXNzKHIuX3NlbGVjdC5jbGFzc05hbWUpLFJ0KHMuZm9vdGVyKCkpLmFkZENsYXNzKHIuX3NlbGVjdC5jbGFzc05hbWUpLHMubm9kZXMoKS50byQoKS5hZGRDbGFzcyhyLl9zZWxlY3QuY2xhc3NOYW1lKX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyLG4pe0dlKGUsInNlbGVjdCIsWyJjb2x1bW4iLGVbbl1dLCEwKX0pLHRoaXMpfSk7emUoImNvbHVtbigpLnNlbGVjdGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdO3JldHVybiEhKHQmJnRoaXMubGVuZ3RoJiZ0LmFvQ29sdW1uc1t0aGlzWzBdXSYmdC5hb0NvbHVtbnNbdGhpc1swXV0uX3NlbGVjdF9zZWxlY3RlZCl9KTtFcigiY2VsbHMoKS5zZWxlY3QoKSIsImNlbGwoKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24ocixuLHMpe0pyKHIpO3ZhciBhPXIuYW9EYXRhW25dO2EuX3NlbGVjdGVkX2NlbGxzPT09dm9pZCAwJiYoYS5fc2VsZWN0ZWRfY2VsbHM9W10pLGEuX3NlbGVjdGVkX2NlbGxzW3NdPSEwLGEuYW5DZWxscyYmUnQoYS5hbkNlbGxzW3NdKS5hZGRDbGFzcyhyLl9zZWxlY3QuY2xhc3NOYW1lKX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyLG4pe0dlKGUsInNlbGVjdCIsWyJjZWxsIixlLmNlbGxzKGVbbl0pLmluZGV4ZXMoKS50b0FycmF5KCldLCEwKX0pLHRoaXMpfSk7emUoImNlbGwoKS5zZWxlY3RlZCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dFswXTtpZih0JiZ0aGlzLmxlbmd0aCl7dmFyIGU9dC5hb0RhdGFbdGhpc1swXVswXS5yb3ddO2lmKGUmJmUuX3NlbGVjdGVkX2NlbGxzJiZlLl9zZWxlY3RlZF9jZWxsc1t0aGlzWzBdWzBdLmNvbHVtbl0pcmV0dXJuITB9cmV0dXJuITF9KTtFcigicm93cygpLmRlc2VsZWN0KCkiLCJyb3coKS5kZXNlbGVjdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmFvRGF0YVtyXSxzPWUuYW9Db2x1bW5zO1J0KG4ublRyKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxuLl9zZWxlY3Rfc2VsZWN0ZWQ9ITEsZS5fc2VsZWN0X2xhc3RDZWxsPW51bGw7Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspe3ZhciBsPXNbYV07bC5zVHlwZT09PSJzZWxlY3QtY2hlY2tib3giJiYoUnQoImlucHV0LmR0LXNlbGVjdC1jaGVja2JveCIsbi5hbkNlbGxzW2FdKS5wcm9wKCJjaGVja2VkIiwhMSksbi5fYVNvcnREYXRhW2FdPW51bGwpfX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbInJvdyIsdFtyXV0sITApfSksdGhpc30pO0VyKCJjb2x1bW5zKCkuZGVzZWxlY3QoKSIsImNvbHVtbigpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihlLHIpe2UuYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQ9ITE7dmFyIG49bmV3IHN0LkFwaShlKSxzPW4uY29sdW1uKHIpO1J0KHMuaGVhZGVyKCkpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLFJ0KHMuZm9vdGVyKCkpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLG4uY2VsbHMobnVsbCxyKS5pbmRleGVzKCkuZWFjaChmdW5jdGlvbihhKXt2YXIgbD1lLmFvRGF0YVthLnJvd10sdT1sLl9zZWxlY3RlZF9jZWxscztsLmFuQ2VsbHMmJighdXx8IXVbYS5jb2x1bW5dKSYmUnQobC5hbkNlbGxzW2EuY29sdW1uXSkucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSl9KX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbImNvbHVtbiIsdFtyXV0sITApfSksdGhpc30pO0VyKCJjZWxscygpLmRlc2VsZWN0KCkiLCJjZWxsKCkuZGVzZWxlY3QoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLHIsbil7dmFyIHM9ZS5hb0RhdGFbcl07cy5fc2VsZWN0ZWRfY2VsbHMhPT12b2lkIDAmJihzLl9zZWxlY3RlZF9jZWxsc1tuXT0hMSkscy5hbkNlbGxzJiYhZS5hb0NvbHVtbnNbbl0uX3NlbGVjdF9zZWxlY3RlZCYmUnQocy5hbkNlbGxzW25dKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKX0pLHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlLHIpe0dlKHQsImRlc2VsZWN0IixbImNlbGwiLHRbcl1dLCEwKX0pLHRoaXN9KTtmdW5jdGlvbiBPcih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gci5pMThuKCJidXR0b25zLiIrdCxlKX19ZnVuY3Rpb24gVmkodCl7dmFyIGU9dC5fZXZlbnROYW1lc3BhY2U7cmV0dXJuImRyYXcuZHQuRFQiK2UrIiBzZWxlY3QuZHQuRFQiK2UrIiBkZXNlbGVjdC5kdC5EVCIrZX1mdW5jdGlvbiBIbCh0LGUpe3JldHVybiEhKGUubGltaXRUby5pbmRleE9mKCJyb3dzIikhPT0tMSYmdC5yb3dzKHtzZWxlY3RlZDohMH0pLmFueSgpfHxlLmxpbWl0VG8uaW5kZXhPZigiY29sdW1ucyIpIT09LTEmJnQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKXx8ZS5saW1pdFRvLmluZGV4T2YoImNlbGxzIikhPT0tMSYmdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSl9dmFyIEhpPTA7UnQuZXh0ZW5kKHN0LmV4dC5idXR0b25zLHtzZWxlY3RlZDp7dGV4dDpPcigic2VsZWN0ZWQiLCJTZWxlY3RlZCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3RlZCIsbGltaXRUbzpbInJvd3MiLCJjb2x1bW5zIiwiY2VsbHMiXSxpbml0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzO3IuX2V2ZW50TmFtZXNwYWNlPSIuc2VsZWN0IitIaSsrLHQub24oVmkociksZnVuY3Rpb24oKXtuLmVuYWJsZShIbCh0LHIpKX0pLHRoaXMuZGlzYWJsZSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQsZSxyKXt0Lm9mZihyLl9ldmVudE5hbWVzcGFjZSl9fSxzZWxlY3RlZFNpbmdsZTp7dGV4dDpPcigic2VsZWN0ZWRTaW5nbGUiLCJTZWxlY3RlZCBzaW5nbGUiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0ZWQtc2luZ2xlIixpbml0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzO3IuX2V2ZW50TmFtZXNwYWNlPSIuc2VsZWN0IitIaSsrLHQub24oVmkociksZnVuY3Rpb24oKXt2YXIgcz10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCt0LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCt0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGg7bi5lbmFibGUocz09PTEpfSksdGhpcy5kaXNhYmxlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCxlLHIpe3Qub2ZmKHIuX2V2ZW50TmFtZXNwYWNlKX19LHNlbGVjdEFsbDp7dGV4dDpPcigic2VsZWN0QWxsIiwiU2VsZWN0IGFsbCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3QtYWxsIixhY3Rpb246ZnVuY3Rpb24odCxlLHIsbil7dmFyIHM9dGhpcy5zZWxlY3QuaXRlbXMoKSxhPW4uc2VsZWN0b3JNb2RpZmllcjthPyh0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKGE9YS5jYWxsKGUsdCxlLHIsbikpLHRoaXNbcysicyJdKGEpLnNlbGVjdCgpKTp0aGlzW3MrInMiXSgpLnNlbGVjdCgpfX0sc2VsZWN0Tm9uZTp7dGV4dDpPcigic2VsZWN0Tm9uZSIsIkRlc2VsZWN0IGFsbCIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3Qtbm9uZSIsYWN0aW9uOmZ1bmN0aW9uKCl7SnIodGhpcy5zZXR0aW5ncygpWzBdLCEwKX0saW5pdDpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcztyLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrSGkrKyx0Lm9uKFZpKHIpLGZ1bmN0aW9uKCl7dmFyIHM9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoO24uZW5hYmxlKHM+MCl9KSx0aGlzLmRpc2FibGUoKX0sZGVzdHJveTpmdW5jdGlvbih0LGUscil7dC5vZmYoci5fZXZlbnROYW1lc3BhY2UpfX0sc2hvd1NlbGVjdGVkOnt0ZXh0Ok9yKCJzaG93U2VsZWN0ZWQiLCJTaG93IG9ubHkgc2VsZWN0ZWQiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2hvdy1zZWxlY3RlZCIsYWN0aW9uOmZ1bmN0aW9uKHQsZSl7aWYoZS5zZWFyY2guZml4ZWQoImR0LXNlbGVjdCIpKWUuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiLG51bGwpLHRoaXMuYWN0aXZlKCExKTtlbHNle3ZhciByPWUuc2V0dGluZ3MoKVswXS5hb0RhdGE7ZS5zZWFyY2guZml4ZWQoImR0LXNlbGVjdCIsZnVuY3Rpb24obixzLGEpe3JldHVybiByW2FdLl9zZWxlY3Rfc2VsZWN0ZWR9KSx0aGlzLmFjdGl2ZSghMCl9ZS5kcmF3KCl9fX0pO1J0LmVhY2goWyJSb3ciLCJDb2x1bW4iLCJDZWxsIl0sZnVuY3Rpb24odCxlKXt2YXIgcj1lLnRvTG93ZXJDYXNlKCk7c3QuZXh0LmJ1dHRvbnNbInNlbGVjdCIrZSsicyJdPXt0ZXh0Ok9yKCJzZWxlY3QiK2UrInMiLCJTZWxlY3QgIityKyJzIiksY2xhc3NOYW1lOiJidXR0b25zLXNlbGVjdC0iK3IrInMiLGFjdGlvbjpmdW5jdGlvbigpe3RoaXMuc2VsZWN0Lml0ZW1zKHIpfSxpbml0OmZ1bmN0aW9uKG4pe3ZhciBzPXRoaXM7bi5vbigic2VsZWN0SXRlbXMuZHQuRFQiLGZ1bmN0aW9uKGEsbCx1KXtzLmFjdGl2ZSh1PT09cil9KX19fSk7c3QudHlwZSgic2VsZWN0LWNoZWNrYm94Iix7Y2xhc3NOYW1lOiJkdC1zZWxlY3QiLGRldGVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSJzZWxlY3QtY2hlY2tib3giP3Q6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0iWCI/LTE6MH19fSk7UnQuZXh0ZW5kKCEwLHN0LmRlZmF1bHRzLm9MYW5ndWFnZSx7c2VsZWN0OnthcmlhOntyb3dDaGVja2JveDoiU2VsZWN0IHJvdyJ9fX0pO3N0LnJlbmRlci5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgcj10P3N0LnV0aWwuZ2V0KHQpOm51bGwsbj1lP3N0LnV0aWwuZ2V0KGUpOm51bGw7cmV0dXJuIGZ1bmN0aW9uKHMsYSxsLHUpe3ZhciBwPXUuc2V0dGluZ3MuYW9EYXRhW3Uucm93XSx2PXAuX3NlbGVjdF9zZWxlY3RlZCxtPXUuc2V0dGluZ3Mub0xhbmd1YWdlLnNlbGVjdC5hcmlhLnJvd0NoZWNrYm94O3JldHVybiBhPT09ImRpc3BsYXkiP1J0KCI8aW5wdXQ+IikuYXR0cih7ImFyaWEtbGFiZWwiOm0sY2xhc3M6ImR0LXNlbGVjdC1jaGVja2JveCIsbmFtZTpuP24obCk6bnVsbCx0eXBlOiJjaGVja2JveCIsdmFsdWU6cj9yKGwpOm51bGwsY2hlY2tlZDp2fSlbMF06YT09PSJ0eXBlIj8ic2VsZWN0LWNoZWNrYm94IjphPT09ImZpbHRlciI/IiI6dj8iWCI6IiJ9fTtzdC5leHQub3JkZXJbInNlbGVjdC1jaGVja2JveCJdPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYXBpKCkuY29sdW1uKGUse29yZGVyOiJpbmRleCJ9KS5ub2RlcygpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gdC5fc2VsZWN0Lml0ZW1zPT09InJvdyI/UnQocikucGFyZW50KCkuaGFzQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSk6dC5fc2VsZWN0Lml0ZW1zPT09ImNlbGwiP1J0KHIpLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpOiExfSl9O1J0LmZuLkRhdGFUYWJsZS5zZWxlY3Q9c3Quc2VsZWN0O1J0KGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdFNlbGVjdCIsZnVuY3Rpb24odCxlKXt0Lm5hbWVzcGFjZT09PSJkdCImJnN0LnNlbGVjdC5pbml0KG5ldyBzdC5BcGkoZSkpfSk7S2UuQnV0dG9ucy5qc3ppcChIcy5kZWZhdWx0KTt2YXIgZXhwb3J0X2pRdWVyeT1VbC5kZWZhdWx0O2V4cG9ydHtLZSBhcyBEYXRhVGFibGUsZXhwb3J0X2pRdWVyeSBhcyBqUXVlcnl9OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKanN6aXAvZGlzdC9qc3ppcC5taW4uanM6CiAgKCohCiAgCiAgSlNaaXAgdjMuMTAuMSAtIEEgSmF2YVNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXMKICA8aHR0cDovL3N0dWFydGsuY29tL2pzemlwPgogIAogIChjKSAyMDA5LTIwMTYgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+CiAgRHVhbCBsaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2Ugb3IgR1BMdjMuIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL1N0dWsvanN6aXAvbWFpbi9MSUNFTlNFLm1hcmtkb3duLgogIAogIEpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgogIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21haW4vTElDRU5TRQogICopCgpqcXVlcnkvZGlzdC9qcXVlcnkuanM6CiAgKCohCiAgICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My43LjEKICAgKiBodHRwczovL2pxdWVyeS5jb20vCiAgICoKICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogICAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAgICoKICAgKiBEYXRlOiAyMDIzLTA4LTI4VDEzOjM3WgogICAqKQoKZGF0YXRhYmxlcy5uZXQvanMvZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgMi4wLjIKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZHQvanMvZGF0YVRhYmxlcy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIGludGVncmF0aW9uCiAgICogwqkyMDE4IFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zL2pzL2RhdGFUYWJsZXMuYnV0dG9ucy5tanM6CiAgKCohIEJ1dHRvbnMgZm9yIERhdGFUYWJsZXMgMy4wLjEKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy1kdC9qcy9idXR0b25zLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgQnV0dG9ucwogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zL2pzL2J1dHRvbnMuaHRtbDUubWpzOgogICgqIQogICAqIEhUTUw1IGV4cG9ydCBidXR0b25zIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICoKICAgKiBGaWxlU2F2ZXIuanMgKDEuMy4zKSAtIE1JVCBsaWNlbnNlCiAgICogQ29weXJpZ2h0IMKpIDIwMTYgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb20KICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5wcmludC5tanM6CiAgKCohCiAgICogUHJpbnQgYnV0dG9uIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMvanMvZGF0YVRhYmxlcy5maXhlZENvbHVtbnMubWpzOgogICgqISBGaXhlZENvbHVtbnMgNS4wLjAKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZml4ZWRjb2x1bW5zLWR0L2pzL2ZpeGVkQ29sdW1ucy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgRml4ZWRDb2x1bW5zCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWtleXRhYmxlL2pzL2RhdGFUYWJsZXMua2V5VGFibGUubWpzOgogICgqISBLZXlUYWJsZSAyLjEyLjAKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQta2V5dGFibGUtZHQvanMva2V5VGFibGUuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBLZXlUYWJsZQogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1yb3dncm91cC9qcy9kYXRhVGFibGVzLnJvd0dyb3VwLm1qczoKICAoKiEgUm93R3JvdXAgMS41LjAKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtcm93Z3JvdXAtZHQvanMvcm93R3JvdXAuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBSb3dHcm91cAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hidWlsZGVyL2pzL2RhdGFUYWJsZXMuc2VhcmNoQnVpbGRlci5tanM6CiAgKCohIFNlYXJjaEJ1aWxkZXIgMS43LjAKICAtZGV2ICogwqlTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZS9taXQKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXItZHQvanMvc2VhcmNoQnVpbGRlci5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoQnVpbGRlcgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hwYW5lcy9qcy9kYXRhVGFibGVzLnNlYXJjaFBhbmVzLm1qczoKICAoKiEgU2VhcmNoUGFuZXMgMi4zLjAKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNocGFuZXMtZHQvanMvc2VhcmNoUGFuZXMuZGF0YVRhYmxlcy5tanM6CiAgKCohIEJvb3RzdHJhcCBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoUGFuZXMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VsZWN0L2pzL2RhdGFUYWJsZXMuc2VsZWN0Lm1qczoKICAoKiEgU2VsZWN0IGZvciBEYXRhVGFibGVzIDIuMC4wCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWxlY3QtZHQvanMvc2VsZWN0LmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgU2VsZWN0CiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKKi8K"</script>
</div><div class="output text_html"><table id="itables_1b38361c_a448_4913_a26e_c9923bb9c9fd" class="display" data-quarto-disable-processing="true" style="table-layout:auto;width:auto;margin:auto;caption-side:bottom">
<thead>
<tr style="text-align: right;">
<th>Station full name</th>
<th>Abbreviation</th>
<th>State</th>
<th>Country</th>
<th>Continent</th>
<th>Latitude</th>
<th>Longitude</th>
<th>Elevation</th>
<th>Time period</th>
<th>Network</th>
<th>Owner</th>
<th>Comment</th>
<th>Data availability</th>
<th>Tier</th>
<th>Instrument</th>
<th>Components</th>
<th>Koeppen Geiger classification</th>
<th>Koeppen Geiger climate zone</th>
</tr>
</thead><tbody><tr><td>Loading... (need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td></tr></tbody>
</table>
<script type="module">
const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_0_0);
document.querySelectorAll("#itables_1b38361c_a448_4913_a26e_c9923bb9c9fd:not(.dataTable)").forEach(table => {
// Define the table data
const data = [["Abashiri", "ABS", "", "Japan", "Asia", 44.0178, 144.2797, " 38.0", "2021-", "BSRN", "", "Candidate station (no. 86)", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Alert", "ALE", "Lincoln Sea", "Canada", "North America", 82.49, -62.42, " 127.0", "2004-2014", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Alice Springs</a>", "ASP", "Northern Territory", "Australia", "Oceania", -23.7951, 133.889, " 546.0", "1995-", "BSRN", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BWh", "Dry"], ["<a href=\"https://gml.noaa.gov/obop/brw/\">Barrow</a>", "BAR", "Alaska", "USA", "North America", 71.323, -156.607, " 8.0", "1992-", "BSRN; ABO", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["Bermuda", "BER", "Bermuda", "USA", "North America", 32.267, -64.667, " 8.0", "1992-2013& 2016-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Billings", "BIL", "Oklahoma", "USA", "North America", 36.605, -97.516, " 317.0", "1993-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"http://www.srrb.noaa.gov/surfrad/bondvill.html\">Bondville</a>", "BON", "Illinois", "USA", "North America", 40.05192, -88.37309, " 230.0", "1995-", "BSRN; SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/tablemt.html\">Boulder</a>", "BOS", "Colorado", "USA", "North America", 40.12498, -105.2368, " 1689.0", "1995-", "BSRN; SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["Boulder", "BOU", "Colorado", "USA", "North America", 40.05, -105.007, " 1577.0", "1992-2016", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/brasilia.html\">Brasilia</a>", "BRB", "", "Brazil", "South America", -15.601259, -47.713774, " 1023.0", "2006-2015&2018-", "BSRN;SONDA", "INPE", "SONDA station (2004-2019). No maintenance between 2016-2017.", "Freely", "1", "Thermopile", "G;B;D;IR", "Aw", "Tropical"], ["Budapest-Lorinc", "BUD", "Budapest", "Hungary", "Europe", 47.4291, 19.1822, " 139.1", "2019-", "BSRN;WMO RRC", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://dataplatform.knmi.nl/dataset/cesar-bsrn-irraddown-la1-t1-v1-0\">Cabauw</a>", "CAB", "", "Netherlands", "Europe", 51.9711, 4.9267, " 0.0", "2005-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://epic.awi.de/id/eprint/40425/1/Camborne_BSRN_Station_Info.pdf\">Camborne</a>", "CAM", "", "United Kingdom", "Europe", 50.2167, -5.3167, " 88.0", "2001-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["Cape Baranova", "CAP", "", "Russia", "Europe", 79.27, 101.75, "", "2016-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["Carpentras", "CAR", "", "France", "Europe", 44.083, 5.059, " 100.0", "1996-2018", "BSRN;WMO RRC", "", "", "Freely", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://science.larc.nasa.gov/crave/\">Chesapeake Light</a>", "CLH", "North Atlantic Ocean", "USA", "North America", 36.905, -75.713, " 37.0", "2000-2016", "BSRN", "NASA", "Closed due to structural issues", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Cener", "CNR", "Navarra", "Spain", "Europe", 42.816, -1.601, " 471.0", "2009-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Cocos Island</a>", "COC", "Cocos (Keeling) Islands", "Australia", "Oceania", -12.1892, 96.8344, " 3.0", "2004-", "BSRN", "BOM", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["De Aar", "DAA", "", "South Africa", "Africa", -30.6667, 23.993, " 1287.0", "2000-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Darwin</a>", "DAR", "Northern Territory", "Australia", "Oceania", -12.4239, 130.8925, " 30.4", "2002-2021", "BSRN", "BOM", "BSRN data available until 2015", "Freely", "1", "Thermopile", "G;B;D;IR", "Aw", "Tropical"], ["Concordia Station& Dome C", "DOM", "", "Antarctica", "Antarctica", -75.1, 123.383, " 3233.0", "2006-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["Dongsha Atoll", "DON", "", "Taiwan", "Asia", 20.7, 116.73, " 2.0", "?", "BSRN", "", "Candidate", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/desrock.html\">Desert Rock</a>", "DRA", "Nevada", "USA", "North America", 36.62373, -116.01947, " 1007.0", "1994-", "BSRN; SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BWk", "Dry"], ["Darwin Met Office", "DWN", "Northern Territory", "Australia", "Oceania", -12.424, 130.8925, " 32.0", "2008-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"http://www.arm.gov/sites/sgp\">Southern Great Plains</a>", "E13", "Oklahoma", "USA", "North America", 36.60406, -97.48525, " 314.0", "1994-", "BSRN; ARM", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.arm.gov/capabilities/observatories/ena/locations/c1\">Eastern North Atlantic</a>", "ENA", "Azores", "Portugal", "Europe", 39.0911, -28.0292, " 15.2", "2015-", "BSRN; ARM", "", "Ongoing issues with calibration.", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["<a href=\"https://en.wikipedia.org/wiki/Eureka,_Nunavut\">Eureka</a>", "EUR", "Ellesmere Island", "Canada", "North America", 79.989, -85.9404, " 85.0", "2007-2011", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/florianopolis.html\">Florianopolis</a>", "FLO;FLN", "", "Brazil", "South America", -27.6017, -48.5178, " 31.0", "1994-2005&2013-", "BSRN;SONDA", "INPE", "SONDA station (2004-2019). No maintenance between 2016-2017.", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/ftpeck.html\">Fort Peck</a>", "FPE", "Montana", "USA", "North America", 48.30783, -105.1017, " 634.0", "1995-", "BSRN;SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://epic.awi.de/id/eprint/36862/41/Fukuoka_old-and-new.pdf\">Fukuoka</a>", "FUA", "", "Japan", "Asia", 33.5822, 130.3764, " 3.0", "2010-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Gandhinagar", "GAN", "", "India", "Asia", 23.1101, 72.6276, " 65.0", "2014-2015& 2018-", "BSRN;SRRA", "National Institute of wind energy", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/goodwin.html\">Goodwin Creek</a>", "GCR", "Mississippi", "USA", "North America", 34.2547, -89.8729, " 98.0", "1995-", "BSRN;SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://science.larc.nasa.gov/crave/\">Granite Island</a>", "GIM", "Michigan", "USA", "North America", 46.721, -87.411, " 208.0", "2019-", "BSRN", "NASA", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Gobabeb", "GOB", "Namib Desert", "Namibia", "Africa", -23.5614, 15.042, " 407.0", "2012-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Gurgaon", "GUR", "", "India", "Asia", 28.4249, 77.156, " 259.0", "2014-2015& 2018-", "BSRN;SRRA", "National Institute of wind energy", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://www.awi.de/en/science/long-term-observations/atmosphere/antarctic-neumayer.html\">Georg von Neumayer</a>", "GVN", "Dronning Maud Island", "Antarctica", "Antarctica", -70.65, -8.25, " 42.0", "1982-", "BSRN", "", "Neumayer-station II from 1992-2009& Neumayer station III from 2009. BSRN FTP server only has data from 1992.", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Howrah", "HOW", "", "India", "Asia", 22.5535, 88.3064, " 51.0", "2014-2016& 2018-", "BSRN;SRRA", "National Institute of wind energy", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Ilorin", "ILO", "", "Nigeria", "Africa", 8.5333, 4.5667, " 350.0", "1992-2005", "BSRN", "", "Station closed due to no funding", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Ishigakijima", "ISH", "", "Japan", "Asia", 24.3367, 124.1644, " 5.7", "2010-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Iza\u00f1a", "IZA", "Tenerife", "Spain", "Europe", 28.3093, -16.4993, " 2372.9", "2009-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/sites/kwa.html\">Kwajalein</a>", "KWA", "", "Marshall Islands", "Oceania", 8.72, 167.731, " 10.0", "1992-2017", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Lauder", "LAU", "", "New Zealand", "Oceania", -45.045, 169.689, " 350.0", "1999-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://epic.awi.de/id/eprint/35071/1/Lerwick_site_info.pdf\">Lerwick</a>", "LER", "Shetland Island", "United Kingdom", "Europe", 60.1389, -1.1847, " 80.0", "2001-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.dwd.de/DE/forschung/atmosphaerenbeob/lindenbergersaeule/mol/mol_node.html\">Lindenberg</a>", "LIN", "", "Germany", "Europe", 52.21, 14.122, " 125.0", "1994-", "BSRN;WMO RRC", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"http://lulin.tw/\">Lulin</a>", "LLN", "", "Taiwan", "Asia", 23.4686, 120.8736, " 2862.0", "2009-", "BSRN", "", "Not on Pangea or FTP", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://science.larc.nasa.gov/crave/\">Langley Research Center</a>", "LRC", "Virginia", "USA", "North America", 37.1038, -76.3872, " 3.0", "2014-", "BSRN", "NASA", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Lanyu Station", "LYU", "", "Taiwan", "Asia", 22.037, 121.5583, " 324.0", "2018-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Momote", "MAN", "", "Papua New Guinea", "Oceania", -2.058, 147.425, " 6.0", "1996-2013", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Af", "Tropical"], ["<a href=\"https://epic.awi.de/id/eprint/36862/3/Minamitorishima.pdf\">Minamitorishima</a>", "MNM", "Minami-Torishima", "Japan", "Asia", 24.2883, 153.9833, " 7.1", "2010-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Marguele", "MRS", "", "Romania", "Europe", 44.3439, 26.0123, " 110.0", "?", "BSRN", "", "Candidate Station (no. 88)", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Nauru Island", "NAU", "", "Nauru", "Oceania", -0.521, 166.9167, " 7.0", "1998-2013", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["Newcastle", "NEW", "New South Wales", "Australia", "Oceania", -32.8842, 151.7289, " 18.5", "2017-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.awi.de/en/expedition/stations/awipev-research-base.html\">Ny-\u00c5lesund</a>", "NYA", "Spitsberger", "Norway", "Europe", 78.925, 11.93, " 11.0", "1992-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["Observatory of Huancayo", "OHY", "", "Peru", "South America", -12.05, -75.32, " 3314.0", "2017-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cwb", "Temperate"], ["Palaiseau& SIRTA Observatory", "PAL", "", "France", "Europe", 48.713, 2.208, " 156.0", "2003-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["Paramaribo", "PAR", "", "Suriname", "South America", 5.806, -55.2146, " 4.0", "2019-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Af", "Tropical"], ["Payerne", "PAY", "", "Switzerland", "Europe", 46.8123, 6.9422, " 491.0", "1992-", "BSRN", "MeteoSwiss", "", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/pennstat.html\">Rock Springs</a>", "PSU", "Pennsylvania", "USA", "North America", 40.72012, -77.93085, " 376.0", "1998-", "BSRN;SURFRAD", "NOAA", "SURFRAD station known as Penn State", "Freely", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/petrolina.html\">Petrolina</a>", "PTR", "", "Brazil", "South America", -9.068, -40.319, " 387.0", "2006-", "BSRN;SONDA", "INPE", "SONDA station (2004-2019). No maintenance between 2016-2017.", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["Regina", "REG", "", "Canada", "North America", 50.205, -104.713, " 578.0", "1995-2011", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Rolim de Moura", "RLM", "", "Brazil", "South America", -11.582, -61.773, " 252.0", "2007", "BSRN", "", "Only two months of data available.", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Reunion Island & University", "RUN", "", "Reunion", "Africa", -20.9014, 55.4836, " 116.0", "2019-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["<a href=\"https://epic.awi.de/id/eprint/36862/28/Sapporo.pdf\">Sapporo</a>", "SAP", "", "Japan", "Asia", 43.06, 141.3286, " 17.2", "2010-2020", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Sede Boqer", "SBO", "", "Israel", "Asia", 30.8597, 34.7794, " 500.0", "2003-2012", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["Selegua& Mexico Solarimetric Station", "SEL", "", "Mexico", "North America", 15.784, -91.9902, " 602.0", "2020-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/saomartinho.html\">S\u00e3o Martinho da Serra</a>", "SMS", "", "Brazil", "South America", -29.4428, -53.8231, " 489.0", "2006-", "BSRN;SONDA", "INPE", "SONDA station (2005-2019). No maintenance between 2016-2017.", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["<a href=\"https://www.sonnblick.net/en/\">Sonnblick</a>", "SON", "", "Austria", "Europe", 47.054, 12.9577, " 3108.9", "2013-", "BSRN;ARAD", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Solar Village</a>", "SOV", "", "Saudi Arabia", "Asia", 24.91, 46.41, " 650.0", "1998-2003", "BSRN; AERONET", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://gml.noaa.gov/obop/spo/\">South Pole</a>", "SPO", "", "Antarctica", "Antarctica", -89.983, -24.799, " 2800.0", "1992-", "BSRN; ABO", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["<a href=\"https://gml.noaa.gov/grad/surfrad/siouxfalls.html\">Sioux Falls</a>", "SXF", "South Dakota", "USA", "North America", 43.73403, -96.62328, " 473.0", "2003-", "BSRN; SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Dfa", "Continental"], ["<a href=\"https://epic.awi.de/id/eprint/47515/\">Syowa</a>", "SYO", "", "Antarctica", "Antarctica", -69.005, 39.589, " 18.0", "1994-", "BSRN", "AWI", "", "Freely", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["Tamanrasset", "TAM", "", "Algeria", "Africa", 22.7903, 5.5292, " 1385.0", "2000-", "BSRN;WMO RRC", "", "No DIR and DIF data at TAM since 2018: Due to a broken tracker which could not yet be replaced the DIR and DIF data at Tamanrasset is missing since February 2018.", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://epic.awi.de/id/eprint/36862/27/Tateno.pdf\">Tateno;Tsukuba</a>", "TAT", "", "Japan", "Asia", 36.0581, 140.1258, " 25.0", "1996-", "BSRN;WMO RRC", "JMA", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["Tiksi", "TIK", "Siberia", "Russia", "Europe", 71.5862, 128.9188, " 48.0", "2010-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Dsd", "Continental"], ["Tiruvallur", "TIR", "", "India", "Asia", 13.0923, 79.9738, " 36.0", "2014-", "BSRN;SRRA", "National Institute of wind energy", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Terra Nova Bay", "TNB", "", "Antarctica", "Antarctica", -74.6223, 164.2283, " 28.0", "?", "BSRN", "", "Candidate Station (no. 89)", "Freely", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["<a href=\"https://gml.noaa.gov/grad/meetings/BSRN2018_documents/2018_%20BSRN_poster_EST_Rosin.pdf\">Toravere</a>", "TOR", "", "Estonia", "Europe", 58.254, 26.462, " 70.0", "1999-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Xianghe", "XIA", "", "China", "Asia", 39.754, 116.962, " 32.0", "2005-2016", "BSRN", "", "Station obstructed& no longer in BSRN since 2016", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["Yushan Station", "YUS", "", "Taiwan", "Asia", 23.4876, 120.9595, " 3858.0", "2018-", "BSRN", "", "", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"https://gml.noaa.gov/grad/solrad/abq.html\">Albuquerque</a>", "ABQ", "New Mexico", "USA", "North America", 35.03796, -106.62211, " 1617.0", "1995-", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://gml.noaa.gov/grad/solrad/bis.html\">Bismarck</a>", "BIS", "North Dakota", "USA", "North America", 46.77179, -100.75955, " 503.0", "1995-", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://gml.noaa.gov/grad/solrad/hnx.html\">Hanford</a>", "HNX", "California", "USA", "North America", 36.31357, -119.63164, " 73.0", "1995-", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://gml.noaa.gov/grad/solrad/msn.html\">Madison</a>", "MSN", "Wisconsin", "USA", "North America", 43.0725, -89.41133, " 271.0", "1996-", "SOLRAD", "NOAA", "Madison station file format changed after Jun 2009 (https://gml.noaa.gov/aftp/data/radiation/solrad/README_SOLRAD.txt)", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://gml.noaa.gov/grad/solrad/ort.html\">Oak Ridge</a>", "ORT", "Tennessee", "USA", "North America", 35.96101, -84.28838, " 334.0", "1995-2007", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/solrad/slc.html\">Salt Lake City</a>", "SLC", "Utah", "USA", "North America", 40.7722, -111.95495, " 1288.0", "1995-", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://gml.noaa.gov/grad/solrad/sea.html\">Seattle</a>", "SEA", "Washington", "USA", "North America", 47.68685, -122.25667, " 20.0", "1995-", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/solrad/ste.html\">Sterling</a>", "STE", "Virginia", "USA", "North America", 38.97203, -77.4869, " 85.0", "1995-", "SOLRAD", "NOAA", "Site location pre Oct 28& 2014 (38.97673& -77.48379)", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://gml.noaa.gov/grad/solrad/tlh.html\">Tallahassee</a>", "TLH", "Florida", "USA", "North America", 30.39675, -84.32955, " 18.0", "1995-2002", "SOLRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/PortlandPV.html\">Portland</a>", "PT", "Oregon", "USA", "North America", 45.51, -122.69, " 70.0", "2004-", "SRML", "University of Oregon", "5-min data between 2004 and 2011.", "Freely", "2", "RSR", "", "Csb", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/Burns.html\">Burns</a>", "BU", "Oregon", "USA", "North America", 43.52, -119.02, " 1265.0", "1994-", "SRML", "University of Oregon", "5 min data from 1994 to 2011.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"http://solardata.uoregon.edu/SilverLake.html\">Silver lake</a>", "SL", "Oregon", "USA", "North America", 43.12, -121.06, " 1355.0", "2002-", "SRML", "University of Oregon", "Only 5 minute data?", "Freely", "2", "RSR", "", "Csb", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/Ashland.html\">Ashland</a>", "AS", "Oregon", "USA", "North America", 42.19, -122.7, " 595.0", "2000-", "SRML", "University of Oregon", "5-minute data from 2000 to 2018.", "Freely", "2", "RSR", "", "Csb", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/Seattle_UW.html\">Seattle</a>", "ST", "Washington", "USA", "North America", 47.654, -122.309, " 70.0", "2015-", "SRML", "University of Oregon", "", "Freely", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/Eugene.html\">Eugene</a>", "EU", "Oregon", "USA", "North America", 44.0468, -123.0742, " 150.0", "1977-", "SRML", "University of Oregon", "Has tilted irradiance measurements and some spectral data.", "Freely", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"http://solardata.uoregon.edu/Hermiston.html\">Hermiston</a>", "HE", "Oregon", "USA", "North America", 45.82, -119.28, " 180.0", "1979-", "SRML", "University of Oregon", "Also has a RSR.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://weatherdata.construct.dtu.dk/\">DTU Lyngby</a>", "DTU", "Capital region", "Denmark", "Europe", 55.7906, 12.5251, " 50.0", "2014-", "", "Technical University of Denmark", "Elevation is approximate.", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfb", "Temperate"], ["DTU Ris\u00f8", "RIS", "Region Zealand", "Denmark", "Europe", 55.6943, 12.1017, " 13.0", "2017-", "", "Technical University of Denmark", "Also has spectral measurements. Elevation is approximate.", "Not available", "1", "Thermopile", "G;B;D;IR;UV", "Cfb", "Temperate"], ["<a href=\"https://sauran.ac.za/station-documents/KZH/KZH%20Station%20Details.pdf\">University of KwaZulu-Natal Howard College</a>", "UKZN", "Durban", "South Africa", "Africa", -29.870979, 30.97695, " 150.0", "2015-2021", "SAURAN", "", "Roof of Desmond Clarence building. Permanently offline.", "Freely", "1", "Thermopile", "", "Cfa", "Temperate"], ["University of KwaZulu-Natal Westville", "ZUL", "Durban", "South Africa", "Africa", -29.81694, 30.94492, " 200.0", "2015-2020", "SAURAN", "", "Roof of Physics building. Permanently offline.", "Freely", "1", "Thermopile", "", "Cfa", "Temperate"], ["<a href=\"https://sauran.ac.za\">Stellenbosch University</a>", "STB", "Stellenbosch", "South Africa", "Africa", -33.928101, 18.8654, " 119.0", "2010-2024", "SAURAN", "", "Roof of Engineering building", "Freely", "1", "Thermopile", "", "Csb", "Temperate"], ["<a href=\"https://sauran.ac.za\">GIZ University of Pretoria</a>", "UOP", "Pretoria", "South Africa", "Africa", -25.75308, 28.22859, " 1410.0", "2013-2024", "SAURAN", "", "Roof of university building. Also has acronym UPR.", "Freely", "", "", "", "Cwa", "Temperate"], ["<a href=\"https://sauran.ac.za/station-documents/VAN/VAN%20Station%20Details.pdf\">GIZ Vanrhynsdorp</a>", "RVLD", "Vanrhynsdorp", "South Africa", "Africa", -31.617479, 18.73834, " 130.0", "2016-2019", "SAURAN", "", "Inside enclosure on rural farmland. Permanently offline. Also goes by the acronym VAN.", "Freely", "", "", "", "BSh", "Dry"], ["<a href=\"https://sauran.ac.za/station-documents/UFS/UFS%20Station%20Details.pdf\">GIZ University of Free State</a>", "UFS", "Bloemfontein", "South Africa", "Africa", -29.110741, 26.18503, " 1491.0", "2014-2017", "SAURAN", "", "Roof of Physics building. Permanently offline.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://sauran.ac.za/station-documents/GRT/GRT%20Station%20Details.pdf\">GIZ Graaff-Reinet</a>", "GRN", "Graaff-Reinet", "South Africa", "Africa", -32.48547, 24.585819, " 660.0", "2013-2016", "SAURAN", "", "Inside enclosure on rural farmland. Permanently offline.", "Freely", "", "", "", "BWh", "Dry"], ["<a href=\"https://sauran.ac.za/station-documents/NMU/NMU%20Station%20Details.pdf\">Nelson Mandela University</a>", "NMU", "Port Elizabeth", "South Africa", "Africa", -34.008591, 25.66526, " 35.0", "2015-2021", "SAURAN", "", "Roof of Solar Outdoor Research Facility. Permanently offline. Is this really correct? Check what data comes in?", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://sauran.ac.za/station-documents/RVD/RVD%20Station%20Details.pdf\">GIZ Richtersveld</a>", "RVLD", "Alexander Bay", "South Africa", "Africa", -28.560841, 16.761459, " 141.0", "2014-2024", "SAURAN", "", "Inside enclosure in desert region", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://sauran.ac.za/station-documents/STA/STA%20Station%20Details.pdf\">Mangosuthu University of Technology</a>", "MUT", "Umlazi", "South Africa", "Africa", -29.970209, 30.914909, " 95.0", "2015-2021", "SAURAN", "", "Roof of lecture complex. Diffuse with shadow band. Pyrheliometer on Eppley one-axis tracker. Permanently offline.", "Freely", "2", "Thermopile.", "G;B", "Cfa", "Temperate"], ["<a href=\"https://sauran.ac.za/station-documents/SUT/SUT%20Station%20Details.pdf\">Eskom Sutherland</a>", "SALT", "Sutherland", "South Africa", "Africa", -32.221992, 20.347775, " 1450.0", "2016-2017", "SAURAN", "", "Permanently offline. Karoo scrubland.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://sauran.ac.za/\">USAid Gaborone</a>", "GAB", "Gaborone", "Botswana", "Africa", -24.660999, 25.934, " 1014.0", "2014-2020", "SAURAN", "", "Roof of building in University of Botswana", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://sauran.ac.za/\">USAid Venda</a>", "VEN", "Vuwani", "South Africa", "Africa", -23.131001, 30.424, " 628.0", "2015-2024", "SAURAN", "", "Vuwani Science Research Centre", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://sauran.ac.za/\">University of Zululand</a>", "ZUL", "KwaDlangezwa", "South Africa", "Africa", -28.8529, 31.85161, " 90.0", "2013-2024", "SAURAN", "", "Roof of university building", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://sauran.ac.za/\">USAid Namibian University of Science and Technology</a>", "NUST", "Windhoek", "Namibia", "Africa", -22.565001, 17.075001, " 1683.0", "2016-2024", "SAURAN", "", "Roof of Engineering Building", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://sauran.ac.za/\">USAid University of Fort Hare</a>", "UFH", "Alice", "South Africa", "Africa", -32.784611, 26.8452, " 540.0", "2017-2024", "SAURAN", "", "Roof of Zoology Department", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://sauran.ac.za/\">GIZ Murraysburg</a>", "MRB", "Murraysburg", "South Africa", "Africa", -31.890091, 24.056231, " 1548.0", "2017-2019", "SAURAN", "", "Permanently offline. Inside enclosure on rural farmland.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://sauran.ac.za/\">Mariendal</a>", "HELIO", "Mariendal", "South Africa", "Africa", -33.85413, 18.82445, " 178.0", "2015-2020", "SAURAN", "", "Permanently offline. Installed on a container.", "Freely", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://sauran.ac.za/\">Eskom Sutherland SALT</a>", "", "Sutherland", "South Africa", "Africa", -32.377781, 20.81167, " 1761.0", "2017-2020", "SAURAN", "", "Permanently offline. Karoo scrubland.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://sauran.ac.za/\">CSIR Energy Centre</a>", "CSIR", "Pretoria", "South Africa", "Africa", -25.746519, 28.278739, " 1400.0", "2017-2024", "SAURAN", "", "Roof of building", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://sauran.ac.za\">Central University of Technology</a>", "CUT", "Bloemfontein", "South Africa", "Africa", -29.121337, 26.215909, " 1397.0", "2017-2024", "SAURAN", "", "Roof of the Engineering building", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://sauran.ac.za/\">University of KwaZulu-Natal Pietermaritzburg</a>", "", "Pietermaritzburg", "South Africa", "Africa", -29.621226, 30.397038, " 680.0", "2021-2024", "SAURAN", "", "Rooftop", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Anmyeondo GAW station", "AMY", "", "South Korea", "Asia", 36.53, 126.32, " 47.0", "1999-", "WMO GAW", "", "Also measured upwards shortwave and longwave irradiance and has a skyradiometer and a Brewer.", "", "", "", "", "Cwa", "Temperate"], ["Jeju Gosan GAW station", "JGS", "", "South Korea", "Asia", 33.3, 126.21, " 52.0", "2008-", "WMO GAW", "", "The station also has a sky radiometer.", "", "", "", "", "Cfa", "Temperate"], ["<a href=\"https://ruisdael-observatory.nl/veenkampen/\">Weather Station De Veenkampen</a>", "", "Wageningen", "Netherlands", "Europe", 51.9812, 5.6202, "", "2010-", "", "Wageningen University", "The quality of the radiation measurements are questionable.", "", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/data/meteorologi/ladda-ner-meteorologiska-observationer/#param=globalIrradians,stations=all\">Kiruna</a>", "", "", "Sweden", "Europe", 67.842, 20.41, " 424.0", "1983-", "SMHI", "SMHI", "", "Upon request", "1", "Thermopile", "G;B;D", "Dfc", "Continental"], ["<a href=\"https://www.smhi.se/data/meteorologi/ladda-ner-meteorologiska-observationer/#param=globalIrradians,stations=all\">Norrk\u00f6ping</a>", "", "", "Sweden", "Europe", 58.582, 16.148, " 43.0", "1983-", "SMHI;WMO RRC", "SMHI", "", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/data/meteorologi/ladda-ner-meteorologiska-observationer/#param=globalIrradians,stations=all\">Visby</a>", "", "", "Sweden", "Europe", 57.673, 18.345, " 49.0", "1983-", "SMHI", "SMHI", "", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Lule\u00e5</a>", "", "", "Sweden", "Europe", 65.544, 22.111, " 32.0", "1983-2007", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Dfc", "Continental"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Ume\u00e5</a>", "", "", "Sweden", "Europe", 63.811, 20.24, " 23.0", "1983-2008", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">\u00d6stersund</a>", "", "", "Sweden", "Europe", 63.197, 14.48, " 374.0", "1983-2009", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Dfc", "Continental"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Borl\u00e4nge</a>", "", "", "Sweden", "Europe", 60.488, 15.43, " 164.0", "1983-2010", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Dfc", "Continental"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Karlstad</a>", "", "", "Sweden", "Europe", 59.359, 13.472, " 46.0", "1983-2011", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Stockholm</a>", "", "", "Sweden", "Europe", 59.353, 18.063, " 30.0", "1983-2012", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">G\u00f6teborg</a>", "", "", "Sweden", "Europe", 57.708, 11.992, " 30.0", "1983-2013", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">V\u00e4xj\u00f6</a>", "", "", "Sweden", "Europe", 56.927, 14.731, " 182.0", "1983-2014", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Cfb", "Temperate"], ["<a href=\"https://www.smhi.se/polopoly_fs/1.166869!/Meteorologi_148%20Upgrade%20of%20SMHI%E2%80%99s%20meteorological%20radiation%20netwrok%202006-2007%20-%20Effects%20on%20direct%20and%20global%20solar%20radiation.pdf\">Lund</a>", "", "", "Sweden", "Europe", 55.714, 13.212, " 85.0", "1983-2015", "SMHI", "SMHI", "", "Upon request", "2", "Thermopile", "G;B", "Cfb", "Temperate"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Tataouine</a>", "", "", "Tunisia", "Africa", 32.974, 10.485, " 210.0", "2011-", "enerMENA", "CRTEn", "", "", "", "Thermopile", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Ma'an</a>", "", "", "Jordan", "Asia", 30.172, 35.818, " 1012.0", "2011-", "enerMENA", "University of Jordan", "", "", "", "Thermopile", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Oujda</a>", "", "", "Morocco", "Africa", 34.65, -1.9, " 617.0", "2011-", "enerMENA", "University of oujda", "", "", "", "Thermopile", "", "BSk", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Cairo</a>", "", "", "Egypt", "Africa", 30.036, 31.009, " 104.0", "2012-", "enerMENA", "Cairo University", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Adrar</a>", "", "", "Algeria", "Africa", 27.88, -0.274, " 262.0", "2012-", "enerMENA", "CDER", "", "", "", "Thermopile", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Ghardaia</a>", "", "", "Algeria", "Africa", 32.386, 3.78, " 463.0", "2012-", "enerMENA", "CDER", "", "", "", "Thermopile", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Missour</a>", "", "", "Morocco", "Africa", 32.86, -4.107, " 1107.0", "2013-", "enerMENA", "IRESEN", "", "", "", "Thermopile", "", "BWk", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Erfoud</a>", "", "", "Morocco", "Africa", 31.491, -4.218, " 859.0", "2013-", "enerMENA", "IRESEN", "", "", "", "RSI", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Zagora</a>", "", "", "Morocco", "Africa", 30.272, -5.852, " 783.0", "2013-", "enerMENA", "IRESEN", "", "", "", "RSI", "", "BWh", "Dry"], ["<a href=\"https://www.dlr.de/sf/en/desktopdefault.aspx/tabid-8680/12865_read-32404/\">Tan-Tan</a>", "", "", "Morocco", "Africa", 28.498, -11.322, " 75.0", "2013-", "enerMENA", "IRESEN", "", "", "", "Thermopile", "", "BWh", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Ciudad Universitaria</a>", "UNAM", "Mexico City", "Mexico", "North America", 19.3262, -99.176, " 2284.0", "2015-", "WMO RRC", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "Cwb", "Temperate"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Coeneo</a>", "COE", "Michoac\u00e1n", "Mexico", "North America", 19.8137, -101.6946, " 1990.0", "2015-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Ciudad Cuahut\u00e9moc</a>", "CDC", "Chihuahua", "Mexico", "North America", 28.4504, -106.7942, " 2112.0", "2015-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">G\u00f3mez Palacio</a>", "VEN", "Durango", "Mexico", "North America", 24.9568, -104.5704, " 1877.0", "2015-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Guerrero Negro</a>", "GRN", "Baja California Sur", "Mexico", "North America", 28.0377, -113.9787, " 21.0", "2016-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Ixmiquilpan</a>", "IXM", "Hedalgo", "Mexico", "North America", 20.4955, -99.181, " 1761.0", "2016-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Morelos</a>", "Mor", "Quintana Roo", "Mexico", "North America", 19.759, -88.7243, " 17.0", "2017-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Nuevo Laredo</a>", "NVL", "Tamaulipas", "Mexico", "North America", 27.4526, -99.5185, " 128.0", "2017-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Selegua</a>", "SEL", "Chiapas", "Mexico", "North America", 15.7839, -91.9902, " 598.0", "2017-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Tepic</a>", "TEP", "Nayarit", "Mexico", "North America", 21.4916, -104.8947, " 959.0", "2016-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Zacatecas City</a>", "ZAC", "Zacatecas ", "Mexico", "North America", 22.7725, -102.6436, " 2316.0", "2015-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://solarimetrico.geofisica.unam.mx/\">Hermosillo</a>", "HMO", "Sonora", "Mexico", "North America", 29.0279, -111.1456, " 157.0", "2018-", "", "Mexican Solarimetric Service", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Poprad-Ganovce", "", "", "Slovakia", "Europe", 49.035, 20.324, " 709.0", "?", "Slovak Hydrometeorological Institute", "", "", "Upon request", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Dobele", "", "", "Latvia", "Europe", 56.62, 23.32, " 42.0", "?", "Latvian Environment Geology and Meteorology Centre (LEGMC)", "", "", "", "", "", "", "Cfb", "Temperate"], ["Silutes", "", "", "Lithuania", "Europe", 55.352, 21.447, " 5.0", "?", "Lithuanian Hydrometeorological Service (LHMS)", "", "", "", "", "", "", "Cfb", "Temperate"], ["Kauno", "", "", "Lithuania", "Europe", 54.884, 23.836, " 77.0", "?", "Lithuanian Hydrometeorological Service (LHMS)", "", "", "", "", "", "", "Dfb", "Continental"], ["Kishinev", "", "", "Moldova", "Europe", 47.0, 28.817, " 205.0", "?", "ARG / Academy of Sciences of Moldova", "", "", "", "", "", "", "Cfa", "Temperate"], ["Tajoura", "", "", "Libya", "Africa", 32.815147, 13.438943, "", "?", "", "", "", "", "", "", "", "BSh", "Dry"], ["<a href=\"https://leps.hmu.gr/en/home/\">Heraklion</a>", "", "Crete", "Greece", "Europe", 35.31139, 25.10174, " 95.0", "?", "", "Hellenic Mediterranean University", "Tracked located on roof of building. Site also has spectral radiation measurements.", "Not available", "1", "Thermopile", "", "Csa", "Temperate"], ["<a href=\"https://gml.noaa.gov/obop/mlo/\">Mauna Loa</a>", "MLO", "Hawaii", "USA", "North America", 19.5362, 155.5763, " 3397.0", "1976-", "ABO", "NOAA", "Also downwelling long- and shortwave as well as spectral irradiance measurements.", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["<a href=\"https://gml.noaa.gov/obop/smo/\">Cape Matatula</a>", "SMO", "Tutila Island", "American Samoa", "Oceania", 14.2474, 170.5644, " 42.0", "1976-", "ABO", "NOAA", "Diffuse irradiance measurements first started in 1995.", "Freely", "1", "Thermopile", "G;B;D", "Ocean", "Ocean"], ["<a href=\"https://arm.gov/capabilities/observatories/nsa/locations/c1\">North Slope of Alaska</a>", "NSA", "Alaska", "USA", "North America", 71.323, -156.609, " 8.0", "1997-", "ARM", "", "This site should note be confused with the NOAA Barrow site which is located ~1 km away. Radiation instruments are located at the Central Facility (Barrow)", "Freely", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=BMS\">SRRL BMS</a>", "BMS", "Colorado", "USA", "North America", 39.742, -105.18, " 1828.8", "1981-", "NREL MIDC", "NREL", "The NREL Solar Radiation Research Laboratory (SRRL) operates the largest collection of pyranometers and pyrheliometers in the world. Regular calibration and cleaning.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=STAC\">SOLARTAC</a>", "STAC", "Colorado", "USA", "North America", 39.75685, -104.62025, " 1674.0", "2009-", "NREL MIDC", "", "Relatively good quality data, but somewhat inconsistent cleaning.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=NWTC\">Flatirons M2</a>", "NWTC", "Colorado", "USA", "North America", 39.9106, -105.2347, " 1855.0", "2021-", "NREL MIDC", "NREL", "Regular calibration and cleaning as of 2022.", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["Casaccia Research Center", "", "Lazio", "Italy", "Europe", 42.05, 12.3, "", "2001-", "", "ENEA", "Since 2020 also has PAR,albedo,UVA,UVB,spectral", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://re.jrc.ec.europa.eu/meteo/meteo.php\">European Solar Test Installation - JRC</a>", "JRC", "Ispra", "Italy", "Europe", 45.81206, 8.62706, " 220.0", "1996-", "", "", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Ricerca sul Sistema Energetico", "RSE", "Milan", "Italy", "Europe", 45.47488, 9.26001, " 150.0", "2012-", "", "RSE", "Tracker is installed on the roof of a building (ground elevation is 108 m). The station also makes spectral measurement using a Spectrafy instrument.", "", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.udg.edu/en/grupsrecerca/Fisica-Ambiental/Estacio-Meteorologica/Informacio-general-sobre-lestacio\">University of Girona</a>", "", "Catalonia", "Spain", "Europe", 41.96, 2.83, " 110.0", "1993-", "", "", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://gml.noaa.gov/aftp/data/radiation/surfrad/\">Alamosa</a>", "SLV", "Colorado", "USA", "North America", 37.7, -105.92, " 2317.0", "2014-2016", "SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://gml.noaa.gov/aftp/data/radiation/surfrad/\">Rutland</a>", "RUT", "Vermont", "USA", "North America", 43.64, -72.97, " 184.0", "2014-2015", "SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://gml.noaa.gov/aftp/data/radiation/surfrad/\">Wasco</a>", "WAS", "Oregon", "USA", "North America", 45.59, -120.67, " 200.0", "2016-2017", "SURFRAD", "NOAA", "", "Freely", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["<a href=\"https://energydata.info/dataset/palau-solar-radiation-measurement-data\">Airai</a>", "", "", "Palau", "Oceania", 7.368513, 134.53983, " 47.0", "2020-2022", "PPA", "", "Two GHI thermopile pyranometers (Hukseflux SR30-D1 and SR20-T2), a SPN-1, three reference cells, and a weather station.", "Freely", "2", "SPN1", "G", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/vanuatu-solar-radiation-measurement-data\">Efate</a>", "", "", "Vanuatu", "Oceania", -17.709738, 168.211453, " 152.0", "2020-2022", "PPA", "", "The station is located on the UNELCO wind farm on Efate Island, Vanuatu.", "Freely", "2", "SPN1", "G", "Af", "Tropical"], ["<a href=\"https://energydata.info/dataset/nauru-solar-radiation-measurement-data\">Nauru</a>", "", "", "Nauru", "Oceania", 0.543447, 166.93197, " 28.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/federates-states-of-micronesia-solar-radiation-measurement-data\">Chuuk</a>", "", "", "Federated States of Micronesia", "Oceania", 7.467517, 151.849834, " 4.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/papua-new-guinea-solar-radiation-measurement-data\">Alotau</a>", "", "", "Papua New Guinea", "Oceania", -10.310113, 150.337975, " 20.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Af", "Tropical"], ["<a href=\"https://energydata.info/dataset/solomon-islands-solar-radiation-measurement-data\">Honiara</a>", "", "", "Solomon Islands", "Oceania", -9.438163, 160.063212, " 4.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Af", "Tropical"], ["<a href=\"https://energydata.info/dataset/marshall-islands-solar-radiation-measurement-data\">Majuro</a>", "", "", "Marshall Islands", "Oceania", 7.065048, 171.268887, " 5.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/tuvalu-solar-radiation-measurement-data\">Funafuti</a>", "", "", "Tuvalu", "Oceania", -8.525087, 179.196323, " 0.0", "2020-2022", "PPA", "", "", "Freely", "2", "SPN1", "G", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/lebanon-solar-radiation-measurements\">Lari Tal Amara</a>", "LBAMA", "", "Lebanon", "Asia", 33.85679, 35.98659, " 935.0", "2019-2021", "ESMAP", "", "", "Freely", "2", "RSI", "G", "Csa", "Temperate"], ["<a href=\"https://energydata.info/dataset/lebanon-solar-radiation-measurements\">Ras Ballbak</a>", "LBRAS", "", "Lebanon", "Asia", 34.272946, 36.427053, " 910.0", "2019-2021", "", "World Bank", "", "Freely", "2", "RSI", "G", "Csa", "Temperate"], ["<a href=\"https://www.zamg.ac.at/cms/de/klima/klimaforschung/datensaetze/arad\">Wien</a>", "", "", "Austria", "Europe", 48.25, 16.36, " 198.0", "2011-", "ARAD", "ZAMG", "", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.zamg.ac.at/cms/de/klima/klimaforschung/datensaetze/arad\">Graz</a>", "", "", "Austria", "Europe", 47.08, 15.45, " 398.0", "2011-", "ARAD", "ZAMG", "", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.zamg.ac.at/cms/de/klima/klimaforschung/datensaetze/arad\">Innsbruck</a>", "", "", "Austria", "Europe", 47.26, 11.38, " 578.0", "2011-", "ARAD", "ZAMG", "", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.zamg.ac.at/cms/de/klima/klimaforschung/datensaetze/arad\">Kanzelh\u00f6he</a>", "", "", "Austria", "Europe", 46.68, 13.9, " 1540.0", "2013-", "ARAD", "ZAMG", "", "Upon request", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://www.meteoswiss.admin.ch/home/climate/swiss-climate-in-detail/radiation-monitoring.html\">Davos</a>", "DAV", "", "Switzerland", "Europe", 46.813, 9.844, " 1610.0", "2000-", "WMO RRC", "MeteoSwiss", "GHI started in 1995, DNI in 2000, and diffuse in 2003.", "Upon request", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"https://www.meteoswiss.admin.ch/home/climate/swiss-climate-in-detail/radiation-monitoring.html\">Jungfraujoch</a>", "JUN", "", "Switzerland", "Europe", 46.55, 7.99, " 3582.0", "1996-", "", "MeteoSwiss", "No diffuse measurements due to too hars meteorological conditions.", "Upon request", "1", "Thermopile", "G;B;D", "ET", "Polar"], ["<a href=\"https://www.meteoswiss.admin.ch/home/climate/swiss-climate-in-detail/radiation-monitoring.html\">Locarno-Monti</a>", "OTL", "", "Switzerland", "Europe", 46.18, 8.783, " 366.0", "2000-", "", "MeteoSwiss", "GHI from 1996, DNI from 2000, and diffuse from 2001.", "Upon request", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://doi.org/10.5281/zenodo.4408667\">Amitie</a>", "amitie", "", "Seychelles", "Africa", -4.321022, 55.693361, " 3.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408665\">Anse Boileau</a>", "anseboileau", "", "Seychelles", "Africa", -4.710958, 55.484732, " 2.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408673\">Antananarivo</a>", "antananarivo", "", "Madagascar", "Africa", -18.89833, 47.546422, " 1309.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Cwb", "Temperate"], ["<a href=\"https://doi.org/10.5281/zenodo.7092821\">Bras Panon Moreau</a>", "braspanonmoreau", "", "Reunion", "Africa", -21.002649, 55.682897, " 20.0", "2010-2014", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.5812546\">Caverne Dufour</a>", "cavernedufour", "", "Reunion", "Africa", -21.109176, 55.495655, " 2495.0", "2021-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092842\">Cilaos Bras Sec</a>", "cilaosbrassec", "", "Reunion", "Africa", -21.141754, 55.489703, " 1269.0", "2012-2013", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092835\">Cilaos Piscine</a>", "cilaospiscine", "", "Reunion", "Africa", -21.136158, 55.47416, " 1213.0", "2013-2016", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092847\">Cilaos Thermes</a>", "cilaosthermes", "", "Reunion", "Africa", -21.12894, 55.47332, " 1255.8", "2012-2013", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092849\">Cratere Bory</a>", "craterebory", "", "Reunion", "Africa", -21.244138, 55.709018, " 2584.2", "2016-2021", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408675\">Antsiranana (Diego Suarez)</a>", "diego", "", "Madagascar", "Africa", -12.348602, 49.293412, " 108.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Aw", "Tropical"], ["<a href=\"https://doi.org/10.5281/zenodo.7092844\">Durban</a>", "durban", "", "South Africa", "Africa", -29.87098, 30.97695, " 150.0", "2013-2018", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Cfa", "Temperate"], ["<a href=\"https://doi.org/10.5281/zenodo.4408671\">Hahaya</a>", "hahaya", "", "Comoros", "Africa", -11.539412, 43.278112, " 32.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Af", "Tropical"], ["<a href=\"https://doi.org/10.5281/zenodo.7092858\">Le Port Barbusse</a>", "leportbarbusse", "", "Reunion", "Africa", -20.934157, 55.30779, " 16.96", "2010-2021", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092855\">Le Port Mairie</a>", "leportmairie", "", "Reunion", "Africa", -20.935233, 55.290266, " 12.0", "2015-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408660\">Radio Telescope Bras D'Eau</a>", "mrtbrasdeau", "", "Mauritius", "Africa", -20.139386, 57.726052, " 27.0", "2015-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092871\">Observatoire du Piton de La Fournaise</a>", "observatoirevolcan", "", "Reunion", "Africa", -21.208587, 55.571453, " 1556.0", "2016-2018", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408669\">Ouani</a>", "ouani", "", "Comoros", "Africa", -12.132659, 44.42928, " 20.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092867\">Piton des Neiges</a>", "pitondesneiges", "", "Reunion", "Africa", -21.095596, 55.480305, " 2990.0", "2021-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408677\">Plaine des Palmistes Parc National</a>", "plaineparcnational", "", "Reunion", "Africa", -21.1367, 55.6241, " 1057.0", "2018-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4001619\">Reserve Francois Leguat</a>", "reservetortues", "", "Mauritius", "Africa", -19.757625, 63.37075, " 36.0", "2017-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092890\">Sainte Rose Mairie</a>", "sainterosemairie", "", "Reunion", "Africa", -21.127324, 55.793136, " 24.0", "2013-2016", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092888\">Saint Joseph Marie</a>", "saintjosephmairie", "", "Reunion", "Africa", -21.379077, 55.619688, " 36.0", "2013-2015", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092894\">Saint Louis Lycee Jean Joly</a>", "saintlouisjeanjoly", "", "Reunion", "Africa", -21.271391, 55.43558, " 152.0", "2016-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092910\">University of La Reunion Moufia</a>", "urmoufia", "", "Reunion", "Africa", -20.90146, 55.483593, " 96.0", "2008-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.7092912\">University of La Reunion Tampon</a>", "urtampon", "", "Reunion", "Africa", -21.269277, 55.50702, " 553.0", "2012-2014", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://doi.org/10.5281/zenodo.4408662\">Vacoas</a>", "vacoas", "", "Mauritius", "Africa", -20.297095, 57.496918, " 431.0", "2019-", "IOS-net", "", "UV radiation is also measured.", "Freely", "2", "SPN1", "", "Ocean", "Ocean"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">HBKU-B2</a>", "B2", "", "Qatar", "Asia", 25.32, 51.42, "", "2012-2017&2021-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Kharsaah</a>", "Kha", "", "Qatar", "Asia", 25.22, 51.0, "", "2019-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Abu Samra</a>", "Abu", "", "Qatar", "Asia", 24.75, 50.82, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Batna</a>", "Bat", "", "Qatar", "Asia", 25.1, 51.17, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Ghuwayriyah</a>", "Ghu", "", "Qatar", "Asia", 25.84, 51.27, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Jumayliyah</a>", "Jum", "", "Qatar", "Asia", 25.61, 51.08, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Karaanah</a>", "Kar", "", "Qatar", "Asia", 25.01, 51.04, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Shehaimiyah</a>", "She", "", "Qatar", "Asia", 25.86, 50.96, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Wakrah</a>", "Wak", "", "Qatar", "Asia", 25.19, 51.62, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Dukhan</a>", "Duk", "", "Qatar", "Asia", 25.41, 50.76, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Turayna</a>", "Tur", "", "Qatar", "Asia", 24.74, 51.21, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Khor</a>", "Kho", "", "Qatar", "Asia", 25.66, 51.46, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Al Shahaniya</a>", "Sha", "", "Qatar", "Asia", 25.39, 51.11, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D;UV;IR", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Ghasham Farm</a>", "Gha", "", "Qatar", "Asia", 24.85, 51.27, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.hbku.edu.qa/en/qeeri/energy-center\">Sudanthile</a>", "Sud", "", "Qatar", "Asia", 24.63, 51.06, "", "2020-", "QEERI", "QEERI", "", "Upon request", "1", "Thermopile", "G;B;D;UV;IR", "BWh", "Dry"], ["Jang Bogo", "JBS", "", "Antarctica", "Antarctica", -74.3719, 164.1344, " 26.0", "2015-", "", "KOPRI-CNR", "", "", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["<a href=\"https://www.psa.es/en/facilities/meteo/meteo.php\">Plataforma Solar de Almeria</a>", "METAS", "", "Spain", "Europe", 37.09165, -2.36355, " 494.0", "2005-", "", "CIEMAT", "", "", "1", "Thermopile", "G;B;D;UV;IR", "Csa", "Temperate"], ["<a href=\"https://www.hshl.de/forschung-unternehmen/forschungsprojekte/meteorologische-messstation/\">Hamm-Lippstadt University of Applied Science</a>", "HSHL", "", "Germany", "Europe", 51.682, 7.843, " 60.0", "2016-", "", "Hamm-Lippstadt University", "", "", "2", "Thermopile;RSI", "G;RSI", "Cfb", "Temperate"], ["<a href=\"https://dkasolarcentre.com.au/locations/nt-solar-resource/alice-springs-2\">Alice Springs</a>", "", "Northern Territory", "Australia", "Oceania", -23.762361, 133.875389, "", "2019-", "", "DKA Solar Centre", "Parameters sampled at 1-second intervals and averaged at 5-second intervals", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://dkasolarcentre.com.au/locations/nt-solar-resource/tennant-creek\">Tennant Creek</a>", "", "Northern Territory", "Australia", "Oceania", -19.6795, 134.2615, "", "2019-", "", "DKA Solar Centre", "Parameters sampled at 1-second intervals and averaged at 5-second intervals", "Freely", "2", "Thermopile", "G;B", "BSh", "Dry"], ["<a href=\"https://dkasolarcentre.com.au/locations/nt-solar-resource/katherine\">Katherine</a>", "", "Northern Territory", "Australia", "Oceania", -14.474694, 132.305083, "", "2019-", "", "DKA Solar Centre", "Parameters sampled at 1-second intervals and averaged at 5-second intervals", "Freely", "2", "Thermopile", "G;B", "Aw", "Tropical"], ["<a href=\"http://les.edu.uy/en/rmcis-en/\">Artigas Airport</a>", "ARM", "", "Uruguay", "South America", -30.3984, -56.5117, " 136.0", "2011-", "", "Uruguay Solar Energy Laboratory", "", "", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"http://les.edu.uy/en/rmcis-en/\">Salto Grande</a>", "LES", "", "Uruguay", "South America", -31.2827, -57.9181, " 56.0", "2015-", "", "Uruguay Solar Energy Laboratory", "", "", "1", "Thermopile", "G;B;D;UV;IR", "Cfa", "Temperate"], ["<a href=\"http://les.edu.uy/en/rmcis-en/\">EE Palo a Pique</a>", "PPI", "", "Uruguay", "South America", -33.2581, -54.4804, " 26.0", "2016-", "", "Uruguay Solar Energy Laboratory", "", "", "2", "Thermopile", "G;D", "Cfa", "Temperate"], ["<a href=\"http://les.edu.uy/en/rmcis-en/\">Las Brujas</a>", "LBI", "", "Uruguay", "South America", -34.672, -56.3401, " 38.0", "2010-", "", "Uruguay Solar Energy Laboratory", "", "", "2", "Thermopile", "G;D", "Cfa", "Temperate"], ["<a href=\"http://les.edu.uy/en/rmcis-en/\">EE La Magnolia</a>", "TAI", "", "Uruguay", "South America", -31.709, -55.8269, " 142.0", "2015-", "", "Uruguay Solar Energy Laboratory", "", "", "2", "Thermopile", "G;D", "Cfa", "Temperate"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/cuiaba.html\">Cuiab\u00e1</a>", "CBA", "", "Brazil", "South America", -15.5553, -56.07, " 185.0", "2006-2012", "SONDA", "INPE", "No photos or instument info was provided", "Freely", "", "", "G;D", "Aw", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/campogrande.html\">Campo Grande</a>", "CGR", "", "Brazil", "South America", -20.4383, -54.5383, " 677.0", "2004-2016", "SONDA", "INPE", "Diffuse is measured with a shadowband", "Freely", "2", "Thermopile", "G;D", "Aw", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/palmas.html\">Palmas</a>", "PMA", "", "Brazil", "South America", -10.1778, -48.3619, " 216.0", "2005-2016", "SONDA", "INPE", "Diffuse is measured with a shadowband", "Freely", "2", "Thermopile", "G;D", "Aw", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/saoluiz.html\">S\u00e3o Luiz</a>", "SLZ", "", "Brazil", "South America", -2.5933, -44.2122, " 40.0", "2007-2019", "SONDA", "INPE", "No maintenance between 2016-2017. Diffuse is measured with a shadowband", "Freely", "2", "Thermopile", "G;D", "As", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/caico.html\">Caic\u00f3</a>", "CAI", "", "Brazil", "South America", -6.4669, -37.0847, " 176.0", "2002-2019", "SONDA", "INPE", "No maintenance between 2016-2017", "Freely", "2", "Thermopile", "G;B;IR", "Aw", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/natal.html\">Natal</a>", "NAT", "", "Brazil", "South America", -5.8367, -35.2064, " 58.0", "2007-2019", "SONDA", "INPE", "No maintenance between 2016-2017. Diffuse is measured with a shadowband", "Freely", "2", "Thermopile", "G;D", "As", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/cachoeira.html\">Cachoeira Paulista</a>", "CPA", "", "Brazil", "South America", -22.6896, -45.0062, " 574.0", "2014-2019", "SONDA", "INPE", "No maintenance between 2016-2017. No photos or instument info was provided", "Freely", "", "", "G;B;D", "Cfa", "Temperate"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/joinville.html\">Joinville</a>", "JOI", "", "Brazil", "South America", -26.2525, -48.8578, " 48.0", "2009-2015", "SONDA", "INPE", "No photos or instument info was provided", "Freely", "", "", "G;D", "Af", "Tropical"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/sombrio.html\">Sombrio</a>", "SBR", "", "Brazil", "South America", -29.0956, -49.8133, " 15.0", "2004-2016", "SONDA", "INPE", "No photos or instument info was provided", "Freely", "", "", "G;D", "Cfa", "Temperate"], ["<a href=\"http://sonda.ccst.inpe.br/basedados/ourinhos.html\">Ourinhos</a>", "ORN", "", "Brazil", "South America", -22.9486, -49.8942, " 446.0", "2006-2019", "SONDA", "INPE", "No maintenance between 2016-2017. Diffuse is measured with a shadowband", "Freely", "2", "Thermopile", "G;D", "Aw", "Tropical"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Abha</a>", "", "", "Saudi Arabia", "Asia", 18.23, 42.66, " 2039.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Al-ahsa</a>", "", "", "Saudi Arabia", "Asia", 25.3, 49.48, " 178.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Gizan</a>", "", "", "Saudi Arabia", "Asia", 16.9, 42.58, " 7.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Qassim</a>", "", "", "Saudi Arabia", "Asia", 26.31, 43.77, " 647.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Jeddah</a>", "", "", "Saudi Arabia", "Asia", 21.68, 39.15, " 4.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Al-Madinah</a>", "", "", "Saudi Arabia", "Asia", 24.55, 39.7, " 626.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Al-qaisumah</a>", "", "", "Saudi Arabia", "Asia", 28.32, 46.13, " 358.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Sharurah</a>", "", "", "Saudi Arabia", "Asia", 17.47, 47.11, " 725.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Al-Jouf</a>", "", "", "Saudi Arabia", "Asia", 29.79, 40.1, " 669.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Tabouk</a>", "", "", "Saudi Arabia", "Asia", 28.38, 36.61, " 768.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/saudi-arabia.html\">Wadi Al-Dawaser</a>", "", "", "Saudi Arabia", "Asia", 20.44, 44.68, " 701.0", "1998-2003", "", "NREL;KACST", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Evora;Mitra", "", "", "Portugal", "Europe", 38.531, -8.011, " 220.0", "2014-", "", "University of \u00c9vora", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["Badajoz", "", "", "Spain", "Europe", 38.886028, -7.00925, " 190.0", "2008-", "", "University of Extremadura", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["Varennes", "", "Quebec", "Canada", "North America", 45.6265, -73.38203, " 22.0", "1995-", "", "Natural Resources Canada", "Complete station upgrade in 2017. Prior to 2017, station was rather unreliable and maintenance was less rigorous. Spectral radiation measurements using Spectrafy sensors also available.", "Upon request", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Shagaya", "", "", "Kuwait", "Asia", 29.2099, 47.0603, " 241.0", "2012-?", "", "KISR", "", "", "1", "Thermopile;RSI", "G;B;D;RSI", "BWh", "Dry"], ["Kabed", "", "", "Kuwait", "Asia", 29.173152, 47.728054, " 76.0", "2012-?", "", "KISR", "", "", "1", "Thermopile;RSI", "G;B;D;RSI", "BWh", "Dry"], ["Mutribah", "", "", "Kuwait", "Asia", 29.9, 47.28, "", "2012-?", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["Sabryia", "", "", "Kuwait", "Asia", 29.67, 47.93, "", "2012-?", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["Gudair", "", "", "Kuwait", "Asia", 28.88, 47.71, "", "2012-?", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["Varennes", "", "Quebec", "Canada", "North America", 45.6265, -73.38203, " 22.0", "1995-", "", "Natural Resources Canada", "Complete station upgrade in 2017. Prior to 2017, station was rather unreliable and maintenance was less rigorous. Spectral radiation measurements using Spectrafy sensors also available.", "Upon request", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Shagaya", "", "", "Kuwait", "Asia", 29.2099, 47.0603, " 241.0", "2012-", "", "KISR", "", "", "1", "Thermopile;RSI", "G;B;D;RSI", "BWh", "Dry"], ["Kabed", "", "", "Kuwait", "Asia", 29.173152, 47.728054, " 76.0", "2012-", "", "KISR", "", "", "1", "Thermopile;RSI", "G;B;D;RSI", "BWh", "Dry"], ["Mutribah", "", "", "Kuwait", "Asia", 29.9, 47.28, "", "2012-", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["Sabryia", "", "", "Kuwait", "Asia", 29.67, 47.93, "", "2012-", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["Gudair", "", "", "Kuwait", "Asia", 28.88, 47.71, "", "2012-", "", "KISR", "Location is approximate", "", "2", "Thermopile;RSI", "G;RSI", "BWh", "Dry"], ["<a href=\"https://litdb.fmi.fi/soundingst_radiation.php\">Arctic Space Centre Sodankyl\u00e4</a>", "", "", "Finland", "Europe", 67.36664, 26.628253, " 195.0", "2016-", "", "FMI", "Data is likely of poor quality.", "Freely", "1", "Thermopile", "G;B;D", "Dfc", "Continental"], ["Odeillo", "", "", "France", "Europe", 42.4942, 2.0295, " 1530.0", "1996-?", "", "PROMES", "Altitude is approximate", "", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Pozo Almonte</a>", "PALM", "", "Chile", "South America", -20.26, -69.78, " 1024.0", "2008-2021", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Crucero II</a>", "Crucero2", "", "Chile", "South America", -22.27, -69.57, " 1183.0", "2012-2022", "", "Ministry of Energy of Chile", "", "Freely", "1", "Thermopile", "G;B;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Aeropuerto Copiapo</a>", "ADDA", "", "Chile", "South America", -27.26, -70.78, " 210.0", "2013-2014", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Inca de Oro</a>", "IDEO", "", "Chile", "South America", -26.75, -69.91, " 1541.0", "2010-2021", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Pampa Camarones</a>", "CAMA", "", "Chile", "South America", -18.86, -70.22, " 795.0", "2010-2017", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">San Pedro de Atacama</a>", "SPED", "", "Chile", "South America", -22.98, -68.16, " 2390.0", "2009-2014", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Aerodromo Salvador</a>", "SALV", "", "Chile", "South America", -26.31, -69.75, " 1617.0", "2010-2013", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Puerto Angamos</a>", "PANG", "", "Chile", "South America", -23.07, -70.39, " 10.0", "2010-2017", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Cerro Calan</a>", "CCALAN", "", "Chile", "South America", -33.4, -70.54, " 850.0", "2013-2022", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BSk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Armazones</a>", "ARMA", "", "Chile", "South America", -24.63, -70.24, " 2581.0", "2010-2014", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Crucero</a>", "CRUC", "", "Chile", "South America", -22.27, -69.57, " 1176.0", "2009-2014", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["<a href=\"https://solar.minenergia.cl/mediciones\">Salar (Chuquicamata)</a>", "SLAR", "", "Chile", "South America", -22.34, -68.88, " 2407.0", "2010-2013", "", "Ministry of Energy of Chile", "", "Freely", "2", "Thermopile", "G;D", "BWk", "Dry"], ["Arica", "", "", "Chile", "South America", -18.47, -70.31, "", "2011-?", "FONDEF", "", "", "", "2", "RSP", "", "BWh", "Dry"], ["Pozo Almonte", "", "", "Chile", "South America", -20.25, -69.78, "", "2012-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["Patache", "", "", "Chile", "South America", -20.8, -70.19, "", "2013-?", "FONDEF", "", "", "", "2", "RSP", "", "BWh", "Dry"], ["Sur Viejo", "", "", "Chile", "South America", -20.95, -69.54, "", "2011-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["Crucero", "", "", "Chile", "South America", -22.27, -69.56, "", "2012-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["Coya Sur", "", "", "Chile", "South America", -22.39, -69.62, "", "2011-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["San Pedro", "", "", "Chile", "South America", -22.9, -68.19, "", "2010-2011", "FONDEF", "", "", "", "1", "Thermopile", "G;B;D", "BWk", "Dry"], ["El Tesoro", "", "", "Chile", "South America", -22.93, -69.07, "", "2009-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["Diego de Almagro", "", "", "Chile", "South America", -26.38, -70.04, "", "2011-?", "FONDEF", "", "", "", "2", "RSP", "", "BWk", "Dry"], ["Santiago", "", "", "Chile", "South America", -33.45, -70.65, "", "2010-?", "FONDEF;WMO RRC", "", "", "", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["Curic\u00f3", "", "", "Chile", "South America", -34.97, -71.25, "", "2012-?", "FONDEF", "", "", "", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["Talca", "", "", "Chile", "South America", -35.42, -71.64, "", "2012-?", "FONDEF", "", "", "", "1", "Thermopile", "G;B;D", "Csb", "Temperate"], ["Marimaura", "", "", "Chile", "South America", -35.84, -71.61, "", "2012-?", "FONDEF", "", "", "", "2", "RSP", "", "Csb", "Temperate"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">Nevada Regional Test Center</a>", "RTC-NV", "Nevada", "USA", "North America", 36.0277, -114.9195, " 701.0", "2014-", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">New Mexico Regional Test Center</a>", "RTC-NM", "New Mexico", "USA", "North America", 35.0542, -106.5385, " 1659.0", "2014-", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">Florida Regional Test Center</a>", "RTC-FL", "Florida", "USA", "North America", 28.40509, -80.7709, " 10.0", "2014-", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">Vermont Regional Test Center</a>", "RTC-VT", "Vermont", "USA", "North America", 44.4665, -73.1024, " 107.0", "2014-2020", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">Colorado Regional Test Center</a>", "RTC-CO", "Colorado", "USA", "North America", 39.7407, -105.1771, " 1783.0", "2014-", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://rtc.sandia.gov/about-the-us-doe-regional-test-centers/rtc-fact-sheets/\">Michigan Regional Test Center</a>", "RTC-MI", "Michigan", "USA", "North America", 47.1699, -88.5061, " 336.0", "2021-", "DOE RTC", "US DOE", "", "Not available", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["Barrani", "", "", "Egypt", "Africa", 31.6, 26.0, " 23.7", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["Matruh", "", "", "Egypt", "Africa", 31.33, 27.22, " 25.0", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["El-Arish", "", "", "Egypt", "Africa", 31.08, 33.82, " 27.2", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["Cairo", "", "", "Egypt", "Africa", 30.08, 31.28, " 34.4", "2004-?", "WMO RRC", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["El-Kharga", "", "", "Egypt", "Africa", 25.45, 30.53, " 77.8", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["El-Farafra", "", "", "Egypt", "Africa", 27.06, 27.99, " 82.2", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Asyut", "", "", "Egypt", "Africa", 27.2, 31.17, " 52.0", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "2", "Thermopile", "G;D", "BWh", "Dry"], ["Aswan", "", "", "Egypt", "Africa", 23.97, 32.78, " 192.5", "2004-?", "", "Egyptian Meteorological Authority (EMA)", "Data from 2004-2010 can be downloaded from http://www.pangaea.de/ using the unique identifier \"doi:10.1594/PANGAEA.848804\"", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["La Quiaca", "LQ", "", "Argentina", "South America", -22.1, -65.6, " 3468.0", "2005-", "SMN", "Argentine Servicio Meteorologico Nacional", "Diffuse measured with shadowring", "Upon request", "2", "Thermopile", "G;D", "BSk", "Dry"], ["Pilar", "PIL", "", "Argentina", "South America", -31.67, -63.88, " 335.0", "2013-", "SMN", "Argentine Servicio Meteorologico Nacional", "Diffuse measured with shadowring", "Upon request", "2", "Thermopile", "G;D", "Cwa", "Temperate"], ["Buenos Aires", "BSAS", "", "Argentina", "South America", -34.5901, -58.4837, " 30.0", "2013-", "SMN;WMO RRC", "Argentine Servicio Meteorologico Nacional", "Diffuse measured with shadowring", "Upon request", "2", "Thermopile", "G;D", "Cfa", "Temperate"], ["Pto. San Juli\u00e1n", "PSJu", "", "Argentina", "South America", -49.31, -67.8, " 50.0", "2013-", "SMN", "Argentine Servicio Meteorologico Nacional", "Diffuse measured with shadowring", "Upon request", "2", "Thermopile", "G;D", "BSk", "Dry"], ["Ushuaia", "USH", "", "Argentina", "South America", -54.85, -68.31, " 11.0", "2013-", "SMN;WMO GAW", "Argentine Servicio Meteorologico Nacional", "Diffuse measured with shadowband", "Upon request", "2", "Thermopile", "G;D", "ET", "Polar"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Broome Airport</a>", "", "Western Australia", "Australia", "Oceania", -17.9475, 122.2352, " 7.42", "1996-?", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Learmonth Airport</a>", "", "Western Australia", "Australia", "Oceania", -22.2406, 114.0967, " 5.0", "1996-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BWh", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Geraldton Airport</a>", "", "Western Australia", "Australia", "Oceania", -28.7953, 114.6975, " 33.0", "1996-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Csa", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Kalgoorlie-Boulder Airport</a>", "", "Western Australia", "Australia", "Oceania", -30.7847, 121.4533, " 365.3", "1998-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Tennant Creek Airport</a>", "", "Northern Territory", "Australia", "Oceania", -19.6423, 134.1833, " 375.7", "1996-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Adelaide Airport</a>", "", "South Australia", "Australia", "Oceania", -34.9524, 138.5196, " 2.0", "2003-2020", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Csb", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Mount Gambier Aero</a>", "", "South Australia", "Australia", "Oceania", -37.7473, 140.7739, " 63.0", "1998-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Csb", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Mildura Airport</a>", "", "New South Wales", "Australia", "Oceania", -34.2358, 142.0867, " 50.0", "1996-2006", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSk", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Longreach Aero</a>", "", "Quennsland", "Australia", "Oceania", -23.4397, 144.2828, " 192.2", "2012-2015", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Melbourne Airport</a>", "", "Victoria", "Australia", "Oceania", -37.6654, 144.8322, " 113.4", "1999-?", "BOM;WMO RRC", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfb", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Cape Grim</a>", "", "Tasmania", "Australia", "Oceania", -40.6817, 144.6892, " 95.0", "1997-?", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfb", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Cairns Aero</a>", "", "Queensland", "Australia", "Oceania", -16.8736, 145.7458, " 2.22", "1997-2004", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Am", "Tropical"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Wagga Wagga</a>", "", "New South Wales", "Australia", "Oceania", -35.1583, 147.4575, " 212.0", "1997-2020", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Rockhampton Aero</a>", "", "Queensland", "Australia", "Oceania", -23.3753, 150.4775, " 10.4", "1996-?", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["<a href=\"http://www.bom.gov.au/climate/data/oneminsolar/about-IDCJAC0022.shtml\">Townsville</a>", "", "Queensland", "Australia", "Oceania", -19.2483, 146.7661, " 4.34", "2012-2020", "BOM", "BOM", "", "Freely", "1", "Thermopile", "G;B;D;IR", "Aw", "Tropical"], ["Lagos", "", "", "Nigeria", "Africa", 6.6, 3.43, " 10.0", "1993-?", "WMO GAW;WMO RRC", "NIMET", "DHI is possibly measured with a shadownband.", "", "2", "Thermopile", "G;D;UV", "Aw", "Tropical"], ["Oshogbo", "", "", "Nigeria", "Africa", 7.78, 4.48, " 304.5", "1993-?", "WMO GAW;WMO RRC", "NIMET", "DHI is possibly measured with a shadownband.", "", "2", "Thermopile", "G;D;UV", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chilakapalem</a>", "", "", "India", "Asia", 18.27, 83.809, " 87.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Rajahmundry</a>", "", "", "India", "Asia", 17.065, 81.867, " 93.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kadiri</a>", "", "", "India", "Asia", 14.11, 78.147, " 531.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Tirupati</a>", "", "", "India", "Asia", 13.627, 79.397, " 190.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Guntur</a>", "", "", "India", "Asia", 16.374, 80.526, " 31.0", "2015-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Medak</a>", "", "", "India", "Asia", 18.041, 78.266, " 467.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bilaspur</a>", "", "", "India", "Asia", 22.075, 82.184, " 267.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Charanka</a>", "", "", "India", "Asia", 23.893, 71.212, " 12.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bhogat</a>", "", "", "India", "Asia", 22.029, 69.261, " 14.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jambua</a>", "", "", "India", "Asia", 22.216, 73.19, " 29.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Keshod</a>", "", "", "India", "Asia", 21.275, 70.212, " 61.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Vartej</a>", "", "", "India", "Asia", 21.741, 72.071, " 30.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Idar</a>", "", "", "India", "Asia", 23.83, 73.003, " 221.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kotada Pitha</a>", "", "", "India", "Asia", 21.948, 71.21, " 207.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chandrodi</a>", "", "", "India", "Asia", 23.334, 70.637, " 74.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Tharad</a>", "", "", "India", "Asia", 24.377, 71.63, " 67.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Sadodar</a>", "", "", "India", "Asia", 22.051, 70.235, " 192.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Leh</a>", "", "", "India", "Asia", 34.14, 77.481, " 3252.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWk", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Haveri</a>", "", "", "India", "Asia", 14.788, 75.345, " 567.0", "2015-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Gokak</a>", "", "", "India", "Asia", 16.288, 74.835, " 575.0", "2015-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kalaburagi(Gulbarga)</a>", "", "", "India", "Asia", 17.32, 76.855, " 478.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Vijayapura(Bijapur)</a>", "", "", "India", "Asia", 16.847, 75.752, " 567.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chitradurga</a>", "", "", "India", "Asia", 14.216, 76.428, " 760.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Gwalior</a>", "", "", "India", "Asia", 26.223, 78.19, " 210.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Rajgarh</a>", "", "", "India", "Asia", 23.987, 76.727, " 412.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Sitamau</a>", "", "", "India", "Asia", 23.984, 75.331, " 469.0", "2015-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Karad</a>", "", "", "India", "Asia", 17.31, 74.186, " 599.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Shegaon</a>", "", "", "India", "Asia", 20.78, 76.679, " 288.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Pandharpur</a>", "", "", "India", "Asia", 17.656, 75.369, " 480.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Amarsagar</a>", "", "", "India", "Asia", 26.942, 70.874, " 273.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kota</a>", "", "", "India", "Asia", 25.141, 75.81, " 304.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bodana</a>", "", "", "India", "Asia", 27.606, 72.109, " 168.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Mathania</a>", "", "", "India", "Asia", 26.516, 72.985, " 271.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Sirohi</a>", "", "", "India", "Asia", 24.517, 72.786, " 362.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Abu Road</a>", "", "", "India", "Asia", 24.519, 72.783, " 276.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Phalodi</a>", "", "", "India", "Asia", 27.118, 72.345, " 242.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Balotra</a>", "", "", "India", "Asia", 25.805, 72.237, " 126.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ratangarh</a>", "", "", "India", "Asia", 28.082, 74.6, " 312.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ajmer</a>", "", "", "India", "Asia", 26.4, 74.661, " 501.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jodhpur</a>", "", "", "India", "Asia", 26.271, 73.035, " 233.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Pokhran</a>", "", "", "India", "Asia", 26.916, 71.928, " 293.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bagora</a>", "", "", "India", "Asia", 25.214, 72.018, " 91.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chennai</a>", "", "", "India", "Asia", 12.956, 80.217, " 1.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Karaikudi</a>", "", "", "India", "Asia", 10.086, 78.796, " 101.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ramanathapuram</a>", "", "", "India", "Asia", 9.369, 78.77, " 10.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kayathar</a>", "", "", "India", "Asia", 8.945, 77.723, " 102.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Erode</a>", "", "", "India", "Asia", 11.27, 77.604, " 272.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Trichy</a>", "", "", "India", "Asia", 10.76, 78.813, " 87.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Vellore</a>", "", "", "India", "Asia", 12.974, 79.159, " 231.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Puducherry</a>", "", "", "India", "Asia", 11.96, 79.811, " 36.0", "2011-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Port Blair</a>", "", "", "India", "Asia", 11.614, 92.716, " 65.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kadapa</a>", "", "", "India", "Asia", 14.52, 78.785, " 145.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Mahbubnagar</a>", "", "", "India", "Asia", 16.698, 77.94, " 461.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Warangal</a>", "", "", "India", "Asia", 18.075, 79.705, " 278.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Itanagar</a>", "", "", "India", "Asia", 27.1, 93.62, " 333.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Pasighat</a>", "", "", "India", "Asia", 28.047, 95.334, " 152.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Silchar</a>", "", "", "India", "Asia", 24.759, 92.791, " 45.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Tezpur</a>", "", "", "India", "Asia", 26.699, 92.833, " 83.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Aurangabad</a>", "", "", "India", "Asia", 24.837, 84.284, " 104.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Muzaffarpur</a>", "", "", "India", "Asia", 26.141, 85.367, " 49.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Purnea</a>", "", "", "India", "Asia", 25.798, 87.504, " 30.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chandigarh</a>", "", "", "India", "Asia", 30.748, 76.756, " 346.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ambikapur</a>", "", "", "India", "Asia", 23.149, 83.149, " 603.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Silvassa</a>", "", "", "India", "Asia", 20.215, 73.037, " 61.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Panaji</a>", "", "", "India", "Asia", 15.412, 73.977, " 114.0", "2015-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Surat</a>", "", "", "India", "Asia", 21.165, 74.783, " 34.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Murthal</a>", "", "", "India", "Asia", 29.028, 77.057, " 213.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Solan</a>", "", "", "India", "Asia", 30.853, 77.17, " 1231.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Palampur</a>", "", "", "India", "Asia", 32.098, 76.548, " 1268.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kargil</a>", "", "", "India", "Asia", 34.554, 76.139, " 2856.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSk", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Katra</a>", "", "", "India", "Asia", 32.94, 74.953, " 670.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Deoghar</a>", "", "", "India", "Asia", 24.513, 86.656, " 262.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jamshedpur</a>", "", "", "India", "Asia", 22.777, 86.144, " 182.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ranchi</a>", "", "", "India", "Asia", 23.443, 85.255, " 738.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Mysuru (Mysore)</a>", "", "", "India", "Asia", 12.371, 76.584, " 799.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Alappuzha</a>", "", "", "India", "Asia", 9.46, 76.331, " 19.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kannur</a>", "", "", "India", "Asia", 11.985, 75.385, " 70.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Indore</a>", "", "", "India", "Asia", 22.689, 75.874, " 565.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jabalpur</a>", "", "", "India", "Asia", 23.201, 79.912, " 385.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Khandwa</a>", "", "", "India", "Asia", 21.815, 76.369, " 308.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Rewa</a>", "", "", "India", "Asia", 24.555, 81.313, " 315.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Csa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bhandara</a>", "", "", "India", "Asia", 21.157, 79.578, " 274.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jalgaon</a>", "", "", "India", "Asia", 21.002, 75.548, " 254.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Shahada</a>", "", "", "India", "Asia", 21.571, 74.484, " 117.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Nashik</a>", "", "", "India", "Asia", 19.966, 73.661, " 688.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Osmanabad</a>", "", "", "India", "Asia", 18.145, 76.061, " 70.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Wardha</a>", "", "", "India", "Asia", 20.738, 78.592, " 297.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "As", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Imphal</a>", "", "", "India", "Asia", 24.802, 93.905, " 762.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Tura</a>", "", "", "India", "Asia", 25.525, 90.21, " 397.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Aizawl</a>", "", "", "India", "Asia", 23.743, 92.719, " 1188.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kohima</a>", "", "", "India", "Asia", 25.705, 94.056, " 1340.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bargarh</a>", "", "", "India", "Asia", 21.32, 83.525, " 213.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Bhubaneshwar</a>", "", "", "India", "Asia", 20.349, 85.89, " 20.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Similiguda</a>", "", "", "India", "Asia", 18.683, 82.833, " 920.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Rourkela</a>", "", "", "India", "Asia", 22.253, 84.901, " 220.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Talwandi Sabo</a>", "", "", "India", "Asia", 29.961, 75.122, " 341.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kapurthala</a>", "", "", "India", "Asia", 31.356, 75.444, " 240.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jaipur</a>", "", "", "India", "Asia", 26.809, 75.862, " 403.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Gangtok</a>", "", "", "India", "Asia", 27.373, 88.6, " 1920.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwb", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Agartala</a>", "", "", "India", "Asia", 23.839, 91.423, " 71.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Banda</a>", "", "", "India", "Asia", 25.451, 80.345, " 133.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Gorakhpur</a>", "", "", "India", "Asia", 26.73, 83.434, " 71.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Kanpur</a>", "", "", "India", "Asia", 26.493, 80.272, " 130.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Moradabad</a>", "", "", "India", "Asia", 28.872, 78.758, " 200.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Sultanpur</a>", "", "", "India", "Asia", 26.288, 82.082, " 90.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Dehradun</a>", "", "", "India", "Asia", 30.416, 77.967, " 844.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Nainital</a>", "", "", "India", "Asia", 29.357, 79.551, " 1323.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Murshidabad</a>", "", "", "India", "Asia", 26.288, 82.082, " 29.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Jalpaiguri</a>", "", "", "India", "Asia", 26.546, 88.703, " 87.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Aurangabad</a>", "", "", "India", "Asia", 19.868, 75.323, " 576.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Nanded</a>", "", "", "India", "Asia", 19.111, 77.293, " 392.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Thane</a>", "", "", "India", "Asia", 19.214, 73.183, " 40.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Pune (Manchar)</a>", "", "", "India", "Asia", 18.988, 73.963, " 685.0", "2013-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Washim</a>", "", "", "India", "Asia", 20.101, 77.137, " 546.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Latur</a>", "", "", "India", "Asia", 18.4, 76.56, " 638.0", "2014-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Nagpur</a>", "", "", "India", "Asia", 21.12, 79.051, " 303.0", "2016-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Chandrapur</a>", "", "", "India", "Asia", 19.921, 79.319, " 208.0", "2018-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Palakkad</a>", "", "", "India", "Asia", 10.613, 76.716, " 92.0", "2018-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://niwe.res.in/department_srra_stations_phase1.php\">Ramakkalmedu</a>", "", "", "India", "Asia", 9.816, 77.241, " 1045.0", "2018-", "SRRA", "National Institute of wind energy", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Uyaynah Research Station</a>", "", "", "Saudi Arabia", "Asia", 24.90689, 46.39721, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Abdullah University of Science and Technology</a>", "", "", "Saudi Arabia", "Asia", 22.3065, 39.10701, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">University of Dammam</a>", "", "", "Saudi Arabia", "Asia", 26.39519, 50.18898, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Abdulaziz University Main Campus</a>", "", "", "Saudi Arabia", "Asia", 21.49604, 39.24492, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Qassim University</a>", "", "", "Saudi Arabia", "Asia", 26.34668, 43.76645, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Jazan University</a>", "", "", "Saudi Arabia", "Asia", 16.96035, 42.54586, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Faisal University</a>", "", "", "Saudi Arabia", "Asia", 25.34616, 49.5956, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Taif University</a>", "", "", "Saudi Arabia", "Asia", 21.43278, 40.49173, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Wadi Addawasir College of Technology</a>", "", "", "Saudi Arabia", "Asia", 20.43008, 44.89433, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Tabuk University</a>", "", "", "Saudi Arabia", "Asia", 28.38287, 36.48396, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Wajh Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 26.2561, 36.443, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Royal Commission of Yanbu</a>", "", "", "Saudi Arabia", "Asia", 24.14434, 37.94569, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Arar Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 30.918154, 41.079801, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Jouf Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 29.79383, 40.04886, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Rania Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 21.21499, 42.84852, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Baha University</a>", "", "", "Saudi Arabia", "Asia", 20.17933, 41.63561, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Saline Water Conversion Corporation (Al Khafji)</a>", "", "", "Saudi Arabia", "Asia", 28.50671, 48.45504, "", "2014-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Najran University</a>", "", "", "Saudi Arabia", "Asia", 17.63228, 44.53735, "", "2013-?", "", "KACARE", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">KACARE City Site Tier 2 Station</a>", "", "", "Saudi Arabia", "Asia", 24.52958, 46.43635, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">KACARE Building Olaya St</a>", "", "", "Saudi Arabia", "Asia", 24.70814, 46.67896, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Fahd University of Petroleum & Minerals</a>", "", "", "Saudi Arabia", "Asia", 26.30355, 50.14412, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Abdulaziz University East Hada Alsham Campus</a>", "", "", "Saudi Arabia", "Asia", 21.80117, 39.72854, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Aflaaj Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 22.27948, 46.73319, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Afif Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 23.92118, 42.94815, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Dawadmi College of Technology</a>", "", "", "Saudi Arabia", "Asia", 24.5569, 44.47411, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Shaqra University</a>", "", "", "Saudi Arabia", "Asia", 25.17279, 45.14198, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Majmaah University</a>", "", "", "Saudi Arabia", "Asia", 25.85891, 45.41889, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Salmanbin Abdulaziz University</a>", "", "", "Saudi Arabia", "Asia", 24.14717, 47.26999, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Timaa Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 27.61727, 38.5252, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Saline Water Conversion Corporation (Hagl)</a>", "", "", "Saudi Arabia", "Asia", 29.28997, 34.93002, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Duba Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 27.34103, 35.72295, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Hanakiyah Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 24.85577, 40.536, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Saline Water Conversion Corporation (Umluj)</a>", "", "", "Saudi Arabia", "Asia", 25.00411, 37.27382, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Saline Water Desalination Research Institute</a>", "", "", "Saudi Arabia", "Asia", 26.9042, 49.76274, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Sharurah Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 17.47586, 47.08618, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Al Qunfudhah Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 19.15197, 41.08111, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Abdulaziz University (Osfan Campus)</a>", "", "", "Saudi Arabia", "Asia", 21.89252, 39.2539, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Hafar Al Batin Technical College</a>", "", "", "Saudi Arabia", "Asia", 28.33202, 45.95708, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Tuhamat Qahtan Technical Institute</a>", "", "", "Saudi Arabia", "Asia", 17.7749, 43.17555, "", "2013-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">Saline Water Conversion Corporation (Farasan)</a>", "", "", "Saudi Arabia", "Asia", 16.692097, 42.098767, "", "2014-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["<a href=\"https://rratlas.energy.gov.sa/RRMMDataPortal/MapTool\">King Saud University</a>", "", "", "Saudi Arabia", "Asia", 24.72359, 46.61639, "", "2014-?", "", "KACARE", "", "Freely", "2", "RSR", "", "BWh", "Dry"], ["Thiruvananthapuram", "TRV", "", "India", "Asia", 8.48, 76.95, " 60.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Bangalore", "BNG", "", "India", "Asia", 12.96, 77.58, " 921.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Hyderabad", "HYD", "", "India", "Asia", 17.45, 78.46, " 530.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Pune", "PNE", "", "India", "Asia", 18.53, 73.85, " 555.0", "1986-?", "WMO RRC", "India Meteorological Department (IMD)", "", "", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Bhopal", "BHP", "", "India", "Asia", 23.28, 77.35, " 523.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Csa", "Temperate"], ["Ranchi", "RNC", "", "India", "Asia", 23.31, 85.31, " 652.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["Varanasi", "VNS", "", "India", "Asia", 25.3, 83.01, " 90.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Csa", "Temperate"], ["Patna", "PTN", "", "India", "Asia", 25.6, 85.16, " 51.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["Jaipur", "JPR", "", "India", "Asia", 26.81, 75.8, " 390.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "BSh", "Dry"], ["New Delhi", "NDL", "", "India", "Asia", 28.48, 77.13, " 273.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "BSh", "Dry"], ["Srinagar", "SRN", "", "India", "Asia", 34.08, 74.83, " 1585.0", "1986-?", "", "India Meteorological Department (IMD)", "DHI is probably measured with shadowring", "", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://gawsis.meteoswiss.ch/GAWSIS/index.html#/search/station/stationReportDetails/0-20008-0-TOT\">Toronto</a>", "TOT", "Ontario", "Canada", "North America", 43.783333, -79.466667, " 198.0", "2014-", "WMO GAW;WMO RRC", "Environment Canada", "", "", "2", "Thermopile;RSI", "G;RSI", "Dfb", "Continental"], ["Peshawar", "", "", "Pakistan", "Asia", 34.0017, 71.4854, " 370.0", "2015-", "", "University of Engineering and Technology Peshawar", "", "", "2", "Thermopile;RSI", "G;RSI", "BSh", "Dry"], ["Uccle", "", "", "Belgium", "Europe", 50.798, 4.359, " 101.0", "2014-", "WMO RRC", "Royal Meteorological Institute of Belgium (RMI)", "Probably got the tracker in 2014.", "", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Mohe</a>", "", "", "China", "Asia", 52.97, 122.52, " 438.5", "2013-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "Dwc", "Continental"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Xilinhot</a>", "", "", "China", "Asia", 44.13, 116.33, " 1107.0", "2007-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "BSk", "Dry"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Yanqi</a>", "", "", "China", "Asia", 42.05, 86.61, " 1056.5", "2013-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "BWk", "Dry"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Shangdianzi</a>", "", "", "China", "Asia", 40.65, 117.12, " 293.3", "2013-", "CBSRN;WMO GAW", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "BSk", "Dry"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Xuchang</a>", "", "", "China", "Asia", 34.07, 113.93, " 67.2", "2013-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "Cwa", "Temperate"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Wenjiang</a>", "", "", "China", "Asia", 30.75, 103.86, " 547.7", "2013-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "Cwa", "Temperate"], ["<a href=\"https://www.re3data.org/repository/r3d100011141\">Dali</a>", "", "", "China", "Asia", 25.71, 100.18, " 1990.5", "2013-", "CBSRN", "China Meteorological Administration", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV", "Cwa", "Temperate"], ["<a href=\"http://climate.lzu.edu.cn/info/1046/1080.htm\">Semi-Arid Climate & Environment Observatory of Lanzhou University</a>", "SACOL", "", "China", "Asia", 35.946, 104.13708, " 1965.8", "2005-", "", "Lanzhou University", "", "", "1", "Thermopile;RSR", "G;B;D;RSR;UV", "BSk", "Dry"], ["Wuhan University", "WHU", "", "China", "Asia", 30.533, 114.35, " 30.0", "2006-?", "", "Wuhan University", "", "", "1", "Thermopile", "G;B;D;PAR", "Cfa", "Temperate"], ["<a href=\"https://gawsis.meteoswiss.ch/GAWSIS/#/search/station/stationReportDetails/0-20008-0-WLG\">Mt. Waliguan</a>", "", "", "China", "Asia", 36.28749, 100.8963, " 3810.0", "2011-", "WMO GAW", "", "", "", "1", "Thermopile", "G;B;D;IR", "Dwc", "Continental"], ["<a href=\"https://gawsis.meteoswiss.ch/GAWSIS/#/search/station/stationReportDetails/0-20008-0-LFS\">Longfengshan</a>", "", "", "China", "Asia", 44.7299, 127.5999, " 331.0", "2009-", "WMO GAW", "", "", "", "1", "Thermopile", "G;B;D", "Dwa", "Continental"], ["Linan", "", "", "China", "Asia", 30.3, 119.73, " 138.0", "2005-", "WMO GAW", "China Meteorological Administration", "", "", "1", "Thermopile", "G;B;D;IR", "Cfa", "Temperate"], ["<a href=\"https://www.sintef.no/projectweb/solarlab/sintef-node/pv-metering/\">Trondheim</a>", "", "", "Norway", "Europe", 63.4171, 10.4047, " 89.0", "2022-", "", "Sintef", "10 second data", "Not available", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["Sanya", "", "", "China", "Asia", 18.23, 109.52, " 5.5", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Aw", "Tropical"], ["Guangzhou", "", "", "China", "Asia", 23.17, 113.33, " 6.6", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Kunming", "", "", "China", "Asia", 25.02, 102.68, " 1891.4", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cwb", "Temperate"], ["Wuhan", "", "", "China", "Asia", 30.62, 114.13, " 23.3", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Shanghai", "", "", "China", "Asia", 31.4, 121.48, " 3.5", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["Chengdu", "", "", "China", "Asia", 30.67, 104.02, " 506.1", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["Zhengzhou", "", "", "China", "Asia", 34.72, 113.65, " 110.4", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["Beijing", "", "", "China", "Asia", 39.8, 116.47, " 54.0", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BSk", "Dry"], ["Haerbin", "", "", "China", "Asia", 45.75, 126.77, " 142.3", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Dwa", "Continental"], ["Shenyang", "", "", "China", "Asia", 41.73, 123.45, " 42.8", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "Dwa", "Continental"], ["Ejinaqi", "", "", "China", "Asia", 41.95, 101.07, " 940.5", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BWk", "Dry"], ["Wulumuqi", "", "", "China", "Asia", 43.78, 87.65, " 917.9", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BSk", "Dry"], ["Kashi", "", "", "China", "Asia", 39.47, 75.98, " 1288.7", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BWk", "Dry"], ["Lanzhou", "", "", "China", "Asia", 36.05, 103.88, " 1517.2", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BSk", "Dry"], ["Lasa", "", "", "China", "Asia", 29.67, 91.13, " 3648.7", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BSk", "Dry"], ["Geermu", "", "", "China", "Asia", 36.42, 94.9, " 2807.6", "1993-", "", "China Meteorological Administration", "Diffuse is measured with shadowring. Data can be downloaded from http://dcpzx.cma.cn/#/data-collect", "Freely", "2", "Thermopile", "G;B;D", "BWk", "Dry"], ["Fairbanks", "", "Alaska", "USA", "North America", 64.853, -147.8603, " 138.0", "2018-", "", "University of Alaska Fairbanks (UAF)", "Cleaned once a week. Also measures soiling and albedo.", "Upon request", "1", "Thermopile", "G;B;D", "Dfc", "Continental"], ["Turku", "", "", "Finland", "Europe", 60.4484, 22.2976, " 60.0", "2019-", "", "New Energy Research Center (NERC)", "Located ontop of tall building.", "Upon request", "1", "Thermopile", "G;B;D", "Dfb", "Continental"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Caceres</a>", "", "", "Spain", "Europe", 39.4722, -6.3394, " 405.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Cordoba</a>", "", "", "Spain", "Europe", 37.8444, -4.8506, " 91.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Lleida</a>", "", "", "Spain", "Europe", 41.6258, 0.595, " 192.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "BSk", "Dry"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Madrid</a>", "", "", "Spain", "Europe", 40.4528, -3.7242, " 664.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Malaga</a>", "", "", "Spain", "Europe", 36.7192, -4.4803, " 60.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Murcia</a>", "", "", "Spain", "Europe", 38.0028, -1.1694, " 62.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "BSk", "Dry"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Oviedo</a>", "", "", "Spain", "Europe", 43.3536, -5.8733, " 336.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csb", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Palma</a>", "", "", "Spain", "Europe", 39.5667, 2.7439, " 4.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">San Bartolome Tirajana</a>", "", "", "Canary Islands", "Africa", 27.7581, -15.5756, " 50.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "BWk", "Dry"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">San Sebastian</a>", "", "", "Spain", "Europe", 43.3075, -2.0394, " 252.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Cfb", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Soria</a>", "", "", "Spain", "Europe", 41.7667, -2.4667, " 1082.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Cfb", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">A Coruna</a>", "", "", "Spain", "Europe", 43.3672, -8.4194, " 58.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csb", "Temperate"], ["<a href=\"https://www.aemet.es/en/eltiempo/observacion/radiacion/radiacion?datos=mapa\">Valladolid</a>", "", "", "Spain", "Europe", 41.65, -4.7667, " 735.0", "2008-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "Csa", "Temperate"], ["<a href=\"https://antartida.aemet.es/index.php?pag=tiemporeal\">Juan Carlos I</a>", "", "", "Antarctica", "Antarctica", -62.66325, -60.38959, " 12.0", "2003-", "AEMET", "State Meteorological Agency of Spain", "", "Freely", "1", "Thermopile", "G;B;D;IR;UV;PAR", "EF", "Polar"], ["Gantner", "", "Arizona", "USA", "North America", 33.4239, -111.9098, " 357.0", "2010-", "", "Gantner Instruments", "", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://geo-summit.org/instruments\">Summit Station</a>", "", "", "Greenland", "North America", 72.579583, -38.459186, " 3216.0", "?", "", "Battelle Arctic Research Operations (ARO)", "Frequent issues with tracker malfunction resulting in many outages.", "Upon request", "1", "Thermopile", "G;B;D", "EF", "Polar"], ["<a href=\"https://gawsis.meteoswiss.ch/GAWSIS/#/search/station/stationReportDetails/0-20008-0-BKT\">Bukit Kototabang</a>", "BKT", "", "Indonesia", "Asia", -0.20194, 100.31805, " 864.0", "2015-?", "WMO GAW", "BMKG", "", "", "1", "Thermopile", "G;B;D", "Af", "Tropical"], ["Freiburg", "", "", "Germany", "Europe", 48.0114, 7.837, " 253.0", "2018-?", "", "Fraunhofer", "The coordinates were derived from https://www.sciencedirect.com/science/article/pii/S0038092X24000136", "", "1", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["Aggeneys", "", "", "South Africa", "Africa", -29.2945, 18.8155, " 789.0", "2006-?", "", "ESKOM", "Data was reported to be of low quality due to a lack of regular cleaning.", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Helios", "", "", "South Africa", "Africa", -30.5011, 19.5607, " 905.0", "2006-?", "", "ESKOM", "Data was reported to be of low quality due to a lack of regular cleaning.", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Carouge (Geneva)", "", "", "Switzerland", "Europe", 46.176, 6.139, " 432.0", "2010-?", "", "University of Geneva", "", "", "2", "Thermopile", "G;B", "Cfb", "Temperate"], ["Bernex (Geneva)", "", "", "Switzerland", "Europe", 46.172, 6.067, " 473.0", "2010-?", "", "University of Geneva", "", "", "2", "Thermopile;SPN1", "G;SPN1", "Cfb", "Temperate"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=UTPASRL\">Edinburg</a>", "UTRGV SRL", "Texas", "USA", "North America", 26.3059, -98.1716, " 45.0", "2011-", "", "NREL", "", "Freely", "1", "Thermopile", "G;B;D;IR", "BSh", "Dry"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=ULL\">Lafayette</a>", "UL", "Louisiana", "USA", "North America", 30.205, -92.3979, " 5.0", "2018-", "", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=UFL\">University of Florida</a>", "UF", "Florida", "USA", "North America", 29.626968, -82.360851, " 27.4", "2022-", "", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=UNLV\">University of Nevada</a>", "UNLV", "Nevada", "USA", "North America", 36.107, -115.1425, " 615.0", "2006-", "", "NREL", "", "Freely", "1", "Thermopile", "G;B;D;UV", "BWh", "Dry"], ["<a href=\"https://midcdmz.nrel.gov/apps/sitehome.pl?site=UAT\">SOLRMAP University of Arizona</a>", "UA OASIS", "Arizona", "USA", "North America", 32.22969, -110.95534, " 786.0", "2010-", "", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["Adam", "", "", "Oman", "Asia", 22.2072, 57.523, " 250.0", "2011-?", "", "OPWP", "Instruments were not regularly cleaned which led to inconsistencies in the data collected from the monitoring stations", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["Manah", "", "", "Oman", "Asia", 22.6031, 57.6672, " 345.0", "2011-?", "", "OPWP", "Instruments were not regularly cleaned which led to inconsistencies in the data collected from the monitoring stations", "", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/semrts.html\">Fairbanks</a>", "", "Alaska", "USA", "North America", 64.86, -147.87, " 138.0", "1981-1984", "SEMRTS", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Dfc", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/semrts.html\">Atlanta</a>", "", "Georgia", "USA", "North America", 33.77, -84.38, " 327.0", "1980-1981", "SEMRTS", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/semrts.html\">Albany</a>", "", "New York", "USA", "North America", 42.7, -73.83, " 72.0", "1979-1982", "SEMRTS", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Dfa", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/semrts.html\">San Antonio</a>", "", "Texas", "USA", "North America", 29.46, -98.49, " 253.0", "1981-1982", "SEMRTS", "NREL", "", "Freely", "1", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Alamosa</a>", "", "Colorado", "USA", "North America", 37.48, -105.87, " 2304.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Mandalay</a>", "", "California", "USA", "North America", 34.2, -119.25, " 6.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Albuquerque</a>", "", "New Mexico", "USA", "North America", 35.17, -106.6, " 1577.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Moorpark</a>", "", "California", "USA", "North America", 34.28, -118.9, " 140.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Alhambra</a>", "", "California", "USA", "North America", 34.08, -118.15, " 143.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Page</a>", "", "Arizona", "USA", "North America", 36.92, -111.45, " 1329.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Alpine</a>", "", "Arizona", "USA", "North America", 32.85, -116.1, " 625.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Palm Springs</a>", "", "California", "USA", "North America", 33.78, -116.47, " 93.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Arrowhead</a>", "", "California", "USA", "North America", 34.28, -117.22, " 1542.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Pardee</a>", "", "California", "USA", "North America", 34.45, -118.58, " 315.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Barstow</a>", "", "California", "USA", "North America", 34.88, -117.0, " 664.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Parker</a>", "", "Arizona", "USA", "North America", 34.15, -114.3, " 126.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Blythe</a>", "", "California", "USA", "North America", 33.6, -114.6, " 81.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Phoenix</a>", "", "Arizona", "USA", "North America", 33.57, -113.93, " 381.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Boulder City</a>", "", "Nevada", "USA", "North America", 36.02, -114.77, " 457.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Pueblo</a>", "", "Colorado", "USA", "North America", 38.27, -104.62, " 1481.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Carlsbad</a>", "", "California", "USA", "North America", 33.13, -117.33, " 23.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Ramona</a>", "", "California", "USA", "North America", 33.0, -116.75, " 527.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Cheyenne</a>", "", "Wyoming", "USA", "North America", 41.13, -104.82, " 1876.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Reno</a>", "", "Nevada", "USA", "North America", 39.5, -119.78, " 1341.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Chula Vista</a>", "", "California", "USA", "North America", 32.67, -117.03, " 20.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Rialto</a>", "", "California", "USA", "North America", 34.1, -117.35, " 369.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Denver 1 (SE)</a>", "", "Colorado", "USA", "North America", 39.65, -104.85, " 1628.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Ridge Crest</a>", "", "California", "USA", "North America", 35.62, -117.67, " 696.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Denver 2 (Holly)</a>", "", "Colorado", "USA", "North America", 39.75, -104.9, " 1625.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Saguaro</a>", "", "California", "USA", "North America", 32.55, -111.3, " 588.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Eldorado</a>", "", "Nevada", "USA", "North America", 35.8, -115.0, " 547.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">San Diego</a>", "", "California", "USA", "North America", 32.72, -117.17, " 18.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">El Cajon</a>", "", "California", "USA", "North America", 32.78, -116.97, " 140.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">San Pedro</a>", "", "California", "USA", "North America", 33.75, -118.28, " 12.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">El Segundo</a>", "", "California", "USA", "North America", 33.9, -118.42, " 12.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Spring Valley</a>", "", "California", "USA", "North America", 32.73, -116.92, " 216.0", "1978-1979", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">El Toro</a>", "", "California", "USA", "North America", 33.63, -117.7, " 110.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">St Johns</a>", "", "Arizona", "USA", "North America", 34.57, -109.3, " 1815.0", "1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Escondido</a>", "", "California", "USA", "North America", 33.13, -117.1, " 216.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Sun Valley</a>", "", "California", "USA", "North America", 34.25, -118.38, " 277.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Gila Bend</a>", "", "Arizona", "USA", "North America", 32.93, -112.72, " 224.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Tucson</a>", "", "Arizona", "USA", "North America", 32.17, -110.9, " 794.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Huntington Beach</a>", "", "California", "USA", "North America", 33.65, -117.98, " 6.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Victorville</a>", "", "California", "USA", "North America", 34.55, -117.28, " 870.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Imperial</a>", "", "California", "USA", "North America", 32.82, -115.38, "-6.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Villa Park</a>", "", "California", "USA", "North America", 33.82, -117.85, " 78.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Inglewood</a>", "", "California", "USA", "North America", 33.95, -118.38, " 30.0", "1979-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Visalia</a>", "", "California", "USA", "North America", 36.33, -119.28, " 102.0", "1977-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Laguna Bell</a>", "", "California", "USA", "North America", 33.97, -118.15, " 41.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Walnut</a>", "", "California", "USA", "North America", 34.0, -117.97, " 107.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Lancaster</a>", "", "California", "USA", "North America", 34.7, -118.15, " 715.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">West Los Angeles</a>", "", "California", "USA", "North America", 34.07, -118.45, " 122.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Las Vegas</a>", "", "Nevada", "USA", "North America", 36.15, -115.17, " 634.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">West Valley</a>", "", "California", "USA", "North America", 34.18, -118.57, " 241.0", "1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Los Angeles</a>", "", "California", "USA", "North America", 34.07, -118.23, " 88.0", "1978-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/west.html\">Yucca Valley</a>", "", "California", "USA", "North America", 34.12, -116.42, " 1024.0", "1976-1980", "WEST", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/hbcu.html\">Bluefield State College</a>", "", "West Virginia", "USA", "North America", 37.27, -81.24, " 803.0", "1985-1996", "HBCU", "NREL", "Diffuse was measured with a shadowband.", "Freely", "2", "Thermopile", "G;B;D", "Cfb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/hbcu.html\">Elizabeth City State University</a>", "", "North Carolina", "USA", "North America", 36.3, -76.25, " 4.0", "1990-1996", "HBCU", "NREL", "Diffuse was measured with a shadowband until 1995. In 1996 it was measured with a shading disk on a tracker.", "Freely", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/hbcu.html\">Mississippi Valley State University</a>", "", "Mississippi", "USA", "North America", 33.5, -90.33, " 52.0", "1992-1996", "HBCU", "NREL", "Diffuse was measured with a shadowband.", "Freely", "2", "Thermopile", "G;B;D", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Montgomery</a>", "", "Alabama", "USA", "North America", 32.3, -86.4, " 68.0", "1977-1979", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Fairbanks</a>", "", "Alaska", "USA", "North America", 64.82, -147.87, " 143.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Phoenix</a>", "", "Arizona", "USA", "North America", 33.43, -112.02, " 339.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Fresno</a>", "", "California", "USA", "North America", 36.77, -119.72, " 102.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Los Angeles</a>", "", "California", "USA", "North America", 33.93, -118.4, " 36.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Boulder</a>", "", "Colorado", "USA", "North America", 40.1, -105.25, " 1634.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Grand Junction</a>", "", "Colorado", "USA", "North America", 39.12, -108.53, " 1473.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Miami</a>", "", "Florida", "USA", "North America", 25.82, -80.28, " 8.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Am", "Tropical"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Tallahassee</a>", "", "Florida", "USA", "North America", 30.38, -84.37, " 18.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Honolulu</a>", "", "Hawaii", "USA", "North America", 21.32, -157.92, " 2.0", "1978-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Ocean", "Ocean"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Boise</a>", "", "Idaho", "USA", "North America", 43.57, -116.22, " 873.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Indianapolis</a>", "", "Indiana", "USA", "North America", 39.73, -86.27, " 244.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Dodge City</a>", "", "Kansas", "USA", "North America", 37.77, -99.97, " 795.0", "1977-1979", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Lake Charles</a>", "", "Louisiana", "USA", "North America", 30.12, -93.22, " 19.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Blue Hill</a>", "", "Massachusetts", "USA", "North America", 42.22, -71.12, " 200.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Caribou</a>", "", "Maine", "USA", "North America", 46.87, -68.02, " 195.0", "1977-1978", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Guam</a>", "", "Marianas Islands", "USA", "North America", 13.45, -144.68, " 111.0", "1978-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Ocean", "Ocean"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Columbia</a>", "", "Missouri", "USA", "North America", 38.82, -92.22, " 277.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Great Falls</a>", "", "Montana", "USA", "North America", 47.5, -111.37, " 1125.0", "1977-1978", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Omaha</a>", "", "Nebraska", "USA", "North America", 41.37, -96.02, " 404.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfa", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Desert Rock</a>", "", "Nevada", "USA", "North America", 36.62, -116.02, " 1007.0", "1979-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Ely</a>", "", "Nevada", "USA", "North America", 39.28, -114.85, " 1912.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Las Vegas</a>", "", "Nevada", "USA", "North America", 36.08, -115.17, " 661.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Albuquerque</a>", "", "New Mexico", "USA", "North America", 35.03, -106.62, " 1623.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Raleigh</a>", "", "North Carolina", "USA", "North America", 35.87, -78.78, " 137.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Bismarck</a>", "", "North Dakota", "USA", "North America", 46.77, -100.77, " 511.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Medford</a>", "", "Oregon", "USA", "North America", 42.37, -122.87, " 412.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Pittsburgh</a>", "", "Pennsylvania", "USA", "North America", 40.5, -80.22, " 371.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">San Juan</a>", "", "Puerto Rico", "USA", "North America", 18.43, -66.0, " 19.0", "1978-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Af", "Tropical"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Nashville</a>", "", "Tennessee", "USA", "North America", 36.12, -86.68, " 186.0", "1977-1978", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Brownsville</a>", "", "Texas", "USA", "North America", 25.9, -97.43, " 12.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">El Paso</a>", "", "Texas", "USA", "North America", 31.8, -106.4, " 1206.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BWh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Midland</a>", "", "Texas", "USA", "North America", 31.95, -102.18, " 872.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSh", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Salt Lake City</a>", "", "Utah", "USA", "North America", 40.77, -111.97, " 1288.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Burlington</a>", "", "Vermont", "USA", "North America", 44.47, -73.15, " 112.0", "1977-1978", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Sterling</a>", "", "Virginia", "USA", "North America", 38.98, -77.47, " 87.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Seattle-Tacoma</a>", "", "Washington", "USA", "North America", 47.45, -122.3, " 143.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Csb", "Temperate"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Madison</a>", "", "Wisconsin", "USA", "North America", 43.13, -89.33, " 271.0", "1977", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "Dfb", "Continental"], ["<a href=\"https://www.nrel.gov/grid/solar-resource/noaa.html\">Lander</a>", "", "Wyoming", "USA", "North America", 42.82, -108.73, " 1699.0", "1977-1980", "NOAA", "NREL", "", "Freely", "2", "Thermopile", "G;B", "BSk", "Dry"], ["<a href=\"https://gawsis.meteoswiss.ch/GAWSIS/#/search/station/stationReportDetails/0-20008-0-HKR\">Hradec Kralove</a>", "HKR", "", "Czech Republic", "Europe", 50.1772, 15.8386, " 285.0", "2009-?", "WMO GAW", "Czech Hydrometeorological Institute (CHMI)", "", "", "1", "Thermopile", "G;B;D;UV", "Cfb", "Temperate"], ["<a href=\"https://idmp.entpe.fr/\">Vaulx-en-Velin</a>", "", "", "France", "Europe", 45.7786, 4.9225, " 170.0", "2005-", "IDMP", "ENTPE", "Diffuse is measured with a shadowring.", "Freely", "2", "Thermopile", "G;B;D;UV", "Cfb", "Temperate"], ["Chinese University of Hong Kong", "CUHK", "", "China", "Asia", 22.4207, 114.2085, " 150.0", "2003-?", "", "University of Hong Kong", "", "", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["Le Bourget-du-Lac", "", "", "France", "Europe", 45.6416, 5.8752, " 235.0", "2019-?", "", "INES", "There is a second tracker with a pyrheliometer on a tower (probably little maintenance).", "", "2", "Thermopile", "G;B", "Cfa", "Temperate"], ["Grimstad", "", "", "Norway", "Europe", 58.3345, 8.5753, " 40.0", "2019-", "", "University of Agder", "Also has Spectrafy instruments and reference cells.", "", "1", "Thermopile", "G;B;D;GTI;Albedo", "Cfb", "Temperate"], ["<a href=\"https://ife.no/service/ife-pv-module-outdoor-test-site/\">Kjeller</a>", "", "", "Norway", "Europe", 59.972515, 11.052297, " 130.0", "2022-", "", "IFE", "Also has reference cells.", "", "1", "Thermopile", "G;B;D;GTI;Albedo", "Dfb", "Continental"], ["Troms\u00f8", "", "", "Norway", "Europe", 69.661, 18.939, " 113.0", "2020-?", "", "University of Troms\u00f8", "", "", "1", "Thermopile", "G;B;D", "Dfc", "Continental"], ["<a href=\"https://energydata.info/dataset/armenia-solar-radiation-measurement-data\">Hrazdan</a>", "ARM_Solar_Hrazdan", "", "Armenia", "Asia", 40.5116, 44.823, "1845", "2016-", "ESMAP", "", "Instrument and components has not been manually checked", "Freely", "", "", "", "Dfb", "Continental"], ["<a href=\"https://energydata.info/dataset/armenia-solar-radiation-measurement-data\">Masrik</a>", "ARM_Solar_Masrik", "", "Armenia", "Asia", 40.2077, 45.7645, "1944", "2016-", "ESMAP", "", "Instrument and components has not been manually checked", "Freely", "", "", "", "Dfb", "Continental"], ["<a href=\"https://energydata.info/dataset/armenia-solar-radiation-measurement-data\">Talin</a>", "ARM_Solar_Talin", "", "Armenia", "Asia", 40.386, 43.8972, "1641", "2016-", "ESMAP", "", "Instrument and components has not been manually checked", "Freely", "", "", "", "Dfb", "Continental"], ["<a href=\"https://energydata.info/dataset/armenia-solar-radiation-measurement-data\">Yerevan Agro</a>", "ARM_Solar_YerevanAgro", "", "Armenia", "Asia", 40.1887, 44.3976, "946", "2016-", "ESMAP", "", "Instrument and components has not been manually checked", "Freely", "", "", "", "Dfa", "Continental"], ["<a href=\"https://energydata.info/dataset/bangladesh-solar-radiation-measurement-data\">Feni</a>", "BGD_Solar_BDFE2_Feni", "", "Bangladesh", "Asia", 22.80029, 91.35819, "5", "2017-", "ESMAP", "Suntrace GmbH", "", "Freely", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://energydata.info/dataset/benin-solar-radiation-measurement-data\">Malanville</a>", "BEN_Solar_Malanville", "", "B\u00e9nin", "NaN", 11.78272, 3.37349, "184", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/benin-solar-radiation-measurement-data\">Parakou</a>", "BEN_Solar_Parakou", "", "B\u00e9nin", "NaN", 9.33117, 2.59119, "387", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/burkina-faso-solar-radiation-measurement-data\">Dori</a>", "BFA_Solar_Dori", "", "Burkina Faso", "Africa", 14.03045, -0.02435, "285", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/burkina-faso-solar-radiation-measurement-data\">D\u00e9dougou</a>", "BFA_Solar_D\u00e9dougou", "", "Burkina Faso", "Africa", 12.4662, -3.47294, "305", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/burkina-faso-solar-radiation-measurement-data\">Kaya</a>", "BFA_Solar_Kaya", "", "Burkina Faso", "Africa", 13.08301, -1.07272, "324", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/burkina-faso-solar-radiation-measurement-data\">Koup\u00e9la</a>", "BFA_Solar_Koup\u00e9la", "", "Burkina Faso", "Africa", 12.19104, -0.36292, "302", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/cote-divoire-solar-radiation-measurement-data\">Korhogo</a>", "CIV_Solar_Korhogo", "", "C\u00f4te d'Ivoire", "Africa", 9.48058, -5.59509, "370", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/cote-divoire-solar-radiation-measurement-data\">S\u00e9r\u00e9bou</a>", "CIV_Solar_S\u00e9r\u00e9bou", "", "C\u00f4te d'Ivoire", "Africa", 7.93282, -4.00525, "195", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/federates-states-of-micronesia-solar-radiation-measurement-data\">Weno</a>", "FSM_Solar_Weno", "", "Federated States of Micronesia", "Oceania", 7.467517, 151.849834, "4", "2020-2022", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/the-gambia-solar-radiation-measurement-data\">Farafenni</a>", "GMB_Solar_Farafenni", "", "Gambia", "Africa", 13.57301, -15.59253, "19", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/ghana-solar-radiation-measurement-data\">Sunyani</a>", "GHA_Solar_Sunyani", "", "Ghana", "Africa", 7.34865, -2.34034, "330", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/ghana-solar-radiation-measurement-data\">Navrongo</a>", "GHA_Solar_Navrongo", "", "Ghana", "Africa", 10.87554, -1.06293, "180", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/guinea-solar-radiation-measurement-data\">Kankan</a>", "GIN_Solar_Kankan", "", "Guin\u00e9e", "NaN", 10.36465, -9.30466, "375", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/guinea-solar-radiation-measurement-data\">Tarambaly</a>", "GIN_Solar_Tarambaly", "", "Guin\u00e9e", "NaN", 11.356, -12.13706, "860", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/guinea-bissau-solar-radiation-measurement-data\">Gabu</a>", "GNB_Solar_Gabu", "", "Guin\u00e9e-Bissau", "NaN", 12.30108, -14.24273, "75", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/guinea-bissau-solar-radiation-measurement-data\">Bissau</a>", "GNB_Solar_Bissau", "", "Guin\u00e9e-Bissau", "NaN", 11.85643, -15.58877, "20", "2022-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/kenya-solar-radiation-measurement-data\">Laisamis</a>", "KEN_Solar_Laisamis", "", "Kenya", "Africa", 1.601891, 37.802681, "576", "2019-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/kenya-solar-radiation-measurement-data\">Narok</a>", "KEN_Solar_Narok", "", "Kenya", "Africa", -1.321097, 35.705708, "1914", "2019-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cfb", "Temperate"], ["<a href=\"https://energydata.info/dataset/kenya-solar-radiation-measurement-data\">Homa Bay</a>", "KEN_Solar_Homa Bay", "", "Kenya", "Africa", -0.764707, 34.360379, "1335", "2019-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Am", "Tropical"], ["<a href=\"https://energydata.info/dataset/lebanon-solar-radiation-measurements\">Ras Baalbak</a>", "LBN_Solar_RasBaalbak", "", "Lebanon", "Asia", 34.272985, 36.427053, "910", "2019-", "ESMAP", "Fraunhofer ISE", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Csa", "Temperate"], ["<a href=\"https://energydata.info/dataset/liberia-solar-radiation-measurement-data\">Buchanan</a>", "LBR_Solar_Buchanan", "", "Liberia", "Africa", 5.92397, -9.99337, "20", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Am", "Tropical"], ["<a href=\"https://energydata.info/dataset/liberia-solar-radiation-measurement-data\">Yekepa</a>", "LBR_Solar_Yekepa", "", "Liberia", "Africa", 7.39317, -8.66813, "446", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/liberia-solar-radiation-measurement-data\">Mount Coffee</a>", "LBR_Solar_MountCoffee", "", "Liberia", "Africa", 6.4978, -10.6517, "20", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Am", "Tropical"], ["<a href=\"https://energydata.info/dataset/malawi-solar-radiation-measurement-data\">Blantyre</a>", "MWI_Solar_Blantyre_BLZ", "", "Malawi", "Africa", -15.67996, 34.97203, "770", "2016-2018", "ESMAP", "SGS Malawi", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/malawi-solar-radiation-measurement-data\">Kasungu</a>", "MWI_Solar_Kasungu_KBQ", "", "Malawi", "Africa", -13.0153, 33.4685, "1065", "2016-2018", "ESMAP", "SGS Malawi", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/malawi-solar-radiation-measurement-data\">Mzuzu</a>", "MWI_Solar_MZUNI", "", "Malawi", "Africa", -11.4199, 33.9953, "1285", "2016-2018", "ESMAP", "SGS Malawi", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/maldives-solar-radiation-measurement-data\">Gan</a>", "MDV_Solar_Gan_GAN", "", "Maldives", "Asia", -0.6911, 73.1599, "2", "2015-", "ESMAP", "Renewable Energy Maldives", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/maldives-solar-radiation-measurement-data\">Hanimaadhoo</a>", "MDV_Solar_Hanimaadhoo_HAQ", "", "Maldives", "Asia", 6.7482, 73.1696, "2", "2015-", "ESMAP", "Renewable Energy Maldives", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/maldives-solar-radiation-measurement-data\">Kadhdhoo</a>", "MDV_Solar_Kadhdhoo_KDO", "", "Maldives", "Asia", 1.8599, 73.5203, "2", "2015-", "ESMAP", "Renewable Energy Maldives", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/maldives-solar-radiation-measurement-data\">Hulhul\u00e9</a>", "MDV_Solar_Male _MLE", "", "Maldives", "Asia", 4.1927, 73.5281, "2", "2015-", "ESMAP", "Renewable Energy Maldives", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/mali-solar-radiation-measurement-data\">Bougouni</a>", "MLI_Solar_Bougouni", "", "Mali", "Africa", 11.40743, -7.48193, "335", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/mali-solar-radiation-measurement-data\">Fana</a>", "MLI_Solar_Fana", "", "Mali", "Africa", 12.76684, -6.96159, "329", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/mali-solar-radiation-measurement-data\">Sanankoroba</a>", "MLI_Solar_Sanankoroba", "", "Mali", "Africa", 12.39112, -7.93737, "356", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/mali-solar-radiation-measurement-data\">Sikasso</a>", "MLI_Solar_Sikasso", "", "Mali", "Africa", 11.30547, -5.73713, "375", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/mali-solar-radiation-measurement-data\">Manantali</a>", "MLI_Solar_Manantali", "", "Mali", "Africa", 13.2005, -10.4308, "175", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/nauru-solar-radiation-measurement-data\">Yaren</a>", "NRU_Solar_Yaren", "", "Nauru", "Oceania", -0.543447, 166.93197, "28", "2020-2022", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Ocean", "Ocean"], ["<a href=\"https://energydata.info/dataset/nepal-solar-radiation-measurement-data\">Dharan</a>", "NPL_Solar_Dharan", "", "Nepal", "Asia", 26.79291, 87.29263, "315", "2018-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/nepal-solar-radiation-measurement-data\">Jumla</a>", "NPL_Solar_Jumla", "", "Nepal", "Asia", 29.27237, 82.19351, "2363", "2018-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwb", "Temperate"], ["<a href=\"https://energydata.info/dataset/nepal-solar-radiation-measurement-data\">Kathmandu</a>", "NPL_Solar_Kathmandu", "", "Nepal", "Asia", 27.68157, 85.31868, "1315", "2018-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/nepal-solar-radiation-measurement-data\">Lumle</a>", "NPL_Solar_Lumle", "", "Nepal", "Asia", 28.29666, 83.818, "1742", "2018-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/nepal-solar-radiation-measurement-data\">Nepalgunj</a>", "NPL_Solar_Nepalgunj", "", "Nepal", "Asia", 28.11302, 81.58899, "150", "2018-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/niger-solar-radiation-measurement-data\">Maradi</a>", "NER_Solar_Maradi", "", "Niger", "Africa", 13.52455, 7.1678, "375", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/niger-solar-radiation-measurement-data\">Lossa</a>", "NER_Solar_Lossa", "", "Niger", "Africa", 13.94701, 1.57469, "205", "2022-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/niger-solar-radiation-measurement-data\">Zabori</a>", "NER_Solar_Zabori", "", "Niger", "Africa", 12.70536, 3.55519, "235", "2022-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/nigeria-solar-radiation-measurement-data\">Bauchi</a>", "NGA_Solar_Bauchi", "", "Nigeria", "Africa", 10.28526, 9.85059, "597", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/nigeria-solar-radiation-measurement-data\">Kano</a>", "NGA_Solar_Kano", "", "Nigeria", "Africa", 11.87357, 8.45837, "449", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Bahawalpur</a>", "PK_Solar_Bahawalpur_QASP", "", "Pakistan", "Asia", 29.32542, 71.81877, "120", "2014-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Islamabad</a>", "PK_Solar_Islamabad_NUST", "", "Pakistan", "Asia", 33.64191, 72.9838, "500", "2014-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Karachi</a>", "PK_Solar_Karachi_NEDUET", "", "Pakistan", "Asia", 24.9334, 67.1116, "40", "2015-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Khuzdar</a>", "PK_Solar_Khuzdar_BUET", "", "Pakistan", "Asia", 27.8178, 66.6294, "1260", "2015-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Lahore</a>", "PK_Solar_Lahore_UET", "", "Pakistan", "Asia", 31.69458, 74.2441, "220", "2014-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Multan</a>", "PK_Solar_Multan_MSNUET", "", "Pakistan", "Asia", 30.1654, 71.4978, "95", "2014-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/pakistan-solar-radiation-measurement-data\">Quetta</a>", "PK_Solar_Quetta_BUITEMS", "", "Pakistan", "Asia", 30.2708, 66.9398, "1590", "2015-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSk", "Dry"], ["<a href=\"https://energydata.info/dataset/senegal-solar-radiation-measurement-data\">Fatick</a>", "SEN_Solar_Fatick", "", "Senegal", "Africa", 14.36751, -16.41346, "8", "2016-2017", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/senegal-solar-radiation-measurement-data\">Kahone</a>", "SEN_Solar_Kahone", "", "Senegal", "Africa", 14.168636, -16.034167, "10", "2016-2017", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/senegal-solar-radiation-measurement-data\">Touba</a>", "SEN_Solar_Touba_IFC", "", "Senegal", "Africa", 14.77252, -15.91955, "37", "2016-2017", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/senegal-2021-solar-radiation-measurement-data\">Tambacounda</a>", "SEN_Solar_Tambacounda", "", "Senegal", "Africa", 13.77689, -13.72924, "40", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/senegal-2021-solar-radiation-measurement-data\">Ourossogui</a>", "SEN_Solar_Ourossogui", "", "Senegal", "Africa", 15.61267, -13.3146, "28", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "BWh", "Dry"], ["<a href=\"https://energydata.info/dataset/sierra-leone-solar-radiation-measurement-data\">Kenema</a>", "SLE_Solar_Kenema", "", "Sierra Leone", "Africa", 7.81879, -11.18137, "145", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/sierra-leone-solar-radiation-measurement-data\">Bumbuna</a>", "SLE_Solar_Bumbuna", "", "Sierra Leone", "Africa", 9.03529, -11.76454, "140", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/tanzania-solar-radiation-measurement-data\">Dar es Salaam</a>", "TZA_Solar_DaresSalaam_UDSM", "", "Tanzania", "Africa", -6.781101, 39.2039, "190", "2015-", "ESMAP", "Consortium", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/tanzania-solar-irradiation-measurement-data\">Dar es Salaam</a>", "TZA_Solar_Dar es Salaam", "", "Tanzania", "Africa", -6.780883, 39.203773, "93", "2020-", "ESMAP", "UDSM", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/tanzania-solar-irradiation-measurement-data\">Dodoma</a>", "TZA_Solarn_Dodoma", "", "Tanzania", "Africa", -6.180039, 35.699039, "1139", "2019-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "BSh", "Dry"], ["<a href=\"https://energydata.info/dataset/tanzania-solar-irradiation-measurement-data\">Shinyanga</a>", "TZA_Solar_Shinyanga", "", "Tanzania", "Africa", -3.626586, 33.515342, "1179", "2020-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/tanzania-solar-irradiation-measurement-data\">Makunduchi</a>", "TZA_Solar_Makunduchi", "", "Tanzania", "Africa", -6.417039, 39.516945, "30", "2019-2021", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/togo-solar-radiation-measurement-data\">Dapaong</a>", "TGO_Solar_Dapaong", "", "Togo", "Africa", 10.89189, 0.18984, "310", "2021-", "ESMAP", "CSP Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/togo-solar-radiation-measurement-data\">Davi\u00e9</a>", "TGO_Solar_Davi\u00e9", "", "Togo", "Africa", 6.39307, 1.18647, "91", "2021-", "ESMAP", "CSP Services", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/uganda-solar-radiation-measurement-data\">Soroti</a>", "UGA_Solar_Soroti", "", "Uganda", "Africa", 1.724351, 33.622098, "1128", "2020-2022", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/uganda-solar-radiation-measurement-data\">Wadelai</a>", "UGA_Solar_Wadelai", "", "Uganda", "Africa", 2.725961, 31.390403, "644", "2020-2022", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/vietnam-solar-radiation-measurement-data\">Bac Ninh</a>", "VN_Solar_VNHAN_EVN", "", "Vietnam", "Asia", 21.2013, 106.0629, "60", "2017-", "ESMAP", "Suntrace GmbH", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/vietnam-solar-radiation-measurement-data\">Central Highlands</a>", "VN_Solar_VNCEH_EVN", "", "Vietnam", "Asia", 12.7535, 107.8761, "290", "2017-", "ESMAP", "Suntrace GmbH", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/vietnam-solar-radiation-measurement-data\">Da Nang</a>", "VN_Solar_VNDAN_EVN", "", "Vietnam", "Asia", 16.0125, 108.1865, "24", "2017-", "ESMAP", "Suntrace GmbH", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Am", "Tropical"], ["<a href=\"https://energydata.info/dataset/vietnam-solar-radiation-measurement-data\">Song Binh</a>", "VN_Solar_VNSOB_EVN", "", "Vietnam", "Asia", 11.2641, 108.3452, "62", "2017-", "ESMAP", "Suntrace GmbH", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/vietnam-solar-radiation-measurement-data\">Tri An</a>", "VN_Solar_VNTRA_EVN", "", "Vietnam", "Asia", 11.1024, 107.0378, "57", "2017-", "ESMAP", "Suntrace GmbH", "", "Freely", "1", "Thermopile", "G;B;D", "Aw", "Tropical"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Chilanga</a>", "ZMB_Solar_Lusaka_Chilanga", "", "Zambia", "Africa", -15.54831, 28.24822, "1224", "2015-2018", "ESMAP", "SGS Inspection Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Choma</a>", "ZMB_Solar_Choma_Mochipapa", "", "Zambia", "Africa", -16.83822, 27.07046, "1282", "2015-2019", "ESMAP", "SGS Inspection Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Kaoma</a>", "ZMB_Solar_Kaoma_Longe", "", "Zambia", "Africa", -14.83966, 24.93186, "1167", "2015-2020", "ESMAP", "SGS Inspection Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Kasama</a>", "ZMB_Solar_Kasama_Misamfu", "", "Zambia", "Africa", -10.17165, 31.22558, "1379", "2015-2021", "ESMAP", "SGS Inspection Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Lusaka</a>", "ZMB_Solar_Lusaka_UNZA", "", "Zambia", "Africa", -15.39465, 28.33711, "1262", "2015-2017", "ESMAP", "SGS Inspection Services", "", "Freely", "1", "Thermopile", "G;B;D", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data-0\">Mutanda</a>", "ZMB_Solar_Solwezi_Mutanda", "", "Zambia", "Africa", -12.4236, 26.2153, "1317", "2015-2022", "ESMAP", "SGS Inspection Services", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data\">Fig Tree</a>", "ZM_Solar_FigTree_IFC", "", "Zambia", "Africa", -15.001425, 28.549047, "1143", "2018-2018", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data\">Mumbwa</a>", "ZM_Solar_Mumbwa_IFC", "", "Zambia", "Africa", -15.085303, 27.001552, "1103", "2018-2019", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"], ["<a href=\"https://energydata.info/dataset/zambia-solar-radiation-measurement-data\">Ndeke</a>", "ZM_Solar_Ndeke_IFC", "", "Zambia", "Africa", -12.577451, 28.292946, "1287", "2018-2020", "ESMAP", "GeoSUN Africa", "Instrument and components has not been manually checked", "Freely", "2", "", "", "Cwa", "Temperate"]];
// Define the dt_args
let dt_args = {"scrollY": "700px", "scrollX": true, "scrollCollapse": true, "paging": false, "order": [[0, "asc"]], "columnDefs": [{"className": "dt-left", "targets": "_all"}], "layout": {"topStart": "pageLength", "topEnd": "search", "bottomStart": "info", "bottomEnd": "paging"}, "warn_on_dom": true};
dt_args["data"] = data;
new DataTable(table, dt_args);
});
</script>
</div></div>
</div>
</section>
<script type="text/x-thebe-config">
{
requestKernel: true,
binderOptions: {
repo: "binder-examples/jupyter-stacks-datascience",
ref: "master",
},
codeMirrorConfig: {
theme: "abcdef",
mode: "python"
},
kernelOptions: {
name: "python3",
path: "./."
},
predefinedOutput: true
}
</script>
<script>kernelName = 'python3'</script>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="intro.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">Introduction</p>
</div>
</a>
<a class="right-next"
href="station_requirements.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Station requirements and categorization</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
<div class="bd-footer-content__inner container">
<div class="footer-item">
<p class="component-author">
By AssessingSolar.org
</p>
</div>
<div class="footer-item">
<p class="copyright">
© Copyright 2022.
<br/>
</p>
</div>
<div class="footer-item">
</div>
<div class="footer-item">
</div>
</div>
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
</footer>
</body>
</html>