@appius-fr/apx 2.6.2 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/APX.mjs +2 -0
- package/README.md +226 -203
- package/dist/2ab50e700c8fbddb45e0.svg +10 -0
- package/dist/2e967d8dd752e0bed703.svg +10 -0
- package/dist/5ddaeefe5dfbc8e09652.svg +7 -0
- package/dist/6dc2907ba3bbb232601d.svg +10 -0
- package/dist/6e1e61dfca176a885b8d.svg +3 -0
- package/dist/6f3a0a27a260bb2c221b.svg +9 -0
- package/dist/8b07a8bf719a38262b7d.svg +10 -0
- package/dist/APX.dev.mjs +1167 -227
- package/dist/APX.mjs +1 -1
- package/dist/APX.prod.mjs +1 -1
- package/dist/APX.standalone.js +1119 -75
- package/dist/APX.standalone.js.map +1 -1
- package/dist/bdfa755a1cdb872368c7.svg +3 -0
- package/dist/c9da177f7663f9fcd023.svg +10 -0
- package/dist/ce9ef5fceb78e17e68c9.svg +8 -0
- package/dist/ed5af5163957b04bc6cc.svg +7 -0
- package/modules/listen/README.md +242 -235
- package/modules/listen/listen.mjs +1 -3
- package/modules/scrollableTable/CHANGELOG.md +37 -0
- package/modules/scrollableTable/README.md +108 -0
- package/modules/scrollableTable/css/scrollableTable.css +67 -0
- package/modules/scrollableTable/scrollableTable.mjs +577 -0
- package/modules/toast/README.md +186 -153
- package/modules/tristate/CHANGELOG.md +34 -0
- package/modules/tristate/README.md +157 -94
- package/modules/tristate/assets/tristate-checked.svg +3 -0
- package/modules/tristate/assets/tristate-cross.svg +10 -0
- package/modules/tristate/assets/tristate-crossed.svg +3 -0
- package/modules/tristate/assets/tristate-indeterminate-dash.svg +9 -0
- package/modules/tristate/assets/tristate-tick.svg +10 -0
- package/modules/tristate/assets/tristate-unchecked.svg +7 -0
- package/modules/tristate/css/tristate.css +91 -24
- package/modules/tristate/tristate.mjs +292 -171
- package/package.json +5 -1
package/dist/APX.dev.mjs
CHANGED
|
@@ -170,6 +170,99 @@ h2.APX-dialog-title{
|
|
|
170
170
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
171
171
|
|
|
172
172
|
|
|
173
|
+
/***/ }),
|
|
174
|
+
|
|
175
|
+
/***/ "./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css":
|
|
176
|
+
/*!***********************************************************************************************!*\
|
|
177
|
+
!*** ./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css ***!
|
|
178
|
+
\***********************************************************************************************/
|
|
179
|
+
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
180
|
+
|
|
181
|
+
__webpack_require__.r(__webpack_exports__);
|
|
182
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
183
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
184
|
+
/* harmony export */ });
|
|
185
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
|
|
186
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
187
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
|
|
188
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
189
|
+
// Imports
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
|
|
193
|
+
// Module
|
|
194
|
+
___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)
|
|
195
|
+
Use !important so page styles (e.g. display: table) do not override the grid layout. */
|
|
196
|
+
|
|
197
|
+
/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */
|
|
198
|
+
/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */
|
|
199
|
+
/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */
|
|
200
|
+
.apx-scrollable-table {
|
|
201
|
+
display: grid !important;
|
|
202
|
+
grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));
|
|
203
|
+
grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
|
|
204
|
+
width: 100%;
|
|
205
|
+
table-layout: unset !important;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.apx-scrollable-table--body-height {
|
|
209
|
+
--apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Table with no tfoot: thead + tbody only */
|
|
213
|
+
.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
|
|
214
|
+
grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* Table with no thead: tbody + tfoot only */
|
|
218
|
+
.apx-scrollable-table.apx-scrollable-table--no-thead {
|
|
219
|
+
grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* Table with neither thead nor tfoot: tbody only */
|
|
223
|
+
.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
|
|
224
|
+
grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */
|
|
228
|
+
.apx-scrollable-table > thead,
|
|
229
|
+
.apx-scrollable-table > tbody,
|
|
230
|
+
.apx-scrollable-table > tfoot {
|
|
231
|
+
display: grid !important;
|
|
232
|
+
grid-template-columns: subgrid;
|
|
233
|
+
grid-column: 1 / -1;
|
|
234
|
+
min-height: 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.apx-scrollable-table > thead {
|
|
238
|
+
grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.apx-scrollable-table > tbody {
|
|
242
|
+
grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));
|
|
243
|
+
overflow: auto;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.apx-scrollable-table > tfoot {
|
|
247
|
+
grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.apx-scrollable-table > thead > tr,
|
|
251
|
+
.apx-scrollable-table > tbody > tr,
|
|
252
|
+
.apx-scrollable-table > tfoot > tr {
|
|
253
|
+
display: contents !important;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.apx-scrollable-table th,
|
|
257
|
+
.apx-scrollable-table td {
|
|
258
|
+
min-width: 0;
|
|
259
|
+
box-sizing: border-box;
|
|
260
|
+
}
|
|
261
|
+
`, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA;yFACyF;;AAEzF,+GAA+G;AAC/G,mIAAmI;AACnI,yIAAyI;AACzI;IACI,wBAAwB;IACxB,+MAA+M;IAC/M,4HAA4H;IAC5H,WAAW;IACX,8BAA8B;AAClC;;AAEA;IACI,4EAA4E;AAChF;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,mDAAmD;AACnD;IACI,kHAAkH;AACtH;;AAEA,oGAAoG;AACpG;;;IAGI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;AACjB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;IACI,gHAAgH;IAChH,cAAc;AAClB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;;;IAGI,4BAA4B;AAChC;;AAEA;;IAEI,YAAY;IACZ,sBAAsB;AAC1B","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)\r\n Use !important so page styles (e.g. display: table) do not override the grid layout. */\r\n\r\n/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */\r\n/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */\r\n/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */\r\n.apx-scrollable-table {\r\n display: grid !important;\r\n grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n width: 100%;\r\n table-layout: unset !important;\r\n}\r\n\r\n.apx-scrollable-table--body-height {\r\n --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);\r\n}\r\n\r\n/* Table with no tfoot: thead + tbody only */\r\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* Table with no thead: tbody + tfoot only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n}\r\n\r\n/* Table with neither thead nor tfoot: tbody only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */\r\n.apx-scrollable-table > thead,\r\n.apx-scrollable-table > tbody,\r\n.apx-scrollable-table > tfoot {\r\n display: grid !important;\r\n grid-template-columns: subgrid;\r\n grid-column: 1 / -1;\r\n min-height: 0;\r\n}\r\n\r\n.apx-scrollable-table > thead {\r\n grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > tbody {\r\n grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));\r\n overflow: auto;\r\n}\r\n\r\n.apx-scrollable-table > tfoot {\r\n grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > thead > tr,\r\n.apx-scrollable-table > tbody > tr,\r\n.apx-scrollable-table > tfoot > tr {\r\n display: contents !important;\r\n}\r\n\r\n.apx-scrollable-table th,\r\n.apx-scrollable-table td {\r\n min-width: 0;\r\n box-sizing: border-box;\r\n}\r\n"],"sourceRoot":""}]);
|
|
262
|
+
// Exports
|
|
263
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
264
|
+
|
|
265
|
+
|
|
173
266
|
/***/ }),
|
|
174
267
|
|
|
175
268
|
/***/ "./node_modules/css-loader/dist/cjs.js!./modules/toast/css/toast.css":
|
|
@@ -363,39 +456,108 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
363
456
|
|
|
364
457
|
|
|
365
458
|
|
|
366
|
-
var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg
|
|
367
|
-
var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg
|
|
368
|
-
var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%
|
|
459
|
+
var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
460
|
+
var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
461
|
+
var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
462
|
+
var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
369
463
|
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
|
|
370
464
|
var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);
|
|
371
465
|
var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___);
|
|
372
466
|
var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___);
|
|
467
|
+
var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___);
|
|
373
468
|
// Module
|
|
374
|
-
___CSS_LOADER_EXPORT___.push([module.id, `.apx-tristate {
|
|
375
|
-
display: inline-block;
|
|
376
|
-
vertical-align: middle;
|
|
377
|
-
text-align: center;
|
|
378
|
-
cursor: pointer;
|
|
379
|
-
position: relative;
|
|
380
|
-
min-width:13px;
|
|
381
|
-
min-height:13px;
|
|
382
|
-
background-size: contain;
|
|
383
|
-
background-color:
|
|
384
|
-
border-radius:3px;
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
}
|
|
389
|
-
.apx-tristate.
|
|
390
|
-
background-image: url(${
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
469
|
+
___CSS_LOADER_EXPORT___.push([module.id, `.apx-tristate {
|
|
470
|
+
display: inline-block;
|
|
471
|
+
vertical-align: middle;
|
|
472
|
+
text-align: center;
|
|
473
|
+
cursor: pointer;
|
|
474
|
+
position: relative;
|
|
475
|
+
min-width:13px;
|
|
476
|
+
min-height:13px;
|
|
477
|
+
background-size: contain;
|
|
478
|
+
background-color: transparent;
|
|
479
|
+
border-radius:3px;
|
|
480
|
+
--apx-tristate-tick-color: transparent;
|
|
481
|
+
--apx-tristate-checked-color: #0654ba;
|
|
482
|
+
--apx-tristate-crossed-color: #f00;
|
|
483
|
+
}
|
|
484
|
+
.apx-tristate.unchecked {
|
|
485
|
+
background-image: url(${___CSS_LOADER_URL_REPLACEMENT_0___});
|
|
486
|
+
}
|
|
487
|
+
.apx-tristate.unchecked.apx-tristate--unchecked-indeterminate::after {
|
|
488
|
+
content: '';
|
|
489
|
+
position: absolute;
|
|
490
|
+
inset: 0;
|
|
491
|
+
display: block;
|
|
492
|
+
pointer-events: none;
|
|
493
|
+
}
|
|
494
|
+
/* When --mixed is used (e.g. parent + sub-checkboxes), dash shows only when children are mixed */
|
|
495
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::before,
|
|
496
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::after {
|
|
497
|
+
display: none;
|
|
498
|
+
}
|
|
499
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash::before {
|
|
500
|
+
content: '';
|
|
501
|
+
position: absolute;
|
|
502
|
+
inset: 0;
|
|
503
|
+
display: block;
|
|
504
|
+
pointer-events: none;
|
|
505
|
+
background-color: var(--apx-tristate-checked-color);
|
|
506
|
+
border-radius: inherit;
|
|
507
|
+
}
|
|
508
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash::after {
|
|
509
|
+
background-color: var(--apx-tristate-tick-color);
|
|
510
|
+
-webkit-mask-repeat: no-repeat;
|
|
511
|
+
-webkit-mask-position: center;
|
|
512
|
+
-webkit-mask-size: 100% 100%;
|
|
513
|
+
-webkit-mask-mode: alpha;
|
|
514
|
+
mask-repeat: no-repeat;
|
|
515
|
+
mask-position: center;
|
|
516
|
+
mask-size: 100% 100%;
|
|
517
|
+
mask-mode: alpha;
|
|
518
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_1___});
|
|
519
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_1___});
|
|
520
|
+
}
|
|
521
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-filled-check::after {
|
|
522
|
+
background-color: var(--apx-tristate-checked-color);
|
|
523
|
+
border-radius: inherit;
|
|
524
|
+
}
|
|
525
|
+
.apx-tristate.checked {
|
|
526
|
+
background-image: none;
|
|
527
|
+
background-color: var(--apx-tristate-checked-color);
|
|
528
|
+
}
|
|
529
|
+
.apx-tristate.crossed {
|
|
530
|
+
background-image: none;
|
|
531
|
+
background-color: var(--apx-tristate-crossed-color);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
.apx-tristate.checked::after,
|
|
535
|
+
.apx-tristate.crossed::after {
|
|
536
|
+
content: '';
|
|
537
|
+
position: absolute;
|
|
538
|
+
inset: 0;
|
|
539
|
+
display: block;
|
|
540
|
+
background-color: var(--apx-tristate-tick-color);
|
|
541
|
+
-webkit-mask-repeat: no-repeat;
|
|
542
|
+
-webkit-mask-position: center;
|
|
543
|
+
-webkit-mask-size: 100% 100%;
|
|
544
|
+
-webkit-mask-mode: alpha;
|
|
545
|
+
mask-repeat: no-repeat;
|
|
546
|
+
mask-position: center;
|
|
547
|
+
mask-size: 100% 100%;
|
|
548
|
+
mask-mode: alpha;
|
|
549
|
+
pointer-events: none;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
.apx-tristate.checked::after {
|
|
553
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_2___});
|
|
554
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_2___});
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.apx-tristate.crossed::after {
|
|
558
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_3___});
|
|
559
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_3___});
|
|
560
|
+
}`, "",{"version":3,"sources":["webpack://./modules/tristate/css/tristate.css"],"names":[],"mappings":"AAAA;IACI,qBAAqB;IACrB,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,wBAAwB;IACxB,6BAA6B;IAC7B,iBAAiB;IACjB,sCAAsC;IACtC,qCAAqC;IACrC,kCAAkC;AACtC;AACA;IACI,yDAA6X;AACjY;AACA;IACI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,oBAAoB;AACxB;AACA,iGAAiG;AACjG;;IAEI,aAAa;AACjB;AACA;IACI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,oBAAoB;IACpB,mDAAmD;IACnD,sBAAsB;AAC1B;AACA;IACI,gDAAgD;IAChD,8BAA8B;IAC9B,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,2DAA2O;IAC3O,mDAAmO;AACvO;AACA;IACI,mDAAmD;IACnD,sBAAsB;AAC1B;AACA;IACI,sBAAsB;IACtB,mDAAmD;AACvD;AACA;IACI,sBAAsB;IACtB,mDAAmD;AACvD;;AAEA;;IAEI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,gDAAgD;IAChD,8BAA8B;IAC9B,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,oBAAoB;AACxB;;AAEA;IACI,2DAA2Q;IAC3Q,mDAAmQ;AACvQ;;AAEA;IACI,2DAA+Q;IAC/Q,mDAAuQ;AAC3Q","sourcesContent":[".apx-tristate {\n display: inline-block;\n vertical-align: middle;\n text-align: center;\n cursor: pointer;\n position: relative;\n min-width:13px;\n min-height:13px;\n background-size: contain;\n background-color: transparent;\n border-radius:3px;\n --apx-tristate-tick-color: transparent;\n --apx-tristate-checked-color: #0654ba;\n --apx-tristate-crossed-color: #f00;\n}\n.apx-tristate.unchecked {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cmask id='frame-cutout'%3E%3Crect width='32' height='32' fill='%23fff'/%3E%3Crect x='3' y='3' width='26' height='26' rx='4' ry='4' fill='%23000'/%3E%3C/mask%3E%3Crect width='32' height='32' fill='%23cccccc' mask='url(%23frame-cutout)'/%3E%3C/svg%3E\");\n}\n.apx-tristate.unchecked.apx-tristate--unchecked-indeterminate::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n pointer-events: none;\n}\n/* When --mixed is used (e.g. parent + sub-checkboxes), dash shows only when children are mixed */\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::before,\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::after {\n display: none;\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash::before {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n pointer-events: none;\n background-color: var(--apx-tristate-checked-color);\n border-radius: inherit;\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash::after {\n background-color: var(--apx-tristate-tick-color);\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: center;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-mode: alpha;\n mask-repeat: no-repeat;\n mask-position: center;\n mask-size: 100% 100%;\n mask-mode: alpha;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 16h16' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 16h16' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E\");\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-filled-check::after {\n background-color: var(--apx-tristate-checked-color);\n border-radius: inherit;\n}\n.apx-tristate.checked {\n background-image: none;\n background-color: var(--apx-tristate-checked-color);\n}\n.apx-tristate.crossed {\n background-image: none;\n background-color: var(--apx-tristate-crossed-color);\n}\n\n.apx-tristate.checked::after,\n.apx-tristate.crossed::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n background-color: var(--apx-tristate-tick-color);\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: center;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-mode: alpha;\n mask-repeat: no-repeat;\n mask-position: center;\n mask-size: 100% 100%;\n mask-mode: alpha;\n pointer-events: none;\n}\n\n.apx-tristate.checked::after {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 17L12 23L26 9' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 17L12 23L26 9' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n}\n\n.apx-tristate.crossed::after {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 8L24 24M24 8L8 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 8L24 24M24 8L8 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n}"],"sourceRoot":""}]);
|
|
399
561
|
// Exports
|
|
400
562
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
401
563
|
|
|
@@ -621,6 +783,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
|
|
|
621
783
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
622
784
|
|
|
623
785
|
|
|
786
|
+
/***/ }),
|
|
787
|
+
|
|
788
|
+
/***/ "./modules/scrollableTable/css/scrollableTable.css":
|
|
789
|
+
/*!*********************************************************!*\
|
|
790
|
+
!*** ./modules/scrollableTable/css/scrollableTable.css ***!
|
|
791
|
+
\*********************************************************/
|
|
792
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
793
|
+
|
|
794
|
+
__webpack_require__.r(__webpack_exports__);
|
|
795
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
796
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
797
|
+
/* harmony export */ });
|
|
798
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
|
|
799
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
800
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
|
|
801
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
802
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
|
|
803
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
|
|
804
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
|
|
805
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
|
|
806
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
|
|
807
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
|
|
808
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
|
|
809
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
|
|
810
|
+
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./scrollableTable.css */ "./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css");
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
var options = {};
|
|
823
|
+
|
|
824
|
+
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
825
|
+
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
826
|
+
|
|
827
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
828
|
+
|
|
829
|
+
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
830
|
+
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
831
|
+
|
|
832
|
+
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
838
|
+
|
|
839
|
+
|
|
624
840
|
/***/ }),
|
|
625
841
|
|
|
626
842
|
/***/ "./modules/toast/css/toast.css":
|
|
@@ -998,33 +1214,43 @@ module.exports = styleTagTransform;
|
|
|
998
1214
|
|
|
999
1215
|
/***/ }),
|
|
1000
1216
|
|
|
1001
|
-
/***/ "data:image/svg+xml,%
|
|
1002
|
-
|
|
1003
|
-
!*** data:image/svg+xml,%
|
|
1004
|
-
|
|
1217
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E":
|
|
1218
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1219
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E ***!
|
|
1220
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1005
1221
|
/***/ ((module) => {
|
|
1006
1222
|
|
|
1007
|
-
module.exports = "data:image/svg+xml,%
|
|
1223
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E";
|
|
1008
1224
|
|
|
1009
1225
|
/***/ }),
|
|
1010
1226
|
|
|
1011
|
-
/***/ "data:image/svg+xml,%3Csvg
|
|
1012
|
-
|
|
1013
|
-
!*** data:image/svg+xml,%3Csvg
|
|
1014
|
-
|
|
1227
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E":
|
|
1228
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1229
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E ***!
|
|
1230
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1015
1231
|
/***/ ((module) => {
|
|
1016
1232
|
|
|
1017
|
-
module.exports = "data:image/svg+xml,%3Csvg
|
|
1233
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
|
|
1018
1234
|
|
|
1019
1235
|
/***/ }),
|
|
1020
1236
|
|
|
1021
|
-
/***/ "data:image/svg+xml,%3Csvg
|
|
1022
|
-
|
|
1023
|
-
!*** data:image/svg+xml,%3Csvg
|
|
1024
|
-
|
|
1237
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E":
|
|
1238
|
+
/*!************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1239
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E ***!
|
|
1240
|
+
\************************************************************************************************************************************************************************************************************************************************************/
|
|
1025
1241
|
/***/ ((module) => {
|
|
1026
1242
|
|
|
1027
|
-
module.exports = "data:image/svg+xml,%3Csvg
|
|
1243
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E";
|
|
1244
|
+
|
|
1245
|
+
/***/ }),
|
|
1246
|
+
|
|
1247
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E":
|
|
1248
|
+
/*!****************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1249
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E ***!
|
|
1250
|
+
\****************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1251
|
+
/***/ ((module) => {
|
|
1252
|
+
|
|
1253
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
|
|
1028
1254
|
|
|
1029
1255
|
/***/ }),
|
|
1030
1256
|
|
|
@@ -1511,9 +1737,7 @@ function executeCallbacks(event, uniqueId, timeoutDuration, selector = '', eleme
|
|
|
1511
1737
|
}
|
|
1512
1738
|
});
|
|
1513
1739
|
});
|
|
1514
|
-
}, Promise.resolve()).catch(
|
|
1515
|
-
console.error('Error in callback chain:', error);
|
|
1516
|
-
});
|
|
1740
|
+
}, Promise.resolve()).catch(() => {});
|
|
1517
1741
|
}
|
|
1518
1742
|
}
|
|
1519
1743
|
|
|
@@ -1545,6 +1769,598 @@ function closest(element, selector) {
|
|
|
1545
1769
|
}
|
|
1546
1770
|
|
|
1547
1771
|
|
|
1772
|
+
/***/ }),
|
|
1773
|
+
|
|
1774
|
+
/***/ "./modules/scrollableTable/scrollableTable.mjs":
|
|
1775
|
+
/*!*****************************************************!*\
|
|
1776
|
+
!*** ./modules/scrollableTable/scrollableTable.mjs ***!
|
|
1777
|
+
\*****************************************************/
|
|
1778
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1779
|
+
|
|
1780
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1781
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1782
|
+
/* harmony export */ "default": () => (/* binding */ augmentWithScrollableTable)
|
|
1783
|
+
/* harmony export */ });
|
|
1784
|
+
/* harmony import */ var _css_scrollableTable_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/scrollableTable.css */ "./modules/scrollableTable/css/scrollableTable.css");
|
|
1785
|
+
|
|
1786
|
+
|
|
1787
|
+
const DATA_KEY = '_apxScrollableTable';
|
|
1788
|
+
const CLASS_TABLE = 'apx-scrollable-table';
|
|
1789
|
+
|
|
1790
|
+
const DEFAULT_MAX_HEIGHT = '200px';
|
|
1791
|
+
|
|
1792
|
+
const THROTTLE_MS = 16;
|
|
1793
|
+
|
|
1794
|
+
/** @type {Set<HTMLTableElement>} */
|
|
1795
|
+
const dynamicTables = new Set();
|
|
1796
|
+
/** @type {Map<Element, Set<HTMLTableElement>>} */
|
|
1797
|
+
const scrollSourceToTables = new Map();
|
|
1798
|
+
/** @type {Map<Element, Set<HTMLTableElement>>} */
|
|
1799
|
+
const resizeSourceToTables = new Map();
|
|
1800
|
+
/** @type {boolean} */
|
|
1801
|
+
let resizeWindowAttached = false;
|
|
1802
|
+
/** @type {ResizeObserver|null} */
|
|
1803
|
+
let resizeObserver = null;
|
|
1804
|
+
/** @type {number} */
|
|
1805
|
+
let throttleLast = 0;
|
|
1806
|
+
/** @type {number|null} */
|
|
1807
|
+
let throttleRaf = null;
|
|
1808
|
+
|
|
1809
|
+
/**
|
|
1810
|
+
* Sum of colspans for one row (direct th/td children of tr).
|
|
1811
|
+
* @param {HTMLTableRowElement} tr
|
|
1812
|
+
* @returns {number}
|
|
1813
|
+
*/
|
|
1814
|
+
function getRowColumnCount(tr) {
|
|
1815
|
+
let cols = 0;
|
|
1816
|
+
tr.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
|
|
1817
|
+
cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
|
|
1818
|
+
});
|
|
1819
|
+
return cols;
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
/**
|
|
1823
|
+
* Get maximum column count in a section (max sum of colspans across all rows).
|
|
1824
|
+
* @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
|
|
1825
|
+
* @returns {number}
|
|
1826
|
+
*/
|
|
1827
|
+
function getColumnCountFromSection(section) {
|
|
1828
|
+
if (!section) return 0;
|
|
1829
|
+
const rows = section.querySelectorAll(':scope > tr');
|
|
1830
|
+
let maxCols = 0;
|
|
1831
|
+
rows.forEach((tr) => {
|
|
1832
|
+
const sum = getRowColumnCount(tr);
|
|
1833
|
+
if (sum > maxCols) maxCols = sum;
|
|
1834
|
+
});
|
|
1835
|
+
return maxCols;
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
/**
|
|
1839
|
+
* Get total column count for the table (max across thead, tbody, tfoot).
|
|
1840
|
+
* @param {HTMLTableElement} table
|
|
1841
|
+
* @returns {number}
|
|
1842
|
+
*/
|
|
1843
|
+
function getTableColumnCount(table) {
|
|
1844
|
+
const thead = table.querySelector('thead');
|
|
1845
|
+
const tbody = table.querySelector('tbody');
|
|
1846
|
+
const tfoot = table.querySelector('tfoot');
|
|
1847
|
+
const countThead = thead ? getColumnCountFromSection(thead) : 0;
|
|
1848
|
+
const countTbody = tbody ? getColumnCountFromSection(tbody) : 0;
|
|
1849
|
+
const countTfoot = tfoot ? getColumnCountFromSection(tfoot) : 0;
|
|
1850
|
+
return Math.max(countThead, countTbody, countTfoot, 1);
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
/**
|
|
1854
|
+
* Measure current column widths from the table in its natural layout (before applying scrollable class).
|
|
1855
|
+
* Prefers a row where each cell has colspan 1 so we get one width per column; otherwise splits cell widths by colspan.
|
|
1856
|
+
* @param {HTMLTableElement} table - table not yet with scrollable class
|
|
1857
|
+
* @param {number} numCols
|
|
1858
|
+
* @returns {number[]} pixel widths per column
|
|
1859
|
+
*/
|
|
1860
|
+
function measureColumnWidths(table, numCols) {
|
|
1861
|
+
const thead = table.querySelector('thead');
|
|
1862
|
+
const tbody = table.querySelector('tbody');
|
|
1863
|
+
const sections = [thead, tbody].filter(Boolean);
|
|
1864
|
+
/** @type {HTMLTableRowElement|null} */
|
|
1865
|
+
let bestRow = null;
|
|
1866
|
+
for (const section of sections) {
|
|
1867
|
+
const rows = section.querySelectorAll(':scope > tr');
|
|
1868
|
+
for (const tr of rows) {
|
|
1869
|
+
const cells = tr.querySelectorAll(':scope > th, :scope > td');
|
|
1870
|
+
if (getRowColumnCount(tr) !== numCols) continue;
|
|
1871
|
+
const allSingle = Array.from(cells).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1);
|
|
1872
|
+
if (allSingle && cells.length === numCols) {
|
|
1873
|
+
bestRow = tr;
|
|
1874
|
+
break;
|
|
1875
|
+
}
|
|
1876
|
+
if (!bestRow) bestRow = tr;
|
|
1877
|
+
}
|
|
1878
|
+
if (bestRow && Array.from(bestRow.querySelectorAll(':scope > th, :scope > td')).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1))
|
|
1879
|
+
break;
|
|
1880
|
+
}
|
|
1881
|
+
if (!bestRow) return [];
|
|
1882
|
+
|
|
1883
|
+
const widths = new Array(numCols).fill(0);
|
|
1884
|
+
const cells = bestRow.querySelectorAll(':scope > th, :scope > td');
|
|
1885
|
+
let col = 0;
|
|
1886
|
+
for (const cell of cells) {
|
|
1887
|
+
const span = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols - col);
|
|
1888
|
+
if (span <= 0) break;
|
|
1889
|
+
const w = cell.getBoundingClientRect().width;
|
|
1890
|
+
const perCol = w / span;
|
|
1891
|
+
for (let i = 0; i < span; i++) widths[col + i] = perCol;
|
|
1892
|
+
col += span;
|
|
1893
|
+
}
|
|
1894
|
+
if (col === 0) return [];
|
|
1895
|
+
const fallback = widths.some((w) => w > 0) ? Math.max(80, ...widths.filter((w) => w > 0)) / 2 : 80;
|
|
1896
|
+
for (let i = 0; i < numCols; i++) if (widths[i] <= 0) widths[i] = fallback;
|
|
1897
|
+
return widths.slice(0, numCols);
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
/**
|
|
1901
|
+
* Count direct tr children in a section.
|
|
1902
|
+
* @param {HTMLTableSectionElement} section
|
|
1903
|
+
* @returns {number}
|
|
1904
|
+
*/
|
|
1905
|
+
function getRowCount(section) {
|
|
1906
|
+
if (!section) return 0;
|
|
1907
|
+
return section.querySelectorAll(':scope > tr').length;
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
/**
|
|
1911
|
+
* Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
|
|
1912
|
+
* Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
|
|
1913
|
+
* @param {HTMLTableSectionElement} section
|
|
1914
|
+
* @param {number} numRows
|
|
1915
|
+
* @param {number} numCols
|
|
1916
|
+
* @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
|
|
1917
|
+
*/
|
|
1918
|
+
function computeCellPlacements(section, numRows, numCols) {
|
|
1919
|
+
if (!section || numRows === 0 || numCols === 0) return [];
|
|
1920
|
+
const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
|
|
1921
|
+
const placements = [];
|
|
1922
|
+
const rows = section.querySelectorAll(':scope > tr');
|
|
1923
|
+
|
|
1924
|
+
for (let r = 0; r < rows.length; r++) {
|
|
1925
|
+
const tr = rows[r];
|
|
1926
|
+
const cells = tr.querySelectorAll(':scope > th, :scope > td');
|
|
1927
|
+
for (const cell of cells) {
|
|
1928
|
+
const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
|
|
1929
|
+
const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
|
|
1930
|
+
let col = 0;
|
|
1931
|
+
while (col < numCols) {
|
|
1932
|
+
let free = true;
|
|
1933
|
+
for (let rr = r; rr < r + rowspan && free; rr++) {
|
|
1934
|
+
for (let cc = col; cc < col + colspan && free; cc++) {
|
|
1935
|
+
if (occupied[rr]?.[cc]) free = false;
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
if (free) break;
|
|
1939
|
+
col++;
|
|
1940
|
+
}
|
|
1941
|
+
if (col + colspan > numCols) continue;
|
|
1942
|
+
for (let rr = r; rr < r + rowspan; rr++) {
|
|
1943
|
+
for (let cc = col; cc < col + colspan; cc++) {
|
|
1944
|
+
if (occupied[rr]) occupied[rr][cc] = true;
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
placements.push({ cell, row: r, col, colspan, rowspan });
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
return placements;
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
/**
|
|
1954
|
+
* Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
|
|
1955
|
+
*/
|
|
1956
|
+
function applyPlacements(placements) {
|
|
1957
|
+
placements.forEach(({ cell, row, col, colspan, rowspan }) => {
|
|
1958
|
+
cell.style.gridRow = `${row + 1} / span ${rowspan}`;
|
|
1959
|
+
cell.style.gridColumn = `${col + 1} / span ${colspan}`;
|
|
1960
|
+
});
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
/**
|
|
1964
|
+
* Clear grid placement styles from all th/td in a table (for refresh).
|
|
1965
|
+
* @param {HTMLTableElement} table
|
|
1966
|
+
*/
|
|
1967
|
+
function clearPlacements(table) {
|
|
1968
|
+
table.querySelectorAll('th, td').forEach((cell) => {
|
|
1969
|
+
cell.style.gridRow = '';
|
|
1970
|
+
cell.style.gridColumn = '';
|
|
1971
|
+
});
|
|
1972
|
+
}
|
|
1973
|
+
|
|
1974
|
+
/**
|
|
1975
|
+
* Normalize height/maxHeight option to a CSS length string.
|
|
1976
|
+
* @param {number|string} value
|
|
1977
|
+
* @returns {string}
|
|
1978
|
+
*/
|
|
1979
|
+
function normalizeHeight(value) {
|
|
1980
|
+
if (value == null) return DEFAULT_MAX_HEIGHT;
|
|
1981
|
+
if (typeof value === 'number') return `${value}px`;
|
|
1982
|
+
return String(value);
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
/**
|
|
1986
|
+
* Resolve current body height from options: either bodyHeightDynamic.get(table) or static height/maxHeight.
|
|
1987
|
+
* @param {Object} options - scrollableTable options (may include bodyHeightDynamic, height, maxHeight)
|
|
1988
|
+
* @param {HTMLTableElement} table
|
|
1989
|
+
* @returns {{ bodySize: string, useFixedHeight: boolean }}
|
|
1990
|
+
*/
|
|
1991
|
+
function resolveBodyHeight(options, table) {
|
|
1992
|
+
const dyn = options.bodyHeightDynamic;
|
|
1993
|
+
if (dyn && typeof dyn.get === 'function') {
|
|
1994
|
+
const value = dyn.get(table);
|
|
1995
|
+
const bodySize = normalizeHeight(value);
|
|
1996
|
+
const useFixedHeight = dyn.useAs === 'height';
|
|
1997
|
+
return { bodySize, useFixedHeight };
|
|
1998
|
+
}
|
|
1999
|
+
const useFixedHeight = options.height != null;
|
|
2000
|
+
const raw = useFixedHeight ? options.height : options.maxHeight;
|
|
2001
|
+
const bodySize = normalizeHeight(raw);
|
|
2002
|
+
return { bodySize, useFixedHeight };
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
/**
|
|
2006
|
+
* Update only the tbody height CSS variable and class (used on scroll/resize for dynamic height).
|
|
2007
|
+
* @param {HTMLTableElement} table
|
|
2008
|
+
* @param {Object} options - full scrollableTable options (with ref.options when called from throttle)
|
|
2009
|
+
*/
|
|
2010
|
+
function updateTableBodyHeight(table, options) {
|
|
2011
|
+
const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
|
|
2012
|
+
table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
|
|
2013
|
+
table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
/**
|
|
2017
|
+
* Run lazy cleanup then updateTableBodyHeight for all tables still in dynamicTables. (Called by throttled entry point or RAF.)
|
|
2018
|
+
*/
|
|
2019
|
+
function flushDynamicHeightUpdate() {
|
|
2020
|
+
const toRemove = [];
|
|
2021
|
+
dynamicTables.forEach((table) => {
|
|
2022
|
+
if (!table.isConnected) toRemove.push(table);
|
|
2023
|
+
});
|
|
2024
|
+
toRemove.forEach((table) => removeTableFromDynamicSources(table));
|
|
2025
|
+
dynamicTables.forEach((table) => {
|
|
2026
|
+
const ref = table[DATA_KEY];
|
|
2027
|
+
if (ref?.options) updateTableBodyHeight(table, ref.options);
|
|
2028
|
+
});
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
/**
|
|
2032
|
+
* Throttled entry: run flushDynamicHeightUpdate now or schedule with RAF.
|
|
2033
|
+
*/
|
|
2034
|
+
function runDynamicHeightUpdate() {
|
|
2035
|
+
const now = Date.now();
|
|
2036
|
+
if (now - throttleLast < THROTTLE_MS) {
|
|
2037
|
+
if (!throttleRaf) {
|
|
2038
|
+
throttleRaf = requestAnimationFrame(() => {
|
|
2039
|
+
throttleRaf = null;
|
|
2040
|
+
throttleLast = Date.now();
|
|
2041
|
+
flushDynamicHeightUpdate();
|
|
2042
|
+
});
|
|
2043
|
+
}
|
|
2044
|
+
return;
|
|
2045
|
+
}
|
|
2046
|
+
throttleLast = now;
|
|
2047
|
+
flushDynamicHeightUpdate();
|
|
2048
|
+
}
|
|
2049
|
+
|
|
2050
|
+
/**
|
|
2051
|
+
* Resolve updateOn into scroll targets (Element[]) and resize: { window: boolean, elements: Element[] }.
|
|
2052
|
+
* @param {Object} options - options.bodyHeightDynamic.updateOn
|
|
2053
|
+
* @returns {{ scrollTargets: Element[], resizeWindow: boolean, resizeElements: Element[] }}
|
|
2054
|
+
*/
|
|
2055
|
+
function resolveUpdateOn(options) {
|
|
2056
|
+
const u = options?.bodyHeightDynamic?.updateOn;
|
|
2057
|
+
const scrollOn = u?.scrollOn;
|
|
2058
|
+
const resizeOn = u?.resizeOn;
|
|
2059
|
+
const scrollTargets = [];
|
|
2060
|
+
if (scrollOn != null && Array.isArray(scrollOn) && scrollOn.length > 0) {
|
|
2061
|
+
scrollOn.forEach((x) => {
|
|
2062
|
+
if (x === 'document') scrollTargets.push(document.documentElement);
|
|
2063
|
+
else if (x && typeof x.addEventListener === 'function') scrollTargets.push(x);
|
|
2064
|
+
});
|
|
2065
|
+
} else if (u?.scroll === true) {
|
|
2066
|
+
scrollTargets.push(document.documentElement);
|
|
2067
|
+
scrollTargets.push(typeof window !== 'undefined' ? window : document.documentElement);
|
|
2068
|
+
}
|
|
2069
|
+
let resizeWindow = false;
|
|
2070
|
+
const resizeElements = [];
|
|
2071
|
+
if (resizeOn != null && Array.isArray(resizeOn) && resizeOn.length > 0) {
|
|
2072
|
+
resizeOn.forEach((x) => {
|
|
2073
|
+
if (x === 'window') resizeWindow = true;
|
|
2074
|
+
else if (x && typeof x.addEventListener === 'function') resizeElements.push(x);
|
|
2075
|
+
});
|
|
2076
|
+
} else if (u?.resize !== false) {
|
|
2077
|
+
resizeWindow = true;
|
|
2078
|
+
resizeElements.push(document.documentElement);
|
|
2079
|
+
}
|
|
2080
|
+
return { scrollTargets, resizeWindow, resizeElements };
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
/**
|
|
2084
|
+
* Remove table from dynamicTables and from all scroll/resize Maps; detach listeners if Set becomes empty.
|
|
2085
|
+
* @param {HTMLTableElement} table
|
|
2086
|
+
*/
|
|
2087
|
+
function removeTableFromDynamicSources(table) {
|
|
2088
|
+
dynamicTables.delete(table);
|
|
2089
|
+
scrollSourceToTables.forEach((set, el) => {
|
|
2090
|
+
set.delete(table);
|
|
2091
|
+
if (set.size === 0) {
|
|
2092
|
+
scrollSourceToTables.delete(el);
|
|
2093
|
+
el.removeEventListener('scroll', onScrollThrottled);
|
|
2094
|
+
}
|
|
2095
|
+
});
|
|
2096
|
+
resizeSourceToTables.forEach((set, el) => {
|
|
2097
|
+
set.delete(table);
|
|
2098
|
+
if (set.size === 0) {
|
|
2099
|
+
resizeSourceToTables.delete(el);
|
|
2100
|
+
if (resizeObserver) resizeObserver.unobserve(el);
|
|
2101
|
+
}
|
|
2102
|
+
});
|
|
2103
|
+
if (resizeWindowAttached && dynamicTables.size === 0) {
|
|
2104
|
+
window.removeEventListener('resize', onResizeThrottled);
|
|
2105
|
+
resizeWindowAttached = false;
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
function onScrollThrottled() {
|
|
2110
|
+
runDynamicHeightUpdate();
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
function onResizeThrottled() {
|
|
2114
|
+
runDynamicHeightUpdate();
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
/**
|
|
2118
|
+
* Register a table with bodyHeightDynamic: add to Set and attach scroll/resize listeners per updateOn.
|
|
2119
|
+
* @param {HTMLTableElement} table
|
|
2120
|
+
* @param {Object} options - full options (ref.options)
|
|
2121
|
+
*/
|
|
2122
|
+
function registerDynamicTable(table, options) {
|
|
2123
|
+
const { scrollTargets, resizeWindow, resizeElements } = resolveUpdateOn(options);
|
|
2124
|
+
dynamicTables.add(table);
|
|
2125
|
+
scrollTargets.forEach((el) => {
|
|
2126
|
+
let set = scrollSourceToTables.get(el);
|
|
2127
|
+
if (!set) {
|
|
2128
|
+
set = new Set();
|
|
2129
|
+
scrollSourceToTables.set(el, set);
|
|
2130
|
+
el.addEventListener('scroll', onScrollThrottled, { passive: true });
|
|
2131
|
+
}
|
|
2132
|
+
set.add(table);
|
|
2133
|
+
});
|
|
2134
|
+
if (resizeWindow) {
|
|
2135
|
+
if (!resizeWindowAttached) {
|
|
2136
|
+
resizeWindowAttached = true;
|
|
2137
|
+
window.addEventListener('resize', onResizeThrottled, { passive: true });
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
resizeElements.forEach((el) => {
|
|
2141
|
+
let set = resizeSourceToTables.get(el);
|
|
2142
|
+
if (!set) {
|
|
2143
|
+
set = new Set();
|
|
2144
|
+
resizeSourceToTables.set(el, set);
|
|
2145
|
+
if (!resizeObserver) resizeObserver = new ResizeObserver(onResizeThrottled);
|
|
2146
|
+
resizeObserver.observe(el);
|
|
2147
|
+
}
|
|
2148
|
+
set.add(table);
|
|
2149
|
+
});
|
|
2150
|
+
}
|
|
2151
|
+
|
|
2152
|
+
/**
|
|
2153
|
+
* Build grid-template-columns from measured widths and optional overrides per column.
|
|
2154
|
+
* @param {number} numCols
|
|
2155
|
+
* @param {number[]} columnWidths
|
|
2156
|
+
* @param {Object<number, string>|(string|null)[]} columnOverrides - map column index → CSS value (e.g. '2fr'), or array; null/empty = use measured
|
|
2157
|
+
* @returns {string}
|
|
2158
|
+
*/
|
|
2159
|
+
function buildTemplateColumns(numCols, columnWidths, columnOverrides) {
|
|
2160
|
+
if (!columnWidths || columnWidths.length !== numCols) return '';
|
|
2161
|
+
const get = (i) =>
|
|
2162
|
+
Array.isArray(columnOverrides) ? columnOverrides[i] : columnOverrides[i];
|
|
2163
|
+
const parts = [];
|
|
2164
|
+
for (let i = 0; i < numCols; i++) {
|
|
2165
|
+
const ov = get(i);
|
|
2166
|
+
if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
|
|
2167
|
+
parts.push(ov.trim());
|
|
2168
|
+
} else {
|
|
2169
|
+
parts.push(`${Math.round(columnWidths[i])}fr`);
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
return parts.join(' ');
|
|
2173
|
+
}
|
|
2174
|
+
|
|
2175
|
+
/**
|
|
2176
|
+
* Build grid-template-rows from measured heights and optional overrides per row.
|
|
2177
|
+
* @param {number} numRows
|
|
2178
|
+
* @param {number[]} rowHeights
|
|
2179
|
+
* @param {Object<number, string>|(string|null)[]} rowOverrides - map row index → CSS value (e.g. '48px', '2fr'), or array; null/empty = use measured
|
|
2180
|
+
* @returns {string}
|
|
2181
|
+
*/
|
|
2182
|
+
function buildTemplateRows(numRows, rowHeights, rowOverrides) {
|
|
2183
|
+
if (!rowHeights || rowHeights.length < numRows) return '';
|
|
2184
|
+
const get = (i) =>
|
|
2185
|
+
Array.isArray(rowOverrides) ? rowOverrides[i] : rowOverrides?.[i];
|
|
2186
|
+
const parts = [];
|
|
2187
|
+
for (let i = 0; i < numRows; i++) {
|
|
2188
|
+
const ov = get(i);
|
|
2189
|
+
if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
|
|
2190
|
+
parts.push(ov.trim());
|
|
2191
|
+
} else {
|
|
2192
|
+
parts.push(`${Math.round(rowHeights[i] ?? 0)}px`);
|
|
2193
|
+
}
|
|
2194
|
+
}
|
|
2195
|
+
return parts.join(' ');
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
/**
|
|
2199
|
+
* Measure each tr height in a section (table must not yet have scrollable class).
|
|
2200
|
+
* @param {HTMLTableSectionElement|null} section
|
|
2201
|
+
* @returns {number[]}
|
|
2202
|
+
*/
|
|
2203
|
+
function measureRowHeights(section) {
|
|
2204
|
+
if (!section) return [];
|
|
2205
|
+
const rows = section.querySelectorAll(':scope > tr');
|
|
2206
|
+
return Array.from(rows).map((tr) => tr.getBoundingClientRect().height);
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
/**
|
|
2210
|
+
* Apply scrollable table layout to a single table.
|
|
2211
|
+
* @param {HTMLTableElement} table
|
|
2212
|
+
* @param {Object} options - scrollableTable options
|
|
2213
|
+
* @param {number|string} [options.maxHeight] - Max height of tbody (default '200px'). Ignored when height or bodyHeightDynamic is set.
|
|
2214
|
+
* @param {number|string} [options.height] - Fixed height of tbody. Ignored when bodyHeightDynamic is set.
|
|
2215
|
+
* @param {{ get: (function(HTMLTableElement): number|string), useAs: 'height'|'maxHeight', updateOn?: { scroll?: boolean, resize?: boolean, scrollOn?: ('document'|Element)[], resizeOn?: ('window'|Element)[] } }} [options.bodyHeightDynamic] - When set, body size is computed by get(table) and re-applied when scroll/resize sources fire. updateOn: scrollOn/resizeOn list elements (sentinels 'document'/'window'); or use scroll (default false) / resize (default true) booleans.
|
|
2216
|
+
* @param {string} [options.gridTemplateColumns]
|
|
2217
|
+
* @param {{ thead?: string, tbody?: string, tfoot?: string }} [options.gridTemplateRows]
|
|
2218
|
+
* @param {{ thead?: Object<number, string>|(string|null)[], tbody?: Object<number, string>|(string|null)[], tfoot?: Object<number, string>|(string|null)[] }} [options.rowOverrides]
|
|
2219
|
+
* @param {Object<number, string>|(string|null)[]} [options.columnOverrides]
|
|
2220
|
+
* @param {{ columnWidths?: number[], rowHeights?: { thead?: number[], tbody?: number[], tfoot?: number[] } } | undefined} ref - existing ref when refreshing
|
|
2221
|
+
*/
|
|
2222
|
+
function applyScrollableTable(table, options, ref) {
|
|
2223
|
+
const thead = table.querySelector('thead');
|
|
2224
|
+
const tbody = table.querySelector('tbody');
|
|
2225
|
+
const tfoot = table.querySelector('tfoot');
|
|
2226
|
+
|
|
2227
|
+
const numCols = getTableColumnCount(table);
|
|
2228
|
+
if (numCols === 0) return;
|
|
2229
|
+
|
|
2230
|
+
const alreadyScrollable = table.classList.contains(CLASS_TABLE);
|
|
2231
|
+
const customTemplate = typeof options.gridTemplateColumns === 'string' && options.gridTemplateColumns.trim().length > 0;
|
|
2232
|
+
const columnWidths = customTemplate
|
|
2233
|
+
? null
|
|
2234
|
+
: (ref?.columnWidths ?? (alreadyScrollable ? null : measureColumnWidths(table, numCols)));
|
|
2235
|
+
|
|
2236
|
+
const theadRows = getRowCount(thead);
|
|
2237
|
+
const tbodyRows = getRowCount(tbody);
|
|
2238
|
+
const tfootRows = getRowCount(tfoot);
|
|
2239
|
+
|
|
2240
|
+
const rowHeights =
|
|
2241
|
+
ref?.rowHeights ??
|
|
2242
|
+
(alreadyScrollable
|
|
2243
|
+
? null
|
|
2244
|
+
: {
|
|
2245
|
+
thead: measureRowHeights(thead),
|
|
2246
|
+
tbody: measureRowHeights(tbody),
|
|
2247
|
+
tfoot: measureRowHeights(tfoot)
|
|
2248
|
+
});
|
|
2249
|
+
|
|
2250
|
+
table.style.setProperty('--apx-scrollable-cols', String(numCols));
|
|
2251
|
+
table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
|
|
2252
|
+
table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
|
|
2253
|
+
table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
|
|
2254
|
+
const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
|
|
2255
|
+
table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
|
|
2256
|
+
table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
|
|
2257
|
+
|
|
2258
|
+
table.classList.add(CLASS_TABLE);
|
|
2259
|
+
table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
|
|
2260
|
+
table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
|
|
2261
|
+
|
|
2262
|
+
// Force reflow so the grid layout is established before setting measured template-columns.
|
|
2263
|
+
// Without this, the browser batches class + template into one pass and the tbody overflows horizontally.
|
|
2264
|
+
table.offsetHeight; // eslint-disable-line no-unused-expressions
|
|
2265
|
+
|
|
2266
|
+
const gutterSuffix = ' minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px))';
|
|
2267
|
+
if (customTemplate) {
|
|
2268
|
+
table.style.setProperty('--apx-scrollable-template-columns', options.gridTemplateColumns.trim() + gutterSuffix);
|
|
2269
|
+
} else if (columnWidths && columnWidths.length === numCols) {
|
|
2270
|
+
const template =
|
|
2271
|
+
options.columnOverrides != null
|
|
2272
|
+
? buildTemplateColumns(numCols, columnWidths, options.columnOverrides)
|
|
2273
|
+
: columnWidths.map((w) => `${Math.round(w)}fr`).join(' ');
|
|
2274
|
+
table.style.setProperty('--apx-scrollable-template-columns', template + gutterSuffix);
|
|
2275
|
+
} else {
|
|
2276
|
+
table.style.removeProperty('--apx-scrollable-template-columns');
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
clearPlacements(table);
|
|
2280
|
+
|
|
2281
|
+
const sections = [
|
|
2282
|
+
{ section: thead, rows: Math.max(1, theadRows), heights: rowHeights?.thead, key: 'thead' },
|
|
2283
|
+
{ section: tbody, rows: Math.max(1, tbodyRows), heights: rowHeights?.tbody, key: 'tbody' },
|
|
2284
|
+
{ section: tfoot, rows: Math.max(1, tfootRows), heights: rowHeights?.tfoot, key: 'tfoot' }
|
|
2285
|
+
];
|
|
2286
|
+
const customRows = options.gridTemplateRows && typeof options.gridTemplateRows === 'object' ? options.gridTemplateRows : null;
|
|
2287
|
+
const rowOverrides = options.rowOverrides && typeof options.rowOverrides === 'object' ? options.rowOverrides : null;
|
|
2288
|
+
sections.forEach(({ section, rows, heights, key }) => {
|
|
2289
|
+
if (!section) return;
|
|
2290
|
+
const varName = `--apx-scrollable-${key}-template-rows`;
|
|
2291
|
+
const custom = customRows?.[key];
|
|
2292
|
+
const overrides = rowOverrides?.[key];
|
|
2293
|
+
if (typeof custom === 'string' && custom.trim().length > 0) {
|
|
2294
|
+
section.style.setProperty(varName, custom.trim());
|
|
2295
|
+
} else if (heights && heights.length >= rows) {
|
|
2296
|
+
const template =
|
|
2297
|
+
overrides != null
|
|
2298
|
+
? buildTemplateRows(rows, heights.slice(0, rows), overrides)
|
|
2299
|
+
: heights
|
|
2300
|
+
.slice(0, rows)
|
|
2301
|
+
.map((h) => `${Math.round(h)}px`)
|
|
2302
|
+
.join(' ');
|
|
2303
|
+
section.style.setProperty(varName, template);
|
|
2304
|
+
} else {
|
|
2305
|
+
section.style.removeProperty(varName);
|
|
2306
|
+
}
|
|
2307
|
+
const placements = computeCellPlacements(section, rows, numCols);
|
|
2308
|
+
applyPlacements(placements);
|
|
2309
|
+
});
|
|
2310
|
+
|
|
2311
|
+
return { columnWidths, rowHeights };
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
/**
|
|
2315
|
+
* Augments the APX object with scrollableTable(options | 'refresh').
|
|
2316
|
+
* Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
|
|
2317
|
+
*
|
|
2318
|
+
* @param {Object} apx - The APX object to augment.
|
|
2319
|
+
* @example
|
|
2320
|
+
* APX('table.data-grid').scrollableTable({ maxHeight: 300 });
|
|
2321
|
+
* APX('table.data-grid').scrollableTable('refresh');
|
|
2322
|
+
*/
|
|
2323
|
+
function augmentWithScrollableTable(apx) {
|
|
2324
|
+
apx.scrollableTable = function (optionsOrAction) {
|
|
2325
|
+
const isRefresh = optionsOrAction === 'refresh';
|
|
2326
|
+
const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
|
|
2327
|
+
|
|
2328
|
+
apx.elements.forEach((element) => {
|
|
2329
|
+
if (element.tagName !== 'TABLE') return;
|
|
2330
|
+
const table = /** @type {HTMLTableElement} */ (element);
|
|
2331
|
+
|
|
2332
|
+
const ref = table[DATA_KEY];
|
|
2333
|
+
if (ref) {
|
|
2334
|
+
if (isRefresh) {
|
|
2335
|
+
applyScrollableTable(table, ref.options, ref);
|
|
2336
|
+
} else if (options && Object.keys(options).length > 0) {
|
|
2337
|
+
ref.options = { ...ref.options, ...options };
|
|
2338
|
+
const result = applyScrollableTable(table, ref.options, ref);
|
|
2339
|
+
if (result?.columnWidths) ref.columnWidths = result.columnWidths;
|
|
2340
|
+
if (result?.rowHeights) ref.rowHeights = result.rowHeights;
|
|
2341
|
+
}
|
|
2342
|
+
const currentOptions = ref.options;
|
|
2343
|
+
if (currentOptions?.bodyHeightDynamic) registerDynamicTable(table, currentOptions);
|
|
2344
|
+
else removeTableFromDynamicSources(table);
|
|
2345
|
+
return;
|
|
2346
|
+
}
|
|
2347
|
+
if (isRefresh) return;
|
|
2348
|
+
|
|
2349
|
+
console.log('[APX scrollableTable] create', table);
|
|
2350
|
+
const result = applyScrollableTable(table, options, undefined);
|
|
2351
|
+
table[DATA_KEY] = {
|
|
2352
|
+
options: { ...options },
|
|
2353
|
+
columnWidths: result?.columnWidths || undefined,
|
|
2354
|
+
rowHeights: result?.rowHeights || undefined
|
|
2355
|
+
};
|
|
2356
|
+
if (options?.bodyHeightDynamic) registerDynamicTable(table, options);
|
|
2357
|
+
});
|
|
2358
|
+
|
|
2359
|
+
return apx;
|
|
2360
|
+
};
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
|
|
1548
2364
|
/***/ }),
|
|
1549
2365
|
|
|
1550
2366
|
/***/ "./modules/toast/toast.mjs":
|
|
@@ -3460,177 +4276,298 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3460
4276
|
/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
|
|
3461
4277
|
/* harmony export */ });
|
|
3462
4278
|
/* harmony import */ var _css_tristate_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/tristate.css */ "./modules/tristate/css/tristate.css");
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
/**
|
|
3466
|
-
* Creates a tri-state checkbox for each checkbox element in the apx.elements array.
|
|
3467
|
-
* @param {Array<HTMLElement>} apx - An array of HTMLElements which is returned by APX()
|
|
3468
|
-
* @example
|
|
3469
|
-
* // Call the tristate function on an array of checkbox elements
|
|
3470
|
-
* apx.tristate();
|
|
3471
|
-
*/
|
|
3472
|
-
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(apx) {
|
|
3473
|
-
apx.tristate = function (options = {}){
|
|
3474
|
-
apx.elements.forEach((element) => {
|
|
3475
|
-
if (element.type === 'checkbox') {
|
|
3476
|
-
const [originalCheckbox, tristateDom, hiddenInput] = createTriStateCheckbox(element,options);
|
|
3477
|
-
|
|
3478
|
-
if(options.callbacks && options.callbacks.after && typeof options.callbacks.after === 'function') {
|
|
3479
|
-
options.callbacks.after(originalCheckbox, tristateDom, hiddenInput);
|
|
3480
|
-
}
|
|
3481
|
-
}
|
|
3482
|
-
});
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
}
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
const
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
const
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
if (
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
}
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
hiddenInput.removeAttribute('
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
}
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
//
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
3618
|
-
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3629
|
-
|
|
3630
|
-
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
}
|
|
4279
|
+
|
|
4280
|
+
|
|
4281
|
+
/**
|
|
4282
|
+
* Creates a tri-state checkbox for each checkbox element in the apx.elements array.
|
|
4283
|
+
* @param {Array<HTMLElement>} apx - An array of HTMLElements which is returned by APX()
|
|
4284
|
+
* @example
|
|
4285
|
+
* // Call the tristate function on an array of checkbox elements
|
|
4286
|
+
* apx.tristate();
|
|
4287
|
+
*/
|
|
4288
|
+
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(apx) {
|
|
4289
|
+
apx.tristate = function (options = {}){
|
|
4290
|
+
apx.elements.forEach((element) => {
|
|
4291
|
+
if (element.type === 'checkbox') {
|
|
4292
|
+
const [originalCheckbox, tristateDom, hiddenInput] = createTriStateCheckbox(element, options);
|
|
4293
|
+
originalCheckbox._apxTristate = { dom: tristateDom, hiddenInput };
|
|
4294
|
+
if (options.callbacks && options.callbacks.after && typeof options.callbacks.after === 'function') {
|
|
4295
|
+
options.callbacks.after(originalCheckbox, tristateDom, hiddenInput);
|
|
4296
|
+
}
|
|
4297
|
+
}
|
|
4298
|
+
});
|
|
4299
|
+
return {
|
|
4300
|
+
setChildren(childrenApx) {
|
|
4301
|
+
return setChildren(apx, childrenApx, options);
|
|
4302
|
+
}
|
|
4303
|
+
};
|
|
4304
|
+
};
|
|
4305
|
+
}
|
|
4306
|
+
|
|
4307
|
+
/**
|
|
4308
|
+
* Link parent tristate(s) to child checkboxes. When exactly one parent: that parent gets
|
|
4309
|
+
* indeterminate-dash automatically and shows dash when children are mixed; click parent to apply its state to all children.
|
|
4310
|
+
* @param {Object} parentApx - APX instance whose elements are the parent checkbox(es)
|
|
4311
|
+
* @param {Object} childrenApx - APX instance whose elements are the child checkbox(es)
|
|
4312
|
+
* @param {Object} options - Options used for the parent (and applied to children when initializing them)
|
|
4313
|
+
*/
|
|
4314
|
+
function setChildren(parentApx, childrenApx, options) {
|
|
4315
|
+
const parents = parentApx.all().filter((el) => el.type === 'checkbox');
|
|
4316
|
+
if (parents.length === 0) return;
|
|
4317
|
+
if (parents.length > 1) {
|
|
4318
|
+
console.warn('APX tristate setChildren: only the first parent is linked to all children.');
|
|
4319
|
+
}
|
|
4320
|
+
const parentCheckbox = parents[0];
|
|
4321
|
+
const parentRef = parentCheckbox._apxTristate;
|
|
4322
|
+
if (!parentRef) return;
|
|
4323
|
+
|
|
4324
|
+
const parentDom = parentRef.dom;
|
|
4325
|
+
const parentHiddenInput = parentRef.hiddenInput;
|
|
4326
|
+
|
|
4327
|
+
// Automatically enable indeterminate (dash) on parent when it has children: dash shows only when children are mixed (--mixed)
|
|
4328
|
+
parentDom.classList.add('apx-tristate--unchecked-indeterminate', 'apx-tristate--indeterminate-dash');
|
|
4329
|
+
|
|
4330
|
+
const childCheckboxes = childrenApx.all().filter((el) => el.type === 'checkbox');
|
|
4331
|
+
const childRefs = [];
|
|
4332
|
+
|
|
4333
|
+
function syncParentFromChildren() {
|
|
4334
|
+
if (childRefs.length === 0) return;
|
|
4335
|
+
const states = childRefs.map((ref) => getTristateState(ref.dom));
|
|
4336
|
+
const allChecked = states.every((s) => s === 'checked');
|
|
4337
|
+
const allCrossed = states.every((s) => s === 'crossed');
|
|
4338
|
+
const allUnchecked = states.every((s) => s === 'unchecked');
|
|
4339
|
+
const mixed = !allChecked && !allCrossed && !allUnchecked;
|
|
4340
|
+
|
|
4341
|
+
parentDom.classList.remove('unchecked', 'checked', 'crossed');
|
|
4342
|
+
if (mixed) parentDom.classList.add('apx-tristate--mixed');
|
|
4343
|
+
else parentDom.classList.remove('apx-tristate--mixed');
|
|
4344
|
+
|
|
4345
|
+
if (allChecked) {
|
|
4346
|
+
parentDom.classList.add('checked');
|
|
4347
|
+
parentHiddenInput.value = 'true';
|
|
4348
|
+
} else if (allCrossed) {
|
|
4349
|
+
parentDom.classList.add('crossed');
|
|
4350
|
+
parentHiddenInput.value = 'false';
|
|
4351
|
+
} else {
|
|
4352
|
+
parentDom.classList.add('unchecked');
|
|
4353
|
+
parentHiddenInput.removeAttribute('name');
|
|
4354
|
+
parentHiddenInput.removeAttribute('value');
|
|
4355
|
+
}
|
|
4356
|
+
}
|
|
4357
|
+
|
|
4358
|
+
function applyParentToChildren() {
|
|
4359
|
+
const parentState = getTristateState(parentDom);
|
|
4360
|
+
childRefs.forEach((ref) => setTristateState(ref.checkbox, ref.dom, ref.hiddenInput, parentState));
|
|
4361
|
+
}
|
|
4362
|
+
|
|
4363
|
+
const childOptions = {
|
|
4364
|
+
...options,
|
|
4365
|
+
callbacks: {
|
|
4366
|
+
after(checkbox, dom, hiddenInput) {
|
|
4367
|
+
childRefs.push({ checkbox, dom, hiddenInput });
|
|
4368
|
+
},
|
|
4369
|
+
change: syncParentFromChildren
|
|
4370
|
+
}
|
|
4371
|
+
};
|
|
4372
|
+
|
|
4373
|
+
childrenApx.tristate(childOptions);
|
|
4374
|
+
|
|
4375
|
+
syncParentFromChildren();
|
|
4376
|
+
parentDom.addEventListener('click', () => setTimeout(applyParentToChildren, 0));
|
|
4377
|
+
}
|
|
4378
|
+
|
|
4379
|
+
function getTristateState(dom) {
|
|
4380
|
+
if (dom.classList.contains('checked')) return 'checked';
|
|
4381
|
+
if (dom.classList.contains('crossed')) return 'crossed';
|
|
4382
|
+
return 'unchecked';
|
|
4383
|
+
}
|
|
4384
|
+
|
|
4385
|
+
function setTristateState(checkbox, dom, hiddenInput, state) {
|
|
4386
|
+
dom.classList.remove('unchecked', 'checked', 'crossed');
|
|
4387
|
+
dom.classList.add(state);
|
|
4388
|
+
const name = checkbox.dataset.name || checkbox.getAttribute('data-name') || checkbox.name || '';
|
|
4389
|
+
if (state === 'checked') {
|
|
4390
|
+
hiddenInput.value = 'true';
|
|
4391
|
+
if (name) hiddenInput.setAttribute('name', name);
|
|
4392
|
+
checkbox.checked = true;
|
|
4393
|
+
} else if (state === 'crossed') {
|
|
4394
|
+
hiddenInput.value = 'false';
|
|
4395
|
+
if (name) hiddenInput.setAttribute('name', name);
|
|
4396
|
+
checkbox.checked = false;
|
|
4397
|
+
} else {
|
|
4398
|
+
hiddenInput.removeAttribute('name');
|
|
4399
|
+
hiddenInput.removeAttribute('value');
|
|
4400
|
+
checkbox.checked = false;
|
|
4401
|
+
}
|
|
4402
|
+
}
|
|
4403
|
+
|
|
4404
|
+
function toggleTriStateCheckboxState(customCheckbox, actualCheckbox, hiddenInput) {
|
|
4405
|
+
const wasChecked = customCheckbox.classList.contains('checked');
|
|
4406
|
+
const wasCrossed = customCheckbox.classList.contains('crossed');
|
|
4407
|
+
customCheckbox.classList.remove('unchecked', 'checked', 'crossed');
|
|
4408
|
+
if (wasChecked) {
|
|
4409
|
+
customCheckbox.classList.add('crossed');
|
|
4410
|
+
actualCheckbox.checked = false;
|
|
4411
|
+
hiddenInput.value = 'false';
|
|
4412
|
+
} else if (wasCrossed) {
|
|
4413
|
+
customCheckbox.classList.add('unchecked');
|
|
4414
|
+
hiddenInput.removeAttribute('name'); // Ensure the hidden input doesn't post any value
|
|
4415
|
+
hiddenInput.removeAttribute('value'); // Ensure the hidden input doesn't post any value
|
|
4416
|
+
} else {
|
|
4417
|
+
customCheckbox.classList.add('checked');
|
|
4418
|
+
actualCheckbox.checked = true;
|
|
4419
|
+
hiddenInput.value = 'true';
|
|
4420
|
+
hiddenInput.setAttribute('name', actualCheckbox.dataset.name); // Restore the name for posting
|
|
4421
|
+
}
|
|
4422
|
+
}
|
|
4423
|
+
|
|
4424
|
+
function createTriStateCheckbox(checkboxElement, options) {
|
|
4425
|
+
|
|
4426
|
+
//get the checkbox margins including browser default
|
|
4427
|
+
const checkboxStyle = window.getComputedStyle(checkboxElement);
|
|
4428
|
+
// Hide the original checkbox
|
|
4429
|
+
checkboxElement.style.display = 'none';
|
|
4430
|
+
|
|
4431
|
+
// Create the custom checkbox div and set its initial state
|
|
4432
|
+
const tristateDom = document.createElement('div');
|
|
4433
|
+
tristateDom.classList.add('apx-tristate');
|
|
4434
|
+
if (options.size) {
|
|
4435
|
+
if (options.size.width != null) {
|
|
4436
|
+
const w = options.size.width;
|
|
4437
|
+
if (typeof w !== 'number' && typeof w !== 'string') {
|
|
4438
|
+
throw new TypeError('tristate size.width must be a number (px) or a string (CSS length).');
|
|
4439
|
+
}
|
|
4440
|
+
tristateDom.style.width = typeof w === 'number' ? w + 'px' : String(w);
|
|
4441
|
+
}
|
|
4442
|
+
if (options.size.height != null) {
|
|
4443
|
+
const h = options.size.height;
|
|
4444
|
+
if (typeof h !== 'number' && typeof h !== 'string') {
|
|
4445
|
+
throw new TypeError('tristate size.height must be a number (px) or a string (CSS length).');
|
|
4446
|
+
}
|
|
4447
|
+
tristateDom.style.height = typeof h === 'number' ? h + 'px' : String(h);
|
|
4448
|
+
}
|
|
4449
|
+
}
|
|
4450
|
+
if(options.classes) tristateDom.classList.add(...computeClasses(options.classes));
|
|
4451
|
+
const colors = resolveColors(options);
|
|
4452
|
+
if (colors.tick != null) tristateDom.style.setProperty('--apx-tristate-tick-color', String(colors.tick));
|
|
4453
|
+
if (colors.checked != null) tristateDom.style.setProperty('--apx-tristate-checked-color', String(colors.checked));
|
|
4454
|
+
if (colors.crossed != null) tristateDom.style.setProperty('--apx-tristate-crossed-color', String(colors.crossed));
|
|
4455
|
+
|
|
4456
|
+
tristateDom.style.margin = checkboxStyle.margin;
|
|
4457
|
+
|
|
4458
|
+
if (checkboxElement.checked) {
|
|
4459
|
+
tristateDom.classList.add('checked');
|
|
4460
|
+
} else {
|
|
4461
|
+
tristateDom.classList.add('unchecked');
|
|
4462
|
+
}
|
|
4463
|
+
|
|
4464
|
+
// Create the hidden input field
|
|
4465
|
+
const hiddenInput = document.createElement('input');
|
|
4466
|
+
hiddenInput.type = 'hidden';
|
|
4467
|
+
hiddenInput.name = checkboxElement.name; // Copy the name from the original checkbox
|
|
4468
|
+
checkboxElement.dataset.name = checkboxElement.name; // Store the name in a data attribute for later use
|
|
4469
|
+
checkboxElement.removeAttribute('name'); // Remove the name from the original checkbox to avoid double posting
|
|
4470
|
+
|
|
4471
|
+
if (options.defaultState) setDefaultState(options, tristateDom, hiddenInput);
|
|
4472
|
+
else{
|
|
4473
|
+
// Set the initial value for the hidden input based on the checkbox's state
|
|
4474
|
+
if (checkboxElement.checked) {
|
|
4475
|
+
hiddenInput.value = 'true';
|
|
4476
|
+
} else {
|
|
4477
|
+
hiddenInput.name = ''; // Ensure the hidden input doesn't post any value
|
|
4478
|
+
hiddenInput.value = '';
|
|
4479
|
+
}
|
|
4480
|
+
}
|
|
4481
|
+
|
|
4482
|
+
//handle accessibility, set the tabindex to the same as the checkbox
|
|
4483
|
+
tristateDom.tabIndex = checkboxElement.tabIndex;
|
|
4484
|
+
|
|
4485
|
+
// Insert the hidden input inside the custom checkbox div
|
|
4486
|
+
tristateDom.appendChild(hiddenInput);
|
|
4487
|
+
|
|
4488
|
+
// Insert it next to the actual checkbox
|
|
4489
|
+
checkboxElement.parentNode.insertBefore(tristateDom, checkboxElement.nextSibling);
|
|
4490
|
+
|
|
4491
|
+
// Add event listener
|
|
4492
|
+
tristateDom.addEventListener('click', function (e) {
|
|
4493
|
+
toggleTriStateCheckboxState(tristateDom, checkboxElement, hiddenInput);
|
|
4494
|
+
bubbleEventsToOriginalCheckbox(options, checkboxElement, tristateDom, hiddenInput, e);
|
|
4495
|
+
});
|
|
4496
|
+
tristateDom.addEventListener('keyup', onkeyup.bind(null, checkboxElement));
|
|
4497
|
+
|
|
4498
|
+
return [checkboxElement, tristateDom, hiddenInput];
|
|
4499
|
+
}
|
|
4500
|
+
|
|
4501
|
+
function setDefaultState(options, tristateDom, hiddenInput) {
|
|
4502
|
+
// Ensure only one state class is set (uncheckedAppearance modifiers must not affect checked/crossed)
|
|
4503
|
+
tristateDom.classList.remove('unchecked', 'checked', 'crossed');
|
|
4504
|
+
if (options.defaultState === 'checked') {
|
|
4505
|
+
tristateDom.classList.add('checked');
|
|
4506
|
+
hiddenInput.value = 'true';
|
|
4507
|
+
}
|
|
4508
|
+
else if (options.defaultState === 'unchecked') {
|
|
4509
|
+
tristateDom.classList.add('unchecked');
|
|
4510
|
+
hiddenInput.removeAttribute('name'); // Ensure the hidden input doesn't post any value
|
|
4511
|
+
hiddenInput.removeAttribute('value'); // Ensure the hidden input doesn't post any value
|
|
4512
|
+
}
|
|
4513
|
+
else if (options.defaultState === 'crossed') {
|
|
4514
|
+
tristateDom.classList.add('crossed');
|
|
4515
|
+
hiddenInput.value = 'false';
|
|
4516
|
+
}
|
|
4517
|
+
}
|
|
4518
|
+
|
|
4519
|
+
function computeClasses(classes) {
|
|
4520
|
+
let computedClasses = [];
|
|
4521
|
+
if(typeof classes === 'string') {
|
|
4522
|
+
//replace multiple white spaces with a single space
|
|
4523
|
+
classes = classes.replace(/\s\s+/g, ' ');
|
|
4524
|
+
if(classes.indexOf(' ') > -1)
|
|
4525
|
+
computedClasses = classes.split(' ');
|
|
4526
|
+
else if(classes.indexOf(',') > -1)
|
|
4527
|
+
computedClasses = classes.split(',');
|
|
4528
|
+
else
|
|
4529
|
+
computedClasses = [classes];
|
|
4530
|
+
}
|
|
4531
|
+
else if(Array.isArray(classes)) {
|
|
4532
|
+
computedClasses = classes;
|
|
4533
|
+
}
|
|
4534
|
+
return computedClasses;
|
|
4535
|
+
}
|
|
4536
|
+
|
|
4537
|
+
function resolveColors(options) {
|
|
4538
|
+
const c = options.colors || {};
|
|
4539
|
+
return {
|
|
4540
|
+
tick: c.tick != null ? c.tick : options.tickColor,
|
|
4541
|
+
checked: c.checked != null ? c.checked : options.checkedColor,
|
|
4542
|
+
crossed: c.crossed != null ? c.crossed : options.crossedColor
|
|
4543
|
+
};
|
|
4544
|
+
}
|
|
4545
|
+
|
|
4546
|
+
function bubbleEventsToOriginalCheckbox(options, checkboxElement, tristateDom, hiddenInput, event) {
|
|
4547
|
+
//if options.callbacks.change is set, call it
|
|
4548
|
+
if(options.callbacks && options.callbacks.change && typeof options.callbacks.change === 'function') {
|
|
4549
|
+
options.callbacks.change(checkboxElement, tristateDom, hiddenInput);
|
|
4550
|
+
}
|
|
4551
|
+
|
|
4552
|
+
if(!options.bubbleEvents) return;
|
|
4553
|
+
|
|
4554
|
+
if(event.type === 'click') {
|
|
4555
|
+
checkboxElement.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
|
|
4556
|
+
}
|
|
4557
|
+
else if(event.type === 'keyup') {
|
|
4558
|
+
checkboxElement.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true, cancelable: true }));
|
|
4559
|
+
}
|
|
4560
|
+
else if(event.type === 'change') {
|
|
4561
|
+
checkboxElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
4562
|
+
}
|
|
4563
|
+
}
|
|
4564
|
+
|
|
4565
|
+
function onkeyup(checkboxElement, event) {
|
|
4566
|
+
if (event.keyCode === 32) {
|
|
4567
|
+
bubbleEventsToOriginalCheckbox(checkboxElement, event);
|
|
4568
|
+
event.preventDefault();
|
|
4569
|
+
event.target.click();
|
|
4570
|
+
}
|
|
3634
4571
|
}
|
|
3635
4572
|
|
|
3636
4573
|
/***/ })
|
|
@@ -3749,10 +4686,12 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3749
4686
|
/* harmony export */ });
|
|
3750
4687
|
/* harmony import */ var _modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/listen/listen.mjs */ "./modules/listen/listen.mjs");
|
|
3751
4688
|
/* harmony import */ var _modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/tristate/tristate.mjs */ "./modules/tristate/tristate.mjs");
|
|
3752
|
-
/* harmony import */ var
|
|
3753
|
-
/* harmony import */ var
|
|
3754
|
-
/* harmony import */ var
|
|
3755
|
-
/* harmony import */ var
|
|
4689
|
+
/* harmony import */ var _modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/scrollableTable/scrollableTable.mjs */ "./modules/scrollableTable/scrollableTable.mjs");
|
|
4690
|
+
/* harmony import */ var _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/dialog/dialog.mjs */ "./modules/dialog/dialog.mjs");
|
|
4691
|
+
/* harmony import */ var _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/toast/toast.mjs */ "./modules/toast/toast.mjs");
|
|
4692
|
+
/* harmony import */ var _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/common.mjs */ "./modules/common.mjs");
|
|
4693
|
+
/* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
|
|
4694
|
+
|
|
3756
4695
|
|
|
3757
4696
|
|
|
3758
4697
|
|
|
@@ -3859,14 +4798,15 @@ const APX = function (input, context = document) {
|
|
|
3859
4798
|
};
|
|
3860
4799
|
(0,_modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(apx);
|
|
3861
4800
|
(0,_modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(apx);
|
|
3862
|
-
(0,
|
|
4801
|
+
(0,_modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(apx);
|
|
4802
|
+
(0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.augmentWithPack)(apx);
|
|
3863
4803
|
return apx;
|
|
3864
4804
|
};
|
|
3865
4805
|
|
|
3866
|
-
APX.loadCss =
|
|
3867
|
-
APX.dialog =
|
|
3868
|
-
APX.toast =
|
|
3869
|
-
APX.tools =
|
|
4806
|
+
APX.loadCss = _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
|
|
4807
|
+
APX.dialog = _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__["default"];
|
|
4808
|
+
APX.toast = _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__["default"];
|
|
4809
|
+
APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.tools;
|
|
3870
4810
|
APX.isAPXObject = function (obj) {
|
|
3871
4811
|
return obj && obj._isAPXObject === true;
|
|
3872
4812
|
}
|
|
@@ -3880,4 +4820,4 @@ APX.is_numeric = (n) => {
|
|
|
3880
4820
|
var __webpack_exports__default = __webpack_exports__["default"];
|
|
3881
4821
|
export { __webpack_exports__default as default };
|
|
3882
4822
|
|
|
3883
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksc0VBQWlCO0FBQ3JCLElBQUksMEVBQW1CO0FBQ3ZCLElBQUksMkVBQWU7QUFDbkI7QUFDQTs7QUFFQSxjQUFjLHdEQUFPO0FBQ3JCLGFBQWEsa0VBQU07QUFDbkIsWUFBWSxnRUFBSztBQUNqQixZQUFZLDZEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxHQUFHLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90cmlzdGF0ZS9jc3MvdHJpc3RhdGUuY3NzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2h0bWwvZGlhbG9nLmh0bWwiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9jc3MvZGlhbG9nLmNzcz9hNTY3Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzPzhhNDgiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3M/YTA5NCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9jb21tb24ubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL0FQWC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIERpYWxvZyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAxMDAyO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XHJcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICAgIHBhZGRpbmc6IDQwcHg7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogYXV0bztcclxuICAgIG1pbi13aWR0aDogMzAwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDgwJTtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuXHJcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XHJcbiAgICBtYXJnaW4tdG9wOjA7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nIHtcclxuICAgIGNvbG9yOiAjYWFhO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgZm9udC1zaXplOiAyNHB4O1xyXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XHJcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cclxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxyXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XHJcbiAgICBjb2xvcjogIzMzMztcclxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdOmZvY3VzIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcclxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcclxuICAgIGNvbG9yOiAjRUNGMEYxO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XHJcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZ2FwOiAxMHB4O1xyXG4gICAgbWFyZ2luLXRvcDoxZW07XHJcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG59XHJcblxyXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xyXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcclxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cclxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcbn1cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xyXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFlBQVk7SUFDWixjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLDBDQUEwQztBQUM5Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsMkNBQTJDO0lBQzNDLGdEQUFnRDtBQUNwRDs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtBQUN2Qjs7QUFFQTs7SUFFSSxXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGVBQWU7QUFDbkI7O0FBRUEseUJBQXlCO0FBQ3pCOzs7O0lBSUksV0FBVztJQUNYLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixnREFBZ0Q7SUFDaEQsZUFBZTtJQUNmLHNCQUFzQjtJQUN0Qiw2QkFBNkI7QUFDakM7O0FBRUE7Ozs7SUFJSSxxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGFBQWE7QUFDakI7O0FBRUEseUJBQXlCO0FBQ3pCO0lBQ0ksa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsd0NBQXdDO0FBQzVDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5Q0FBeUM7QUFDN0M7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCw0QkFBNEI7QUFDaEM7O0FBRUEsc0JBQXNCO0FBQ3RCO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxXQUFXO0lBQ1gsWUFBWTtJQUNaLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLDZDQUE2QztBQUNqRDs7QUFFQTtJQUNJLEtBQUssdUJBQXVCLEVBQUU7SUFDOUIsT0FBTyx5QkFBeUIsRUFBRTtBQUN0QztBQUNBO0lBQ0ksWUFBWTtJQUNaLDhCQUE4QjtJQUM5QixvQ0FBb0MsRUFBRSxxQkFBcUI7SUFDM0QsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQ0FBb0MsRUFBRSx1QkFBdUI7SUFDN0QsMEJBQTBCO0FBQzlCOztBQUVBLHNDQUFzQztBQUN0QztJQUNJLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLG9DQUFvQztJQUNwQyx3QkFBd0I7QUFDNUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogRGlhbG9nIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZyB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgei1pbmRleDogMTAwMjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMDAlO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcclxcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xcclxcbiAgICBwYWRkaW5nOiA0MHB4O1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbiAgICBtYXgtd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuaDIuQVBYLWRpYWxvZy10aXRsZXtcXHJcXG4gICAgbWFyZ2luLXRvcDowO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZyB7XFxyXFxuICAgIGNvbG9yOiAjYWFhO1xcclxcbiAgICBmbG9hdDogcmlnaHQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjRweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XFxyXFxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXTpmb2N1cyB7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXFxyXFxuICAgIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIGNvbG9yOiAjRUNGMEYxO1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZ2FwOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOjFlbTtcXHJcXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgICBoZWlnaHQ6IDEwMHB4O1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICB3aWR0aDogNDBweDtcXHJcXG4gICAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xcclxcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcXHJcXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxcclxcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxcclxcbn1cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiAwLjU7XFxyXFxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXFxyXFxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiA1MCU7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLkFQWC10b2FzdC1jb250YWluZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBnYXA6IHZhcigtLWFweC10b2FzdC1nYXAsIDhweCk7XHJcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xyXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tcmlnaHQgeyByaWdodDogMTJweDsgYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1sZWZ0IHsgbGVmdDogMTJweDsgYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtbGVmdCB7IGxlZnQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cclxuXHJcbi5BUFgtdG9hc3Qge1xyXG4gICAgbWluLXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWluLXdpZHRoLCAyNjBweCk7XHJcbiAgICBtYXgtd2lkdGg6IHZhcigtLWFweC10b2FzdC1tYXgtd2lkdGgsIDQyMHB4KTtcclxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpO1xyXG4gICAgYm94LXNoYWRvdzogdmFyKC0tYXB4LXRvYXN0LXNoYWRvdywgMCA2cHggMjRweCByZ2JhKDAsMCwwLDAuMikpO1xyXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xyXG4gICAgY29sb3I6ICMxMTE7XHJcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xyXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGVhc2UsIHRyYW5zZm9ybSAxODBtcyBlYXNlO1xyXG59XHJcblxyXG4uQVBYLXRvYXN0LS1pbmZvIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWluZm8tYmcsICMwZGNhZjApOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWluZm8tZmcsICMwNTJjNjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cclxuLkFQWC10b2FzdC0td2FybmluZyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWZnLCAjNjY0ZDAzKTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1kYW5nZXItZmcsICNmZmZmZmYpOyB9XHJcblxyXG4uQVBYLXRvYXN0X19jb250ZW50IHsgbGluZS1oZWlnaHQ6IDEuMzU7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlOyByaWdodDogMTBweDtcclxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcclxuICAgIGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7IGFwcGVhcmFuY2U6IG5vbmU7IC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcclxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xyXG59XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxyXG4uQVBYLXRvYXN0X19jbG9zZTo6YmVmb3JlIHtcclxuICAgIGNvbnRlbnQ6ICfDlyc7XHJcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3Mge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgaGVpZ2h0OiB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcclxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3Age1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcclxufVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy0tYm90dG9tIHtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbn1cclxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXRyYWNrIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBtaW4td2lkdGg6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgIHRyYW5zaXRpb246IHdpZHRoIDgwbXMgbGluZWFyO1xyXG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTtcclxufVxyXG4uQVBYLXRvYXN0LS1pbmZvIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoNSwgNDQsIDEwMSwgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7IH1cclxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cclxuLkFQWC10b2FzdC0tZGFuZ2VyIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7IH1cclxuLyogUGF1c2UvUmVzdW1lIGJ1dHRvbjogcm91bmQsIGNlbnRlciBleGFjdGx5IG9uIHRvYXN0IGNvcm5lciAodG9wLWxlZnQgb3IgYm90dG9tLWxlZnQpICovXHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtcGF1c2Utc2l6ZSwgMThweCk7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjM1KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBsaW5lLWhlaWdodDogMTtcclxuICAgIG9wYWNpdHk6IDAuOTU7XHJcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxufVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy0tdG9wIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcclxuICAgIHRvcDogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgNTAlKTtcclxufVxyXG4uQVBYLXRvYXN0LS1pbmZvIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWluZm8tYmcsICMwZGNhZjApOyBib3JkZXItY29sb3I6IHJnYmEoNSwgNDQsIDEwMSwgMC41NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7IH1cclxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cclxuLkFQWC10b2FzdC0tZGFuZ2VyIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHN2ZyB7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGhlaWdodDogMTBweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cclxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCB7IHBhZGRpbmctdG9wOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tIHsgcGFkZGluZy1ib3R0b206IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlIHsgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtcGF1c2Utc2l6ZSwgMThweCkgLyAyKTsgfVxyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlIHsgbWFyZ2luLWJvdHRvbTogY2FsYyh2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtcGF1c2Utc2l6ZSwgMThweCkgLyAyKTsgfVxyXG5cclxuLyogQW5pbWF0aW9ucyAqL1xyXG4uQVBYLXRvYXN0LS1lbnRlciB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XHJcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XHJcbi5BUFgtdG9hc3QtLWV4aXQgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdC5BUFgtdG9hc3QtLWV4aXQtYWN0aXZlIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuXHJcblxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLDhCQUE4QjtJQUM5Qix3Q0FBd0M7SUFDeEMsb0JBQW9CO0FBQ3hCOztBQUVBLHFDQUFxQyxXQUFXLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFO0FBQ3ZGLG9DQUFvQyxVQUFVLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFO0FBQ3ZGLGtDQUFrQyxXQUFXLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFO0FBQ2pGLGlDQUFpQyxVQUFVLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFOztBQUVq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LG9CQUFvQixVQUFVLEVBQUUsMEJBQTBCLEVBQUU7QUFDNUQsNENBQTRDLFVBQVUsRUFBRSx3QkFBd0IsRUFBRTtBQUNsRixtQkFBbUIsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ3pELDBDQUEwQyxVQUFVLEVBQUUsMEJBQTBCLEVBQUVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLkFQWC10b2FzdC1jb250YWluZXIge1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcXHJcXG4gICAgei1pbmRleDogdmFyKC0tYXB4LXRvYXN0LXotaW5kZXgsIDExMDAwKTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tcmlnaHQgeyByaWdodDogMTJweDsgYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1yaWdodCB7IHJpZ2h0OiAxMnB4OyB0b3A6IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtbGVmdCB7IGxlZnQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG5cXHJcXG4uQVBYLXRvYXN0IHtcXHJcXG4gICAgbWluLXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWluLXdpZHRoLCAyNjBweCk7XFxyXFxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xcclxcbiAgICBmb250LXNpemU6IHZhcigtLWFweC10b2FzdC1mb250LXNpemUsIDE0cHgpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpO1xcclxcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XFxyXFxuICAgIHBhZGRpbmc6IHZhcigtLWFweC10b2FzdC1wYWRkaW5nLCAxMHB4IDQycHggMTBweCAxNHB4KTtcXHJcXG4gICAgY29sb3I6ICMxMTE7XFxyXFxuICAgIGJhY2tncm91bmQ6ICNlZWU7XFxyXFxuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XFxyXFxufVxcclxcblxcclxcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1zdWNjZXNzIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtZmcsICNmZmZmZmYpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWZnLCAjNjY0ZDAzKTsgfVxcclxcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cXHJcXG5cXHJcXG4uQVBYLXRvYXN0X19jb250ZW50IHsgbGluZS1oZWlnaHQ6IDEuMzU7IH1cXHJcXG5cXHJcXG4uQVBYLXRvYXN0X19jbG9zZSB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xcclxcbiAgICB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4O1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiBjdXJyZW50Q29sb3I7XFxyXFxuICAgIGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcclxcbiAgICBvcGFjaXR5OiAuNzU7IHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fY2xvc2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuMik7IG91dGxpbmUtb2Zmc2V0OiAycHg7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTo6YmVmb3JlIHtcXHJcXG4gICAgY29udGVudDogJ8OXJztcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTsgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBQcm9ncmVzcyBiYXIgKG91dHNpZGUgY29udGVudCwgZmx1c2ggdG8gdG9hc3QgZWRnZXMpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3Mge1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHJpZ2h0OiAwO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcXHJcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3Age1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSAwIDA7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxufVxcclxcbi8qIFRyYWNrIGNvbnRhaW5zIHRoZSBiYXI7IG5vIG1hcmdpbiAocGF1c2UgYnV0dG9uIGlzIG9uIHRoZSBjb3JuZXIsIG92ZXJsYXBwaW5nKSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXRyYWNrIHtcXHJcXG4gICAgZmxleDogMTtcXHJcXG4gICAgbWluLXdpZHRoOiAwO1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIge1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxyXFxuICAgIHRyYW5zaXRpb246IHdpZHRoIDgwbXMgbGluZWFyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0LS1pbmZvIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoNSwgNDQsIDEwMSwgMC41KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXdhcm5pbmcgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgxMDIsIDc3LCAzLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7IH1cXHJcXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgaGVpZ2h0OiB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtcGF1c2Utc2l6ZSwgMThweCk7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjM1KTtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgICBwYWRkaW5nOiAwO1xcclxcbiAgICBtYXJnaW46IDA7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICAgIG9wYWNpdHk6IDAuOTU7XFxyXFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcXHJcXG4gICAgZmxleC1zaHJpbms6IDA7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcy0tYm90dG9tIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgYm90dG9tOiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0LS1pbmZvIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWluZm8tYmcsICMwZGNhZjApOyBib3JkZXItY29sb3I6IHJnYmEoNSwgNDQsIDEwMSwgMC41NSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxcclxcbi5BUFgtdG9hc3QtLXdhcm5pbmcgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtd2FybmluZy1iZywgI2ZmYzEwNyk7IGJvcmRlci1jb2xvcjogcmdiYSgxMDIsIDc3LCAzLCAwLjYpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTsgfVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjQpOyBvdXRsaW5lLW9mZnNldDogLTJweDsgfVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHN2ZyB7XFxyXFxuICAgIHdpZHRoOiAxMHB4O1xcclxcbiAgICBoZWlnaHQ6IDEwcHg7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4vKiBFeHRyYSB0b3AvYm90dG9tIHBhZGRpbmcgd2hlbiBwcm9ncmVzcyBiYXIgaXMgcHJlc2VudCAoZGVmYXVsdCBjb250ZW50IHBhZGRpbmcgMTBweCArIGJhciBoZWlnaHQpICovXFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCB7IHBhZGRpbmctdG9wOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cXHJcXG4vKiBSZXNlcnZlIHNwYWNlIGZvciBzdGFja2luZyB3aGVuIHBhdXNlIGJ1dHRvbiBpcyBwcmVzZW50IChidXR0b24gZXh0ZW5kcyBvdXRzaWRlIHRvYXN0IGNvcm5lcikgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlIHsgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtcGF1c2Utc2l6ZSwgMThweCkgLyAyKTsgfVxcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuXFxyXFxuLyogQW5pbWF0aW9ucyAqL1xcclxcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cXHJcXG4uQVBYLXRvYXN0LS1lbnRlci5BUFgtdG9hc3QtLWVudGVyLWFjdGl2ZSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cXHJcXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcblxcclxcblxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTI3aHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUyMHdpZHRoJTNEJTI3MzIlMjclMjBoZWlnaHQlM0QlMjczMiUyNyUzRSUzQ3BhdGglMjAlMjBmaWxsJTNEJTIyJTIzY2NjY2NjJTIyJTIwZCUzRCUyMk0yNS4xMDclMjAzMi4wMzBoLTE4LjIxNGMtMy40NTYlMjAwLTYuMjY4LTIuODEtNi4yNjgtNi4yNjR2LTE5LjUyOWMwLTMuNDU2JTIwMi44MTItNi4yNjglMjA2LjI2OC02LjI2OGgxOC4yMTRjMy40NTYlMjAwJTIwNi4yNjglMjAyLjgxMiUyMDYuMjY4JTIwNi4yNjh2MTkuNTI5YzAlMjAzLjQ1Mi0yLjgxMiUyMDYuMjY0LTYuMjY4JTIwNi4yNjR6TTYuODkzJTIwMS44NWMtMi40MTklMjAwLTQuMzg2JTIwMS45NjctNC4zODYlMjA0LjM4NnYxOS41MjljMCUyMDIuNDE3JTIwMS45NjclMjA0LjM4MiUyMDQuMzg2JTIwNC4zODJoMTguMjE0YzIuNDE5JTIwMCUyMDQuMzg2LTEuOTY1JTIwNC4zODYtNC4zODJ2LTE5LjUyOWMwLTIuNDE5LTEuOTY3LTQuMzg2LTQuMzg2LTQuMzg2aC0xOC4yMTR6JTIyJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTI3aHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUyMHdpZHRoJTNEJTI3MzIlMjclMjBoZWlnaHQlM0QlMjczMiUyNyUzRSUzQ3BhdGglMjBmaWxsJTNEJTIyJTIzMDY1NGJhJTIyJTIwZCUzRCUyMk0wLjU0MyUyMDUuNjQ3YzAtMy4xMTklMjAyLjUzMS01LjY0NyUyMDUuNjUtNS42NDdoMTkuMzA5YzMuMTIlMjAwJTIwNS42NSUyMDIuNTExJTIwNS42NSUyMDUuNjQ3djIwLjcwNWMwJTIwMy4xMTktMi41MzElMjA1LjY0Ny01LjY1JTIwNS42NDdoLTE5LjMwOWMtMy4xMiUyMDAtNS42NS0yLjUxMS01LjY1LTUuNjQ3di0yMC43MDV6TTUuMzEzJTIwMTcuNTg3bDcuMDM5JTIwNi44MzklMjAxMy44MzEtMTMuNDM5LTIuNjM2LTIuNTYxLTEwLjkyOSUyMDEwLjYyLTQuNDQyLTQuMzE3LTIuODYyJTIwMi44NTh6JTIyJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCUyMHZlcnNpb24lM0QlMjIxLjAlMjIlMjBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMzIlMjAzMiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTNDcGF0aCUyMGQlM0QlMjJtMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1eiUyMiUyMGZpbGwlM0QlMjIlMjNmMDAlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMm04JTIwOCUyMDE2JTIwMTYlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJNMjQlMjA4TDglMjAyNCUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0MlMkZzdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWluLXdpZHRoOjEzcHg7XHJcbiAgICBtaW4taGVpZ2h0OjEzcHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xyXG59XHJcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkIHtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX199KTtcclxufVxyXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxufVxyXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90cmlzdGF0ZS9jc3MvdHJpc3RhdGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kscUJBQXFCO0lBQ3JCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsZUFBZTtJQUNmLHdCQUF3QjtJQUN4Qix1QkFBdUI7SUFDdkIsaUJBQWlCO0FBQ3JCO0FBQ0E7SUFDSSx5REFBeWxCO0FBQzdsQjtBQUNBO0lBQ0kseURBQTZlO0lBQzdlLDRCQUE0QjtJQUM1QiwyQkFBMkI7QUFDL0I7QUFDQTtJQUNJLHlEQUFzbkI7SUFDdG5CLDRCQUE0QjtJQUM1QiwyQkFBMkI7QUFDL0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmFweC10cmlzdGF0ZSB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgbWluLXdpZHRoOjEzcHg7XFxyXFxuICAgIG1pbi1oZWlnaHQ6MTNweDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czozcHg7XFxyXFxufVxcclxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMCUyMGZpbGwlM0QlMjIlMjNjY2NjY2MlMjIlMjBkJTNEJTIyTTI1LjEwNyUyMDMyLjAzMGgtMTguMjE0Yy0zLjQ1NiUyMDAtNi4yNjgtMi44MS02LjI2OC02LjI2NHYtMTkuNTI5YzAtMy40NTYlMjAyLjgxMi02LjI2OCUyMDYuMjY4LTYuMjY4aDE4LjIxNGMzLjQ1NiUyMDAlMjA2LjI2OCUyMDIuODEyJTIwNi4yNjglMjA2LjI2OHYxOS41MjljMCUyMDMuNDUyLTIuODEyJTIwNi4yNjQtNi4yNjglMjA2LjI2NHpNNi44OTMlMjAxLjg1Yy0yLjQxOSUyMDAtNC4zODYlMjAxLjk2Ny00LjM4NiUyMDQuMzg2djE5LjUyOWMwJTIwMi40MTclMjAxLjk2NyUyMDQuMzgyJTIwNC4zODYlMjA0LjM4MmgxOC4yMTRjMi40MTklMjAwJTIwNC4zODYtMS45NjUlMjA0LjM4Ni00LjM4MnYtMTkuNTI5YzAtMi40MTktMS45NjctNC4zODYtNC4zODYtNC4zODZoLTE4LjIxNHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UnKTtcXHJcXG59XFxyXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMGZpbGwlM0QlMjIlMjMwNjU0YmElMjIlMjBkJTNEJTIyTTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXpNNS4zMTMlMjAxNy41ODdsNy4wMzklMjA2LjgzOSUyMDEzLjgzMS0xMy40MzktMi42MzYtMi41NjEtMTAuOTI5JTIwMTAuNjItNC40NDItNC4zMTctMi44NjIlMjAyLjg1OHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UnKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcclxcbn1cXHJcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUzRiUzRSUzQ3N2ZyUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDMyJTIwMzIlMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUzRSUzQ3BhdGglMjBkJTNEJTIybTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXolMjIlMjBmaWxsJTNEJTIyJTIzZjAwJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJtOCUyMDglMjAxNiUyMDE2JTIyJTIwc3Ryb2tlJTNEJTIyJTIzZmZmJTIyJTIwc3Ryb2tlLXdpZHRoJTNEJTIyMiUyMiUyRiUzRSUzQ3BhdGglMjBkJTNEJTIyTTI0JTIwOEw4JTIwMjQlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDJTJGc3ZnJTNFJyk7XFxyXFxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RvYXN0LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RyaXN0YXRlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCIvLyBGdW5jdGlvbiB0byBsb2FkIHRoZSBDU1MgZnJvbSBhIGdpdmVuIFVSTFxyXG5mdW5jdGlvbiBsb2FkQ3NzKHVybCkge1xyXG4gICAgcmV0dXJuIGZldGNoKHVybClcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXHJcbiAgICAgICAgLnRoZW4oY3NzID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGVTaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcclxuICAgICAgICAgICAgc3R5bGVTaGVldC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnRleHRDb250ZW50ID0gY3NzOyAgLy8gVXNlIHRleHRDb250ZW50IGluc3RlYWQgb2YgaW5uZXJUZXh0XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVTaGVldCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGxvYWQgQ1NTOlwiLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgICBsb2FkQ3NzXHJcbn0iLCIvLyBJbXBvcnRpbmcgdGhlIENTUyBhbmQgSFRNTCB0ZW1wbGF0ZXNcclxuaW1wb3J0ICcuL2Nzcy9kaWFsb2cuY3NzJztcclxuaW1wb3J0IGRpYWxvZ1RlbXBsYXRlIGZyb20gJy4vaHRtbC9kaWFsb2cuaHRtbD9yYXcnO1xyXG5cclxuY29uc3QgY3JlYXRlRGlhbG9nID0gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGRpYWxvZ0RlZmF1bHRzID0ge1xyXG4gICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICBjb250ZW50OiAnJyxcclxuICAgICAgICBjb250ZW50VVJJOiAnJyxcclxuICAgICAgICBidXR0b25zOiBbXSxcclxuICAgICAgICBzaXplOiAnbWVkaXVtJyxcclxuICAgICAgICBzaG93TG9hZGluZ0luZGljYXRvcjogZmFsc2UsXHJcbiAgICAgICAgY29udGVudE1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgY29udGVudERhdGE6IG51bGwsXHJcbiAgICAgICAgY29udGVudEhlYWRlcnM6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB7IHRpdGxlLCBjb250ZW50LCBjb250ZW50VVJJLCBidXR0b25zLCBzaXplLCBzaG93TG9hZGluZ0luZGljYXRvciwgY29udGVudE1ldGhvZCwgY29udGVudERhdGEsIGNvbnRlbnRIZWFkZXJzIH0gPSB7IC4uLmRpYWxvZ0RlZmF1bHRzLCAuLi5vcHRpb25zIH07XHJcblxyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgd3JhcHBlci5pbm5lckhUTUwgPSBkaWFsb2dUZW1wbGF0ZS50cmltKCk7XHJcbiAgICBjb25zdCBkaWFsb2dFbGVtZW50ID0gd3JhcHBlci5maXJzdENoaWxkO1xyXG5cclxuICAgIC8vIExpZmVjeWNsZSBldmVudCBtYW5hZ2VtZW50XHJcbiAgICBjb25zdCBsaWZlY3ljbGVSZXNvbHZlcnMgPSB7fTtcclxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50cyA9IHt9O1xyXG5cclxuICAgIC8vIERlZmluZSBsaWZlY3ljbGUgcHJvbWlzZXMgYXMgcHJvcGVydGllc1xyXG4gICAgWydvcGVuaW5nJywgJ29wZW5lZCcsICdjbG9zaW5nJywgJ2Nsb3NlZCcsICdjb250ZW50TG9hZGluZycsICdjb250ZW50TG9hZGVkJ10uZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICBsaWZlY3ljbGVFdmVudHNbZXZlbnRdID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgbGlmZWN5Y2xlUmVzb2x2ZXJzW2V2ZW50XSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0cmlnZ2VyRXZlbnQgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICBpZiAobGlmZWN5Y2xlUmVzb2x2ZXJzW2V2ZW50XSkge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBObyByZXNvbHZlciBmb3VuZCBmb3IgbGlmZWN5Y2xlIGV2ZW50OiAke2V2ZW50fWApO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGlhbG9nID0ge1xyXG4gICAgICAgIGVsZW1lbnQ6IGRpYWxvZ0VsZW1lbnQsXHJcbiAgICAgICAgYnV0dG9uczoge30sXHJcbiAgICAgICAgaXNDbG9zZWQ6IGZhbHNlLFxyXG4gICAgICAgIGxpZmVjeWNsZTogbGlmZWN5Y2xlRXZlbnRzLCAvLyBMaWZlY3ljbGUgcHJvbWlzZXMgZGlyZWN0bHkgZXhwb3NlZCBoZXJlXHJcbiAgICAgICAgZGlzYWJsZUJ1dHRvbjogKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5BUFgtZGlhbG9nLWJ1dHRvbltkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVuYWJsZUJ1dHRvbjogKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5BUFgtZGlhbG9nLWJ1dHRvbltkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcGVuOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ29wZW5pbmcnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUub3BlbmluZztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBsb2FkaW5nIGluZGljYXRvciBpcyBlbmFibGVkIGFuZCB3ZSdyZSBmZXRjaGluZyBjb250ZW50LCBzaG93IGRpYWxvZyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dMb2FkaW5nSW5kaWNhdG9yICYmIGNvbnRlbnRVUkkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXQgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cgbG9hZGluZyBpbmRpY2F0b3JcclxuICAgICAgICAgICAgICAgICAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1keW5hbWljLWNvbnRlbnRcIikuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJBUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yXCI+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGNvbnRlbnQgYWZ0ZXIgZGlhbG9nIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBiZWhhdmlvcjogbG9hZCBjb250ZW50IGZpcnN0LCB0aGVuIHNob3cgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmV0Y2hBbmRJbnNlcnRDb250ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGRpYWxvZyB0byB0aGUgRE9NIGFuZCBkaXNwbGF5IGl0XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaWFsb2dFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBkaWFsb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ29wZW5lZCcpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuZWQ7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvcGVuaW5nIGRpYWxvZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsgLy8gUmV0dXJuIGZvciBkYWlzeS1jaGFpbmluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY2xvc2luZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jbG9zaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW5kIHJlbW92ZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nQW5kQ2xlYW51cCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY2xvc2VkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3NlZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBkaWFsb2cgY2xvc2luZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsgLy8gUmV0dXJuIGZvciBkYWlzeS1jaGFpbmluZ1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY2xvc2VEaWFsb2dBbmRDbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaWFsb2cuaXNDbG9zZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgZGlhbG9nLmlzQ2xvc2VkID0gdHJ1ZTtcclxuICAgICAgICBkaWFsb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkaWFsb2dFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2V0RGlhbG9nU2l6ZSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBkaWFsb2dDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctY29udGVudFwiKTtcclxuICAgICAgICBjb25zdCBzaXplcyA9IHtcclxuICAgICAgICAgICAgc21hbGw6IHsgd2lkdGg6ICczMDBweCcsIGhlaWdodDogJzIwMHB4JyB9LFxyXG4gICAgICAgICAgICBtZWRpdW06IHsgd2lkdGg6ICc1MDBweCcsIGhlaWdodDogJzQwMHB4JyB9LFxyXG4gICAgICAgICAgICBsYXJnZTogeyB3aWR0aDogJzgwMHB4JywgaGVpZ2h0OiAnNjAwcHgnIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2l6ZSA9PT0gJ2F1dG8nKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU2l6ZSA9IHNpemVzW3NpemVdIHx8ICh0eXBlb2Ygc2l6ZSA9PT0gJ29iamVjdCcgJiYgc2l6ZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU2l6ZSkge1xyXG4gICAgICAgICAgICBkaWFsb2dDb250ZW50LnN0eWxlLm1pbldpZHRoID0gc2VsZWN0ZWRTaXplLndpZHRoIHx8ICc1MDBweCc7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluSGVpZ2h0ID0gc2VsZWN0ZWRTaXplLmhlaWdodCB8fCAnNDAwcHgnO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWRkQnV0dG9ucyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyXCIpO1xyXG5cclxuICAgICAgICBidXR0b25zLmZvckVhY2goKHsga2V5LCBsYWJlbCwgb3JkZXIgPSAwLCBhbGlnbiA9ICdmbGV4LWVuZCcsIGNsb3NlT25DbGljayA9IHRydWUgfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uJyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGxhYmVsO1xyXG4gICAgICAgICAgICBidXR0b24uc3R5bGUub3JkZXIgPSBvcmRlcjtcclxuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1rZXknLCBrZXkpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGJ1dHRvbiBjb250ZXh0IHdpdGggZGlzYWJsZS9lbmFibGUgbWV0aG9kc1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25Db250ZXh0ID0ge1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW5hYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogYnV0dG9uXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xvc2VPbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSBvbmUtdGltZSBQcm9taXNlXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RDbGlja1Jlc29sdmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbGlja1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q2xpY2tSZXNvbHZlZCAmJiAhYnV0dG9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENsaWNrUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pOyAvLyBQYXNzIGJvdGggZGlhbG9nIGFuZCBidXR0b24gY29udGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7IC8vIENsb3NlIHRoZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHByb21pc2UgZm9yIGNoYWluaW5nIHdpdGggYC50aGVuYFxyXG4gICAgICAgICAgICAgICAgZGlhbG9nLmJ1dHRvbnNba2V5XSA9IGZpcnN0Q2xpY2tQcm9taXNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGFzIGEgcmVwZWF0ZWQgZXZlbnQgaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJzID0gW107IC8vIFN0b3JlIGhhbmRsZXJzIGZvciBgLnRoZW4oKWBcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja1Byb21pc2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhlbjogKGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goY2FsbGJhY2spOyAvLyBBZGQgdG8gaGFuZGxlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpY2tQcm9taXNlOyAvLyBBbGxvdyBjaGFpbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnV0dG9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIoeyBkaWFsb2csIGJ1dHRvbjogYnV0dG9uQ29udGV4dCB9KSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gY2xpY2tQcm9taXNlOyAvLyBBc3NpZ24gdGhlIFwiZmFrZVwiIHByb21pc2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lci5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IGFsaWduO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaEFuZEluc2VydENvbnRlbnQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDdXJzb3IgPSBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcjtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICd3YWl0JztcclxuICAgICAgICBjb25zdCBkeW5hbWljQ29udGVudCA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ2NvbnRlbnRMb2FkaW5nJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRpbmc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRVUklcclxuICAgICAgICAgICAgICAgID8gYXdhaXQgZmV0Y2hDb250ZW50KGNvbnRlbnRVUkkpXHJcbiAgICAgICAgICAgICAgICA6IGNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBkeW5hbWljQ29udGVudC5pbm5lckhUTUwgPSBjb250ZW50SHRtbDtcclxuXHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRlZCcpO1xyXG4gICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNvbnRlbnRMb2FkZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBjb250ZW50OicsIGVycm9yKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IG9yaWdpbmFsQ3Vyc29yO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZmV0Y2hDb250ZW50ID0gYXN5bmMgKHVyaSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IChjb250ZW50TWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAvLyBBbHdheXMgYWxsb3cgY3VzdG9tIGhlYWRlcnM7IHdlIG9ubHkgYWRkIENvbnRlbnQtVHlwZSB3aGVuIHdlIGNhbiBpbmZlciBpdFxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLihjb250ZW50SGVhZGVycyB8fCB7fSkgfTtcclxuICAgICAgICBjb25zdCBoYXNDb250ZW50VHlwZSA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnNvbWUoKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCdWlsZCBSZXF1ZXN0SW5pdCBkZXBlbmRpbmcgb24gbWV0aG9kIGFuZCBjb250ZW50RGF0YSB0eXBlLlxyXG4gICAgICAgICAqIFdlIGF2b2lkIHNldHRpbmcgQ29udGVudC1UeXBlIGZvciBGb3JtRGF0YSBhbmQgcmF3IHN0cmluZy9CbG9iIHBheWxvYWRzLFxyXG4gICAgICAgICAqIHVubGVzcyB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgcHJvdmlkZWQgaXQgdmlhIGNvbnRlbnRIZWFkZXJzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGluaXQgPSB7IG1ldGhvZCB9O1xyXG5cclxuICAgICAgICBpZiAobWV0aG9kID09PSAnUE9TVCcpIHtcclxuICAgICAgICAgICAgbGV0IGJvZHkgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc0Zvcm1EYXRhID0gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xyXG4gICAgICAgICAgICBjb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xyXG4gICAgICAgICAgICBjb25zdCBpc0Jsb2IgPSB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBCbG9iO1xyXG4gICAgICAgICAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ3N0cmluZyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUGxhaW5PYmplY3QgPSBjb250ZW50RGF0YSAmJiB0eXBlb2YgY29udGVudERhdGEgPT09ICdvYmplY3QnICYmICFpc0Zvcm1EYXRhICYmICFpc1VSTFNlYXJjaFBhcmFtcyAmJiAhaXNCbG9iO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZXQgQ29udGVudC1UeXBlIGZvciBGb3JtRGF0YTsgYnJvd3NlciB3aWxsIHNldCB0aGUgYm91bmRhcnlcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50VHlwZSkgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShjb250ZW50RGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyB8fCBpc0Jsb2IpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgICAgIC8vIENvbnRlbnQtVHlwZSBsZWZ0IHRvIGNhbGxlciBpZiBuZWVkZWRcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50RGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogdHJ5IHNlbmQgYXMtaXNcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gYm9keTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaW5pdC5oZWFkZXJzID0gaGVhZGVycztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJpLCBpbml0KTtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb250ZW50OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBkaWFsb2dcclxuICAgIHNldERpYWxvZ1NpemUoKTtcclxuICAgIGFkZEJ1dHRvbnMoKTtcclxuXHJcbiAgICAvLyBTZXQgdGl0bGUgYW5kIGNsb3NlIGJ1dHRvbiBoYW5kbGVyXHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy10aXRsZVwiKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG4gICAgZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuQVBYLWNsb3NlLWRpYWxvZycpLm9uY2xpY2sgPSBkaWFsb2cuY2xvc2U7XHJcblxyXG4gICAgcmV0dXJuIGRpYWxvZztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZURpYWxvZztcclxuIiwibGV0IGNvdW50ZXIgPSAwO1xyXG5jb25zdCBkb0NhbGxiYWNrcyA9IHt9O1xyXG5jb25zdCB0aW1lb3V0cyA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIFRoZSBhcHggb2JqZWN0IHRvIGF1Z21lbnQgd2l0aCB0aGUgbGlzdGVuIGZ1bmN0aW9uLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBhdWdtZW50ZWQgYXB4IG9iamVjdC5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIGxldCBlbGVtZW50cyA9IGFweC5lbGVtZW50cztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVsZW1lbnRzIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvciAoZS5nLiAnY2xpY2snLCAna2V5ZG93bicsIGV0Yy4pLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gLSBUaGUgQ1NTIHNlbGVjdG9yIHRvIHVzZSBmb3IgZXZlbnQgZGVsZWdhdGlvbiAob3B0aW9uYWwpLlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGFweC5saXN0ZW4oJ2NsaWNrJywgJy5teS1idXR0b24nKS5kbygoZXZlbnQpID0+IHtcclxuICAgICAqICAgY29uc29sZS5sb2coJ0J1dHRvbiBjbGlja2VkIScsIGV2ZW50LnRhcmdldCk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4Lmxpc3RlbiA9IGZ1bmN0aW9uIChldmVudFR5cGVzLCBzZWNvbmRBcmd1bWVudCwgdGhpcmRBcmd1bWVudCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RvcjtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgc2VsZWN0b3Igb3Igb3B0aW9uc1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vjb25kQXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yID0gc2Vjb25kQXJndW1lbnQ7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlyZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBzZWNvbmRBcmd1bWVudCB8fCB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVvdXREdXJhdGlvbiA9IG9wdGlvbnMudGltZW91dCB8fCAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShldmVudFR5cGVzKSkge1xyXG4gICAgICAgICAgICBldmVudFR5cGVzID0gW2V2ZW50VHlwZXNdOyAvLyBFbnN1cmUgZXZlbnRUeXBlcyBpcyBhbiBhcnJheVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBldmVudFR5cGVzLmZvckVhY2goKGV2ZW50VHlwZSkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlQ2FsbGJhY2tzKGV2ZW50LCB1bmlxdWVJZCwgdGltZW91dER1cmF0aW9uLCBzZWxlY3RvciwgZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGRvQ2FsbGJhY2tzIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQgbGlzdGVuZXIuXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvQ2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gUmV0dXJucyB0aGUgY3VycmVudCBvYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluZWQgY2FsbHMuXHJcbiAgICAgICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICAgICAqIGFweC5saXN0ZW4oJ2NsaWNrJywgJy5teS1idXR0b24nKS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICAgICAgICogfSkuZG8oKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAqICAgY29uc29sZS5sb2coJ0Fub3RoZXIgY2FsbGJhY2sgZnVuY3Rpb24hJyk7XHJcbiAgICAgICAgICAgICAqIH0pO1xyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZG86IGZ1bmN0aW9uIChkb0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvQ2FsbGJhY2tzW3VuaXF1ZUlkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnB1c2goZG9DYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBvYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluZWQgY2FsbHNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hbnVhbGx5IHRyaWdnZXJzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrcyBmb3IgYSBnaXZlbiBldmVudCB0eXBlIG9uIGFsbCBlbGVtZW50cyBvciBjcmVhdGVzIGEgbmV3IGV2ZW50IGlmIGEgc3RyaW5nIGlzIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIHRyaWdnZXIuIFRoaXMgY2FuIGJlIGFuIGV2ZW50IHR5cGUgc3RyaW5nIChsaWtlICdjbGljaycpIG9yIGFuIGFjdHVhbCBFdmVudCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFweC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHlwZTtcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudDtcclxuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnQudHlwZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGV2ZW50IHR5cGUgcHJvdmlkZWQgdG8gYXB4LnRyaWdnZXIuIEl0IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIEV2ZW50IG9iamVjdC4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsgIC8vIFRoaXMgd2lsbCBhbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIHVwIG5hdHVyYWxseS5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIGV2ZW50IGRlbGVnYXRpb24gbWFudWFsbHkgYnkgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoZG9DYWxsYmFja3MpLmZvckVhY2goKHVuaXF1ZUlkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrRGV0YWlscyA9IGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXTtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrRGV0YWlscyAmJiBjYWxsYmFja0RldGFpbHMuZXZlbnRUeXBlID09PSBldmVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgdXNlZCBkdXJpbmcgbGlzdGVuZXIgcmVnaXN0cmF0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbGVjdG9yIH0gPSBjYWxsYmFja0RldGFpbHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IGV2ZW50LnRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCAwLCBzZWxlY3RvciwgZXZlbnQudGFyZ2V0KTsgIC8vIEltbWVkaWF0ZSBleGVjdXRpb24sIG5vIHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGFweDtcclxufTtcclxuXHJcblxyXG5mdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2tzKGV2ZW50LCB1bmlxdWVJZCwgdGltZW91dER1cmF0aW9uLCBzZWxlY3RvciA9ICcnLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IHNlbGVjdG9yID8gY2xvc2VzdChldmVudC50YXJnZXQsIHNlbGVjdG9yKSA6IGVsZW1lbnQ7XHJcbiAgICBpZiAoIW1hdGNoZWRFbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyB0aW1lb3V0IGZvciB0aGlzIHVuaXF1ZUlkIHRvIHByZXZlbnQgdW5pbnRlbmRlZCBiZWhhdmlvclxyXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRzW3VuaXF1ZUlkXSk7XHJcblxyXG4gICAgLy8gRnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBleGVjdXRpb24gb2YgY2FsbGJhY2tzXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbigpIHtcclxuICAgICAgICBpZiAoZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgIGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXS5yZWR1Y2UoKHByZXZQcm9taXNlLCBkb0NhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldlByb21pc2UudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRvQ2FsbGJhY2suYmluZChtYXRjaGVkRWxlbWVudCkoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGNhbGxiYWNrIGNoYWluOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRpbWVvdXREdXJhdGlvbiBpcyB6ZXJvIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRlbGF5IHRoZSBjYWxsYmFjayBleGVjdXRpb24gb3Igbm90XHJcbiAgICBpZiAodGltZW91dER1cmF0aW9uID09PSAwKSB7XHJcbiAgICAgICAgaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZW91dHNbdW5pcXVlSWRdID0gc2V0VGltZW91dChoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbiwgdGltZW91dER1cmF0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVW5pcXVlSWQoKSB7XHJcbiAgICBjb25zdCByYW5kb21QYXJ0ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpOyAvLyBNb3JlIHJhbmRvbW5lc3NcclxuICAgIGNvbnN0IHVuaXF1ZUlkID0gYCR7RGF0ZS5ub3coKX1fJHtyYW5kb21QYXJ0fV8ke2NvdW50ZXJ9YDtcclxuICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMTAwMDsgLy8gUmVzZXQgY291bnRlciB0byBhdm9pZCBvdmVyZmxvd1xyXG5cclxuICAgIHJldHVybiB1bmlxdWVJZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuIiwiLy8gTWluaW1hbCwgZnJhbWV3b3JrLWFnbm9zdGljIFRvYXN0TWFuYWdlciBmb3IgQVBYXHJcbi8vIEVTTS1maXJzdCwgbm8gc2lkZSBlZmZlY3RzIG9uIGltcG9ydC4gRE9NIG9ubHkgd2hlbiB1c2VkLlxyXG5pbXBvcnQgJy4vY3NzL3RvYXN0LmNzcyc7XHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25PYmplY3RcclxuICogQHByb3BlcnR5IHsnc3RpY2t5J3wncmVsYXRpdmUnfCdhbmNob3JlZCd9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3hdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeV1cclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gW2VsZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J2Fib3ZlJ3wnYmVsb3cnfCdiZWZvcmUnfCdhZnRlcid9IFtwbGFjZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VOYXRpdmVDU1NdXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtzdHJpbmd8UG9zaXRpb25PYmplY3R9IFBvc2l0aW9uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0Q29uZmlnXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4VG9hc3RzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlZmF1bHREdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pJbmRleF1cclxuICogQHByb3BlcnR5IHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gW2FyaWFMaXZlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRhaW5lckNsYXNzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ319IFtwcm9ncmVzc10gRGVmYXVsdDogZmFsc2UuIFNob3cgcHJvZ3Jlc3MgYmFyIHdoZW4gdHJ1ZSBvciB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nIH0uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHt7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uOiBib29sZWFufX0gUHJvZ3Jlc3NPcHRcclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfE5vZGV9IG1lc3NhZ2VcclxuICogQHByb3BlcnR5IHsnaW5mbyd8J3N1Y2Nlc3MnfCd3YXJuaW5nJ3wnZGFuZ2VyJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc2libGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIGV2OiBNb3VzZUV2ZW50KSA9PiB2b2lkfSBbb25DbGlja11cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgcmVhc29uOiAndGltZW91dCd8J2Nsb3NlJ3wnYXBpJ3wnb3ZlcmZsb3cnKSA9PiB2b2lkfSBbb25DbG9zZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uPzogYm9vbGVhbn19IFtwcm9ncmVzc10gU2hvdyBwcm9ncmVzcyBiYXI6IHRydWUgPSB0b3AsIG9yIHsgZW5hYmxlLCBwb3NpdGlvbiwgcGF1c2VCdXR0b24gfSAocGF1c2VCdXR0b24gZGVmYXVsdCBmYWxzZSkuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0UmVmXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiAnYXBpJ3wnY2xvc2UnKSA9PiB2b2lkfSBjbG9zZVxyXG4gKiBAcHJvcGVydHkgeyhwYXJ0aWFsOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pID0+IHZvaWR9IHVwZGF0ZVxyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHdoZW5DbG9zZWRcclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+ICgpID0+IHZvaWR9IG9uXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkfSBvZmZcclxuICovXHJcblxyXG5jb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xyXG5cclxuLy8gU2hhcmVkIGNvbnRhaW5lciBjYWNoZTogTWFwPHBvc2l0aW9uLCBIVE1MRWxlbWVudD5cclxuLy8gQ29udGFpbmVycyBhcmUgc2hhcmVkIGJldHdlZW4gbWFuYWdlcnMgd2l0aCB0aGUgc2FtZSBwb3NpdGlvblxyXG5jb25zdCBfY29udGFpbmVyQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBHYXJiYWdlIGNvbGxlY3Rpb246IGNsZWFudXAgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnMgYWZ0ZXIgYSBkZWxheVxyXG5jb25zdCBHQ19ERUxBWV9NUyA9IDIwMDAwOyAvLyAyMCBzZWNvbmRzXHJcbmxldCBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG5cclxuLy8gV3JhcHBlciBmb3IgYWxsIHRvYXN0IGNvbnRhaW5lcnMgKGtlZXBzIERPTSBjbGVhbilcclxubGV0IF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIEdldCBvciBjcmVhdGUgdGhlIHRvYXN0IGNvbnRhaW5lcnMgd3JhcHBlclxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRvYXN0V3JhcHBlcigpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS53aWR0aCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS56SW5kZXggPSAnMTAwMDAnOyAvLyBCZWxvdyBjb250YWluZXJzIGJ1dCBhYm92ZSBtb3N0IGNvbnRlbnRcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChfdG9hc3RXcmFwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBfdG9hc3RXcmFwcGVyO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0JyxcclxuICAgIG1heFRvYXN0czogNSxcclxuICAgIGRlZmF1bHREdXJhdGlvbk1zOiA1MDAwLFxyXG4gICAgekluZGV4OiAxMTAwMCxcclxuICAgIGFyaWFMaXZlOiAncG9saXRlJyxcclxuICAgIGdhcDogOCxcclxuICAgIGRlZHVwZTogZmFsc2UsXHJcbiAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICBvZmZzZXQ6IDAsXHJcbiAgICBwcm9ncmVzczogZmFsc2VcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGNsYXNzZXNcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUVsKHRhZywgY2xhc3NOYW1lcykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcbiAgICBpZiAoY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGNsYXNzTmFtZXMuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5hZGQoYykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG59XHJcblxyXG4vKiogTWluaW1hbCBsaW5lLWJhc2VkIHBhdXNlICh0d28gYmFycykgLyByZXN1bWUgKHRyaWFuZ2xlIHJpZ2h0KSBpY29uIFNWRy4gVXNlcyBjdXJyZW50Q29sb3IuICovXHJcbmZ1bmN0aW9uIGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHBhdXNlZCkge1xyXG4gICAgaWYgKHBhdXNlZCkge1xyXG4gICAgICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNOCA2TDggMThMMTcgMTJaXCIvPjwvc3ZnPmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48bGluZSB4MT1cIjlcIiB5MT1cIjZcIiB4Mj1cIjlcIiB5Mj1cIjE4XCIvPjxsaW5lIHgxPVwiMTVcIiB5MT1cIjZcIiB4Mj1cIjE1XCIgeTI9XCIxOFwiLz48L3N2Zz5gO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuZCBpbnNlcnQgcHJvZ3Jlc3MgYmxvY2sgKHRyYWNrICsgYmFyLCBvcHRpb25hbCBwYXVzZSBidXR0b24pIGludG8gdG9hc3QuIEJ1dHRvbiBpcyBmaXhlZCBhdCBsZWZ0IHZpYSB0cmFjayBsYXlvdXQuXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gY2xvc2VCdG5cclxuICogQHBhcmFtIHtQcm9ncmVzc09wdH0gcHJvZ3Jlc3NPcHRcclxuICogQHJldHVybnMge3sgd3JhcDogSFRNTEVsZW1lbnQsIGJhcjogSFRNTEVsZW1lbnQsIHBhdXNlQnRuOiBIVE1MRWxlbWVudHxudWxsIH19XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHByb2dyZXNzT3B0KSB7XHJcbiAgICBjb25zdCBwb3MgPSBwcm9ncmVzc09wdC5wb3NpdGlvbjtcclxuICAgIGNvbnN0IHNob3dQYXVzZUJ1dHRvbiA9IHByb2dyZXNzT3B0LnBhdXNlQnV0dG9uID09PSB0cnVlO1xyXG4gICAgY29uc3Qgd3JhcCA9IGNyZWF0ZUVsKCdkaXYnLCBgQVBYLXRvYXN0X19wcm9ncmVzcyBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRyYWNrID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXRyYWNrJyk7XHJcbiAgICBjb25zdCBiYXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3Byb2dyZXNzYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJywgJzAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCAnMTAwJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1RlbXBzIHJlc3RhbnQnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICB0cmFjay5hcHBlbmRDaGlsZChiYXIpO1xyXG4gICAgd3JhcC5hcHBlbmRDaGlsZCh0cmFjayk7XHJcbiAgICBsZXQgcGF1c2VCdG4gPSBudWxsO1xyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikge1xyXG4gICAgICAgIHBhdXNlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnUGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi5pbm5lckhUTUwgPSBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyhmYWxzZSk7IC8vIHJ1bm5pbmcgPSBzaG93IHBhdXNlIGljb25cclxuICAgICAgICB3cmFwLmluc2VydEJlZm9yZShwYXVzZUJ0biwgdHJhY2spO1xyXG4gICAgfVxyXG4gICAgaWYgKHBvcyA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB0b2FzdEVsLmluc2VydEJlZm9yZSh3cmFwLCBjb250ZW50RWwpO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNsb3NlQnRuKTtcclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgcmV0dXJuIHsgd3JhcCwgYmFyLCBwYXVzZUJ0biB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIHByb2dyZXNzIGJsb2NrIHBvc2l0aW9uIChjbGFzc2VzICsgRE9NIG9yZGVyKVxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb2dyZXNzV3JhcFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0geyd0b3AnfCdib3R0b20nfSBwb3NcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHBvcykge1xyXG4gICAgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnLCAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQocG9zID09PSAndG9wJyA/ICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnIDogJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCcsICdBUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20nKTtcclxuICAgIHByb2dyZXNzV3JhcC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IHBvcyA9PT0gJ3RvcCcgPyBjb250ZW50RWwgOiBjbG9zZUJ0bjtcclxuICAgIGlmIChwcm9ncmVzc1dyYXAubmV4dEVsZW1lbnRTaWJsaW5nICE9PSB0YXJnZXQpIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHByb2dyZXNzV3JhcCwgdGFyZ2V0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgcHJvZ3Jlc3Mgb3B0aW9uIGZyb20gcGVyLWNhbGwgb3B0aW9uIGFuZCBjb25maWcgZGVmYXVsdFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IG9wdGlvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IGNvbmZpZ0RlZmF1bHRcclxuICogQHJldHVybnMge1Byb2dyZXNzT3B0fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVByb2dyZXNzKG9wdGlvbiwgY29uZmlnRGVmYXVsdCkge1xyXG4gICAgY29uc3QgZnJvbUNvbmZpZyA9IGNvbmZpZ0RlZmF1bHQgPT09IHRydWVcclxuICAgICAgICA/IHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9XHJcbiAgICAgICAgOiAoY29uZmlnRGVmYXVsdCAmJiB0eXBlb2YgY29uZmlnRGVmYXVsdCA9PT0gJ29iamVjdCdcclxuICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICEhY29uZmlnRGVmYXVsdC5lbmFibGUsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogY29uZmlnRGVmYXVsdC5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnYm90dG9tJyA6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgcGF1c2VCdXR0b246IGNvbmZpZ0RlZmF1bHQucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA6IHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfSk7XHJcbiAgICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQgfHwgb3B0aW9uID09PSBudWxsKSByZXR1cm4gZnJvbUNvbmZpZztcclxuICAgIGlmIChvcHRpb24gPT09IHRydWUpIHJldHVybiB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGVuYWJsZTogISFvcHRpb24uZW5hYmxlLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogb3B0aW9uLnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgIHBhdXNlQnV0dG9uOiBvcHRpb24ucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgdG8gQ1NTIHZhbHVlc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhY2VtZW50XHJcbiAqIEByZXR1cm5zIHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcclxuICAgIGNvbnN0IHN5bm9ueW1zID0ge1xyXG4gICAgICAgICdhYm92ZSc6ICd0b3AnLFxyXG4gICAgICAgICdiZWxvdyc6ICdib3R0b20nLFxyXG4gICAgICAgICdiZWZvcmUnOiAnbGVmdCcsXHJcbiAgICAgICAgJ2FmdGVyJzogJ3JpZ2h0J1xyXG4gICAgfTtcclxuICAgIHJldHVybiBzeW5vbnltc1twbGFjZW1lbnRdIHx8IHBsYWNlbWVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBmbG93IGRpcmVjdGlvbiBiYXNlZCBvbiBwb3NpdGlvblxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7J3VwJ3wnZG93bid9XHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbnM6IHRvcCA9IHVwLCBib3R0b20gPSBkb3duXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSkgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCdib3R0b20nKSkgcmV0dXJuICdkb3duJztcclxuICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdGlja3knIHx8ICghdHlwZSAmJiAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55KSkpIHtcclxuICAgICAgICAgICAgLy8gU3RpY2t5OiBkZXRlcm1pbmUgYmFzZWQgb24geSBjb29yZGluYXRlXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHkgc3RhcnRzIHdpdGggJy0nIG9yIGlzIGEgc21hbGwgdmFsdWUsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBpcyBhIGxhcmdlIHZhbHVlIG9yIHBlcmNlbnRhZ2UsIGxpa2VseSBib3R0b20gKGRvd24pXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSA9IGZyb20gYm90dG9tLCBzbyBmbG93IGRvd25cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHkgPCA1MCUgb2Ygdmlld3BvcnQgaGVpZ2h0LCBsaWtlbHkgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5pbmNsdWRlcygnJScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCA1MCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBweCB2YWx1ZXMsIGFzc3VtZSA8IDQwMHB4IGlzIHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDQwMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBsYWNlbWVudCBkZXRlcm1pbmVzIGZsb3dcclxuICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2Fib3ZlJykgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdib3R0b20nIHx8IHBsYWNlbWVudCA9PT0gJ2JlbG93JykgcmV0dXJuICdkb3duJztcclxuICAgICAgICAgICAgLy8gRm9yIGxlZnQvcmlnaHQsIGRlZmF1bHQgdG8gZG93blxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJykge1xyXG4gICAgICAgICAgICAvLyBSZWxhdGl2ZTogZGV0ZXJtaW5lIGJhc2VkIG9uIHkgb2Zmc2V0XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQocG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSB5ID0gYWJvdmUgZWxlbWVudCA9IGZsb3cgdXBcclxuICAgICAgICAgICAgICAgICAgICAvLyBQb3NpdGl2ZSB5ID0gYmVsb3cgZWxlbWVudCA9IGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHYXJiYWdlIGNvbGxlY3Rpb246IHJlbW92ZSBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gY2xlYW51cEVtcHR5Q29udGFpbmVycygpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQVBYLXRvYXN0LWNvbnRhaW5lcjpub3QoW2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQ9XCJ0cnVlXCJdKScpO1xyXG4gICAgY29udGFpbmVycy5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGlzIGVtcHR5IChubyB0b2FzdHMpXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAocG9zaXRpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdXAgd3JhcHBlciBpZiBpdCdzIGVtcHR5IChhbGwgY29udGFpbmVycyByZW1vdmVkKVxyXG4gICAgaWYgKF90b2FzdFdyYXBwZXIgJiYgX3RvYXN0V3JhcHBlci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpIHtcclxuICAgIGlmIChfZ2NUaW1lb3V0SWQpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQoX2djVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIF9nY1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoY2xlYW51cEVtcHR5Q29udGFpbmVycywgR0NfREVMQVlfTVMpO1xyXG59XHJcblxyXG4vKipcclxuICogRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cclxuICovXHJcbmZ1bmN0aW9uIGZpbmRTY3JvbGxhYmxlUGFyZW50cyhlbGVtZW50KSB7XHJcbiAgICBjb25zdCBzY3JvbGxhYmxlcyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBcclxuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KTtcclxuICAgICAgICBjb25zdCBvdmVyZmxvdyA9IHN0eWxlLm92ZXJmbG93ICsgc3R5bGUub3ZlcmZsb3dZICsgc3R5bGUub3ZlcmZsb3dYO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChvdmVyZmxvdy5pbmNsdWRlcygnc2Nyb2xsJykgfHwgb3ZlcmZsb3cuaW5jbHVkZXMoJ2F1dG8nKSkge1xyXG4gICAgICAgICAgICBzY3JvbGxhYmxlcy5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gc2Nyb2xsYWJsZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYXNoIGFuIGVsZW1lbnQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkZW50aWZpZXJcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIGhhc2hFbGVtZW50KGVsKSB7XHJcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBzdHIgPSBgJHtlbC50YWdOYW1lfV8ke3JlY3QubGVmdH1fJHtyZWN0LnRvcH1fJHtyZWN0LndpZHRofV8ke3JlY3QuaGVpZ2h0fWA7XHJcbiAgICBsZXQgaGFzaCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaGFyO1xyXG4gICAgICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoaGFzaCkudG9TdHJpbmcoMzYpO1xyXG59XHJcblxyXG4vKipcclxuICogU2VyaWFsaXplIHBvc2l0aW9uIG9wdGlvbnMgaW50byBhIHVuaXF1ZSBrZXlcclxuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBgczoke3Bvc2l0aW9ufWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUeXBlIChkZWZhdWx0OiBzdGlja3kgaWYgeC95IHByb3ZpZGVkKVxyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgIGlmICh0eXBlKSBwYXJ0cy5wdXNoKGB0OiR7dHlwZX1gKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb29yZGluYXRlc1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHg6JHtwb3NpdGlvbi54fWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHk6JHtwb3NpdGlvbi55fWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZvciByZWxhdGl2ZS9hbmNob3JlZDogdXNlIGVsZW1lbnQgSUQgb3IgaGFzaFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IHBvc2l0aW9uLmVsZW1lbnQuaWQgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24uZWxlbWVudC5kYXRhc2V0Py5hcHhUb2FzdEFuY2hvcklkIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGVsXyR7aGFzaEVsZW1lbnQocG9zaXRpb24uZWxlbWVudCl9YDtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgZWw6JHtlbGVtZW50SWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBsYWNlbWVudCBmb3Igc2VyaWFsaXphdGlvbiAodXNlIENTUyB2YWx1ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgcDoke25vcm1hbGl6ZWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5nYXAgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgZzoke3Bvc2l0aW9uLmdhcH1gKTtcclxuICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTKSBwYXJ0cy5wdXNoKGBuYXRpdmU6dHJ1ZWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBgbzoke3BhcnRzLmpvaW4oJ3wnKX1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ3M6Ym90dG9tLXJpZ2h0JztcclxufVxyXG5cclxuLyoqXHJcbiAqIFRvYXN0TWFuYWdlciBjbGFzc1xyXG4gKi9cclxuY2xhc3MgVG9hc3RNYW5hZ2VyIHtcclxuICAgIC8qKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0Q29uZmlnfSAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fG51bGx9ICovXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVG9hc3RSZWY+fSAqL1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZiA9IG5ldyBNYXAoKTtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmW119ICovXHJcbiAgICAgICAgdGhpcy5vcGVuID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz59IGNvbmZpZyAqL1xyXG4gICAgY29uZmlndXJlKGNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gbW9kZSAqL1xyXG4gICAgc2V0QXJpYUxpdmUobW9kZSkgeyB0aGlzLmNvbmZpZ3VyZSh7IGFyaWFMaXZlOiBtb2RlIH0pOyB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtUb2FzdFJlZltdfSAqL1xyXG4gICAgZ2V0T3BlblRvYXN0cygpIHsgcmV0dXJuIHRoaXMub3Blbi5zbGljZSgpOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBzaG93KG9wdHMpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyhudWxsKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKG9wdHMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVkdXBlICYmIG9wdGlvbnMuaWQgJiYgdGhpcy5pZFRvUmVmLmhhcyhvcHRpb25zLmlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmlkVG9SZWYuZ2V0KG9wdGlvbnMuaWQpO1xyXG4gICAgICAgICAgICByZWYudXBkYXRlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGFuZCBmbG93IGZvciB0aGlzIHRvYXN0IChvcHRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IG9wdGlvbnMuZmxvdyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mbG93IDogKHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0bycpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgPT09ICdhdXRvJyA/IGRldGVybWluZUZsb3cocG9zaXRpb24pIDogZmxvdztcclxuICAgICAgICBcclxuICAgICAgICAvLyBFbnN1cmUgZGVmYXVsdCBjb250YWluZXIgaXMgc2V0IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcclxuICAgICAgICB0aGlzLmVuc3VyZUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICBjb25zdCB0b2FzdEVsID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3QgQVBYLXRvYXN0LS0ke29wdGlvbnMudHlwZX1gKTtcclxuICAgICAgICB0b2FzdEVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdzdGF0dXMnKTtcclxuICAgICAgICAvLyBQcmlvcml0eTogb3B0aW9ucy5pZCA+IGNvbmZpZy5pZCA+IGF1dG8tZ2VuZXJhdGVkXHJcbiAgICAgICAgY29uc3QgdG9hc3RJZCA9IG9wdGlvbnMuaWQgfHwgYHRfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWA7XHJcbiAgICAgICAgdG9hc3RFbC5kYXRhc2V0LnRvYXN0SWQgPSB0b2FzdElkO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc05hbWUgKz0gYCAke29wdGlvbnMuY2xhc3NOYW1lfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19jb250ZW50Jyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG9wdGlvbnMubWVzc2FnZTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQob3B0aW9ucy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdG9hc3RFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpO1xyXG5cclxuICAgICAgICBsZXQgY2xvc2VCdG4gPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmRpc21pc3NpYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjbG9zZUJ0biA9IGNyZWF0ZUVsKCdidXR0b24nLCAnQVBYLXRvYXN0X19jbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UnKTtcclxuICAgICAgICAgICAgY2xvc2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNsb3NlQnRuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcm9ncmVzc1dyYXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc0JhckVsID0gbnVsbDtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NQYXVzZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZ3Jlc3MuZW5hYmxlICYmIG9wdGlvbnMuZHVyYXRpb25NcyA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgb3B0aW9ucy5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIHByb2dyZXNzV3JhcCA9IGNyZWF0ZWQud3JhcDtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHNwZWNpZmljIHBvc2l0aW9uXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uVXBkYXRlRm4gPSBudWxsO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICYmIHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTICYmICh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZU5hdGl2ZUNTUzogdHJ1ZSAtIGNyZWF0ZSBjb250YWluZXIgaW4gdGFyZ2V0IGVsZW1lbnQgdXNpbmcgbmF0aXZlIENTU1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWwgPSBwb3NpdGlvbi5lbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50U3R5bGUgPSB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciBzdGFja2luZyB0b2FzdHMgKHJldXNlIGlmIGV4aXN0cylcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hdGl2ZUNvbnRhaW5lciA9IHRhcmdldEVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFweC10b2FzdC1wb3NpdGlvbj1cIiR7cG9zaXRpb25LZXl9XCJdYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lciBBUFgtdG9hc3QtY29udGFpbmVyLW5hdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJywgcG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uaW5nIHRvIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiB1c2UgeC95IGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gb3V0c2lkZSB0aGUgZWxlbWVudCB1c2luZyAxMDAlIChlbGVtZW50IHNpemUpICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hcHBlbmRDaGlsZChuYXRpdmVDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuYXRpdmVDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsRWxlbWVudFN0eWxlIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbmF0aXZlIGNvbnRhaW5lciBpZiBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlQ29udGFpbmVyICYmIG5hdGl2ZUNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gbmF0aXZlQ29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIERlZmF1bHQ6IGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmaW5hbEZsb3cpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVDb250YWluZXJQb3NpdGlvbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkLCBsaXN0ZW4gdG8gc2Nyb2xsL3Jlc2l6ZVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvdHRsZU1zID0gMTY7IC8vIH42MGZwc1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlZFVwZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIGxhc3RVcGRhdGUgPCB0aHJvdHRsZU1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZVBhcmVudHMgPSBmaW5kU2Nyb2xsYWJsZVBhcmVudHMocG9zaXRpb24uZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiB3aW5kb3cgYW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBzY3JvbGwgb24gYWxsIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZVBhcmVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGVsZW1lbnQgcmVtb3ZhbFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmNsb3NlKCdhcGknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcGRhdGVGbiA9IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZklkKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbiAtIGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGVuZCB0b2FzdCB0byB0aGUgYXBwcm9wcmlhdGUgY29udGFpbmVyXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbnRlciBhbmltYXRpb25cclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXInKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXItYWN0aXZlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEV2ZW50IGhhbmRsaW5nIGFuZCB0aW1lcnNcclxuICAgICAgICBsZXQgcmVtYWluaW5nID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgIGxldCB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICBsZXQgc3RhcnRUcyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHVzZXJQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB7IGNsaWNrOiBuZXcgU2V0KCksIGNsb3NlOiBuZXcgU2V0KCkgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcgfHwgcmVtYWluaW5nIDw9IDApIHJldHVybjsgLy8gc3RpY2t5XHJcbiAgICAgICAgICAgIHN0YXJ0VHMgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gcmVmLmNsb3NlKCd0aW1lb3V0JyksIHJlbWFpbmluZyk7XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcklkID09IG51bGwgfHwgc3RhcnRUcyA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgcmVtYWluaW5nIC0gZWxhcHNlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IG9wdGlvbnMuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBkdXJhdGlvbk1zID4gMCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgKHJlbWFpbmluZ01zIC8gZHVyYXRpb25NcykgKiAxMDApKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHBjdCkpKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHBhdXNlVGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydFRzICE9IG51bGwpIHJlbWFpbmluZyAtPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc1JhZklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlciA9IChidG4pID0+IHtcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHVzZXJQYXVzZWQgPSAhdXNlclBhdXNlZDtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyUGF1c2VkKSBwYXVzZVRpbWVyKCk7IGVsc2Ugc3RhcnRUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB1c2VyUGF1c2VkID8gJ1JlcHJlbmRyZScgOiAnUGF1c2UnO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHVzZXJQYXVzZWQpOyAvLyBwYXVzZWQgPSByZXN1bWUgKHRyaWFuZ2xlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmfSAqL1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHtcclxuICAgICAgICAgICAgaWQ6IHRvYXN0SWQsXHJcbiAgICAgICAgICAgIGVsOiB0b2FzdEVsLFxyXG4gICAgICAgICAgICBjbG9zZTogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB1cGRhdGU6IChwYXJ0aWFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoeyAuLi5vcHRpb25zLCAuLi5wYXJ0aWFsIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnRlbnRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVyZ2VkLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gbWVyZ2VkLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChtZXJnZWQubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdHlwZSBjbGFzc1xyXG4gICAgICAgICAgICAgICAgWydpbmZvJywnc3VjY2VzcycsJ3dhcm5pbmcnLCdkYW5nZXInXS5mb3JFYWNoKHQgPT4gdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKGBBUFgtdG9hc3QtLSR7dH1gKSk7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC0tJHttZXJnZWQudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjbGFzc2VzXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUgIT09IG1lcmdlZC5jbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSguLi5vcHRpb25zLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZC5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCguLi5tZXJnZWQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyB2aXNpYmlsaXR5L3Bvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzID0gbWVyZ2VkLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzV3JhcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbWVyZ2VkLnByb2dyZXNzLmVuYWJsZSB8fCBtZXJnZWQuZHVyYXRpb25NcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcy5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlICYmIG1lcmdlZC5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwgPSBjcmVhdGVkLmJhcjtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwICYmIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgbWVyZ2VkLnByb2dyZXNzLnBhdXNlQnV0dG9uID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZHVyYXRpb24gbG9naWNcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb25NcyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXJFbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHdoZW5DbG9zZWQ6ICgpID0+IGNsb3NlZFByb21pc2UsXHJcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmFkZChoYW5kbGVyKTsgcmV0dXJuICgpID0+IHJlZi5vZmYoZXZlbnQsIGhhbmRsZXIpOyB9LFxyXG4gICAgICAgICAgICBvZmY6IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uZGVsZXRlKGhhbmRsZXIpOyB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgbm90aWZ5ID0gKGV2ZW50LCBhcmcpID0+IGhhbmRsZXJzW2V2ZW50XS5mb3JFYWNoKGZuID0+IHsgdHJ5IHsgZm4oYXJnKTsgfSBjYXRjaCAoXykge30gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsb3NlZFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm90aWZ5KCdjbG9zZScsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbG9zZShyZWYsIHJlYXNvbik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdG9hc3RFbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBwb3NpdGlvbiBsaXN0ZW5lcnMgYW5kIHJlc3RvcmUgc3R5bGVzXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25DbGVhbnVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmZsb3csIHJlbW92ZSBpbW1lZGlhdGVseSB0byBlbmZvcmNlIGhhcmQgY2FwXHJcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uID09PSAnb3ZlcmZsb3cnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhbmltYXRlIG91dFxyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWV4aXQnKTtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdC1hY3RpdmUnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlRWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVtb3ZlRWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdEVsLnBhcmVudEVsZW1lbnQpIHRvYXN0RWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm9wZW4uaW5kZXhPZihyZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy5vcGVuLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRUb1JlZi5kZWxldGUodG9hc3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlR2FyYmFnZUNvbGxlY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggY2xvc2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgcmVmLmNsb3NlID0gKHJlYXNvbikgPT4gY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbGljayBoYW5kbGluZ1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgbm90aWZ5KCdjbGljaycsIGV2KTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbGljayhyZWYsIGV2KTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSG92ZXIgcGF1c2VcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBwYXVzZVRpbWVyKTtcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7IGlmICghdXNlclBhdXNlZCkgc3RhcnRUaW1lcigpOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4geyBldi5zdG9wUHJvcGFnYXRpb24oKTsgcmVmLmNsb3NlKCdjbG9zZScpOyB9KTtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcblxyXG4gICAgICAgIC8vIFRyYWNrXHJcbiAgICAgICAgdGhpcy5vcGVuLnB1c2gocmVmKTtcclxuICAgICAgICB0aGlzLmlkVG9SZWYuc2V0KHRvYXN0SWQsIHJlZik7XHJcblxyXG4gICAgICAgIC8vIE92ZXJmbG93IHBvbGljeVxyXG4gICAgICAgIGlmICh0aGlzLm9wZW4ubGVuZ3RoID4gdGhpcy5jb25maWcubWF4VG9hc3RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMub3BlblswXTtcclxuICAgICAgICAgICAgb2xkZXN0LmNsb3NlKCdvdmVyZmxvdycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgIHJldHVybiByZWY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBoZWxwZXJzXHJcbiAgICAgKi9cclxuICAgIGluZm8obWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2luZm8nIH0pOyB9XHJcbiAgICBzdWNjZXNzKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdzdWNjZXNzJyB9KTsgfVxyXG4gICAgd2FybmluZyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnd2FybmluZycgfSk7IH1cclxuICAgIGRhbmdlcihtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnZGFuZ2VyJyB9KTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydhcGknfCdvdmVyZmxvdyd9IFtyZWFzb25dICovXHJcbiAgICBjbG9zZUFsbChyZWFzb24pIHtcclxuICAgICAgICAvLyBjb3B5IHRvIGF2b2lkIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb25cclxuICAgICAgICBjb25zdCBhbGwgPSB0aGlzLm9wZW4uc2xpY2UoKTtcclxuICAgICAgICBhbGwuZm9yRWFjaChyID0+IHIuY2xvc2UocmVhc29uIHx8ICdhcGknKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBub3JtYWxpemVPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICBjb25zdCBvID0geyAuLi5vcHRzIH07XHJcbiAgICAgICAgaWYgKCFvLnR5cGUpIG8udHlwZSA9ICdpbmZvJztcclxuICAgICAgICBpZiAodHlwZW9mIG8uZGlzbWlzc2libGUgIT09ICdib29sZWFuJykgby5kaXNtaXNzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmR1cmF0aW9uTXMgIT09ICdudW1iZXInKSBvLmR1cmF0aW9uTXMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0RHVyYXRpb25NcztcclxuICAgICAgICAvLyBVc2UgaWQgZnJvbSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGlkIGZyb20gY29uZmlnLCBvdGhlcndpc2UgdW5kZWZpbmVkICh3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkKVxyXG4gICAgICAgIGlmICghby5pZCAmJiB0aGlzLmNvbmZpZy5pZCkgby5pZCA9IHRoaXMuY29uZmlnLmlkO1xyXG4gICAgICAgIG8ucHJvZ3Jlc3MgPSByZXNvbHZlUHJvZ3Jlc3Mob3B0cy5wcm9ncmVzcywgdGhpcy5jb25maWcucHJvZ3Jlc3MpO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCBvciBjcmVhdGUgYSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0geyd1cCd8J2Rvd24nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gKGFscmVhZHkgZGV0ZXJtaW5lZCwgbm90ICdhdXRvJylcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmFnZWRdIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgbWFuYWdlZCBieSBhIG1hbmFnZXIgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCBtYW5hZ2VkID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRmxvdyBzaG91bGQgYWxyZWFkeSBiZSBkZXRlcm1pbmVkICgndXAnIG9yICdkb3duJyksIGJ1dCBmYWxsYmFjayB0byBhdXRvIGlmIG5lZWRlZFxyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgJiYgZmxvdyAhPT0gJ2F1dG8nID8gZmxvdyA6IGRldGVybWluZUZsb3cocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDEuIENoZWNrIG1lbW9yeSBjYWNoZVxyXG4gICAgICAgIGxldCBjID0gX2NvbnRhaW5lckNhY2hlLmdldChwb3NpdGlvbktleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gSWYgbm90IGluIGNhY2hlLCBzZWFyY2ggaW4gRE9NIGJ5IGRhdGEgYXR0cmlidXRlXHJcbiAgICAgICAgaWYgKCFjICYmIGlzQnJvd3Nlcikge1xyXG4gICAgICAgICAgICBjID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDMuIElmIHN0aWxsIG5vdCBmb3VuZCwgY3JlYXRlIG5ldyBjb250YWluZXJcclxuICAgICAgICBpZiAoIWMpIHtcclxuICAgICAgICAgICAgYyA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBNYXJrIGFzIG1hbmFnZWQgaWYgY3JlYXRlZCBieSBhIG1hbmFnZXJcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGNsYXNzIChmb3IgQ1NTKVxyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IHBvc2l0aW9uIFxyXG4gICAgICAgICAgICAgICAgOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgICAgIGMuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3NDbGFzc31gKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBmbG93IGRpcmVjdGlvblxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbiBzdHlsZXMgaWYgb2JqZWN0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGMpO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gd3JhcHBlciBmb3IgY2xlYW4gRE9NIG9yZ2FuaXphdGlvblxyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0VG9hc3RXcmFwcGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0cyAobWF5IGJlIHNoYXJlZClcclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSWYgY29udGFpbmVyIGV4aXN0cyBhbmQgaXMgbm93IG1hbmFnZWQsIG1hcmsgaXRcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQgJiYgIWMuaGFzQXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJykpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYztcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIHx8ICFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nO1xyXG4gICAgICAgIC8vIENvbnRhaW5lcnMgY3JlYXRlZCBieSBlbnN1cmVDb250YWluZXIgYXJlIG1hbmFnZWRcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUNvbnRhaW5lckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBwb3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnID8gcG9zaXRpb24gOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgc3R5bGVzICh0aGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBvdGhlciBtYW5hZ2VycyBzaGFyaW5nIHRoZSBjb250YWluZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbiBjbGFzcyAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzc2VzID0gWydib3R0b20tcmlnaHQnLCdib3R0b20tbGVmdCcsJ3RvcC1yaWdodCcsJ3RvcC1sZWZ0J10ubWFwKHAgPT4gYEFQWC10b2FzdC1jb250YWluZXItLSR7cH1gKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSguLi5wb3NDbGFzc2VzKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IGNvbnRhaW5lciBjbGFzcyBpZiBzcGVjaWZpZWRcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3Muc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgb2Zmc2V0IChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGAke3RoaXMuY29uZmlnLm9mZnNldH1weGA7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IG9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9mZnNldCBpZiBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBvYmplY3QgcG9zaXRpb25zLCBlbnN1cmUgY29udGFpbmVyIGhhcyBwb3NpdGlvbjogZml4ZWRcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSBwb3NpdGlvbiBmb3IgYSBjb250YWluZXIgYmFzZWQgb24gcG9zaXRpb24gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyRWxcclxuICAgICAqIEByZXR1cm5zIHt7bGVmdD86IHN0cmluZywgdG9wPzogc3RyaW5nLCByaWdodD86IHN0cmluZywgYm90dG9tPzogc3RyaW5nfX1cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lckVsKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9ucyBhcmUgaGFuZGxlZCBieSBjb250YWluZXIgQ1NTXHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpY2t5OiBmaXhlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHgveSBvZmZzZXRcclxuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBwb3NpdGlvbmluZywgc28gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB4L3kgb2Zmc2V0cyAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlT2Zmc2V0ID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGVtIHRvIHB4IChhcHByb3hpbWF0ZTogMWVtID0gMTZweClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnggfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBwYXJzZU9mZnNldChwb3NpdGlvbi55IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgJHtyZWN0LmxlZnQgKyBvZmZzZXRYfXB4YCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGAke3JlY3QudG9wICsgb2Zmc2V0WX1weGBcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHBsYWNlbWVudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGdhcCAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlR2FwID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjsgLy8gQXBwcm94aW1hdGU6IDFlbSA9IDE2cHhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcFB4ID0gcGFyc2VHYXAoZ2FwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIChhYm92ZS9iZWxvdy9iZWZvcmUvYWZ0ZXIpIHRvIENTUyB2YWx1ZXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGFib3ZlIGVsZW1lbnQ6IGJvdHRvbSBvZiB0b2FzdCA9IHRvcCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSA9IHZpZXdwb3J0IGhlaWdodCAtIChlbGVtZW50IHRvcCAtIGdhcCkgPSB2aWV3cG9ydCBoZWlnaHQgLSBlbGVtZW50IHRvcCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYmVsb3cgZWxlbWVudDogdG9wIG9mIHRvYXN0ID0gYm90dG9tIG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QuYm90dG9tICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgbGVmdDogcmlnaHQgb2YgdG9hc3QgPSBsZWZ0IG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIHJpZ2h0OiBsZWZ0IG9mIHRvYXN0ID0gcmlnaHQgb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QucmlnaHQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnXHJcbiAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUb2FzdE1hbmFnZXIoY29uZmlnKSB7XHJcbiAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcihjb25maWcpO1xyXG59XHJcblxyXG4vLyBIaWdoLWxldmVsIEFQWC50b2FzdCBBUEkgKGRlZmF1bHQgJiBuYW1lZCBtYW5hZ2VycylcclxubGV0IF9kZWZhdWx0TWFuYWdlciA9IG51bGw7XHJcbmNvbnN0IF9nZXREZWZhdWx0ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFfZGVmYXVsdE1hbmFnZXIpIF9kZWZhdWx0TWFuYWdlciA9IGNyZWF0ZVRvYXN0TWFuYWdlcigpO1xyXG4gICAgcmV0dXJuIF9kZWZhdWx0TWFuYWdlcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUb2FzdCBBUEkgc3VyZmFjZSB0byBiZSBhdHRhY2hlZCBhcyBBUFgudG9hc3QuXHJcbiAqIENhbGxhYmxlIGZvcm0gcHJveGllcyB0byBkZWZhdWx0TWFuYWdlci5zaG93KG9wdHMpOiBBUFgudG9hc3Qoey4uLn0pXHJcbiAqL1xyXG5mdW5jdGlvbiB0b2FzdChvcHRzKSB7XHJcbiAgICByZXR1cm4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpO1xyXG59XHJcblxyXG5PYmplY3QuYXNzaWduKHRvYXN0LCB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG1hbmFnZXIuIElmIGZpcnN0IGFyZyBpcyBzdHJpbmcsIHJlZ2lzdGVyIGFzIG5hbWVkIHVuZGVyIHRvYXN0LmN1c3RvbVtuYW1lXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UGFydGlhbDxUb2FzdENvbmZpZz59IG5hbWVPckNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IG1heWJlQ29uZmlnXHJcbiAgICAgKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IChuYW1lT3JDb25maWcsIG1heWJlQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lT3JDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG1heWJlQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgICAgICAgICAgaWYgKCF0b2FzdC5jdXN0b20pIHRvYXN0LmN1c3RvbSA9IHt9O1xyXG4gICAgICAgICAgICB0b2FzdC5jdXN0b21bbmFtZV0gPSBtYW5hZ2VyO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obmFtZU9yQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgIH0sXHJcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFRvYXN0TWFuYWdlcj59ICovXHJcbiAgICBjdXN0b206IHt9LFxyXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lICovXHJcbiAgICB1c2U6IChuYW1lKSA9PiAodG9hc3QuY3VzdG9tICYmIHRvYXN0LmN1c3RvbVtuYW1lXSkgfHwgbnVsbCxcclxuICAgIE1hbmFnZXI6IFRvYXN0TWFuYWdlcixcclxuICAgIHNob3c6IChvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyksXHJcbiAgICBpbmZvOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5pbmZvKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgc3VjY2VzczogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHdhcm5pbmc6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLndhcm5pbmcobWVzc2FnZSwgb3B0cyksXHJcbiAgICBkYW5nZXI6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmRhbmdlcihtZXNzYWdlLCBvcHRzKSxcclxuICAgIGNvbmZpZ3VyZTogKGNvbmZpZykgPT4gX2dldERlZmF1bHQoKS5jb25maWd1cmUoY29uZmlnKSxcclxuICAgIHNldEFyaWFMaXZlOiAobW9kZSkgPT4gX2dldERlZmF1bHQoKS5zZXRBcmlhTGl2ZShtb2RlKSxcclxuICAgIGNsb3NlQWxsOiAocmVhc29uKSA9PiBfZ2V0RGVmYXVsdCgpLmNsb3NlQWxsKHJlYXNvbiksXHJcbiAgICBnZXRPcGVuVG9hc3RzOiAoKSA9PiBfZ2V0RGVmYXVsdCgpLmdldE9wZW5Ub2FzdHMoKVxyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHRvYXN0O1xyXG5leHBvcnQgeyBUb2FzdE1hbmFnZXIsIGNyZWF0ZVRvYXN0TWFuYWdlciwgdG9hc3QgfTtcclxuIiwiLy8gSW1wb3J0IGRlcyBmb25jdGlvbnMgZXQgbW9kdWxlcyBkZXMgc291cy1tb2R1bGVzXHJcbmltcG9ydCBhdWdtZW50V2l0aFBhY2sgZnJvbSAnLi9mb3JtLXBhY2tlci9hdWdtZW50LWFweC5tanMnO1xyXG5pbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMnO1xyXG5cclxuLy8gRXhwb3J0IGRlIGxhIGZvbmN0aW9uIGQnYXVnbWVudGF0aW9uXHJcbmV4cG9ydCB7IGF1Z21lbnRXaXRoUGFjayB9O1xyXG5cclxuLy8gRXhwb3J0IGRlcyBmb25jdGlvbnMgdXRpbGl0YWlyZXNcclxuZXhwb3J0IHsgcGFja0Zvcm1Ub0pTT04gfTtcclxuXHJcbi8vIEV4cG9ydCBkJ3VuIG9iamV0IHRvb2xzIHBvdXIgZmFjaWxpdGVyIGwndXRpbGlzYXRpb25cclxuZXhwb3J0IGNvbnN0IHRvb2xzID0ge1xyXG4gICAgcGFja0Zvcm1Ub0pTT046IHBhY2tGb3JtVG9KU09OXHJcbn07XHJcblxyXG5cclxuIiwiaW1wb3J0IHsgcGFja0Zvcm1Ub0pTT04gfSBmcm9tICcuL3BhY2tUb0pzb24ubWpzJztcclxuXHJcbi8qKlxyXG4gKiBBam91dGUgbGEgbcOpdGhvZGUgcGFjaygpIGF1eCBvYmpldHMgQVBYIHBvdXIgY29udmVydGlyIGxlcyBmb3JtdWxhaXJlcyBlbiBKU09OXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcHggLSBMJ29iamV0IEFQWCDDoCBhdWdtZW50ZXJcclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBBUFggYXVnbWVudMOpXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCBsZSBwcmVtaWVyIGZvcm11bGFpcmUgc8OpbGVjdGlvbm7DqSBlbiBvYmpldCBKU09OXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBwYXNzw6llcyDDoCBwYWNrRm9ybVRvSlNPTiAoZXguIHsgbnVtZXJpY0tleXNBbHdheXNBcnJheTogdHJ1ZSB9KVxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTaSBhdWN1biBmb3JtdWxhaXJlIG4nZXN0IHRyb3V2w6kgb3Ugc2kgbGUgcHJlbWllciDDqWzDqW1lbnQgbidlc3QgcGFzIHVuIGZvcm11bGFpcmVcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBjb25zdCBkYXRhID0gQVBYKCdmb3JtLm15Zm9ybWNsYXNzJykucGFjaygpO1xyXG4gICAgICogY29uc3QgZGF0YUxlZ2FjeSA9IEFQWCgnZm9ybScpLnBhY2soeyBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiB0cnVlIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgucGFjayA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGhpcy5maXJzdCgpO1xyXG4gICAgICAgIGlmICghZmlyc3RFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlyc3RFbGVtZW50LnRhZ05hbWUgIT09ICdGT1JNJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgZm9ybScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFja0Zvcm1Ub0pTT04oZmlyc3RFbGVtZW50LCBvcHRpb25zKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBhcHg7XHJcbn1cclxuXHJcblxyXG4iLCIvKipcclxuICogQ29udmVydGl0IHVuIGZvcm11bGFpcmUgSFRNTCBlbiBvYmpldCBKU09OXHJcbiAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtIC0gTGUgZm9ybXVsYWlyZSDDoCBjb252ZXJ0aXJcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgZGUgY29udmVyc2lvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm51bWVyaWNLZXlzQWx3YXlzQXJyYXk9ZmFsc2VdIC0gU2kgdHJ1ZSwgdG91dGUgY2zDqSBudW3DqXJpcXVlIGVzdCB0cmFpdMOpZSBjb21tZSBpbmRleCBkZSB0YWJsZWF1IChjb21wb3J0ZW1lbnQgZCdhdmFudCAyLjYuMikuIFNpbm9uLCBoZXVyaXN0aXF1ZSA6IHRhYmxlYXUgc2V1bGVtZW50IHNpIGluZGljZXMgZGVuc2VzIDAsMSwyLOKApixuLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEpTT04gcsOpc3VsdGFudFxyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFNpIGZvcm0gbidlc3QgcGFzIHVuIEhUTUxGb3JtRWxlbWVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBhY2tGb3JtVG9KU09OID0gKGZvcm0sIG9wdGlvbnMgPSB7fSkgPT4ge1xyXG4gICAgLy8gVmFsaWRhdGlvbiBkZSBsJ2VudHLDqWVcclxuICAgIGlmICghZm9ybSB8fCAhKGZvcm0gaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFja0Zvcm1Ub0pTT04gZXhwZWN0cyBhbiBIVE1MRm9ybUVsZW1lbnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBudW1lcmljS2V5c0Fsd2F5c0FycmF5ID0gb3B0aW9ucy5udW1lcmljS2V5c0Fsd2F5c0FycmF5ID09PSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xyXG4gICAgY29uc3QganNvbkRhdGEgPSB7fTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1aXQgdW5lIHJlcHLDqXNlbnRhdGlvbiBzdHJpbmcgZHUgY2hlbWluIHBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIExlcyBwYXJ0aWVzIGR1IGNoZW1pblxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTGUgY2hlbWluIGZvcm1hdMOpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGJ1aWxkUGF0aFN0cmluZyA9IChwYXJ0cykgPT4ge1xyXG4gICAgICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoKHBhdGgsIHBhcnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoID8gYCR7cGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtwYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICB9LCAnJyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAxIDogQU5BTFlTRSBFVCBEw4lURUNUSU9OIERFUyBDT05GTElUU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0cnVjdHVyZSBwb3VyIHN0b2NrZXIgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pblxyXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gUGF0aFVzYWdlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRmluYWwgLSBMZSBjaGVtaW4gZXN0IHV0aWxpc8OpIGNvbW1lIHZhbGV1ciBmaW5hbGVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNJbnRlcm1lZGlhdGUgLSBMZSBjaGVtaW4gZXN0IHV0aWxpc8OpIGNvbW1lIGNoZW1pbiBpbnRlcm3DqWRpYWlyZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBoYXNBcnJheVN1ZmZpeCAtIExlIGNoZW1pbiBzZSB0ZXJtaW5lIHBhciBbXSAoY3LDqWUgZGVzIHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIGR1IGZvcm11bGFpcmUgcXVpIHV0aWxpc2UgY2UgY2hlbWluXHJcbiAgICAgKi9cclxuICAgIFxyXG4gICAgY29uc3QgcGF0aFVzYWdlID0gbmV3IE1hcCgpOyAvLyBNYXA8cGF0aFN0cmluZywgUGF0aFVzYWdlPlxyXG4gICAgY29uc3Qga2V5QW5hbHlzaXMgPSBuZXcgTWFwKCk7IC8vIE1hcDxiYXNlUGF0aCwge2hhc051bWVyaWM6IGJvb2xlYW4sIGhhc1N0cmluZzogYm9vbGVhbn0+XHJcbiAgICBjb25zdCBudW1lcmljSW5kaWNlc0J5UGF0aCA9IG5ldyBNYXAoKTsgLy8gTWFwPHBhdGhTdHJpbmcsIFNldDxudW1iZXI+PiDigJQgaW5kaWNlcyB1bmRlciBlYWNoIHBhcmVudCBwYXRoXHJcbiAgICBjb25zdCBhbGxFbnRyaWVzID0gW107XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRW5yZWdpc3RyZSBsJ3V0aWxpc2F0aW9uIGQndW4gY2hlbWluIGRhbnMgcGF0aFVzYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudFBhdGggLSBMZSBjaGVtaW4gw6AgZW5yZWdpc3RyZXJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGaW5hbCAtIFNpIGMnZXN0IHVuZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXJyYXlTdWZmaXggLSBTaSBsZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW11cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIGR1IGZvcm11bGFpcmVcclxuICAgICAqL1xyXG4gICAgY29uc3QgcmVjb3JkUGF0aFVzYWdlID0gKGN1cnJlbnRQYXRoLCBpc0ZpbmFsLCBpc0FycmF5U3VmZml4LCBrZXkpID0+IHtcclxuICAgICAgICBjb25zdCB1c2FnZSA9IHBhdGhVc2FnZS5nZXQoY3VycmVudFBhdGgpID8/IHtcclxuICAgICAgICAgICAgaXNGaW5hbDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzSW50ZXJtZWRpYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgaGFzQXJyYXlTdWZmaXg6IGZhbHNlLFxyXG4gICAgICAgICAgICBrZXlcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghcGF0aFVzYWdlLmhhcyhjdXJyZW50UGF0aCkpIHtcclxuICAgICAgICAgICAgcGF0aFVzYWdlLnNldChjdXJyZW50UGF0aCwgdXNhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAoaXNGaW5hbCkge1xyXG4gICAgICAgICAgICB1c2FnZS5pc0ZpbmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID0ga2V5O1xyXG4gICAgICAgICAgICBpZiAoaXNBcnJheVN1ZmZpeCkge1xyXG4gICAgICAgICAgICAgICAgdXNhZ2UuaGFzQXJyYXlTdWZmaXggPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNJbnRlcm1lZGlhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB1c2FnZS5rZXkgPz89IGtleTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBQcmVtacOocmUgcGFzc2UgOiBhbmFseXNlciB0b3V0ZXMgbGVzIGNsw6lzIGV0IGVucmVnaXN0cmVyIGxlcyBjaGVtaW5zXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgYWxsRW50cmllcy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlS2V5KGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29uc3RydWlyZSB0b3VzIGxlcyBjaGVtaW5zIGludGVybcOpZGlhaXJlcyBldCBsZSBjaGVtaW4gZmluYWxcclxuICAgICAgICBsZXQgY3VycmVudFBhdGggPSAnJztcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgaXNBcnJheVN1ZmZpeCA9IHBhcnQudHlwZSA9PT0gJ2FycmF5JztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENvbnN0cnVpcmUgbGUgY2hlbWluIGp1c3F1J8OgIGNlIG5pdmVhdVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofVske3BhcnQubmFtZX1dYCA6IHBhcnQubmFtZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IGN1cnJlbnRQYXRoO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNldCA9IG51bWVyaWNJbmRpY2VzQnlQYXRoLmdldChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0ID0gbmV3IFNldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyaWNJbmRpY2VzQnlQYXRoLnNldChwYXJlbnRQYXRoLCBzZXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0LmFkZChwYXJ0LmluZGV4KTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gYCR7Y3VycmVudFBhdGh9WyR7cGFydC5pbmRleH1dYDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gYCR7Y3VycmVudFBhdGh9W11gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBFbnJlZ2lzdHJlciBsJ3V0aWxpc2F0aW9uIGR1IGNoZW1pblxyXG4gICAgICAgICAgICByZWNvcmRQYXRoVXNhZ2UoY3VycmVudFBhdGgsIGlzTGFzdCwgaXNBcnJheVN1ZmZpeCAmJiBpc0xhc3QsIGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFuYWx5c2VyIGNoYXF1ZSBuaXZlYXUgZGUgbGEgaGnDqXJhcmNoaWUgcG91ciBkw6l0ZWN0ZXIgbGVzIGNvbmZsaXRzIChpbmRpY2VzIG51bcOpcmlxdWVzIHZzIGNsw6lzIGRlIGNoYcOubmUpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0UGFydCA9IHBhcnRzW2kgKyAxXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFuYWx5c2VyIHNldWxlbWVudCBsZXMgY2zDqXMgKHBhcyBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcylcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGFydC5uYW1lOyAvLyBMZSBub20gZGUgbGEgcHJlbWnDqHJlIGNsw6kgZGFucyBsZSBjaGVtaW5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBrZXlBbmFseXNpcy5nZXQoYmFzZVBhdGgpID8/IHsgaGFzTnVtZXJpYzogZmFsc2UsIGhhc1N0cmluZzogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGlmICgha2V5QW5hbHlzaXMuaGFzKGJhc2VQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleUFuYWx5c2lzLnNldChiYXNlUGF0aCwgYW5hbHlzaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFBhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzLmhhc051bWVyaWMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dFBhcnQudHlwZSA9PT0gJ2tleScgfHwgbmV4dFBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5oYXNTdHJpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBEw6l0ZWN0ZSBldCBsw6h2ZSB1bmUgZXhjZXB0aW9uIHBvdXIgdG91cyBsZXMgY29uZmxpdHMgZGUgY2hlbWluc1xyXG4gICAgICogXHJcbiAgICAgKiBQcmluY2lwZSBzaW1wbGUgOiBwb3VyIGNoYXF1ZSBjaGVtaW4gZmluYWwgKHZhbGV1ciBwcmltaXRpdmUpLCB2w6lyaWZpZXIgc2kgdW4gY2hlbWluXHJcbiAgICAgKiBpbnRlcm3DqWRpYWlyZSBjb21tZW5jZSBwYXIgY2UgY2hlbWluIHN1aXZpIGRlICdbJy4gU2kgYydlc3QgbGUgY2FzLCBjJ2VzdCB1biBjb25mbGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBDZXR0ZSBhcHByb2NoZSB1bmlmacOpZSBjb3V2cmUgdG91cyBsZXMgY2FzIDpcclxuICAgICAqIC0gaXRlbXNbXSAoZmluYWwpIHZzIGl0ZW1zWzBdW25hbWVdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqIC0gYXJyYXlbM10gKGZpbmFsKSB2cyBhcnJheVszXVtuZXN0ZWRdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqIC0gZGF0YVtrZXldIChmaW5hbCkgdnMgZGF0YVtrZXldW3N1Yl0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBkZXRlY3RQYXRoQ29uZmxpY3RzID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIDEuIENvbGxlY3RlciB0b3VzIGxlcyBjaGVtaW5zIGZpbmF1eCAodmFsZXVycyBwcmltaXRpdmVzKVxyXG4gICAgICAgIGNvbnN0IGZpbmFsUGF0aHMgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgY29uc3QgZmluYWxQYXRoS2V5cyA9IG5ldyBNYXAoKTsgLy8gUG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXJcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB1c2FnZV0gb2YgcGF0aFVzYWdlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodXNhZ2UuaXNGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxQYXRocy5hZGQocGF0aCk7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBhdGhLZXlzLnNldChwYXRoLCB1c2FnZS5rZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDIuIFBvdXIgY2hhcXVlIGNoZW1pbiBpbnRlcm3DqWRpYWlyZSwgdsOpcmlmaWVyIHMnaWwgY29tbWVuY2UgcGFyIHVuIGNoZW1pbiBmaW5hbFxyXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHVzYWdlXSBvZiBwYXRoVXNhZ2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2FnZS5pc0ludGVybWVkaWF0ZSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaW5hbFBhdGggb2YgZmluYWxQYXRocykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFbDqXJpZmllciBzaSBjZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmUgY29tbWVuY2UgcGFyIHVuIGNoZW1pbiBmaW5hbCBzdWl2aSBkZSAnWydcclxuICAgICAgICAgICAgICAgICAgICAvLyBFeGVtcGxlOiBmaW5hbFBhdGggPSBcImFycmF5WzNdXCIsIHBhdGggPSBcImFycmF5WzNdW25lc3RlZF1cIiDihpIgY29uZmxpdFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoYCR7ZmluYWxQYXRofVtgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUGF0aCBjb25mbGljdDogXCIke2ZpbmFsUGF0aH1cIiBpcyB1c2VkIGFzIGEgZmluYWwgdmFsdWUgKGluIGZpZWxkIFwiJHtmaW5hbFBhdGhLZXlzLmdldChmaW5hbFBhdGgpfVwiKSwgYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYnV0IFwiJHtwYXRofVwiIHRyaWVzIHRvIHVzZSBpdCBhcyBhbiBpbnRlcm1lZGlhdGUgcGF0aCAoaW4gZmllbGQgXCIke3VzYWdlLmtleX1cIikuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgY3JlYXRlcyBpbmNvbXBhdGlibGUgZGF0YSBzdHJ1Y3R1cmVzLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBZb3UgY2Fubm90IHVzZSBcIiR7ZmluYWxQYXRofVwiIGFzIGEgcHJpbWl0aXZlIHZhbHVlIGFuZCB0aGVuIGFjY2VzcyBpdCBhcyBhbiBvYmplY3QuYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIEV4w6ljdXRlciBsYSBkw6l0ZWN0aW9uIGRlcyBjb25mbGl0c1xyXG4gICAgZGV0ZWN0UGF0aENvbmZsaWN0cygpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVsOpcmlmaWUgc2kgdW4gY2hlbWluIGRlIGJhc2UgYSB1biBjb25mbGl0IChpbmRpY2VzIG51bcOpcmlxdWVzIEVUIGNsw6lzIGRlIGNoYcOubmUpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSDDoCB2w6lyaWZpZXJcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCBoYXNDb25mbGljdCA9IChiYXNlUGF0aCkgPT4ge1xyXG4gICAgICAgIGlmICghYmFzZVBhdGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBhbmFseXNpcyA9IGtleUFuYWx5c2lzLmdldChiYXNlUGF0aCk7XHJcbiAgICAgICAgcmV0dXJuIGFuYWx5c2lzPy5oYXNOdW1lcmljICYmIGFuYWx5c2lzPy5oYXNTdHJpbmc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSBpZiBpbmRpY2VzIGFyZSBleGFjdGx5IDAsIDEsIDIsIC4uLiwgbiAoZGVuc2UsIHNlcXVlbnRpYWwgZnJvbSAwKS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGljZXMgLSBTb3J0ZWQgYXJyYXkgb2YgaW5kaWNlc1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGlzRGVuc2VTZXF1ZW50aWFsID0gKGluZGljZXMpID0+IHtcclxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaW5kaWNlc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc29ydGVkLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3J0ZWRbal0gIT09IGopIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSBpZiBudW1lcmljIGtleXMgdW5kZXIgdGhpcyBwYXRoIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFycmF5IGluZGljZXMuXHJcbiAgICAgKiBXaXRoIG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IGFsd2F5cyB0cnVlIHdoZW4gcGF0aCBoYXMgbnVtZXJpYyBjaGlsZHJlbi5cclxuICAgICAqIE90aGVyd2lzZTogdHJ1ZSBvbmx5IHdoZW4gaW5kaWNlcyBhcmUgZGVuc2UgMC4ubi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRQYXRoIC0gUGF0aCB0byB0aGUgY29udGFpbmVyIHRoYXQgaGFzIG51bWVyaWMgY2hpbGRyZW5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCB1c2VBcnJheUZvck51bWVyaWNQYXRoID0gKHBhcmVudFBhdGgpID0+IHtcclxuICAgICAgICBjb25zdCBzZXQgPSBudW1lcmljSW5kaWNlc0J5UGF0aC5nZXQocGFyZW50UGF0aCk7XHJcbiAgICAgICAgaWYgKCFzZXQgfHwgc2V0LnNpemUgPT09IDApIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChudW1lcmljS2V5c0Fsd2F5c0FycmF5KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gaXNEZW5zZVNlcXVlbnRpYWwoWy4uLnNldF0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biB0YWJsZWF1IGVuIG9iamV0IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzIGNvbW1lIHByb3ByacOpdMOpc1xyXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyIC0gTGUgdGFibGVhdSDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgcsOpc3VsdGFudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBhcnJheVRvT2JqZWN0ID0gKGFycikgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgICAgIC8vIENvcGllciBsZXMgaW5kaWNlcyBudW3DqXJpcXVlc1xyXG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGFyci5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgICAgICAgIG9ialtpZHhdID0gYXJyW2lkeF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENvcGllciBsZXMgcHJvcHJpw6l0w6lzIG5vbi1udW3DqXJpcXVlc1xyXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGFycikpIHtcclxuICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihudW1LZXkpIHx8IGsgIT09IFN0cmluZyhudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBvYmpba10gPSB2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IHVuIG9iamV0IGVuIHRhYmxlYXUgZW4gcHLDqXNlcnZhbnQgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBMJ29iamV0IMOgIGNvbnZlcnRpclxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSB0YWJsZWF1IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3Qgb2JqZWN0VG9BcnJheSA9IChvYmopID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqO1xyXG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJbbnVtS2V5XSA9IHY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3N1cmUgcXUndW4gY29udGVuZXVyIGVzdCB1biBvYmpldCwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZU9iamVjdCAtIEZvcmNlciBsYSBjb252ZXJzaW9uIGVuIG9iamV0IG3Dqm1lIHMnaWwgbid5IGEgcGFzIGRlIGNvbmZsaXRcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExlIGNvbnRlbmV1ciAoY29udmVydGkgZW4gb2JqZXQgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZU9iamVjdCA9IChjb250YWluZXIsIGtleSwgcGFyZW50LCBmb3JjZU9iamVjdCA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lciAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3N1cmUgcXUndW4gY29udGVuZXVyIGVzdCB1biB0YWJsZWF1LCBlbiBjb252ZXJ0aXNzYW50IHNpIG7DqWNlc3NhaXJlXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciDDoCB2w6lyaWZpZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGtleSAtIExhIGNsw6kgZGFucyBsZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IExlIGNvbnRlbmV1ciAoY29udmVydGkgZW4gdGFibGVhdSBzaSBuw6ljZXNzYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZW5zdXJlQXJyYXkgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCkgPT4ge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IG9iamVjdFRvQXJyYXkoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gYXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIFBIQVNFIDIgOiBUUkFJVEVNRU5UIERFUyBWQUxFVVJTXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVHJhaXRlIHVuZSB2YWxldXIgZmluYWxlIChkZXJuacOocmUgcGFydGllIGR1IGNoZW1pbilcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIGFjdHVlbFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnQgLSBMYSBwYXJ0aWUgw6AgdHJhaXRlclxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIExhIHZhbGV1ciDDoCBhc3NpZ25lclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50UGF0aCAtIENoZW1pbiBkdSBjb250ZW5ldXIgYWN0dWVsIChwb3VyIGhldXJpc3RpcXVlIG51bWVyaWMpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByb2Nlc3NGaW5hbFZhbHVlID0gKGNvbnRhaW5lciwgcGFydCwgdmFsdWUsIHBhcmVudCwgYmFzZVBhdGgsIHBhcmVudFBhdGgpID0+IHtcclxuICAgICAgICBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgIC8vIFRhYmxlYXUgZXhwbGljaXRlIGF2ZWMgW11cclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPz89IFtdO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgY29uc3QgeyBpbmRleCB9ID0gcGFydDtcclxuICAgICAgICAgICAgY29uc3QgdXNlQXJyYXkgPSB1c2VBcnJheUZvck51bWVyaWNQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICBpZiAodXNlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZUFycmF5KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmxlbmd0aCA8PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENsw6kgc2ltcGxlIGZpbmFsZVxyXG4gICAgICAgICAgICBjb25zdCBjb25mbGljdCA9IGhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjb25mbGljdCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSB1bmRlZmluZWQgJiYgXHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgcGFydGllIGludGVybcOpZGlhaXJlIChjcsOpZSBsYSBzdHJ1Y3R1cmUpXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IG5leHRQYXJ0IC0gTGEgcGFydGllIHN1aXZhbnRlIChwZXV0IMOqdHJlIG51bGwpXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2UgcG91ciBsYSBkw6l0ZWN0aW9uIGRlIGNvbmZsaXRcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIC0gVG91dGVzIGxlcyBwYXJ0aWVzIGR1IGNoZW1pbiAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaSAtIEwnaW5kZXggZGUgbGEgcGFydGllIGFjdHVlbGxlIChwb3VyIGNvbnN0cnVpcmUgbGUgY2hlbWluIGNvbXBsZXQgZGFucyBsZXMgZXJyZXVycylcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIGR1IGZvcm11bGFpcmUgKHBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyKVxyXG4gICAgICogQHJldHVybnMgeyp9IExlIG5vdXZlYXUgY29udGVuZXVyIGFwcsOocyB0cmFpdGVtZW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByb2Nlc3NJbnRlcm1lZGlhdGVQYXJ0ID0gKGNvbnRhaW5lciwgcGFydCwgbmV4dFBhcnQsIHBhcmVudCwgYmFzZVBhdGgsIHBhcnRzLCBpLCBrZXkpID0+IHtcclxuICAgICAgICBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgY29uc3QgeyBpbmRleCB9ID0gcGFydDtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXJ0cy5zbGljZSgwLCBpKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZUFycmF5ID0gdXNlQXJyYXlGb3JOdW1lcmljUGF0aChwYXJlbnRQYXRoKSAmJiAhaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCF1c2VBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID8/PSB7fTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyW2luZGV4XSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW2luZGV4XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbaW5kZXhdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbaW5kZXhdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXJbaW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBDbMOpIG5vcm1hbGUgOiBjcsOpZXIgb2JqZXQgb3UgdGFibGVhdSBzZWxvbiBsYSBwYXJ0aWUgc3VpdmFudGVcclxuICAgICAgICBjb25zdCBuZXh0SXNOdW1lcmljID0gbmV4dFBhcnQ/LnR5cGUgPT09ICdudW1lcmljJztcclxuICAgICAgICBjb25zdCBjb25mbGljdCA9IGhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgLy8gQ29uZmxpdCA6IHRvdWpvdXJzIHV0aWxpc2VyIHVuIG9iamV0XHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA/Pz0ge307XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDZXR0ZSBlcnJldXIgbmUgZGV2cmFpdCBqYW1haXMgc2UgcHJvZHVpcmUgc2kgbGEgZMOpdGVjdGlvbiBmb25jdGlvbm5lIGNvcnJlY3RlbWVudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFBhcyBkZSBjb25mbGl0LCBjcsOpZXIgc2Vsb24gbGEgcGFydGllIHN1aXZhbnRlXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gbmV4dElzTnVtZXJpYyA/IFtdIDoge307XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0SXNOdW1lcmljICYmICFBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvLyBPbiBhIGJlc29pbiBkJ3VuIHRhYmxlYXUgbWFpcyBjJ2VzdCB1biBvYmpldFxyXG4gICAgICAgICAgICBjb25zdCBoYXNTdHJpbmdLZXlzID0gT2JqZWN0LmtleXMoY29udGFpbmVyW3BhcnQubmFtZV0pLnNvbWUoayA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW1LZXkpIHx8IGsgIT09IFN0cmluZyhudW1LZXkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCFoYXNTdHJpbmdLZXlzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IG9iamVjdFRvQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICghbmV4dElzTnVtZXJpYyAmJiAhaXNQbGFpbk9iamVjdChjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLy8gT24gYSBiZXNvaW4gZCd1biBvYmpldCBtYWlzIGMnZXN0IHVuIHRhYmxlYXVcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBTJ2Fzc3VyZXIgcXVlIGNvbnRhaW5lcltwYXJ0Lm5hbWVdIGVzdCBiaWVuIHVuIG9iamV0IGFwcsOocyB0b3V0ZXMgbGVzIGNvbnZlcnNpb25zXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSB1bmRlZmluZWQgJiYgXHJcbiAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAvLyBDZXR0ZSBlcnJldXIgbmUgZGV2cmFpdCBqYW1haXMgc2UgcHJvZHVpcmUgc2kgbGEgZMOpdGVjdGlvbiBmb25jdGlvbm5lIGNvcnJlY3RlbWVudFxyXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbcGFydC5uYW1lXSl9LiBgICtcclxuICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXJbcGFydC5uYW1lXTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIFRyYWl0ZXIgdG91dGVzIGxlcyBlbnRyw6llc1xyXG4gICAgZm9yIChjb25zdCB7IHZhbHVlLCBrZXkgfSBvZiBhbGxFbnRyaWVzKSB7XHJcbiAgICAgICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlS2V5KGtleSk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFt7IGNvbnRhaW5lcjoganNvbkRhdGEsIGtleTogbnVsbCB9XTtcclxuICAgICAgICBsZXQgY29udGFpbmVyID0ganNvbkRhdGE7XHJcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXJ0c1swXT8udHlwZSA9PT0gJ2tleScgPyBwYXJ0c1swXS5uYW1lIDogJyc7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0UGFydCA9IGkgKyAxIDwgcGFydHMubGVuZ3RoID8gcGFydHNbaSArIDFdIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTGFzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXJ0cy5zbGljZSgwLCBpKSk7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmluYWxWYWx1ZShjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFBhcnRpZSBpbnRlcm3DqWRpYWlyZSA6IGNyw6llciBsYSBzdHJ1Y3R1cmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHByb2Nlc3NJbnRlcm1lZGlhdGVQYXJ0KGNvbnRhaW5lciwgcGFydCwgbmV4dFBhcnQsIHBhcmVudCwgYmFzZVBhdGgsIHBhcnRzLCBpLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHsgY29udGFpbmVyLCBrZXk6IHBhcnQudHlwZSA9PT0gJ251bWVyaWMnID8gcGFydC5pbmRleCA6IHBhcnQubmFtZSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ganNvbkRhdGE7XHJcbn07XHJcblxyXG4vKipcclxuICogUGFyc2UgdW5lIGNsw6kgZGUgZm9ybXVsYWlyZSBwb3VyIGV4dHJhaXJlIGxlcyBwYXJ0aWVzIChub20sIGluZGljZXMsIGV0Yy4pXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIMOgIHBhcnNlciAoZXg6IFwidXNlcltlbWFpbF1cIiwgXCJ0YWdzW11cIiwgXCJpdGVtc1swXVtuYW1lXVwiKVxyXG4gKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBpbmRleD86IG51bWJlcn0+fSBUYWJsZWF1IGRlcyBwYXJ0aWVzIHBhcnPDqWVzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBwYXJzZUtleSA9IChrZXkpID0+IHtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9ICcnO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbGVuID0ga2V5Lmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAoaSA8IGxlbikge1xyXG4gICAgICAgIGNvbnN0IGNoYXIgPSBrZXlbaV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNoYXIgPT09ICdbJykge1xyXG4gICAgICAgICAgICAvLyBTYXV2ZWdhcmRlciBsYSBwYXJ0aWUgcHLDqWPDqWRlbnRlIHNpIGVsbGUgZXhpc3RlXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogY3VycmVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFRyb3V2ZXIgbGEgZmluIGR1IGNyb2NoZXRcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBsZXQgYnJhY2tldENvbnRlbnQgPSAnJztcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYga2V5W2ldICE9PSAnXScpIHtcclxuICAgICAgICAgICAgICAgIGJyYWNrZXRDb250ZW50ICs9IGtleVtpXTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGJyYWNrZXRDb250ZW50ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgLy8gW10gdmlkZSA9IHRhYmxlYXVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UGFydC50eXBlID0gJ2FycmF5JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gW10gYXUgZMOpYnV0LCBjcsOpZXIgdW5lIHBhcnRpZSBzcMOpY2lhbGVcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogJycsIHR5cGU6ICdhcnJheScgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb250ZW51IGRhbnMgbGVzIGNyb2NoZXRzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1JbmRleCA9IE51bWJlci5wYXJzZUludChicmFja2V0Q29udGVudCwgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtSW5kZXgpICYmIGJyYWNrZXRDb250ZW50ID09PSBTdHJpbmcobnVtSW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNlIG51bcOpcmlxdWVcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogU3RyaW5nKG51bUluZGV4KSwgdHlwZTogJ251bWVyaWMnLCBpbmRleDogbnVtSW5kZXggfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vbSBkZSBwcm9wcmnDqXTDqVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBicmFja2V0Q29udGVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSsrOyAvLyBQYXNzZXIgbGUgJ10nXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudCArPSBjaGFyO1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBBam91dGVyIGxhIGRlcm5pw6hyZSBwYXJ0aWUgc2kgZWxsZSBleGlzdGVcclxuICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcGFydHM7XHJcbn07XHJcblxyXG4vKipcclxuICogVsOpcmlmaWUgc2kgdW5lIHZhbGV1ciBlc3QgdW4gb2JqZXQgc2ltcGxlIChwYXMgdW4gdGFibGVhdSwgcGFzIG51bGwpXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIC0gTGEgdmFsZXVyIMOgIHbDqXJpZmllclxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KG9iaik7XHJcbn07XHJcbiIsImltcG9ydCAnLi9jc3MvdHJpc3RhdGUuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdHJpLXN0YXRlIGNoZWNrYm94IGZvciBlYWNoIGNoZWNrYm94IGVsZW1lbnQgaW4gdGhlIGFweC5lbGVtZW50cyBhcnJheS5cclxuICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGFweCAtIEFuIGFycmF5IG9mIEhUTUxFbGVtZW50cyB3aGljaCBpcyByZXR1cm5lZCBieSBBUFgoKVxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBDYWxsIHRoZSB0cmlzdGF0ZSBmdW5jdGlvbiBvbiBhbiBhcnJheSBvZiBjaGVja2JveCBlbGVtZW50c1xyXG4gKiBhcHgudHJpc3RhdGUoKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIGFweC50cmlzdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pe1xyXG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdID0gY3JlYXRlVHJpU3RhdGVDaGVja2JveChlbGVtZW50LG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgLy9JZiB0aGVyZSBpcyBhIFwib3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXJcIiBjYWxsYmFjayBpbiBvcHRpb25zIGNhbGwgaXRcclxuICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyICYmIHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyKG9yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKGN1c3RvbUNoZWNrYm94LCBhY3R1YWxDaGVja2JveCwgaGlkZGVuSW5wdXQpIHtcclxuICAgIGlmIChjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkge1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKTtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XHJcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcclxuICAgIH0gZWxzZSBpZiAoY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJykpIHtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QucmVtb3ZlKCdjcm9zc2VkJyk7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xyXG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGFjdHVhbENoZWNrYm94LmRhdGFzZXQubmFtZSk7IC8vIFJlc3RvcmUgdGhlIG5hbWUgZm9yIHBvc3RpbmdcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIFxyXG4gICAgLy9nZXQgdGhlIGNoZWNrYm94IG1hcmdpbnMgaW5jbHVkaW5nIGJyb3dzZXIgZGVmYXVsdFxyXG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XHJcbiAgICAvLyBIaWRlIHRoZSBvcmlnaW5hbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gY2hlY2tib3ggZGl2IGFuZCBzZXQgaXRzIGluaXRpYWwgc3RhdGVcclxuICAgIGNvbnN0IHRyaXN0YXRlRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcclxuICAgIGlmIChvcHRpb25zLnNpemUpIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLndpZHRoKSB7XHJcbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLndpZHRoID0gb3B0aW9ucy5zaXplLndpZHRoICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5zaXplLmhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYob3B0aW9ucy5jbGFzc2VzKSB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKC4uLmNvbXB1dGVDbGFzc2VzKG9wdGlvbnMuY2xhc3NlcykpO1xyXG5cclxuICAgIHRyaXN0YXRlRG9tLnN0eWxlLm1hcmdpbiA9IGNoZWNrYm94U3R5bGUubWFyZ2luO1xyXG5cclxuICAgIGlmIChjaGVja2JveEVsZW1lbnQuY2hlY2tlZCkge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBoaWRkZW4gaW5wdXQgZmllbGRcclxuICAgIGNvbnN0IGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcclxuICAgIGhpZGRlbklucHV0Lm5hbWUgPSBjaGVja2JveEVsZW1lbnQubmFtZTsgLy8gQ29weSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LmRhdGFzZXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBTdG9yZSB0aGUgbmFtZSBpbiBhIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciB1c2VcclxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlKSBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcclxuICAgIGVsc2V7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgaGlkZGVuIGlucHV0IGJhc2VkIG9uIHRoZSBjaGVja2JveCdzIHN0YXRlXHJcbiAgICAgICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGhpZGRlbklucHV0Lm5hbWUgPSAnJzsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2hhbmRsZSBhY2Nlc3NpYmlsaXR5LCBzZXQgdGhlIHRhYmluZGV4IHRvIHRoZSBzYW1lIGFzIHRoZSBjaGVja2JveFxyXG4gICAgdHJpc3RhdGVEb20udGFiSW5kZXggPSBjaGVja2JveEVsZW1lbnQudGFiSW5kZXg7XHJcblxyXG4gICAgLy8gSW5zZXJ0IHRoZSBoaWRkZW4gaW5wdXQgaW5zaWRlIHRoZSBjdXN0b20gY2hlY2tib3ggZGl2XHJcbiAgICB0cmlzdGF0ZURvbS5hcHBlbmRDaGlsZChoaWRkZW5JbnB1dCk7XHJcblxyXG4gICAgLy8gSW5zZXJ0IGl0IG5leHQgdG8gdGhlIGFjdHVhbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG5cclxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lclxyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XHJcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBlKTtcclxuICAgIH0pO1xyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XHJcblxyXG4gICAgcmV0dXJuIFtjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpIHtcclxuICAgIC8vZm9yIGFsbCB2YWx1ZXMgcG9zc2libGUgZm9yIGRlZmF1bHRTdGF0ZSwgc2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjaGVja2JveFxyXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY2hlY2tlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCd1bmNoZWNrZWQnKTtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ3VuY2hlY2tlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY29tcHV0ZUNsYXNzZXMoY2xhc3Nlcykge1xyXG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xyXG4gICAgaWYodHlwZW9mIGNsYXNzZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy9yZXBsYWNlIG11bHRpcGxlIHdoaXRlIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmKGNsYXNzZXMuaW5kZXhPZignICcpID4gLTEpXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xyXG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29tcHV0ZWRDbGFzc2VzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGV2ZW50KSB7XHJcbiAgICAvL2lmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSBpcyBzZXQsIGNhbGwgaXRcclxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlKGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZighb3B0aW9ucy5idWJibGVFdmVudHMpIHJldHVybjtcclxuXHJcbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xyXG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXl1cCcsIHsga2V5OiAnICcsIGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xyXG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25rZXl1cChjaGVja2JveEVsZW1lbnQsIGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcclxuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBldmVudCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcclxuICAgIH1cclxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBhdWdtZW50V2l0aExpc3RlbiBmcm9tICcuL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMnO1xuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XG5pbXBvcnQgZGlhbG9nIGZyb20gJy4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyc7XG5pbXBvcnQgdG9hc3QgZnJvbSAnLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyc7XG5pbXBvcnQgeyBsb2FkQ3NzIH0gZnJvbSAnLi9tb2R1bGVzL2NvbW1vbi5tanMnO1xuaW1wb3J0IHsgYXVnbWVudFdpdGhQYWNrLCB0b29scyB9IGZyb20gJy4vbW9kdWxlcy90b29scy9leHBvcnRzLm1qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUFggb2JqZWN0IHRoYXQgd3JhcHMgb25lIG9yIG1vcmUgSFRNTCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fEhUTUxDb2xsZWN0aW9ufEFycmF5PEhUTUxFbGVtZW50PnxqUXVlcnl8RnVuY3Rpb259IGlucHV0IC0gVGhlIGlucHV0IHRvIGNyZWF0ZSB0aGUgQVBYIG9iamVjdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGlucHV0IHR5cGUgaXMgaW52YWxpZC5cbiAqIEBleGFtcGxlXG4gKiAvLyBYUGF0aFxuICogY29uc3QgYXB4MSA9IEFQWCgnLy9kaXZbQGNsYXNzPVwiZXhhbXBsZVwiXScpO1xuICpcbiAqIC8vIENTUyBzZWxlY3RvclxuICogY29uc3QgYXB4MiA9IEFQWCgnLmV4YW1wbGUnKTtcbiAqXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxuICogY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHgzID0gQVBYKGVsZW1lbnQpO1xuICpcbiAqIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBjb25zdCBub2RlTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcbiAqXG4gKiAvLyBBcnJheSBvZiBlbGVtZW50c1xuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcbiAqIGNvbnN0IGFweDUgPSBBUFgoZWxlbWVudHMpO1xuICpcbiAqIC8vIGpRdWVyeSBvYmplY3RcbiAqIGNvbnN0ICRleGFtcGxlID0gJCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDYgPSBBUFgoJGV4YW1wbGUpO1xuICpcbiAqIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0XG4gKiBjb25zdCBhcHg3ID0gQVBYKCgpID0+IEFQWCgnLmV4YW1wbGUnKSk7XG4gKi9cbmNvbnN0IEFQWCA9IGZ1bmN0aW9uIChpbnB1dCwgY29udGV4dCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IGVsZW1lbnRzO1xuXG4gICAgLy8gVmFsaWRhdGUgY29udGV4dFxuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFQWC5pc0FQWE9iamVjdChjb250ZXh0KSkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xuICAgIH0gZWxzZSBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgY29udGV4dCBpbnN0YW5jZW9mIERvY3VtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGV4dCBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5ldmFsdWF0ZShpbnB1dCwgY29udGV4dCwgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzID0gbm9kZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENTUyBzZWxlY3RvciB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQuY29udGFpbnMoaW5wdXQpID8gW2lucHV0XSA6IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dCkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGVsZW1lbnRzIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gaW5wdXQuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgLy8galF1ZXJ5IG9iamVjdCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQuZ2V0KCkpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3Qgd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQVBYKGlucHV0KCksIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0eXBlIGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICB2YXIgYXB4ID0ge1xuICAgICAgICBlbGVtZW50czogZWxlbWVudHMsXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxuICAgIH07XG4gICAgYXB4Lmxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLmVsZW1lbnRzLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgIH07XG4gICAgYXB4LmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KDApO1xuICAgIH07XG4gICAgYXVnbWVudFdpdGhMaXN0ZW4oYXB4KTtcbiAgICBhdWdtZW50V2l0aFRyaXN0YXRlKGFweCk7XG4gICAgYXVnbWVudFdpdGhQYWNrKGFweCk7XG4gICAgcmV0dXJuIGFweDtcbn07XG5cbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcbkFQWC5kaWFsb2cgPSBkaWFsb2c7XG5BUFgudG9hc3QgPSB0b2FzdDtcbkFQWC50b29scyA9IHRvb2xzO1xuQVBYLmlzQVBYT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9pc0FQWE9iamVjdCA9PT0gdHJ1ZTtcbn1cbkFQWC5pc19udW1lcmljID0gKG4pID0+IHtcbiAgICByZXR1cm4gIWlzTmFOKG4gLSBwYXJzZUZsb2F0KG4pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQVBYOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
4823
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxzRUFBaUI7QUFDckIsSUFBSSwwRUFBbUI7QUFDdkIsSUFBSSx3RkFBMEI7QUFDOUIsSUFBSSwyRUFBZTtBQUNuQjtBQUNBOztBQUVBLGNBQWMsd0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzPzkyZmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL0FQWC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIERpYWxvZyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAxMDAyO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XHJcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICAgIHBhZGRpbmc6IDQwcHg7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogYXV0bztcclxuICAgIG1pbi13aWR0aDogMzAwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDgwJTtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuXHJcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XHJcbiAgICBtYXJnaW4tdG9wOjA7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nIHtcclxuICAgIGNvbG9yOiAjYWFhO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgZm9udC1zaXplOiAyNHB4O1xyXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XHJcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cclxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxyXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XHJcbiAgICBjb2xvcjogIzMzMztcclxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdOmZvY3VzIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcclxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcclxuICAgIGNvbG9yOiAjRUNGMEYxO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XHJcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZ2FwOiAxMHB4O1xyXG4gICAgbWFyZ2luLXRvcDoxZW07XHJcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG59XHJcblxyXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xyXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcclxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cclxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcbn1cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xyXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFlBQVk7SUFDWixjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLDBDQUEwQztBQUM5Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsMkNBQTJDO0lBQzNDLGdEQUFnRDtBQUNwRDs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtBQUN2Qjs7QUFFQTs7SUFFSSxXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGVBQWU7QUFDbkI7O0FBRUEseUJBQXlCO0FBQ3pCOzs7O0lBSUksV0FBVztJQUNYLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixnREFBZ0Q7SUFDaEQsZUFBZTtJQUNmLHNCQUFzQjtJQUN0Qiw2QkFBNkI7QUFDakM7O0FBRUE7Ozs7SUFJSSxxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGFBQWE7QUFDakI7O0FBRUEseUJBQXlCO0FBQ3pCO0lBQ0ksa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsd0NBQXdDO0FBQzVDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5Q0FBeUM7QUFDN0M7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCw0QkFBNEI7QUFDaEM7O0FBRUEsc0JBQXNCO0FBQ3RCO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxXQUFXO0lBQ1gsWUFBWTtJQUNaLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLDZDQUE2QztBQUNqRDs7QUFFQTtJQUNJLEtBQUssdUJBQXVCLEVBQUU7SUFDOUIsT0FBTyx5QkFBeUIsRUFBRTtBQUN0QztBQUNBO0lBQ0ksWUFBWTtJQUNaLDhCQUE4QjtJQUM5QixvQ0FBb0MsRUFBRSxxQkFBcUI7SUFDM0QsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQ0FBb0MsRUFBRSx1QkFBdUI7SUFDN0QsMEJBQTBCO0FBQzlCOztBQUVBLHNDQUFzQztBQUN0QztJQUNJLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLG9DQUFvQztJQUNwQyx3QkFBd0I7QUFDNUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogRGlhbG9nIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZyB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgei1pbmRleDogMTAwMjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMDAlO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcclxcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xcclxcbiAgICBwYWRkaW5nOiA0MHB4O1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbiAgICBtYXgtd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuaDIuQVBYLWRpYWxvZy10aXRsZXtcXHJcXG4gICAgbWFyZ2luLXRvcDowO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZyB7XFxyXFxuICAgIGNvbG9yOiAjYWFhO1xcclxcbiAgICBmbG9hdDogcmlnaHQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjRweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XFxyXFxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXTpmb2N1cyB7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXFxyXFxuICAgIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIGNvbG9yOiAjRUNGMEYxO1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZ2FwOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOjFlbTtcXHJcXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgICBoZWlnaHQ6IDEwMHB4O1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICB3aWR0aDogNDBweDtcXHJcXG4gICAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xcclxcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcXHJcXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxcclxcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxcclxcbn1cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiAwLjU7XFxyXFxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXFxyXFxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiA1MCU7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogQVBYIFNjcm9sbGFibGUgVGFibGU6IHNjcm9sbGFibGUgdGJvZHkgd2l0aCBmaXhlZCB0aGVhZC90Zm9vdCBhbmQgYWxpZ25lZCBjb2x1bW5zIChDU1MgR3JpZCArIHN1YmdyaWQpXHJcbiAgIFVzZSAhaW1wb3J0YW50IHNvIHBhZ2Ugc3R5bGVzIChlLmcuIGRpc3BsYXk6IHRhYmxlKSBkbyBub3Qgb3ZlcnJpZGUgdGhlIGdyaWQgbGF5b3V0LiAqL1xyXG5cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zOiBzZXQgYnkgSlMgKG1lYXN1cmVkIHdpZHRocyArIGd1dHRlcik7IGZhbGxiYWNrID0gZXF1YWwgY29sdW1ucyArIGd1dHRlciAqL1xyXG4vKiAtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aDogc3BhY2UgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSBsYXN0IGNvbHVtbiAoc2V0IHRvIDAgdG8gYWxsb3cgb3ZlcmxhcCkgKi9cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB7XHJcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gdmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1yb3ctc2l6ZSwgZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpKSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xyXG4gICAgLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KTtcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBubyB0Zm9vdDogdGhlYWQgKyB0Ym9keSBvbmx5ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSkgYXV0bztcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBuZWl0aGVyIHRoZWFkIG5vciB0Zm9vdDogdGJvZHkgb25seSAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiAtLWFweC1zY3JvbGxhYmxlLSotdGVtcGxhdGUtcm93czogc2V0IGJ5IEpTIChtZWFzdXJlZCBoZWlnaHRzKSBvciBvdmVycmlkZSBpbiBDU1MgLyB2aWEgb3B0aW9ucyAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCxcclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcclxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbiAgICBtaW4taGVpZ2h0OiAwO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzLCAxKSwgYXV0bykpO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5ID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xyXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgdGQge1xyXG4gICAgbWluLXdpZHRoOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO3lGQUN5Rjs7QUFFekYsK0dBQStHO0FBQy9HLG1JQUFtSTtBQUNuSSx5SUFBeUk7QUFDekk7SUFDSSx3QkFBd0I7SUFDeEIsK01BQStNO0lBQy9NLDRIQUE0SDtJQUM1SCxXQUFXO0lBQ1gsOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksNEVBQTRFO0FBQ2hGOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLHVIQUF1SDtBQUMzSDs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSx1SEFBdUg7QUFDM0g7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksa0hBQWtIO0FBQ3RIOztBQUVBLG9HQUFvRztBQUNwRzs7O0lBR0ksd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdIQUFnSDtBQUNwSDs7QUFFQTtJQUNJLGdIQUFnSDtJQUNoSCxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0hBQWdIO0FBQ3BIOztBQUVBOzs7SUFHSSw0QkFBNEI7QUFDaEM7O0FBRUE7O0lBRUksWUFBWTtJQUNaLHNCQUFzQjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcXHJcXG4gICBVc2UgIWltcG9ydGFudCBzbyBwYWdlIHN0eWxlcyAoZS5nLiBkaXNwbGF5OiB0YWJsZSkgZG8gbm90IG92ZXJyaWRlIHRoZSBncmlkIGxheW91dC4gKi9cXHJcXG5cXHJcXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGg6IHNwYWNlIGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgc28gaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgbGFzdCBjb2x1bW4gKHNldCB0byAwIHRvIGFsbG93IG92ZXJsYXApICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcXHJcXG4gICAgZGlzcGxheTogZ3JpZCAhaW1wb3J0YW50O1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xcclxcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XFxyXFxufVxcclxcblxcclxcbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcclxcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcXHJcXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcXHJcXG4gICAgbWluLWhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCA+IHRyIHtcXHJcXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxyXFxuICAgIG1pbi13aWR0aDogMDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XHJcblxyXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcclxuY29uc3QgQ0xBU1NfVEFCTEUgPSAnYXB4LXNjcm9sbGFibGUtdGFibGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcclxuXHJcbmNvbnN0IFRIUk9UVExFX01TID0gMTY7XHJcblxyXG4vKiogQHR5cGUge1NldDxIVE1MVGFibGVFbGVtZW50Pn0gKi9cclxuY29uc3QgZHluYW1pY1RhYmxlcyA9IG5ldyBTZXQoKTtcclxuLyoqIEB0eXBlIHtNYXA8RWxlbWVudCwgU2V0PEhUTUxUYWJsZUVsZW1lbnQ+Pn0gKi9cclxuY29uc3Qgc2Nyb2xsU291cmNlVG9UYWJsZXMgPSBuZXcgTWFwKCk7XHJcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXHJcbmNvbnN0IHJlc2l6ZVNvdXJjZVRvVGFibGVzID0gbmV3IE1hcCgpO1xyXG4vKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbmxldCByZXNpemVXaW5kb3dBdHRhY2hlZCA9IGZhbHNlO1xyXG4vKiogQHR5cGUge1Jlc2l6ZU9ic2VydmVyfG51bGx9ICovXHJcbmxldCByZXNpemVPYnNlcnZlciA9IG51bGw7XHJcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG5sZXQgdGhyb3R0bGVMYXN0ID0gMDtcclxuLyoqIEB0eXBlIHtudW1iZXJ8bnVsbH0gKi9cclxubGV0IHRocm90dGxlUmFmID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBTdW0gb2YgY29sc3BhbnMgZm9yIG9uZSByb3cgKGRpcmVjdCB0aC90ZCBjaGlsZHJlbiBvZiB0cikuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlUm93RWxlbWVudH0gdHJcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFJvd0NvbHVtbkNvdW50KHRyKSB7XHJcbiAgICBsZXQgY29scyA9IDA7XHJcbiAgICB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcbiAgICAgICAgY29scyArPSBwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgbWF4aW11bSBjb2x1bW4gY291bnQgaW4gYSBzZWN0aW9uIChtYXggc3VtIG9mIGNvbHNwYW5zIGFjcm9zcyBhbGwgcm93cykuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb24gLSB0aGVhZCwgdGJvZHksIG9yIHRmb290XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHNlY3Rpb24pIHtcclxuICAgIGlmICghc2VjdGlvbikgcmV0dXJuIDA7XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgbGV0IG1heENvbHMgPSAwO1xyXG4gICAgcm93cy5mb3JFYWNoKCh0cikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1bSA9IGdldFJvd0NvbHVtbkNvdW50KHRyKTtcclxuICAgICAgICBpZiAoc3VtID4gbWF4Q29scykgbWF4Q29scyA9IHN1bTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1heENvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdG90YWwgY29sdW1uIGNvdW50IGZvciB0aGUgdGFibGUgKG1heCBhY3Jvc3MgdGhlYWQsIHRib2R5LCB0Zm9vdCkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuICAgIGNvbnN0IGNvdW50VGhlYWQgPSB0aGVhZCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGhlYWQpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGJvZHkgPSB0Ym9keSA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGJvZHkpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGZvb3QgPSB0Zm9vdCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGZvb3QpIDogMDtcclxuICAgIHJldHVybiBNYXRoLm1heChjb3VudFRoZWFkLCBjb3VudFRib2R5LCBjb3VudFRmb290LCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1lYXN1cmUgY3VycmVudCBjb2x1bW4gd2lkdGhzIGZyb20gdGhlIHRhYmxlIGluIGl0cyBuYXR1cmFsIGxheW91dCAoYmVmb3JlIGFwcGx5aW5nIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBQcmVmZXJzIGEgcm93IHdoZXJlIGVhY2ggY2VsbCBoYXMgY29sc3BhbiAxIHNvIHdlIGdldCBvbmUgd2lkdGggcGVyIGNvbHVtbjsgb3RoZXJ3aXNlIHNwbGl0cyBjZWxsIHdpZHRocyBieSBjb2xzcGFuLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlIC0gdGFibGUgbm90IHlldCB3aXRoIHNjcm9sbGFibGUgY2xhc3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge251bWJlcltdfSBwaXhlbCB3aWR0aHMgcGVyIGNvbHVtblxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykge1xyXG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbdGhlYWQsIHRib2R5XS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR8bnVsbH0gKi9cclxuICAgIGxldCBiZXN0Um93ID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCB0ciBvZiByb3dzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICAgICAgICAgIGlmIChnZXRSb3dDb2x1bW5Db3VudCh0cikgIT09IG51bUNvbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxTaW5nbGUgPSBBcnJheS5mcm9tKGNlbGxzKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSk7XHJcbiAgICAgICAgICAgIGlmIChhbGxTaW5nbGUgJiYgY2VsbHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBiZXN0Um93ID0gdHI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWJlc3RSb3cpIGJlc3RSb3cgPSB0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJlc3RSb3cgJiYgQXJyYXkuZnJvbShiZXN0Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgaWYgKCFiZXN0Um93KSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gbmV3IEFycmF5KG51bUNvbHMpLmZpbGwoMCk7XHJcbiAgICBjb25zdCBjZWxscyA9IGJlc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICBsZXQgY29sID0gMDtcclxuICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSwgbnVtQ29scyAtIGNvbCk7XHJcbiAgICAgICAgaWYgKHNwYW4gPD0gMCkgYnJlYWs7XHJcbiAgICAgICAgY29uc3QgdyA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICAgICAgY29uc3QgcGVyQ29sID0gdyAvIHNwYW47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFuOyBpKyspIHdpZHRoc1tjb2wgKyBpXSA9IHBlckNvbDtcclxuICAgICAgICBjb2wgKz0gc3BhbjtcclxuICAgIH1cclxuICAgIGlmIChjb2wgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGZhbGxiYWNrID0gd2lkdGhzLnNvbWUoKHcpID0+IHcgPiAwKSA/IE1hdGgubWF4KDgwLCAuLi53aWR0aHMuZmlsdGVyKCh3KSA9PiB3ID4gMCkpIC8gMiA6IDgwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIGlmICh3aWR0aHNbaV0gPD0gMCkgd2lkdGhzW2ldID0gZmFsbGJhY2s7XHJcbiAgICByZXR1cm4gd2lkdGhzLnNsaWNlKDAsIG51bUNvbHMpO1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnQgZGlyZWN0IHRyIGNoaWxkcmVuIGluIGEgc2VjdGlvbi5cclxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvblxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Um93Q291bnQoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gMDtcclxuICAgIHJldHVybiBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJykubGVuZ3RoO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgYSAyRCBncmlkIG9mIG9jY3VwaWVkIHNsb3RzIGZvciBhIHNlY3Rpb24gKGZvciByb3dzcGFuL2NvbHNwYW4gcGxhY2VtZW50KS5cclxuICogUGxhY2UgZWFjaCBjZWxsIGluIERPTSBvcmRlcjsgcmV0dXJuIGEgbGlzdCBvZiB7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0uXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IG51bVJvd3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge3sgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgY29sc3BhbjogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIgfVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIG51bVJvd3MsIG51bUNvbHMpIHtcclxuICAgIGlmICghc2VjdGlvbiB8fCBudW1Sb3dzID09PSAwIHx8IG51bUNvbHMgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IG9jY3VwaWVkID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtUm93cyB9LCAoKSA9PiBBcnJheShudW1Db2xzKS5maWxsKGZhbHNlKSk7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG5cclxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgIGNvbnN0IHRyID0gcm93c1tyXTtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjb25zdCBjb2xzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDEsIG51bUNvbHMpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSwgMTApIHx8IDEsIG51bVJvd3MgLSByKTtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb2wgPCBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW4gJiYgZnJlZTsgcnIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNjID0gY29sOyBjYyA8IGNvbCArIGNvbHNwYW4gJiYgZnJlZTsgY2MrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdPy5bY2NdKSBmcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZyZWUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY29sKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbCArIGNvbHNwYW4gPiBudW1Db2xzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcnIgPSByOyByciA8IHIgKyByb3dzcGFuOyBycisrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYyA9IGNvbDsgY2MgPCBjb2wgKyBjb2xzcGFuOyBjYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9jY3VwaWVkW3JyXSkgb2NjdXBpZWRbcnJdW2NjXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGxhY2VtZW50cy5wdXNoKHsgY2VsbCwgcm93OiByLCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBsYWNlbWVudHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBncmlkIHBsYWNlbWVudCBzdHlsZXMgdG8gYSBsaXN0IG9mIHBsYWNlbWVudHMgKDEtYmFzZWQgbGluZSBudW1iZXJzIGZvciBDU1MgR3JpZCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVBsYWNlbWVudHMocGxhY2VtZW50cykge1xyXG4gICAgcGxhY2VtZW50cy5mb3JFYWNoKCh7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0pID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSBgJHtyb3cgKyAxfSAvIHNwYW4gJHtyb3dzcGFufWA7XHJcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkQ29sdW1uID0gYCR7Y29sICsgMX0gLyBzcGFuICR7Y29sc3Bhbn1gO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGVhciBncmlkIHBsYWNlbWVudCBzdHlsZXMgZnJvbSBhbGwgdGgvdGQgaW4gYSB0YWJsZSAoZm9yIHJlZnJlc2gpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhclBsYWNlbWVudHModGFibGUpIHtcclxuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLCB0ZCcpLmZvckVhY2goKGNlbGwpID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSAnJztcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSAnJztcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIGhlaWdodC9tYXhIZWlnaHQgb3B0aW9uIHRvIGEgQ1NTIGxlbmd0aCBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBERUZBVUxUX01BWF9IRUlHSFQ7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBjdXJyZW50IGJvZHkgaGVpZ2h0IGZyb20gb3B0aW9uczogZWl0aGVyIGJvZHlIZWlnaHREeW5hbWljLmdldCh0YWJsZSkgb3Igc3RhdGljIGhlaWdodC9tYXhIZWlnaHQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKG1heSBpbmNsdWRlIGJvZHlIZWlnaHREeW5hbWljLCBoZWlnaHQsIG1heEhlaWdodClcclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcmV0dXJucyB7eyBib2R5U2l6ZTogc3RyaW5nLCB1c2VGaXhlZEhlaWdodDogYm9vbGVhbiB9fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZUJvZHlIZWlnaHQob3B0aW9ucywgdGFibGUpIHtcclxuICAgIGNvbnN0IGR5biA9IG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWM7XHJcbiAgICBpZiAoZHluICYmIHR5cGVvZiBkeW4uZ2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkeW4uZ2V0KHRhYmxlKTtcclxuICAgICAgICBjb25zdCBib2R5U2l6ZSA9IG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBkeW4udXNlQXMgPT09ICdoZWlnaHQnO1xyXG4gICAgICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBvcHRpb25zLmhlaWdodCAhPSBudWxsO1xyXG4gICAgY29uc3QgcmF3ID0gdXNlRml4ZWRIZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IG9wdGlvbnMubWF4SGVpZ2h0O1xyXG4gICAgY29uc3QgYm9keVNpemUgPSBub3JtYWxpemVIZWlnaHQocmF3KTtcclxuICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIG9ubHkgdGhlIHRib2R5IGhlaWdodCBDU1MgdmFyaWFibGUgYW5kIGNsYXNzICh1c2VkIG9uIHNjcm9sbC9yZXNpemUgZm9yIGR5bmFtaWMgaGVpZ2h0KS5cclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKHdpdGggcmVmLm9wdGlvbnMgd2hlbiBjYWxsZWQgZnJvbSB0aHJvdHRsZSlcclxuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlQm9keUhlaWdodCh0YWJsZSwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJ1biBsYXp5IGNsZWFudXAgdGhlbiB1cGRhdGVUYWJsZUJvZHlIZWlnaHQgZm9yIGFsbCB0YWJsZXMgc3RpbGwgaW4gZHluYW1pY1RhYmxlcy4gKENhbGxlZCBieSB0aHJvdHRsZWQgZW50cnkgcG9pbnQgb3IgUkFGLilcclxuICovXHJcbmZ1bmN0aW9uIGZsdXNoRHluYW1pY0hlaWdodFVwZGF0ZSgpIHtcclxuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICBkeW5hbWljVGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0YWJsZS5pc0Nvbm5lY3RlZCkgdG9SZW1vdmUucHVzaCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIHRvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSkpO1xyXG4gICAgZHluYW1pY1RhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcclxuICAgICAgICBpZiAocmVmPy5vcHRpb25zKSB1cGRhdGVUYWJsZUJvZHlIZWlnaHQodGFibGUsIHJlZi5vcHRpb25zKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogVGhyb3R0bGVkIGVudHJ5OiBydW4gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlIG5vdyBvciBzY2hlZHVsZSB3aXRoIFJBRi5cclxuICovXHJcbmZ1bmN0aW9uIHJ1bkR5bmFtaWNIZWlnaHRVcGRhdGUoKSB7XHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgaWYgKG5vdyAtIHRocm90dGxlTGFzdCA8IFRIUk9UVExFX01TKSB7XHJcbiAgICAgICAgaWYgKCF0aHJvdHRsZVJhZikge1xyXG4gICAgICAgICAgICB0aHJvdHRsZVJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZVJhZiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZUxhc3QgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aHJvdHRsZUxhc3QgPSBub3c7XHJcbiAgICBmbHVzaER5bmFtaWNIZWlnaHRVcGRhdGUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgdXBkYXRlT24gaW50byBzY3JvbGwgdGFyZ2V0cyAoRWxlbWVudFtdKSBhbmQgcmVzaXplOiB7IHdpbmRvdzogYm9vbGVhbiwgZWxlbWVudHM6IEVsZW1lbnRbXSB9LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWMudXBkYXRlT25cclxuICogQHJldHVybnMge3sgc2Nyb2xsVGFyZ2V0czogRWxlbWVudFtdLCByZXNpemVXaW5kb3c6IGJvb2xlYW4sIHJlc2l6ZUVsZW1lbnRzOiBFbGVtZW50W10gfX1cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVVcGRhdGVPbihvcHRpb25zKSB7XHJcbiAgICBjb25zdCB1ID0gb3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWM/LnVwZGF0ZU9uO1xyXG4gICAgY29uc3Qgc2Nyb2xsT24gPSB1Py5zY3JvbGxPbjtcclxuICAgIGNvbnN0IHJlc2l6ZU9uID0gdT8ucmVzaXplT247XHJcbiAgICBjb25zdCBzY3JvbGxUYXJnZXRzID0gW107XHJcbiAgICBpZiAoc2Nyb2xsT24gIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHNjcm9sbE9uKSAmJiBzY3JvbGxPbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2Nyb2xsT24uZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2RvY3VtZW50Jykgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHggJiYgdHlwZW9mIHguYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgc2Nyb2xsVGFyZ2V0cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5zY3JvbGwgPT09IHRydWUpIHtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2goZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2godHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc2l6ZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzaXplRWxlbWVudHMgPSBbXTtcclxuICAgIGlmIChyZXNpemVPbiAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzaXplT24pICYmIHJlc2l6ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXNpemVPbi5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4ID09PSAnd2luZG93JykgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXNpemVFbGVtZW50cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5yZXNpemUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICByZXNpemVFbGVtZW50cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGFibGUgZnJvbSBkeW5hbWljVGFibGVzIGFuZCBmcm9tIGFsbCBzY3JvbGwvcmVzaXplIE1hcHM7IGRldGFjaCBsaXN0ZW5lcnMgaWYgU2V0IGJlY29tZXMgZW1wdHkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICovXHJcbmZ1bmN0aW9uIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKSB7XHJcbiAgICBkeW5hbWljVGFibGVzLmRlbGV0ZSh0YWJsZSk7XHJcbiAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XHJcbiAgICAgICAgc2V0LmRlbGV0ZSh0YWJsZSk7XHJcbiAgICAgICAgaWYgKHNldC5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XHJcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsVGhyb3R0bGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLmZvckVhY2goKHNldCwgZWwpID0+IHtcclxuICAgICAgICBzZXQuZGVsZXRlKHRhYmxlKTtcclxuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgcmVzaXplU291cmNlVG9UYWJsZXMuZGVsZXRlKGVsKTtcclxuICAgICAgICAgICAgaWYgKHJlc2l6ZU9ic2VydmVyKSByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHJlc2l6ZVdpbmRvd0F0dGFjaGVkICYmIGR5bmFtaWNUYWJsZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZVRocm90dGxlZCk7XHJcbiAgICAgICAgcmVzaXplV2luZG93QXR0YWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25TY3JvbGxUaHJvdHRsZWQoKSB7XHJcbiAgICBydW5EeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9uUmVzaXplVGhyb3R0bGVkKCkge1xyXG4gICAgcnVuRHluYW1pY0hlaWdodFVwZGF0ZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnaXN0ZXIgYSB0YWJsZSB3aXRoIGJvZHlIZWlnaHREeW5hbWljOiBhZGQgdG8gU2V0IGFuZCBhdHRhY2ggc2Nyb2xsL3Jlc2l6ZSBsaXN0ZW5lcnMgcGVyIHVwZGF0ZU9uLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZnVsbCBvcHRpb25zIChyZWYub3B0aW9ucylcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB7IHNjcm9sbFRhcmdldHMsIHJlc2l6ZVdpbmRvdywgcmVzaXplRWxlbWVudHMgfSA9IHJlc29sdmVVcGRhdGVPbihvcHRpb25zKTtcclxuICAgIGR5bmFtaWNUYWJsZXMuYWRkKHRhYmxlKTtcclxuICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gc2Nyb2xsU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGxUaHJvdHRsZWQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChyZXNpemVXaW5kb3cpIHtcclxuICAgICAgICBpZiAoIXJlc2l6ZVdpbmRvd0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgIHJlc2l6ZVdpbmRvd0F0dGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplVGhyb3R0bGVkLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVzaXplRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gcmVzaXplU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgaWYgKCFyZXNpemVPYnNlcnZlcikgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemVUaHJvdHRsZWQpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBmcm9tIG1lYXN1cmVkIHdpZHRocyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciBjb2x1bW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Db2xzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IGNvbHVtbldpZHRoc1xyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBjb2x1bW5PdmVycmlkZXMgLSBtYXAgY29sdW1uIGluZGV4IOKGkiBDU1MgdmFsdWUgKGUuZy4gJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZUNvbHVtbnMobnVtQ29scywgY29sdW1uV2lkdGhzLCBjb2x1bW5PdmVycmlkZXMpIHtcclxuICAgIGlmICghY29sdW1uV2lkdGhzIHx8IGNvbHVtbldpZHRocy5sZW5ndGggIT09IG51bUNvbHMpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGdldCA9IChpKSA9PlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29sdW1uT3ZlcnJpZGVzKSA/IGNvbHVtbk92ZXJyaWRlc1tpXSA6IGNvbHVtbk92ZXJyaWRlc1tpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKGNvbHVtbldpZHRoc1tpXSl9ZnJgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgZ3JpZC10ZW1wbGF0ZS1yb3dzIGZyb20gbWVhc3VyZWQgaGVpZ2h0cyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciByb3cuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Sb3dzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHJvd0hlaWdodHNcclxuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gcm93T3ZlcnJpZGVzIC0gbWFwIHJvdyBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICc0OHB4JywgJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZVJvd3MobnVtUm93cywgcm93SGVpZ2h0cywgcm93T3ZlcnJpZGVzKSB7XHJcbiAgICBpZiAoIXJvd0hlaWdodHMgfHwgcm93SGVpZ2h0cy5sZW5ndGggPCBudW1Sb3dzKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCBnZXQgPSAoaSkgPT5cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJvd092ZXJyaWRlcykgPyByb3dPdmVycmlkZXNbaV0gOiByb3dPdmVycmlkZXM/LltpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJvd3M7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKHJvd0hlaWdodHNbaV0gPz8gMCl9cHhgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogTWVhc3VyZSBlYWNoIHRyIGhlaWdodCBpbiBhIHNlY3Rpb24gKHRhYmxlIG11c3Qgbm90IHlldCBoYXZlIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fG51bGx9IHNlY3Rpb25cclxuICogQHJldHVybnMge251bWJlcltdfVxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZVJvd0hlaWdodHMoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm93cykubWFwKCh0cikgPT4gdHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHNjcm9sbGFibGUgdGFibGUgbGF5b3V0IHRvIGEgc2luZ2xlIHRhYmxlLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnNcclxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbb3B0aW9ucy5tYXhIZWlnaHRdIC0gTWF4IGhlaWdodCBvZiB0Ym9keSAoZGVmYXVsdCAnMjAwcHgnKS4gSWdub3JlZCB3aGVuIGhlaWdodCBvciBib2R5SGVpZ2h0RHluYW1pYyBpcyBzZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaGVpZ2h0XSAtIEZpeGVkIGhlaWdodCBvZiB0Ym9keS4gSWdub3JlZCB3aGVuIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cclxuICogQHBhcmFtIHt7IGdldDogKGZ1bmN0aW9uKEhUTUxUYWJsZUVsZW1lbnQpOiBudW1iZXJ8c3RyaW5nKSwgdXNlQXM6ICdoZWlnaHQnfCdtYXhIZWlnaHQnLCB1cGRhdGVPbj86IHsgc2Nyb2xsPzogYm9vbGVhbiwgcmVzaXplPzogYm9vbGVhbiwgc2Nyb2xsT24/OiAoJ2RvY3VtZW50J3xFbGVtZW50KVtdLCByZXNpemVPbj86ICgnd2luZG93J3xFbGVtZW50KVtdIH0gfX0gW29wdGlvbnMuYm9keUhlaWdodER5bmFtaWNdIC0gV2hlbiBzZXQsIGJvZHkgc2l6ZSBpcyBjb21wdXRlZCBieSBnZXQodGFibGUpIGFuZCByZS1hcHBsaWVkIHdoZW4gc2Nyb2xsL3Jlc2l6ZSBzb3VyY2VzIGZpcmUuIHVwZGF0ZU9uOiBzY3JvbGxPbi9yZXNpemVPbiBsaXN0IGVsZW1lbnRzIChzZW50aW5lbHMgJ2RvY3VtZW50Jy8nd2luZG93Jyk7IG9yIHVzZSBzY3JvbGwgKGRlZmF1bHQgZmFsc2UpIC8gcmVzaXplIChkZWZhdWx0IHRydWUpIGJvb2xlYW5zLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1uc11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogc3RyaW5nLCB0Ym9keT86IHN0cmluZywgdGZvb3Q/OiBzdHJpbmcgfX0gW29wdGlvbnMuZ3JpZFRlbXBsYXRlUm93c11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRib2R5PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRmb290PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10gfX0gW29wdGlvbnMucm93T3ZlcnJpZGVzXVxyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBbb3B0aW9ucy5jb2x1bW5PdmVycmlkZXNdXHJcbiAqIEBwYXJhbSB7eyBjb2x1bW5XaWR0aHM/OiBudW1iZXJbXSwgcm93SGVpZ2h0cz86IHsgdGhlYWQ/OiBudW1iZXJbXSwgdGJvZHk/OiBudW1iZXJbXSwgdGZvb3Q/OiBudW1iZXJbXSB9IH0gfCB1bmRlZmluZWR9IHJlZiAtIGV4aXN0aW5nIHJlZiB3aGVuIHJlZnJlc2hpbmdcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCByZWYpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuXHJcbiAgICBjb25zdCBudW1Db2xzID0gZ2V0VGFibGVDb2x1bW5Db3VudCh0YWJsZSk7XHJcbiAgICBpZiAobnVtQ29scyA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFscmVhZHlTY3JvbGxhYmxlID0gdGFibGUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX1RBQkxFKTtcclxuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdHlwZW9mIG9wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKS5sZW5ndGggPiAwO1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzID0gY3VzdG9tVGVtcGxhdGVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IChyZWY/LmNvbHVtbldpZHRocyA/PyAoYWxyZWFkeVNjcm9sbGFibGUgPyBudWxsIDogbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykpKTtcclxuXHJcbiAgICBjb25zdCB0aGVhZFJvd3MgPSBnZXRSb3dDb3VudCh0aGVhZCk7XHJcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XHJcbiAgICBjb25zdCB0Zm9vdFJvd3MgPSBnZXRSb3dDb3VudCh0Zm9vdCk7XHJcblxyXG4gICAgY29uc3Qgcm93SGVpZ2h0cyA9XHJcbiAgICAgICAgcmVmPy5yb3dIZWlnaHRzID8/XHJcbiAgICAgICAgKGFscmVhZHlTY3JvbGxhYmxlXHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IHtcclxuICAgICAgICAgICAgICAgICAgdGhlYWQ6IG1lYXN1cmVSb3dIZWlnaHRzKHRoZWFkKSxcclxuICAgICAgICAgICAgICAgICAgdGJvZHk6IG1lYXN1cmVSb3dIZWlnaHRzKHRib2R5KSxcclxuICAgICAgICAgICAgICAgICAgdGZvb3Q6IG1lYXN1cmVSb3dIZWlnaHRzKHRmb290KVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWNvbHMnLCBTdHJpbmcobnVtQ29scykpO1xyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGhlYWQtcm93cycsIFN0cmluZyhNYXRoLm1heCgxLCB0aGVhZFJvd3MpKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRib2R5Um93cykpKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MnLCBTdHJpbmcoTWF0aC5tYXgoMSwgdGZvb3RSb3dzKSkpO1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxuXHJcbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QnLCAhISh0Zm9vdCAmJiB0Zm9vdFJvd3MgPiAwKSk7XHJcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQnLCAhKHRoZWFkICYmIHRoZWFkUm93cyA+IDApKTtcclxuXHJcbiAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGdyaWQgbGF5b3V0IGlzIGVzdGFibGlzaGVkIGJlZm9yZSBzZXR0aW5nIG1lYXN1cmVkIHRlbXBsYXRlLWNvbHVtbnMuXHJcbiAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBicm93c2VyIGJhdGNoZXMgY2xhc3MgKyB0ZW1wbGF0ZSBpbnRvIG9uZSBwYXNzIGFuZCB0aGUgdGJvZHkgb3ZlcmZsb3dzIGhvcml6b250YWxseS5cclxuICAgIHRhYmxlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuXHJcbiAgICBjb25zdCBndXR0ZXJTdWZmaXggPSAnIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSc7XHJcbiAgICBpZiAoY3VzdG9tVGVtcGxhdGUpIHtcclxuICAgICAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zJywgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKSArIGd1dHRlclN1ZmZpeCk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbHVtbldpZHRocyAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICAgICAgICBvcHRpb25zLmNvbHVtbk92ZXJyaWRlcyAhPSBudWxsXHJcbiAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgb3B0aW9ucy5jb2x1bW5PdmVycmlkZXMpXHJcbiAgICAgICAgICAgICAgICA6IGNvbHVtbldpZHRocy5tYXAoKHcpID0+IGAke01hdGgucm91bmQodyl9ZnJgKS5qb2luKCcgJyk7XHJcbiAgICAgICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycsIHRlbXBsYXRlICsgZ3V0dGVyU3VmZml4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFibGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUGxhY2VtZW50cyh0YWJsZSk7XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbXHJcbiAgICAgICAgeyBzZWN0aW9uOiB0aGVhZCwgcm93czogTWF0aC5tYXgoMSwgdGhlYWRSb3dzKSwgaGVpZ2h0czogcm93SGVpZ2h0cz8udGhlYWQsIGtleTogJ3RoZWFkJyB9LFxyXG4gICAgICAgIHsgc2VjdGlvbjogdGJvZHksIHJvd3M6IE1hdGgubWF4KDEsIHRib2R5Um93cyksIGhlaWdodHM6IHJvd0hlaWdodHM/LnRib2R5LCBrZXk6ICd0Ym9keScgfSxcclxuICAgICAgICB7IHNlY3Rpb246IHRmb290LCByb3dzOiBNYXRoLm1heCgxLCB0Zm9vdFJvd3MpLCBoZWlnaHRzOiByb3dIZWlnaHRzPy50Zm9vdCwga2V5OiAndGZvb3QnIH1cclxuICAgIF07XHJcbiAgICBjb25zdCBjdXN0b21Sb3dzID0gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzICYmIHR5cGVvZiBvcHRpb25zLmdyaWRUZW1wbGF0ZVJvd3MgPT09ICdvYmplY3QnID8gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzIDogbnVsbDtcclxuICAgIGNvbnN0IHJvd092ZXJyaWRlcyA9IG9wdGlvbnMucm93T3ZlcnJpZGVzICYmIHR5cGVvZiBvcHRpb25zLnJvd092ZXJyaWRlcyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLnJvd092ZXJyaWRlcyA6IG51bGw7XHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKCh7IHNlY3Rpb24sIHJvd3MsIGhlaWdodHMsIGtleSB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCFzZWN0aW9uKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdmFyTmFtZSA9IGAtLWFweC1zY3JvbGxhYmxlLSR7a2V5fS10ZW1wbGF0ZS1yb3dzYDtcclxuICAgICAgICBjb25zdCBjdXN0b20gPSBjdXN0b21Sb3dzPy5ba2V5XTtcclxuICAgICAgICBjb25zdCBvdmVycmlkZXMgPSByb3dPdmVycmlkZXM/LltrZXldO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tID09PSAnc3RyaW5nJyAmJiBjdXN0b20udHJpbSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCBjdXN0b20udHJpbSgpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGhlaWdodHMgJiYgaGVpZ2h0cy5sZW5ndGggPj0gcm93cykge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9XHJcbiAgICAgICAgICAgICAgICBvdmVycmlkZXMgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgID8gYnVpbGRUZW1wbGF0ZVJvd3Mocm93cywgaGVpZ2h0cy5zbGljZSgwLCByb3dzKSwgb3ZlcnJpZGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIDogaGVpZ2h0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCByb3dzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGgpID0+IGAke01hdGgucm91bmQoaCl9cHhgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUucmVtb3ZlUHJvcGVydHkodmFyTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgcm93cywgbnVtQ29scyk7XHJcbiAgICAgICAgYXBwbHlQbGFjZW1lbnRzKHBsYWNlbWVudHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uV2lkdGhzLCByb3dIZWlnaHRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBdWdtZW50cyB0aGUgQVBYIG9iamVjdCB3aXRoIHNjcm9sbGFibGVUYWJsZShvcHRpb25zIHwgJ3JlZnJlc2gnKS5cclxuICogTWFrZXMgdGhlIHRib2R5IG9mIGEgdGFibGUgc2Nyb2xsYWJsZSB3aGlsZSBrZWVwaW5nIHRoZWFkL3Rmb290IGZpeGVkIGFuZCBjb2x1bW5zIGFsaWduZWQgKENTUyBHcmlkICsgc3ViZ3JpZCkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcHggLSBUaGUgQVBYIG9iamVjdCB0byBhdWdtZW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSh7IG1heEhlaWdodDogMzAwIH0pO1xyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSgncmVmcmVzaCcpO1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUoYXB4KSB7XHJcbiAgICBhcHguc2Nyb2xsYWJsZVRhYmxlID0gZnVuY3Rpb24gKG9wdGlvbnNPckFjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaCA9IG9wdGlvbnNPckFjdGlvbiA9PT0gJ3JlZnJlc2gnO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpc1JlZnJlc2ggPyBudWxsIDogKG9wdGlvbnNPckFjdGlvbiAmJiB0eXBlb2Ygb3B0aW9uc09yQWN0aW9uID09PSAnb2JqZWN0JyA/IG9wdGlvbnNPckFjdGlvbiA6IHt9KTtcclxuXHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gJ1RBQkxFJykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IC8qKiBAdHlwZSB7SFRNTFRhYmxlRWxlbWVudH0gKi8gKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVmID0gdGFibGVbREFUQV9LRVldO1xyXG4gICAgICAgICAgICBpZiAocmVmKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIHJlZi5vcHRpb25zLCByZWYpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZWYub3B0aW9ucyA9IHsgLi4ucmVmLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhcHBseVNjcm9sbGFibGVUYWJsZSh0YWJsZSwgcmVmLm9wdGlvbnMsIHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uY29sdW1uV2lkdGhzKSByZWYuY29sdW1uV2lkdGhzID0gcmVzdWx0LmNvbHVtbldpZHRocztcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5yb3dIZWlnaHRzKSByZWYucm93SGVpZ2h0cyA9IHJlc3VsdC5yb3dIZWlnaHRzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZWYub3B0aW9ucztcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBjdXJyZW50T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0FQWCBzY3JvbGxhYmxlVGFibGVdIGNyZWF0ZScsIHRhYmxlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIG9wdGlvbnMsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIHRhYmxlW0RBVEFfS0VZXSA9IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9LFxyXG4gICAgICAgICAgICAgICAgY29sdW1uV2lkdGhzOiByZXN1bHQ/LmNvbHVtbldpZHRocyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICByb3dIZWlnaHRzOiByZXN1bHQ/LnJvd0hlaWdodHMgfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5ib2R5SGVpZ2h0RHluYW1pYykgcmVnaXN0ZXJEeW5hbWljVGFibGUodGFibGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYXB4O1xyXG4gICAgfTtcclxufVxyXG4iLCIvLyBNaW5pbWFsLCBmcmFtZXdvcmstYWdub3N0aWMgVG9hc3RNYW5hZ2VyIGZvciBBUFhcclxuLy8gRVNNLWZpcnN0LCBubyBzaWRlIGVmZmVjdHMgb24gaW1wb3J0LiBET00gb25seSB3aGVuIHVzZWQuXHJcbmltcG9ydCAnLi9jc3MvdG9hc3QuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3NpdGlvbk9iamVjdFxyXG4gKiBAcHJvcGVydHkgeydzdGlja3knfCdyZWxhdGl2ZSd8J2FuY2hvcmVkJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt5XVxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBbZWxlbWVudF1cclxuICogQHByb3BlcnR5IHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnYWJvdmUnfCdiZWxvdyd8J2JlZm9yZSd8J2FmdGVyJ30gW3BsYWNlbWVudF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZU5hdGl2ZUNTU11cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3N0cmluZ3xQb3NpdGlvbk9iamVjdH0gUG9zaXRpb25cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RDb25maWdcclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhUb2FzdHNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVmYXVsdER1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbekluZGV4XVxyXG4gKiBAcHJvcGVydHkgeydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBbYXJpYUxpdmVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWR1cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29udGFpbmVyQ2xhc3NdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfX0gW3Byb2dyZXNzXSBEZWZhdWx0OiBmYWxzZS4gU2hvdyBwcm9ncmVzcyBiYXIgd2hlbiB0cnVlIG9yIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScgfS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3tlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b246IGJvb2xlYW59fSBQcm9ncmVzc09wdFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdE9wdGlvbnNcclxuICogQHByb3BlcnR5IHtzdHJpbmd8Tm9kZX0gbWVzc2FnZVxyXG4gKiBAcHJvcGVydHkgeydpbmZvJ3wnc3VjY2Vzcyd8J3dhcm5pbmcnfCdkYW5nZXInfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzaWJsZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWR9IFtvbkNsaWNrXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCByZWFzb246ICd0aW1lb3V0J3wnY2xvc2UnfCdhcGknfCdvdmVyZmxvdycpID0+IHZvaWR9IFtvbkNsb3NlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b24/OiBib29sZWFufX0gW3Byb2dyZXNzXSBTaG93IHByb2dyZXNzIGJhcjogdHJ1ZSA9IHRvcCwgb3IgeyBlbmFibGUsIHBvc2l0aW9uLCBwYXVzZUJ1dHRvbiB9IChwYXVzZUJ1dHRvbiBkZWZhdWx0IGZhbHNlKS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RSZWZcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86ICdhcGknfCdjbG9zZScpID0+IHZvaWR9IGNsb3NlXHJcbiAqIEBwcm9wZXJ0eSB7KHBhcnRpYWw6IFBhcnRpYWw8VG9hc3RPcHRpb25zPikgPT4gdm9pZH0gdXBkYXRlXHJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2hlbkNsb3NlZFxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gKCkgPT4gdm9pZH0gb25cclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWR9IG9mZlxyXG4gKi9cclxuXHJcbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XHJcblxyXG4vLyBTaGFyZWQgY29udGFpbmVyIGNhY2hlOiBNYXA8cG9zaXRpb24sIEhUTUxFbGVtZW50PlxyXG4vLyBDb250YWluZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBtYW5hZ2VycyB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uXHJcbmNvbnN0IF9jb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEdhcmJhZ2UgY29sbGVjdGlvbjogY2xlYW51cCBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVycyBhZnRlciBhIGRlbGF5XHJcbmNvbnN0IEdDX0RFTEFZX01TID0gMjAwMDA7IC8vIDIwIHNlY29uZHNcclxubGV0IF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcblxyXG4vLyBXcmFwcGVyIGZvciBhbGwgdG9hc3QgY29udGFpbmVycyAoa2VlcHMgRE9NIGNsZWFuKVxyXG5sZXQgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogR2V0IG9yIGNyZWF0ZSB0aGUgdG9hc3QgY29udGFpbmVycyB3cmFwcGVyXHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VG9hc3RXcmFwcGVyKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLndpZHRoID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnpJbmRleCA9ICcxMDAwMCc7IC8vIEJlbG93IGNvbnRhaW5lcnMgYnV0IGFib3ZlIG1vc3QgY29udGVudFxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF90b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIF90b2FzdFdyYXBwZXI7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xyXG4gICAgcG9zaXRpb246ICdib3R0b20tcmlnaHQnLFxyXG4gICAgbWF4VG9hc3RzOiA1LFxyXG4gICAgZGVmYXVsdER1cmF0aW9uTXM6IDUwMDAsXHJcbiAgICB6SW5kZXg6IDExMDAwLFxyXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxyXG4gICAgZ2FwOiA4LFxyXG4gICAgZGVkdXBlOiBmYWxzZSxcclxuICAgIGNvbnRhaW5lckNsYXNzOiAnJyxcclxuICAgIG9mZnNldDogMCxcclxuICAgIHByb2dyZXNzOiBmYWxzZVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBlbGVtZW50IHdpdGggY2xhc3Nlc1xyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlRWwodGFnLCBjbGFzc05hbWVzKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcclxuICAgIGlmIChjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgY2xhc3NOYW1lcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGMgPT4gZWwuY2xhc3NMaXN0LmFkZChjKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWw7XHJcbn1cclxuXHJcbi8qKiBNaW5pbWFsIGxpbmUtYmFzZWQgcGF1c2UgKHR3byBiYXJzKSAvIHJlc3VtZSAodHJpYW5nbGUgcmlnaHQpIGljb24gU1ZHLiBVc2VzIGN1cnJlbnRDb2xvci4gKi9cclxuZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcocGF1c2VkKSB7XHJcbiAgICBpZiAocGF1c2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk04IDZMOCAxOEwxNyAxMlpcIi8+PC9zdmc+YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxsaW5lIHgxPVwiOVwiIHkxPVwiNlwiIHgyPVwiOVwiIHkyPVwiMThcIi8+PGxpbmUgeDE9XCIxNVwiIHkxPVwiNlwiIHgyPVwiMTVcIiB5Mj1cIjE4XCIvPjwvc3ZnPmA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW5kIGluc2VydCBwcm9ncmVzcyBibG9jayAodHJhY2sgKyBiYXIsIG9wdGlvbmFsIHBhdXNlIGJ1dHRvbikgaW50byB0b2FzdC4gQnV0dG9uIGlzIGZpeGVkIGF0IGxlZnQgdmlhIHRyYWNrIGxheW91dC5cclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0ge1Byb2dyZXNzT3B0fSBwcm9ncmVzc09wdFxyXG4gKiBAcmV0dXJucyB7eyB3cmFwOiBIVE1MRWxlbWVudCwgYmFyOiBIVE1MRWxlbWVudCwgcGF1c2VCdG46IEhUTUxFbGVtZW50fG51bGwgfX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgcHJvZ3Jlc3NPcHQpIHtcclxuICAgIGNvbnN0IHBvcyA9IHByb2dyZXNzT3B0LnBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2hvd1BhdXNlQnV0dG9uID0gcHJvZ3Jlc3NPcHQucGF1c2VCdXR0b24gPT09IHRydWU7XHJcbiAgICBjb25zdCB3cmFwID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3RfX3Byb2dyZXNzIEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdHJhY2sgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2snKTtcclxuICAgIGNvbnN0IGJhciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1iYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJvZ3Jlc3NiYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCAnMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsICcxMDAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVGVtcHMgcmVzdGFudCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgIGJhci5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7XHJcbiAgICB3cmFwLmFwcGVuZENoaWxkKHRyYWNrKTtcclxuICAgIGxldCBwYXVzZUJ0biA9IG51bGw7XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB7XHJcbiAgICAgICAgcGF1c2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCd0aXRsZScsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKGZhbHNlKTsgLy8gcnVubmluZyA9IHNob3cgcGF1c2UgaWNvblxyXG4gICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKHBhdXNlQnRuLCB0cmFjayk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zID09PSAndG9wJykge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNvbnRlbnRFbCk7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY2xvc2VCdG4pO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICByZXR1cm4geyB3cmFwLCBiYXIsIHBhdXNlQnRuIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgcHJvZ3Jlc3MgYmxvY2sgcG9zaXRpb24gKGNsYXNzZXMgKyBET00gb3JkZXIpXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcHJvZ3Jlc3NXcmFwXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7J3RvcCd8J2JvdHRvbSd9IHBvc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgcG9zKSB7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcsICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChwb3MgPT09ICd0b3AnID8gJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcgOiAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0X19wcm9ncmVzcy0tdG9wJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcG9zID09PSAndG9wJyA/IGNvbnRlbnRFbCA6IGNsb3NlQnRuO1xyXG4gICAgaWYgKHByb2dyZXNzV3JhcC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IHRhcmdldCkgdG9hc3RFbC5pbnNlcnRCZWZvcmUocHJvZ3Jlc3NXcmFwLCB0YXJnZXQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBwcm9ncmVzcyBvcHRpb24gZnJvbSBwZXItY2FsbCBvcHRpb24gYW5kIGNvbmZpZyBkZWZhdWx0XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gb3B0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gY29uZmlnRGVmYXVsdFxyXG4gKiBAcmV0dXJucyB7UHJvZ3Jlc3NPcHR9XHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvZ3Jlc3Mob3B0aW9uLCBjb25maWdEZWZhdWx0KSB7XHJcbiAgICBjb25zdCBmcm9tQ29uZmlnID0gY29uZmlnRGVmYXVsdCA9PT0gdHJ1ZVxyXG4gICAgICAgID8geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH1cclxuICAgICAgICA6IChjb25maWdEZWZhdWx0ICYmIHR5cGVvZiBjb25maWdEZWZhdWx0ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZTogISFjb25maWdEZWZhdWx0LmVuYWJsZSxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBjb25maWdEZWZhdWx0LnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICBwYXVzZUJ1dHRvbjogY29uZmlnRGVmYXVsdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogeyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9KTtcclxuICAgIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRpb24gPT09IG51bGwpIHJldHVybiBmcm9tQ29uZmlnO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZW5hYmxlOiAhIW9wdGlvbi5lbmFibGUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb24ucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgcGF1c2VCdXR0b246IG9wdGlvbi5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyB0byBDU1MgdmFsdWVzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZW1lbnRcclxuICogQHJldHVybnMgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGxhY2VtZW50KHBsYWNlbWVudCkge1xyXG4gICAgY29uc3Qgc3lub255bXMgPSB7XHJcbiAgICAgICAgJ2Fib3ZlJzogJ3RvcCcsXHJcbiAgICAgICAgJ2JlbG93JzogJ2JvdHRvbScsXHJcbiAgICAgICAgJ2JlZm9yZSc6ICdsZWZ0JyxcclxuICAgICAgICAnYWZ0ZXInOiAncmlnaHQnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bm9ueW1zW3BsYWNlbWVudF0gfHwgcGxhY2VtZW50O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGZsb3cgZGlyZWN0aW9uIGJhc2VkIG9uIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHsndXAnfCdkb3duJ31cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZUZsb3cocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uczogdG9wID0gdXAsIGJvdHRvbSA9IGRvd25cclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpKSByZXR1cm4gJ3VwJztcclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAvLyBTdGlja3k6IGRldGVybWluZSBiYXNlZCBvbiB5IGNvb3JkaW5hdGVcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBzdGFydHMgd2l0aCAnLScgb3IgaXMgYSBzbWFsbCB2YWx1ZSwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IGlzIGEgbGFyZ2UgdmFsdWUgb3IgcGVyY2VudGFnZSwgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlID0gZnJvbSBib3R0b20sIHNvIGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgeSA8IDUwJSBvZiB2aWV3cG9ydCBoZWlnaHQsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDUwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHB4IHZhbHVlcywgYXNzdW1lIDwgNDAwcHggaXMgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNDAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBBbmNob3JlZDogcGxhY2VtZW50IGRldGVybWluZXMgZmxvd1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYWJvdmUnKSByZXR1cm4gJ3VwJztcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnYmVsb3cnKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAvLyBGb3IgbGVmdC9yaWdodCwgZGVmYXVsdCB0byBkb3duXHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBkZXRlcm1pbmUgYmFzZWQgb24geSBvZmZzZXRcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHkgPSBhYm92ZSBlbGVtZW50ID0gZmxvdyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aXZlIHkgPSBiZWxvdyBlbGVtZW50ID0gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxufVxyXG5cclxuLyoqXHJcbiAqIEdhcmJhZ2UgY29sbGVjdGlvbjogcmVtb3ZlIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwRW1wdHlDb250YWluZXJzKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5BUFgtdG9hc3QtY29udGFpbmVyOm5vdChbZGF0YS1hcHgtdG9hc3QtbWFuYWdlZD1cInRydWVcIl0pJyk7XHJcbiAgICBjb250YWluZXJzLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgZW1wdHkgKG5vIHRvYXN0cylcclxuICAgICAgICBpZiAoY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB1cCB3cmFwcGVyIGlmIGl0J3MgZW1wdHkgKGFsbCBjb250YWluZXJzIHJlbW92ZWQpXHJcbiAgICBpZiAoX3RvYXN0V3JhcHBlciAmJiBfdG9hc3RXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCkge1xyXG4gICAgaWYgKF9nY1RpbWVvdXRJZCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChfZ2NUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgX2djVGltZW91dElkID0gc2V0VGltZW91dChjbGVhbnVwRW1wdHlDb250YWluZXJzLCBHQ19ERUxBWV9NUyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnRzKGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHNjcm9sbGFibGVzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kgKyBzdHlsZS5vdmVyZmxvd1g7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG92ZXJmbG93LmluY2x1ZGVzKCdzY3JvbGwnKSB8fCBvdmVyZmxvdy5pbmNsdWRlcygnYXV0bycpKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzY3JvbGxhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhc2ggYW4gZWxlbWVudCB0byBjcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllclxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzaEVsZW1lbnQoZWwpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHN0ciA9IGAke2VsLnRhZ05hbWV9XyR7cmVjdC5sZWZ0fV8ke3JlY3QudG9wfV8ke3JlY3Qud2lkdGh9XyR7cmVjdC5oZWlnaHR9YDtcclxuICAgIGxldCBoYXNoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemUgcG9zaXRpb24gb3B0aW9ucyBpbnRvIGEgdW5pcXVlIGtleVxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBzOiR7cG9zaXRpb259YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFR5cGUgKGRlZmF1bHQ6IHN0aWNreSBpZiB4L3kgcHJvdmlkZWQpXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKHR5cGUpIHBhcnRzLnB1c2goYHQ6JHt0eXBlfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvb3JkaW5hdGVzXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeDoke3Bvc2l0aW9uLnh9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeToke3Bvc2l0aW9uLnl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkOiB1c2UgZWxlbWVudCBJRCBvciBoYXNoXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkID0gcG9zaXRpb24uZWxlbWVudC5pZCB8fCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5lbGVtZW50LmRhdGFzZXQ/LmFweFRvYXN0QW5jaG9ySWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxfJHtoYXNoRWxlbWVudChwb3NpdGlvbi5lbGVtZW50KX1gO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbDoke2VsZW1lbnRJZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IGZvciBzZXJpYWxpemF0aW9uICh1c2UgQ1NTIHZhbHVlcylcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBwOiR7bm9ybWFsaXplZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmdhcCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGBnOiR7cG9zaXRpb24uZ2FwfWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MpIHBhcnRzLnB1c2goYG5hdGl2ZTp0cnVlYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGBvOiR7cGFydHMuam9pbignfCcpfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnczpib3R0b20tcmlnaHQnO1xyXG59XHJcblxyXG4vKipcclxuICogVG9hc3RNYW5hZ2VyIGNsYXNzXHJcbiAqL1xyXG5jbGFzcyBUb2FzdE1hbmFnZXIge1xyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWcgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RDb25maWd9ICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUb2FzdFJlZj59ICovXHJcbiAgICAgICAgdGhpcy5pZFRvUmVmID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZbXX0gKi9cclxuICAgICAgICB0aGlzLm9wZW4gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gY29uZmlnICovXHJcbiAgICBjb25maWd1cmUoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBtb2RlICovXHJcbiAgICBzZXRBcmlhTGl2ZShtb2RlKSB7IHRoaXMuY29uZmlndXJlKHsgYXJpYUxpdmU6IG1vZGUgfSk7IH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge1RvYXN0UmVmW119ICovXHJcbiAgICBnZXRPcGVuVG9hc3RzKCkgeyByZXR1cm4gdGhpcy5vcGVuLnNsaWNlKCk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIHNob3cob3B0cykge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKG51bGwpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMob3B0cyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWR1cGUgJiYgb3B0aW9ucy5pZCAmJiB0aGlzLmlkVG9SZWYuaGFzKG9wdGlvbnMuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRUb1JlZi5nZXQob3B0aW9ucy5pZCk7XHJcbiAgICAgICAgICAgIHJlZi51cGRhdGUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gYW5kIGZsb3cgZm9yIHRoaXMgdG9hc3QgKG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gb3B0aW9ucy5mbG93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZsb3cgOiAodGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJyk7XHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyA9PT0gJ2F1dG8nID8gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikgOiBmbG93O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVuc3VyZSBkZWZhdWx0IGNvbnRhaW5lciBpcyBzZXQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICAgIHRoaXMuZW5zdXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvYXN0RWwgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdCBBUFgtdG9hc3QtLSR7b3B0aW9ucy50eXBlfWApO1xyXG4gICAgICAgIHRvYXN0RWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gICAgICAgIC8vIFByaW9yaXR5OiBvcHRpb25zLmlkID4gY29uZmlnLmlkID4gYXV0by1nZW5lcmF0ZWRcclxuICAgICAgICBjb25zdCB0b2FzdElkID0gb3B0aW9ucy5pZCB8fCBgdF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcclxuICAgICAgICB0b2FzdEVsLmRhdGFzZXQudG9hc3RJZCA9IHRvYXN0SWQ7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTmFtZSArPSBgICR7b3B0aW9ucy5jbGFzc05hbWV9YDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX2NvbnRlbnQnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChvcHRpb25zLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNvbnRlbnRFbCk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzbWlzc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb2dyZXNzV3JhcCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzQmFyRWwgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1BhdXNlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5wcm9ncmVzcy5lbmFibGUgJiYgb3B0aW9ucy5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBvcHRpb25zLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25VcGRhdGVGbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsRWxlbWVudFN0eWxlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24gJiYgdHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MgJiYgKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlTmF0aXZlQ1NTOiB0cnVlIC0gY3JlYXRlIGNvbnRhaW5lciBpbiB0YXJnZXQgZWxlbWVudCB1c2luZyBuYXRpdmUgQ1NTXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IHBvc2l0aW9uLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHN0YWNraW5nIHRvYXN0cyAocmV1c2UgaWYgZXhpc3RzKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmF0aXZlQ29udGFpbmVyID0gdGFyZ2V0RWwucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmF0aXZlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyIEFQWC10b2FzdC1jb250YWluZXItbmF0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgdG8gY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHVzZSB4L3kgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYW5jaG9yZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiBvdXRzaWRlIHRoZSBlbGVtZW50IHVzaW5nIDEwMCUgKGVsZW1lbnQgc2l6ZSkgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLmFwcGVuZENoaWxkKG5hdGl2ZUNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5hdGl2ZUNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbCAmJiB0YXJnZXRFbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxFbGVtZW50U3R5bGUgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuYXRpdmUgY29udGFpbmVyIGlmIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVDb250YWluZXIgJiYgbmF0aXZlQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBuYXRpdmVDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250YWluZXIuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQsIGxpc3RlbiB0byBzY3JvbGwvcmVzaXplXHJcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlTXMgPSAxNjsgLy8gfjYwZnBzXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVkVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IHRocm90dGxlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUGFyZW50cyA9IGZpbmRTY3JvbGxhYmxlUGFyZW50cyhwb3NpdGlvbi5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIHdpbmRvdyBhbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZWxlbWVudCByZW1vdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xvc2UoJ2FwaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZUZuID0gdXBkYXRlQ29udGFpbmVyUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uIC0gZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRvYXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb250YWluZXJcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFuaW1hdGlvblxyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlcicpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnQgaGFuZGxpbmcgYW5kIHRpbWVyc1xyXG4gICAgICAgIGxldCByZW1haW5pbmcgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFydFRzID0gbnVsbDtcclxuICAgICAgICBsZXQgdXNlclBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgY2xpY2s6IG5ldyBTZXQoKSwgY2xvc2U6IG5ldyBTZXQoKSB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZyB8fCByZW1haW5pbmcgPD0gMCkgcmV0dXJuOyAvLyBzdGlja3lcclxuICAgICAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiByZWYuY2xvc2UoJ3RpbWVvdXQnKSwgcmVtYWluaW5nKTtcclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVySWQgPT0gbnVsbCB8fCBzdGFydFRzID09IG51bGwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCByZW1haW5pbmcgLSBlbGFwc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjdCA9IGR1cmF0aW9uTXMgPiAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCAocmVtYWluaW5nTXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gYCR7cGN0fSVgO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgU3RyaW5nKE1hdGgucm91bmQocGN0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpbWVySWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcclxuICAgICAgICAgICAgICAgIHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VHMgIT0gbnVsbCkgcmVtYWluaW5nIC09IChEYXRlLm5vdygpIC0gc3RhcnRUcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyID0gKGJ0bikgPT4ge1xyXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdXNlclBhdXNlZCA9ICF1c2VyUGF1c2VkO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQYXVzZWQpIHBhdXNlVGltZXIoKTsgZWxzZSBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHVzZXJQYXVzZWQgPyAnUmVwcmVuZHJlJyA6ICdQYXVzZSc7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcodXNlclBhdXNlZCk7IC8vIHBhdXNlZCA9IHJlc3VtZSAodHJpYW5nbGUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZ9ICovXHJcbiAgICAgICAgY29uc3QgcmVmID0ge1xyXG4gICAgICAgICAgICBpZDogdG9hc3RJZCxcclxuICAgICAgICAgICAgZWw6IHRvYXN0RWwsXHJcbiAgICAgICAgICAgIGNsb3NlOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZTogKHBhcnRpYWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyh7IC4uLm9wdGlvbnMsIC4uLnBhcnRpYWwgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWQubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBtZXJnZWQubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG1lcmdlZC5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0eXBlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBbJ2luZm8nLCdzdWNjZXNzJywnd2FybmluZycsJ2RhbmdlciddLmZvckVhY2godCA9PiB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoYEFQWC10b2FzdC0tJHt0fWApKTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LS0ke21lcmdlZC50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsYXNzZXNcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSAhPT0gbWVyZ2VkLmNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKC4uLm1lcmdlZC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIHZpc2liaWxpdHkvcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MgPSBtZXJnZWQucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlIHx8IG1lcmdlZC5kdXJhdGlvbk1zIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5wcm9ncmVzcy5lbmFibGUgJiYgbWVyZ2VkLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXAgJiYgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBtZXJnZWQucHJvZ3Jlc3MucGF1c2VCdXR0b24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkdXJhdGlvbiBsb2dpY1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbk1zID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgd2hlbkNsb3NlZDogKCkgPT4gY2xvc2VkUHJvbWlzZSxcclxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uYWRkKGhhbmRsZXIpOyByZXR1cm4gKCkgPT4gcmVmLm9mZihldmVudCwgaGFuZGxlcik7IH0sXHJcbiAgICAgICAgICAgIG9mZjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5kZWxldGUoaGFuZGxlcik7IH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBub3RpZnkgPSAoZXZlbnQsIGFyZykgPT4gaGFuZGxlcnNbZXZlbnRdLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihhcmcpOyB9IGNhdGNoIChfKSB7fSB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvc2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2ggPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBub3RpZnkoJ2Nsb3NlJywgcmVhc29uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsb3NlKHJlZiwgcmVhc29uKTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2FzdEVsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHBvc2l0aW9uIGxpc3RlbmVycyBhbmQgcmVzdG9yZSBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbkNsZWFudXApIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVyZmxvdywgcmVtb3ZlIGltbWVkaWF0ZWx5IHRvIGVuZm9yY2UgaGFyZCBjYXBcclxuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT09ICdvdmVyZmxvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFuaW1hdGUgb3V0XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdCcpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVFbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGF0dGFjaCBjbG9zZSBiZWhhdmlvclxyXG4gICAgICAgICAgICByZWYuY2xvc2UgPSAocmVhc29uKSA9PiBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsaWNrIGhhbmRsaW5nXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICBub3RpZnkoJ2NsaWNrJywgZXYpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsaWNrKHJlZiwgZXYpOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIb3ZlciBwYXVzZVxyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBhdXNlVGltZXIpO1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaWYgKCF1c2VyUGF1c2VkKSBzdGFydFRpbWVyKCk7IH0pO1xyXG5cclxuICAgICAgICBpZiAoY2xvc2VCdG4pIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7IGV2LnN0b3BQcm9wYWdhdGlvbigpOyByZWYuY2xvc2UoJ2Nsb3NlJyk7IH0pO1xyXG4gICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuXHJcbiAgICAgICAgLy8gVHJhY2tcclxuICAgICAgICB0aGlzLm9wZW4ucHVzaChyZWYpO1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZi5zZXQodG9hc3RJZCwgcmVmKTtcclxuXHJcbiAgICAgICAgLy8gT3ZlcmZsb3cgcG9saWN5XHJcbiAgICAgICAgaWYgKHRoaXMub3Blbi5sZW5ndGggPiB0aGlzLmNvbmZpZy5tYXhUb2FzdHMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5vcGVuWzBdO1xyXG4gICAgICAgICAgICBvbGRlc3QuY2xvc2UoJ292ZXJmbG93Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIGhlbHBlcnNcclxuICAgICAqL1xyXG4gICAgaW5mbyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnaW5mbycgfSk7IH1cclxuICAgIHN1Y2Nlc3MobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3N1Y2Nlc3MnIH0pOyB9XHJcbiAgICB3YXJuaW5nKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICd3YXJuaW5nJyB9KTsgfVxyXG4gICAgZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdkYW5nZXInIH0pOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J2FwaSd8J292ZXJmbG93J30gW3JlYXNvbl0gKi9cclxuICAgIGNsb3NlQWxsKHJlYXNvbikge1xyXG4gICAgICAgIC8vIGNvcHkgdG8gYXZvaWQgbXV0YXRpb24gZHVyaW5nIGl0ZXJhdGlvblxyXG4gICAgICAgIGNvbnN0IGFsbCA9IHRoaXMub3Blbi5zbGljZSgpO1xyXG4gICAgICAgIGFsbC5mb3JFYWNoKHIgPT4gci5jbG9zZShyZWFzb24gfHwgJ2FwaScpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIG5vcm1hbGl6ZU9wdGlvbnMob3B0cykge1xyXG4gICAgICAgIGNvbnN0IG8gPSB7IC4uLm9wdHMgfTtcclxuICAgICAgICBpZiAoIW8udHlwZSkgby50eXBlID0gJ2luZm8nO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kaXNtaXNzaWJsZSAhPT0gJ2Jvb2xlYW4nKSBvLmRpc21pc3NpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIG8uZHVyYXRpb25NcyAhPT0gJ251bWJlcicpIG8uZHVyYXRpb25NcyA9IHRoaXMuY29uZmlnLmRlZmF1bHREdXJhdGlvbk1zO1xyXG4gICAgICAgIC8vIFVzZSBpZCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgaWQgZnJvbSBjb25maWcsIG90aGVyd2lzZSB1bmRlZmluZWQgKHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQpXHJcbiAgICAgICAgaWYgKCFvLmlkICYmIHRoaXMuY29uZmlnLmlkKSBvLmlkID0gdGhpcy5jb25maWcuaWQ7XHJcbiAgICAgICAgby5wcm9ncmVzcyA9IHJlc29sdmVQcm9ncmVzcyhvcHRzLnByb2dyZXNzLCB0aGlzLmNvbmZpZy5wcm9ncmVzcyk7XHJcbiAgICAgICAgcmV0dXJuIG87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIG9yIGNyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7J3VwJ3wnZG93bid9IFtmbG93XSBGbG93IGRpcmVjdGlvbiAoYWxyZWFkeSBkZXRlcm1pbmVkLCBub3QgJ2F1dG8nKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbWFuYWdlZF0gV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBtYW5hZ2VkIGJ5IGEgbWFuYWdlciAoZGVmYXVsdDogZmFsc2UpXHJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIG1hbmFnZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGbG93IHNob3VsZCBhbHJlYWR5IGJlIGRldGVybWluZWQgKCd1cCcgb3IgJ2Rvd24nKSwgYnV0IGZhbGxiYWNrIHRvIGF1dG8gaWYgbmVlZGVkXHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyAmJiBmbG93ICE9PSAnYXV0bycgPyBmbG93IDogZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMS4gQ2hlY2sgbWVtb3J5IGNhY2hlXHJcbiAgICAgICAgbGV0IGMgPSBfY29udGFpbmVyQ2FjaGUuZ2V0KHBvc2l0aW9uS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBJZiBub3QgaW4gY2FjaGUsIHNlYXJjaCBpbiBET00gYnkgZGF0YSBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWMgJiYgaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIGMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMy4gSWYgc3RpbGwgbm90IGZvdW5kLCBjcmVhdGUgbmV3IGNvbnRhaW5lclxyXG4gICAgICAgIGlmICghYykge1xyXG4gICAgICAgICAgICBjID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1hcmsgYXMgbWFuYWdlZCBpZiBjcmVhdGVkIGJ5IGEgbWFuYWdlclxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gY2xhc3MgKGZvciBDU1MpXHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8gcG9zaXRpb24gXHJcbiAgICAgICAgICAgICAgICA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICAgICAgYy5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc0NsYXNzfWApO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IGZsb3cgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uIHN0eWxlcyBpZiBvYmplY3QgcG9zaXRpb25cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGMuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgYyk7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB3cmFwcGVyIGZvciBjbGVhbiBET00gb3JnYW5pemF0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRUb2FzdFdyYXBwZXIoKTtcclxuICAgICAgICAgICAgaWYgKHdyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzIChtYXkgYmUgc2hhcmVkKVxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBJZiBjb250YWluZXIgZXhpc3RzIGFuZCBpcyBub3cgbWFuYWdlZCwgbWFyayBpdFxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCAmJiAhYy5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZUNvbnRhaW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgfHwgIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0byc7XHJcbiAgICAgICAgLy8gQ29udGFpbmVycyBjcmVhdGVkIGJ5IGVuc3VyZUNvbnRhaW5lciBhcmUgbWFuYWdlZFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5Q29udGFpbmVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbiA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBzdHlsZXMgKHRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG1hbmFnZXJzIHNoYXJpbmcgdGhlIGNvbnRhaW5lcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIGNsYXNzIChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzZXMgPSBbJ2JvdHRvbS1yaWdodCcsJ2JvdHRvbS1sZWZ0JywndG9wLXJpZ2h0JywndG9wLWxlZnQnXS5tYXAocCA9PiBgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwfWApO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnBvc0NsYXNzZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgY29udGFpbmVyIGNsYXNzIGlmIHNwZWNpZmllZFxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGNscyA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBvZmZzZXQgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYCR7dGhpcy5jb25maWcub2Zmc2V0fXB4YDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgb2Zmc2V0IGlmIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gRm9yIG9iamVjdCBwb3NpdGlvbnMsIGVuc3VyZSBjb250YWluZXIgaGFzIHBvc2l0aW9uOiBmaXhlZFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciBhIGNvbnRhaW5lciBiYXNlZCBvbiBwb3NpdGlvbiBjb25maWdcclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxyXG4gICAgICogQHJldHVybnMge3tsZWZ0Pzogc3RyaW5nLCB0b3A/OiBzdHJpbmcsIHJpZ2h0Pzogc3RyaW5nLCBib3R0b20/OiBzdHJpbmd9fVxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyRWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNvbnRhaW5lciBDU1NcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGlja3k6IGZpeGVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggeC95IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGZpeGVkIHBvc2l0aW9uaW5nLCBzbyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBpcyByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHgveSBvZmZzZXRzIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VPZmZzZXQgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZW0gdG8gcHggKGFwcHJveGltYXRlOiAxZW0gPSAxNnB4KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueCB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnkgfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGAke3JlY3QubGVmdCArIG9mZnNldFh9cHhgLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogYCR7cmVjdC50b3AgKyBvZmZzZXRZfXB4YFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggcGxhY2VtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgZ2FwIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VHYXAgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2OyAvLyBBcHByb3hpbWF0ZTogMWVtID0gMTZweFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwUHggPSBwYXJzZUdhcChnYXApO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgKGFib3ZlL2JlbG93L2JlZm9yZS9hZnRlcikgdG8gQ1NTIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYWJvdmUgZWxlbWVudDogYm90dG9tIG9mIHRvYXN0ID0gdG9wIG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tID0gdmlld3BvcnQgaGVpZ2h0IC0gKGVsZW1lbnQgdG9wIC0gZ2FwKSA9IHZpZXdwb3J0IGhlaWdodCAtIGVsZW1lbnQgdG9wICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBiZWxvdyBlbGVtZW50OiB0b3Agb2YgdG9hc3QgPSBib3R0b20gb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC5ib3R0b20gKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSBsZWZ0OiByaWdodCBvZiB0b2FzdCA9IGxlZnQgb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgcmlnaHQ6IGxlZnQgb2YgdG9hc3QgPSByaWdodCBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWdcclxuICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvYXN0TWFuYWdlcihjb25maWcpIHtcclxuICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKGNvbmZpZyk7XHJcbn1cclxuXHJcbi8vIEhpZ2gtbGV2ZWwgQVBYLnRvYXN0IEFQSSAoZGVmYXVsdCAmIG5hbWVkIG1hbmFnZXJzKVxyXG5sZXQgX2RlZmF1bHRNYW5hZ2VyID0gbnVsbDtcclxuY29uc3QgX2dldERlZmF1bHQgPSAoKSA9PiB7XHJcbiAgICBpZiAoIV9kZWZhdWx0TWFuYWdlcikgX2RlZmF1bHRNYW5hZ2VyID0gY3JlYXRlVG9hc3RNYW5hZ2VyKCk7XHJcbiAgICByZXR1cm4gX2RlZmF1bHRNYW5hZ2VyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRvYXN0IEFQSSBzdXJmYWNlIHRvIGJlIGF0dGFjaGVkIGFzIEFQWC50b2FzdC5cclxuICogQ2FsbGFibGUgZm9ybSBwcm94aWVzIHRvIGRlZmF1bHRNYW5hZ2VyLnNob3cob3B0cyk6IEFQWC50b2FzdCh7Li4ufSlcclxuICovXHJcbmZ1bmN0aW9uIHRvYXN0KG9wdHMpIHtcclxuICAgIHJldHVybiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyk7XHJcbn1cclxuXHJcbk9iamVjdC5hc3NpZ24odG9hc3QsIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbWFuYWdlci4gSWYgZmlyc3QgYXJnIGlzIHN0cmluZywgcmVnaXN0ZXIgYXMgbmFtZWQgdW5kZXIgdG9hc3QuY3VzdG9tW25hbWVdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gbmFtZU9yQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gbWF5YmVDb25maWdcclxuICAgICAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogKG5hbWVPckNvbmZpZywgbWF5YmVDb25maWcpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG5hbWVPckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVPckNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obWF5YmVDb25maWcgfHwge30pIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRvYXN0LmN1c3RvbSkgdG9hc3QuY3VzdG9tID0ge307XHJcbiAgICAgICAgICAgIHRvYXN0LmN1c3RvbVtuYW1lXSA9IG1hbmFnZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihuYW1lT3JDb25maWcgfHwge30pIH0pO1xyXG4gICAgfSxcclxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgVG9hc3RNYW5hZ2VyPn0gKi9cclxuICAgIGN1c3RvbToge30sXHJcbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cclxuICAgIHVzZTogKG5hbWUpID0+ICh0b2FzdC5jdXN0b20gJiYgdG9hc3QuY3VzdG9tW25hbWVdKSB8fCBudWxsLFxyXG4gICAgTWFuYWdlcjogVG9hc3RNYW5hZ2VyLFxyXG4gICAgc2hvdzogKG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKSxcclxuICAgIGluZm86IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmluZm8obWVzc2FnZSwgb3B0cyksXHJcbiAgICBzdWNjZXNzOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5zdWNjZXNzKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgd2FybmluZzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkud2FybmluZyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIGRhbmdlcjogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgY29uZmlndXJlOiAoY29uZmlnKSA9PiBfZ2V0RGVmYXVsdCgpLmNvbmZpZ3VyZShjb25maWcpLFxyXG4gICAgc2V0QXJpYUxpdmU6IChtb2RlKSA9PiBfZ2V0RGVmYXVsdCgpLnNldEFyaWFMaXZlKG1vZGUpLFxyXG4gICAgY2xvc2VBbGw6IChyZWFzb24pID0+IF9nZXREZWZhdWx0KCkuY2xvc2VBbGwocmVhc29uKSxcclxuICAgIGdldE9wZW5Ub2FzdHM6ICgpID0+IF9nZXREZWZhdWx0KCkuZ2V0T3BlblRvYXN0cygpXHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdG9hc3Q7XHJcbmV4cG9ydCB7IFRvYXN0TWFuYWdlciwgY3JlYXRlVG9hc3RNYW5hZ2VyLCB0b2FzdCB9O1xyXG4iLCIvLyBJbXBvcnQgZGVzIGZvbmN0aW9ucyBldCBtb2R1bGVzIGRlcyBzb3VzLW1vZHVsZXNcclxuaW1wb3J0IGF1Z21lbnRXaXRoUGFjayBmcm9tICcuL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyc7XHJcbmltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9mb3JtLXBhY2tlci9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vLyBFeHBvcnQgZGUgbGEgZm9uY3Rpb24gZCdhdWdtZW50YXRpb25cclxuZXhwb3J0IHsgYXVnbWVudFdpdGhQYWNrIH07XHJcblxyXG4vLyBFeHBvcnQgZGVzIGZvbmN0aW9ucyB1dGlsaXRhaXJlc1xyXG5leHBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT05cclxufTtcclxuXHJcblxyXG4iLCJpbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vcGFja1RvSnNvbi5tanMnO1xyXG5cclxuLyoqXHJcbiAqIEFqb3V0ZSBsYSBtw6l0aG9kZSBwYWNrKCkgYXV4IG9iamV0cyBBUFggcG91ciBjb252ZXJ0aXIgbGVzIGZvcm11bGFpcmVzIGVuIEpTT05cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIEwnb2JqZXQgQVBYIMOgIGF1Z21lbnRlclxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEFQWCBhdWdtZW50w6lcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IGxlIHByZW1pZXIgZm9ybXVsYWlyZSBzw6lsZWN0aW9ubsOpIGVuIG9iamV0IEpTT05cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHBhc3PDqWVzIMOgIHBhY2tGb3JtVG9KU09OIChleC4geyBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiB0cnVlIH0pXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEpTT04gcsOpc3VsdGFudFxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNpIGF1Y3VuIGZvcm11bGFpcmUgbidlc3QgdHJvdXbDqSBvdSBzaSBsZSBwcmVtaWVyIMOpbMOpbWVudCBuJ2VzdCBwYXMgdW4gZm9ybXVsYWlyZVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnN0IGRhdGEgPSBBUFgoJ2Zvcm0ubXlmb3JtY2xhc3MnKS5wYWNrKCk7XHJcbiAgICAgKiBjb25zdCBkYXRhTGVnYWN5ID0gQVBYKCdmb3JtJykucGFjayh7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSk7XHJcbiAgICAgKi9cclxuICAgIGFweC5wYWNrID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0aGlzLmZpcnN0KCk7XHJcbiAgICAgICAgaWYgKCFmaXJzdEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJzdEVsZW1lbnQudGFnTmFtZSAhPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCBpcyBub3QgYSBmb3JtJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWNrRm9ybVRvSlNPTihmaXJzdEVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGFweDtcclxufVxyXG5cclxuXHJcbiIsIi8qKlxyXG4gKiBDb252ZXJ0aXQgdW4gZm9ybXVsYWlyZSBIVE1MIGVuIG9iamV0IEpTT05cclxuICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm0gLSBMZSBmb3JtdWxhaXJlIMOgIGNvbnZlcnRpclxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBkZSBjb252ZXJzaW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheT1mYWxzZV0gLSBTaSB0cnVlLCB0b3V0ZSBjbMOpIG51bcOpcmlxdWUgZXN0IHRyYWl0w6llIGNvbW1lIGluZGV4IGRlIHRhYmxlYXUgKGNvbXBvcnRlbWVudCBkJ2F2YW50IDIuNi4yKS4gU2lub24sIGhldXJpc3RpcXVlIDogdGFibGVhdSBzZXVsZW1lbnQgc2kgaW5kaWNlcyBkZW5zZXMgMCwxLDIs4oCmLG4uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gU2kgZm9ybSBuJ2VzdCBwYXMgdW4gSFRNTEZvcm1FbGVtZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFja0Zvcm1Ub0pTT04gPSAoZm9ybSwgb3B0aW9ucyA9IHt9KSA9PiB7XHJcbiAgICAvLyBWYWxpZGF0aW9uIGRlIGwnZW50csOpZVxyXG4gICAgaWYgKCFmb3JtIHx8ICEoZm9ybSBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYWNrRm9ybVRvSlNPTiBleHBlY3RzIGFuIEhUTUxGb3JtRWxlbWVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPSBvcHRpb25zLm51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPT09IHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XHJcbiAgICBjb25zdCBqc29uRGF0YSA9IHt9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVpdCB1bmUgcmVwcsOpc2VudGF0aW9uIHN0cmluZyBkdSBjaGVtaW4gcG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXJcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIC0gTGVzIHBhcnRpZXMgZHUgY2hlbWluXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBMZSBjaGVtaW4gZm9ybWF0w6lcclxuICAgICAqL1xyXG4gICAgY29uc3QgYnVpbGRQYXRoU3RyaW5nID0gKHBhcnRzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLnJlZHVjZSgocGF0aCwgcGFydCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofVske3BhcnQubmFtZX1dYCA6IHBhcnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtwYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9W11gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH0sICcnKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIFBIQVNFIDEgOiBBTkFMWVNFIEVUIETDiVRFQ1RJT04gREVTIENPTkZMSVRTXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3RydWN0dXJlIHBvdXIgc3RvY2tlciBsJ3V0aWxpc2F0aW9uIGQndW4gY2hlbWluXHJcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXRoVXNhZ2VcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaW5hbCAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ludGVybWVkaWF0ZSAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgY2hlbWluIGludGVybcOpZGlhaXJlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc0FycmF5U3VmZml4IC0gTGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdIChjcsOpZSBkZXMgdmFsZXVycyBwcmltaXRpdmVzKVxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSBxdWkgdXRpbGlzZSBjZSBjaGVtaW5cclxuICAgICAqL1xyXG4gICAgXHJcbiAgICBjb25zdCBwYXRoVXNhZ2UgPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBQYXRoVXNhZ2U+XHJcbiAgICBjb25zdCBrZXlBbmFseXNpcyA9IG5ldyBNYXAoKTsgLy8gTWFwPGJhc2VQYXRoLCB7aGFzTnVtZXJpYzogYm9vbGVhbiwgaGFzU3RyaW5nOiBib29sZWFufT5cclxuICAgIGNvbnN0IG51bWVyaWNJbmRpY2VzQnlQYXRoID0gbmV3IE1hcCgpOyAvLyBNYXA8cGF0aFN0cmluZywgU2V0PG51bWJlcj4+IOKAlCBpbmRpY2VzIHVuZGVyIGVhY2ggcGFyZW50IHBhdGhcclxuICAgIGNvbnN0IGFsbEVudHJpZXMgPSBbXTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnJlZ2lzdHJlIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW4gZGFucyBwYXRoVXNhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIExlIGNoZW1pbiDDoCBlbnJlZ2lzdHJlclxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0ZpbmFsIC0gU2kgYydlc3QgdW5lIHZhbGV1ciBmaW5hbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBcnJheVN1ZmZpeCAtIFNpIGxlIGNoZW1pbiBzZSB0ZXJtaW5lIHBhciBbXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZVxyXG4gICAgICovXHJcbiAgICBjb25zdCByZWNvcmRQYXRoVXNhZ2UgPSAoY3VycmVudFBhdGgsIGlzRmluYWwsIGlzQXJyYXlTdWZmaXgsIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzYWdlID0gcGF0aFVzYWdlLmdldChjdXJyZW50UGF0aCkgPz8ge1xyXG4gICAgICAgICAgICBpc0ZpbmFsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNJbnRlcm1lZGlhdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBoYXNBcnJheVN1ZmZpeDogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXRoVXNhZ2UuaGFzKGN1cnJlbnRQYXRoKSkge1xyXG4gICAgICAgICAgICBwYXRoVXNhZ2Uuc2V0KGN1cnJlbnRQYXRoLCB1c2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzRmluYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB1c2FnZS5rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5U3VmZml4KSB7XHJcbiAgICAgICAgICAgICAgICB1c2FnZS5oYXNBcnJheVN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1c2FnZS5pc0ludGVybWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA/Pz0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIFByZW1pw6hyZSBwYXNzZSA6IGFuYWx5c2VyIHRvdXRlcyBsZXMgY2zDqXMgZXQgZW5yZWdpc3RyZXIgbGVzIGNoZW1pbnNcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSkge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuICAgICAgICBcclxuICAgICAgICBhbGxFbnRyaWVzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb25zdHJ1aXJlIHRvdXMgbGVzIGNoZW1pbnMgaW50ZXJtw6lkaWFpcmVzIGV0IGxlIGNoZW1pbiBmaW5hbFxyXG4gICAgICAgIGxldCBjdXJyZW50UGF0aCA9ICcnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBjb25zdCBpc0FycmF5U3VmZml4ID0gcGFydC50eXBlID09PSAnYXJyYXknO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ29uc3RydWlyZSBsZSBjaGVtaW4ganVzcXUnw6AgY2Ugbml2ZWF1XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gY3VycmVudFBhdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0luZGljZXNCeVBhdGguc2V0KHBhcmVudFBhdGgsIHNldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZXQuYWRkKHBhcnQuaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEVucmVnaXN0cmVyIGwndXRpbGlzYXRpb24gZHUgY2hlbWluXHJcbiAgICAgICAgICAgIHJlY29yZFBhdGhVc2FnZShjdXJyZW50UGF0aCwgaXNMYXN0LCBpc0FycmF5U3VmZml4ICYmIGlzTGFzdCwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQW5hbHlzZXIgY2hhcXVlIG5pdmVhdSBkZSBsYSBoacOpcmFyY2hpZSBwb3VyIGTDqXRlY3RlciBsZXMgY29uZmxpdHMgKGluZGljZXMgbnVtw6lyaXF1ZXMgdnMgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gcGFydHNbaSArIDFdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQW5hbHlzZXIgc2V1bGVtZW50IGxlcyBjbMOpcyAocGFzIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzKVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXJ0Lm5hbWU7IC8vIExlIG5vbSBkZSBsYSBwcmVtacOocmUgY2zDqSBkYW5zIGxlIGNoZW1pblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmFseXNpcyA9IGtleUFuYWx5c2lzLmdldChiYXNlUGF0aCkgPz8geyBoYXNOdW1lcmljOiBmYWxzZSwgaGFzU3RyaW5nOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlBbmFseXNpcy5oYXMoYmFzZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5QW5hbHlzaXMuc2V0KGJhc2VQYXRoLCBhbmFseXNpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzTnVtZXJpYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0UGFydC50eXBlID09PSAna2V5JyB8fCBuZXh0UGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzLmhhc1N0cmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIETDqXRlY3RlIGV0IGzDqHZlIHVuZSBleGNlcHRpb24gcG91ciB0b3VzIGxlcyBjb25mbGl0cyBkZSBjaGVtaW5zXHJcbiAgICAgKiBcclxuICAgICAqIFByaW5jaXBlIHNpbXBsZSA6IHBvdXIgY2hhcXVlIGNoZW1pbiBmaW5hbCAodmFsZXVyIHByaW1pdGl2ZSksIHbDqXJpZmllciBzaSB1biBjaGVtaW5cclxuICAgICAqIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciBjZSBjaGVtaW4gc3VpdmkgZGUgJ1snLiBTaSBjJ2VzdCBsZSBjYXMsIGMnZXN0IHVuIGNvbmZsaXQuXHJcbiAgICAgKiBcclxuICAgICAqIENldHRlIGFwcHJvY2hlIHVuaWZpw6llIGNvdXZyZSB0b3VzIGxlcyBjYXMgOlxyXG4gICAgICogLSBpdGVtc1tdIChmaW5hbCkgdnMgaXRlbXNbMF1bbmFtZV0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBhcnJheVszXSAoZmluYWwpIHZzIGFycmF5WzNdW25lc3RlZF0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBkYXRhW2tleV0gKGZpbmFsKSB2cyBkYXRhW2tleV1bc3ViXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGRldGVjdFBhdGhDb25mbGljdHMgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gQ29sbGVjdGVyIHRvdXMgbGVzIGNoZW1pbnMgZmluYXV4ICh2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgICAgY29uc3QgZmluYWxQYXRocyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhLZXlzID0gbmV3IE1hcCgpOyAvLyBQb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHVzYWdlXSBvZiBwYXRoVXNhZ2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2FnZS5pc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBhdGhzLmFkZChwYXRoKTtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aEtleXMuc2V0KHBhdGgsIHVzYWdlLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gUG91ciBjaGFxdWUgY2hlbWluIGludGVybcOpZGlhaXJlLCB2w6lyaWZpZXIgcydpbCBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzSW50ZXJtZWRpYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbmFsUGF0aCBvZiBmaW5hbFBhdGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVsOpcmlmaWVyIHNpIGNlIGNoZW1pbiBpbnRlcm3DqWRpYWlyZSBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsIHN1aXZpIGRlICdbJ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4ZW1wbGU6IGZpbmFsUGF0aCA9IFwiYXJyYXlbM11cIiwgcGF0aCA9IFwiYXJyYXlbM11bbmVzdGVkXVwiIOKGkiBjb25mbGl0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtmaW5hbFBhdGh9W2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYXRoIGNvbmZsaWN0OiBcIiR7ZmluYWxQYXRofVwiIGlzIHVzZWQgYXMgYSBmaW5hbCB2YWx1ZSAoaW4gZmllbGQgXCIke2ZpbmFsUGF0aEtleXMuZ2V0KGZpbmFsUGF0aCl9XCIpLCBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBidXQgXCIke3BhdGh9XCIgdHJpZXMgdG8gdXNlIGl0IGFzIGFuIGludGVybWVkaWF0ZSBwYXRoIChpbiBmaWVsZCBcIiR7dXNhZ2Uua2V5fVwiKS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBjcmVhdGVzIGluY29tcGF0aWJsZSBkYXRhIHN0cnVjdHVyZXMuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW5ub3QgdXNlIFwiJHtmaW5hbFBhdGh9XCIgYXMgYSBwcmltaXRpdmUgdmFsdWUgYW5kIHRoZW4gYWNjZXNzIGl0IGFzIGFuIG9iamVjdC5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gRXjDqWN1dGVyIGxhIGTDqXRlY3Rpb24gZGVzIGNvbmZsaXRzXHJcbiAgICBkZXRlY3RQYXRoQ29uZmxpY3RzKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWw6lyaWZpZSBzaSB1biBjaGVtaW4gZGUgYmFzZSBhIHVuIGNvbmZsaXQgKGluZGljZXMgbnVtw6lyaXF1ZXMgRVQgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIMOgIHbDqXJpZmllclxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gKGJhc2VQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFiYXNlUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKTtcclxuICAgICAgICByZXR1cm4gYW5hbHlzaXM/Lmhhc051bWVyaWMgJiYgYW5hbHlzaXM/Lmhhc1N0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIGluZGljZXMgYXJlIGV4YWN0bHkgMCwgMSwgMiwgLi4uLCBuIChkZW5zZSwgc2VxdWVudGlhbCBmcm9tIDApLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kaWNlcyAtIFNvcnRlZCBhcnJheSBvZiBpbmRpY2VzXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaXNEZW5zZVNlcXVlbnRpYWwgPSAoaW5kaWNlcykgPT4ge1xyXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5pbmRpY2VzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzb3J0ZWQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKHNvcnRlZFtqXSAhPT0gaikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIG51bWVyaWMga2V5cyB1bmRlciB0aGlzIHBhdGggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXJyYXkgaW5kaWNlcy5cclxuICAgICAqIFdpdGggbnVtZXJpY0tleXNBbHdheXNBcnJheTogYWx3YXlzIHRydWUgd2hlbiBwYXRoIGhhcyBudW1lcmljIGNoaWxkcmVuLlxyXG4gICAgICogT3RoZXJ3aXNlOiB0cnVlIG9ubHkgd2hlbiBpbmRpY2VzIGFyZSBkZW5zZSAwLi5uLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBQYXRoIHRvIHRoZSBjb250YWluZXIgdGhhdCBoYXMgbnVtZXJpYyBjaGlsZHJlblxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGggPSAocGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG51bWVyaWNJbmRpY2VzQnlQYXRoLmdldChwYXJlbnRQYXRoKTtcclxuICAgICAgICBpZiAoIXNldCB8fCBzZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKG51bWVyaWNLZXlzQWx3YXlzQXJyYXkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBpc0RlbnNlU2VxdWVudGlhbChbLi4uc2V0XSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IHVuIHRhYmxlYXUgZW4gb2JqZXQgZW4gcHLDqXNlcnZhbnQgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMgY29tbWUgcHJvcHJpw6l0w6lzXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgLSBMZSB0YWJsZWF1IMOgIGNvbnZlcnRpclxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGFycmF5VG9PYmplY3QgPSAoYXJyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYXJyLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgb2JqW2lkeF0gPSBhcnJbaWR4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBwcm9wcmnDqXTDqXMgbm9uLW51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYXJyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSkpIHtcclxuICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gb2JqZXQgZW4gdGFibGVhdSBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlc1xyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIEwnb2JqZXQgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IExlIHRhYmxlYXUgcsOpc3VsdGFudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBvYmplY3RUb0FycmF5ID0gKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmo7XHJcbiAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycltudW1LZXldID0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIG9iamV0LCBlbiBjb252ZXJ0aXNzYW50IHNpIG7DqWNlc3NhaXJlXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciDDoCB2w6lyaWZpZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGtleSAtIExhIGNsw6kgZGFucyBsZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlT2JqZWN0IC0gRm9yY2VyIGxhIGNvbnZlcnNpb24gZW4gb2JqZXQgbcOqbWUgcydpbCBuJ3kgYSBwYXMgZGUgY29uZmxpdFxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiBvYmpldCBzaSBuw6ljZXNzYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZW5zdXJlT2JqZWN0ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQsIGZvcmNlT2JqZWN0ID0gZmFsc2UpID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIHRhYmxlYXUsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiB0YWJsZWF1IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVBcnJheSA9IChjb250YWluZXIsIGtleSwgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyID0gb2JqZWN0VG9BcnJheShjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBhcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH07XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMiA6IFRSQUlURU1FTlQgREVTIFZBTEVVUlNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHZhbGV1ciBmaW5hbGUgKGRlcm5pw6hyZSBwYXJ0aWUgZHUgY2hlbWluKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gTGEgdmFsZXVyIMOgIGFzc2lnbmVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2UgcG91ciBsYSBkw6l0ZWN0aW9uIGRlIGNvbmZsaXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRQYXRoIC0gQ2hlbWluIGR1IGNvbnRlbmV1ciBhY3R1ZWwgKHBvdXIgaGV1cmlzdGlxdWUgbnVtZXJpYylcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ZpbmFsVmFsdWUgPSAoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgLy8gVGFibGVhdSBleHBsaWNpdGUgYXZlYyBbXVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA/Pz0gW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ2zDqSBzaW1wbGUgZmluYWxlXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVHJhaXRlIHVuZSBwYXJ0aWUgaW50ZXJtw6lkaWFpcmUgKGNyw6llIGxhIHN0cnVjdHVyZSlcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIGFjdHVlbFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnQgLSBMYSBwYXJ0aWUgw6AgdHJhaXRlclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gbmV4dFBhcnQgLSBMYSBwYXJ0aWUgc3VpdmFudGUgKHBldXQgw6p0cmUgbnVsbClcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBUb3V0ZXMgbGVzIHBhcnRpZXMgZHUgY2hlbWluIChwb3VyIGNvbnN0cnVpcmUgbGUgY2hlbWluIGNvbXBsZXQgZGFucyBsZXMgZXJyZXVycylcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIC0gTCdpbmRleCBkZSBsYSBwYXJ0aWUgYWN0dWVsbGUgKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSAocG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXIpXHJcbiAgICAgKiBAcmV0dXJucyB7Kn0gTGUgbm91dmVhdSBjb250ZW5ldXIgYXByw6hzIHRyYWl0ZW1lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQgPSAoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlQXJyYXkgPSB1c2VBcnJheUZvck51bWVyaWNQYXRoKHBhcmVudFBhdGgpICYmICFoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIXVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZUFycmF5KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmxlbmd0aCA8PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID8/PSB7fTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyW2luZGV4XSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW2luZGV4XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbaW5kZXhdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbaW5kZXhdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltpbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENsw6kgbm9ybWFsZSA6IGNyw6llciBvYmpldCBvdSB0YWJsZWF1IHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgIGNvbnN0IG5leHRJc051bWVyaWMgPSBuZXh0UGFydD8udHlwZSA9PT0gJ251bWVyaWMnO1xyXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb25mbGljdCkge1xyXG4gICAgICAgICAgICAvLyBDb25mbGl0IDogdG91am91cnMgdXRpbGlzZXIgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSB7fTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gUGFzIGRlIGNvbmZsaXQsIGNyw6llciBzZWxvbiBsYSBwYXJ0aWUgc3VpdmFudGVcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBuZXh0SXNOdW1lcmljID8gW10gOiB7fTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJc051bWVyaWMgJiYgIUFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gdGFibGVhdSBtYWlzIGMnZXN0IHVuIG9iamV0XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0cmluZ0tleXMgPSBPYmplY3Qua2V5cyhjb250YWluZXJbcGFydC5uYW1lXSkuc29tZShrID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWhhc1N0cmluZ0tleXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gb2JqZWN0VG9BcnJheShjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0SXNOdW1lcmljICYmICFpc1BsYWluT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvLyBPbiBhIGJlc29pbiBkJ3VuIG9iamV0IG1haXMgYydlc3QgdW4gdGFibGVhdVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFMnYXNzdXJlciBxdWUgY29udGFpbmVyW3BhcnQubmFtZV0gZXN0IGJpZW4gdW4gb2JqZXQgYXByw6hzIHRvdXRlcyBsZXMgY29udmVyc2lvbnNcclxuICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltwYXJ0Lm5hbWVdO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gVHJhaXRlciB0b3V0ZXMgbGVzIGVudHLDqWVzXHJcbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIGtleSB9IG9mIGFsbEVudHJpZXMpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwYXRoID0gW3sgY29udGFpbmVyOiBqc29uRGF0YSwga2V5OiBudWxsIH1dO1xyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBqc29uRGF0YTtcclxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnRzWzBdPy50eXBlID09PSAna2V5JyA/IHBhcnRzWzBdLm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gaSArIDEgPCBwYXJ0cy5sZW5ndGggPyBwYXJ0c1tpICsgMV0gOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaW5hbFZhbHVlKGNvbnRhaW5lciwgcGFydCwgdmFsdWUsIHBhcmVudCwgYmFzZVBhdGgsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUGFydGllIGludGVybcOpZGlhaXJlIDogY3LDqWVyIGxhIHN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSk7XHJcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goeyBjb250YWluZXIsIGtleTogcGFydC50eXBlID09PSAnbnVtZXJpYycgPyBwYXJ0LmluZGV4IDogcGFydC5uYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmV3Q29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBqc29uRGF0YTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSB1bmUgY2zDqSBkZSBmb3JtdWxhaXJlIHBvdXIgZXh0cmFpcmUgbGVzIHBhcnRpZXMgKG5vbSwgaW5kaWNlcywgZXRjLilcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgw6AgcGFyc2VyIChleDogXCJ1c2VyW2VtYWlsXVwiLCBcInRhZ3NbXVwiLCBcIml0ZW1zWzBdW25hbWVdXCIpXHJcbiAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyfT59IFRhYmxlYXUgZGVzIHBhcnRpZXMgcGFyc8OpZXNcclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IHBhcnNlS2V5ID0gKGtleSkgPT4ge1xyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50ID0gJyc7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBsZW4gPSBrZXkubGVuZ3RoO1xyXG5cclxuICAgIHdoaWxlIChpIDwgbGVuKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IGtleVtpXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY2hhciA9PT0gJ1snKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdXZlZ2FyZGVyIGxhIHBhcnRpZSBwcsOpY8OpZGVudGUgc2kgZWxsZSBleGlzdGVcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVHJvdXZlciBsYSBmaW4gZHUgY3JvY2hldFxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGxldCBicmFja2V0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBrZXlbaV0gIT09ICddJykge1xyXG4gICAgICAgICAgICAgICAgYnJhY2tldENvbnRlbnQgKz0ga2V5W2ldO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYnJhY2tldENvbnRlbnQgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBbXSB2aWRlID0gdGFibGVhdVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXJ0LnR5cGUgPSAnYXJyYXknO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBbXSBhdSBkw6lidXQsIGNyw6llciB1bmUgcGFydGllIHNww6ljaWFsZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiAnJywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnRlbnUgZGFucyBsZXMgY3JvY2hldHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGJyYWNrZXRDb250ZW50LCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1JbmRleCkgJiYgYnJhY2tldENvbnRlbnQgPT09IFN0cmluZyhudW1JbmRleCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2UgbnVtw6lyaXF1ZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBTdHJpbmcobnVtSW5kZXgpLCB0eXBlOiAnbnVtZXJpYycsIGluZGV4OiBudW1JbmRleCB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9tIGRlIHByb3ByacOpdMOpXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGJyYWNrZXRDb250ZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpKys7IC8vIFBhc3NlciBsZSAnXSdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFqb3V0ZXIgbGEgZGVybmnDqHJlIHBhcnRpZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogY3VycmVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBwYXJ0cztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBWw6lyaWZpZSBzaSB1bmUgdmFsZXVyIGVzdCB1biBvYmpldCBzaW1wbGUgKHBhcyB1biB0YWJsZWF1LCBwYXMgbnVsbClcclxuICogQHBhcmFtIHsqfSBvYmogLSBMYSB2YWxldXIgw6AgdsOpcmlmaWVyXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgaXNQbGFpbk9iamVjdCA9IChvYmopID0+IHtcclxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcclxufTtcclxuIiwiaW1wb3J0ICcuL2Nzcy90cmlzdGF0ZS5jc3MnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmktc3RhdGUgY2hlY2tib3ggZm9yIGVhY2ggY2hlY2tib3ggZWxlbWVudCBpbiB0aGUgYXB4LmVsZW1lbnRzIGFycmF5LlxuICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGFweCAtIEFuIGFycmF5IG9mIEhUTUxFbGVtZW50cyB3aGljaCBpcyByZXR1cm5lZCBieSBBUFgoKVxuICogQGV4YW1wbGVcbiAqIC8vIENhbGwgdGhlIHRyaXN0YXRlIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGNoZWNrYm94IGVsZW1lbnRzXG4gKiBhcHgudHJpc3RhdGUoKTtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xuICAgIGFweC50cmlzdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pe1xuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdID0gY3JlYXRlVHJpU3RhdGVDaGVja2JveChlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENoZWNrYm94Ll9hcHhUcmlzdGF0ZSA9IHsgZG9tOiB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFja3MgJiYgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyKG9yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuQXB4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldENoaWxkcmVuKGFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5cbi8qKlxuICogTGluayBwYXJlbnQgdHJpc3RhdGUocykgdG8gY2hpbGQgY2hlY2tib3hlcy4gV2hlbiBleGFjdGx5IG9uZSBwYXJlbnQ6IHRoYXQgcGFyZW50IGdldHNcbiAqIGluZGV0ZXJtaW5hdGUtZGFzaCBhdXRvbWF0aWNhbGx5IGFuZCBzaG93cyBkYXNoIHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkOyBjbGljayBwYXJlbnQgdG8gYXBwbHkgaXRzIHN0YXRlIHRvIGFsbCBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRBcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBwYXJlbnQgY2hlY2tib3goZXMpXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW5BcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBjaGlsZCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyB1c2VkIGZvciB0aGUgcGFyZW50IChhbmQgYXBwbGllZCB0byBjaGlsZHJlbiB3aGVuIGluaXRpYWxpemluZyB0aGVtKVxuICovXG5mdW5jdGlvbiBzZXRDaGlsZHJlbihwYXJlbnRBcHgsIGNoaWxkcmVuQXB4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IHBhcmVudEFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQVBYIHRyaXN0YXRlIHNldENoaWxkcmVuOiBvbmx5IHRoZSBmaXJzdCBwYXJlbnQgaXMgbGlua2VkIHRvIGFsbCBjaGlsZHJlbi4nKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q2hlY2tib3ggPSBwYXJlbnRzWzBdO1xuICAgIGNvbnN0IHBhcmVudFJlZiA9IHBhcmVudENoZWNrYm94Ll9hcHhUcmlzdGF0ZTtcbiAgICBpZiAoIXBhcmVudFJlZikgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyZW50RG9tID0gcGFyZW50UmVmLmRvbTtcbiAgICBjb25zdCBwYXJlbnRIaWRkZW5JbnB1dCA9IHBhcmVudFJlZi5oaWRkZW5JbnB1dDtcblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIGluZGV0ZXJtaW5hdGUgKGRhc2gpIG9uIHBhcmVudCB3aGVuIGl0IGhhcyBjaGlsZHJlbjogZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICgtLW1peGVkKVxuICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLXVuY2hlY2tlZC1pbmRldGVybWluYXRlJywgJ2FweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoJyk7XG5cbiAgICBjb25zdCBjaGlsZENoZWNrYm94ZXMgPSBjaGlsZHJlbkFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBjb25zdCBjaGlsZFJlZnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKSB7XG4gICAgICAgIGlmIChjaGlsZFJlZnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IGNoaWxkUmVmcy5tYXAoKHJlZikgPT4gZ2V0VHJpc3RhdGVTdGF0ZShyZWYuZG9tKSk7XG4gICAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbENyb3NzZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjcm9zc2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbFVuY2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ3VuY2hlY2tlZCcpO1xuICAgICAgICBjb25zdCBtaXhlZCA9ICFhbGxDaGVja2VkICYmICFhbGxDcm9zc2VkICYmICFhbGxVbmNoZWNrZWQ7XG5cbiAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICAgICAgaWYgKG1peGVkKSBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlLS1taXhlZCcpO1xuICAgICAgICBlbHNlIHBhcmVudERvbS5jbGFzc0xpc3QucmVtb3ZlKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG5cbiAgICAgICAgaWYgKGFsbENoZWNrZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIGlmIChhbGxDcm9zc2VkKSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseVBhcmVudFRvQ2hpbGRyZW4oKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFN0YXRlID0gZ2V0VHJpc3RhdGVTdGF0ZShwYXJlbnREb20pO1xuICAgICAgICBjaGlsZFJlZnMuZm9yRWFjaCgocmVmKSA9PiBzZXRUcmlzdGF0ZVN0YXRlKHJlZi5jaGVja2JveCwgcmVmLmRvbSwgcmVmLmhpZGRlbklucHV0LCBwYXJlbnRTdGF0ZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICBhZnRlcihjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCkge1xuICAgICAgICAgICAgICAgIGNoaWxkUmVmcy5wdXNoKHsgY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbmdlOiBzeW5jUGFyZW50RnJvbUNoaWxkcmVuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hpbGRyZW5BcHgudHJpc3RhdGUoY2hpbGRPcHRpb25zKTtcblxuICAgIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKTtcbiAgICBwYXJlbnREb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KGFwcGx5UGFyZW50VG9DaGlsZHJlbiwgMCkpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmlzdGF0ZVN0YXRlKGRvbSkge1xuICAgIGlmIChkb20uY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJykpIHJldHVybiAnY2hlY2tlZCc7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2Nyb3NzZWQnKSkgcmV0dXJuICdjcm9zc2VkJztcbiAgICByZXR1cm4gJ3VuY2hlY2tlZCc7XG59XG5cbmZ1bmN0aW9uIHNldFRyaXN0YXRlU3RhdGUoY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQsIHN0YXRlKSB7XG4gICAgZG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZChzdGF0ZSk7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94LmRhdGFzZXQubmFtZSB8fCBjaGVja2JveC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpIHx8IGNoZWNrYm94Lm5hbWUgfHwgJyc7XG4gICAgaWYgKHN0YXRlID09PSAnY2hlY2tlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGlmIChuYW1lKSBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKGN1c3RvbUNoZWNrYm94LCBhY3R1YWxDaGVja2JveCwgaGlkZGVuSW5wdXQpIHtcbiAgICBjb25zdCB3YXNDaGVja2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJyk7XG4gICAgY29uc3Qgd2FzQ3Jvc3NlZCA9IGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpO1xuICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAod2FzQ2hlY2tlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH0gZWxzZSBpZiAod2FzQ3Jvc3NlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgICAgICBhY3R1YWxDaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGFjdHVhbENoZWNrYm94LmRhdGFzZXQubmFtZSk7IC8vIFJlc3RvcmUgdGhlIG5hbWUgZm9yIHBvc3RpbmdcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBvcHRpb25zKSB7XG4gICAgXG4gICAgLy9nZXQgdGhlIGNoZWNrYm94IG1hcmdpbnMgaW5jbHVkaW5nIGJyb3dzZXIgZGVmYXVsdFxuICAgIGNvbnN0IGNoZWNrYm94U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGVja2JveEVsZW1lbnQpO1xuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXYgYW5kIHNldCBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgIGNvbnN0IHRyaXN0YXRlRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlJyk7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zaXplLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBvcHRpb25zLnNpemUud2lkdGg7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHcgIT09ICdudW1iZXInICYmIHR5cGVvZiB3ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUud2lkdGggbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLndpZHRoID0gdHlwZW9mIHcgPT09ICdudW1iZXInID8gdyArICdweCcgOiBTdHJpbmcodyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS5oZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaCA9IG9wdGlvbnMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGggIT09ICdudW1iZXInICYmIHR5cGVvZiBoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUuaGVpZ2h0IG11c3QgYmUgYSBudW1iZXIgKHB4KSBvciBhIHN0cmluZyAoQ1NTIGxlbmd0aCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlzdGF0ZURvbS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgaCA9PT0gJ251bWJlcicgPyBoICsgJ3B4JyA6IFN0cmluZyhoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZihvcHRpb25zLmNsYXNzZXMpIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoLi4uY29tcHV0ZUNsYXNzZXMob3B0aW9ucy5jbGFzc2VzKSk7XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNvbG9ycyhvcHRpb25zKTtcbiAgICBpZiAoY29sb3JzLnRpY2sgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3InLCBTdHJpbmcoY29sb3JzLnRpY2spKTtcbiAgICBpZiAoY29sb3JzLmNoZWNrZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNoZWNrZWQpKTtcbiAgICBpZiAoY29sb3JzLmNyb3NzZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNyb3NzZWQpKTtcblxuICAgIHRyaXN0YXRlRG9tLnN0eWxlLm1hcmdpbiA9IGNoZWNrYm94U3R5bGUubWFyZ2luO1xuXG4gICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGhpZGRlbiBpbnB1dCBmaWVsZFxuICAgIGNvbnN0IGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBoaWRkZW5JbnB1dC50eXBlID0gJ2hpZGRlbic7XG4gICAgaGlkZGVuSW5wdXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBDb3B5IHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LmRhdGFzZXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBTdG9yZSB0aGUgbmFtZSBpbiBhIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciB1c2VcbiAgICBjaGVja2JveEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveCB0byBhdm9pZCBkb3VibGUgcG9zdGluZ1xuXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlKSBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICBlbHNle1xuICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBoaWRkZW4gaW5wdXQgYmFzZWQgb24gdGhlIGNoZWNrYm94J3Mgc3RhdGVcbiAgICAgICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0Lm5hbWUgPSAnJzsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vaGFuZGxlIGFjY2Vzc2liaWxpdHksIHNldCB0aGUgdGFiaW5kZXggdG8gdGhlIHNhbWUgYXMgdGhlIGNoZWNrYm94XG4gICAgdHJpc3RhdGVEb20udGFiSW5kZXggPSBjaGVja2JveEVsZW1lbnQudGFiSW5kZXg7XG5cbiAgICAvLyBJbnNlcnQgdGhlIGhpZGRlbiBpbnB1dCBpbnNpZGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXZcbiAgICB0cmlzdGF0ZURvbS5hcHBlbmRDaGlsZChoaWRkZW5JbnB1dCk7XG5cbiAgICAvLyBJbnNlcnQgaXQgbmV4dCB0byB0aGUgYWN0dWFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudCwgaGlkZGVuSW5wdXQpO1xuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGUpO1xuICAgIH0pO1xuICAgIHRyaXN0YXRlRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25rZXl1cC5iaW5kKG51bGwsIGNoZWNrYm94RWxlbWVudCkpO1xuXG4gICAgcmV0dXJuIFtjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF07XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpIHtcbiAgICAvLyBFbnN1cmUgb25seSBvbmUgc3RhdGUgY2xhc3MgaXMgc2V0ICh1bmNoZWNrZWRBcHBlYXJhbmNlIG1vZGlmaWVycyBtdXN0IG5vdCBhZmZlY3QgY2hlY2tlZC9jcm9zc2VkKVxuICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ3VuY2hlY2tlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNsYXNzZXMoY2xhc3Nlcykge1xuICAgIGxldCBjb21wdXRlZENsYXNzZXMgPSBbXTtcbiAgICBpZih0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy9yZXBsYWNlIG11bHRpcGxlIHdoaXRlIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcbiAgICAgICAgaWYoY2xhc3Nlcy5pbmRleE9mKCcgJykgPiAtMSlcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgICAgZWxzZSBpZihjbGFzc2VzLmluZGV4T2YoJywnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnLCcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBbY2xhc3Nlc107XG4gICAgfVxuICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWRDbGFzc2VzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29sb3JzKG9wdGlvbnMpIHtcbiAgICBjb25zdCBjID0gb3B0aW9ucy5jb2xvcnMgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGljazogYy50aWNrICE9IG51bGwgPyBjLnRpY2sgOiBvcHRpb25zLnRpY2tDb2xvcixcbiAgICAgICAgY2hlY2tlZDogYy5jaGVja2VkICE9IG51bGwgPyBjLmNoZWNrZWQgOiBvcHRpb25zLmNoZWNrZWRDb2xvcixcbiAgICAgICAgY3Jvc3NlZDogYy5jcm9zc2VkICE9IG51bGwgPyBjLmNyb3NzZWQgOiBvcHRpb25zLmNyb3NzZWRDb2xvclxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZXZlbnQpIHtcbiAgICAvL2lmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSBpcyBzZXQsIGNhbGwgaXRcbiAgICBpZihvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UoY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIH1cblxuICAgIGlmKCFvcHRpb25zLmJ1YmJsZUV2ZW50cykgcmV0dXJuO1xuXG4gICAgaWYoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbiAgICBlbHNlIGlmKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgeyBrZXk6ICcgJywgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2NoYW5nZScpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25rZXl1cChjaGVja2JveEVsZW1lbnQsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChjaGVja2JveEVsZW1lbnQsIGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsaWNrKCk7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBhdWdtZW50V2l0aExpc3RlbiBmcm9tICcuL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMnO1xuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUgZnJvbSAnLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9zY3JvbGxhYmxlVGFibGUubWpzJztcbmltcG9ydCBkaWFsb2cgZnJvbSAnLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzJztcbmltcG9ydCB0b2FzdCBmcm9tICcuL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzJztcbmltcG9ydCB7IGxvYWRDc3MgfSBmcm9tICcuL21vZHVsZXMvY29tbW9uLm1qcyc7XG5pbXBvcnQgeyBhdWdtZW50V2l0aFBhY2ssIHRvb2xzIH0gZnJvbSAnLi9tb2R1bGVzL3Rvb2xzL2V4cG9ydHMubWpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQWCBvYmplY3QgdGhhdCB3cmFwcyBvbmUgb3IgbW9yZSBIVE1MIGVsZW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb258QXJyYXk8SFRNTEVsZW1lbnQ+fGpRdWVyeXxGdW5jdGlvbn0gaW5wdXQgLSBUaGUgaW5wdXQgdG8gY3JlYXRlIHRoZSBBUFggb2JqZWN0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgQVBYIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgdHlwZSBpcyBpbnZhbGlkLlxuICogQGV4YW1wbGVcbiAqIC8vIFhQYXRoXG4gKiBjb25zdCBhcHgxID0gQVBYKCcvL2RpdltAY2xhc3M9XCJleGFtcGxlXCJdJyk7XG4gKlxuICogLy8gQ1NTIHNlbGVjdG9yXG4gKiBjb25zdCBhcHgyID0gQVBYKCcuZXhhbXBsZScpO1xuICpcbiAqIC8vIFNpbmdsZSBlbGVtZW50XG4gKiBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDMgPSBBUFgoZWxlbWVudCk7XG4gKlxuICogLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cbiAqIGNvbnN0IG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDQgPSBBUFgobm9kZUxpc3QpO1xuICpcbiAqIC8vIEFycmF5IG9mIGVsZW1lbnRzXG4gKiBjb25zdCBlbGVtZW50cyA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZTEnKSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUyJyldO1xuICogY29uc3QgYXB4NSA9IEFQWChlbGVtZW50cyk7XG4gKlxuICogLy8galF1ZXJ5IG9iamVjdFxuICogY29uc3QgJGV4YW1wbGUgPSAkKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4NiA9IEFQWCgkZXhhbXBsZSk7XG4gKlxuICogLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3RcbiAqIGNvbnN0IGFweDcgPSBBUFgoKCkgPT4gQVBYKCcuZXhhbXBsZScpKTtcbiAqL1xuY29uc3QgQVBYID0gZnVuY3Rpb24gKGlucHV0LCBjb250ZXh0ID0gZG9jdW1lbnQpIHtcbiAgICBsZXQgZWxlbWVudHM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250ZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQVBYLmlzQVBYT2JqZWN0KGNvbnRleHQpKSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmZpcnN0KCk7XG4gICAgfSBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjb250ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0IGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgIC8vIFhQYXRoIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGRvY3VtZW50LmV2YWx1YXRlKGlucHV0LCBjb250ZXh0LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBsZXQgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMgPSBub2RlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ1NTIHNlbGVjdG9yIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmdsZSBlbGVtZW50IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5jb250YWlucyhpbnB1dCkgPyBbaW5wdXRdIDogW107XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGlucHV0IGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24pIHtcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0KS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZWwgPT4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgZWxlbWVudHMgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBpbnB1dC5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIGpRdWVyeSkge1xuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dC5nZXQoKSkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBUFgoaW5wdXQoKSwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHR5cGUgZm9yIEFQWCcpO1xuICAgIH1cblxuICAgIHZhciBhcHggPSB7XG4gICAgICAgIGVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICAgICAgX2lzQVBYT2JqZWN0OiB0cnVlXG4gICAgfTtcbiAgICBhcHgubGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuICAgIGFweC5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuZWxlbWVudHMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIEFycmF5LmZyb20odGhpcy5lbGVtZW50cykuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07XG4gICAgfTtcbiAgICBhcHguYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gdGhpcy5lbGVtZW50cztcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmZpcnN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoMCk7XG4gICAgfTtcbiAgICBhdWdtZW50V2l0aExpc3RlbihhcHgpO1xuICAgIGF1Z21lbnRXaXRoVHJpc3RhdGUoYXB4KTtcbiAgICBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZShhcHgpO1xuICAgIGF1Z21lbnRXaXRoUGFjayhhcHgpO1xuICAgIHJldHVybiBhcHg7XG59O1xuXG5BUFgubG9hZENzcyA9IGxvYWRDc3M7XG5BUFguZGlhbG9nID0gZGlhbG9nO1xuQVBYLnRvYXN0ID0gdG9hc3Q7XG5BUFgudG9vbHMgPSB0b29scztcbkFQWC5pc0FQWE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIG9iai5faXNBUFhPYmplY3QgPT09IHRydWU7XG59XG5BUFguaXNfbnVtZXJpYyA9IChuKSA9PiB7XG4gICAgcmV0dXJuICFpc05hTihuIC0gcGFyc2VGbG9hdChuKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFQWDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|