@datagrok/sequence-translator 1.0.1 → 1.0.4
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/detectors.js +17 -16
- package/dist/package-test.js +199 -21
- package/dist/package.js +352 -107
- package/package.json +9 -8
- package/package.png +0 -0
- package/src/__jest__/remote.test.ts +33 -14
- package/src/defineAxolabsPattern.ts +48 -24
- package/src/package.ts +46 -6
- package/src/structures-works/converters.ts +20 -0
- package/src/structures-works/map.ts +166 -1
- package/src/structures-works/mol-transformations.ts +2 -2
- package/src/structures-works/sequence-codes-tools.ts +7 -6
- package/test-SequenceTranslator-4f0c8bae6479-18ff1615.html +276 -0
- package/vendors/openchemlib-full.js +293 -0
- package/webpack.config.js +1 -1
- package/test-SequenceTranslator-089b6516ed77-2280593f.html +0 -245
package/dist/package.js
CHANGED
|
@@ -2091,7 +2091,9 @@ function addColumnWithIds(tableName, columnName, patternName) {
|
|
|
2091
2091
|
if (columns.contains(nameOfNewColumn))
|
|
2092
2092
|
columns.remove(nameOfNewColumn);
|
|
2093
2093
|
const columnWithIds = columns.byName(columnName);
|
|
2094
|
-
return columns.addNewString(nameOfNewColumn).init((i) =>
|
|
2094
|
+
return columns.addNewString(nameOfNewColumn).init((i) => {
|
|
2095
|
+
return (columnWithIds.getString(i) == '') ? '' : columnWithIds.get(i) + '_' + patternName;
|
|
2096
|
+
});
|
|
2095
2097
|
}
|
|
2096
2098
|
function addColumnWithTranslatedSequences(tableName, columnName, bases, ptoLinkages, startModification, endModification, firstPtoExist) {
|
|
2097
2099
|
const nameOfNewColumn = 'Axolabs ' + columnName;
|
|
@@ -2100,7 +2102,9 @@ function addColumnWithTranslatedSequences(tableName, columnName, bases, ptoLinka
|
|
|
2100
2102
|
columns.remove(nameOfNewColumn);
|
|
2101
2103
|
const columnWithInputSequences = columns.byName(columnName);
|
|
2102
2104
|
return columns.addNewString(nameOfNewColumn).init((i) => {
|
|
2103
|
-
return
|
|
2105
|
+
return columnWithInputSequences.getString(i) == '' ?
|
|
2106
|
+
'' :
|
|
2107
|
+
translateSequence(columnWithInputSequences.getString(i), bases, ptoLinkages, startModification, endModification, firstPtoExist);
|
|
2104
2108
|
});
|
|
2105
2109
|
}
|
|
2106
2110
|
function defineAxolabsPattern() {
|
|
@@ -2290,7 +2294,7 @@ function defineAxolabsPattern() {
|
|
|
2290
2294
|
const col = tables.value.columns.byName(colName);
|
|
2291
2295
|
let allLengthsAreTheSame = true;
|
|
2292
2296
|
for (let i = 1; i < col.length; i++) {
|
|
2293
|
-
if (col.get(i - 1).length != col.get(i).length) {
|
|
2297
|
+
if (col.get(i - 1).length != col.get(i).length && col.get(i).length != 0) {
|
|
2294
2298
|
allLengthsAreTheSame = false;
|
|
2295
2299
|
break;
|
|
2296
2300
|
}
|
|
@@ -2320,10 +2324,11 @@ function defineAxolabsPattern() {
|
|
|
2320
2324
|
}
|
|
2321
2325
|
function postPatternToUserStorage() {
|
|
2322
2326
|
return __awaiter(this, void 0, void 0, function* () {
|
|
2323
|
-
const
|
|
2324
|
-
|
|
2325
|
-
saveAs.value
|
|
2326
|
-
|
|
2327
|
+
const currUserName = yield getCurrentUserName();
|
|
2328
|
+
saveAs.value = (saveAs.stringValue.includes('(created by ')) ?
|
|
2329
|
+
getShortName(saveAs.value) + currUserName :
|
|
2330
|
+
saveAs.stringValue + currUserName;
|
|
2331
|
+
return datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.dapi.userDataStorage.postValue(userStorageKey, saveAs.value, JSON.stringify({
|
|
2327
2332
|
'ssBases': ssBases.slice(0, ssLength.value).map((e) => e.value),
|
|
2328
2333
|
'asBases': asBases.slice(0, asLength.value).map((e) => e.value),
|
|
2329
2334
|
'ssPtoLinkages': [firstSsPto.value].concat(ssPtoLinkages.slice(0, ssLength.value).map((e) => e.value)),
|
|
@@ -2341,11 +2346,12 @@ function defineAxolabsPattern() {
|
|
|
2341
2346
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.dapi.userDataStorage.get(userStorageKey, false).then((entities) => __awaiter(this, void 0, void 0, function* () {
|
|
2342
2347
|
const lstMy = [];
|
|
2343
2348
|
const lstOthers = [];
|
|
2349
|
+
// TODO: display short name, but use long for querying userdataStorage
|
|
2344
2350
|
for (const ent of Object.keys(entities)) {
|
|
2345
2351
|
if (yield isCurrentUserCreatedThisPattern(ent))
|
|
2346
2352
|
lstOthers.push(ent);
|
|
2347
2353
|
else
|
|
2348
|
-
lstMy.push(getShortName(ent));
|
|
2354
|
+
lstMy.push(ent); //getShortName(ent));
|
|
2349
2355
|
}
|
|
2350
2356
|
let loadPattern = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Load Pattern', '', lstMy, (v) => parsePatternAndUpdateUi(v));
|
|
2351
2357
|
const myOrOthersPatternList = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('', 'Mine', ['Mine', 'Others'], (v) => {
|
|
@@ -2469,7 +2475,7 @@ function defineAxolabsPattern() {
|
|
|
2469
2475
|
const col = tables.value.columns.byName(colName);
|
|
2470
2476
|
if (col.type != datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TYPE.INT)
|
|
2471
2477
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.error('Column should contain integers only');
|
|
2472
|
-
else if (col.categories.length < col.length) {
|
|
2478
|
+
else if (col.categories.filter((e) => e != '').length < col.toList().filter((e) => e != '').length) {
|
|
2473
2479
|
const duplicates = findDuplicates(col.getRawData());
|
|
2474
2480
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Non-unique IDs')
|
|
2475
2481
|
.add(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divText('Press \'OK\' to select rows with non-unique values'))
|
|
@@ -2483,21 +2489,42 @@ function defineAxolabsPattern() {
|
|
|
2483
2489
|
}
|
|
2484
2490
|
}
|
|
2485
2491
|
const tables = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tableInput('Tables', datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tables[0], datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tables, (t) => {
|
|
2486
|
-
const inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', t.columns.names(), (colName) =>
|
|
2492
|
+
const inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', t.columns.names(), (colName) => {
|
|
2493
|
+
validateSsColumn(colName);
|
|
2494
|
+
ssVar = colName;
|
|
2495
|
+
});
|
|
2487
2496
|
inputSsColumnDiv.innerHTML = '';
|
|
2488
2497
|
inputSsColumnDiv.append(inputSsColumn.root);
|
|
2489
|
-
const inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', t.columns.names(), (colName) =>
|
|
2498
|
+
const inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', t.columns.names(), (colName) => {
|
|
2499
|
+
validateAsColumn(colName);
|
|
2500
|
+
asVar = colName;
|
|
2501
|
+
});
|
|
2490
2502
|
inputAsColumnDiv.innerHTML = '';
|
|
2491
2503
|
inputAsColumnDiv.append(inputAsColumn.root);
|
|
2492
|
-
const inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', t.columns.names(), (colName) =>
|
|
2504
|
+
const inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', t.columns.names(), (colName) => {
|
|
2505
|
+
validateIdsColumn(colName);
|
|
2506
|
+
idVar = colName;
|
|
2507
|
+
});
|
|
2493
2508
|
inputIdColumnDiv.innerHTML = '';
|
|
2494
2509
|
inputIdColumnDiv.append(inputIdColumn.root);
|
|
2495
2510
|
});
|
|
2496
|
-
|
|
2511
|
+
let ssVar = '';
|
|
2512
|
+
const inputSsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('SS Column', '', [], (colName) => {
|
|
2513
|
+
validateSsColumn(colName);
|
|
2514
|
+
ssVar = colName;
|
|
2515
|
+
});
|
|
2497
2516
|
inputSsColumnDiv.append(inputSsColumn.root);
|
|
2498
|
-
|
|
2517
|
+
let asVar = '';
|
|
2518
|
+
const inputAsColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('AS Column', '', [], (colName) => {
|
|
2519
|
+
validateAsColumn(colName);
|
|
2520
|
+
asVar = colName;
|
|
2521
|
+
});
|
|
2499
2522
|
inputAsColumnDiv.append(inputAsColumn.root);
|
|
2500
|
-
|
|
2523
|
+
let idVar = '';
|
|
2524
|
+
const inputIdColumn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('ID Column', '', [], (colName) => {
|
|
2525
|
+
validateIdsColumn(colName);
|
|
2526
|
+
idVar = colName;
|
|
2527
|
+
});
|
|
2501
2528
|
inputIdColumnDiv.append(inputIdColumn.root);
|
|
2502
2529
|
updatePatternsList();
|
|
2503
2530
|
const sequenceBase = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Sequence Basis', defaultBase, baseChoices, (v) => {
|
|
@@ -2562,7 +2589,7 @@ function defineAxolabsPattern() {
|
|
|
2562
2589
|
}
|
|
2563
2590
|
});
|
|
2564
2591
|
const convertSequenceButton = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.button('Convert Sequences', () => {
|
|
2565
|
-
if (
|
|
2592
|
+
if (ssVar == '' || (createAsStrand.value && asVar == ''))
|
|
2566
2593
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info('Please select table and columns on which to apply pattern');
|
|
2567
2594
|
else if (ssLength.value != ssInputExample.value.length || asLength.value != asInputExample.value.length) {
|
|
2568
2595
|
const dialog = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Length Mismatch');
|
|
@@ -2577,11 +2604,11 @@ function defineAxolabsPattern() {
|
|
|
2577
2604
|
.show();
|
|
2578
2605
|
}
|
|
2579
2606
|
else {
|
|
2580
|
-
if (
|
|
2581
|
-
addColumnWithIds(tables.value.name,
|
|
2582
|
-
addColumnWithTranslatedSequences(tables.value.name,
|
|
2607
|
+
if (idVar != '')
|
|
2608
|
+
addColumnWithIds(tables.value.name, idVar, getShortName(saveAs.value));
|
|
2609
|
+
addColumnWithTranslatedSequences(tables.value.name, ssVar, ssBases, ssPtoLinkages, ssFiveModification, ssThreeModification, firstSsPto.value);
|
|
2583
2610
|
if (createAsStrand.value) {
|
|
2584
|
-
addColumnWithTranslatedSequences(tables.value.name,
|
|
2611
|
+
addColumnWithTranslatedSequences(tables.value.name, asVar, asBases, asPtoLinkages, asFiveModification, asThreeModification, firstAsPto.value);
|
|
2585
2612
|
}
|
|
2586
2613
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.v = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.getTableView(tables.value.name);
|
|
2587
2614
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(((createAsStrand.value) ? 'Columns were' : 'Column was') +
|
|
@@ -2971,6 +2998,7 @@ NO DATA
|
|
|
2971
2998
|
"use strict";
|
|
2972
2999
|
__webpack_require__.r(__webpack_exports__);
|
|
2973
3000
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3001
|
+
/* harmony export */ "gcrsToLcms": () => (/* binding */ gcrsToLcms),
|
|
2974
3002
|
/* harmony export */ "asoGapmersNucleotidesToBioSpring": () => (/* binding */ asoGapmersNucleotidesToBioSpring),
|
|
2975
3003
|
/* harmony export */ "asoGapmersNucleotidesToGcrs": () => (/* binding */ asoGapmersNucleotidesToGcrs),
|
|
2976
3004
|
/* harmony export */ "asoGapmersBioSpringToNucleotides": () => (/* binding */ asoGapmersBioSpringToNucleotides),
|
|
@@ -2993,6 +3021,27 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2993
3021
|
/* harmony export */ "gcrsToNucleotides": () => (/* binding */ gcrsToNucleotides),
|
|
2994
3022
|
/* harmony export */ "gcrsToMermade12": () => (/* binding */ gcrsToMermade12)
|
|
2995
3023
|
/* harmony export */ });
|
|
3024
|
+
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
3025
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
3026
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__);
|
|
3027
|
+
|
|
3028
|
+
|
|
3029
|
+
//name: gcrsToLcms
|
|
3030
|
+
//input: string nucleotides {semType: GCRS}
|
|
3031
|
+
//output: string result {semType: LCMS}
|
|
3032
|
+
function gcrsToLcms(sequence) {
|
|
3033
|
+
const df = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.DataFrame.fromCsv(_map__WEBPACK_IMPORTED_MODULE_0__.lcmsToGcrs);
|
|
3034
|
+
const arr1 = df.getCol('GCRS').toList();
|
|
3035
|
+
const arr2 = df.getCol('LCMS').toList();
|
|
3036
|
+
const obj = {};
|
|
3037
|
+
arr1.forEach((element, index) => obj[element] = arr2[index]);
|
|
3038
|
+
for (let i = 0; i < arr1.length; i++) {
|
|
3039
|
+
arr1[i] = arr1[i].replace('(', '\\(');
|
|
3040
|
+
arr1[i] = arr1[i].replace(')', '\\)');
|
|
3041
|
+
}
|
|
3042
|
+
const regExp = new RegExp('(' + arr1.join('|') + ')', 'g');
|
|
3043
|
+
return sequence.replace(regExp, function (code) { return obj[code]; });
|
|
3044
|
+
}
|
|
2996
3045
|
//name: asoGapmersNucleotidesToBioSpring
|
|
2997
3046
|
//input: string nucleotides {semType: DNA nucleotides}
|
|
2998
3047
|
//output: string result {semType: BioSpring / Gapmers}
|
|
@@ -3398,14 +3447,22 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3398
3447
|
/* harmony export */ "COL_NAMES": () => (/* binding */ COL_NAMES),
|
|
3399
3448
|
/* harmony export */ "MODIFICATIONS": () => (/* binding */ MODIFICATIONS),
|
|
3400
3449
|
/* harmony export */ "stadardPhosphateLinkSmiles": () => (/* binding */ stadardPhosphateLinkSmiles),
|
|
3401
|
-
/* harmony export */ "map": () => (/* binding */ map)
|
|
3450
|
+
/* harmony export */ "map": () => (/* binding */ map),
|
|
3451
|
+
/* harmony export */ "lcmsToGcrs": () => (/* binding */ lcmsToGcrs),
|
|
3452
|
+
/* harmony export */ "gcrsCodesWithoutSmiles": () => (/* binding */ gcrsCodesWithoutSmiles)
|
|
3402
3453
|
/* harmony export */ });
|
|
3454
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
3455
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
3456
|
+
/* harmony import */ var _sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
|
|
3457
|
+
|
|
3458
|
+
|
|
3403
3459
|
const SYNTHESIZERS = {
|
|
3404
3460
|
RAW_NUCLEOTIDES: 'Raw Nucleotides',
|
|
3405
3461
|
BIOSPRING: 'BioSpring Codes',
|
|
3406
3462
|
GCRS: 'Janssen GCRS Codes',
|
|
3407
3463
|
AXOLABS: 'Axolabs Codes',
|
|
3408
3464
|
MERMADE_12: 'Mermade 12',
|
|
3465
|
+
LCMS: 'LCMS',
|
|
3409
3466
|
};
|
|
3410
3467
|
const TECHNOLOGIES = {
|
|
3411
3468
|
DNA: 'DNA',
|
|
@@ -3858,6 +3915,7 @@ const map = {
|
|
|
3858
3915
|
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
3859
3916
|
},
|
|
3860
3917
|
},
|
|
3918
|
+
'Others': {},
|
|
3861
3919
|
},
|
|
3862
3920
|
'Mermade 12': {
|
|
3863
3921
|
'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
@@ -3959,7 +4017,164 @@ const map = {
|
|
|
3959
4017
|
},
|
|
3960
4018
|
},
|
|
3961
4019
|
},
|
|
4020
|
+
// 'LCMS': {
|
|
4021
|
+
// 'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
3962
4022
|
};
|
|
4023
|
+
const lcmsToGcrs = `LCMS, GCRS
|
|
4024
|
+
A, A
|
|
4025
|
+
C, C
|
|
4026
|
+
/5mC/, (5m)C
|
|
4027
|
+
G, G
|
|
4028
|
+
T, T
|
|
4029
|
+
rA, rA
|
|
4030
|
+
rC, rC
|
|
4031
|
+
rG, rG
|
|
4032
|
+
rU, rU
|
|
4033
|
+
mA, mA
|
|
4034
|
+
mC, mC
|
|
4035
|
+
/5mmC/, (5m)mC
|
|
4036
|
+
mG, mG
|
|
4037
|
+
mU, mU
|
|
4038
|
+
fA, fA
|
|
4039
|
+
fC, fC
|
|
4040
|
+
/5mfC/, (5m)fC
|
|
4041
|
+
fG, fG
|
|
4042
|
+
fU, fU
|
|
4043
|
+
/afA/, afA
|
|
4044
|
+
/afC/, afC
|
|
4045
|
+
/afG/, afG
|
|
4046
|
+
/afU/, afU
|
|
4047
|
+
+A, lna A
|
|
4048
|
+
+C, lna C
|
|
4049
|
+
+G, lna G
|
|
4050
|
+
+T, lna T
|
|
4051
|
+
/moeA/, moeA
|
|
4052
|
+
/moeC/, moeC
|
|
4053
|
+
/5mmoeC/, (5m)moeC
|
|
4054
|
+
/moeG/, moeG
|
|
4055
|
+
/moeT/, moeT
|
|
4056
|
+
/moeU/, moeU
|
|
4057
|
+
/xA/, Anp
|
|
4058
|
+
/xC/, Cnp
|
|
4059
|
+
/x5mC/, (5m)Cnp
|
|
4060
|
+
/xG/, Gnp
|
|
4061
|
+
/xT/, Tnp
|
|
4062
|
+
/xrA/, rAnp
|
|
4063
|
+
/xrC/, rCnp
|
|
4064
|
+
/xrG/, rGnp
|
|
4065
|
+
/xrU/, rUnp
|
|
4066
|
+
/xmA/, mAnp
|
|
4067
|
+
/xmC/, mCnp
|
|
4068
|
+
/x5mmC/, (5m)mCnp
|
|
4069
|
+
/xmG/, mGnp
|
|
4070
|
+
/xmU/, mUnp
|
|
4071
|
+
/xfA/, fAnp
|
|
4072
|
+
/xfC/, fCnp
|
|
4073
|
+
/xfG/, fGnp
|
|
4074
|
+
/xfT/, fTnp
|
|
4075
|
+
/xfU/, fUnp
|
|
4076
|
+
/xafA/, afAnp
|
|
4077
|
+
/xafC/, afCnp
|
|
4078
|
+
/xafG/, afGnp
|
|
4079
|
+
/xafU/, afUnp
|
|
4080
|
+
/xeA/, eAnp
|
|
4081
|
+
/xeC/, eCnp
|
|
4082
|
+
/xeG/, eGnp
|
|
4083
|
+
/xeU/, eUnp
|
|
4084
|
+
/xmoeA/, moeAnp
|
|
4085
|
+
/xmoeC/, moeCnp
|
|
4086
|
+
/x5mmoeC/, (5m)moeCnp
|
|
4087
|
+
/xmoeG/, moeGnp
|
|
4088
|
+
/xmoeU/, moeUnp
|
|
4089
|
+
/UNA-A/, (UNA-A)
|
|
4090
|
+
/UNA-C/, (UNA-C)
|
|
4091
|
+
/UNA-G/, (UNA-G)
|
|
4092
|
+
/UNA-T/, (UNA-T)
|
|
4093
|
+
/UNA-U/, (UNA-U)
|
|
4094
|
+
/GNA-A/, (GNA-A)
|
|
4095
|
+
/GNA-C/, (GNA-C)
|
|
4096
|
+
/GNA-G/, (GNA-G)
|
|
4097
|
+
/GNA-T/, (GNA-T)
|
|
4098
|
+
/GNA-U/, (GNA-U)
|
|
4099
|
+
/5CholTEG/, (5-CholTEG)
|
|
4100
|
+
/3CholTEG/, (TEGChol-3)
|
|
4101
|
+
/Toco/, Toco
|
|
4102
|
+
/Palm/, Palm
|
|
4103
|
+
/GalNAc/, GalNAc
|
|
4104
|
+
/GalNAc2/, GalNAc2
|
|
4105
|
+
/GalNAc3/, GalNAc3
|
|
4106
|
+
/GalNAc6/, GalNAc6
|
|
4107
|
+
/GalNAc7/, GalNAc7
|
|
4108
|
+
/GalNAc9/, GalNAc9
|
|
4109
|
+
/GalNAc14/, GalNAc14
|
|
4110
|
+
/NAG37/, NAG37
|
|
4111
|
+
/HEG/, (HEG)
|
|
4112
|
+
/TEG/, (TEG)
|
|
4113
|
+
/AmmC6/, (NHC6)
|
|
4114
|
+
/AmmC7/, (NHC7)
|
|
4115
|
+
/AmmC12/, (NHC12)
|
|
4116
|
+
/invAb/, (invabasic)
|
|
4117
|
+
/invdT/, (invdT)
|
|
4118
|
+
/VPmU/, (vinu)
|
|
4119
|
+
*, ps
|
|
4120
|
+
/2-C16U/, 2-C16U
|
|
4121
|
+
/2-C18w9U/, 2-C18w9U
|
|
4122
|
+
/JDi-Palm/, JDi-Palm
|
|
4123
|
+
/J2-CONC16U/, J2-CONC16U
|
|
4124
|
+
/J2-C3NC16U/, J2-C3NC16U
|
|
4125
|
+
/J-C15Ada/, J-C15Ada
|
|
4126
|
+
/J-2C15AdaU/, J-2C15AdaU
|
|
4127
|
+
/J-C16NC6/, J-C16NC6
|
|
4128
|
+
/R2-C6NH-U/, R2-C6NH-U
|
|
4129
|
+
/J-M1/, J-M1
|
|
4130
|
+
/J-B1/, J-B1
|
|
4131
|
+
/J-B2/, J-B2
|
|
4132
|
+
/J-M2/, J-M2
|
|
4133
|
+
/2-C16C/, 2-C16C
|
|
4134
|
+
/2-C16A/, 2-C16A
|
|
4135
|
+
/2-C16G/, 2-C16G
|
|
4136
|
+
/R2-C6NH-G/, R2-C6NH-G
|
|
4137
|
+
/R2-C6NH-C/, R2-C6NH-C
|
|
4138
|
+
/J2-CONC16A/, J2-CONC16A
|
|
4139
|
+
/J2-CONC16C/, J2-CONC16C
|
|
4140
|
+
/J2-CONC16G/, J2-CONC16G
|
|
4141
|
+
/J2-C15AdaC/, J2-C15AdaC
|
|
4142
|
+
/J2-M2U/, J2-M2U
|
|
4143
|
+
/J2-B2U/, J2-B2U
|
|
4144
|
+
/J2-C3NC16C/, J2-C3NC16C
|
|
4145
|
+
/J2-C3NC16G/, J2-C3NC16G
|
|
4146
|
+
/R2-C6NH-A/, R2-C6NH-A
|
|
4147
|
+
/J2-C15AdaA/, J2-C15AdaA
|
|
4148
|
+
/J2-C3NC16A/, J2-C3NC16A
|
|
4149
|
+
/J-C5-SER-1/, J-C5-SER-1
|
|
4150
|
+
/J-C16-SER-1/, J-C16-SER-1
|
|
4151
|
+
/J-A2/, J-A2
|
|
4152
|
+
/J-A1/, J-A1
|
|
4153
|
+
/J2-C15AdaG/, J2-C15AdaG
|
|
4154
|
+
/J-C16NAsp/, J-C16NAsp
|
|
4155
|
+
/J2-C16NC6U/, J2-C16NC6U
|
|
4156
|
+
/J-C5-REBO-1/, J-C5-REBO-1
|
|
4157
|
+
/J-C16-REBO-1/, J-C16-REBO-1
|
|
4158
|
+
/J-C16-IND-1/, J-C16-IND-1
|
|
4159
|
+
/J-C5-IND-1/, J-C5-IND-1
|
|
4160
|
+
/J-1C15Ada-2Man/, J-1C15Ada-2Man
|
|
4161
|
+
/JG-1C15Ada-23DiMan/, JG-1C15Ada-2,3DiMan
|
|
4162
|
+
/J-TriManPC/, J-TriManPC
|
|
4163
|
+
/J-triManPO/, J-triManPO
|
|
4164
|
+
/J-A4/, J-A4
|
|
4165
|
+
/J-Ara-1/, J-Ara-1
|
|
4166
|
+
/J-Ara-2/, J-Ara-2
|
|
4167
|
+
/J-AcCS/, J-AcCS
|
|
4168
|
+
/J-CbCS/, J-CbCS
|
|
4169
|
+
/J-MtCD/, J-MtCD`;
|
|
4170
|
+
function differenceOfTwoArrays(a, b) {
|
|
4171
|
+
return a.filter((x) => !b.includes(x));
|
|
4172
|
+
}
|
|
4173
|
+
const codesWithSmiles = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.getAllCodesOfSynthesizer)(SYNTHESIZERS.GCRS);
|
|
4174
|
+
const allGcrsCodes = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromCsv(lcmsToGcrs).getCol('GCRS').toList();
|
|
4175
|
+
const gcrsCodesWithoutSmiles = differenceOfTwoArrays(allGcrsCodes, codesWithSmiles);
|
|
4176
|
+
for (const e of gcrsCodesWithoutSmiles)
|
|
4177
|
+
map[SYNTHESIZERS.GCRS]['Others'][e] = { 'SMILES': '' };
|
|
3963
4178
|
|
|
3964
4179
|
|
|
3965
4180
|
/***/ }),
|
|
@@ -3976,9 +4191,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3976
4191
|
/* harmony export */ "getNucleotidesMol": () => (/* binding */ getNucleotidesMol),
|
|
3977
4192
|
/* harmony export */ "linkV3000": () => (/* binding */ linkV3000)
|
|
3978
4193
|
/* harmony export */ });
|
|
3979
|
-
/* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! openchemlib/full.js */ "openchemlib/full.js");
|
|
3980
|
-
/* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
3981
|
-
|
|
3982
4194
|
const PHOSHATE = `
|
|
3983
4195
|
Datagrok monomer library Nucleotides
|
|
3984
4196
|
|
|
@@ -4204,7 +4416,8 @@ function linkV3000(molBlocks, twoChains = false, oclRender = false) {
|
|
|
4204
4416
|
return macroMolBlock;
|
|
4205
4417
|
}
|
|
4206
4418
|
function rotateNucleotidesV3000(molecule) {
|
|
4207
|
-
|
|
4419
|
+
// @ts-ignore
|
|
4420
|
+
let molBlock = molecule.includes('M END') ? molecule : OCL.Molecule.fromSmiles(molecule).toMolfileV3();
|
|
4208
4421
|
const coordinates = extractAtomDataV3000(molBlock);
|
|
4209
4422
|
const natom = coordinates.atomIndex.length;
|
|
4210
4423
|
const indexFivePrime = coordinates.atomIndex.indexOf(1);
|
|
@@ -4257,7 +4470,8 @@ function rotateNucleotidesV3000(molecule) {
|
|
|
4257
4470
|
return molBlock;
|
|
4258
4471
|
}
|
|
4259
4472
|
function invertNucleotidesV3000(molecule) {
|
|
4260
|
-
|
|
4473
|
+
// @ts-ignore
|
|
4474
|
+
let molBlock = molecule.includes('M END') ? molecule : OCL.Molecule.fromSmiles(molecule).toMolfileV3();
|
|
4261
4475
|
const coordinates = extractAtomDataV3000(molBlock);
|
|
4262
4476
|
const natom = coordinates.atomIndex.length;
|
|
4263
4477
|
const xCenter = (Math.max(...coordinates.x) + Math.min(...coordinates.x)) / 2;
|
|
@@ -4438,13 +4652,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4438
4652
|
/* harmony export */ "undefinedInputSequence": () => (/* binding */ undefinedInputSequence),
|
|
4439
4653
|
/* harmony export */ "getFormat": () => (/* binding */ getFormat),
|
|
4440
4654
|
/* harmony export */ "isValidSequence": () => (/* binding */ isValidSequence),
|
|
4655
|
+
/* harmony export */ "getAllCodesOfSynthesizer": () => (/* binding */ getAllCodesOfSynthesizer),
|
|
4441
4656
|
/* harmony export */ "convertSequence": () => (/* binding */ convertSequence)
|
|
4442
4657
|
/* harmony export */ });
|
|
4443
4658
|
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
4444
4659
|
/* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
|
|
4445
|
-
// import * as grok from 'datagrok-api/grok';
|
|
4446
|
-
// import * as ui from 'datagrok-api/ui';
|
|
4447
|
-
// import * as DG from 'datagrok-api/dg';
|
|
4448
4660
|
|
|
4449
4661
|
|
|
4450
4662
|
const noTranslationTableAvailable = 'No translation table available';
|
|
@@ -4600,7 +4812,7 @@ function getAllCodesOfSynthesizer(synthesizer) {
|
|
|
4600
4812
|
let codes = [];
|
|
4601
4813
|
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer]))
|
|
4602
4814
|
codes = codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]));
|
|
4603
|
-
return codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS));
|
|
4815
|
+
return codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS)).concat(',');
|
|
4604
4816
|
}
|
|
4605
4817
|
function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
|
|
4606
4818
|
const synthesizers = [];
|
|
@@ -4659,6 +4871,7 @@ function convertSequence(sequence, output) {
|
|
|
4659
4871
|
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersGcrsToBioSpring)(sequence),
|
|
4660
4872
|
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4661
4873
|
GCRS: sequence,
|
|
4874
|
+
LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
|
|
4662
4875
|
};
|
|
4663
4876
|
}
|
|
4664
4877
|
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA)) {
|
|
@@ -4696,6 +4909,7 @@ function convertSequence(sequence, output) {
|
|
|
4696
4909
|
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToAxolabs)(sequence),
|
|
4697
4910
|
MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4698
4911
|
GCRS: sequence,
|
|
4912
|
+
LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
|
|
4699
4913
|
};
|
|
4700
4914
|
}
|
|
4701
4915
|
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) {
|
|
@@ -4704,6 +4918,7 @@ function convertSequence(sequence, output) {
|
|
|
4704
4918
|
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToNucleotides)(sequence),
|
|
4705
4919
|
GCRS: sequence,
|
|
4706
4920
|
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
4921
|
+
LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
|
|
4707
4922
|
};
|
|
4708
4923
|
}
|
|
4709
4924
|
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12)) {
|
|
@@ -4752,17 +4967,6 @@ module.exports = DG;
|
|
|
4752
4967
|
|
|
4753
4968
|
/***/ }),
|
|
4754
4969
|
|
|
4755
|
-
/***/ "openchemlib/full.js":
|
|
4756
|
-
/*!**********************!*\
|
|
4757
|
-
!*** external "OCL" ***!
|
|
4758
|
-
\**********************/
|
|
4759
|
-
/***/ ((module) => {
|
|
4760
|
-
|
|
4761
|
-
"use strict";
|
|
4762
|
-
module.exports = OCL;
|
|
4763
|
-
|
|
4764
|
-
/***/ }),
|
|
4765
|
-
|
|
4766
4970
|
/***/ "datagrok-api/grok":
|
|
4767
4971
|
/*!***********************!*\
|
|
4768
4972
|
!*** external "grok" ***!
|
|
@@ -4873,15 +5077,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4873
5077
|
/* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__);
|
|
4874
5078
|
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
4875
5079
|
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__);
|
|
4876
|
-
/* harmony import */ var
|
|
4877
|
-
/* harmony import */ var
|
|
4878
|
-
/* harmony import */ var
|
|
4879
|
-
/* harmony import */ var
|
|
4880
|
-
/* harmony import */ var
|
|
4881
|
-
/* harmony import */ var
|
|
4882
|
-
/* harmony import */ var
|
|
4883
|
-
/* harmony import */ var
|
|
4884
|
-
/* harmony import */ var _structures_works_map__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./structures-works/map */ "./src/structures-works/map.ts");
|
|
5080
|
+
/* harmony import */ var cash_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! cash-dom */ "./node_modules/cash-dom/dist/cash.js");
|
|
5081
|
+
/* harmony import */ var cash_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cash_dom__WEBPACK_IMPORTED_MODULE_3__);
|
|
5082
|
+
/* harmony import */ var _defineAxolabsPattern__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defineAxolabsPattern */ "./src/defineAxolabsPattern.ts");
|
|
5083
|
+
/* harmony import */ var _structures_works_save_sense_antisense__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./structures-works/save-sense-antisense */ "./src/structures-works/save-sense-antisense.ts");
|
|
5084
|
+
/* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
|
|
5085
|
+
/* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
|
|
5086
|
+
/* harmony import */ var _structures_works_map__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./structures-works/map */ "./src/structures-works/map.ts");
|
|
5087
|
+
/* harmony import */ var _structures_works_converters__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./structures-works/converters */ "./src/structures-works/converters.ts");
|
|
4885
5088
|
/* harmony import */ var _salts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./salts */ "./src/salts.ts");
|
|
4886
5089
|
/* harmony import */ var _users__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./users */ "./src/users.ts");
|
|
4887
5090
|
/* harmony import */ var _ICDs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ICDs */ "./src/ICDs.ts");
|
|
@@ -4896,6 +5099,7 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
|
|
|
4896
5099
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
4897
5100
|
});
|
|
4898
5101
|
};
|
|
5102
|
+
var _a;
|
|
4899
5103
|
/* Do not change these import lines. Datagrok will import API library in exactly the same manner */
|
|
4900
5104
|
|
|
4901
5105
|
|
|
@@ -4930,11 +5134,11 @@ function sequenceTranslator() {
|
|
|
4930
5134
|
let errorsExist = false;
|
|
4931
5135
|
try {
|
|
4932
5136
|
sequence = sequence.replace(/\s/g, '');
|
|
4933
|
-
const output = (0,
|
|
5137
|
+
const output = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.isValidSequence)(sequence, null);
|
|
4934
5138
|
if (isSet)
|
|
4935
5139
|
output.synthesizer = [inputFormat];
|
|
4936
5140
|
inputFormatChoiceInput.value = output.synthesizer[0];
|
|
4937
|
-
const outputSequenceObj = (0,
|
|
5141
|
+
const outputSequenceObj = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.convertSequence)(sequence, output);
|
|
4938
5142
|
const tableRows = [];
|
|
4939
5143
|
for (const key of Object.keys(outputSequenceObj).slice(1)) {
|
|
4940
5144
|
const indexOfFirstNotValidChar = ('indexOfFirstNotValidChar' in outputSequenceObj) ?
|
|
@@ -4976,22 +5180,22 @@ function sequenceTranslator() {
|
|
|
4976
5180
|
outputTableDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([
|
|
4977
5181
|
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.HtmlTable.create(tableRows, (item) => [item.key, item.value], ['Code', 'Sequence']).root,
|
|
4978
5182
|
]));
|
|
4979
|
-
if (outputSequenceObj.type !=
|
|
5183
|
+
if (outputSequenceObj.type != _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.undefinedInputSequence && outputSequenceObj.Error != _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.undefinedInputSequence) {
|
|
4980
5184
|
const canvas = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.canvas(300, 170);
|
|
4981
5185
|
canvas.addEventListener('click', () => {
|
|
4982
|
-
const canv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.canvas(
|
|
4983
|
-
const mol = (0,
|
|
5186
|
+
const canv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.canvas(cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(window).width(), cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(window).height());
|
|
5187
|
+
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true, output.synthesizer[0]);
|
|
4984
5188
|
// @ts-ignore
|
|
4985
|
-
|
|
5189
|
+
OCL.StructureView.drawMolecule(canv, OCL.Molecule.fromMolfile(mol), { suppressChiralText: true });
|
|
4986
5190
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Molecule: ' + inputSequenceField.value)
|
|
4987
5191
|
.add(canv)
|
|
4988
5192
|
.showModal(true);
|
|
4989
5193
|
});
|
|
4990
|
-
|
|
4991
|
-
|
|
4992
|
-
const mol = (0,
|
|
5194
|
+
cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(canvas).on('mouseover', () => cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(canvas).css('cursor', 'zoom-in'));
|
|
5195
|
+
cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(canvas).on('mouseout', () => cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(canvas).css('cursor', 'default'));
|
|
5196
|
+
const mol = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, true, output.synthesizer[0]);
|
|
4993
5197
|
// @ts-ignore
|
|
4994
|
-
|
|
5198
|
+
OCL.StructureView.drawMolecule(canvas, OCL.Molecule.fromMolfile(mol), { suppressChiralText: true });
|
|
4995
5199
|
moleculeSvgDiv.append(canvas);
|
|
4996
5200
|
}
|
|
4997
5201
|
else
|
|
@@ -5001,7 +5205,7 @@ function sequenceTranslator() {
|
|
|
5001
5205
|
pi.close();
|
|
5002
5206
|
}
|
|
5003
5207
|
}
|
|
5004
|
-
const inputFormatChoiceInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Input format: ', 'Janssen GCRS Codes', Object.keys(
|
|
5208
|
+
const inputFormatChoiceInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Input format: ', 'Janssen GCRS Codes', Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.map), (format) => {
|
|
5005
5209
|
updateTableAndMolecule(inputSequenceField.value.replace(/\s/g, ''), format, true);
|
|
5006
5210
|
});
|
|
5007
5211
|
const moleculeSvgDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.block([]);
|
|
@@ -5039,7 +5243,7 @@ function sequenceTranslator() {
|
|
|
5039
5243
|
{ 'Name': 'ps linkage', 'BioSpring': '*', 'Axolabs': 's', 'Janssen GCRS': 'ps' },
|
|
5040
5244
|
]), { showRowHeader: false, showCellTooltip: false });
|
|
5041
5245
|
const overhangModificationsGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromColumns([
|
|
5042
|
-
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.fromStrings('Name', Object.keys(
|
|
5246
|
+
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.fromStrings('Name', Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.MODIFICATIONS)),
|
|
5043
5247
|
]), { showRowHeader: false, showCellTooltip: false });
|
|
5044
5248
|
updateTableAndMolecule(defaultInput, inputFormatChoiceInput.value, true);
|
|
5045
5249
|
const appMainDescription = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.info([
|
|
@@ -5079,24 +5283,25 @@ function sequenceTranslator() {
|
|
|
5079
5283
|
]),
|
|
5080
5284
|
codesTablesDiv,
|
|
5081
5285
|
], { style: { height: '100%', width: '100%' } })),
|
|
5082
|
-
'AXOLABS': (0,
|
|
5083
|
-
'SDF': (0,
|
|
5286
|
+
'AXOLABS': (0,_defineAxolabsPattern__WEBPACK_IMPORTED_MODULE_4__.defineAxolabsPattern)(),
|
|
5287
|
+
'SDF': (0,_structures_works_save_sense_antisense__WEBPACK_IMPORTED_MODULE_5__.saveSenseAntiSense)(),
|
|
5084
5288
|
});
|
|
5289
|
+
cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(codesTablesDiv).hide();
|
|
5085
5290
|
const v = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.newView('Sequence Translator', [tabControl]);
|
|
5086
5291
|
v.box = true;
|
|
5087
|
-
const switchInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.switchInput('Codes',
|
|
5088
|
-
|
|
5089
|
-
|
|
5292
|
+
const switchInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.switchInput('Codes', false, (v) => (v) ?
|
|
5293
|
+
cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(codesTablesDiv).show() :
|
|
5294
|
+
cash_dom__WEBPACK_IMPORTED_MODULE_3___default()(codesTablesDiv).hide());
|
|
5090
5295
|
const topPanel = [
|
|
5091
5296
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('download', () => {
|
|
5092
|
-
const result = (0,
|
|
5297
|
+
const result = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, false, inputFormatChoiceInput.value);
|
|
5093
5298
|
const element = document.createElement('a');
|
|
5094
5299
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
|
|
5095
5300
|
element.setAttribute('download', inputSequenceField.value.replace(/\s/g, '') + '.mol');
|
|
5096
5301
|
element.click();
|
|
5097
5302
|
}, 'Save .mol file'),
|
|
5098
5303
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('copy', () => {
|
|
5099
|
-
navigator.clipboard.writeText((0,
|
|
5304
|
+
navigator.clipboard.writeText((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToSmiles)(inputSequenceField.value.replace(/\s/g, ''), false, inputFormatChoiceInput.value))
|
|
5100
5305
|
.then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(sequenceWasCopied));
|
|
5101
5306
|
}, 'Copy SMILES'),
|
|
5102
5307
|
switchInput.root,
|
|
@@ -5108,19 +5313,19 @@ function saveTableAsSdFile(table) {
|
|
|
5108
5313
|
return __awaiter(this, void 0, void 0, function* () {
|
|
5109
5314
|
if (!table.columns.contains('Compound Name')) {
|
|
5110
5315
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning('File saved without columns \'' +
|
|
5111
|
-
[
|
|
5112
|
-
|
|
5316
|
+
[_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_NAME, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_COMMENTS, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.CPD_MW,
|
|
5317
|
+
_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT_MASS, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.BATCH_MW].join('\', \''));
|
|
5113
5318
|
}
|
|
5114
|
-
const structureColumn = table.col(
|
|
5115
|
-
const typeColumn = table.col(
|
|
5319
|
+
const structureColumn = table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SEQUENCE);
|
|
5320
|
+
const typeColumn = table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.TYPE);
|
|
5116
5321
|
let result = '';
|
|
5117
5322
|
for (let i = 0; i < table.rowCount; i++) {
|
|
5118
|
-
const format = (0,
|
|
5323
|
+
const format = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.getFormat)(structureColumn.get(i));
|
|
5119
5324
|
result += (typeColumn.get(i) == 'SS') ?
|
|
5120
|
-
(0,
|
|
5121
|
-
(0,
|
|
5325
|
+
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(structureColumn.get(i), false, true, format) + '\n' + `> <Sequence>\nSense Strand\n\n` :
|
|
5326
|
+
(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(structureColumn.get(i), true, true, format) + '\n' + `> <Sequence>\nAnti Sense\n\n`;
|
|
5122
5327
|
for (const col of table.columns) {
|
|
5123
|
-
if (col.name !=
|
|
5328
|
+
if (col.name != _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SEQUENCE)
|
|
5124
5329
|
result += `> <${col.name}>\n${col.get(i)}\n\n`;
|
|
5125
5330
|
}
|
|
5126
5331
|
result += '$$$$\n\n';
|
|
@@ -5132,13 +5337,13 @@ function saveTableAsSdFile(table) {
|
|
|
5132
5337
|
});
|
|
5133
5338
|
}
|
|
5134
5339
|
const weightsObj = {};
|
|
5135
|
-
for (const synthesizer of Object.keys(
|
|
5136
|
-
for (const technology of Object.keys(
|
|
5137
|
-
for (const code of Object.keys(
|
|
5138
|
-
weightsObj[code]
|
|
5340
|
+
for (const synthesizer of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.map)) {
|
|
5341
|
+
for (const technology of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.map[synthesizer])) {
|
|
5342
|
+
for (const code of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.map[synthesizer][technology]))
|
|
5343
|
+
(_a = weightsObj[code]) !== null && _a !== void 0 ? _a : _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.map[synthesizer][technology][code].weight;
|
|
5139
5344
|
}
|
|
5140
5345
|
}
|
|
5141
|
-
for (const [key, value] of Object.entries(
|
|
5346
|
+
for (const [key, value] of Object.entries(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.MODIFICATIONS))
|
|
5142
5347
|
weightsObj[key] = value.molecularWeight;
|
|
5143
5348
|
function sortByStringLengthInDescendingOrder(array) {
|
|
5144
5349
|
return array.sort(function (a, b) { return b.length - a.length; });
|
|
@@ -5147,7 +5352,7 @@ function stringifyItems(items) {
|
|
|
5147
5352
|
return '["' + items.join('", "') + '"]';
|
|
5148
5353
|
}
|
|
5149
5354
|
function molecularWeight(sequence, weightsObj) {
|
|
5150
|
-
const codes = sortByStringLengthInDescendingOrder(Object.keys(weightsObj)).concat(Object.keys(
|
|
5355
|
+
const codes = sortByStringLengthInDescendingOrder(Object.keys(weightsObj)).concat(Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.MODIFICATIONS));
|
|
5151
5356
|
let weight = 0;
|
|
5152
5357
|
let i = 0;
|
|
5153
5358
|
while (i < sequence.length) {
|
|
@@ -5160,8 +5365,48 @@ function molecularWeight(sequence, weightsObj) {
|
|
|
5160
5365
|
//tags: autostart
|
|
5161
5366
|
function autostartOligoSdFileSubscription() {
|
|
5162
5367
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onViewAdded.subscribe((v) => {
|
|
5163
|
-
if (v.type == 'TableView'
|
|
5164
|
-
|
|
5368
|
+
if (v.type == 'TableView') {
|
|
5369
|
+
if (v.dataFrame.columns.contains(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.TYPE))
|
|
5370
|
+
oligoSdFile(v.dataFrame);
|
|
5371
|
+
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onContextMenu.subscribe((args) => {
|
|
5372
|
+
const seqCol = args.args.context.table.currentCol;
|
|
5373
|
+
if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /^[fsACGUacgu]{6,}$/.test(s))) {
|
|
5374
|
+
args.args.menu.item('Convert Axolabs to GCRS', () => {
|
|
5375
|
+
args.args.context.table.columns.addNewString(seqCol.name + ' to GCRS').init((i) => {
|
|
5376
|
+
return (0,_structures_works_converters__WEBPACK_IMPORTED_MODULE_9__.siRnaAxolabsToGcrs)(seqCol.get(i));
|
|
5377
|
+
});
|
|
5378
|
+
});
|
|
5379
|
+
}
|
|
5380
|
+
else if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /^[fmpsACGU]{6,}$/.test(s)) ||
|
|
5381
|
+
datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /^(?=.*moe)(?=.*5mC)(?=.*ps){6,}/.test(s))) {
|
|
5382
|
+
args.args.menu.item('Convert GCRS to raw', () => {
|
|
5383
|
+
args.args.context.table.columns.addNewString(seqCol.name + ' to raw').init((i) => {
|
|
5384
|
+
return (0,_structures_works_converters__WEBPACK_IMPORTED_MODULE_9__.gcrsToNucleotides)(seqCol.get(i));
|
|
5385
|
+
});
|
|
5386
|
+
});
|
|
5387
|
+
args.args.menu.item('Convert GCRS to MM12', () => {
|
|
5388
|
+
args.args.context.table.columns.addNewString(seqCol.name + ' to MM12').init((i) => {
|
|
5389
|
+
return (0,_structures_works_converters__WEBPACK_IMPORTED_MODULE_9__.gcrsToMermade12)(seqCol.get(i));
|
|
5390
|
+
});
|
|
5391
|
+
});
|
|
5392
|
+
}
|
|
5393
|
+
else if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /^[*56789ATGC]{6,}$/.test(s))) {
|
|
5394
|
+
args.args.menu.item('Convert Biospring to GCRS', () => {
|
|
5395
|
+
const seqCol = args.args.context.table.currentCol;
|
|
5396
|
+
args.args.context.table.columns.addNewString(seqCol.name + ' to GCRS').init((i) => {
|
|
5397
|
+
return (0,_structures_works_converters__WEBPACK_IMPORTED_MODULE_9__.asoGapmersBioSpringToGcrs)(seqCol.get(i));
|
|
5398
|
+
});
|
|
5399
|
+
});
|
|
5400
|
+
}
|
|
5401
|
+
else if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /^[*1-8]{6,}$/.test(s))) {
|
|
5402
|
+
args.args.menu.item('Convert Biospring to GCRS', () => {
|
|
5403
|
+
args.args.context.table.columns.addNewString(seqCol.name + ' to GCRS').init((i) => {
|
|
5404
|
+
return (0,_structures_works_converters__WEBPACK_IMPORTED_MODULE_9__.siRnaAxolabsToGcrs)(seqCol.get(i));
|
|
5405
|
+
});
|
|
5406
|
+
});
|
|
5407
|
+
}
|
|
5408
|
+
});
|
|
5409
|
+
}
|
|
5165
5410
|
});
|
|
5166
5411
|
}
|
|
5167
5412
|
function oligoSdFile(table) {
|
|
@@ -5171,25 +5416,25 @@ function oligoSdFile(table) {
|
|
|
5171
5416
|
const icdsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_ICDs__WEBPACK_IMPORTED_MODULE_12__.ICDS);
|
|
5172
5417
|
const idpsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_IDPs__WEBPACK_IMPORTED_MODULE_14__.IDPS);
|
|
5173
5418
|
function addColumns(t, saltsDf) {
|
|
5174
|
-
if (t.columns.contains(
|
|
5419
|
+
if (t.columns.contains(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_NAME))
|
|
5175
5420
|
return datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.error('Columns already exist!');
|
|
5176
|
-
const sequence = t.col(
|
|
5177
|
-
const salt = t.col(
|
|
5178
|
-
const equivalents = t.col(
|
|
5179
|
-
t.columns.addNewString(
|
|
5180
|
-
t.columns.addNewString(
|
|
5421
|
+
const sequence = t.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SEQUENCE);
|
|
5422
|
+
const salt = t.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT);
|
|
5423
|
+
const equivalents = t.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.EQUIVALENTS);
|
|
5424
|
+
t.columns.addNewString(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_NAME).init((i) => sequence.get(i));
|
|
5425
|
+
t.columns.addNewString(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_COMMENTS).init((i) => (i > 0 && i % 2 == 0) ?
|
|
5181
5426
|
sequence.getString(i) + '; duplex of SS: ' + sequence.getString(i - 2) + ' and AS: ' + sequence.getString(i - 1) :
|
|
5182
5427
|
sequence.getString(i));
|
|
5183
5428
|
const molWeightCol = saltsDf.col('MOLWEIGHT');
|
|
5184
5429
|
const saltNamesList = saltsDf.col('DISPLAY').toList();
|
|
5185
|
-
t.columns.addNewFloat(
|
|
5430
|
+
t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.CPD_MW)
|
|
5186
5431
|
.init((i) => molecularWeight(sequence.get(i), weightsObj));
|
|
5187
|
-
t.columns.addNewFloat(
|
|
5432
|
+
t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT_MASS).init((i) => {
|
|
5188
5433
|
const saltRowIndex = saltNamesList.indexOf(salt.get(i));
|
|
5189
5434
|
const mw = molWeightCol.get(saltRowIndex);
|
|
5190
5435
|
return mw * equivalents.get(i);
|
|
5191
5436
|
});
|
|
5192
|
-
t.columns.addNewCalculated(
|
|
5437
|
+
t.columns.addNewCalculated(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.BATCH_MW, '${' + _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.CPD_MW + '} + ${' + _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT_MASS + '}', datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.FLOAT, false);
|
|
5193
5438
|
addColumnsPressed = true;
|
|
5194
5439
|
return newDf = t;
|
|
5195
5440
|
}
|
|
@@ -5198,22 +5443,22 @@ function oligoSdFile(table) {
|
|
|
5198
5443
|
const d = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([
|
|
5199
5444
|
datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.icons.edit(() => {
|
|
5200
5445
|
d.innerHTML = '';
|
|
5201
|
-
if (table.col(
|
|
5202
|
-
table.changeColumnType(
|
|
5446
|
+
if (table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.IDP).type != datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING)
|
|
5447
|
+
table.changeColumnType(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.IDP, datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING);
|
|
5203
5448
|
d.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.link('Add Columns', () => {
|
|
5204
5449
|
addColumns(table, saltsDf);
|
|
5205
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tableView(table.name).grid.columns.setOrder(Object.values(
|
|
5206
|
-
}, 'Add columns: \'' + [
|
|
5207
|
-
|
|
5450
|
+
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tableView(table.name).grid.columns.setOrder(Object.values(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES));
|
|
5451
|
+
}, 'Add columns: \'' + [_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_NAME, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.COMPOUND_COMMENTS, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.CPD_MW,
|
|
5452
|
+
_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT_MASS, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.BATCH_MW].join('\', \''), ''), datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.button('Save SD file', () => saveTableAsSdFile(addColumnsPressed ? newDf : table)));
|
|
5208
5453
|
const view = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.getTableView(table.name);
|
|
5209
|
-
view.table.col(
|
|
5210
|
-
view.table.col(
|
|
5211
|
-
view.table.col(
|
|
5212
|
-
view.table.col(
|
|
5213
|
-
view.table.col(
|
|
5214
|
-
view.table.col(
|
|
5454
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.TYPE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, '["AS", "SS", "Duplex"]');
|
|
5455
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.OWNER).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringifyItems(usersDf.columns.byIndex(0).toList()));
|
|
5456
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringifyItems(saltsDf.columns.byIndex(0).toList()));
|
|
5457
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SOURCE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringifyItems(sourcesDf.columns.byIndex(0).toList()));
|
|
5458
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.ICD).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringifyItems(icdsDf.columns.byIndex(0).toList()));
|
|
5459
|
+
view.table.col(_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.IDP).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringifyItems(idpsDf.columns.byIndex(0).toList()));
|
|
5215
5460
|
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onContextMenu.subscribe((args) => {
|
|
5216
|
-
if ([
|
|
5461
|
+
if ([_structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.TYPE, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.OWNER, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SALT, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.SOURCE, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.ICD, _structures_works_map__WEBPACK_IMPORTED_MODULE_8__.COL_NAMES.IDP]
|
|
5217
5462
|
.includes(args.args.context.table.currentCol.name)) {
|
|
5218
5463
|
args.args.menu.item('Fill Column With Value', () => {
|
|
5219
5464
|
const v = args.args.context.table.currentCell.value;
|
|
@@ -5231,4 +5476,4 @@ function oligoSdFile(table) {
|
|
|
5231
5476
|
sequencetranslator = __webpack_exports__;
|
|
5232
5477
|
/******/ })()
|
|
5233
5478
|
;
|
|
5234
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsK0NBQStDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzViTTtBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7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Q0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QSxjQUFjLGdEQUFNO0FBQ3BCLFFBQVEsdURBQWE7QUFDckI7QUFDQSwwQkFBMEIsZ0VBQWEsVUFBVSwrREFBcUI7QUFDdEUsdUNBQXVDLGdFQUFhLEVBQUUsK0RBQXFCO0FBQzNFLHFCQUFxQixpREFBTztBQUM1QjtBQUNBLGdCQUFnQiw4REFBb0IsaURBQWlELDREQUFTO0FBQzlGLGFBQWEsdUJBQXVCLDBFQUF1QixFQUFFLDhFQUEyQixFQUFFLG1FQUFnQjtBQUMxRyxnQkFBZ0Isc0VBQW1CLEVBQUUscUVBQWtCLHVCQUF1QixtREFBUztBQUN2Rix5QkFBeUIsaUVBQXVCO0FBQ2hELDJCQUEyQixpRUFBYyxTQUFTLHlEQUFlO0FBQ2pFLDJCQUEyQixrRUFBZSxTQUFTLHlEQUFlO0FBQ2xFLDJCQUEyQixpRUFBYyxTQUFTLHlEQUFlO0FBQ2pFLDJCQUEyQixtRUFBZ0IsU0FBUyx5REFBZTtBQUNuRSwyQkFBMkIsZ0VBQWEsU0FBUyx5REFBZTtBQUNoRSwyQkFBMkIsZ0VBQWEsU0FBUyx5REFBZTtBQUNoRSxZQUFZLDZFQUFtQztBQUMvQyxxQkFBcUIsaUVBQWMsRUFBRSxrRUFBZSxFQUFFLGlFQUFjLEVBQUUsbUVBQWdCLEVBQUUsZ0VBQWEsRUFBRSxnRUFBYTtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxJQUFJLHNFQUE0QjtBQUNoQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9jYXNoLWRvbS9kaXN0L2Nhc2guanMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vbm9kZV9tb2R1bGVzL3NhdmUtc3ZnLWFzLXBuZy9saWIvc2F2ZVN2Z0FzUG5nLmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9JQ0RzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9JRFBzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9heG9sYWJzTWFwLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9kZWZpbmVBeG9sYWJzUGF0dGVybi50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvZHJhd0F4b2xhYnNQYXR0ZXJuLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zYWx0cy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc291cmNlcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9jb252ZXJ0ZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbWFwLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2F2ZS1zZW5zZS1hbnRpc2Vuc2UudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3VzZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJER1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJPQ0xcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiZ3Jva1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJ1aVwiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvcGFja2FnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBNSVQgaHR0cHM6Ly9naXRodWIuY29tL2ZhYmlvc3BhbXBpbmF0by9jYXNoICovXG4oZnVuY3Rpb24oKXtcblwidXNlIHN0cmljdFwiO1xuXG52YXIgcHJvcE1hcCA9IHtcbiAgLyogR0VORVJBTCAqL1xuICBcImNsYXNzXCI6ICdjbGFzc05hbWUnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuXG4gIC8qIExBQkVMICovXG4gIFwiZm9yXCI6ICdodG1sRm9yJyxcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG5cbiAgLyogVEFCTEUgKi9cbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICByb3dzcGFuOiAncm93U3BhbicsXG5cbiAgLyogSU1BR0UgKi9cbiAgdXNlbWFwOiAndXNlTWFwJ1xufTtcblxuZnVuY3Rpb24gYXR0ZW1wdChmbiwgYXJnKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGFyZyk7XG4gIH0gY2F0Y2ggKF9hKSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfVxufVxuXG52YXIgZG9jID0gZG9jdW1lbnQsXG4gICAgd2luID0gd2luZG93LFxuICAgIGRvY0VsZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgY3JlYXRlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50LmJpbmQoZG9jKSxcbiAgICBkaXYgPSBjcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICB0YWJsZSA9IGNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyksXG4gICAgdGJvZHkgPSBjcmVhdGVFbGVtZW50KCd0Ym9keScpLFxuICAgIHRyID0gY3JlYXRlRWxlbWVudCgndHInKSxcbiAgICBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSxcbiAgICBjb25jYXQgPSBBcnJheVByb3RvdHlwZS5jb25jYXQsXG4gICAgZmlsdGVyID0gQXJyYXlQcm90b3R5cGUuZmlsdGVyLFxuICAgIGluZGV4T2YgPSBBcnJheVByb3RvdHlwZS5pbmRleE9mLFxuICAgIG1hcCA9IEFycmF5UHJvdG90eXBlLm1hcCxcbiAgICBwdXNoID0gQXJyYXlQcm90b3R5cGUucHVzaCxcbiAgICBzbGljZSA9IEFycmF5UHJvdG90eXBlLnNsaWNlLFxuICAgIHNvbWUgPSBBcnJheVByb3RvdHlwZS5zb21lLFxuICAgIHNwbGljZSA9IEFycmF5UHJvdG90eXBlLnNwbGljZTtcbnZhciBpZFJlID0gL14jKD86W1xcdy1dfFxcXFwufFteXFx4MDAtXFx4YTBdKSokLyxcbiAgICBjbGFzc1JlID0gL15cXC4oPzpbXFx3LV18XFxcXC58W15cXHgwMC1cXHhhMF0pKiQvLFxuICAgIGh0bWxSZSA9IC88Lis+LyxcbiAgICB0YWdSZSA9IC9eXFx3KyQvOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBmaW5kKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHJldHVybiAhc2VsZWN0b3IgfHwgIWlzRG9jdW1lbnQoY29udGV4dCkgJiYgIWlzRWxlbWVudChjb250ZXh0KSA/IFtdIDogY2xhc3NSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShzZWxlY3Rvci5zbGljZSgxKSkgOiB0YWdSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpIDogY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbn0gLy8gQHJlcXVpcmUgLi9maW5kLnRzXG4vLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbnZhciBDYXNoID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FzaChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICBpZiAoaXNDYXNoKHNlbGVjdG9yKSkgcmV0dXJuIHNlbGVjdG9yO1xuICAgIHZhciBlbGVzID0gc2VsZWN0b3I7XG5cbiAgICBpZiAoaXNTdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgICB2YXIgY3R4ID0gKGlzQ2FzaChjb250ZXh0KSA/IGNvbnRleHRbMF0gOiBjb250ZXh0KSB8fCBkb2M7XG4gICAgICBlbGVzID0gaWRSZS50ZXN0KHNlbGVjdG9yKSA/IGN0eC5nZXRFbGVtZW50QnlJZChzZWxlY3Rvci5zbGljZSgxKSkgOiBodG1sUmUudGVzdChzZWxlY3RvcikgPyBwYXJzZUhUTUwoc2VsZWN0b3IpIDogZmluZChzZWxlY3RvciwgY3R4KTtcbiAgICAgIGlmICghZWxlcykgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KHNlbGVjdG9yKTsgLy9GSVhNRTogYGZuLnJlYWR5YCBpcyBub3QgaW5jbHVkZWQgaW4gYGNvcmVgLCBidXQgaXQncyBhY3R1YWxseSBhIGNvcmUgZnVuY3Rpb25hbGl0eVxuICAgIH1cblxuICAgIGlmIChlbGVzLm5vZGVUeXBlIHx8IGVsZXMgPT09IHdpbikgZWxlcyA9IFtlbGVzXTtcbiAgICB0aGlzLmxlbmd0aCA9IGVsZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGVsZXNbaV07XG4gICAgfVxuICB9XG5cbiAgQ2FzaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgQ2FzaChzZWxlY3RvciwgY29udGV4dCk7XG4gIH07XG5cbiAgcmV0dXJuIENhc2g7XG59KCk7XG5cbnZhciBmbiA9IENhc2gucHJvdG90eXBlLFxuICAgIGNhc2ggPSBmbi5pbml0O1xuY2FzaC5mbiA9IGNhc2gucHJvdG90eXBlID0gZm47IC8vIEVuc3VyaW5nIHRoYXQgYGNhc2ggKCkgaW5zdGFuY2VvZiBjYXNoYFxuXG5mbi5sZW5ndGggPSAwO1xuZm4uc3BsaWNlID0gc3BsaWNlOyAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBnZXRzIHByaW50ZWQgYXMgYXJyYXktbGlrZSBpbiBDaHJvbWUncyBkZXZ0b29sc1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBpcyBpdGVyYWJsZVxuICBmbltTeW1ib2xbJ2l0ZXJhdG9yJ11dID0gQXJyYXlQcm90b3R5cGVbU3ltYm9sWydpdGVyYXRvciddXTtcbn1cblxuZm4ubWFwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBjYXNoKGNvbmNhdC5hcHBseShbXSwgbWFwLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjYWxsYmFjay5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSkpKTtcbn07XG5cbmZuLnNsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGNhc2goc2xpY2UuY2FsbCh0aGlzLCBzdGFydCwgZW5kKSk7XG59OyAvLyBAcmVxdWlyZSAuL2Nhc2gudHNcblxuXG52YXIgZGFzaEFscGhhUmUgPSAvLShbYS16XSkvZztcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoZGFzaEFscGhhUmUsIGZ1bmN0aW9uIChtYXRjaCwgbGV0dGVyKSB7XG4gICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxuY2FzaC5ndWlkID0gMTsgLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG5cbmZ1bmN0aW9uIG1hdGNoZXMoZWxlLCBzZWxlY3Rvcikge1xuICB2YXIgbWF0Y2hlcyA9IGVsZSAmJiAoZWxlWydtYXRjaGVzJ10gfHwgZWxlWyd3ZWJraXRNYXRjaGVzU2VsZWN0b3InXSB8fCBlbGVbJ21zTWF0Y2hlc1NlbGVjdG9yJ10pO1xuICByZXR1cm4gISFtYXRjaGVzICYmICEhc2VsZWN0b3IgJiYgbWF0Y2hlcy5jYWxsKGVsZSwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBpc0Nhc2goeCkge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIENhc2g7XG59XG5cbmZ1bmN0aW9uIGlzV2luZG93KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4ID09PSB4LndpbmRvdztcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudCh4KSB7XG4gIHJldHVybiAhIXggJiYgeC5ub2RlVHlwZSA9PT0gOTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSAxO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh4KSB7XG4gIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbCh4KSB7XG4gIHJldHVybiB4ID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bWVyaWMoeCkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQoeCkpICYmIGlzRmluaXRlKHgpO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHgpIHtcbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB4ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih4KTtcbiAgcmV0dXJuIHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5jYXNoLmlzV2luZG93ID0gaXNXaW5kb3c7XG5jYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuY2FzaC5pc0FycmF5ID0gaXNBcnJheTtcbmNhc2guaXNOdW1lcmljID0gaXNOdW1lcmljO1xuY2FzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcblxuZm4uZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIGlmIChpc1VuZGVmaW5lZChpbmRleCkpIHJldHVybiBzbGljZS5jYWxsKHRoaXMpO1xuICBpbmRleCA9IE51bWJlcihpbmRleCk7XG4gIHJldHVybiB0aGlzW2luZGV4IDwgMCA/IGluZGV4ICsgdGhpcy5sZW5ndGggOiBpbmRleF07XG59O1xuXG5mbi5lcSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICByZXR1cm4gY2FzaCh0aGlzLmdldChpbmRleCkpO1xufTtcblxuZm4uZmlyc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVxKDApO1xufTtcblxuZm4ubGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZXEoLTEpO1xufTtcblxuZnVuY3Rpb24gZWFjaChhcnIsIGNhbGxiYWNrLCBfcmV2ZXJzZSkge1xuICBpZiAoX3JldmVyc2UpIHtcbiAgICB2YXIgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJbaV0sIGksIGFycltpXSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFycikpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltrZXldLCBrZXksIGFycltrZXldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2ldLCBpLCBhcnJbaV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5jYXNoLmVhY2ggPSBlYWNoO1xuXG5mbi5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBlYWNoKHRoaXMsIGNhbGxiYWNrKTtcbn07XG5cbmZuLnByb3AgPSBmdW5jdGlvbiAocHJvcCwgdmFsdWUpIHtcbiAgaWYgKCFwcm9wKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKHByb3ApKSB7XG4gICAgcHJvcCA9IHByb3BNYXBbcHJvcF0gfHwgcHJvcDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIHRoaXNbMF1bcHJvcF07XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBlbGVbcHJvcF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5wcm9wKGtleSwgcHJvcFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlUHJvcCA9IGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGRlbGV0ZSBlbGVbcHJvcE1hcFtwcm9wXSB8fCBwcm9wXTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBzb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICB2YXIgZGVlcCA9IGlzQm9vbGVhbihzb3VyY2VzWzBdKSA/IHNvdXJjZXMuc2hpZnQoKSA6IGZhbHNlLFxuICAgICAgdGFyZ2V0ID0gc291cmNlcy5zaGlmdCgpLFxuICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIGlmICghdGFyZ2V0KSByZXR1cm4ge307XG4gIGlmICghbGVuZ3RoKSByZXR1cm4gZXh0ZW5kKGRlZXAsIGNhc2gsIHRhcmdldCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKGRlZXAgJiYgKGlzQXJyYXkoc291cmNlW2tleV0pIHx8IGlzUGxhaW5PYmplY3Qoc291cmNlW2tleV0pKSkge1xuICAgICAgICBpZiAoIXRhcmdldFtrZXldIHx8IHRhcmdldFtrZXldLmNvbnN0cnVjdG9yICE9PSBzb3VyY2Vba2V5XS5jb25zdHJ1Y3RvcikgdGFyZ2V0W2tleV0gPSBuZXcgc291cmNlW2tleV0uY29uc3RydWN0b3IoKTtcbiAgICAgICAgZXh0ZW5kKGRlZXAsIHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNhc2guZXh0ZW5kID0gZXh0ZW5kO1xuXG5mbi5leHRlbmQgPSBmdW5jdGlvbiAocGx1Z2lucykge1xuICByZXR1cm4gZXh0ZW5kKGZuLCBwbHVnaW5zKTtcbn07IC8vIEByZXF1aXJlIC4vbWF0Y2hlcy50c1xuLy8gQHJlcXVpcmUgLi90eXBlX2NoZWNraW5nLnRzXG5cblxuZnVuY3Rpb24gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKGNvbXBhcmF0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBtYXRjaGVzKGVsZSwgY29tcGFyYXRvcik7XG4gIH0gOiBpc0Z1bmN0aW9uKGNvbXBhcmF0b3IpID8gY29tcGFyYXRvciA6IGlzQ2FzaChjb21wYXJhdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gY29tcGFyYXRvci5pcyhlbGUpO1xuICB9IDogIWNvbXBhcmF0b3IgPyBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IDogZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUgPT09IGNvbXBhcmF0b3I7XG4gIH07XG59XG5cbmZuLmZpbHRlciA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gY2FzaChmaWx0ZXIuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pKTtcbn07IC8vIEByZXF1aXJlIGNvbGxlY3Rpb24vZmlsdGVyLnRzXG5cblxuZnVuY3Rpb24gZmlsdGVyZWQoY29sbGVjdGlvbiwgY29tcGFyYXRvcikge1xuICByZXR1cm4gIWNvbXBhcmF0b3IgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi5maWx0ZXIoY29tcGFyYXRvcik7XG59IC8vIEByZXF1aXJlIC4vdHlwZV9jaGVja2luZy50c1xuXG5cbnZhciBzcGxpdFZhbHVlc1JlID0gL1xcUysvZztcblxuZnVuY3Rpb24gZ2V0U3BsaXRWYWx1ZXMoc3RyKSB7XG4gIHJldHVybiBpc1N0cmluZyhzdHIpID8gc3RyLm1hdGNoKHNwbGl0VmFsdWVzUmUpIHx8IFtdIDogW107XG59XG5cbmZuLmhhc0NsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICByZXR1cm4gISFjbHMgJiYgc29tZS5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGVsZSkgJiYgZWxlLmNsYXNzTGlzdC5jb250YWlucyhjbHMpO1xuICB9KTtcbn07XG5cbmZuLnJlbW92ZUF0dHIgPSBmdW5jdGlvbiAoYXR0cikge1xuICB2YXIgYXR0cnMgPSBnZXRTcGxpdFZhbHVlcyhhdHRyKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVhY2goYXR0cnMsIGZ1bmN0aW9uIChpLCBhKSB7XG4gICAgICBlbGUucmVtb3ZlQXR0cmlidXRlKGEpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGF0dHIoYXR0ciwgdmFsdWUpIHtcbiAgaWYgKCFhdHRyKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKGF0dHIpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoIXRoaXNbMF0gfHwgIWlzRWxlbWVudCh0aGlzWzBdKSkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlXzEgPSB0aGlzWzBdLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIHJldHVybiBpc051bGwodmFsdWVfMSkgPyB1bmRlZmluZWQgOiB2YWx1ZV8xO1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiB0aGlzO1xuICAgIGlmIChpc051bGwodmFsdWUpKSByZXR1cm4gdGhpcy5yZW1vdmVBdHRyKGF0dHIpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgZWxlLnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gYXR0cikge1xuICAgIHRoaXMuYXR0cihrZXksIGF0dHJba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZm4uYXR0ciA9IGF0dHI7XG5cbmZuLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gKGNscywgZm9yY2UpIHtcbiAgdmFyIGNsYXNzZXMgPSBnZXRTcGxpdFZhbHVlcyhjbHMpLFxuICAgICAgaXNGb3JjZSA9ICFpc1VuZGVmaW5lZChmb3JjZSk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlYWNoKGNsYXNzZXMsIGZ1bmN0aW9uIChpLCBjKSB7XG4gICAgICBpZiAoaXNGb3JjZSkge1xuICAgICAgICBmb3JjZSA/IGVsZS5jbGFzc0xpc3QuYWRkKGMpIDogZWxlLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuY2xhc3NMaXN0LnRvZ2dsZShjKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5mbi5hZGRDbGFzcyA9IGZ1bmN0aW9uIChjbHMpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCB0cnVlKTtcbn07XG5cbmZuLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzLmF0dHIoJ2NsYXNzJywgJycpO1xufTtcblxuZnVuY3Rpb24gcGx1Y2soYXJyLCBwcm9wLCBkZWVwLCB1bnRpbCkge1xuICB2YXIgcGx1Y2tlZCA9IFtdLFxuICAgICAgaXNDYWxsYmFjayA9IGlzRnVuY3Rpb24ocHJvcCksXG4gICAgICBjb21wYXJlID0gdW50aWwgJiYgZ2V0Q29tcGFyZUZ1bmN0aW9uKHVudGlsKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaXNDYWxsYmFjaykge1xuICAgICAgdmFyIHZhbF8xID0gcHJvcChhcnJbaV0pO1xuICAgICAgaWYgKHZhbF8xLmxlbmd0aCkgcHVzaC5hcHBseShwbHVja2VkLCB2YWxfMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWxfMiA9IGFycltpXVtwcm9wXTtcblxuICAgICAgd2hpbGUgKHZhbF8yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHVudGlsICYmIGNvbXBhcmUoLTEsIHZhbF8yKSkgYnJlYWs7XG4gICAgICAgIHBsdWNrZWQucHVzaCh2YWxfMik7XG4gICAgICAgIHZhbF8yID0gZGVlcCA/IHZhbF8yW3Byb3BdIDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGx1Y2tlZDtcbn1cblxuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICByZXR1cm4gYXJyLmxlbmd0aCA+IDEgPyBmaWx0ZXIuY2FsbChhcnIsIGZ1bmN0aW9uIChpdGVtLCBpbmRleCwgc2VsZikge1xuICAgIHJldHVybiBpbmRleE9mLmNhbGwoc2VsZiwgaXRlbSkgPT09IGluZGV4O1xuICB9KSA6IGFycjtcbn1cblxuY2FzaC51bmlxdWUgPSB1bmlxdWU7XG5cbmZuLmFkZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gY2FzaCh1bmlxdWUodGhpcy5nZXQoKS5jb25jYXQoY2FzaChzZWxlY3RvciwgY29udGV4dCkuZ2V0KCkpKSk7XG59OyAvLyBAcmVxdWlyZSBjb3JlL3R5cGVfY2hlY2tpbmcudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlKGVsZSwgcHJvcCwgaXNWYXJpYWJsZSkge1xuICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gIHZhciBzdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZSwgbnVsbCk7XG4gIHJldHVybiBpc1ZhcmlhYmxlID8gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB8fCB1bmRlZmluZWQgOiBzdHlsZVtwcm9wXSB8fCBlbGUuc3R5bGVbcHJvcF07XG59IC8vIEByZXF1aXJlIC4vY29tcHV0ZV9zdHlsZS50c1xuXG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZUludChlbGUsIHByb3ApIHtcbiAgcmV0dXJuIHBhcnNlSW50KGNvbXB1dGVTdHlsZShlbGUsIHByb3ApLCAxMCkgfHwgMDtcbn1cblxudmFyIGNzc1ZhcmlhYmxlUmUgPSAvXi0tLzsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gaXNDU1NWYXJpYWJsZShwcm9wKSB7XG4gIHJldHVybiBjc3NWYXJpYWJsZVJlLnRlc3QocHJvcCk7XG59IC8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuLy8gQHJlcXVpcmUgY29yZS9jYXNoLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2VhY2gudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG5cbnZhciBwcmVmaXhlZFByb3BzID0ge30sXG4gICAgc3R5bGUgPSBkaXYuc3R5bGUsXG4gICAgdmVuZG9yc1ByZWZpeGVzID0gWyd3ZWJraXQnLCAnbW96JywgJ21zJ107XG5cbmZ1bmN0aW9uIGdldFByZWZpeGVkUHJvcChwcm9wLCBpc1ZhcmlhYmxlKSB7XG4gIGlmIChpc1ZhcmlhYmxlID09PSB2b2lkIDApIHtcbiAgICBpc1ZhcmlhYmxlID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgfVxuXG4gIGlmIChpc1ZhcmlhYmxlKSByZXR1cm4gcHJvcDtcblxuICBpZiAoIXByZWZpeGVkUHJvcHNbcHJvcF0pIHtcbiAgICB2YXIgcHJvcENDID0gY2FtZWxDYXNlKHByb3ApLFxuICAgICAgICBwcm9wVUMgPSBcIlwiICsgcHJvcENDWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wQ0Muc2xpY2UoMSksXG4gICAgICAgIHByb3BzID0gKHByb3BDQyArIFwiIFwiICsgdmVuZG9yc1ByZWZpeGVzLmpvaW4ocHJvcFVDICsgXCIgXCIpICsgcHJvcFVDKS5zcGxpdCgnICcpO1xuICAgIGVhY2gocHJvcHMsIGZ1bmN0aW9uIChpLCBwKSB7XG4gICAgICBpZiAocCBpbiBzdHlsZSkge1xuICAgICAgICBwcmVmaXhlZFByb3BzW3Byb3BdID0gcDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHByZWZpeGVkUHJvcHNbcHJvcF07XG59XG5cbjsgLy8gQHJlcXVpcmUgY29yZS90eXBlX2NoZWNraW5nLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG52YXIgbnVtZXJpY1Byb3BzID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wLCB2YWx1ZSwgaXNWYXJpYWJsZSkge1xuICBpZiAoaXNWYXJpYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgaXNWYXJpYWJsZSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gIH1cblxuICByZXR1cm4gIWlzVmFyaWFibGUgJiYgIW51bWVyaWNQcm9wc1twcm9wXSAmJiBpc051bWVyaWModmFsdWUpID8gdmFsdWUgKyBcInB4XCIgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY3NzKHByb3AsIHZhbHVlKSB7XG4gIGlmIChpc1N0cmluZyhwcm9wKSkge1xuICAgIHZhciBpc1ZhcmlhYmxlXzEgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICAgIHByb3AgPSBnZXRQcmVmaXhlZFByb3AocHJvcCwgaXNWYXJpYWJsZV8xKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGNvbXB1dGVTdHlsZSh0aGlzWzBdLCBwcm9wLCBpc1ZhcmlhYmxlXzEpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIHRoaXM7XG4gICAgdmFsdWUgPSBnZXRTdWZmaXhlZFZhbHVlKHByb3AsIHZhbHVlLCBpc1ZhcmlhYmxlXzEpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaXNWYXJpYWJsZV8xKSB7XG4gICAgICAgIGVsZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5jc3Moa2V5LCBwcm9wW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbjtcbmZuLmNzcyA9IGNzczsgLy8gQG9wdGlvbmFsIC4vY3NzLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2F0dGVtcHQudHNcbi8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuXG52YXIgSlNPTlN0cmluZ1JlID0gL15cXHMrfFxccyskLztcblxuZnVuY3Rpb24gZ2V0RGF0YShlbGUsIGtleSkge1xuICB2YXIgdmFsdWUgPSBlbGUuZGF0YXNldFtrZXldIHx8IGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXTtcbiAgaWYgKEpTT05TdHJpbmdSZS50ZXN0KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gYXR0ZW1wdChKU09OLnBhcnNlLCB2YWx1ZSk7XG59IC8vIEByZXF1aXJlIGNvcmUvYXR0ZW1wdC50c1xuLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG5cblxuZnVuY3Rpb24gc2V0RGF0YShlbGUsIGtleSwgdmFsdWUpIHtcbiAgdmFsdWUgPSBhdHRlbXB0KEpTT04uc3RyaW5naWZ5LCB2YWx1ZSk7XG4gIGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBkYXRhKG5hbWUsIHZhbHVlKSB7XG4gIGlmICghbmFtZSkge1xuICAgIGlmICghdGhpc1swXSkgcmV0dXJuO1xuICAgIHZhciBkYXRhcyA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXNbMF0uZGF0YXNldCkge1xuICAgICAgZGF0YXNba2V5XSA9IGdldERhdGEodGhpc1swXSwga2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXM7XG4gIH1cblxuICBpZiAoaXNTdHJpbmcobmFtZSkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGdldERhdGEodGhpc1swXSwgbmFtZSk7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBzZXREYXRhKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICB0aGlzLmRhdGEoa2V5LCBuYW1lW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLmRhdGEgPSBkYXRhOyAvLyBAb3B0aW9uYWwgLi9kYXRhLnRzXG5cbmZ1bmN0aW9uIGdldERvY3VtZW50RGltZW5zaW9uKGRvYywgZGltZW5zaW9uKSB7XG4gIHZhciBkb2NFbGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICByZXR1cm4gTWF0aC5tYXgoZG9jLmJvZHlbXCJzY3JvbGxcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcInNjcm9sbFwiICsgZGltZW5zaW9uXSwgZG9jLmJvZHlbXCJvZmZzZXRcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcIm9mZnNldFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wiY2xpZW50XCIgKyBkaW1lbnNpb25dKTtcbn0gLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZV9pbnQudHNcblxuXG5mdW5jdGlvbiBnZXRFeHRyYVNwYWNlKGVsZSwgeEF4aXMpIHtcbiAgcmV0dXJuIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykgKyBcIldpZHRoXCIpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpKSArIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpICsgXCJXaWR0aFwiKTtcbn1cblxuZWFjaChbdHJ1ZSwgZmFsc2VdLCBmdW5jdGlvbiAoaSwgb3V0ZXIpIHtcbiAgZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAoaSwgcHJvcCkge1xuICAgIHZhciBuYW1lID0gXCJcIiArIChvdXRlciA/ICdvdXRlcicgOiAnaW5uZXInKSArIHByb3A7XG5cbiAgICBmbltuYW1lXSA9IGZ1bmN0aW9uIChpbmNsdWRlTWFyZ2lucykge1xuICAgICAgaWYgKCF0aGlzWzBdKSByZXR1cm47XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiBvdXRlciA/IHRoaXNbMF1bXCJpbm5lclwiICsgcHJvcF0gOiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF1bXCJcIiArIChvdXRlciA/ICdvZmZzZXQnIDogJ2NsaWVudCcpICsgcHJvcF0gKyAoaW5jbHVkZU1hcmdpbnMgJiYgb3V0ZXIgPyBjb21wdXRlU3R5bGVJbnQodGhpc1swXSwgXCJtYXJnaW5cIiArIChpID8gJ1RvcCcgOiAnTGVmdCcpKSArIGNvbXB1dGVTdHlsZUludCh0aGlzWzBdLCBcIm1hcmdpblwiICsgKGkgPyAnQm90dG9tJyA6ICdSaWdodCcpKSA6IDApO1xuICAgIH07XG4gIH0pO1xufSk7XG5lYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChpbmRleCwgcHJvcCkge1xuICB2YXIgcHJvcExDID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gIGZuW3Byb3BMQ10gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXRoaXNbMF0pIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzO1xuXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbcHJvcExDXSAtIGdldEV4dHJhU3BhY2UodGhpc1swXSwgIWluZGV4KTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVOdW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgdmFyIGJveFNpemluZyA9IGNvbXB1dGVTdHlsZShlbGUsICdib3hTaXppbmcnKTtcbiAgICAgIGVsZS5zdHlsZVtwcm9wTENdID0gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wTEMsIHZhbHVlTnVtYmVyICsgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnID8gZ2V0RXh0cmFTcGFjZShlbGUsICFpbmRleCkgOiAwKSk7XG4gICAgfSk7XG4gIH07XG59KTsgLy8gQG9wdGlvbmFsIC4vaW5uZXJfb3V0ZXIudHNcbi8vIEBvcHRpb25hbCAuL25vcm1hbC50c1xuLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZS50c1xuXG52YXIgZGVmYXVsdERpc3BsYXkgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkodGFnTmFtZSkge1xuICBpZiAoZGVmYXVsdERpc3BsYXlbdGFnTmFtZV0pIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXTtcbiAgdmFyIGVsZSA9IGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gIGRvYy5ib2R5Lmluc2VydEJlZm9yZShlbGUsIG51bGwpO1xuICB2YXIgZGlzcGxheSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gIGRvYy5ib2R5LnJlbW92ZUNoaWxkKGVsZSk7XG4gIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXSA9IGRpc3BsYXkgIT09ICdub25lJyA/IGRpc3BsYXkgOiAnYmxvY2snO1xufSAvLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlLnRzXG5cblxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlKSB7XG4gIHJldHVybiBjb21wdXRlU3R5bGUoZWxlLCAnZGlzcGxheScpID09PSAnbm9uZSc7XG59XG5cbnZhciBkaXNwbGF5UHJvcGVydHkgPSAnX19fY2QnO1xuXG5mbi50b2dnbGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIHZhciBzaG93ID0gaXNVbmRlZmluZWQoZm9yY2UpID8gaXNIaWRkZW4oZWxlKSA6IGZvcmNlO1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZWxlW2Rpc3BsYXlQcm9wZXJ0eV0gfHwgJyc7XG5cbiAgICAgIGlmIChpc0hpZGRlbihlbGUpKSB7XG4gICAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZ2V0RGVmYXVsdERpc3BsYXkoZWxlLnRhZ05hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVbZGlzcGxheVByb3BlcnR5XSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gICAgICBlbGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xufTtcblxuZm4uaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlKGZhbHNlKTtcbn07XG5cbmZuLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRvZ2dsZSh0cnVlKTtcbn07IC8vIEBvcHRpb25hbCAuL2hpZGUudHNcbi8vIEBvcHRpb25hbCAuL3Nob3cudHNcbi8vIEBvcHRpb25hbCAuL3RvZ2dsZS50c1xuXG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZXMobnMxLCBuczIpIHtcbiAgcmV0dXJuICFuczIgfHwgIXNvbWUuY2FsbChuczIsIGZ1bmN0aW9uIChucykge1xuICAgIHJldHVybiBuczEuaW5kZXhPZihucykgPCAwO1xuICB9KTtcbn1cblxudmFyIGV2ZW50c05hbWVzcGFjZSA9ICdfX19jZScsXG4gICAgZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvciA9ICcuJyxcbiAgICBldmVudHNGb2N1cyA9IHtcbiAgZm9jdXM6ICdmb2N1c2luJyxcbiAgYmx1cjogJ2ZvY3Vzb3V0J1xufSxcbiAgICBldmVudHNIb3ZlciA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn0sXG4gICAgZXZlbnRzTW91c2VSZSA9IC9eKG1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wfGNsaWNrfGRibGNsaWNrKS9pOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lKSB7XG4gIHJldHVybiBldmVudHNIb3ZlcltuYW1lXSB8fCBldmVudHNGb2N1c1tuYW1lXSB8fCBuYW1lO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50c0NhY2hlKGVsZSkge1xuICByZXR1cm4gZWxlW2V2ZW50c05hbWVzcGFjZV0gPSBlbGVbZXZlbnRzTmFtZXNwYWNlXSB8fCB7fTtcbn0gLy8gQHJlcXVpcmUgY29yZS9ndWlkLnRzXG4vLyBAcmVxdWlyZSBldmVudHMvaGVscGVycy9nZXRfZXZlbnRzX2NhY2hlLnRzXG5cblxuZnVuY3Rpb24gYWRkRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIGV2ZW50Q2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuICBldmVudENhY2hlW25hbWVdID0gZXZlbnRDYWNoZVtuYW1lXSB8fCBbXTtcbiAgZXZlbnRDYWNoZVtuYW1lXS5wdXNoKFtuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2tdKTtcbiAgZWxlLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgY2FsbGJhY2spO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICB2YXIgcGFydHMgPSBldmVudE5hbWUuc3BsaXQoZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvcik7XG4gIHJldHVybiBbcGFydHNbMF0sIHBhcnRzLnNsaWNlKDEpLnNvcnQoKV07IC8vIFtuYW1lLCBuYW1lc3BhY2VbXV1cbn0gLy8gQHJlcXVpcmUgLi9nZXRfZXZlbnRzX2NhY2hlLnRzXG4vLyBAcmVxdWlyZSAuL2hhc19uYW1lc3BhY2VzLnRzXG4vLyBAcmVxdWlyZSAuL3BhcnNlX2V2ZW50X25hbWUudHNcblxuXG5mdW5jdGlvbiByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgY2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuXG4gIGlmICghbmFtZSkge1xuICAgIGZvciAobmFtZSBpbiBjYWNoZSkge1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjYWNoZVtuYW1lXSkge1xuICAgIGNhY2hlW25hbWVdID0gY2FjaGVbbmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIG5zID0gX2FbMF0sXG4gICAgICAgICAgc2VsID0gX2FbMV0sXG4gICAgICAgICAgY2IgPSBfYVsyXTtcbiAgICAgIGlmIChjYWxsYmFjayAmJiBjYi5ndWlkICE9PSBjYWxsYmFjay5ndWlkIHx8ICFoYXNOYW1lc3BhY2VzKG5zLCBuYW1lc3BhY2VzKSB8fCBzZWxlY3RvciAmJiBzZWxlY3RvciAhPT0gc2VsKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGVsZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGNiKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mbi5vZmYgPSBmdW5jdGlvbiAoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50RnVsbE5hbWUpKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vZmYoa2V5LCBldmVudEZ1bGxOYW1lW2tleV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH1cblxuICAgIGVhY2goZ2V0U3BsaXRWYWx1ZXMoZXZlbnRGdWxsTmFtZSksIGZ1bmN0aW9uIChpLCBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCk7XG5cbiAgICAgIF90aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcbiAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIG9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgX29uZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vbihrZXksIHNlbGVjdG9yLCBkYXRhLCBldmVudEZ1bGxOYW1lW2tleV0sIF9vbmUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoc2VsZWN0b3IpIHx8IGlzTnVsbChzZWxlY3RvcikpIHtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChkYXRhKSkge1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgZWFjaChnZXRTcGxpdFZhbHVlcyhldmVudEZ1bGxOYW1lKSwgZnVuY3Rpb24gKGksIGV2ZW50RnVsbE5hbWUpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgbmFtZU9yaWdpbmFsID0gX2FbMF0sXG4gICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCksXG4gICAgICAgIGlzRXZlbnRIb3ZlciA9IG5hbWVPcmlnaW5hbCBpbiBldmVudHNIb3ZlcixcbiAgICAgICAgaXNFdmVudEZvY3VzID0gbmFtZU9yaWdpbmFsIGluIGV2ZW50c0ZvY3VzO1xuXG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICBfdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uIGZpbmFsQ2FsbGJhY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldFtcIl9fX2lcIiArIGV2ZW50LnR5cGVdKSByZXR1cm4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIElnbm9yaW5nIG5hdGl2ZSBldmVudCBpbiBmYXZvciBvZiB0aGUgdXBjb21pbmcgY3VzdG9tIG9uZVxuXG4gICAgICAgIGlmIChldmVudC5uYW1lc3BhY2UgJiYgIWhhc05hbWVzcGFjZXMobmFtZXNwYWNlcywgZXZlbnQubmFtZXNwYWNlLnNwbGl0KGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXNlbGVjdG9yICYmIChpc0V2ZW50Rm9jdXMgJiYgKGV2ZW50LnRhcmdldCAhPT0gZWxlIHx8IGV2ZW50Ll9fX290ID09PSBuYW1lKSB8fCBpc0V2ZW50SG92ZXIgJiYgZXZlbnQucmVsYXRlZFRhcmdldCAmJiBlbGUuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSByZXR1cm47XG4gICAgICAgIHZhciB0aGlzQXJnID0gZWxlO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB3aGlsZSAoIW1hdGNoZXModGFyZ2V0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGVsZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNBcmcgPSB0YXJnZXQ7XG4gICAgICAgICAgZXZlbnQuX19fY2QgPSB0cnVlOyAvLyBEZWxlZ2F0ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50Ll9fX2NkKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnY3VycmVudFRhcmdldCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpc0FyZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2RhdGEnLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBldmVudCwgZXZlbnQuX19fdGQpO1xuXG4gICAgICAgIGlmIChfb25lKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgZmluYWxDYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZmluYWxDYWxsYmFjay5ndWlkID0gY2FsbGJhY2suZ3VpZCA9IGNhbGxiYWNrLmd1aWQgfHwgY2FzaC5ndWlkKys7XG4gICAgICBhZGRFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBmaW5hbENhbGxiYWNrKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5vbiA9IG9uO1xuXG5mdW5jdGlvbiBvbmUoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgdHJ1ZSk7XG59XG5cbjtcbmZuLm9uZSA9IG9uZTtcblxuZm4ucmVhZHkgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoY2FsbGJhY2ssIDAsIGNhc2gpO1xuICB9O1xuXG4gIGlmIChkb2MucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgY2IoKTtcbiAgfSBlbHNlIHtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICBpZiAoaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgdmFyIF9hID0gcGFyc2VFdmVudE5hbWUoZXZlbnQpLFxuICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICBuYW1lXzEgPSBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lT3JpZ2luYWwpO1xuXG4gICAgaWYgKCFuYW1lXzEpIHJldHVybiB0aGlzO1xuICAgIHZhciB0eXBlID0gZXZlbnRzTW91c2VSZS50ZXN0KG5hbWVfMSkgPyAnTW91c2VFdmVudHMnIDogJ0hUTUxFdmVudHMnO1xuICAgIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KHR5cGUpO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lXzEsIHRydWUsIHRydWUpO1xuICAgIGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKTtcbiAgICBldmVudC5fX19vdCA9IG5hbWVPcmlnaW5hbDtcbiAgfVxuXG4gIGV2ZW50Ll9fX3RkID0gZGF0YTtcbiAgdmFyIGlzRXZlbnRGb2N1cyA9IGV2ZW50Ll9fX290IGluIGV2ZW50c0ZvY3VzO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoaXNFdmVudEZvY3VzICYmIGlzRnVuY3Rpb24oZWxlW2V2ZW50Ll9fX290XSkpIHtcbiAgICAgIGVsZVtcIl9fX2lcIiArIGV2ZW50LnR5cGVdID0gdHJ1ZTsgLy8gRW5zdXJpbmcgdGhlIG5hdGl2ZSBldmVudCBpcyBpZ25vcmVkXG5cbiAgICAgIGVsZVtldmVudC5fX19vdF0oKTtcblxuICAgICAgZWxlW1wiX19faVwiICsgZXZlbnQudHlwZV0gPSBmYWxzZTsgLy8gRW5zdXJpbmcgdGhlIGN1c3RvbSBldmVudCBpcyBub3QgaWdub3JlZFxuICAgIH1cblxuICAgIGVsZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSk7XG59OyAvLyBAb3B0aW9uYWwgLi9vZmYudHNcbi8vIEBvcHRpb25hbCAuL29uLnRzXG4vLyBAb3B0aW9uYWwgLi9vbmUudHNcbi8vIEBvcHRpb25hbCAuL3JlYWR5LnRzXG4vLyBAb3B0aW9uYWwgLi90cmlnZ2VyLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3BsdWNrLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGdldFZhbHVlKGVsZSkge1xuICBpZiAoZWxlLm11bHRpcGxlICYmIGVsZS5vcHRpb25zKSByZXR1cm4gcGx1Y2soZmlsdGVyLmNhbGwoZWxlLm9wdGlvbnMsIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICByZXR1cm4gb3B0aW9uLnNlbGVjdGVkICYmICFvcHRpb24uZGlzYWJsZWQgJiYgIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkO1xuICB9KSwgJ3ZhbHVlJyk7XG4gIHJldHVybiBlbGUudmFsdWUgfHwgJyc7XG59XG5cbnZhciBxdWVyeUVuY29kZVNwYWNlUmUgPSAvJTIwL2csXG4gICAgcXVlcnlFbmNvZGVDUkxGUmUgPSAvXFxyP1xcbi9nO1xuXG5mdW5jdGlvbiBxdWVyeUVuY29kZShwcm9wLCB2YWx1ZSkge1xuICByZXR1cm4gXCImXCIgKyBlbmNvZGVVUklDb21wb25lbnQocHJvcCkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS5yZXBsYWNlKHF1ZXJ5RW5jb2RlQ1JMRlJlLCAnXFxyXFxuJykpLnJlcGxhY2UocXVlcnlFbmNvZGVTcGFjZVJlLCAnKycpO1xufVxuXG52YXIgc2tpcHBhYmxlUmUgPSAvZmlsZXxyZXNldHxzdWJtaXR8YnV0dG9ufGltYWdlL2ksXG4gICAgY2hlY2thYmxlUmUgPSAvcmFkaW98Y2hlY2tib3gvaTtcblxuZm4uc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcXVlcnkgPSAnJztcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBlYWNoKGVsZS5lbGVtZW50cyB8fCBbZWxlXSwgZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKGVsZS5kaXNhYmxlZCB8fCAhZWxlLm5hbWUgfHwgZWxlLnRhZ05hbWUgPT09ICdGSUVMRFNFVCcgfHwgc2tpcHBhYmxlUmUudGVzdChlbGUudHlwZSkgfHwgY2hlY2thYmxlUmUudGVzdChlbGUudHlwZSkgJiYgIWVsZS5jaGVja2VkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShlbGUpO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGVhY2godmFsdWVzLCBmdW5jdGlvbiAoaSwgdmFsdWUpIHtcbiAgICAgICAgICBxdWVyeSArPSBxdWVyeUVuY29kZShlbGUubmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBxdWVyeS5zbGljZSgxKTtcbn07XG5cbmZ1bmN0aW9uIHZhbCh2YWx1ZSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzWzBdICYmIGdldFZhbHVlKHRoaXNbMF0pO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgaXNTZWxlY3QgPSBlbGUubXVsdGlwbGUgJiYgZWxlLm9wdGlvbnM7XG5cbiAgICBpZiAoaXNTZWxlY3QgfHwgY2hlY2thYmxlUmUudGVzdChlbGUudHlwZSkpIHtcbiAgICAgIHZhciBlbGVWYWx1ZV8xID0gaXNBcnJheSh2YWx1ZSkgPyBtYXAuY2FsbCh2YWx1ZSwgU3RyaW5nKSA6IGlzTnVsbCh2YWx1ZSkgPyBbXSA6IFtTdHJpbmcodmFsdWUpXTtcblxuICAgICAgaWYgKGlzU2VsZWN0KSB7XG4gICAgICAgIGVhY2goZWxlLm9wdGlvbnMsIGZ1bmN0aW9uIChpLCBvcHRpb24pIHtcbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBlbGVWYWx1ZV8xLmluZGV4T2Yob3B0aW9uLnZhbHVlKSA+PSAwO1xuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5jaGVja2VkID0gZWxlVmFsdWVfMS5pbmRleE9mKGVsZS52YWx1ZSkgPj0gMDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlLnZhbHVlID0gaXNVbmRlZmluZWQodmFsdWUpIHx8IGlzTnVsbCh2YWx1ZSkgPyAnJyA6IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZuLnZhbCA9IHZhbDtcblxuZm4uY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jbG9uZU5vZGUodHJ1ZSk7XG4gIH0pO1xufTtcblxuZm4uZGV0YWNoID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgZmlsdGVyZWQodGhpcywgY29tcGFyYXRvcikuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGVsZS5wYXJlbnROb2RlKSB7XG4gICAgICBlbGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIGZyYWdtZW50UmUgPSAvXlxccyo8KFxcdyspW14+XSo+LyxcbiAgICBzaW5nbGVUYWdSZSA9IC9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+KT8kLztcbnZhciBjb250YWluZXJzID0ge1xuICAnKic6IGRpdixcbiAgdHI6IHRib2R5LFxuICB0ZDogdHIsXG4gIHRoOiB0cixcbiAgdGhlYWQ6IHRhYmxlLFxuICB0Ym9keTogdGFibGUsXG4gIHRmb290OiB0YWJsZVxufTsgLy9UT0RPOiBDcmVhdGUgZWxlbWVudHMgaW5zaWRlIGEgZG9jdW1lbnQgZnJhZ21lbnQsIGluIG9yZGVyIHRvIHByZXZlbnQgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gZmlyaW5nXG4vL1RPRE86IEVuc3VyZSB0aGUgY3JlYXRlZCBlbGVtZW50cyBoYXZlIHRoZSBmcmFnbWVudCBhcyB0aGVpciBwYXJlbnQgaW5zdGVhZCBvZiBudWxsLCB0aGlzIGFsc28gZW5zdXJlcyB3ZSBjYW4gZGVhbCB3aXRoIGRldGF0Y2hlZCBub2RlcyBtb3JlIHJlbGlhYmx5XG5cbmZ1bmN0aW9uIHBhcnNlSFRNTChodG1sKSB7XG4gIGlmICghaXNTdHJpbmcoaHRtbCkpIHJldHVybiBbXTtcbiAgaWYgKHNpbmdsZVRhZ1JlLnRlc3QoaHRtbCkpIHJldHVybiBbY3JlYXRlRWxlbWVudChSZWdFeHAuJDEpXTtcbiAgdmFyIGZyYWdtZW50ID0gZnJhZ21lbnRSZS50ZXN0KGh0bWwpICYmIFJlZ0V4cC4kMSxcbiAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbZnJhZ21lbnRdIHx8IGNvbnRhaW5lcnNbJyonXTtcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIHJldHVybiBjYXNoKGNvbnRhaW5lci5jaGlsZE5vZGVzKS5kZXRhY2goKS5nZXQoKTtcbn1cblxuY2FzaC5wYXJzZUhUTUwgPSBwYXJzZUhUTUw7XG5cbmZuLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB3aGlsZSAoZWxlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGVsZS5yZW1vdmVDaGlsZChlbGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGh0bWwoaHRtbCkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0uaW5uZXJIVE1MO1xuICBpZiAoaXNVbmRlZmluZWQoaHRtbCkpIHJldHVybiB0aGlzO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWxlLmlubmVySFRNTCA9IGh0bWw7XG4gIH0pO1xufVxuXG5mbi5odG1sID0gaHRtbDtcblxuZm4ucmVtb3ZlID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgZmlsdGVyZWQodGhpcywgY29tcGFyYXRvcikuZGV0YWNoKCkub2ZmKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gdGV4dCh0ZXh0KSB7XG4gIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSkgcmV0dXJuIHRoaXNbMF0gPyB0aGlzWzBdLnRleHRDb250ZW50IDogJyc7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlbGUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9KTtcbn1cblxuO1xuZm4udGV4dCA9IHRleHQ7XG5cbmZuLnVud3JhcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoZWxlLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuO1xuICAgIHZhciAkZWxlID0gY2FzaChlbGUpO1xuICAgICRlbGUucmVwbGFjZVdpdGgoJGVsZS5jaGlsZHJlbigpKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ub2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKCFlbGUpIHJldHVybjtcbiAgdmFyIHJlY3QgPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgdG9wOiByZWN0LnRvcCArIHdpbi5wYWdlWU9mZnNldCxcbiAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcbiAgfTtcbn07XG5cbmZuLm9mZnNldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlLm9mZnNldFBhcmVudDtcblxuICAgIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgY29tcHV0ZVN0eWxlKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlO1xuICB9KTtcbn07XG5cbmZuLnBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKCFlbGUpIHJldHVybjtcbiAgdmFyIGlzRml4ZWQgPSBjb21wdXRlU3R5bGUoZWxlLCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJyxcbiAgICAgIG9mZnNldCA9IGlzRml4ZWQgPyBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiB0aGlzLm9mZnNldCgpO1xuXG4gIGlmICghaXNGaXhlZCkge1xuICAgIHZhciBkb2NfMSA9IGVsZS5vd25lckRvY3VtZW50O1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGUub2Zmc2V0UGFyZW50IHx8IGRvY18xLmRvY3VtZW50RWxlbWVudDtcblxuICAgIHdoaWxlICgob2Zmc2V0UGFyZW50ID09PSBkb2NfMS5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jXzEuZG9jdW1lbnRFbGVtZW50KSAmJiBjb21wdXRlU3R5bGUob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXRQYXJlbnQgIT09IGVsZSAmJiBpc0VsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgdmFyIHBhcmVudE9mZnNldCA9IGNhc2gob2Zmc2V0UGFyZW50KS5vZmZzZXQoKTtcbiAgICAgIG9mZnNldC50b3AgLT0gcGFyZW50T2Zmc2V0LnRvcCArIGNvbXB1dGVTdHlsZUludChvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcpO1xuICAgICAgb2Zmc2V0LmxlZnQgLT0gcGFyZW50T2Zmc2V0LmxlZnQgKyBjb21wdXRlU3R5bGVJbnQob2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG9mZnNldC50b3AgLSBjb21wdXRlU3R5bGVJbnQoZWxlLCAnbWFyZ2luVG9wJyksXG4gICAgbGVmdDogb2Zmc2V0LmxlZnQgLSBjb21wdXRlU3R5bGVJbnQoZWxlLCAnbWFyZ2luTGVmdCcpXG4gIH07XG59O1xuXG5mbi5jaGlsZHJlbiA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jaGlsZHJlbjtcbiAgfSkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5jb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRhZ05hbWUgPT09ICdJRlJBTUUnID8gW2VsZS5jb250ZW50RG9jdW1lbnRdIDogZWxlLnRhZ05hbWUgPT09ICdURU1QTEFURScgPyBlbGUuY29udGVudC5jaGlsZE5vZGVzIDogZWxlLmNoaWxkTm9kZXM7XG4gIH0pKSk7XG59O1xuXG5mbi5maW5kID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGZpbmQoc2VsZWN0b3IsIGVsZSk7XG4gIH0pKSk7XG59OyAvLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuLy8gQHJlcXVpcmUgY29sbGVjdGlvbi9maWx0ZXIudHNcbi8vIEByZXF1aXJlIHRyYXZlcnNhbC9maW5kLnRzXG5cblxudmFyIEhUTUxDREFUQVJlID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLFxuICAgIHNjcmlwdFR5cGVSZSA9IC9eJHxebW9kdWxlJHxcXC8oamF2YXxlY21hKXNjcmlwdC9pLFxuICAgIHNjcmlwdEF0dHJpYnV0ZXMgPSBbJ3R5cGUnLCAnc3JjJywgJ25vbmNlJywgJ25vTW9kdWxlJ107XG5cbmZ1bmN0aW9uIGV2YWxTY3JpcHRzKG5vZGUsIGRvYykge1xuICB2YXIgY29sbGVjdGlvbiA9IGNhc2gobm9kZSk7XG4gIGNvbGxlY3Rpb24uZmlsdGVyKCdzY3JpcHQnKS5hZGQoY29sbGVjdGlvbi5maW5kKCdzY3JpcHQnKSkuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKHNjcmlwdFR5cGVSZS50ZXN0KGVsZS50eXBlKSAmJiBkb2NFbGUuY29udGFpbnMoZWxlKSkge1xuICAgICAgLy8gVGhlIHNjcmlwdCB0eXBlIGlzIHN1cHBvcnRlZCAvLyBUaGUgZWxlbWVudCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NIC8vIFVzaW5nIGBkb2N1bWVudEVsZW1lbnRgIGZvciBicm9hZGVyIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgdmFyIHNjcmlwdF8xID0gY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRfMS50ZXh0ID0gZWxlLnRleHRDb250ZW50LnJlcGxhY2UoSFRNTENEQVRBUmUsICcnKTtcbiAgICAgIGVhY2goc2NyaXB0QXR0cmlidXRlcywgZnVuY3Rpb24gKGksIGF0dHIpIHtcbiAgICAgICAgaWYgKGVsZVthdHRyXSkgc2NyaXB0XzFbYXR0cl0gPSBlbGVbYXR0cl07XG4gICAgICB9KTtcbiAgICAgIGRvYy5oZWFkLmluc2VydEJlZm9yZShzY3JpcHRfMSwgbnVsbCk7XG4gICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRfMSk7XG4gICAgfVxuICB9KTtcbn0gLy8gQHJlcXVpcmUgLi9ldmFsX3NjcmlwdHMudHNcblxuXG5mdW5jdGlvbiBpbnNlcnRFbGVtZW50KGFuY2hvciwgdGFyZ2V0LCBsZWZ0LCBpbnNpZGUsIGV2YWx1YXRlKSB7XG4gIGlmIChpbnNpZGUpIHtcbiAgICAvLyBwcmVwZW5kL2FwcGVuZFxuICAgIGFuY2hvci5pbnNlcnRCZWZvcmUodGFyZ2V0LCBsZWZ0ID8gYW5jaG9yLmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBiZWZvcmUvYWZ0ZXJcbiAgICBhbmNob3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFyZ2V0LCBsZWZ0ID8gYW5jaG9yIDogYW5jaG9yLm5leHRTaWJsaW5nKTtcbiAgfVxuXG4gIGlmIChldmFsdWF0ZSkge1xuICAgIGV2YWxTY3JpcHRzKHRhcmdldCwgYW5jaG9yLm93bmVyRG9jdW1lbnQpO1xuICB9XG59IC8vIEByZXF1aXJlIC4vaW5zZXJ0X2VsZW1lbnQudHNcblxuXG5mdW5jdGlvbiBpbnNlcnRTZWxlY3RvcnMoc2VsZWN0b3JzLCBhbmNob3JzLCBpbnZlcnNlLCBsZWZ0LCBpbnNpZGUsIHJldmVyc2VMb29wMSwgcmV2ZXJzZUxvb3AyLCByZXZlcnNlTG9vcDMpIHtcbiAgZWFjaChzZWxlY3RvcnMsIGZ1bmN0aW9uIChzaSwgc2VsZWN0b3IpIHtcbiAgICBlYWNoKGNhc2goc2VsZWN0b3IpLCBmdW5jdGlvbiAodGksIHRhcmdldCkge1xuICAgICAgZWFjaChjYXNoKGFuY2hvcnMpLCBmdW5jdGlvbiAoYWksIGFuY2hvcikge1xuICAgICAgICB2YXIgYW5jaG9yRmluYWwgPSBpbnZlcnNlID8gdGFyZ2V0IDogYW5jaG9yLFxuICAgICAgICAgICAgdGFyZ2V0RmluYWwgPSBpbnZlcnNlID8gYW5jaG9yIDogdGFyZ2V0LFxuICAgICAgICAgICAgaW5kZXhGaW5hbCA9IGludmVyc2UgPyB0aSA6IGFpO1xuICAgICAgICBpbnNlcnRFbGVtZW50KGFuY2hvckZpbmFsLCAhaW5kZXhGaW5hbCA/IHRhcmdldEZpbmFsIDogdGFyZ2V0RmluYWwuY2xvbmVOb2RlKHRydWUpLCBsZWZ0LCBpbnNpZGUsICFpbmRleEZpbmFsKTtcbiAgICAgIH0sIHJldmVyc2VMb29wMyk7XG4gICAgfSwgcmV2ZXJzZUxvb3AyKTtcbiAgfSwgcmV2ZXJzZUxvb3AxKTtcbiAgcmV0dXJuIGFuY2hvcnM7XG59XG5cbmZuLmFmdGVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uYXBwZW5kVG8gPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmluc2VydEFmdGVyID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIHRydWUpO1xufTtcblxuZm4ucHJlcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLnByZXBlbmRUbyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmJlZm9yZShzZWxlY3RvcikucmVtb3ZlKCk7XG59O1xuXG5mbi5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIGNhc2goc2VsZWN0b3IpLnJlcGxhY2VXaXRoKHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLndyYXBBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIHN0cnVjdHVyZSA9IGNhc2goc2VsZWN0b3IpLFxuICAgICAgd3JhcHBlciA9IHN0cnVjdHVyZVswXTtcblxuICB3aGlsZSAod3JhcHBlci5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICB3cmFwcGVyID0gd3JhcHBlci5maXJzdEVsZW1lbnRDaGlsZDtcbiAgfVxuXG4gIHRoaXMuZmlyc3QoKS5iZWZvcmUoc3RydWN0dXJlKTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG8od3JhcHBlcik7XG59O1xuXG5mbi53cmFwID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciB3cmFwcGVyID0gY2FzaChzZWxlY3RvcilbMF07XG4gICAgY2FzaChlbGUpLndyYXBBbGwoIWkgPyB3cmFwcGVyIDogd3JhcHBlci5jbG9uZU5vZGUodHJ1ZSkpO1xuICB9KTtcbn07XG5cbmZuLndyYXBJbm5lciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgJGVsZSA9IGNhc2goZWxlKSxcbiAgICAgICAgY29udGVudHMgPSAkZWxlLmNvbnRlbnRzKCk7XG4gICAgY29udGVudHMubGVuZ3RoID8gY29udGVudHMud3JhcEFsbChzZWxlY3RvcikgOiAkZWxlLmFwcGVuZChzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxuZm4uaGFzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBjb21wYXJhdG9yID0gaXNTdHJpbmcoc2VsZWN0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBmaW5kKHNlbGVjdG9yLCBlbGUpLmxlbmd0aDtcbiAgfSA6IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNvbnRhaW5zKHNlbGVjdG9yKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMuZmlsdGVyKGNvbXBhcmF0b3IpO1xufTtcblxuZm4uaXMgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgY29tcGFyZSA9IGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKTtcbiAgcmV0dXJuIHNvbWUuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pO1xufTtcblxuZm4ubmV4dCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfYWxsLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICduZXh0RWxlbWVudFNpYmxpbmcnLCBfYWxsLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ubmV4dEFsbCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLm5leHQoY29tcGFyYXRvciwgdHJ1ZSk7XG59O1xuXG5mbi5uZXh0VW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMubmV4dChjb21wYXJhdG9yLCB0cnVlLCB1bnRpbCk7XG59O1xuXG5mbi5ub3QgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgY29tcGFyZSA9IGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKTtcbiAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gKCFpc1N0cmluZyhjb21wYXJhdG9yKSB8fCBpc0VsZW1lbnQoZWxlKSkgJiYgIWNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pO1xufTtcblxuZm4ucGFyZW50ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwYXJlbnROb2RlJykpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5pbmRleCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgY2hpbGQgPSBzZWxlY3RvciA/IGNhc2goc2VsZWN0b3IpWzBdIDogdGhpc1swXSxcbiAgICAgIGNvbGxlY3Rpb24gPSBzZWxlY3RvciA/IHRoaXMgOiBjYXNoKGNoaWxkKS5wYXJlbnQoKS5jaGlsZHJlbigpO1xuICByZXR1cm4gaW5kZXhPZi5jYWxsKGNvbGxlY3Rpb24sIGNoaWxkKTtcbn07XG5cbmZuLmNsb3Nlc3QgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgZmlsdGVyZWQgPSB0aGlzLmZpbHRlcihjb21wYXJhdG9yKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuICB2YXIgJHBhcmVudCA9IHRoaXMucGFyZW50KCk7XG4gIGlmICghJHBhcmVudC5sZW5ndGgpIHJldHVybiBmaWx0ZXJlZDtcbiAgcmV0dXJuICRwYXJlbnQuY2xvc2VzdChjb21wYXJhdG9yKTtcbn07XG5cbmZuLnBhcmVudHMgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncGFyZW50RWxlbWVudCcsIHRydWUsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5wYXJlbnRzVW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50cyhjb21wYXJhdG9yLCB1bnRpbCk7XG59O1xuXG5mbi5wcmV2ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF9hbGwsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnLCBfYWxsLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucHJldkFsbCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnByZXYoY29tcGFyYXRvciwgdHJ1ZSk7XG59O1xuXG5mbi5wcmV2VW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucHJldihjb21wYXJhdG9yLCB0cnVlLCB1bnRpbCk7XG59O1xuXG5mbi5zaWJsaW5ncyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGNhc2goZWxlKS5wYXJlbnQoKS5jaGlsZHJlbigpLm5vdChlbGUpO1xuICB9KSkpLCBjb21wYXJhdG9yKTtcbn07IC8vIEBvcHRpb25hbCAuL2NoaWxkcmVuLnRzXG4vLyBAb3B0aW9uYWwgLi9jbG9zZXN0LnRzXG4vLyBAb3B0aW9uYWwgLi9jb250ZW50cy50c1xuLy8gQG9wdGlvbmFsIC4vZmluZC50c1xuLy8gQG9wdGlvbmFsIC4vaGFzLnRzXG4vLyBAb3B0aW9uYWwgLi9pcy50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dC50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dF9hbGwudHNcbi8vIEBvcHRpb25hbCAuL25leHRfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL25vdC50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50LnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnRzLnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnRzX3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2LnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2X2FsbC50c1xuLy8gQG9wdGlvbmFsIC4vcHJldl91bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vc2libGluZ3MudHNcbi8vIEBvcHRpb25hbCBhdHRyaWJ1dGVzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgY29sbGVjdGlvbi9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGNzcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGRhdGEvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBkaW1lbnNpb25zL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZWZmZWN0cy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGV2ZW50cy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGZvcm1zL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgbWFuaXB1bGF0aW9uL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgb2Zmc2V0L2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgdHJhdmVyc2FsL2luZGV4LnRzXG4vLyBAcmVxdWlyZSBjb3JlL2luZGV4LnRzXG4vLyBAcHJpb3JpdHkgLTEwMFxuLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG4vLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gTm9kZS5qc1xuICBtb2R1bGUuZXhwb3J0cyA9IGNhc2g7XG59IGVsc2Uge1xuICAvLyBCcm93c2VyXG4gIHdpblsnY2FzaCddID0gd2luWyckJ10gPSBjYXNoO1xufVxufSkoKTsiLCIndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBvdXQkID0gdHlwZW9mIGV4cG9ydHMgIT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0cyB8fCB0eXBlb2YgZGVmaW5lICE9ICd1bmRlZmluZWQnICYmIHt9IHx8IHRoaXMgfHwgd2luZG93O1xuICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIGRlZmluZSgnc2F2ZS1zdmctYXMtcG5nJywgW10sIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb3V0JDtcbiAgfSk7XG4gIG91dCQuZGVmYXVsdCA9IG91dCQ7XG5cbiAgdmFyIHhtbE5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJztcbiAgdmFyIHhodG1sTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gIHZhciBzdmdOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIHZhciBkb2N0eXBlID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCIgWzwhRU5USVRZIG5ic3AgXCImIzE2MDtcIj5dPic7XG4gIHZhciB1cmxSZWdleCA9IC91cmxcXChbXCInXT8oLis/KVtcIiddP1xcKS87XG4gIHZhciBmb250Rm9ybWF0cyA9IHtcbiAgICB3b2ZmMjogJ2ZvbnQvd29mZjInLFxuICAgIHdvZmY6ICdmb250L3dvZmYnLFxuICAgIG90ZjogJ2FwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZScsXG4gICAgdHRmOiAnYXBwbGljYXRpb24veC1mb250LXR0ZicsXG4gICAgZW90OiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIHNmbnQ6ICdhcHBsaWNhdGlvbi9mb250LXNmbnQnLFxuICAgIHN2ZzogJ2ltYWdlL3N2Zyt4bWwnXG4gIH07XG5cbiAgdmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgb2JqIGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbiAgfTtcbiAgdmFyIHJlcXVpcmVEb21Ob2RlID0gZnVuY3Rpb24gcmVxdWlyZURvbU5vZGUoZWwpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbCkpIHRocm93IG5ldyBFcnJvcignYW4gSFRNTEVsZW1lbnQgb3IgU1ZHRWxlbWVudCBpcyByZXF1aXJlZDsgZ290ICcgKyBlbCk7XG4gIH07XG4gIHZhciByZXF1aXJlRG9tTm9kZVByb21pc2UgPSBmdW5jdGlvbiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKGlzRWxlbWVudChlbCkpIHJlc29sdmUoZWwpO2Vsc2UgcmVqZWN0KG5ldyBFcnJvcignYW4gSFRNTEVsZW1lbnQgb3IgU1ZHRWxlbWVudCBpcyByZXF1aXJlZDsgZ290ICcgKyBlbCkpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgaXNFeHRlcm5hbCA9IGZ1bmN0aW9uIGlzRXh0ZXJuYWwodXJsKSB7XG4gICAgcmV0dXJuIHVybCAmJiB1cmwubGFzdEluZGV4T2YoJ2h0dHAnLCAwKSA9PT0gMCAmJiB1cmwubGFzdEluZGV4T2Yod2luZG93LmxvY2F0aW9uLmhvc3QpID09PSAtMTtcbiAgfTtcblxuICB2YXIgZ2V0Rm9udE1pbWVUeXBlRnJvbVVybCA9IGZ1bmN0aW9uIGdldEZvbnRNaW1lVHlwZUZyb21VcmwoZm9udFVybCkge1xuICAgIHZhciBmb3JtYXRzID0gT2JqZWN0LmtleXMoZm9udEZvcm1hdHMpLmZpbHRlcihmdW5jdGlvbiAoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gZm9udFVybC5pbmRleE9mKCcuJyArIGV4dGVuc2lvbikgPiAwO1xuICAgIH0pLm1hcChmdW5jdGlvbiAoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gZm9udEZvcm1hdHNbZXh0ZW5zaW9uXTtcbiAgICB9KTtcbiAgICBpZiAoZm9ybWF0cykgcmV0dXJuIGZvcm1hdHNbMF07XG4gICAgY29uc29sZS5lcnJvcignVW5rbm93biBmb250IGZvcm1hdCBmb3IgJyArIGZvbnRVcmwgKyAnLiBGb250cyBtYXkgbm90IGJlIHdvcmtpbmcgY29ycmVjdGx5LicpO1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgfTtcblxuICB2YXIgYXJyYXlCdWZmZXJUb0Jhc2U2NCA9IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyKSB7XG4gICAgdmFyIGJpbmFyeSA9ICcnO1xuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICB9cmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XG4gIH07XG5cbiAgdmFyIGdldERpbWVuc2lvbiA9IGZ1bmN0aW9uIGdldERpbWVuc2lvbihlbCwgY2xvbmUsIGRpbSkge1xuICAgIHZhciB2ID0gZWwudmlld0JveCAmJiBlbC52aWV3Qm94LmJhc2VWYWwgJiYgZWwudmlld0JveC5iYXNlVmFsW2RpbV0gfHwgY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkgIT09IG51bGwgJiYgIWNsb25lLmdldEF0dHJpYnV0ZShkaW0pLm1hdGNoKC8lJC8pICYmIHBhcnNlSW50KGNsb25lLmdldEF0dHJpYnV0ZShkaW0pKSB8fCBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1dIHx8IHBhcnNlSW50KGNsb25lLnN0eWxlW2RpbV0pIHx8IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKGRpbSkpO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgfHwgdiA9PT0gbnVsbCB8fCBpc05hTihwYXJzZUZsb2F0KHYpKSA/IDAgOiB2O1xuICB9O1xuXG4gIHZhciBnZXREaW1lbnNpb25zID0gZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbCwgY2xvbmUsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ3N2ZycpIHJldHVybiB7XG4gICAgICB3aWR0aDogd2lkdGggfHwgZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgJ3dpZHRoJyksXG4gICAgICBoZWlnaHQ6IGhlaWdodCB8fCBnZXREaW1lbnNpb24oZWwsIGNsb25lLCAnaGVpZ2h0JylcbiAgICB9O2Vsc2UgaWYgKGVsLmdldEJCb3gpIHtcbiAgICAgIHZhciBfZWwkZ2V0QkJveCA9IGVsLmdldEJCb3goKSxcbiAgICAgICAgICB4ID0gX2VsJGdldEJCb3gueCxcbiAgICAgICAgICB5ID0gX2VsJGdldEJCb3gueSxcbiAgICAgICAgICBfd2lkdGggPSBfZWwkZ2V0QkJveC53aWR0aCxcbiAgICAgICAgICBfaGVpZ2h0ID0gX2VsJGdldEJCb3guaGVpZ2h0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogeCArIF93aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5ICsgX2hlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJlRW5jb2RlID0gZnVuY3Rpb24gcmVFbmNvZGUoZGF0YSkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csIGZ1bmN0aW9uIChtYXRjaCwgcDEpIHtcbiAgICAgIHZhciBjID0gU3RyaW5nLmZyb21DaGFyQ29kZSgnMHgnICsgcDEpO1xuICAgICAgcmV0dXJuIGMgPT09ICclJyA/ICclMjUnIDogYztcbiAgICB9KSk7XG4gIH07XG5cbiAgdmFyIHVyaVRvQmxvYiA9IGZ1bmN0aW9uIHVyaVRvQmxvYih1cmkpIHtcbiAgICB2YXIgYnl0ZVN0cmluZyA9IHdpbmRvdy5hdG9iKHVyaS5zcGxpdCgnLCcpWzFdKTtcbiAgICB2YXIgbWltZVN0cmluZyA9IHVyaS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgICB2YXIgaW50QXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaW50QXJyYXlbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBtaW1lU3RyaW5nIH0pO1xuICB9O1xuXG4gIHZhciBxdWVyeSA9IGZ1bmN0aW9uIHF1ZXJ5KGVsLCBzZWxlY3Rvcikge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIHx8IGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBDU1Mgc2VsZWN0b3IgXCInICsgc2VsZWN0b3IgKyAnXCInLCBlcnIpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZGV0ZWN0Q3NzRm9udCA9IGZ1bmN0aW9uIGRldGVjdENzc0ZvbnQocnVsZSwgaHJlZikge1xuICAgIC8vIE1hdGNoIENTUyBmb250LWZhY2UgcnVsZXMgdG8gZXh0ZXJuYWwgbGlua3MuXG4gICAgLy8gQGZvbnQtZmFjZSB7XG4gICAgLy8gICBzcmM6IGxvY2FsKCdBYmVsJyksIHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvYWJlbC92Ni9Vek4taWVqUjFWb1hVMk9jLTdMc2J2ZXNaVzJ4T1EteHNOcU80N201NURBLndvZmYyKTtcbiAgICAvLyB9XG4gICAgdmFyIG1hdGNoID0gcnVsZS5jc3NUZXh0Lm1hdGNoKHVybFJlZ2V4KTtcbiAgICB2YXIgdXJsID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgaWYgKCF1cmwgfHwgdXJsLm1hdGNoKC9eZGF0YTovKSB8fCB1cmwgPT09ICdhYm91dDpibGFuaycpIHJldHVybjtcbiAgICB2YXIgZnVsbFVybCA9IHVybC5zdGFydHNXaXRoKCcuLi8nKSA/IGhyZWYgKyAnLy4uLycgKyB1cmwgOiB1cmwuc3RhcnRzV2l0aCgnLi8nKSA/IGhyZWYgKyAnLy4nICsgdXJsIDogdXJsO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBydWxlLmNzc1RleHQsXG4gICAgICBmb3JtYXQ6IGdldEZvbnRNaW1lVHlwZUZyb21VcmwoZnVsbFVybCksXG4gICAgICB1cmw6IGZ1bGxVcmxcbiAgICB9O1xuICB9O1xuXG4gIHZhciBpbmxpbmVJbWFnZXMgPSBmdW5jdGlvbiBpbmxpbmVJbWFnZXMoZWwpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsKCdpbWFnZScpKS5tYXAoZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICB2YXIgaHJlZiA9IGltYWdlLmdldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ2hyZWYnKSB8fCBpbWFnZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIGlmICghaHJlZikgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgIGlmIChpc0V4dGVybmFsKGhyZWYpKSB7XG4gICAgICAgIGhyZWYgKz0gKGhyZWYuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyAndD0nICsgbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICAgIGltZy5zcmMgPSBocmVmO1xuICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgJyArIGhyZWYpKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicsIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciBjYWNoZWRGb250cyA9IHt9O1xuICB2YXIgaW5saW5lRm9udHMgPSBmdW5jdGlvbiBpbmxpbmVGb250cyhmb250cykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmb250cy5tYXAoZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChjYWNoZWRGb250c1tmb250LnVybF0pIHJldHVybiByZXNvbHZlKGNhY2hlZEZvbnRzW2ZvbnQudXJsXSk7XG5cbiAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBUT0RPOiBpdCBtYXkgYWxzbyBiZSB3b3J0aCBpdCB0byB3YWl0IHVudGlsIGZvbnRzIGFyZSBmdWxseSBsb2FkZWQgYmVmb3JlXG4gICAgICAgICAgLy8gYXR0ZW1wdGluZyB0byByYXN0ZXJpemUgdGhlbS4gKGUuZy4gdXNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Gb250RmFjZVNldClcbiAgICAgICAgICB2YXIgZm9udEluQmFzZTY0ID0gYXJyYXlCdWZmZXJUb0Jhc2U2NChyZXEucmVzcG9uc2UpO1xuICAgICAgICAgIHZhciBmb250VXJpID0gZm9udC50ZXh0LnJlcGxhY2UodXJsUmVnZXgsICd1cmwoXCJkYXRhOicgKyBmb250LmZvcm1hdCArICc7YmFzZTY0LCcgKyBmb250SW5CYXNlNjQgKyAnXCIpJykgKyAnXFxuJztcbiAgICAgICAgICBjYWNoZWRGb250c1tmb250LnVybF0gPSBmb250VXJpO1xuICAgICAgICAgIHJlc29sdmUoZm9udFVyaSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgZm9udCBmcm9tOiAnICsgZm9udC51cmwsIGUpO1xuICAgICAgICAgIGNhY2hlZEZvbnRzW2ZvbnQudXJsXSA9IG51bGw7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdBYm9ydGVkIGxvYWRpbmcgZm9udCBmcm9tOiAnICsgZm9udC51cmwsIGUpO1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEub3BlbignR0VUJywgZm9udC51cmwpO1xuICAgICAgICByZXEucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgcmVxLnNlbmQoKTtcbiAgICAgIH0pO1xuICAgIH0pKS50aGVuKGZ1bmN0aW9uIChmb250Q3NzKSB7XG4gICAgICByZXR1cm4gZm9udENzcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgY2FjaGVkUnVsZXMgPSBudWxsO1xuICB2YXIgc3R5bGVTaGVldFJ1bGVzID0gZnVuY3Rpb24gc3R5bGVTaGVldFJ1bGVzKCkge1xuICAgIGlmIChjYWNoZWRSdWxlcykgcmV0dXJuIGNhY2hlZFJ1bGVzO1xuICAgIHJldHVybiBjYWNoZWRSdWxlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMpLm1hcChmdW5jdGlvbiAoc2hlZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IHJ1bGVzOiBzaGVldC5jc3NSdWxlcywgaHJlZjogc2hlZXQuaHJlZiB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1N0eWxlc2hlZXQgY291bGQgbm90IGJlIGxvYWRlZDogJyArIHNoZWV0LmhyZWYsIGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGlubGluZUNzcyA9IGZ1bmN0aW9uIGlubGluZUNzcyhlbCwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgc2VsZWN0b3JSZW1hcCA9IF9yZWYuc2VsZWN0b3JSZW1hcCxcbiAgICAgICAgbW9kaWZ5U3R5bGUgPSBfcmVmLm1vZGlmeVN0eWxlLFxuICAgICAgICBtb2RpZnlDc3MgPSBfcmVmLm1vZGlmeUNzcyxcbiAgICAgICAgZm9udHMgPSBfcmVmLmZvbnRzLFxuICAgICAgICBleGNsdWRlVW51c2VkQ3NzID0gX3JlZi5leGNsdWRlVW51c2VkQ3NzO1xuXG4gICAgdmFyIGdlbmVyYXRlQ3NzID0gbW9kaWZ5Q3NzIHx8IGZ1bmN0aW9uIChzZWxlY3RvciwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHNlbCA9IHNlbGVjdG9yUmVtYXAgPyBzZWxlY3RvclJlbWFwKHNlbGVjdG9yKSA6IHNlbGVjdG9yO1xuICAgICAgdmFyIHByb3BzID0gbW9kaWZ5U3R5bGUgPyBtb2RpZnlTdHlsZShwcm9wZXJ0aWVzKSA6IHByb3BlcnRpZXM7XG4gICAgICByZXR1cm4gc2VsICsgJ3snICsgcHJvcHMgKyAnfVxcbic7XG4gICAgfTtcbiAgICB2YXIgY3NzID0gW107XG4gICAgdmFyIGRldGVjdEZvbnRzID0gdHlwZW9mIGZvbnRzID09PSAndW5kZWZpbmVkJztcbiAgICB2YXIgZm9udExpc3QgPSBmb250cyB8fCBbXTtcbiAgICBzdHlsZVNoZWV0UnVsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIHJ1bGVzID0gX3JlZjIucnVsZXMsXG4gICAgICAgICAgaHJlZiA9IF9yZWYyLmhyZWY7XG5cbiAgICAgIGlmICghcnVsZXMpIHJldHVybjtcbiAgICAgIEFycmF5LmZyb20ocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBydWxlLnN0eWxlICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHF1ZXJ5KGVsLCBydWxlLnNlbGVjdG9yVGV4dCkpIGNzcy5wdXNoKGdlbmVyYXRlQ3NzKHJ1bGUuc2VsZWN0b3JUZXh0LCBydWxlLnN0eWxlLmNzc1RleHQpKTtlbHNlIGlmIChkZXRlY3RGb250cyAmJiBydWxlLmNzc1RleHQubWF0Y2goL15AZm9udC1mYWNlLykpIHtcbiAgICAgICAgICAgIHZhciBmb250ID0gZGV0ZWN0Q3NzRm9udChydWxlLCBocmVmKTtcbiAgICAgICAgICAgIGlmIChmb250KSBmb250TGlzdC5wdXNoKGZvbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWV4Y2x1ZGVVbnVzZWRDc3MpIHtcbiAgICAgICAgICAgIGNzcy5wdXNoKHJ1bGUuY3NzVGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbmxpbmVGb250cyhmb250TGlzdCkudGhlbihmdW5jdGlvbiAoZm9udENzcykge1xuICAgICAgcmV0dXJuIGNzcy5qb2luKCdcXG4nKSArIGZvbnRDc3M7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGRvd25sb2FkT3B0aW9ucyA9IGZ1bmN0aW9uIGRvd25sb2FkT3B0aW9ucygpIHtcbiAgICBpZiAoIW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iICYmICEoJ2Rvd25sb2FkJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykpKSB7XG4gICAgICByZXR1cm4geyBwb3B1cDogd2luZG93Lm9wZW4oKSB9O1xuICAgIH1cbiAgfTtcblxuICBvdXQkLnByZXBhcmVTdmcgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG5cbiAgICB2YXIgX3JlZjMgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMyRsZWZ0ID0gX3JlZjMubGVmdCxcbiAgICAgICAgbGVmdCA9IF9yZWYzJGxlZnQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmMyRsZWZ0LFxuICAgICAgICBfcmVmMyR0b3AgPSBfcmVmMy50b3AsXG4gICAgICAgIHRvcCA9IF9yZWYzJHRvcCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYzJHRvcCxcbiAgICAgICAgdyA9IF9yZWYzLndpZHRoLFxuICAgICAgICBoID0gX3JlZjMuaGVpZ2h0LFxuICAgICAgICBfcmVmMyRzY2FsZSA9IF9yZWYzLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9yZWYzJHNjYWxlID09PSB1bmRlZmluZWQgPyAxIDogX3JlZjMkc2NhbGUsXG4gICAgICAgIF9yZWYzJHJlc3BvbnNpdmUgPSBfcmVmMy5yZXNwb25zaXZlLFxuICAgICAgICByZXNwb25zaXZlID0gX3JlZjMkcmVzcG9uc2l2ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmMyRyZXNwb25zaXZlLFxuICAgICAgICBfcmVmMyRleGNsdWRlQ3NzID0gX3JlZjMuZXhjbHVkZUNzcyxcbiAgICAgICAgZXhjbHVkZUNzcyA9IF9yZWYzJGV4Y2x1ZGVDc3MgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjMkZXhjbHVkZUNzcztcblxuICAgIHJldHVybiBpbmxpbmVJbWFnZXMoZWwpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNsb25lID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgY2xvbmUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKG9wdGlvbnMgfHwge30pLmJhY2tncm91bmRDb2xvciB8fCBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgIHZhciBfZ2V0RGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoZWwsIGNsb25lLCB3LCBoKSxcbiAgICAgICAgICB3aWR0aCA9IF9nZXREaW1lbnNpb25zLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9nZXREaW1lbnNpb25zLmhlaWdodDtcblxuICAgICAgaWYgKGVsLnRhZ05hbWUgIT09ICdzdmcnKSB7XG4gICAgICAgIGlmIChlbC5nZXRCQm94KSB7XG4gICAgICAgICAgaWYgKGNsb25lLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBjbG9uZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLnJlcGxhY2UoL3RyYW5zbGF0ZVxcKC4qP1xcKS8sICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgICAgY2xvbmUgPSBzdmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXR0ZW1wdGVkIHRvIHJlbmRlciBub24tU1ZHIGVsZW1lbnQnLCBlbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndmVyc2lvbicsICcxLjEnKTtcbiAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdLmpvaW4oJyAnKSk7XG4gICAgICBpZiAoIWNsb25lLmdldEF0dHJpYnV0ZSgneG1sbnMnKSkgY2xvbmUuc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxucycsIHN2Z05zKTtcbiAgICAgIGlmICghY2xvbmUuZ2V0QXR0cmlidXRlKCd4bWxuczp4bGluaycpKSBjbG9uZS5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zOnhsaW5rJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnKTtcblxuICAgICAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICAgICAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pbllNaW4gbWVldCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoICogc2NhbGUpO1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodCAqIHNjYWxlKTtcbiAgICAgIH1cblxuICAgICAgQXJyYXkuZnJvbShjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCdmb3JlaWduT2JqZWN0ID4gKicpKS5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduT2JqZWN0KSB7XG4gICAgICAgIGZvcmVpZ25PYmplY3Quc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxucycsIGZvcmVpZ25PYmplY3QudGFnTmFtZSA9PT0gJ3N2ZycgPyBzdmdOcyA6IHhodG1sTnMpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGNsdWRlQ3NzKSB7XG4gICAgICAgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgIHZhciBzcmMgPSBvdXRlci5pbm5lckhUTUw7XG4gICAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShzcmMsIHdpZHRoLCBoZWlnaHQpO2Vsc2UgcmV0dXJuIHsgc3JjOiBzcmMsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVDc3MoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKGNzcykge1xuICAgICAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG4gICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gJzwhW0NEQVRBW1xcbicgKyBjc3MgKyAnXFxuXV0+JztcblxuICAgICAgICAgIHZhciBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGVmcycpO1xuICAgICAgICAgIGRlZnMuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICAgIGNsb25lLmluc2VydEJlZm9yZShkZWZzLCBjbG9uZS5maXJzdENoaWxkKTtcblxuICAgICAgICAgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIG91dGVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgICB2YXIgc3JjID0gb3V0ZXIuaW5uZXJIVE1MLnJlcGxhY2UoL05TXFxkKzpocmVmL2dpLCAneG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeGxpbms6aHJlZicpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHNyYywgd2lkdGgsIGhlaWdodCk7ZWxzZSByZXR1cm4geyBzcmM6IHNyYywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnN2Z0FzRGF0YVVyaSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcbiAgICByZXR1cm4gb3V0JC5wcmVwYXJlU3ZnKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgdmFyIHNyYyA9IF9yZWY0LnNyYyxcbiAgICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWY0LmhlaWdodDtcblxuICAgICAgdmFyIHN2Z1htbCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyB3aW5kb3cuYnRvYShyZUVuY29kZShkb2N0eXBlICsgc3JjKSk7XG4gICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZG9uZShzdmdYbWwsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN2Z1htbDtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnN2Z0FzUG5nVXJpID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuXG4gICAgdmFyIF9yZWY1ID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgX3JlZjUkZW5jb2RlclR5cGUgPSBfcmVmNS5lbmNvZGVyVHlwZSxcbiAgICAgICAgZW5jb2RlclR5cGUgPSBfcmVmNSRlbmNvZGVyVHlwZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlL3BuZycgOiBfcmVmNSRlbmNvZGVyVHlwZSxcbiAgICAgICAgX3JlZjUkZW5jb2Rlck9wdGlvbnMgPSBfcmVmNS5lbmNvZGVyT3B0aW9ucyxcbiAgICAgICAgZW5jb2Rlck9wdGlvbnMgPSBfcmVmNSRlbmNvZGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMC44IDogX3JlZjUkZW5jb2Rlck9wdGlvbnMsXG4gICAgICAgIGNhbnZnID0gX3JlZjUuY2Fudmc7XG5cbiAgICB2YXIgY29udmVydFRvUG5nID0gZnVuY3Rpb24gY29udmVydFRvUG5nKF9yZWY2KSB7XG4gICAgICB2YXIgc3JjID0gX3JlZjYuc3JjLFxuICAgICAgICAgIHdpZHRoID0gX3JlZjYud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZjYuaGVpZ2h0O1xuXG4gICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgdmFyIHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcbiAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGNhbnZhcy53aWR0aCArICdweCc7XG4gICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gY2FudmFzLmhlaWdodCArICdweCc7XG4gICAgICBjb250ZXh0LnNldFRyYW5zZm9ybShwaXhlbFJhdGlvLCAwLCAwLCBwaXhlbFJhdGlvLCAwLCAwKTtcblxuICAgICAgaWYgKGNhbnZnKSBjYW52ZyhjYW52YXMsIHNyYyk7ZWxzZSBjb250ZXh0LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuXG4gICAgICB2YXIgcG5nID0gdm9pZCAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcG5nID0gY2FudmFzLnRvRGF0YVVSTChlbmNvZGVyVHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodHlwZW9mIFNlY3VyaXR5RXJyb3IgIT09ICd1bmRlZmluZWQnICYmIGUgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yIHx8IGUubmFtZSA9PT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVuZGVyZWQgU1ZHIGltYWdlcyBjYW5ub3QgYmUgZG93bmxvYWRlZCBpbiB0aGlzIGJyb3dzZXIuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShwbmcsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBuZyk7XG4gICAgfTtcblxuICAgIGlmIChjYW52ZykgcmV0dXJuIG91dCQucHJlcGFyZVN2ZyhlbCwgb3B0aW9ucykudGhlbihjb252ZXJ0VG9QbmcpO2Vsc2UgcmV0dXJuIG91dCQuc3ZnQXNEYXRhVXJpKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoY29udmVydFRvUG5nKHtcbiAgICAgICAgICAgIHNyYzogaW1hZ2UsXG4gICAgICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZWplY3QoJ1RoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHRoZSBkYXRhIFVSSSBhcyBhbiBpbWFnZSBvbiB0aGUgZm9sbG93aW5nIFNWR1xcbicgKyB3aW5kb3cuYXRvYih1cmkuc2xpY2UoMjYpKSArICdPcGVuIHRoZSBmb2xsb3dpbmcgbGluayB0byBzZWUgYnJvd3NlclxcJ3MgZGlhZ25vc2lzXFxuJyArIHVyaSk7XG4gICAgICAgIH07XG4gICAgICAgIGltYWdlLnNyYyA9IHVyaTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuZG93bmxvYWQgPSBmdW5jdGlvbiAobmFtZSwgdXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYih1cmlUb0Jsb2IodXJpKSwgbmFtZSk7ZWxzZSB7XG4gICAgICB2YXIgc2F2ZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBpZiAoJ2Rvd25sb2FkJyBpbiBzYXZlTGluaykge1xuICAgICAgICBzYXZlTGluay5kb3dubG9hZCA9IG5hbWU7XG4gICAgICAgIHNhdmVMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2F2ZUxpbmspO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBibG9iID0gdXJpVG9CbG9iKHVyaSk7XG4gICAgICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICBzYXZlTGluay5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHdoaWxlIGdldHRpbmcgb2JqZWN0IFVSTC4gRmFsbGluZyBiYWNrIHRvIHN0cmluZyBVUkwuJyk7XG4gICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IHVyaTtcbiAgICAgICAgfVxuICAgICAgICBzYXZlTGluay5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNhdmVMaW5rKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBvcHVwKSB7XG4gICAgICAgIG9wdGlvbnMucG9wdXAuZG9jdW1lbnQudGl0bGUgPSBuYW1lO1xuICAgICAgICBvcHRpb25zLnBvcHVwLmxvY2F0aW9uLnJlcGxhY2UodXJpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3V0JC5zYXZlU3ZnID0gZnVuY3Rpb24gKGVsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIGRvd25sb2FkT3B0cyA9IGRvd25sb2FkT3B0aW9ucygpOyAvLyBkb24ndCBpbmxpbmUsIGNhbid0IGJlIGFzeW5jXG4gICAgcmV0dXJuIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkudGhlbihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBvdXQkLnN2Z0FzRGF0YVVyaShlbCwgb3B0aW9ucyB8fCB7fSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gb3V0JC5kb3dubG9hZChuYW1lLCB1cmksIGRvd25sb2FkT3B0cyk7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zYXZlU3ZnQXNQbmcgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZG93bmxvYWRPcHRzID0gZG93bmxvYWRPcHRpb25zKCk7IC8vIGRvbid0IGlubGluZSwgY2FuJ3QgYmUgYXN5bmNcbiAgICByZXR1cm4gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKS50aGVuKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIG91dCQuc3ZnQXNQbmdVcmkoZWwsIG9wdGlvbnMgfHwge30pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG91dCQuZG93bmxvYWQobmFtZSwgdXJpLCBkb3dubG9hZE9wdHMpO1xuICAgIH0pO1xuICB9O1xufSkoKTsiLCJleHBvcnQgY29uc3QgSUNEUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwiZXhwb3J0IGNvbnN0IElEUFMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImNvbnN0IHJuYUNvbG9yID0gJ3JnYigyNTUsMjMwLDE1MyknO1xuY29uc3QgaW52QWJhc2ljQ29sb3IgPSAncmdiKDI1NSwyMzAsMTUzKSc7XG5leHBvcnQgY29uc3QgYXhvbGFic01hcCA9IHtcbiAgICAnUk5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1JOQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQScsICdDJywgJ0cnLCAnVSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnRE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ROQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnZEEnLCAnZEMnLCAnZEcnLCAnZFQnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTk3LDIyNCwxODApJyxcbiAgICB9LFxuICAgICcyXFwnLUZsdW9ybyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLUZsdW9ybyBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQWYnLCAnQ2YnLCAnR2YnLCAnVWYnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNjgsMTE0LDE5NiknLFxuICAgIH0sXG4gICAgJzJcXCctTy1NZXRoeWwnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1ldGh5bCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnYScsICdjJywgJ2cnLCAndSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNjYsMTY2LDE2NiknLFxuICAgIH0sXG4gICAgJzJcXCctTy1NT0UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1PRSBudWNsZW90aWRlcyAoaW5jbHVkaW5nIDUtTWV0aHlsIEMpJyxcbiAgICAgICAgc3ltYm9sczogWydBbScsICdDbScsICdHbScsICdUbSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxMTIsNDgsMTYwKScsXG4gICAgfSxcbiAgICAnR05BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0dseWNvbCBudWNsZWljIGFjaWQnLFxuICAgICAgICBzeW1ib2xzOiBbJyhHTkEtQSknLCAnKEdOQS1DKScsICcoR05BLUcpJywgJyhHTkEtVCknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnTE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0xvY2tlZCBudWNsZWljIGFjaWQgKGluY2x1ZGluZyA1LU1ldGh5bCBDKScsXG4gICAgICAgIHN5bWJvbHM6IFsnQWInLCAnQ2InLCAnR2InLCAnVGInXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNTQsMjI5LDIzOCknLFxuICAgIH0sXG4gICAgJ1VOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdVbmxvY2tlZCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQW8nLCAnQ28nLCAnR28nLCAnVW8nXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdBZGVuaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydhJywgJ2EnLCAnYScsICdhJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdDJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0N5dG9zaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydjJywgJ2MnLCAnYycsICdjJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdHJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0d1YW5pbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2cnLCAnZycsICdnJywgJ2cnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ1UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnVXJhY2lsJyxcbiAgICAgICAgc3ltYm9sczogWyd1JywgJ3UnLCAndScsICd1J10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdYLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1gnLCAnWCcsICdYJywgJ1gnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTA4LDAsMCknLFxuICAgIH0sXG4gICAgJ1ktTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWScsICdZJywgJ1knLCAnWSddLFxuICAgICAgICBjb2xvcjogJ3JnYigyMTAsMTQ2LDE0NiknLFxuICAgIH0sXG4gICAgJ1otTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWicsICdaJywgJ1onLCAnWiddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNTUsMTA4LDEzMiknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkJyxcbiAgICAgICAgc3ltYm9sczogWycoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKSddLFxuICAgICAgICBjb2xvcjogaW52QWJhc2ljQ29sb3IsXG4gICAgfSxcbiAgICAnNVxcJy12aW55bHBzJzoge1xuICAgICAgICBmdWxsTmFtZTogJzVcXCctdmlueWxwaG9zcGhvbmF0ZS0yXFwnLU9NZS11cmlkaW5lJyxcbiAgICAgICAgc3ltYm9sczogWycodmludSknLCAnKHZpbnUpJywgJyh2aW51KScsICcodmludSknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMCwwLDEzOSknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyhvKSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJ10sXG4gICAgICAgIGNvbG9yOiBpbnZBYmFzaWNDb2xvcixcbiAgICB9LFxuICAgICcyXFwnLU9NZS1VKG8pJzoge1xuICAgICAgICBmdWxsTmFtZTogJ051Y2xlb3RpZGUgVXJpZGluZSB3aXRoIDLigJlPLU1ldGh5bCBwcm90ZWN0aW9uIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJ21VJywgJ21VJywgJ21VJywgJ21VJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDY1LDIzMyw4MCknLFxuICAgIH0sXG59O1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKiBEbyBub3QgY2hhbmdlIHRoZXNlIGltcG9ydCBsaW5lcy4gRGF0YWdyb2sgd2lsbCBpbXBvcnQgQVBJIGxpYnJhcnkgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBzdmcgZnJvbSAnc2F2ZS1zdmctYXMtcG5nJztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCB7IGRyYXdBeG9sYWJzUGF0dGVybiB9IGZyb20gJy4vZHJhd0F4b2xhYnNQYXR0ZXJuJztcbmltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2F4b2xhYnNNYXAnO1xuY29uc3QgYmFzZUNob2ljZXMgPSBPYmplY3Qua2V5cyhheG9sYWJzTWFwKTtcbmNvbnN0IGRlZmF1bHRCYXNlID0gYmFzZUNob2ljZXNbMF07XG5jb25zdCBkZWZhdWx0UHRvID0gdHJ1ZTtcbmNvbnN0IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCA9IDIzO1xuY29uc3QgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGggPSAzNTtcbmNvbnN0IHVzZXJTdG9yYWdlS2V5ID0gJ1NlcXVlbmNlVHJhbnNsYXRvcic7XG5jb25zdCBleGFtcGxlTWluV2lkdGggPSAnNDAwcHgnO1xuZnVuY3Rpb24gZ2VuZXJhdGVFeGFtcGxlKHNlcXVlbmNlTGVuZ3RoLCBzZXF1ZW5jZUJhc2lzKSB7XG4gICAgY29uc3QgdW5pcXVlU3ltYm9scyA9IGF4b2xhYnNNYXBbc2VxdWVuY2VCYXNpc10uc3ltYm9scy5qb2luKCcnKTtcbiAgICByZXR1cm4gdW5pcXVlU3ltYm9scy5yZXBlYXQoTWF0aC5mbG9vcihzZXF1ZW5jZUxlbmd0aCAvIDQpKSArIHVuaXF1ZVN5bWJvbHMuc2xpY2UoMCwgc2VxdWVuY2VMZW5ndGggJSA0KTtcbn1cbmZ1bmN0aW9uIGZpbmREdXBsaWNhdGVzKGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKS5maWx0ZXIoKHZhbHVlKSA9PiBkYXRhLmluZGV4T2YodmFsdWUpICE9PSBkYXRhLmxhc3RJbmRleE9mKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHBhdHRlcm5OYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIGdyb2suZGFwaS51c2Vycy5jdXJyZW50KCkudGhlbigodXNlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgbGFzdE5hbWVdID0gZ2V0VXNlck5hbWUocGF0dGVybk5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICh1c2VyLmZpcnN0TmFtZSAhPSBmaXJzdE5hbWUgfHwgdXNlci5sYXN0TmFtZSAhPSBsYXN0TmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0U2hvcnROYW1lKHBhdHRlcm5OYW1lKSB7XG4gICAgbGV0IGZpcnN0ID0gcGF0dGVybk5hbWUubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5OYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuTmFtZVtpXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuTmFtZS5zbGljZSgwLCBmaXJzdCAtIDEpO1xufVxuZnVuY3Rpb24gZ2V0VXNlck5hbWUocGF0dGVybk5hbWUpIHtcbiAgICBsZXQgZmlyc3QgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5OYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuTmFtZVtpXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoZmlyc3QgPT0gLTEpID8gWycnLCAnJ10gOiBwYXR0ZXJuTmFtZS5zbGljZShmaXJzdCArIDksIHBhdHRlcm5OYW1lLmxlbmd0aCAtIDEpLnNwbGl0KCcgJykuc2xpY2UoMSk7XG59XG5mdW5jdGlvbiB0cmFuc2xhdGVTZXF1ZW5jZShzZXF1ZW5jZSwgYmFzZXMsIHB0b0xpbmthZ2VzLCBzdGFydE1vZGlmaWNhdGlvbiwgZW5kTW9kaWZpY2F0aW9uLCBmaXJzdFB0b0V4aXN0KSB7XG4gICAgbGV0IGNvdW50ZXIgPSAtMTtcbiAgICBsZXQgbWFpblNlcXVlbmNlID0gc2VxdWVuY2UucmVwbGFjZSgvW0FVR0NdL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgY29uc3QgaW5kZXhPZlN5bWJvbCA9IGF4b2xhYnNNYXBbJ1JOQSddWydzeW1ib2xzJ10uaW5kZXhPZih4KTtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gYXhvbGFic01hcFtiYXNlc1tjb3VudGVyXS52YWx1ZV1bJ3N5bWJvbHMnXVtpbmRleE9mU3ltYm9sXTtcbiAgICAgICAgcmV0dXJuIChwdG9MaW5rYWdlc1tjb3VudGVyXS52YWx1ZSkgPyBzeW1ib2wgKyAncycgOiBzeW1ib2w7XG4gICAgfSk7XG4gICAgaWYgKG1haW5TZXF1ZW5jZS5zbGljZSgwLCA1KS5zcGxpdCgnbVUnKS5sZW5ndGggPT0gMylcbiAgICAgICAgbWFpblNlcXVlbmNlID0gJyh1dSknICsgbWFpblNlcXVlbmNlLnNsaWNlKDQpO1xuICAgIGlmIChtYWluU2VxdWVuY2Uuc2xpY2UobWFpblNlcXVlbmNlLmxlbmd0aCAtIDcpLnNwbGl0KCdtVScpLmxlbmd0aCA9PSAzKVxuICAgICAgICBtYWluU2VxdWVuY2UgPSBtYWluU2VxdWVuY2Uuc2xpY2UoMCwgbWFpblNlcXVlbmNlLmxlbmd0aCAtIDQpICsgJyh1dSknO1xuICAgIHJldHVybiBzdGFydE1vZGlmaWNhdGlvbi52YWx1ZSArIChmaXJzdFB0b0V4aXN0ID8gJ3MnIDogJycpICsgbWFpblNlcXVlbmNlICsgZW5kTW9kaWZpY2F0aW9uLnZhbHVlO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uV2l0aElkcyh0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIHBhdHRlcm5OYW1lKSB7XG4gICAgY29uc3QgbmFtZU9mTmV3Q29sdW1uID0gJ0lEICcgKyBwYXR0ZXJuTmFtZTtcbiAgICBjb25zdCBjb2x1bW5zID0gZ3Jvay5zaGVsbC50YWJsZSh0YWJsZU5hbWUpLmNvbHVtbnM7XG4gICAgaWYgKGNvbHVtbnMuY29udGFpbnMobmFtZU9mTmV3Q29sdW1uKSlcbiAgICAgICAgY29sdW1ucy5yZW1vdmUobmFtZU9mTmV3Q29sdW1uKTtcbiAgICBjb25zdCBjb2x1bW5XaXRoSWRzID0gY29sdW1ucy5ieU5hbWUoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGNvbHVtbnMuYWRkTmV3U3RyaW5nKG5hbWVPZk5ld0NvbHVtbikuaW5pdCgoaSkgPT4gY29sdW1uV2l0aElkcy5nZXQoaSkgKyAnXycgKyBwYXR0ZXJuTmFtZSk7XG59XG5mdW5jdGlvbiBhZGRDb2x1bW5XaXRoVHJhbnNsYXRlZFNlcXVlbmNlcyh0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGJhc2VzLCBwdG9MaW5rYWdlcywgc3RhcnRNb2RpZmljYXRpb24sIGVuZE1vZGlmaWNhdGlvbiwgZmlyc3RQdG9FeGlzdCkge1xuICAgIGNvbnN0IG5hbWVPZk5ld0NvbHVtbiA9ICdBeG9sYWJzICcgKyBjb2x1bW5OYW1lO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBncm9rLnNoZWxsLnRhYmxlKHRhYmxlTmFtZSkuY29sdW1ucztcbiAgICBpZiAoY29sdW1ucy5jb250YWlucyhuYW1lT2ZOZXdDb2x1bW4pKVxuICAgICAgICBjb2x1bW5zLnJlbW92ZShuYW1lT2ZOZXdDb2x1bW4pO1xuICAgIGNvbnN0IGNvbHVtbldpdGhJbnB1dFNlcXVlbmNlcyA9IGNvbHVtbnMuYnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBjb2x1bW5zLmFkZE5ld1N0cmluZyhuYW1lT2ZOZXdDb2x1bW4pLmluaXQoKGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVNlcXVlbmNlKGNvbHVtbldpdGhJbnB1dFNlcXVlbmNlcy5nZXRTdHJpbmcoaSksIGJhc2VzLCBwdG9MaW5rYWdlcywgc3RhcnRNb2RpZmljYXRpb24sIGVuZE1vZGlmaWNhdGlvbiwgZmlyc3RQdG9FeGlzdCk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXhvbGFic1BhdHRlcm4oKSB7XG4gICAgY29uc3QgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyA9IFtkZWZhdWx0QmFzZV07XG4gICAgbGV0IG1heGltYWxTc0xlbmd0aCA9IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aDtcbiAgICBsZXQgbWF4aW1hbEFzTGVuZ3RoID0gZGVmYXVsdFNlcXVlbmNlTGVuZ3RoO1xuICAgIGZ1bmN0aW9uIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCkge1xuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBhc1B0b0xpbmthZ2VzID0gYXNQdG9MaW5rYWdlcy5jb25jYXQoQXJyYXkobWF4aW1hbEFzTGVuZ3RoIC0gYXNCYXNlcy5sZW5ndGgpLmZpbGwoZnVsbHlQdG8pKTtcbiAgICAgICAgYXNCYXNlcyA9IGFzQmFzZXMuY29uY2F0KEFycmF5KG1heGltYWxBc0xlbmd0aCAtIGFzQmFzZXMubGVuZ3RoKS5maWxsKHNlcXVlbmNlQmFzZSkpO1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzTGVuZ3RoLnZhbHVlOyBpKyspIHtcbiAgICAgICAgICAgIGFzUHRvTGlua2FnZXNbaV0gPSB1aS5ib29sSW5wdXQoJycsIGFzUHRvTGlua2FnZXNbaV0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhc0Jhc2VzW2ldID0gdWkuY2hvaWNlSW5wdXQoJycsIGFzQmFzZXNbaV0udmFsdWUsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0Rpdi5hcHBlbmQodWkuYm9vbElucHV0KHYsIHRydWUsIChib29sVikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvb2xWKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZih2LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnJvb3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVBc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlcisrO1xuICAgICAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcy5hcHBlbmQodWkuZGl2SChbXG4gICAgICAgICAgICAgICAgdWkuZGl2KFt1aS5sYWJlbChhc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJyA/ICcnIDogU3RyaW5nKG51Y2xlb3RpZGVDb3VudGVyKSldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jazc1KFthc0Jhc2VzW2ldXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2KFthc1B0b0xpbmthZ2VzW2ldXSksXG4gICAgICAgICAgICBdLCB7IHN0eWxlOiB7IGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCkge1xuICAgICAgICBzc01vZGlmaWNhdGlvbkl0ZW1zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBzc1B0b0xpbmthZ2VzID0gc3NQdG9MaW5rYWdlcy5jb25jYXQoQXJyYXkobWF4aW1hbFNzTGVuZ3RoIC0gc3NCYXNlcy5sZW5ndGgpLmZpbGwoZnVsbHlQdG8pKTtcbiAgICAgICAgc3NCYXNlcyA9IHNzQmFzZXMuY29uY2F0KEFycmF5KG1heGltYWxTc0xlbmd0aCAtIHNzQmFzZXMubGVuZ3RoKS5maWxsKHNlcXVlbmNlQmFzZSkpO1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzTGVuZ3RoLnZhbHVlOyBpKyspIHtcbiAgICAgICAgICAgIHNzUHRvTGlua2FnZXNbaV0gPSB1aS5ib29sSW5wdXQoJycsIHNzUHRvTGlua2FnZXNbaV0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzc0Jhc2VzW2ldID0gdWkuY2hvaWNlSW5wdXQoJycsIHNzQmFzZXNbaV0udmFsdWUsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0Rpdi5hcHBlbmQodWkuYm9vbElucHV0KHYsIHRydWUsIChib29sVikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvb2xWKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZih2LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnJvb3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVTc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlcisrO1xuICAgICAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcy5hcHBlbmQodWkuZGl2SChbXG4gICAgICAgICAgICAgICAgdWkuZGl2KFt1aS5sYWJlbChzc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJyA/ICcnIDogU3RyaW5nKG51Y2xlb3RpZGVDb3VudGVyKSldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jazc1KFtzc0Jhc2VzW2ldXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2KFtzc1B0b0xpbmthZ2VzW2ldXSksXG4gICAgICAgICAgICBdLCB7IHN0eWxlOiB7IGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSB7XG4gICAgICAgIGlmIChzc0xlbmd0aC52YWx1ZSA8IG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoICYmIGFzTGVuZ3RoLnZhbHVlIDwgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzc0xlbmd0aC52YWx1ZSA+IG1heGltYWxTc0xlbmd0aClcbiAgICAgICAgICAgICAgICBtYXhpbWFsU3NMZW5ndGggPSBzc0xlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChhc0xlbmd0aC52YWx1ZSA+IG1heGltYWxBc0xlbmd0aClcbiAgICAgICAgICAgICAgICBtYXhpbWFsQXNMZW5ndGggPSBhc0xlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICB1cGRhdGVBc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICB1cGRhdGVJbnB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdWkuZGlhbG9nKCdTZXF1ZW5jZSBsZW5ndGggaXMgb3V0IG9mIHJhbmdlJylcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1NlcXVlbmNlIGxlbmd0aCBzaG91bGQgYmUgbGVzcyB0aGFuICcgK1xuICAgICAgICAgICAgICAgIG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoLnRvU3RyaW5nKCkgKyAnIGR1ZSB0byBVSSBjb25zdHJhaW5zLicpKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUGxlYXNlIGNoYW5nZSBzZXF1ZW5jZSBsZW5ndGggaW4gb3JkZXIgdG8gZGVmaW5lIG5ldyBwYXR0ZXJuLicpKVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlUHRvKG5ld1B0b1ZhbHVlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NQdG9MaW5rYWdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNzUHRvTGlua2FnZXNbaV0udmFsdWUgPSBuZXdQdG9WYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc1B0b0xpbmthZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgYXNQdG9MaW5rYWdlc1tpXS52YWx1ZSA9IG5ld1B0b1ZhbHVlO1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQmFzZXMobmV3QmFzaXNWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzc0Jhc2VzW2ldLnZhbHVlID0gbmV3QmFzaXNWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0Jhc2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgYXNCYXNlc1tpXS52YWx1ZSA9IG5ld0Jhc2lzVmFsdWU7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVJbnB1dEV4YW1wbGVzKCkge1xuICAgICAgICBzc0lucHV0RXhhbXBsZS52YWx1ZSA9IGdlbmVyYXRlRXhhbXBsZShzc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKTtcbiAgICAgICAgaWYgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKVxuICAgICAgICAgICAgYXNJbnB1dEV4YW1wbGUudmFsdWUgPSBnZW5lcmF0ZUV4YW1wbGUoYXNMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCkge1xuICAgICAgICBzc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICAgICAgaWYgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSB7XG4gICAgICAgICAgICBhc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShhc0lucHV0RXhhbXBsZS52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdEFzUHRvLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTdmdTY2hlbWUoKSB7XG4gICAgICAgIHN2Z0Rpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgc3ZnRGl2LmFwcGVuZCh1aS5zcGFuKFtcbiAgICAgICAgICAgIGRyYXdBeG9sYWJzUGF0dGVybihnZXRTaG9ydE5hbWUoc2F2ZUFzLnZhbHVlKSwgY3JlYXRlQXNTdHJhbmQudmFsdWUsIHNzQmFzZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksIGFzQmFzZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksIFtmaXJzdFNzUHRvLnZhbHVlXS5jb25jYXQoc3NQdG9MaW5rYWdlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksIFtmaXJzdEFzUHRvLnZhbHVlXS5jb25jYXQoYXNQdG9MaW5rYWdlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksIHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsIHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSwgYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSwgYXNGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLCBjb21tZW50LnZhbHVlLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSxcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXRlY3REZWZhdWx0QmFzaXMoYXJyYXkpIHtcbiAgICAgICAgY29uc3QgbW9kZU1hcCA9IHt9O1xuICAgICAgICBsZXQgbWF4RWwgPSBhcnJheVswXTtcbiAgICAgICAgbGV0IG1heENvdW50ID0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChtb2RlTWFwW2VsXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIG1vZGVNYXBbZWxdID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtb2RlTWFwW2VsXSsrO1xuICAgICAgICAgICAgaWYgKG1vZGVNYXBbZWxdID4gbWF4Q291bnQpIHtcbiAgICAgICAgICAgICAgICBtYXhFbCA9IGVsO1xuICAgICAgICAgICAgICAgIG1heENvdW50ID0gbW9kZU1hcFtlbF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heEVsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaShuZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBwaSA9IERHLlRhc2tCYXJQcm9ncmVzc0luZGljYXRvci5jcmVhdGUoJ0xvYWRpbmcgcGF0dGVybi4uLicpO1xuICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKS50aGVuKChlbnRpdGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZW50aXRpZXNbbmV3TmFtZV0pO1xuICAgICAgICAgICAgICAgIHNlcXVlbmNlQmFzZS52YWx1ZSA9IGRldGVjdERlZmF1bHRCYXNpcyhvYmpbJ2FzQmFzZXMnXS5jb25jYXQob2JqWydzc0Jhc2VzJ10pKTtcbiAgICAgICAgICAgICAgICBjcmVhdGVBc1N0cmFuZC52YWx1ZSA9IChvYmpbJ2FzQmFzZXMnXS5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgICAgICBzYXZlQXMudmFsdWUgPSBuZXdOYW1lO1xuICAgICAgICAgICAgICAgIHNzQmFzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ialsnc3NCYXNlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBzc0Jhc2VzLnB1c2godWkuY2hvaWNlSW5wdXQoJycsIG9ialsnc3NCYXNlcyddW2ldLCBiYXNlQ2hvaWNlcykpO1xuICAgICAgICAgICAgICAgIGFzQmFzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ialsnYXNCYXNlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBhc0Jhc2VzLnB1c2godWkuY2hvaWNlSW5wdXQoJycsIG9ialsnYXNCYXNlcyddW2ldLCBiYXNlQ2hvaWNlcykpO1xuICAgICAgICAgICAgICAgIGZpcnN0U3NQdG8udmFsdWUgPSBvYmpbJ3NzUHRvTGlua2FnZXMnXVswXTtcbiAgICAgICAgICAgICAgICBzc1B0b0xpbmthZ2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvYmpbJ3NzUHRvTGlua2FnZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc3NQdG9MaW5rYWdlcy5wdXNoKHVpLmJvb2xJbnB1dCgnJywgb2JqWydzc1B0b0xpbmthZ2VzJ11baV0pKTtcbiAgICAgICAgICAgICAgICBmaXJzdEFzUHRvLnZhbHVlID0gb2JqWydhc1B0b0xpbmthZ2VzJ11bMF07XG4gICAgICAgICAgICAgICAgYXNQdG9MaW5rYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2JqWydhc1B0b0xpbmthZ2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGFzUHRvTGlua2FnZXMucHVzaCh1aS5ib29sSW5wdXQoJycsIG9ialsnYXNQdG9MaW5rYWdlcyddW2ldKSk7XG4gICAgICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSBvYmpbJ3NzQmFzZXMnXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSBvYmpbJ2FzQmFzZXMnXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgc3NUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnc3NUaHJlZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnc3NGaXZlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnYXNUaHJlZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnYXNGaXZlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgY29tbWVudC52YWx1ZSA9IG9ialsnY29tbWVudCddO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwaS5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKTtcbiAgICAgICAgbGV0IGFsbExlbmd0aHNBcmVUaGVTYW1lID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb2wuZ2V0KGkgLSAxKS5sZW5ndGggIT0gY29sLmdldChpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYWxsTGVuZ3Roc0FyZVRoZVNhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnU2VxdWVuY2VzIGxlbmd0aHMgbWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdUaGUgc2VxdWVuY2UgbGVuZ3RoIHNob3VsZCBtYXRjaCB0aGUgbnVtYmVyIG9mIFJhdyBzZXF1ZW5jZXMgaW4gdGhlIGlucHV0IGZpbGUnKSlcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1xcJ0FERCBDT0xVTU5cXCcgdG8gc2VlIHNlcXVlbmNlcyBsZW5ndGhzJykpXG4gICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignQUREIENPTFVNTicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YWJsZXMudmFsdWUuY29sdW1ucy5hZGROZXdJbnQoJ1NlcXVlbmNlcyBsZW5ndGhzIGluICcgKyBjb2xOYW1lKS5pbml0KChqKSA9PiBjb2wuZ2V0KGopLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdDb2x1bW4gd2l0aCBsZW5ndGhzIGFkZGVkIHRvIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbExlbmd0aHNBcmVUaGVTYW1lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VXNlck5hbWUoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgZ3Jvay5kYXBpLnVzZXJzLmN1cnJlbnQoKS50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcgKGNyZWF0ZWQgYnkgJyArIHVzZXIuZmlyc3ROYW1lICsgJyAnICsgdXNlci5sYXN0TmFtZSArICcpJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aG9yID0geWllbGQgZ2V0Q3VycmVudFVzZXJOYW1lKCk7XG4gICAgICAgICAgICBpZiAoIXNhdmVBcy5zdHJpbmdWYWx1ZS5pbmNsdWRlcygnKGNyZWF0ZWQgYnkgJykpXG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gc2F2ZUFzLnN0cmluZ1ZhbHVlICsgYXV0aG9yO1xuICAgICAgICAgICAgcmV0dXJuIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucG9zdFZhbHVlKHVzZXJTdG9yYWdlS2V5LCBzYXZlQXMuc3RyaW5nVmFsdWUsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAnc3NCYXNlcyc6IHNzQmFzZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksXG4gICAgICAgICAgICAgICAgJ2FzQmFzZXMnOiBhc0Jhc2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICdzc1B0b0xpbmthZ2VzJzogW2ZpcnN0U3NQdG8udmFsdWVdLmNvbmNhdChzc1B0b0xpbmthZ2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAnYXNQdG9MaW5rYWdlcyc6IFtmaXJzdEFzUHRvLnZhbHVlXS5jb25jYXQoYXNQdG9MaW5rYWdlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksXG4gICAgICAgICAgICAgICAgJ3NzVGhyZWVNb2RpZmljYXRpb24nOiBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdzc0ZpdmVNb2RpZmljYXRpb24nOiBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2FzVGhyZWVNb2RpZmljYXRpb24nOiBhc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdhc0ZpdmVNb2RpZmljYXRpb24nOiBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2NvbW1lbnQnOiBjb21tZW50LnZhbHVlLFxuICAgICAgICAgICAgfSksIGZhbHNlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgc2F2ZUFzLnZhbHVlICsgJ1xcJyB3YXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIScpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBhdHRlcm5zTGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSkudGhlbigoZW50aXRpZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsc3RNeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxzdE90aGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZW50IG9mIE9iamVjdC5rZXlzKGVudGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbHN0T3RoZXJzLnB1c2goZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbHN0TXkucHVzaChnZXRTaG9ydE5hbWUoZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBsb2FkUGF0dGVybiA9IHVpLmNob2ljZUlucHV0KCdMb2FkIFBhdHRlcm4nLCAnJywgbHN0TXksICh2KSA9PiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaSh2KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlPck90aGVyc1BhdHRlcm5MaXN0ID0gdWkuY2hvaWNlSW5wdXQoJycsICdNaW5lJywgWydNaW5lJywgJ090aGVycyddLCAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IHYgPT0gJ01pbmUnID8gbHN0TXkgOiBsc3RPdGhlcnM7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuID0gdWkuY2hvaWNlSW5wdXQoJ0xvYWQgUGF0dGVybicsICcnLCBjdXJyZW50TGlzdCwgKHYpID0+IHBhcnNlUGF0dGVybkFuZFVwZGF0ZVVpKHYpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobXlPck90aGVyc1BhdHRlcm5MaXN0LmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobG9hZFBhdHRlcm4uaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLmlucHV0LnN0eWxlLm1heFdpZHRoID0gJzEwMHB4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uc2V0VG9vbHRpcCgnQXBwbHkgRXhpc3RpbmcgUGF0dGVybicpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuYXBwZW5kKGxvYWRQYXR0ZXJuLnJvb3QpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgndHJhc2gtYWx0JywgKCkgPT4geyB9KSwgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGF0dGVybi52YWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nob29zZSBwYXR0ZXJuIHRvIGRlbGV0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oc2F2ZUFzLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDYW5ub3QgZGVsZXRlIHBhdHRlcm4sIGNyZWF0ZWQgYnkgb3RoZXIgdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgbG9hZFBhdHRlcm4udmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBsb2FkUGF0dGVybi52YWx1ZSArICdcXCcgZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKG15T3JPdGhlcnNQYXR0ZXJuTGlzdC5pbnB1dCk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobG9hZFBhdHRlcm4uaW5wdXQpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5pbnB1dC5zdHlsZS5tYXhXaWR0aCA9ICcxMDBweCc7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uc2V0VG9vbHRpcCgnQXBwbHkgRXhpc3RpbmcgUGF0dGVybicpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmFwcGVuZChsb2FkUGF0dGVybi5yb290KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCd0cmFzaC1hbHQnLCAoKSA9PiB7IH0pLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhdHRlcm4udmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nob29zZSBwYXR0ZXJuIHRvIGRlbGV0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihzYXZlQXMudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2Fubm90IGRlbGV0ZSBwYXR0ZXJuLCBjcmVhdGVkIGJ5IG90aGVyIHVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBsb2FkUGF0dGVybi52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgbG9hZFBhdHRlcm4udmFsdWUgKyAnXFwnIGRlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2F2ZVBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLmdldCh1c2VyU3RvcmFnZUtleSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGVudGl0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGVudGl0aWVzKS5pbmNsdWRlcyhzYXZlQXMudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnUGF0dGVybiBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1BhdHRlcm4gbmFtZSBcXCcnICsgc2F2ZUFzLnZhbHVlICsgJ1xcJyBhbHJlYWR5IGV4aXN0cy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUmVwbGFjZSBwYXR0ZXJuPycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignWUVTJywgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIHNhdmVBcy52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFNzQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpbnB1dEFzQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpbnB1dElkQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBzc01vZGlmaWNhdGlvbkl0ZW1zID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvbkl0ZW1zID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBzdmdEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzRXhhbXBsZURpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXBwQXhvbGFic0Rlc2NyaXB0aW9uID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBsb2FkUGF0dGVybkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGZpcnN0QXNQdG9EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0RpdiA9IHVpLmRpdkgoW3VpLmJvb2xJbnB1dChkZWZhdWx0QmFzZSwgdHJ1ZSwgKHYpID0+IHtcbiAgICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKGRlZmF1bHRCYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKGRlZmF1bHRCYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmRleE9mKGRlZmF1bHRCYXNlLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICB9KS5yb290XSk7XG4gICAgbGV0IHNzQmFzZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuY2hvaWNlSW5wdXQoJycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcykpO1xuICAgIGxldCBhc0Jhc2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmNob2ljZUlucHV0KCcnLCBkZWZhdWx0QmFzZSwgYmFzZUNob2ljZXMpKTtcbiAgICBsZXQgc3NQdG9MaW5rYWdlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5ib29sSW5wdXQoJycsIGRlZmF1bHRQdG8pKTtcbiAgICBsZXQgYXNQdG9MaW5rYWdlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5ib29sSW5wdXQoJycsIGRlZmF1bHRQdG8pKTtcbiAgICBjb25zdCBzc0xlbmd0aCA9IHVpLmludElucHV0KCdTUyBMZW5ndGgnLCBkZWZhdWx0U2VxdWVuY2VMZW5ndGgsICgpID0+IHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSk7XG4gICAgY29uc3QgYXNMZW5ndGggPSB1aS5pbnRJbnB1dCgnQVMgTGVuZ3RoJywgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoLCAoKSA9PiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkpO1xuICAgIGNvbnN0IGFzTGVuZ3RoRGl2ID0gdWkuZGl2KFthc0xlbmd0aC5yb290XSk7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGFsbExlbmd0aHNBcmVUaGVTYW1lID0gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKTtcbiAgICAgICAgY29uc3QgZmlyc3RTZXF1ZW5jZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKS5nZXQoMCk7XG4gICAgICAgIGlmIChhbGxMZW5ndGhzQXJlVGhlU2FtZSAmJiBmaXJzdFNlcXVlbmNlLmxlbmd0aCAhPSBzc0xlbmd0aC52YWx1ZSlcbiAgICAgICAgICAgIHNzTGVuZ3RoLnZhbHVlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKS5sZW5ndGg7XG4gICAgICAgIHNzSW5wdXRFeGFtcGxlLnZhbHVlID0gZmlyc3RTZXF1ZW5jZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVBc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGFsbExlbmd0aHNBcmVUaGVTYW1lID0gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKTtcbiAgICAgICAgY29uc3QgZmlyc3RTZXF1ZW5jZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKS5nZXQoMCk7XG4gICAgICAgIGlmIChhbGxMZW5ndGhzQXJlVGhlU2FtZSAmJiBmaXJzdFNlcXVlbmNlLmxlbmd0aCAhPSBhc0xlbmd0aC52YWx1ZSlcbiAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKS5sZW5ndGg7XG4gICAgICAgIGFzTGVuZ3RoRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBhc0xlbmd0aERpdi5hcHBlbmQoYXNMZW5ndGgucm9vdCk7XG4gICAgICAgIGFzSW5wdXRFeGFtcGxlLnZhbHVlID0gZmlyc3RTZXF1ZW5jZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVJZHNDb2x1bW4oY29sTmFtZSkge1xuICAgICAgICBjb25zdCBjb2wgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSk7XG4gICAgICAgIGlmIChjb2wudHlwZSAhPSBERy5UWVBFLklOVClcbiAgICAgICAgICAgIGdyb2suc2hlbGwuZXJyb3IoJ0NvbHVtbiBzaG91bGQgY29udGFpbiBpbnRlZ2VycyBvbmx5Jyk7XG4gICAgICAgIGVsc2UgaWYgKGNvbC5jYXRlZ29yaWVzLmxlbmd0aCA8IGNvbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBmaW5kRHVwbGljYXRlcyhjb2wuZ2V0UmF3RGF0YSgpKTtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnTm9uLXVuaXF1ZSBJRHMnKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUHJlc3MgXFwnT0tcXCcgdG8gc2VsZWN0IHJvd3Mgd2l0aCBub24tdW5pcXVlIHZhbHVlcycpKVxuICAgICAgICAgICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0YWJsZXMudmFsdWUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbml0KChpKSA9PiBkdXBsaWNhdGVzLmluZGV4T2YoY29sLmdldChpKSkgPiAtMSk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUm93cyBhcmUgc2VsZWN0ZWQgaW4gdGFibGUgXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlcyA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlcycsIGdyb2suc2hlbGwudGFibGVzWzBdLCBncm9rLnNoZWxsLnRhYmxlcywgKHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpKTtcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRTc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRBc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdBUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpKTtcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRBc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRJZENvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdJRCBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKSk7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuYXBwZW5kKGlucHV0SWRDb2x1bW4ucm9vdCk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgW10pO1xuICAgIGlucHV0U3NDb2x1bW5EaXYuYXBwZW5kKGlucHV0U3NDb2x1bW4ucm9vdCk7XG4gICAgY29uc3QgaW5wdXRBc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdBUyBDb2x1bW4nLCAnJywgW10pO1xuICAgIGlucHV0QXNDb2x1bW5EaXYuYXBwZW5kKGlucHV0QXNDb2x1bW4ucm9vdCk7XG4gICAgY29uc3QgaW5wdXRJZENvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdJRCBDb2x1bW4nLCAnJywgW10pO1xuICAgIGlucHV0SWRDb2x1bW5EaXYuYXBwZW5kKGlucHV0SWRDb2x1bW4ucm9vdCk7XG4gICAgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgY29uc3Qgc2VxdWVuY2VCYXNlID0gdWkuY2hvaWNlSW5wdXQoJ1NlcXVlbmNlIEJhc2lzJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICB1cGRhdGVCYXNlcyh2KTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBmdWxseVB0byA9IHVpLmJvb2xJbnB1dCgnRnVsbHkgUFRPJywgZGVmYXVsdFB0bywgKHYpID0+IHtcbiAgICAgICAgZmlyc3RTc1B0by52YWx1ZSA9IHY7XG4gICAgICAgIGZpcnN0QXNQdG8udmFsdWUgPSB2O1xuICAgICAgICB1cGRhdGVQdG8odik7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZmlyc3RTc1B0byA9IHVpLmJvb2xJbnB1dCgnRmlyc3QgU1MgUFRPJywgZnVsbHlQdG8udmFsdWUsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBjb25zdCBmaXJzdEFzUHRvID0gdWkuYm9vbElucHV0KCdGaXJzdCBBUyBQVE8nLCBmdWxseVB0by52YWx1ZSwgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIGZpcnN0QXNQdG9EaXYuYXBwZW5kKGZpcnN0QXNQdG8ucm9vdCk7XG4gICAgY29uc3QgY3JlYXRlQXNTdHJhbmQgPSB1aS5ib29sSW5wdXQoJ0NyZWF0ZSBBUyBTdHJhbmQnLCB0cnVlLCAodikgPT4ge1xuICAgICAgICBhc01vZGlmaWNhdGlvblNlY3Rpb24uaGlkZGVuID0gKCF2KTtcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBhc0xlbmd0aERpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBhc01vZGlmaWNhdGlvbkRpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBhc0V4YW1wbGVEaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgZmlyc3RBc1B0b0Rpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICB9KTtcbiAgICBjb25zdCBzYXZlQXMgPSB1aS50ZXh0SW5wdXQoJ1NhdmUgQXMnLCAnUGF0dGVybiBOYW1lJywgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIHNhdmVBcy5zZXRUb29sdGlwKCdOYW1lIE9mIE5ldyBQYXR0ZXJuJyk7XG4gICAgY29uc3Qgc3NUaHJlZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdTUyAzXFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIHNzVGhyZWVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBTUyAzXFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IHNzRml2ZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdTUyA1XFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIHNzRml2ZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIFNTIDVcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgY29uc3QgYXNUaHJlZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdBUyAzXFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGFzVGhyZWVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBBUyAzXFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IGFzRml2ZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdBUyA1XFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGFzRml2ZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIEFTIDVcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgYXNNb2RpZmljYXRpb25EaXYuYXBwZW5kKGFzVGhyZWVNb2RpZmljYXRpb24ucm9vdCk7XG4gICAgYXNNb2RpZmljYXRpb25EaXYuYXBwZW5kKGFzRml2ZU1vZGlmaWNhdGlvbi5yb290KTtcbiAgICBjb25zdCBjb21tZW50ID0gdWkudGV4dElucHV0KCdDb21tZW50JywgJycsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBjb25zdCBzYXZlUGF0dGVybkJ1dHRvbiA9IHVpLmJ1dHRvbignU2F2ZScsICgpID0+IHtcbiAgICAgICAgaWYgKHNhdmVBcy52YWx1ZSAhPSAnJylcbiAgICAgICAgICAgIHNhdmVQYXR0ZXJuKCkudGhlbigocikgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIHNhdmVkJykpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB1aS5zdHJpbmdJbnB1dCgnRW50ZXIgTmFtZScsICcnKTtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnUGF0dGVybiBOYW1lJylcbiAgICAgICAgICAgICAgICAuYWRkKG5hbWUucm9vdClcbiAgICAgICAgICAgICAgICAub25PSygoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gbmFtZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBzYXZlUGF0dGVybigpLnRoZW4oKHIpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBzYXZlZCcpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnZlcnRTZXF1ZW5jZUJ1dHRvbiA9IHVpLmJ1dHRvbignQ29udmVydCBTZXF1ZW5jZXMnLCAoKSA9PiB7XG4gICAgICAgIGlmIChpbnB1dFNzQ29sdW1uLnZhbHVlID09IG51bGwgfHwgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlICYmIGlucHV0QXNDb2x1bW4udmFsdWUgPT0gbnVsbCkpXG4gICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oJ1BsZWFzZSBzZWxlY3QgdGFibGUgYW5kIGNvbHVtbnMgb24gd2hpY2ggdG8gYXBwbHkgcGF0dGVybicpO1xuICAgICAgICBlbHNlIGlmIChzc0xlbmd0aC52YWx1ZSAhPSBzc0lucHV0RXhhbXBsZS52YWx1ZS5sZW5ndGggfHwgYXNMZW5ndGgudmFsdWUgIT0gYXNJbnB1dEV4YW1wbGUudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coJ0xlbmd0aCBNaXNtYXRjaCcpO1xuICAgICAgICAgICAgJChkaWFsb2cuZ2V0QnV0dG9uKCdPSycpKS5oaWRlKCk7XG4gICAgICAgICAgICBkaWFsb2dcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ0xlbmd0aCBvZiBzZXF1ZW5jZXMgaW4gY29sdW1ucyBkb2VzblxcJ3QgbWF0Y2ggZW50ZXJlZCBsZW5ndGguIFVwZGF0ZSBsZW5ndGggdmFsdWU/JykpXG4gICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignWUVTJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnZhbHVlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGlucHV0U3NDb2x1bW4udmFsdWUpLmdldFN0cmluZygwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoaW5wdXRBc0NvbHVtbi52YWx1ZSkuZ2V0U3RyaW5nKDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbnB1dElkQ29sdW1uLnZhbHVlICE9IG51bGwpXG4gICAgICAgICAgICAgICAgYWRkQ29sdW1uV2l0aElkcyh0YWJsZXMudmFsdWUubmFtZSwgaW5wdXRJZENvbHVtbi52YWx1ZSwgZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSkpO1xuICAgICAgICAgICAgYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVzLnZhbHVlLm5hbWUsIGlucHV0U3NDb2x1bW4udmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoY3JlYXRlQXNTdHJhbmQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRDb2x1bW5XaXRoVHJhbnNsYXRlZFNlcXVlbmNlcyh0YWJsZXMudmFsdWUubmFtZSwgaW5wdXRBc0NvbHVtbi52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdEFzUHRvLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb2suc2hlbGwudiA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlcy52YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygoKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSA/ICdDb2x1bW5zIHdlcmUnIDogJ0NvbHVtbiB3YXMnKSArXG4gICAgICAgICAgICAgICAgJyBhZGRlZCB0byB0YWJsZSBcXCcnICsgdGFibGVzLnZhbHVlLm5hbWUgKyAnXFwnJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzc0lucHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnU2Vuc2UgU3RyYW5kJywgZ2VuZXJhdGVFeGFtcGxlKHNzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpLCAoKSA9PiB7XG4gICAgICAgIHNzT3V0cHV0RXhhbXBsZS52YWx1ZSA9IHRyYW5zbGF0ZVNlcXVlbmNlKHNzSW5wdXRFeGFtcGxlLnZhbHVlLCBzc0Jhc2VzLCBzc1B0b0xpbmthZ2VzLCBzc0ZpdmVNb2RpZmljYXRpb24sIHNzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNzT3V0cHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnICcsIHRyYW5zbGF0ZVNlcXVlbmNlKHNzSW5wdXRFeGFtcGxlLnZhbHVlLCBzc0Jhc2VzLCBzc1B0b0xpbmthZ2VzLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBzc0ZpdmVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpKTtcbiAgICBzc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgc3NJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5kaXNhYmxlZCA9ICd0cnVlJztcbiAgICBzc091dHB1dEV4YW1wbGUucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgnY29weScsICgpID0+IHsgfSksICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNzT3V0cHV0RXhhbXBsZS52YWx1ZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1NlcXVlbmNlIHdhcyBjb3BpZWQgdG8gY2xpcGJvYXJkJykpO1xuICAgICAgICB9KSxcbiAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICBjb25zdCBhc0lucHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnQW50aXNlbnNlIFN0cmFuZCcsIGdlbmVyYXRlRXhhbXBsZShhc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKSwgKCkgPT4ge1xuICAgICAgICBhc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShhc0lucHV0RXhhbXBsZS52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBhc091dHB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJyAnLCB0cmFuc2xhdGVTZXF1ZW5jZShhc0lucHV0RXhhbXBsZS52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKSk7XG4gICAgYXNJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIGFzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuZGlzYWJsZWQgPSAndHJ1ZSc7XG4gICAgYXNPdXRwdXRFeGFtcGxlLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ2NvcHknLCAoKSA9PiB7IH0pLCAoKSA9PiB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChhc091dHB1dEV4YW1wbGUudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdTZXF1ZW5jZSB3YXMgY29waWVkIHRvIGNsaXBib2FyZCcpKTtcbiAgICAgICAgfSksXG4gICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgYXNFeGFtcGxlRGl2LmFwcGVuZChhc0lucHV0RXhhbXBsZS5yb290KTtcbiAgICBhc0V4YW1wbGVEaXYuYXBwZW5kKGFzT3V0cHV0RXhhbXBsZS5yb290KTtcbiAgICB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCk7XG4gICAgY29uc3QgZXhhbXBsZVNlY3Rpb24gPSB1aS5kaXYoW1xuICAgICAgICB1aS5oMSgnRXhhbXBsZScpLFxuICAgICAgICBzc0lucHV0RXhhbXBsZS5yb290LFxuICAgICAgICBzc091dHB1dEV4YW1wbGUucm9vdCxcbiAgICAgICAgYXNFeGFtcGxlRGl2LFxuICAgIF0sICd1aS1mb3JtJyk7XG4gICAgY29uc3QgaW5wdXRzU2VjdGlvbiA9IHVpLmRpdihbXG4gICAgICAgIHVpLmgxKCdJbnB1dHMnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICB0YWJsZXMucm9vdCxcbiAgICAgICAgICAgIGlucHV0U3NDb2x1bW5EaXYsXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIGlucHV0QXNDb2x1bW5EaXYsXG4gICAgICAgICAgICBpbnB1dElkQ29sdW1uRGl2LFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtcbiAgICAgICAgICAgIGNvbnZlcnRTZXF1ZW5jZUJ1dHRvbixcbiAgICAgICAgXSksXG4gICAgXSwgJ3VpLWZvcm0nKTtcbiAgICBjb25zdCBtYWluU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuYmxvY2soW1xuICAgICAgICAgICAgc3ZnRGl2LFxuICAgICAgICBdLCB7IHN0eWxlOiB7IG92ZXJmbG93WDogJ3Njcm9sbCcgfSB9KSxcbiAgICAgICAgdWkuYnV0dG9uKCdEb3dubG9hZCcsICgpID0+IHN2Zy5zYXZlU3ZnQXNQbmcoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215U3ZnJyksIHNhdmVBcy52YWx1ZSkpLFxuICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYsXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgICAgICB1aS5oMSgnUGF0dGVybicpLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuaWNvbkZBKCdxdWVzdGlvbi1jaXJjbGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQXhvbGFic0Rlc2NyaXB0aW9uLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbi5hcHBlbmQoaW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBwYWRkaW5nOiAnMnB4JyB9IH0pLFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgc3NMZW5ndGgucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzTGVuZ3RoRGl2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VCYXNlLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBcy5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlUGF0dGVybkJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXNTdHJhbmQucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UHRvLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNzUHRvLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFzUHRvRGl2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3NGaXZlTW9kaWZpY2F0aW9uLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBzc1RocmVlTW9kaWZpY2F0aW9uLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc01vZGlmaWNhdGlvbkRpdixcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIGlucHV0c1NlY3Rpb24sXG4gICAgICAgICAgICBleGFtcGxlU2VjdGlvbixcbiAgICAgICAgXSwgeyBzdHlsZTogeyBmbGV4V3JhcDogJ3dyYXAnIH0gfSksXG4gICAgXSk7XG4gICAgY29uc3Qgc3NNb2RpZmljYXRpb25TZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5oMSgnU2Vuc2UgU3RyYW5kJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCcjJyldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgIHVpLmJsb2NrNzUoW3VpLmRpdlRleHQoJ01vZGlmaWNhdGlvbicpXSksXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJ1BUTycpXSwgeyBzdHlsZTogeyBwYWRkaW5nUmlnaHQ6ICc4cHgnIH0gfSksXG4gICAgICAgIF0pLFxuICAgICAgICBzc01vZGlmaWNhdGlvbkl0ZW1zLFxuICAgIF0pO1xuICAgIGNvbnN0IGFzTW9kaWZpY2F0aW9uU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuaDEoJ0FudGlzZW5zZSBTdHJhbmQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJyMnKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgdWkuYmxvY2s3NShbdWkuZGl2VGV4dCgnTW9kaWZpY2F0aW9uJyldKSxcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnUFRPJyldLCB7IHN0eWxlOiB7IHBhZGRpbmdSaWdodDogJzhweCcgfSB9KSxcbiAgICAgICAgXSksXG4gICAgICAgIGFzTW9kaWZpY2F0aW9uSXRlbXMsXG4gICAgXSk7XG4gICAgY29uc3QgaW5mbyA9IHVpLmluZm8oW1xuICAgICAgICB1aS5kaXZUZXh0KCdcXG4gSG93IHRvIGRlZmluZSBuZXcgcGF0dGVybjonLCB7IHN0eWxlOiB7ICdmb250LXdlaWdodCc6ICdib2xkZXInIH0gfSksXG4gICAgICAgIHVpLmRpdlRleHQoJzEuIENob29zZSB0YWJsZSBhbmQgY29sdW1ucyB3aXRoIHNlbnNlIGFuZCBhbnRpc2Vuc2Ugc3RyYW5kcycpLFxuICAgICAgICB1aS5kaXZUZXh0KCcyLiBDaG9vc2UgbGVuZ3RocyBvZiBib3RoIHN0cmFuZHMgYnkgZWRpdGluZyBjaGVja2JveGVzIGJlbG93JyksXG4gICAgICAgIHVpLmRpdlRleHQoJzMuIENob29zZSBiYXNpcyBhbmQgUFRPIHN0YXR1cyBmb3IgZWFjaCBudWNsZW90aWRlJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzQuIFNldCBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgZm9yIHNlcXVlbmNlIGVkZ2VzJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzUuIFByZXNzIFxcJ0NvbnZlcnQgU2VxdWVuY2VzXFwnIGJ1dHRvbicpLFxuICAgICAgICB1aS5kaXZUZXh0KCdUaGlzIHdpbGwgYWRkIHRoZSByZXN1bHQgY29sdW1uKHMpIHRvIHRoZSByaWdodCBvZiB0aGUgdGFibGUnKSxcbiAgICBdLCAnQ3JlYXRlIGFuZCBhcHBseSBBeG9sYWJzIHRyYW5zbGF0aW9uIHBhdHRlcm5zLicpO1xuICAgIHJldHVybiB1aS5zcGxpdEgoW1xuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgYXBwQXhvbGFic0Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbWFpblNlY3Rpb24sXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5ib3godWkuZGl2SChbXG4gICAgICAgICAgICBzc01vZGlmaWNhdGlvblNlY3Rpb24sXG4gICAgICAgICAgICBhc01vZGlmaWNhdGlvblNlY3Rpb24sXG4gICAgICAgIF0pLCB7IHN0eWxlOiB7IG1heFdpZHRoOiAnMzYwcHgnIH0gfSksXG4gICAgXSk7XG59XG4iLCJpbXBvcnQgeyBheG9sYWJzTWFwIH0gZnJvbSAnLi9heG9sYWJzTWFwJztcbi8vIGh0dHBzOi8vdXhkZXNpZ24uY2Mvc3Rhci1yYXRpbmctbWFrZS1zdmctZ3JlYXQtYWdhaW4tZDRjZTQ3MzEzNDdlXG5mdW5jdGlvbiBnZXRQb2ludHNUb0RyYXdTdGFyKGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICBjb25zdCBpbm5lckNpcmNsZVBvaW50cyA9IDU7IC8vIGEgNSBwb2ludCBzdGFyXG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSAxNSAvIGlubmVyQ2lyY2xlUG9pbnRzO1xuICAgIGNvbnN0IGlubmVyT3V0ZXJSYWRpdXNSYXRpbyA9IDI7IC8vIG91dHRlciBjaXJjbGUgaXMgeDIgdGhlIGlubmVyXG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBpbm5lclJhZGl1cyAqIGlubmVyT3V0ZXJSYWRpdXNSYXRpbztcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEkgLyBpbm5lckNpcmNsZVBvaW50cztcbiAgICBjb25zdCBhbmdsZU9mZnNldFRvQ2VudGVyU3RhciA9IDYwO1xuICAgIGNvbnN0IHRvdGFsTnVtYmVyT2ZQb2ludHMgPSBpbm5lckNpcmNsZVBvaW50cyAqIDI7IC8vIDEwIGluIGEgNS1wb2ludHMgc3RhclxuICAgIGxldCBwb2ludHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsTnVtYmVyT2ZQb2ludHM7IGkrKykge1xuICAgICAgICBjb25zdCByID0gKGkgJSAyID09IDApID8gb3V0ZXJSYWRpdXMgOiBpbm5lclJhZGl1cztcbiAgICAgICAgY29uc3QgY3VycmVudFggPSBjZW50ZXJYICsgTWF0aC5jb3MoaSAqIGFuZ2xlICsgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIpICogcjtcbiAgICAgICAgY29uc3QgY3VycmVudFkgPSBjZW50ZXJZICsgTWF0aC5zaW4oaSAqIGFuZ2xlICsgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIpICogcjtcbiAgICAgICAgcG9pbnRzICs9IGN1cnJlbnRYICsgJywnICsgY3VycmVudFkgKyAnICc7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG59XG5mdW5jdGlvbiBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKG1vZGlmaWNhdGlvbnMpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBtb2RpZmljYXRpb25zLmxlbmd0aCAmJiBtb2RpZmljYXRpb25zW2ldLnNsaWNlKC0zKSA9PSAnKG8pJylcbiAgICAgICAgaSsrO1xuICAgIHJldHVybiAoaSA9PSBtb2RpZmljYXRpb25zLmxlbmd0aCAtIDEpID8gMCA6IGk7XG59XG5mdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb250ZXh0LmZvbnQgPSBTdHJpbmcoZm9udCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAyICogY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcbn1cbmZ1bmN0aW9uIGdldFRleHRJbnNpZGVDaXJjbGUoYmFzZXMsIGluZGV4LCBudWNsZW90aWRlQ291bnRlciwgbnVtYmVyT2ZOdWNsZW90aWRlcywgZW51bWVyYXRlTW9kaWZpY2F0aW9ucykge1xuICAgIHJldHVybiAoYmFzZXNbaW5kZXhdLnNsaWNlKC0zKSA9PSAnKG8pJykgfHwgIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXMoYmFzZXNbaW5kZXhdKSA/ICcnIDpcbiAgICAgICAgWydBJywgJ0cnLCAnQycsICdVJywgJ1QnXS5pbmNsdWRlcyhiYXNlc1tpbmRleF0pID8gYmFzZXNbaW5kZXhdIDogU3RyaW5nKG51bWJlck9mTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlcik7XG59XG5mdW5jdGlvbiBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKHJnYlN0cmluZykge1xuICAgIGNvbnN0IHJnYkludExpc3QgPSByZ2JTdHJpbmcubWF0Y2goL1xcZCsvZykubWFwKChlKSA9PiBOdW1iZXIoZSkpO1xuICAgIHJldHVybiAocmdiSW50TGlzdFswXSAqIDAuMjk5ICsgcmdiSW50TGlzdFsxXSAqIDAuNTg3ICsgcmdiSW50TGlzdFsyXSAqIDAuMTE0KSA+IDE4NiA/ICcjMzMzMzMnIDogJyNmZmZmZmYnO1xufVxuZnVuY3Rpb24gZ2V0QmFzZUNvbG9yKGJhc2UpIHtcbiAgICByZXR1cm4gYXhvbGFic01hcFtiYXNlXVsnY29sb3InXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QXhvbGFic1BhdHRlcm4ocGF0dGVybk5hbWUsIGFzRXhpc3RzLCBzc0Jhc2VzLCBhc0Jhc2VzLCBzc1B0b1N0YXR1c2VzLCBhc1B0b1N0YXR1c2VzLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBzc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGFzRml2ZU1vZGlmaWNhdGlvbiwgY29tbWVudCwgZW51bWVyYXRlTW9kaWZpY2F0aW9ucykge1xuICAgIGZ1bmN0aW9uIGdldEVxdWlkaXN0YW50WEZvckxlZ2VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoaW5kZXggKyBzdGFydEZyb20pICogd2lkdGggLyAodW5pcXVlQmFzZXMubGVuZ3RoICsgc3RhcnRGcm9tKSArIGxlZ2VuZFJhZGl1cyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFhPZkJhc2VDaXJjbGVzKGluZGV4LCByaWdodE92ZXJoYW5ncykge1xuICAgICAgICByZXR1cm4gd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uICtcbiAgICAgICAgICAgIChyZXN1bHRpbmdOdW1iZXJPZk51Y2xlb3RpZGVzSW5TdHJhbmRzIC0gaW5kZXggKyByaWdodE92ZXJoYW5ncyArIDEpICogYmFzZURpYW1ldGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoYmFzZXMsIGdlbmVyYWxJbmRleCwgbnVjbGVvdGlkZUluZGV4KSB7XG4gICAgICAgIHJldHVybiAobnVjbGVvdGlkZUluZGV4IDwgMTAgfHwgWydBJywgJ0cnLCAnQycsICdVJywgJ1QnXS5cbiAgICAgICAgICAgIGluY2x1ZGVzKGJhc2VzW2dlbmVyYWxJbmRleF0pKSA/IHNoaWZ0VG9BbGlnbk9uZURpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlIDogc2hpZnRUb0FsaWduVHdvRGlnaXROdW1iZXJJbnNpZGVDaXJjbGU7XG4gICAgfVxuICAgIGNvbnN0IHN2ZyA9IHtcbiAgICAgICAgeG1sbnM6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3N2ZycpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ215U3ZnJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBTdHJpbmcod2lkdGgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBTdHJpbmcoaGVpZ2h0KSk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2lyY2xlOiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCBjb2xvcikge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY3gnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2N5JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdyJywgU3RyaW5nKHJhZGl1cykpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dDogZnVuY3Rpb24gKHRleHQsIHgsIHksIGZvbnRTaXplLCBjb2xvcikge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAndGV4dCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoeSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc2l6ZScsIFN0cmluZyhmb250U2l6ZSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtd2VpZ2h0JywgJ25vcm1hbCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtZmFtaWx5JywgJ0FyaWFsJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgICAgIGUuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICBzdGFyOiBmdW5jdGlvbiAoeCwgeSwgZmlsbCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAncG9seWdvbicpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGdldFBvaW50c1RvRHJhd1N0YXIoeCwgeSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBmaWxsKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgc3NCYXNlcyA9IHNzQmFzZXMucmV2ZXJzZSgpO1xuICAgIHNzUHRvU3RhdHVzZXMgPSBzc1B0b1N0YXR1c2VzLnJldmVyc2UoKTtcbiAgICBjb25zdCBiYXNlUmFkaXVzID0gMTU7XG4gICAgY29uc3Qgc2hpZnRUb0FsaWduVHdvRGlnaXROdW1iZXJJbnNpZGVDaXJjbGUgPSAtMTA7XG4gICAgY29uc3Qgc2hpZnRUb0FsaWduT25lRGlnaXROdW1iZXJJbnNpZGVDaXJjbGUgPSAtNTtcbiAgICBjb25zdCBsZWdlbmRSYWRpdXMgPSA2O1xuICAgIGNvbnN0IHBzTGlua2FnZVJhZGl1cyA9IDU7XG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gMTc7XG4gICAgY29uc3QgbGVnZW5kRm9udFNpemUgPSAxNDtcbiAgICBjb25zdCBwc0xpbmthZ2VDb2xvciA9ICdyZWQnO1xuICAgIGNvbnN0IGZvbnRDb2xvciA9ICd2YXIoLS1ncmV5LTYpJztcbiAgICBjb25zdCB0aXRsZUZvbnRDb2xvciA9ICdibGFjayc7XG4gICAgY29uc3QgbW9kaWZpY2F0aW9uc0NvbG9yID0gJ3JlZCc7XG4gICAgY29uc3Qgc3NMZWZ0VGV4dCA9ICdTUzogNVxcJyc7XG4gICAgY29uc3QgYXNMZWZ0VGV4dCA9ICdBUzogM1xcJyc7XG4gICAgY29uc3Qgc3NSaWdodFRleHQgPSAnM1xcJyc7XG4gICAgY29uc3QgYXNSaWdodFRleHQgPSAnNVxcJyc7XG4gICAgY29uc3Qgc3NSaWdodE92ZXJoYW5ncyA9IGNvdW50T3ZlcmhhbmdzT25UaGVSaWdodEVkZ2Uoc3NCYXNlcyk7XG4gICAgY29uc3QgYXNSaWdodE92ZXJoYW5ncyA9IGNvdW50T3ZlcmhhbmdzT25UaGVSaWdodEVkZ2UoYXNCYXNlcyk7XG4gICAgY29uc3QgcmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyA9IE1hdGgubWF4KHNzQmFzZXMubGVuZ3RoIC0gc3NSaWdodE92ZXJoYW5ncywgYXNCYXNlcy5sZW5ndGggLSBhc1JpZ2h0T3ZlcmhhbmdzKTtcbiAgICBjb25zdCBiYXNlRGlhbWV0ZXIgPSAyICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB3aWR0aE9mQmFzZXMgPSBiYXNlRGlhbWV0ZXIgKiAocmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyArIE1hdGgubWF4KHNzUmlnaHRPdmVyaGFuZ3MsIGFzUmlnaHRPdmVyaGFuZ3MpKTtcbiAgICBjb25zdCB3aWR0aE9mTGVmdE1vZGlmaWNhdGlvbiA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc1RocmVlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNGaXZlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aE9mUmlnaHRNb2RpZmljYXRpb24gPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NGaXZlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNUaHJlZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZkxlZnRUZXh0ID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzTGVmdFRleHQsIGJhc2VGb250U2l6ZSksIGdldFRleHRXaWR0aChhc0xlZnRUZXh0LCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aE9mUmlnaHRUZXh0ID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzUmlnaHRUZXh0LCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNSaWdodFRleHQsIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoID0gd2lkdGhPZkxlZnRUZXh0ICsgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gKyB3aWR0aE9mQmFzZXMgK1xuICAgICAgICB3aWR0aE9mUmlnaHRNb2RpZmljYXRpb24gKyB3aWR0aE9mUmlnaHRUZXh0ICsgYmFzZURpYW1ldGVyO1xuICAgIGNvbnN0IGhlaWdodCA9IGFzRXhpc3RzID8gMTEgKiBiYXNlUmFkaXVzIDogOSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeE9mVGl0bGUgPSBiYXNlUmFkaXVzOyAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gNCksXG4gICAgY29uc3QgdW5pcXVlQmFzZXMgPSBhc0V4aXN0cyA/IFsuLi5uZXcgU2V0KHNzQmFzZXMuY29uY2F0KGFzQmFzZXMpKV0gOiBbLi4ubmV3IFNldChzc0Jhc2VzKV07XG4gICAgY29uc3QgaXNQdG9FeGlzdCA9IGFzRXhpc3RzID8gWy4uLm5ldyBTZXQoc3NQdG9TdGF0dXNlcy5jb25jYXQoYXNQdG9TdGF0dXNlcykpXS5pbmNsdWRlcyh0cnVlKSA6XG4gICAgICAgIFsuLi5uZXcgU2V0KHNzUHRvU3RhdHVzZXMpXS5pbmNsdWRlcyh0cnVlKTtcbiAgICBjb25zdCBzdGFydEZyb20gPSBpc1B0b0V4aXN0ID8gMSA6IDA7XG4gICAgY29uc3QgeE9mTGVmdFRleHRzID0gMDtcbiAgICBjb25zdCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucyA9IHhPZkxlZnRUZXh0cyArIHdpZHRoT2ZMZWZ0VGV4dCAtIDU7XG4gICAgY29uc3QgeE9mU3NSaWdodE1vZGlmaWNhdGlvbnMgPSBzc1JpZ2h0T3ZlcmhhbmdzICogYmFzZURpYW1ldGVyICsgZ2V0WE9mQmFzZUNpcmNsZXMoLTAuNSwgMCk7XG4gICAgY29uc3QgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMgPSBhc1JpZ2h0T3ZlcmhhbmdzICogYmFzZURpYW1ldGVyICsgZ2V0WE9mQmFzZUNpcmNsZXMoLTAuNSwgMCk7XG4gICAgY29uc3QgeE9mUmlnaHRUZXh0cyA9IE1hdGgubWF4KHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucykgK1xuICAgICAgICB3aWR0aE9mTGVmdE1vZGlmaWNhdGlvbiArIGJhc2VEaWFtZXRlciAqIChNYXRoLm1heChzc1JpZ2h0T3ZlcmhhbmdzLCBhc1JpZ2h0T3ZlcmhhbmdzKSk7XG4gICAgY29uc3QgeU9mVGl0bGUgPSBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZlNzVGV4dHMgPSA0ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc1RleHRzID0gNyAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQ29tbWVudCA9IGFzRXhpc3RzID8gMTEgKiBiYXNlUmFkaXVzIDogOC41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc0NpcmNsZXMgPSAzLjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkFzQ2lyY2xlcyA9IDYuNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQ2lyY2xlc0luTGVnZW5kcyA9IGFzRXhpc3RzID8gOSAqIGJhc2VSYWRpdXMgOiA2ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZUZXh0TGVnZW5kID0gYXNFeGlzdHMgPyA5LjUgKiBiYXNlUmFkaXVzIC0gMyA6IHlPZkFzQ2lyY2xlcyAtIDM7XG4gICAgY29uc3QgaW1hZ2UgPSBzdmcucmVuZGVyKHdpZHRoLCBoZWlnaHQpO1xuICAgIGltYWdlLmFwcGVuZChzdmcudGV4dChzc0xlZnRUZXh0LCB4T2ZMZWZ0VGV4dHMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc0xlZnRUZXh0LCB4T2ZMZWZ0VGV4dHMsIHlPZkFzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnLCBzdmcudGV4dChzc1JpZ2h0VGV4dCwgeE9mUmlnaHRUZXh0cywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpLCBhc0V4aXN0cyA/IHN2Zy50ZXh0KGFzUmlnaHRUZXh0LCB4T2ZSaWdodFRleHRzLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NGaXZlTW9kaWZpY2F0aW9uLCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpLCBhc0V4aXN0cyA/IHN2Zy50ZXh0KGFzVGhyZWVNb2RpZmljYXRpb24sIHhPZkxlZnRNb2RpZmljYXRpb25zLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NUaHJlZU1vZGlmaWNhdGlvbiwgeE9mU3NSaWdodE1vZGlmaWNhdGlvbnMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc0ZpdmVNb2RpZmljYXRpb24sIHhPZkFzUmlnaHRNb2RpZmljYXRpb25zLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvcikgOiAnJywgc3ZnLnRleHQoY29tbWVudCwgeE9mTGVmdFRleHRzLCB5T2ZDb21tZW50LCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSwgaXNQdG9FeGlzdCA/IHN2Zy5zdGFyKGJhc2VSYWRpdXMsIHlPZkNpcmNsZXNJbkxlZ2VuZHMsIHBzTGlua2FnZUNvbG9yKSA6ICcnLCBpc1B0b0V4aXN0ID8gc3ZnLnRleHQoJ3BzIGxpbmthZ2UnLCAyICogYmFzZVJhZGl1cyAtIDgsIHlPZlRleHRMZWdlbmQsIGxlZ2VuZEZvbnRTaXplLCBmb250Q29sb3IpIDogJycpO1xuICAgIGxldCBudW1iZXJPZlNzTnVjbGVvdGlkZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc3NCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudW1iZXJPZlNzTnVjbGVvdGlkZXMrKztcbiAgICB9XG4gICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gbnVtYmVyT2ZTc051Y2xlb3RpZGVzO1xuICAgIGZvciAobGV0IGkgPSBzc0Jhc2VzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgIGlmIChzc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyLS07XG4gICAgICAgIGltYWdlLmFwcGVuZChzdmcuY2lyY2xlKGdldFhPZkJhc2VDaXJjbGVzKGksIHNzUmlnaHRPdmVyaGFuZ3MpLCB5T2ZTc0NpcmNsZXMsIGJhc2VSYWRpdXMsIGdldEJhc2VDb2xvcihzc0Jhc2VzW2ldKSksIHN2Zy50ZXh0KGdldFRleHRJbnNpZGVDaXJjbGUoc3NCYXNlcywgaSwgbnVjbGVvdGlkZUNvdW50ZXIsIG51bWJlck9mU3NOdWNsZW90aWRlcywgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksIGdldFhPZkJhc2VDaXJjbGVzKGksIHNzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgIGdldFNoaWZ0VG9BbGlnbk51bWJlckluc2lkZUNpcmNsZShzc0Jhc2VzLCBzc0Jhc2VzLmxlbmd0aCAtIGksIG51bWJlck9mU3NOdWNsZW90aWRlcyAtIG51Y2xlb3RpZGVDb3VudGVyKSwgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGF4b2xhYnNNYXBbc3NCYXNlc1tpXV1bJ2NvbG9yJ10pKSwgc3NQdG9TdGF0dXNlc1tpXSA/XG4gICAgICAgICAgICBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSArIGJhc2VSYWRpdXMsIHlPZlNzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6XG4gICAgICAgICAgICAnJyk7XG4gICAgfVxuICAgIGltYWdlLmFwcGVuZChzc1B0b1N0YXR1c2VzW3NzQmFzZXMubGVuZ3RoXSA/XG4gICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKHNzQmFzZXMubGVuZ3RoLCBzc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZTc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgbGV0IG51bWJlck9mQXNOdWNsZW90aWRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0Jhc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgIG51bWJlck9mQXNOdWNsZW90aWRlcysrO1xuICAgIH1cbiAgICBpZiAoYXNFeGlzdHMpIHtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gbnVtYmVyT2ZBc051Y2xlb3RpZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gYXNCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICAgICAgaWYgKGFzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyLS07XG4gICAgICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBhc1JpZ2h0T3ZlcmhhbmdzKSwgeU9mQXNDaXJjbGVzLCBiYXNlUmFkaXVzLCBnZXRCYXNlQ29sb3IoYXNCYXNlc1tpXSkpLCBzdmcudGV4dChnZXRUZXh0SW5zaWRlQ2lyY2xlKGFzQmFzZXMsIGksIG51bWJlck9mQXNOdWNsZW90aWRlcyAtIG51Y2xlb3RpZGVDb3VudGVyIC0gMSwgbnVtYmVyT2ZBc051Y2xlb3RpZGVzLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSwgZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGdldFNoaWZ0VG9BbGlnbk51bWJlckluc2lkZUNpcmNsZShhc0Jhc2VzLCBpLCBudWNsZW90aWRlQ291bnRlciArIDEpLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGdldEZvbnRDb2xvclZpc2libGVPbkJhY2tncm91bmQoYXhvbGFic01hcFthc0Jhc2VzW2ldXVsnY29sb3InXSkpLCBhc1B0b1N0YXR1c2VzW2ldID8gc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZkFzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpbWFnZS5hcHBlbmQoYXNQdG9TdGF0dXNlc1thc0Jhc2VzLmxlbmd0aF0gP1xuICAgICAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoYXNCYXNlcy5sZW5ndGgsIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZBc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlID0gcGF0dGVybk5hbWUgKyAnIGZvciAnICtcbiAgICAgICAgU3RyaW5nKG51bWJlck9mU3NOdWNsZW90aWRlcykgKyAoYXNFeGlzdHMgPyAnLycgKyBTdHJpbmcobnVtYmVyT2ZBc051Y2xlb3RpZGVzKSA6ICcnKSArICdtZXInO1xuICAgIGltYWdlLmFwcGVuZChzdmcudGV4dCh0aXRsZSwgeE9mVGl0bGUsIHlPZlRpdGxlLCBiYXNlRm9udFNpemUsIHRpdGxlRm9udENvbG9yKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmlxdWVCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSksIHlPZkNpcmNsZXNJbkxlZ2VuZHMsIGxlZ2VuZFJhZGl1cywgZ2V0QmFzZUNvbG9yKHVuaXF1ZUJhc2VzW2ldKSksIHN2Zy50ZXh0KHVuaXF1ZUJhc2VzW2ldLCBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSkgK1xuICAgICAgICAgICAgbGVnZW5kUmFkaXVzICsgNCwgeU9mVGV4dExlZ2VuZCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvcikpO1xuICAgIH1cbiAgICByZXR1cm4gaW1hZ2U7XG59XG4iLCJleHBvcnQgY29uc3QgU0FMVFNfQ1NWID0gYERJU1BMQVksTU9MV0VJR0hUXG5ubyBEYXRhIEFkZGVkLDEwMGA7XG4iLCJleHBvcnQgY29uc3QgU09VUkNFUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwiLy9uYW1lOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckVkZ2VzID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICc1KicsICdBJzogJzYqJywgJ0MnOiAnNyonLCAnRyc6ICc4KidcbiAgICB9O1xuICAgIGNvbnN0IG9iakZvckNlbnRlciA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnVConLCAnQSc6ICdBKicsICdDJzogJzkqJywgJ0cnOiAnRyonXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxUfEN8RykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIChjb3VudCA+IDQgJiYgY291bnQgPCAxNSkgPyBvYmpGb3JDZW50ZXJbeF0gOiBvYmpGb3JFZGdlc1t4XTtcbiAgICB9KS5zbGljZSgwLCAobnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhpbnZhYmFzaWMpJykgfHwgbnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhHYWxOQWMtMi1KTkopJykpID9cbiAgICAgICAgbnVjbGVvdGlkZXMubGVuZ3RoIDogMiAqIGNvdW50ICsgMSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yRWRnZXMgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJ21vZVVucHMnLFxuICAgICAgICAnQSc6ICdtb2VBbnBzJywgJ0MnOiAnbW9lNW1DbnBzJywgJ0cnOiAnbW9lR25wcydcbiAgICB9O1xuICAgIGNvbnN0IG9iakZvckNlbnRlciA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0MnOiAnNW1DcHMnLCAnQSc6ICdBcHMnLCAnVCc6ICdUcHMnLCAnRyc6ICdHcHMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VHxDfEcpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDUpXG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ID09IDQpID8gb2JqRm9yRWRnZXNbeF0uc2xpY2UoMCwgLTMpICsgJ3BzJyA6IG9iakZvckVkZ2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPCAxNSlcbiAgICAgICAgICAgIHJldHVybiAoY291bnQgPT0gMTQpID8gb2JqRm9yQ2VudGVyW3hdLnNsaWNlKDAsIC0yKSArICducHMnIDogb2JqRm9yQ2VudGVyW3hdO1xuICAgICAgICByZXR1cm4gb2JqRm9yRWRnZXNbeF07XG4gICAgfSkuc2xpY2UoMCwgKG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoaW52YWJhc2ljKScpIHx8IG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoR2FsTkFjLTItSk5KKScpKSA/XG4gICAgICAgIG51Y2xlb3RpZGVzLmxlbmd0aCA6IC0zKTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcqJzogJycsICc1JzogJ1QnLCAnNic6ICdBJywgJzcnOiAnQycsICc4JzogJ0cnLCAnOSc6ICdDJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxcXCp8NXw2fDd8OHw5KS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICc1Kic6ICdtb2VVbnBzJywgJzYqJzogJ21vZUFucHMnLCAnNyonOiAnbW9lNW1DbnBzJywgJzgqJzogJ21vZUducHMnLCAnOSonOiAnNW1DcHMnLCAnQSonOiAnQXBzJywgJ1QqJzogJ1RwcycsXG4gICAgICAgICdHKic6ICdHcHMnLCAnQyonOiAnQ3BzJywgJzUnOiAnbW9lVScsICc2JzogJ21vZUEnLCAnNyc6ICdtb2U1bUMnLCAnOCc6ICdtb2VHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXw1XFwqfDZcXCp8N1xcKnw4XFwqfDlcXCp8QVxcKnxUXFwqfEdcXCp8Q1xcKnw1fDZ8N3w4KS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gKGNvdW50ID09IDQpID8gb2JqW3hdLnNsaWNlKDAsIC0zKSArICdwcycgOiAoY291bnQgPT0gMTQpID8gb2JqW3hdLnNsaWNlKDAsIC0yKSArICducHMnIDogb2JqW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21vZVQnOiAnNScsICdtb2VBJzogJzYnLCAnbW9lNW1DJzogJzcnLCAnbW9lRyc6ICc4JywgJ21vZVUnOiAnNScsICc1bUMnOiAnOScsICducHMnOiAnKicsICdwcyc6ICcqJywgJ1UnOiAnVCcsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bW9lVHxtb2VBfG1vZTVtQ3xtb2VHfG1vZVV8NW1DfG5wc3xwc3xVKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtb2UnOiAnJywgJzVtJzogJycsICduJzogJycsICdwcyc6ICcnLCAnVSc6ICdUJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtb2V8NW18bnxwc3xVKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ1UnLCAnMic6ICdBJywgJzMnOiAnQycsICc0JzogJ0cnLCAnNSc6ICdVJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJyonOiAnJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdVZicsICcyJzogJ0FmJywgJzMnOiAnQ2YnLCAnNCc6ICdHZicsICc1JzogJ3UnLCAnNic6ICdhJywgJzcnOiAnYycsICc4JzogJ2cnLCAnKic6ICdzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnZlUnLCAnMic6ICdmQScsICczJzogJ2ZDJywgJzQnOiAnZkcnLCAnNSc6ICdtVScsICc2JzogJ21BJywgJzcnOiAnbUMnLCAnOCc6ICdtRycsICcqJzogJ3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJ2ZVJywgJ0FmJzogJ2ZBJywgJ0NmJzogJ2ZDJywgJ0dmJzogJ2ZHJywgJ3UnOiAnbVUnLCAnYSc6ICdtQScsICdjJzogJ21DJywgJ2cnOiAnbUcnLCAncyc6ICdwcycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnMScsICdBZic6ICcyJywgJ0NmJzogJzMnLCAnR2YnOiAnNCcsICd1JzogJzUnLCAnYSc6ICc2JywgJ2MnOiAnNycsICdnJzogJzgnLCAncyc6ICcqJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJ1UnLCAnQWYnOiAnQScsICdDZic6ICdDJywgJ0dmJzogJ0cnLCAndSc6ICdVJywgJ2EnOiAnQScsICdjJzogJ0MnLCAnZyc6ICdHJywgJ3MnOiAnJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICdVJywgJ2ZBJzogJ0EnLCAnZkMnOiAnQycsICdmRyc6ICdHJywgJ21VJzogJ1UnLCAnbUEnOiAnQScsICdtQyc6ICdDJywgJ21HJzogJ0cnLCAncHMnOiAnJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICcxJywgJ2ZBJzogJzInLCAnZkMnOiAnMycsICdmRyc6ICc0JywgJ21VJzogJzUnLCAnbUEnOiAnNicsICdtQyc6ICc3JywgJ21HJzogJzgnLCAncHMnOiAnKicsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb0F4b2xhYnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9BeG9sYWJzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnVWYnLCAnZkEnOiAnQWYnLCAnZkMnOiAnQ2YnLCAnZkcnOiAnR2YnLCAnbVUnOiAndScsICdtQSc6ICdhJywgJ21DJzogJ2MnLCAnbUcnOiAnZycsICdwcyc6ICdzJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnNionLCAnVSc6ICc1KicsICdHJzogJzgqJywgJ0MnOiAnNyonIH07XG4gICAgY29uc3Qgb2JqRm9yUmlnaHRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICcqNicsICdVJzogJyo1JywgJ0cnOiAnKjgnLCAnQyc6ICcqNycgfTtcbiAgICBjb25zdCBvYmpGb3JPZGRJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICc2JywgJ1UnOiAnNScsICdHJzogJzgnLCAnQyc6ICc3JyB9O1xuICAgIGNvbnN0IG9iakZvckV2ZW5JbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICcyJywgJ1UnOiAnMScsICdHJzogJzQnLCAnQyc6ICczJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPiBudWNsZW90aWRlcy5sZW5ndGggLSAzKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclJpZ2h0RWRnZVt4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCAlIDIgPT0gMCkgPyBvYmpGb3JFdmVuSW5kaWNlc1t4XSA6IG9iakZvck9kZEluZGljZXNbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdtQXBzJywgJ1UnOiAnbVVwcycsICdHJzogJ21HcHMnLCAnQyc6ICdtQ3BzJyB9O1xuICAgIGNvbnN0IG9iakZvclJpZ2h0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAncHNtQScsICdVJzogJ3BzbVUnLCAnRyc6ICdwc21HJywgJ0MnOiAncHNtQycgfTtcbiAgICBjb25zdCBvYmpGb3JFdmVuSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnZkEnLCAnVSc6ICdmVScsICdHJzogJ2ZHJywgJ0MnOiAnZkMnIH07XG4gICAgY29uc3Qgb2JqRm9yT2RkSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnbUEnLCAnVSc6ICdtVScsICdHJzogJ21HJywgJ0MnOiAnbUMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA+IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDMpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yUmlnaHRFZGdlW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ICUgMiA9PSAwKSA/IG9iakZvckV2ZW5JbmRpY2VzW3hdIDogb2JqRm9yT2RkSW5kaWNlc1t4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzU2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzU2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnYXMnLCAnVSc6ICd1cycsICdHJzogJ2dzJywgJ0MnOiAnY3MnIH07XG4gICAgY29uc3Qgb2JqRm9yU29tZUluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmJywgJ1UnOiAnVWYnLCAnRyc6ICdHZicsICdDJzogJ0NmJyB9O1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnYScsICdVJzogJ3UnLCAnRyc6ICdnJywgJ0MnOiAnYycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IDYgfHwgKGNvdW50ID4gNyAmJiBjb3VudCA8IDExKSlcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JTb21lSW5kaWNlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICByZXR1cm4gJ2EnO1xuICAgICAgICByZXR1cm4gb2JqW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNBbnRpc2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzQW50aXNlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yU21hbGxMaW5rYWdlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnYXMnLCAnVSc6ICd1cycsICdHJzogJ2dzJywgJ0MnOiAnY3MnIH07XG4gICAgY29uc3Qgb2JqRm9yQmlnTGlua2FnZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmcycsICdVJzogJ1VmcycsICdHJzogJ0dmcycsICdDJzogJ0NmcycgfTtcbiAgICBjb25zdCBvYmpGb3JTb21lSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWYnLCAnVSc6ICdVZicsICdHJzogJ0dmJywgJ0MnOiAnQ2YnIH07XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdhJywgJ1UnOiAndScsICdHJzogJ2cnLCAnQyc6ICdjJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPiAxOSAmJiBjb3VudCA8IDIyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclNtYWxsTGlua2FnZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuICd1cyc7XG4gICAgICAgIGlmIChjb3VudCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckJpZ0xpbmthZ2VzW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ID09IDUgfHwgY291bnQgPT0gNyB8fCBjb3VudCA9PSA4IHx8IGNvdW50ID09IDEzIHx8IGNvdW50ID09IDE1KSA/IG9iakZvclNvbWVJbmRpY2VzW3hdIDogb2JqW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBnY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21BcHMnOiAnQScsICdtVXBzJzogJ1UnLCAnbUdwcyc6ICdHJywgJ21DcHMnOiAnQycsICdmQXBzJzogJ0EnLCAnZlVwcyc6ICdVJywgJ2ZHcHMnOiAnRycsICdmQ3BzJzogJ0MnLFxuICAgICAgICAnZlUnOiAnVScsICdmQSc6ICdBJywgJ2ZDJzogJ0MnLCAnZkcnOiAnRycsICdtVSc6ICdVJywgJ21BJzogJ0EnLCAnbUMnOiAnQycsICdtRyc6ICdHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtQXBzfG1VcHN8bUdwc3xtQ3BzfGZBcHN8ZlVwc3xmR3BzfGZDcHN8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUcpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBnY3JzVG9NZXJtYWRlMTJcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBNZXJtYWRlIDEyIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTWVybWFkZTEyKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbUFwcyc6ICdlJywgJ21VcHMnOiAnaCcsICdtR3BzJzogJ2cnLCAnbUNwcyc6ICdmJywgJ2ZBcHMnOiAnaScsICdmVXBzJzogJ2wnLCAnZkdwcyc6ICdrJywgJ2ZDcHMnOiAnaicsICdmVSc6ICdMJyxcbiAgICAgICAgJ2ZBJzogJ0knLCAnZkMnOiAnSicsICdmRyc6ICdLJywgJ21VJzogJ0gnLCAnbUEnOiAnRScsICdtQyc6ICdGJywgJ21HJzogJ0cnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1BcHN8bVVwc3xtR3BzfG1DcHN8ZkFwc3xmVXBzfGZHcHN8ZkNwc3xmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtRykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4iLCJpbXBvcnQgeyBtYXAsIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzLCBTWU5USEVTSVpFUlMsIFRFQ0hOT0xPR0lFUywgTU9ESUZJQ0FUSU9OUyB9IGZyb20gJy4vbWFwJztcbmltcG9ydCB7IGlzVmFsaWRTZXF1ZW5jZSB9IGZyb20gJy4vc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuaW1wb3J0IHsgZ2V0TnVjbGVvdGlkZXNNb2wgfSBmcm9tICcuL21vbC10cmFuc2Zvcm1hdGlvbnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlVG9Nb2xWMzAwMChzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSwgb2NsUmVuZGVyID0gZmFsc2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSwgZm9ybWF0KTtcbiAgICBsZXQgY29kZXMgPSBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihPYmplY3Qua2V5cyhvYmopKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3Qgc21pbGVzQ29kZXMgPSBbXTtcbiAgICBjb25zdCBjb2Rlc0xpc3QgPSBbXTtcbiAgICBjb25zdCBsaW5rcyA9IFsncycsICdwcycsICcqJ107XG4gICAgY29uc3QgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5ID0gWydlJywgJ2gnLCAvKidnJywqLyAnZicsICdpJywgJ2wnLCAnaycsICdqJ107XG4gICAgY29uc3QgZHJvcGRvd25zID0gT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUyk7XG4gICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoZHJvcGRvd25zKTtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgaSArPSBjb2RlLmxlbmd0aDtcbiAgICAgICAgaW52ZXJ0ZWQgPyBjb2Rlc0xpc3QudW5zaGlmdChjb2RlKSA6IGNvZGVzTGlzdC5wdXNoKGNvZGUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkpIHtcbiAgICAgICAgICAgIHNtaWxlc0NvZGVzLnB1c2goKGkgPj0gY29kZXNMaXN0Lmxlbmd0aCAvIDIpID9cbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ucmlnaHQgOiBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ubGVmdCk7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICAoaSA8IGNvZGVzTGlzdC5sZW5ndGggLSAxICYmIGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpICsgMV0pKSlcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNtaWxlc0NvZGVzLnB1c2gob2JqW2NvZGVzTGlzdFtpXV0pO1xuICAgICAgICAgICAgICAgIHNtaWxlc0NvZGVzLnB1c2goc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXROdWNsZW90aWRlc01vbChzbWlsZXNDb2Rlcywgb2NsUmVuZGVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRvU21pbGVzKHNlcXVlbmNlLCBpbnZlcnRlZCA9IGZhbHNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBzbWlsZXMgPSAnJztcbiAgICBjb25zdCBjb2Rlc0xpc3QgPSBbXTtcbiAgICBjb25zdCBsaW5rcyA9IFsncycsICdwcycsICcqJ107XG4gICAgY29uc3QgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5ID0gWydlJywgJ2gnLCAvKidnJywqLyAnZicsICdpJywgJ2wnLCAnaycsICdqJ107XG4gICAgY29uc3QgZHJvcGRvd25zID0gT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUyk7XG4gICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoZHJvcGRvd25zKTtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgaSArPSBjb2RlLmxlbmd0aDtcbiAgICAgICAgaW52ZXJ0ZWQgPyBjb2Rlc0xpc3QudW5zaGlmdChjb2RlKSA6IGNvZGVzTGlzdC5wdXNoKGNvZGUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkpIHtcbiAgICAgICAgICAgIHNtaWxlcyArPSAoaSA+PSBjb2Rlc0xpc3QubGVuZ3RoIC8gMikgP1xuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5yaWdodCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzIDpcbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ubGVmdCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIChpIDwgY29kZXNMaXN0Lmxlbmd0aCAtIDEgJiYgbGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2kgKyAxXSkpKVxuICAgICAgICAgICAgICAgIHNtaWxlcyArPSBvYmpbY29kZXNMaXN0W2ldXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV0gKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzbWlsZXMgPSBzbWlsZXMucmVwbGFjZSgvT08vZywgJ08nKTtcbiAgICByZXR1cm4gKChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSAmJlxuICAgICAgICBjb2Rlc0xpc3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAhaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMl0pKSB8fFxuICAgICAgICBkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgfHxcbiAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pKSA/XG4gICAgICAgIHNtaWxlcyA6XG4gICAgICAgIHNtaWxlcy5zbGljZSgwLCBzbWlsZXMubGVuZ3RoIC0gc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMubGVuZ3RoICsgMSk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGlmIChmb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29kZSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKSlcbiAgICAgICAgICAgICAgICAgICAgb2JqW2NvZGVdID0gbWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XVtjb2RlXS5TTUlMRVM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbZm9ybWF0XSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29kZSBvZiBPYmplY3Qua2V5cyhtYXBbZm9ybWF0XVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgb2JqW2NvZGVdID0gbWFwW2Zvcm1hdF1bdGVjaG5vbG9neV1bY29kZV0uU01JTEVTO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IGNyZWF0ZSBvYmplY3QgYmFzZWQgZnJvbSBzeW50aGVzaXplciB0eXBlIHRvIGF2b2lkIGtleShjb2RlcykgZHVwbGljYXRlc1xuICAgIGNvbnN0IG91dHB1dCA9IGlzVmFsaWRTZXF1ZW5jZShzZXF1ZW5jZSwgZm9ybWF0KTtcbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSlcbiAgICAgICAgb2JqWydnJ10gPSBtYXBbU1lOVEhFU0laRVJTLk1FUk1BREVfMTJdW1RFQ0hOT0xPR0lFUy5TSV9STkFdWydnJ10uU01JTEVTO1xuICAgIGVsc2UgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQVhPTEFCUykpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5BWE9MQUJTXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgU1lOVEhFU0laRVJTID0ge1xuICAgIFJBV19OVUNMRU9USURFUzogJ1JhdyBOdWNsZW90aWRlcycsXG4gICAgQklPU1BSSU5HOiAnQmlvU3ByaW5nIENvZGVzJyxcbiAgICBHQ1JTOiAnSmFuc3NlbiBHQ1JTIENvZGVzJyxcbiAgICBBWE9MQUJTOiAnQXhvbGFicyBDb2RlcycsXG4gICAgTUVSTUFERV8xMjogJ01lcm1hZGUgMTInLFxufTtcbmV4cG9ydCBjb25zdCBURUNITk9MT0dJRVMgPSB7XG4gICAgRE5BOiAnRE5BJyxcbiAgICBSTkE6ICdSTkEnLFxuICAgIEFTT19HQVBNRVJTOiAnRm9yIEFTTyBHYXBtZXJzJyxcbiAgICBTSV9STkE6ICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQScsXG59O1xuZXhwb3J0IGNvbnN0IENPTF9OQU1FUyA9IHtcbiAgICBDSEVNSVNUUlk6ICdDaGVtaXN0cnknLFxuICAgIE5VTUJFUjogJ051bWJlcicsXG4gICAgVFlQRTogJ1R5cGUnLFxuICAgIENIRU1JU1RSWV9OQU1FOiAnQ2hlbWlzdHJ5IE5hbWUnLFxuICAgIElOVEVSTkFMX0NPTVBPVU5EX0lEOiAnSW50ZXJuYWwgY29tcG91bmQgSUQnLFxuICAgIElEUDogJ0lEUCcsXG4gICAgU0VRVUVOQ0U6ICdTZXF1ZW5jZScsXG4gICAgQ09NUE9VTkRfTkFNRTogJ0NvbXBvdW5kIE5hbWUnLFxuICAgIENPTVBPVU5EX0NPTU1FTlRTOiAnQ29tcG91bmQgQ29tbWVudHMnLFxuICAgIFNBTFQ6ICdTYWx0JyxcbiAgICBFUVVJVkFMRU5UUzogJ0VxdWl2YWxlbnRzJyxcbiAgICBQVVJJVFk6ICdQdXJpdHknLFxuICAgIENQRF9NVzogJ0NwZCBNVycsXG4gICAgU0FMVF9NQVNTOiAnU2FsdCBtYXNzJyxcbiAgICBCQVRDSF9NVzogJ0JhdGNoIE1XJyxcbiAgICBTT1VSQ0U6ICdTb3VyY2UnLFxuICAgIElDRDogJ0lDRCcsXG4gICAgT1dORVI6ICdPd25lcicsXG59O1xuLy8gaW50ZXJmYWNlIENPREVTIHtcbi8vIH1cbmV4cG9ydCBjb25zdCBNT0RJRklDQVRJT05TID0ge1xuICAgICcoaW52YWJhc2ljKSc6IHtcbiAgICAgICAgbW9sZWN1bGFyV2VpZ2h0OiAxMTguMTMsXG4gICAgICAgIGxlZnQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgICAgICByaWdodDogJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycsXG4gICAgfSxcbiAgICAnKEdhbE5BYy0yLUpOSiknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTI3My4zLFxuICAgICAgICBsZWZ0OiAnQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKU5DKD1PKUNDQ0MoPU8pTkNDKE8pQ08nLFxuICAgICAgICByaWdodDogJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyxcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyA9ICdPUCg9TykoTylPJztcbmV4cG9ydCBjb25zdCBtYXAgPSB7XG4gICAgJ1JhdyBOdWNsZW90aWRlcyc6IHtcbiAgICAgICAgJ0ROQSc6IHtcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ1JOQSc6IHtcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdCaW9TcHJpbmcgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgQVNPIEdhcG1lcnMnOiB7XG4gICAgICAgICAgICAnNSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3OC4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc2Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzODcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc4Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiA0MDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJzEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzInOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnMyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc4Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdBeG9sYWJzIENvZGVzJzoge1xuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnVWYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0FmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0NmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAndSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdnJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnSmFuc3NlbiBHQ1JTIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJ21vZVQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZTVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcoNW0pbW9lQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2VHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiA0MDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNW1DJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcoNW0pQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncHMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDUuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdVcmFjaWwnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDYuMTcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2ZVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdmQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdmQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21VJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjAuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21DJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdNZXJtYWRlIDEyJzoge1xuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnZSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNi4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdnJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzUuMzEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzM1LjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2knOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2wnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyNC4yMyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM2My4yNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMy4yNSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0wnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0knOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG4iLCJpbXBvcnQgKiBhcyBPQ0wgZnJvbSAnb3BlbmNoZW1saWIvZnVsbC5qcyc7XG5jb25zdCBQSE9TSEFURSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDUgNCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gLTEuNSAwIDAgMFxuTSAgVjMwIDIgUCAwIDAgMCAwXG5NICBWMzAgMyBPIDAgMSAwIDBcbk0gIFYzMCA0IE8gMCAtMSAwIDBcbk0gIFYzMCA1IE8gMS41IDAgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDEgMlxuTSAgVjMwIDIgMiAyIDNcbk0gIFYzMCAzIDEgMiA0XG5NICBWMzAgNCAxIDIgNVxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIEVORGA7XG5jb25zdCBUSElPUEhPU0hBVEUgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA1IDQgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0xLjUgMCAwIDBcbk0gIFYzMCAyIFAgMCAwIDAgMFxuTSAgVjMwIDMgTyAwIDEgMCAwXG5NICBWMzAgNCBTIDAgLTEgMCAwXG5NICBWMzAgNSBPIDEuNSAwIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAxIDJcbk0gIFYzMCAyIDIgMiAzXG5NICBWMzAgMyAxIDIgNFxuTSAgVjMwIDQgMSAyIDVcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEVORCBDVEFCXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBFTkRgO1xuY29uc3QgSU5WQUJBU0lDID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgOCA4IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAxLjA5MzQgLTIuMTYzNiAwIDBcbk0gIFYzMCAyIEMgMS44MzY1IC0xLjQ5NDUgMCAwIENGRz0yXG5NICBWMzAgMyBDIDIuODE0NyAtMS43MDI0IDAgMFxuTSAgVjMwIDQgQyAzLjMxNDcgLTAuODM2NCAwIDAgVkFMPTNcbk0gIFYzMCA1IE8gMi42NDU1IC0wLjA5MzIgMCAwXG5NICBWMzAgNiBDIDEuNzMyIC0wLjUgMCAwIENGRz0xXG5NICBWMzAgNyBDIDAuODY2IDAgMCAwXG5NICBWMzAgOCBPIDAuODY2IDEgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDIgMSBDRkc9MVxuTSAgVjMwIDIgMSAyIDNcbk0gIFYzMCAzIDEgMyA0XG5NICBWMzAgNCAxIDQgNVxuTSAgVjMwIDUgMSA2IDVcbk0gIFYzMCA2IDEgMiA2XG5NICBWMzAgNyAxIDYgNyBDRkc9M1xuTSAgVjMwIDggMSA3IDhcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgyIDIgNilcbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDVEFCXG5NICBFTkRgO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE51Y2xlb3RpZGVzTW9sKHNtaWxlc0NvZGVzLCBvY2xSZW5kZXIgPSBmYWxzZSkge1xuICAgIGNvbnN0IG1vbEJsb2NrcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc21pbGVzQ29kZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIHNtaWxlc0NvZGVzW2ldID09ICdPUCg9TykoTylPJyA/IG1vbEJsb2Nrcy5wdXNoKFBIT1NIQVRFKSA6XG4gICAgICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKFMpTycgPyBtb2xCbG9ja3MucHVzaChUSElPUEhPU0hBVEUpIDpcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyA/IG1vbEJsb2Nrcy5wdXNoKHJvdGF0ZU51Y2xlb3RpZGVzVjMwMDAoSU5WQUJBU0lDKSkgOlxuICAgICAgICAgICAgICAgICAgICBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKHNtaWxlc0NvZGVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5rVjMwMDAobW9sQmxvY2tzLCBmYWxzZSwgb2NsUmVuZGVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVjMwMDAobW9sQmxvY2tzLCB0d29DaGFpbnMgPSBmYWxzZSwgb2NsUmVuZGVyID0gZmFsc2UpIHtcbiAgICBsZXQgbWFjcm9Nb2xCbG9jayA9ICdcXG5EYXRhZ3JvayBtYWNyb21vbGVjdWxlIGhhbmRsZXJcXG5cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJyAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgIDk5OSBWMzAwMFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEJFR0lOIENUQUJcXG4nO1xuICAgIGxldCBhdG9tQmxvY2sgPSAnJztcbiAgICBsZXQgYm9uZEJsb2NrID0gJyc7XG4gICAgbGV0IGNvbGxlY3Rpb25CbG9jayA9ICcnO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBbXTtcbiAgICBsZXQgbmF0b20gPSAwO1xuICAgIGxldCBuYm9uZCA9IDA7XG4gICAgbGV0IHhTaGlmdCA9IDA7XG4gICAgaWYgKHR3b0NoYWlucyAmJiBtb2xCbG9ja3MubGVuZ3RoID4gMSlcbiAgICAgICAgbW9sQmxvY2tzWzFdID0gaW52ZXJ0TnVjbGVvdGlkZXNWMzAwMChtb2xCbG9ja3NbMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9sQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5yZXBsYWNlQWxsKCcoLVxcbk0gIFYzMCAnLCAnKCcpXG4gICAgICAgICAgICAucmVwbGFjZUFsbCgnLVxcbk0gIFYzMCAnLCAnJykucmVwbGFjZUFsbCgnICknLCAnKScpO1xuICAgICAgICBjb25zdCBudW1iZXJzID0gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2tzW2ldKTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBpZiAodHdvQ2hhaW5zKSB7XG4gICAgICAgICAgICBjb25zdCB4U2hpZnRSaWdodCA9IE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLngpO1xuICAgICAgICAgICAgY29uc3QgeVNoaWZ0ID0gaSA9PSAwID8gTWF0aC5taW4oLi4uY29vcmRpbmF0ZXMueSkgLSAxIDogTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyAxO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlcy54Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbal0gLT0geFNoaWZ0UmlnaHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb3JkaW5hdGVzLnkubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMueVtqXSAtPSB5U2hpZnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4QXRvbXMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgICAgIGluZGV4QXRvbXMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXhBdG9tcyk7XG4gICAgICAgIGxldCBpbmRleCA9IGluZGV4QXRvbXM7XG4gICAgICAgIGxldCBpbmRleEVuZCA9IGluZGV4QXRvbXM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYXRvbTsgaisrKSB7XG4gICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMuYXRvbUluZGV4W2pdICE9IDEgfHwgaSA9PSAwIHx8IHR3b0NoYWlucykge1xuICAgICAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIG51bWJlclxuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsU2hpZnQgPSB0d29DaGFpbnMgPyAwIDogeFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZSA9IHR3b0NoYWlucyA/XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiBjb29yZGluYXRlcy54W2pdKSAvIDEwMDAwIDpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIChwYXJzZUZsb2F0KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyB0b3RhbFNoaWZ0KSkgLyAxMDAwMDtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgY29vcmRpbmF0ZSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlID0gdHdvQ2hhaW5zID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIGNvb3JkaW5hdGVzLnlbal0pIC8gMTAwMDAgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKDEwMDAwICogKHBhcnNlRmxvYXQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAnLCBpbmRleCkgLSAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEFUT00nKTtcbiAgICAgICAgYXRvbUJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhBdG9tcyArIDEsIGluZGV4QXRvbXNFbmQpO1xuICAgICAgICBsZXQgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICAgICAgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEJvbmRzO1xuICAgICAgICBpbmRleEVuZCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYm9uZDsgaisrKSB7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYm9uZCBudW1iZXJcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYm9uZE51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYm9uZDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBib25kTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIHBhaXIgaW4gYm9uZFxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBsZXQgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBNYXRoLm1pbihtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpLCBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICAgICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEJvbmRFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgICAgIGJvbmRCbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgICAgICBsZXQgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGNvbGxlY3Rpb25zXG4gICAgICAgIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignKScsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRW5kKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChwYXJzZUludChlKSArIG5hdG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBuYXRvbSArPSB0d29DaGFpbnMgPyBudW1iZXJzLm5hdG9tIDogbnVtYmVycy5uYXRvbSAtIDE7XG4gICAgICAgIG5ib25kICs9IG51bWJlcnMubmJvbmQ7XG4gICAgICAgIHhTaGlmdCArPSB0d29DaGFpbnMgPyAwIDogY29vcmRpbmF0ZXMueFtudW1iZXJzLm5hdG9tIC0gMV0gLSBjb29yZGluYXRlcy54WzBdO1xuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzID0gNDtcbiAgICBjb25zdCBjb2xsTnVtYmVyID0gTWF0aC5jZWlsKGNvbGxlY3Rpb24ubGVuZ3RoIC8gZW50cmllcyk7XG4gICAgaWYgKG9jbFJlbmRlcikge1xuICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnICsgY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sbGVjdGlvbi5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnICcgKyBjb2xsZWN0aW9uW2pdO1xuICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJylcXG4nO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoICsgJyAtXFxuJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsTnVtYmVyOyBpKyspIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwICc7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzQ3VycmVudCA9IGkgKyAxID09IGNvbGxOdW1iZXIgPyBjb2xsZWN0aW9uLmxlbmd0aCAtIChjb2xsTnVtYmVyIC0gMSkgKiBlbnRyaWVzIDogZW50cmllcztcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZW50cmllc0N1cnJlbnQ7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAoaiArIDEgPT0gZW50cmllc0N1cnJlbnQpID9cbiAgICAgICAgICAgICAgICAgICAgKGkgPT0gY29sbE51bWJlciAtIDEgPyBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnKVxcbicgOiBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnIC1cXG4nKSA6XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2dlbmVyYXRlIGZpbGVcbiAgICB0d29DaGFpbnMgPyBuYXRvbSA6IG5hdG9tKys7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIENPVU5UUyAnICsgbmF0b20gKyAnICcgKyBuYm9uZCArICcgMCAwIDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9IGF0b21CbG9jaztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEFUT01cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9IGJvbmRCbG9jaztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEJPTkRcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9IGNvbGxlY3Rpb25CbG9jaztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENPTExFQ1RJT05cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQ1RBQlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgRU5EXFxuJztcbiAgICByZXR1cm4gbWFjcm9Nb2xCbG9jaztcbn1cbmZ1bmN0aW9uIHJvdGF0ZU51Y2xlb3RpZGVzVjMwMDAobW9sZWN1bGUpIHtcbiAgICBsZXQgbW9sQmxvY2sgPSBtb2xlY3VsZS5pbmNsdWRlcygnTSAgRU5EJykgPyBtb2xlY3VsZSA6IE9DTC5Nb2xlY3VsZS5mcm9tU21pbGVzKG1vbGVjdWxlKS50b01vbGZpbGVWMygpO1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZXh0cmFjdEF0b21EYXRhVjMwMDAobW9sQmxvY2spO1xuICAgIGNvbnN0IG5hdG9tID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4Lmxlbmd0aDtcbiAgICBjb25zdCBpbmRleEZpdmVQcmltZSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5pbmRleE9mKDEpO1xuICAgIGNvbnN0IGluZGV4VGhyZWVQcmltZSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5pbmRleE9mKG5hdG9tKTtcbiAgICAvL2ZpeCA1IHByaW1lIGlmIGluYWRlcXVhdGVcbiAgICBpZiAobmF0b20gPiA4KVxuICAgICAgICBmaXg1UHJpbWUoY29vcmRpbmF0ZXMsIGluZGV4Rml2ZVByaW1lLCBpbmRleFRocmVlUHJpbWUpO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoY29vcmRpbmF0ZXMueFtpbmRleFRocmVlUHJpbWVdICsgY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0pIC8gMjtcbiAgICBjb25zdCB5Q2VudGVyID0gKGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgLy9wbGFjZSB0byBjZW50ZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gICAgfVxuICAgIGxldCBhbmdsZSA9IDA7XG4gICAgaWYgKGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID09IDApXG4gICAgICAgIGFuZ2xlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPiBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gPyBNYXRoLlBJIC8gMiA6IDMgKiBNYXRoLlBJIC8gMjtcbiAgICBlbHNlIGlmIChjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueFtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSA6IDA7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlcml2YXRpdmUgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSAvIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgICAgICBhbmdsZSA9IGRlcml2YXRpdmUgPiAwID8gTWF0aC5QSSAtIE1hdGguYXRhbihkZXJpdmF0aXZlKSA6IE1hdGguYXRhbihkZXJpdmF0aXZlKTtcbiAgICB9XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIHRvIHJpZ2h0XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKVxuICAgICAgICBjb29yZGluYXRlcy54W2ldIC09IHhTaGlmdDtcbiAgICAvL3Jld3JpdGUgbW9sQmxvY2tcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleEVuZCk7XG4gICAgICAgIG1vbEJsb2NrID0gbW9sQmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgICAgICAgIG1vbEJsb2NrLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbW9sQmxvY2s7XG59XG5mdW5jdGlvbiBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgeENlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy54KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLngpKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy55KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLnkpKSAvIDI7XG4gICAgLy9wbGFjZSB0byBjZW50ZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gICAgfVxuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5QSTtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb25zdCB4QWRkID0gY29vcmRpbmF0ZXMueFtpXTtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQgKiBjb3MgLSBjb29yZGluYXRlcy55W2ldICogc2luO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldID0geEFkZCAqIHNpbiArIGNvb3JkaW5hdGVzLnlbaV0gKiBjb3M7XG4gICAgfVxuICAgIC8vcGxhY2UgYmFja1xuICAgIGNvbnN0IHlTaGlmdCA9IE1hdGgubWF4KC4uLmNvb3JkaW5hdGVzLnkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb29yZGluYXRlcy54W2ldICs9IHhDZW50ZXI7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gLT0geVNoaWZ0O1xuICAgIH1cbiAgICAvL3Jld3JpdGUgbW9sQmxvY2tcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleEVuZCk7XG4gICAgICAgIG1vbEJsb2NrID0gbW9sQmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgICAgICAgIG1vbEJsb2NrLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbW9sQmxvY2s7XG59XG5mdW5jdGlvbiBmaXg1UHJpbWUoY29vcmRpbmF0ZXMsIGluZGV4Rml2ZVByaW1lLCBpbmRleFRocmVlUHJpbWUpIHtcbiAgICBjb25zdCBpbmRleEZpdmVQcmltZU5laWdoYm91ciA9IGluZGV4Rml2ZVByaW1lICsgMTtcbiAgICBjb25zdCB4U2hpZnQgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCB5U2hpZnQgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCBiYXNlM1ByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlM1ByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSAtIHlTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdIC0geFNoaWZ0O1xuICAgIGNvbnN0IGJhc2U1UHJpbWVZID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVggPSBiYXNlNVByaW1lWCAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMykgLSBiYXNlNVByaW1lWSAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVkgPSBiYXNlNVByaW1lWCAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMykgKyBiYXNlNVByaW1lWSAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3QgZHggPSBiYXNlNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5ID0gYmFzZTVQcmltZVkgLSBiYXNlM1ByaW1lWTtcbiAgICBjb25zdCBkeFJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5Um90YXRlZCA9IHJvdGF0ZWQ1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgaWYgKE1hdGguc3FydChkeVJvdGF0ZWQgKiBkeVJvdGF0ZWQgKyBkeFJvdGF0ZWQgKiBkeFJvdGF0ZWQpID49IE1hdGguc3FydChkeSAqIGR5ICsgZHggKiBkeCkpIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWCArIHhTaGlmdDtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWSArIHlTaGlmdDtcbiAgICB9XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jaykge1xuICAgIG1vbEJsb2NrID0gbW9sQmxvY2sucmVwbGFjZUFsbCgnXFxyJywgJycpOyAvL2VxdWFsaXplIG9sZCBhbmQgbmV3IHNkZiBzdGFuZGFyZHNcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdDT1VOVFMnKSArIDc7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBhbmQgYm9uZHMgbnVtYmVyXG4gICAgbGV0IGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICBjb25zdCBhdG9tc051bWJlciA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYm9uZHNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgcmV0dXJuIHsgbmF0b206IGF0b21zTnVtYmVyLCBuYm9uZDogYm9uZHNOdW1iZXIgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKSB7XG4gICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tc0JvbmRzTnVtYmVyc1YzMDAwKG1vbEJsb2NrKTtcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBjb25zdCBpbmRleGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgdHlwZXMgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBjb25zdCB4ID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeSA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5uYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICBpbmRleGVzW2ldID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB0eXBlc1tpXSA9IG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB4W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gaW5kZXhFbmQgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgIHlbaV0gPSBwYXJzZUZsb2F0KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4geyBhdG9tSW5kZXg6IGluZGV4ZXMsIGF0b21UeXBlOiB0eXBlcywgeDogeCwgeTogeSB9O1xufVxuIiwiaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCB7IHNlcXVlbmNlVG9Nb2xWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBsaW5rVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMnO1xuaW1wb3J0IHsgZ2V0Rm9ybWF0IH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNkZihhcywgc3MsIG9uZUVudGl0eSwgZml0M2R4KSB7XG4gICAgY29uc3QgZm9ybWF0QXMgPSBnZXRGb3JtYXQoYXMpO1xuICAgIGNvbnN0IGZvcm1hdFNzID0gZ2V0Rm9ybWF0KHNzKTtcbiAgICBjb25zdCBtb2xTUyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChzcywgZmFsc2UsIGZhbHNlLCBmb3JtYXRTcyk7XG4gICAgY29uc3QgbW9sQVMgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoYXMsIHRydWUsIGZhbHNlLCBmb3JtYXRBcyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAob25lRW50aXR5KVxuICAgICAgICByZXN1bHQgPSBsaW5rVjMwMDAoW21vbFNTLCBtb2xBU10sIHRydWUsICFmaXQzZHgpICsgJ1xcblxcbiQkJCRcXG4nO1xuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgbW9sU1MgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgYD4gIDxTZXF1ZW5jZT5cXG5TZW5zZSBTdHJhbmRcXG5cXG4kJCQkXFxuYCArXG4gICAgICAgICAgICAgICAgbW9sQVMgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgYD4gIDxTZXF1ZW5jZT5cXG5BbnRpIFNlbnNlXFxuXFxuJCQkJFxcbmA7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBzcy5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5zZGYnKTtcbiAgICBlbGVtZW50LmNsaWNrKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNlbnNlQW50aVNlbnNlKCkge1xuICAgIGNvbnN0IG1vbGVjdWxlU3ZnRGl2ID0gdWkuYmxvY2soW10pO1xuICAgIGNvbnN0IHNzSW5wdXQgPSB1aS50ZXh0SW5wdXQoJ1NlbnNlIFN0cmFuZCA1XFwnIC0+M1xcJycsICcnKTtcbiAgICBjb25zdCBhc0lucHV0ID0gdWkudGV4dElucHV0KCdBbnRpIFNlbnNlIDNcXCcgLT41XFwnJywgJycpO1xuICAgIGNvbnN0IHNhdmVPcHRpb24gPSB1aS5zd2l0Y2hJbnB1dCgnU2F2ZSBhcyBvbmUgZW50aXR5JywgdHJ1ZSk7XG4gICAgY29uc3Qgc2F2ZTNkeCA9IHVpLnN3aXRjaElucHV0KCdTYXZlIDNkeCcsIHRydWUpO1xuICAgIGNvbnN0IHNhdmVCdG4gPSB1aS5idXR0b24oJ1NhdmUgU0RGJywgKCkgPT4gc2F2ZVNkZihhc0lucHV0LnZhbHVlLCBzc0lucHV0LnZhbHVlLCBzYXZlT3B0aW9uLnZhbHVlLCBzYXZlM2R4LnZhbHVlKSk7XG4gICAgY29uc3Qgc2F2ZVNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgIHVpLmRpdkgoW3VpLmgxKCdJbnB1dHMnKV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdlYoW1xuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW3NzSW5wdXQucm9vdF0pLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW2FzSW5wdXQucm9vdF0pLFxuICAgICAgICAgICAgICAgICAgICBzYXZlT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICBzYXZlM2R4LFxuICAgICAgICAgICAgICAgICAgICB1aS5idXR0b25zSW5wdXQoW3NhdmVCdG5dKSxcbiAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgXSk7XG4gICAgcmV0dXJuIHNhdmVTZWN0aW9uO1xufVxuIiwiLy8gaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG4vLyBpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuLy8gaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IG1hcCwgU1lOVEhFU0laRVJTLCBURUNITk9MT0dJRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZywgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycywgYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzLCBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nLCBnY3JzVG9NZXJtYWRlMTIsIHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmQsIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzLCBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzLCBzaVJuYUJpb1NwcmluZ1RvR2Nycywgc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcywgc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcsIHNpUm5hQXhvbGFic1RvR2Nycywgc2lSbmFHY3JzVG9OdWNsZW90aWRlcywgc2lSbmFHY3JzVG9CaW9TcHJpbmcsIHNpUm5hR2Nyc1RvQXhvbGFicywgZ2Nyc1RvTnVjbGVvdGlkZXMgfSBmcm9tICcuL2NvbnZlcnRlcnMnO1xuY29uc3Qgbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlID0gJ05vIHRyYW5zbGF0aW9uIHRhYmxlIGF2YWlsYWJsZSc7XG5leHBvcnQgY29uc3QgdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSA9ICdUeXBlIG9mIGlucHV0IHNlcXVlbmNlIGlzIHVuZGVmaW5lZCc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0KHNlcXVlbmNlKSB7XG4gICAgY29uc3QgcG9zc2libGVTeW50aGVzaXplcnMgPSBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSk7XG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9IChvdXRwdXRJbmRleCA9PSBzZXF1ZW5jZS5sZW5ndGgpID8gLTEgOiBvdXRwdXRJbmRleDtcbiAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKVxuICAgICAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG4gICAgY29uc3QgcG9zc2libGVUZWNobm9sb2dpZXMgPSBnZXRMaXN0T2ZQb3NzaWJsZVRlY2hub2xvZ2llc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSwgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgb3V0cHV0SW5kZXggPSAwO1xuICAgIHBvc3NpYmxlVGVjaG5vbG9naWVzLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbcG9zc2libGVTeW50aGVzaXplcnNbMF1dW3RlY2hub2xvZ3ldKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwb3NzaWJsZVN5bnRoZXNpemVyc1swXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZm9ybWF0ID09IG51bGwgP1xuICAgICAgICBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkgOlxuICAgICAgICBbZm9ybWF0XTtcbiAgICAvLyBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgIC8vICAgY29uc3Qgc3ludGhlc2l6ZXIgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHN5bnRoZXNpemVyIGZyb20gbGlzdDogJywgcG9zc2libGVTeW50aGVzaXplcnNbMF0sXG4gICAgLy8gIHBvc3NpYmxlU3ludGhlc2l6ZXJzKTtcbiAgICAvLyAgIHVpLmRpYWxvZygnQ2hvb3NlIFN5bnRoZXNpemVyJylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbc3ludGhlc2l6ZXIucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVTeW50aGVzaXplcnMgPSBbc3ludGhlc2l6ZXIudmFsdWVdKVxuICAgIC8vICAgICAub25DYW5jZWwoKCkgPT4ge1xuICAgIC8vICAgICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXTtcbiAgICAvLyAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vICAgICB9KVxuICAgIC8vICAgICAuc2hvdygpO1xuICAgIC8vIH0gZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4geyBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IDAsIHN5bnRoZXNpemVyOiBudWxsLCB0ZWNobm9sb2d5OiBudWxsIH07XG4gICAgbGV0IG91dHB1dEluZGV4ID0gMDtcbiAgICBjb25zdCBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMgPSBbJ3InLCAnZCddO1xuICAgIGNvbnN0IG51Y2xlb3RpZGVzID0gWydBJywgJ1UnLCAnVCcsICdDJywgJ0cnXTtcbiAgICBwb3NzaWJsZVN5bnRoZXNpemVycy5mb3JFYWNoKChzeW50aGVzaXplcikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcik7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgICAgICBzeW50aGVzaXplcjogcG9zc2libGVTeW50aGVzaXplcnMsXG4gICAgICAgICAgICB0ZWNobm9sb2d5OiBudWxsLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSk7XG4gICAgLy8gaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyAgIGNvbnN0IHRlY2hub2xvZ3kgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHRlY2hub2xvZ3kgZnJvbSBsaXN0OiAnLCBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSxcbiAgICAvLyBwb3NzaWJsZVRlY2hub2xvZ2llcyk7XG4gICAgLy8gICB1aS5kaWFsb2coJ0Nob29zZSBUZWNobm9sb2d5JylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbdGVjaG5vbG9neS5yb290XSwge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnfX0pKVxuICAgIC8vICAgICAub25PSygoKSA9PiBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IFt0ZWNobm9sb2d5LnZhbHVlXSlcbiAgICAvLyAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAvLyAgICAgICBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IFtwb3NzaWJsZVRlY2hub2xvZ2llc1swXV07XG4gICAgLy8gICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdJbnB1dCBzZXF1ZW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbiBmb3JtYXQgJyArIHBvc3NpYmxlVGVjaG5vbG9naWVzWzBdKTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLnNob3coKTtcbiAgICAvLyB9IGVsc2UgaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA9PSAwKVxuICAgIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzLFxuICAgICAgICB0ZWNobm9sb2d5OiBbcG9zc2libGVUZWNobm9sb2dpZXNbb3V0cHV0SW5kZXhdXSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKSB7XG4gICAgbGV0IGNvZGVzID0gW107XG4gICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKVxuICAgICAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKSk7XG4gICAgcmV0dXJuIGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSk7XG59XG5mdW5jdGlvbiBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkge1xuICAgIGNvbnN0IHN5bnRoZXNpemVycyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaCgoc3ludGhlc2l6ZXIpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBnZXRBbGxDb2Rlc09mU3ludGhlc2l6ZXIoc3ludGhlc2l6ZXIpO1xuICAgICAgICAvL1RPRE86IGdldCBmaXJzdCBub24tZHJvcGRvd24gY29kZSB3aGVuIHRoZXJlIGFyZSB0d28gbW9kaWZpY2F0aW9uc1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcXVlbmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2VxdWVuY2VbaV0gPT0gJyknICYmIGkgIT0gc2VxdWVuY2UubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGVzLnNvbWUoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgcy5sZW5ndGgpKSlcbiAgICAgICAgICAgIHN5bnRoZXNpemVycy5wdXNoKHN5bnRoZXNpemVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3ludGhlc2l6ZXJzO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVUZWNobm9sb2dpZXNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UsIHN5bnRoZXNpemVyKSB7XG4gICAgY29uc3QgdGVjaG5vbG9naWVzID0gW107XG4gICAgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkuZm9yRWFjaCgodGVjaG5vbG9neSkgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSk7XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKDAsIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICB0ZWNobm9sb2dpZXMucHVzaCh0ZWNobm9sb2d5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVjaG5vbG9naWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRTZXF1ZW5jZShzZXF1ZW5jZSwgb3V0cHV0KSB7XG4gICAgaWYgKG91dHB1dC5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgIT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIHR5cGU6ICcnLFxuICAgICAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBKU09OLnN0cmluZ2lmeShvdXRwdXQpLFxuICAgICAgICAgICAgRXJyb3I6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUykpIHsgLy8mJiBvdXRwdXQudGVjaG5vbG9neSEuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLkROQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2VxdWVuY2UsXG4gICAgICAgICAgICBCaW9TcHJpbmc6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkJJT1NQUklORykgJiYgb3V0cHV0LnRlY2hub2xvZ3kuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkJJT1NQUklORyArICcgJyArIFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IHNlcXVlbmNlLFxuICAgICAgICAgICAgR0NSUzogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTICsgJyAnICsgVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBnY3JzVG9NZXJtYWRlMTIoc2VxdWVuY2UpLFxuICAgICAgICAgICAgR0NSUzogc2VxdWVuY2UsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUykgJiYgb3V0cHV0LnRlY2hub2xvZ3kuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlJOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgKyAnICcgKyBURUNITk9MT0dJRVMuUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5TSV9STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQklPU1BSSU5HICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQmlvU3ByaW5nVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQVhPTEFCUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5BWE9MQUJTICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2VxdWVuY2UsXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUF4b2xhYnNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogZ2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgR0NSUzogc2VxdWVuY2UsXG4gICAgICAgICAgICBNZXJtYWRlMTI6IGdjcnNUb01lcm1hZGUxMihzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLk1FUk1BREVfMTIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuTUVSTUFERV8xMixcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBub1RyYW5zbGF0aW9uVGFibGVBdmFpbGFibGUsXG4gICAgICAgICAgICBHQ1JTOiBub1RyYW5zbGF0aW9uVGFibGVBdmFpbGFibGUsXG4gICAgICAgICAgICBNZXJtYWRlMTI6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICBOdWNsZW90aWRlczogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICB9O1xufVxuIiwiZXhwb3J0IGNvbnN0IFVTRVJTX0NTViA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBERzsiLCJtb2R1bGUuZXhwb3J0cyA9IE9DTDsiLCJtb2R1bGUuZXhwb3J0cyA9IGdyb2s7IiwibW9kdWxlLmV4cG9ydHMgPSB1aTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKiBEbyBub3QgY2hhbmdlIHRoZXNlIGltcG9ydCBsaW5lcy4gRGF0YWdyb2sgd2lsbCBpbXBvcnQgQVBJIGxpYnJhcnkgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyBPQ0wgZnJvbSAnb3BlbmNoZW1saWIvZnVsbC5qcyc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgeyBkZWZpbmVBeG9sYWJzUGF0dGVybiB9IGZyb20gJy4vZGVmaW5lQXhvbGFic1BhdHRlcm4nO1xuaW1wb3J0IHsgc2F2ZVNlbnNlQW50aVNlbnNlIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL3NhdmUtc2Vuc2UtYW50aXNlbnNlJztcbmltcG9ydCB7IHNlcXVlbmNlVG9TbWlsZXMsIHNlcXVlbmNlVG9Nb2xWMzAwMCB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9mcm9tLW1vbm9tZXJzJztcbmltcG9ydCB7IGNvbnZlcnRTZXF1ZW5jZSwgdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSwgaXNWYWxpZFNlcXVlbmNlLCBnZXRGb3JtYXQgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuaW1wb3J0IHsgbWFwLCBDT0xfTkFNRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3MvbWFwJztcbmltcG9ydCB7IFNBTFRTX0NTViB9IGZyb20gJy4vc2FsdHMnO1xuaW1wb3J0IHsgVVNFUlNfQ1NWIH0gZnJvbSAnLi91c2Vycyc7XG5pbXBvcnQgeyBJQ0RTIH0gZnJvbSAnLi9JQ0RzJztcbmltcG9ydCB7IFNPVVJDRVMgfSBmcm9tICcuL3NvdXJjZXMnO1xuaW1wb3J0IHsgSURQUyB9IGZyb20gJy4vSURQcyc7XG5leHBvcnQgY29uc3QgX3BhY2thZ2UgPSBuZXcgREcuUGFja2FnZSgpO1xuY29uc3QgZGVmYXVsdElucHV0ID0gJ2ZBbUNtR21BbUNwc21VJztcbmNvbnN0IHNlcXVlbmNlV2FzQ29waWVkID0gJ0NvcGllZCc7XG5jb25zdCB0b29sdGlwU2VxdWVuY2UgPSAnQ29weSBzZXF1ZW5jZSc7XG4vL25hbWU6IFNlcXVlbmNlIFRyYW5zbGF0b3Jcbi8vdGFnczogYXBwXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUcmFuc2xhdG9yKCkge1xuICAgIGNvbnN0IHdpbmRvd3MgPSBncm9rLnNoZWxsLndpbmRvd3M7XG4gICAgd2luZG93cy5zaG93UHJvcGVydGllcyA9IGZhbHNlO1xuICAgIHdpbmRvd3Muc2hvd1Rvb2xib3ggPSBmYWxzZTtcbiAgICB3aW5kb3dzLnNob3dIZWxwID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gdXBkYXRlVGFibGVBbmRNb2xlY3VsZShzZXF1ZW5jZSwgaW5wdXRGb3JtYXQsIGlzU2V0KSB7XG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBvdXRwdXRUYWJsZURpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdSZW5kZXJpbmcgdGFibGUgYW5kIG1vbGVjdWxlLi4uJyk7XG4gICAgICAgIGxldCBlcnJvcnNFeGlzdCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VxdWVuY2UgPSBzZXF1ZW5jZS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpc1NldClcbiAgICAgICAgICAgICAgICBvdXRwdXQuc3ludGhlc2l6ZXIgPSBbaW5wdXRGb3JtYXRdO1xuICAgICAgICAgICAgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSA9IG91dHB1dC5zeW50aGVzaXplclswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFNlcXVlbmNlT2JqID0gY29udmVydFNlcXVlbmNlKHNlcXVlbmNlLCBvdXRwdXQpO1xuICAgICAgICAgICAgY29uc3QgdGFibGVSb3dzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdXRwdXRTZXF1ZW5jZU9iaikuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA6XG4gICAgICAgICAgICAgICAgICAgIC0xO1xuICAgICAgICAgICAgICAgIGlmICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgOlxuICAgICAgICAgICAgICAgICAgICAgICAgLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgIT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhYmxlUm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKDAsIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdncmV5JyB9IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLnRvb2x0aXAuYmluZCh1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdyZWQnIH0gfSksICdFeHBlY3RlZCBmb3JtYXQ6ICcgKyBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuc3ludGhlc2l6ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLiBTZWUgdGFibGVzIHdpdGggdmFsaWQgY29kZXMgb24gdGhlIHJpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSA6IC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdWkubGluayhvdXRwdXRTZXF1ZW5jZU9ialtrZXldLCAoKSA9PiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChvdXRwdXRTZXF1ZW5jZU9ialtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpLCB0b29sdGlwU2VxdWVuY2UsICcnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvcnNFeGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bnRoZXNpemVyID0gSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLnN5bnRoZXNpemVyLnNsaWNlKDAsIC02KTtcbiAgICAgICAgICAgICAgICBhc29HYXBtZXJzR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykge1xuICAgICAgICAgICAgICAgICAgICBnYy5zdHlsZS5iYWNrQ29sb3IgPSAoZ2MuZ3JpZENvbHVtbi5uYW1lID09IHN5bnRoZXNpemVyKSA/IDB4RkZGMDAwMDAgOiAweEZGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9tZUFuZEZsdW9yb0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2Muc3R5bGUuYmFja0NvbG9yID0gKGdjLmdyaWRDb2x1bW4ubmFtZSA9PSBzeW50aGVzaXplcikgPyAweEZGRjAwMDAwIDogMHhGRkZGRkZGRjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzd2l0Y2hJbnB1dC5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzb0dhcG1lcnNHcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7IGdjLnN0eWxlLmJhY2tDb2xvciA9IDB4RkZGRkZGRkY7IH0pO1xuICAgICAgICAgICAgICAgIG9tZUFuZEZsdW9yb0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHsgZ2Muc3R5bGUuYmFja0NvbG9yID0gMHhGRkZGRkZGRjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRUYWJsZURpdi5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICBERy5IdG1sVGFibGUuY3JlYXRlKHRhYmxlUm93cywgKGl0ZW0pID0+IFtpdGVtLmtleSwgaXRlbS52YWx1ZV0sIFsnQ29kZScsICdTZXF1ZW5jZSddKS5yb290LFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgaWYgKG91dHB1dFNlcXVlbmNlT2JqLnR5cGUgIT0gdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSAmJiBvdXRwdXRTZXF1ZW5jZU9iai5FcnJvciAhPSB1bmRlZmluZWRJbnB1dFNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gdWkuY2FudmFzKDMwMCwgMTcwKTtcbiAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnYgPSB1aS5jYW52YXMoJCh3aW5kb3cpLndpZHRoKCksICQod2luZG93KS5oZWlnaHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbCA9IHNlcXVlbmNlVG9Nb2xWMzAwMChpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZmFsc2UsIHRydWUsIG91dHB1dC5zeW50aGVzaXplclswXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgT0NMLlN0cnVjdHVyZVZpZXcuZHJhd01vbGVjdWxlKGNhbnYsIE9DTC5Nb2xlY3VsZS5mcm9tTW9sZmlsZShtb2wpLCB7IHN1cHByZXNzQ2hpcmFsVGV4dDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGlhbG9nKCdNb2xlY3VsZTogJyArIGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoY2FudilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93TW9kYWwodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgJChjYW52YXMpLm9uKCdtb3VzZW92ZXInLCAoKSA9PiAkKGNhbnZhcykuY3NzKCdjdXJzb3InLCAnem9vbS1pbicpKTtcbiAgICAgICAgICAgICAgICAkKGNhbnZhcykub24oJ21vdXNlb3V0JywgKCkgPT4gJChjYW52YXMpLmNzcygnY3Vyc29yJywgJ2RlZmF1bHQnKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9sID0gc2VxdWVuY2VUb01vbFYzMDAwKGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpLCBmYWxzZSwgdHJ1ZSwgb3V0cHV0LnN5bnRoZXNpemVyWzBdKTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgT0NMLlN0cnVjdHVyZVZpZXcuZHJhd01vbGVjdWxlKGNhbnZhcywgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIG1vbGVjdWxlU3ZnRGl2LmFwcGVuZChjYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1vbGVjdWxlU3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgcGkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnB1dEZvcm1hdENob2ljZUlucHV0ID0gdWkuY2hvaWNlSW5wdXQoJ0lucHV0IGZvcm1hdDogJywgJ0phbnNzZW4gR0NSUyBDb2RlcycsIE9iamVjdC5rZXlzKG1hcCksIChmb3JtYXQpID0+IHtcbiAgICAgICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZm9ybWF0LCB0cnVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBvdXRwdXRUYWJsZURpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRTZXF1ZW5jZUZpZWxkID0gdWkudGV4dElucHV0KCcnLCBkZWZhdWx0SW5wdXQsIChzZXF1ZW5jZSkgPT4gdXBkYXRlVGFibGVBbmRNb2xlY3VsZShzZXF1ZW5jZSwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSwgZmFsc2UpKTtcbiAgICBjb25zdCBhc29EZiA9IERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS01TWUtclUnLCAnQmlvU3ByaW5nJzogJzUnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZVQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdKYW5zc2VuIEdDUlMnOiAnbW9lQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsICdCaW9TcHJpbmcnOiAnNycsICdKYW5zc2VuIEdDUlMnOiAnbW9lNW1DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtckcnLCAnQmlvU3ByaW5nJzogJzgnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnNS1NZXRoeWwtZEMnLCAnQmlvU3ByaW5nJzogJzknLCAnSmFuc3NlbiBHQ1JTJzogJzVtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdwcyBsaW5rYWdlJywgJ0Jpb1NwcmluZyc6ICcqJywgJ0phbnNzZW4gR0NSUyc6ICdwcycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkQScsICdCaW9TcHJpbmcnOiAnQScsICdKYW5zc2VuIEdDUlMnOiAnQSwgZEEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEMnLCAnQmlvU3ByaW5nJzogJ0MnLCAnSmFuc3NlbiBHQ1JTJzogJ0MsIGRDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RHJywgJ0Jpb1NwcmluZyc6ICdHJywgJ0phbnNzZW4gR0NSUyc6ICdHLCBkRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkVCcsICdCaW9TcHJpbmcnOiAnVCcsICdKYW5zc2VuIEdDUlMnOiAnVCwgZFQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckEnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckMnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckcnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnclUnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnclUnIH0sXG4gICAgXSk7XG4gICAgY29uc3QgYXNvR2FwbWVyc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChhc29EZiwgeyBzaG93Um93SGVhZGVyOiBmYWxzZSwgc2hvd0NlbGxUb29sdGlwOiBmYWxzZSB9KTtcbiAgICBhc29EZi5vbkN1cnJlbnRDZWxsQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYXNvRGYuY3VycmVudENlbGwudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdDb3BpZWQnKSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb21lQW5kRmx1b3JvR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tVScsICdCaW9TcHJpbmcnOiAnMScsICdBeG9sYWJzJzogJ1VmJywgJ0phbnNzZW4gR0NSUyc6ICdmVScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1BJywgJ0Jpb1NwcmluZyc6ICcyJywgJ0F4b2xhYnMnOiAnQWYnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUMnLCAnQmlvU3ByaW5nJzogJzMnLCAnQXhvbGFicyc6ICdDZicsICdKYW5zc2VuIEdDUlMnOiAnZkMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tRycsICdCaW9TcHJpbmcnOiAnNCcsICdBeG9sYWJzJzogJ0dmJywgJ0phbnNzZW4gR0NSUyc6ICdmRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJVJywgJ0Jpb1NwcmluZyc6ICc1JywgJ0F4b2xhYnMnOiAndScsICdKYW5zc2VuIEdDUlMnOiAnbVUnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdBeG9sYWJzJzogJ2EnLCAnSmFuc3NlbiBHQ1JTJzogJ21BJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckMnLCAnQmlvU3ByaW5nJzogJzcnLCAnQXhvbGFicyc6ICdjJywgJ0phbnNzZW4gR0NSUyc6ICdtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJHJywgJ0Jpb1NwcmluZyc6ICc4JywgJ0F4b2xhYnMnOiAnZycsICdKYW5zc2VuIEdDUlMnOiAnbUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAncHMgbGlua2FnZScsICdCaW9TcHJpbmcnOiAnKicsICdBeG9sYWJzJzogJ3MnLCAnSmFuc3NlbiBHQ1JTJzogJ3BzJyB9LFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIGNvbnN0IG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChERy5EYXRhRnJhbWUuZnJvbUNvbHVtbnMoW1xuICAgICAgICBERy5Db2x1bW4uZnJvbVN0cmluZ3MoJ05hbWUnLCBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSksXG4gICAgXSksIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UgfSk7XG4gICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShkZWZhdWx0SW5wdXQsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUsIHRydWUpO1xuICAgIGNvbnN0IGFwcE1haW5EZXNjcmlwdGlvbiA9IHVpLmluZm8oW1xuICAgICAgICB1aS5kaXZUZXh0KCdIb3cgdG8gY29udmVydCBvbmUgc2VxdWVuY2U6JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCdQYXN0ZSBzZXF1ZW5jZSBpbnRvIHRoZSB0ZXh0IGZpZWxkIGJlbG93JyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1xcbiBIb3cgdG8gY29udmVydCBtYW55IHNlcXVlbmNlczonLCB7IHN0eWxlOiB7ICdmb250LXdlaWdodCc6ICdib2xkZXInIH0gfSksXG4gICAgICAgIHVpLmRpdlRleHQoJzEuIERyYWcgJiBkcm9wIGFuIEV4Y2VsIG9yIENTViBmaWxlIHdpdGggc2VxdWVuY2VzIGludG8gRGF0YWdyb2snKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMi4gUmlnaHQtY2xpY2sgb24gdGhlIGNvbHVtbiBoZWFkZXIsIHRoZW4gc2VlIHRoZSBcXCdDb252ZXJ0XFwnIG1lbnUnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnVGhpcyB3aWxsIGFkZCB0aGUgcmVzdWx0IGNvbHVtbiB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlJyksXG4gICAgXSwgJ0NvbnZlcnQgb2xpZ29udWNsZW90aWRlIHNlcXVlbmNlcyBiZXR3ZWVuIE51Y2xlb3RpZGVzLCBCaW9TcHJpbmcsIEF4b2xhYnMsIE1lcm1hZGUgMTIgYW5kIEdDUlMgcmVwcmVzZW50YXRpb25zLicpO1xuICAgIGNvbnN0IGNvZGVzVGFibGVzRGl2ID0gdWkuc3BsaXRWKFtcbiAgICAgICAgdWkuYm94KHVpLmgyKCdBU08gR2FwbWVycycpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIGFzb0dhcG1lcnNHcmlkLnJvb3QsXG4gICAgICAgIHVpLmJveCh1aS5oMignMlxcJy1PTWUgYW5kIDJcXCctRiBzaVJOQScpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIG9tZUFuZEZsdW9yb0dyaWQucm9vdCxcbiAgICAgICAgdWkuYm94KHVpLmgyKCdPdmVyaGFuZyBtb2RpZmljYXRpb25zJyksIHsgc3R5bGU6IHsgbWF4SGVpZ2h0OiAnNDBweCcgfSB9KSxcbiAgICAgICAgb3ZlcmhhbmdNb2RpZmljYXRpb25zR3JpZC5yb290LFxuICAgIF0sIHsgc3R5bGU6IHsgbWF4V2lkdGg6ICczNTBweCcgfSB9KTtcbiAgICBjb25zdCB0YWJDb250cm9sID0gdWkudGFiQ29udHJvbCh7XG4gICAgICAgICdNQUlOJzogdWkuYm94KHVpLnNwbGl0SChbXG4gICAgICAgICAgICB1aS5zcGxpdFYoW1xuICAgICAgICAgICAgICAgIHVpLnBhbmVsKFtcbiAgICAgICAgICAgICAgICAgICAgYXBwTWFpbkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuaDEoJ0lucHV0IHNlcXVlbmNlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2VxdWVuY2VGaWVsZC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSwgJ2lucHV0LWJhc2UnKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ2lucHV0U2VxdWVuY2UnKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtpbnB1dEZvcm1hdENob2ljZUlucHV0XSwgeyBzdHlsZTogeyBwYWRkaW5nOiAnNXB4IDAnIH0gfSksXG4gICAgICAgICAgICAgICAgICAgIHVpLmJsb2NrKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmgxKCdPdXRwdXQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRhYmxlRGl2LFxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgICAgICAgICAgICAgXSwgJ3NlcXVlbmNlJyksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNvZGVzVGFibGVzRGl2LFxuICAgICAgICBdLCB7IHN0eWxlOiB7IGhlaWdodDogJzEwMCUnLCB3aWR0aDogJzEwMCUnIH0gfSkpLFxuICAgICAgICAnQVhPTEFCUyc6IGRlZmluZUF4b2xhYnNQYXR0ZXJuKCksXG4gICAgICAgICdTREYnOiBzYXZlU2Vuc2VBbnRpU2Vuc2UoKSxcbiAgICB9KTtcbiAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC5uZXdWaWV3KCdTZXF1ZW5jZSBUcmFuc2xhdG9yJywgW3RhYkNvbnRyb2xdKTtcbiAgICB2LmJveCA9IHRydWU7XG4gICAgY29uc3Qgc3dpdGNoSW5wdXQgPSB1aS5zd2l0Y2hJbnB1dCgnQ29kZXMnLCB0cnVlLCAodikgPT4gKHYpID9cbiAgICAgICAgJChjb2Rlc1RhYmxlc0Rpdikuc2hvdygpIDpcbiAgICAgICAgJChjb2Rlc1RhYmxlc0RpdikuaGlkZSgpKTtcbiAgICBjb25zdCB0b3BQYW5lbCA9IFtcbiAgICAgICAgdWkuaWNvbkZBKCdkb3dubG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcXVlbmNlVG9Nb2xWMzAwMChpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZmFsc2UsIGZhbHNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlc3VsdCkpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJykgKyAnLm1vbCcpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgICAgICB9LCAnU2F2ZSAubW9sIGZpbGUnKSxcbiAgICAgICAgdWkuaWNvbkZBKCdjb3B5JywgKCkgPT4ge1xuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VxdWVuY2VUb1NtaWxlcyhpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZmFsc2UsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpO1xuICAgICAgICB9LCAnQ29weSBTTUlMRVMnKSxcbiAgICAgICAgc3dpdGNoSW5wdXQucm9vdCxcbiAgICBdO1xuICAgIHRhYkNvbnRyb2wub25UYWJDaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdi5zZXRSaWJib25QYW5lbHMoWyh0YWJDb250cm9sLmN1cnJlbnRQYW5lLm5hbWUgPT0gJ01BSU4nKSA/IHRvcFBhbmVsIDogW11dKSk7XG4gICAgdi5zZXRSaWJib25QYW5lbHMoW3RvcFBhbmVsXSk7XG59XG5mdW5jdGlvbiBzYXZlVGFibGVBc1NkRmlsZSh0YWJsZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdGFibGUuY29sdW1ucy5jb250YWlucygnQ29tcG91bmQgTmFtZScpKSB7XG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0ZpbGUgc2F2ZWQgd2l0aG91dCBjb2x1bW5zIFxcJycgK1xuICAgICAgICAgICAgICAgIFtDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSwgQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTLCBDT0xfTkFNRVMuQ1BEX01XLFxuICAgICAgICAgICAgICAgICAgICBDT0xfTkFNRVMuU0FMVF9NQVNTLCBDT0xfTkFNRVMuQkFUQ0hfTVddLmpvaW4oJ1xcJywgXFwnJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZUNvbHVtbiA9IHRhYmxlLmNvbChDT0xfTkFNRVMuU0VRVUVOQ0UpO1xuICAgICAgICBjb25zdCB0eXBlQ29sdW1uID0gdGFibGUuY29sKENPTF9OQU1FUy5UWVBFKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldEZvcm1hdChzdHJ1Y3R1cmVDb2x1bW4uZ2V0KGkpKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSAodHlwZUNvbHVtbi5nZXQoaSkgPT0gJ1NTJykgP1xuICAgICAgICAgICAgICAgIHNlcXVlbmNlVG9Nb2xWMzAwMChzdHJ1Y3R1cmVDb2x1bW4uZ2V0KGkpLCBmYWxzZSwgdHJ1ZSwgZm9ybWF0KSArICdcXG4nICsgYD4gIDxTZXF1ZW5jZT5cXG5TZW5zZSBTdHJhbmRcXG5cXG5gIDpcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZVRvTW9sVjMwMDAoc3RydWN0dXJlQ29sdW1uLmdldChpKSwgdHJ1ZSwgdHJ1ZSwgZm9ybWF0KSArICdcXG4nICsgYD4gIDxTZXF1ZW5jZT5cXG5BbnRpIFNlbnNlXFxuXFxuYDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRhYmxlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLm5hbWUgIT0gQ09MX05BTUVTLlNFUVVFTkNFKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYD4gIDwke2NvbC5uYW1lfT5cXG4ke2NvbC5nZXQoaSl9XFxuXFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSAnJCQkJFxcblxcbic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgdGFibGUubmFtZSArICcuc2RmJyk7XG4gICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICB9KTtcbn1cbmNvbnN0IHdlaWdodHNPYmogPSB7fTtcbmZvciAoY29uc3Qgc3ludGhlc2l6ZXIgb2YgT2JqZWN0LmtleXMobWFwKSkge1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICB3ZWlnaHRzT2JqW2NvZGVdID0gbWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XVtjb2RlXS53ZWlnaHQ7XG4gICAgfVxufVxuZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoTU9ESUZJQ0FUSU9OUykpXG4gICAgd2VpZ2h0c09ialtrZXldID0gdmFsdWUubW9sZWN1bGFyV2VpZ2h0O1xuZnVuY3Rpb24gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtcyhpdGVtcykge1xuICAgIHJldHVybiAnW1wiJyArIGl0ZW1zLmpvaW4oJ1wiLCBcIicpICsgJ1wiXSc7XG59XG5mdW5jdGlvbiBtb2xlY3VsYXJXZWlnaHQoc2VxdWVuY2UsIHdlaWdodHNPYmopIHtcbiAgICBjb25zdCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKHdlaWdodHNPYmopKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgIGxldCB3ZWlnaHQgPSAwO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIHdlaWdodCArPSB3ZWlnaHRzT2JqW3NlcXVlbmNlLnNsaWNlKGksIGkgKyBtYXRjaGVkQ29kZS5sZW5ndGgpXTtcbiAgICAgICAgaSArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB3ZWlnaHQgLSA2MS45Nztcbn1cbi8vdGFnczogYXV0b3N0YXJ0XG5leHBvcnQgZnVuY3Rpb24gYXV0b3N0YXJ0T2xpZ29TZEZpbGVTdWJzY3JpcHRpb24oKSB7XG4gICAgZ3Jvay5ldmVudHMub25WaWV3QWRkZWQuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICAgIGlmICh2LnR5cGUgPT0gJ1RhYmxlVmlldycgJiYgdi5kYXRhRnJhbWUuY29sdW1ucy5jb250YWlucyhDT0xfTkFNRVMuVFlQRSkpXG4gICAgICAgICAgICBvbGlnb1NkRmlsZSh2LmRhdGFGcmFtZSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2xpZ29TZEZpbGUodGFibGUpIHtcbiAgICBjb25zdCBzYWx0c0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoU0FMVFNfQ1NWKTtcbiAgICBjb25zdCB1c2Vyc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoVVNFUlNfQ1NWKTtcbiAgICBjb25zdCBzb3VyY2VzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihTT1VSQ0VTKTtcbiAgICBjb25zdCBpY2RzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihJQ0RTKTtcbiAgICBjb25zdCBpZHBzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihJRFBTKTtcbiAgICBmdW5jdGlvbiBhZGRDb2x1bW5zKHQsIHNhbHRzRGYpIHtcbiAgICAgICAgaWYgKHQuY29sdW1ucy5jb250YWlucyhDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSkpXG4gICAgICAgICAgICByZXR1cm4gZ3Jvay5zaGVsbC5lcnJvcignQ29sdW1ucyBhbHJlYWR5IGV4aXN0IScpO1xuICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IHQuY29sKENPTF9OQU1FUy5TRVFVRU5DRSk7XG4gICAgICAgIGNvbnN0IHNhbHQgPSB0LmNvbChDT0xfTkFNRVMuU0FMVCk7XG4gICAgICAgIGNvbnN0IGVxdWl2YWxlbnRzID0gdC5jb2woQ09MX05BTUVTLkVRVUlWQUxFTlRTKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld1N0cmluZyhDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSkuaW5pdCgoaSkgPT4gc2VxdWVuY2UuZ2V0KGkpKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld1N0cmluZyhDT0xfTkFNRVMuQ09NUE9VTkRfQ09NTUVOVFMpLmluaXQoKGkpID0+IChpID4gMCAmJiBpICUgMiA9PSAwKSA/XG4gICAgICAgICAgICBzZXF1ZW5jZS5nZXRTdHJpbmcoaSkgKyAnOyBkdXBsZXggb2YgU1M6ICcgKyBzZXF1ZW5jZS5nZXRTdHJpbmcoaSAtIDIpICsgJyBhbmQgQVM6ICcgKyBzZXF1ZW5jZS5nZXRTdHJpbmcoaSAtIDEpIDpcbiAgICAgICAgICAgIHNlcXVlbmNlLmdldFN0cmluZyhpKSk7XG4gICAgICAgIGNvbnN0IG1vbFdlaWdodENvbCA9IHNhbHRzRGYuY29sKCdNT0xXRUlHSFQnKTtcbiAgICAgICAgY29uc3Qgc2FsdE5hbWVzTGlzdCA9IHNhbHRzRGYuY29sKCdESVNQTEFZJykudG9MaXN0KCk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdGbG9hdChDT0xfTkFNRVMuQ1BEX01XKVxuICAgICAgICAgICAgLmluaXQoKGkpID0+IG1vbGVjdWxhcldlaWdodChzZXF1ZW5jZS5nZXQoaSksIHdlaWdodHNPYmopKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5TQUxUX01BU1MpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNhbHRSb3dJbmRleCA9IHNhbHROYW1lc0xpc3QuaW5kZXhPZihzYWx0LmdldChpKSk7XG4gICAgICAgICAgICBjb25zdCBtdyA9IG1vbFdlaWdodENvbC5nZXQoc2FsdFJvd0luZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBtdyAqIGVxdWl2YWxlbnRzLmdldChpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdDYWxjdWxhdGVkKENPTF9OQU1FUy5CQVRDSF9NVywgJyR7JyArIENPTF9OQU1FUy5DUERfTVcgKyAnfSArICR7JyArIENPTF9OQU1FUy5TQUxUX01BU1MgKyAnfScsIERHLkNPTFVNTl9UWVBFLkZMT0FULCBmYWxzZSk7XG4gICAgICAgIGFkZENvbHVtbnNQcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ld0RmID0gdDtcbiAgICB9XG4gICAgbGV0IG5ld0RmO1xuICAgIGxldCBhZGRDb2x1bW5zUHJlc3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGQgPSB1aS5kaXYoW1xuICAgICAgICB1aS5pY29ucy5lZGl0KCgpID0+IHtcbiAgICAgICAgICAgIGQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBpZiAodGFibGUuY29sKENPTF9OQU1FUy5JRFApLnR5cGUgIT0gREcuQ09MVU1OX1RZUEUuU1RSSU5HKVxuICAgICAgICAgICAgICAgIHRhYmxlLmNoYW5nZUNvbHVtblR5cGUoQ09MX05BTUVTLklEUCwgREcuQ09MVU1OX1RZUEUuU1RSSU5HKTtcbiAgICAgICAgICAgIGQuYXBwZW5kKHVpLmxpbmsoJ0FkZCBDb2x1bW5zJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFkZENvbHVtbnModGFibGUsIHNhbHRzRGYpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwudGFibGVWaWV3KHRhYmxlLm5hbWUpLmdyaWQuY29sdW1ucy5zZXRPcmRlcihPYmplY3QudmFsdWVzKENPTF9OQU1FUykpO1xuICAgICAgICAgICAgfSwgJ0FkZCBjb2x1bW5zOiBcXCcnICsgW0NPTF9OQU1FUy5DT01QT1VORF9OQU1FLCBDT0xfTkFNRVMuQ09NUE9VTkRfQ09NTUVOVFMsIENPTF9OQU1FUy5DUERfTVcsXG4gICAgICAgICAgICAgICAgQ09MX05BTUVTLlNBTFRfTUFTUywgQ09MX05BTUVTLkJBVENIX01XXS5qb2luKCdcXCcsIFxcJycpLCAnJyksIHVpLmJ1dHRvbignU2F2ZSBTRCBmaWxlJywgKCkgPT4gc2F2ZVRhYmxlQXNTZEZpbGUoYWRkQ29sdW1uc1ByZXNzZWQgPyBuZXdEZiA6IHRhYmxlKSkpO1xuICAgICAgICAgICAgY29uc3QgdmlldyA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLlRZUEUpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsICdbXCJBU1wiLCBcIlNTXCIsIFwiRHVwbGV4XCJdJyk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuT1dORVIpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKHVzZXJzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuU0FMVCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXMoc2FsdHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5TT1VSQ0UpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKHNvdXJjZXNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5JQ0QpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKGljZHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5JRFApLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKGlkcHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIGdyb2suZXZlbnRzLm9uQ29udGV4dE1lbnUuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFtDT0xfTkFNRVMuVFlQRSwgQ09MX05BTUVTLk9XTkVSLCBDT0xfTkFNRVMuU0FMVCwgQ09MX05BTUVTLlNPVVJDRSwgQ09MX05BTUVTLklDRCwgQ09MX05BTUVTLklEUF1cbiAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGVzKGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2wubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnRmlsbCBDb2x1bW4gV2l0aCBWYWx1ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q2VsbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDZWxsLmNvbHVtbi5pbml0KHYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgXSk7XG4gICAgZ3Jvay5zaGVsbC52LnNldFJpYmJvblBhbmVscyhbW2RdXSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
5479
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxnREFBZ0Q7QUFDaEQsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsK0NBQStDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzViTTtBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7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QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxvQkFBb0I7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtFQUF3QjtBQUNoRCxxQkFBcUIsOERBQW9CO0FBQ2xDO0FBQ1A7QUFDQSw0Q0FBNEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaHRCNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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NUI7QUFDQSxnQkFBZ0IsOERBQW9CLGlEQUFpRCw0REFBUztBQUM5RixhQUFhLHVCQUF1QiwwRUFBdUIsRUFBRSw4RUFBMkIsRUFBRSxtRUFBZ0I7QUFDMUcsZ0JBQWdCLHNFQUFtQixFQUFFLHFFQUFrQix1QkFBdUIsbURBQVM7QUFDdkYseUJBQXlCLGlFQUF1QjtBQUNoRCwyQkFBMkIsaUVBQWMsU0FBUyx5REFBZTtBQUNqRSwyQkFBMkIsa0VBQWUsU0FBUyx5REFBZTtBQUNsRSwyQkFBMkIsaUVBQWMsU0FBUyx5REFBZTtBQUNqRSwyQkFBMkIsbUVBQWdCLFNBQVMseURBQWU7QUFDbkUsMkJBQTJCLGdFQUFhLFNBQVMseURBQWU7QUFDaEUsMkJBQTJCLGdFQUFhLFNBQVMseURBQWU7QUFDaEUsWUFBWSw2RUFBbUM7QUFDL0MscUJBQXFCLGlFQUFjLEVBQUUsa0VBQWUsRUFBRSxpRUFBYyxFQUFFLG1FQUFnQixFQUFFLGdFQUFhLEVBQUUsZ0VBQWE7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsSUFBSSxzRUFBNEI7QUFDaEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvY2FzaC1kb20vZGlzdC9jYXNoLmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9zYXZlLXN2Zy1hcy1wbmcvbGliL3NhdmVTdmdBc1BuZy5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSUNEcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSURQcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvYXhvbGFic01hcC50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvZGVmaW5lQXhvbGFic1BhdHRlcm4udHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2RyYXdBeG9sYWJzUGF0dGVybi50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc2FsdHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3NvdXJjZXMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvY29udmVydGVycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9mcm9tLW1vbm9tZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21hcC50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9tb2wtdHJhbnNmb3JtYXRpb25zLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL3NhdmUtc2Vuc2UtYW50aXNlbnNlLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy91c2Vycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiREdcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiZ3Jva1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJ1aVwiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvcGFja2FnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBNSVQgaHR0cHM6Ly9naXRodWIuY29tL2ZhYmlvc3BhbXBpbmF0by9jYXNoICovXG4oZnVuY3Rpb24oKXtcblwidXNlIHN0cmljdFwiO1xuXG52YXIgcHJvcE1hcCA9IHtcbiAgLyogR0VORVJBTCAqL1xuICBcImNsYXNzXCI6ICdjbGFzc05hbWUnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuXG4gIC8qIExBQkVMICovXG4gIFwiZm9yXCI6ICdodG1sRm9yJyxcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG5cbiAgLyogVEFCTEUgKi9cbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICByb3dzcGFuOiAncm93U3BhbicsXG5cbiAgLyogSU1BR0UgKi9cbiAgdXNlbWFwOiAndXNlTWFwJ1xufTtcblxuZnVuY3Rpb24gYXR0ZW1wdChmbiwgYXJnKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGFyZyk7XG4gIH0gY2F0Y2ggKF9hKSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfVxufVxuXG52YXIgZG9jID0gZG9jdW1lbnQsXG4gICAgd2luID0gd2luZG93LFxuICAgIGRvY0VsZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgY3JlYXRlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50LmJpbmQoZG9jKSxcbiAgICBkaXYgPSBjcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICB0YWJsZSA9IGNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyksXG4gICAgdGJvZHkgPSBjcmVhdGVFbGVtZW50KCd0Ym9keScpLFxuICAgIHRyID0gY3JlYXRlRWxlbWVudCgndHInKSxcbiAgICBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSxcbiAgICBjb25jYXQgPSBBcnJheVByb3RvdHlwZS5jb25jYXQsXG4gICAgZmlsdGVyID0gQXJyYXlQcm90b3R5cGUuZmlsdGVyLFxuICAgIGluZGV4T2YgPSBBcnJheVByb3RvdHlwZS5pbmRleE9mLFxuICAgIG1hcCA9IEFycmF5UHJvdG90eXBlLm1hcCxcbiAgICBwdXNoID0gQXJyYXlQcm90b3R5cGUucHVzaCxcbiAgICBzbGljZSA9IEFycmF5UHJvdG90eXBlLnNsaWNlLFxuICAgIHNvbWUgPSBBcnJheVByb3RvdHlwZS5zb21lLFxuICAgIHNwbGljZSA9IEFycmF5UHJvdG90eXBlLnNwbGljZTtcbnZhciBpZFJlID0gL14jKD86W1xcdy1dfFxcXFwufFteXFx4MDAtXFx4YTBdKSokLyxcbiAgICBjbGFzc1JlID0gL15cXC4oPzpbXFx3LV18XFxcXC58W15cXHgwMC1cXHhhMF0pKiQvLFxuICAgIGh0bWxSZSA9IC88Lis+LyxcbiAgICB0YWdSZSA9IC9eXFx3KyQvOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBmaW5kKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHJldHVybiAhc2VsZWN0b3IgfHwgIWlzRG9jdW1lbnQoY29udGV4dCkgJiYgIWlzRWxlbWVudChjb250ZXh0KSA/IFtdIDogY2xhc3NSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShzZWxlY3Rvci5zbGljZSgxKSkgOiB0YWdSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpIDogY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbn0gLy8gQHJlcXVpcmUgLi9maW5kLnRzXG4vLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbnZhciBDYXNoID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FzaChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICBpZiAoaXNDYXNoKHNlbGVjdG9yKSkgcmV0dXJuIHNlbGVjdG9yO1xuICAgIHZhciBlbGVzID0gc2VsZWN0b3I7XG5cbiAgICBpZiAoaXNTdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgICB2YXIgY3R4ID0gKGlzQ2FzaChjb250ZXh0KSA/IGNvbnRleHRbMF0gOiBjb250ZXh0KSB8fCBkb2M7XG4gICAgICBlbGVzID0gaWRSZS50ZXN0KHNlbGVjdG9yKSA/IGN0eC5nZXRFbGVtZW50QnlJZChzZWxlY3Rvci5zbGljZSgxKSkgOiBodG1sUmUudGVzdChzZWxlY3RvcikgPyBwYXJzZUhUTUwoc2VsZWN0b3IpIDogZmluZChzZWxlY3RvciwgY3R4KTtcbiAgICAgIGlmICghZWxlcykgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KHNlbGVjdG9yKTsgLy9GSVhNRTogYGZuLnJlYWR5YCBpcyBub3QgaW5jbHVkZWQgaW4gYGNvcmVgLCBidXQgaXQncyBhY3R1YWxseSBhIGNvcmUgZnVuY3Rpb25hbGl0eVxuICAgIH1cblxuICAgIGlmIChlbGVzLm5vZGVUeXBlIHx8IGVsZXMgPT09IHdpbikgZWxlcyA9IFtlbGVzXTtcbiAgICB0aGlzLmxlbmd0aCA9IGVsZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGVsZXNbaV07XG4gICAgfVxuICB9XG5cbiAgQ2FzaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgQ2FzaChzZWxlY3RvciwgY29udGV4dCk7XG4gIH07XG5cbiAgcmV0dXJuIENhc2g7XG59KCk7XG5cbnZhciBmbiA9IENhc2gucHJvdG90eXBlLFxuICAgIGNhc2ggPSBmbi5pbml0O1xuY2FzaC5mbiA9IGNhc2gucHJvdG90eXBlID0gZm47IC8vIEVuc3VyaW5nIHRoYXQgYGNhc2ggKCkgaW5zdGFuY2VvZiBjYXNoYFxuXG5mbi5sZW5ndGggPSAwO1xuZm4uc3BsaWNlID0gc3BsaWNlOyAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBnZXRzIHByaW50ZWQgYXMgYXJyYXktbGlrZSBpbiBDaHJvbWUncyBkZXZ0b29sc1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBpcyBpdGVyYWJsZVxuICBmbltTeW1ib2xbJ2l0ZXJhdG9yJ11dID0gQXJyYXlQcm90b3R5cGVbU3ltYm9sWydpdGVyYXRvciddXTtcbn1cblxuZm4ubWFwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBjYXNoKGNvbmNhdC5hcHBseShbXSwgbWFwLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjYWxsYmFjay5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSkpKTtcbn07XG5cbmZuLnNsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGNhc2goc2xpY2UuY2FsbCh0aGlzLCBzdGFydCwgZW5kKSk7XG59OyAvLyBAcmVxdWlyZSAuL2Nhc2gudHNcblxuXG52YXIgZGFzaEFscGhhUmUgPSAvLShbYS16XSkvZztcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoZGFzaEFscGhhUmUsIGZ1bmN0aW9uIChtYXRjaCwgbGV0dGVyKSB7XG4gICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxuY2FzaC5ndWlkID0gMTsgLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG5cbmZ1bmN0aW9uIG1hdGNoZXMoZWxlLCBzZWxlY3Rvcikge1xuICB2YXIgbWF0Y2hlcyA9IGVsZSAmJiAoZWxlWydtYXRjaGVzJ10gfHwgZWxlWyd3ZWJraXRNYXRjaGVzU2VsZWN0b3InXSB8fCBlbGVbJ21zTWF0Y2hlc1NlbGVjdG9yJ10pO1xuICByZXR1cm4gISFtYXRjaGVzICYmICEhc2VsZWN0b3IgJiYgbWF0Y2hlcy5jYWxsKGVsZSwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBpc0Nhc2goeCkge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIENhc2g7XG59XG5cbmZ1bmN0aW9uIGlzV2luZG93KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4ID09PSB4LndpbmRvdztcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudCh4KSB7XG4gIHJldHVybiAhIXggJiYgeC5ub2RlVHlwZSA9PT0gOTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSAxO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh4KSB7XG4gIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbCh4KSB7XG4gIHJldHVybiB4ID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bWVyaWMoeCkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQoeCkpICYmIGlzRmluaXRlKHgpO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHgpIHtcbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB4ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih4KTtcbiAgcmV0dXJuIHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5jYXNoLmlzV2luZG93ID0gaXNXaW5kb3c7XG5jYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuY2FzaC5pc0FycmF5ID0gaXNBcnJheTtcbmNhc2guaXNOdW1lcmljID0gaXNOdW1lcmljO1xuY2FzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcblxuZm4uZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIGlmIChpc1VuZGVmaW5lZChpbmRleCkpIHJldHVybiBzbGljZS5jYWxsKHRoaXMpO1xuICBpbmRleCA9IE51bWJlcihpbmRleCk7XG4gIHJldHVybiB0aGlzW2luZGV4IDwgMCA/IGluZGV4ICsgdGhpcy5sZW5ndGggOiBpbmRleF07XG59O1xuXG5mbi5lcSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICByZXR1cm4gY2FzaCh0aGlzLmdldChpbmRleCkpO1xufTtcblxuZm4uZmlyc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVxKDApO1xufTtcblxuZm4ubGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZXEoLTEpO1xufTtcblxuZnVuY3Rpb24gZWFjaChhcnIsIGNhbGxiYWNrLCBfcmV2ZXJzZSkge1xuICBpZiAoX3JldmVyc2UpIHtcbiAgICB2YXIgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJbaV0sIGksIGFycltpXSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFycikpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltrZXldLCBrZXksIGFycltrZXldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2ldLCBpLCBhcnJbaV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5jYXNoLmVhY2ggPSBlYWNoO1xuXG5mbi5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBlYWNoKHRoaXMsIGNhbGxiYWNrKTtcbn07XG5cbmZuLnByb3AgPSBmdW5jdGlvbiAocHJvcCwgdmFsdWUpIHtcbiAgaWYgKCFwcm9wKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKHByb3ApKSB7XG4gICAgcHJvcCA9IHByb3BNYXBbcHJvcF0gfHwgcHJvcDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIHRoaXNbMF1bcHJvcF07XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBlbGVbcHJvcF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5wcm9wKGtleSwgcHJvcFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlUHJvcCA9IGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGRlbGV0ZSBlbGVbcHJvcE1hcFtwcm9wXSB8fCBwcm9wXTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBzb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICB2YXIgZGVlcCA9IGlzQm9vbGVhbihzb3VyY2VzWzBdKSA/IHNvdXJjZXMuc2hpZnQoKSA6IGZhbHNlLFxuICAgICAgdGFyZ2V0ID0gc291cmNlcy5zaGlmdCgpLFxuICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIGlmICghdGFyZ2V0KSByZXR1cm4ge307XG4gIGlmICghbGVuZ3RoKSByZXR1cm4gZXh0ZW5kKGRlZXAsIGNhc2gsIHRhcmdldCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKGRlZXAgJiYgKGlzQXJyYXkoc291cmNlW2tleV0pIHx8IGlzUGxhaW5PYmplY3Qoc291cmNlW2tleV0pKSkge1xuICAgICAgICBpZiAoIXRhcmdldFtrZXldIHx8IHRhcmdldFtrZXldLmNvbnN0cnVjdG9yICE9PSBzb3VyY2Vba2V5XS5jb25zdHJ1Y3RvcikgdGFyZ2V0W2tleV0gPSBuZXcgc291cmNlW2tleV0uY29uc3RydWN0b3IoKTtcbiAgICAgICAgZXh0ZW5kKGRlZXAsIHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNhc2guZXh0ZW5kID0gZXh0ZW5kO1xuXG5mbi5leHRlbmQgPSBmdW5jdGlvbiAocGx1Z2lucykge1xuICByZXR1cm4gZXh0ZW5kKGZuLCBwbHVnaW5zKTtcbn07IC8vIEByZXF1aXJlIC4vbWF0Y2hlcy50c1xuLy8gQHJlcXVpcmUgLi90eXBlX2NoZWNraW5nLnRzXG5cblxuZnVuY3Rpb24gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKGNvbXBhcmF0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBtYXRjaGVzKGVsZSwgY29tcGFyYXRvcik7XG4gIH0gOiBpc0Z1bmN0aW9uKGNvbXBhcmF0b3IpID8gY29tcGFyYXRvciA6IGlzQ2FzaChjb21wYXJhdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gY29tcGFyYXRvci5pcyhlbGUpO1xuICB9IDogIWNvbXBhcmF0b3IgPyBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IDogZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUgPT09IGNvbXBhcmF0b3I7XG4gIH07XG59XG5cbmZuLmZpbHRlciA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gY2FzaChmaWx0ZXIuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pKTtcbn07IC8vIEByZXF1aXJlIGNvbGxlY3Rpb24vZmlsdGVyLnRzXG5cblxuZnVuY3Rpb24gZmlsdGVyZWQoY29sbGVjdGlvbiwgY29tcGFyYXRvcikge1xuICByZXR1cm4gIWNvbXBhcmF0b3IgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi5maWx0ZXIoY29tcGFyYXRvcik7XG59IC8vIEByZXF1aXJlIC4vdHlwZV9jaGVja2luZy50c1xuXG5cbnZhciBzcGxpdFZhbHVlc1JlID0gL1xcUysvZztcblxuZnVuY3Rpb24gZ2V0U3BsaXRWYWx1ZXMoc3RyKSB7XG4gIHJldHVybiBpc1N0cmluZyhzdHIpID8gc3RyLm1hdGNoKHNwbGl0VmFsdWVzUmUpIHx8IFtdIDogW107XG59XG5cbmZuLmhhc0NsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICByZXR1cm4gISFjbHMgJiYgc29tZS5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGVsZSkgJiYgZWxlLmNsYXNzTGlzdC5jb250YWlucyhjbHMpO1xuICB9KTtcbn07XG5cbmZuLnJlbW92ZUF0dHIgPSBmdW5jdGlvbiAoYXR0cikge1xuICB2YXIgYXR0cnMgPSBnZXRTcGxpdFZhbHVlcyhhdHRyKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVhY2goYXR0cnMsIGZ1bmN0aW9uIChpLCBhKSB7XG4gICAgICBlbGUucmVtb3ZlQXR0cmlidXRlKGEpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGF0dHIoYXR0ciwgdmFsdWUpIHtcbiAgaWYgKCFhdHRyKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKGF0dHIpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoIXRoaXNbMF0gfHwgIWlzRWxlbWVudCh0aGlzWzBdKSkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlXzEgPSB0aGlzWzBdLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIHJldHVybiBpc051bGwodmFsdWVfMSkgPyB1bmRlZmluZWQgOiB2YWx1ZV8xO1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiB0aGlzO1xuICAgIGlmIChpc051bGwodmFsdWUpKSByZXR1cm4gdGhpcy5yZW1vdmVBdHRyKGF0dHIpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgZWxlLnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gYXR0cikge1xuICAgIHRoaXMuYXR0cihrZXksIGF0dHJba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZm4uYXR0ciA9IGF0dHI7XG5cbmZuLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gKGNscywgZm9yY2UpIHtcbiAgdmFyIGNsYXNzZXMgPSBnZXRTcGxpdFZhbHVlcyhjbHMpLFxuICAgICAgaXNGb3JjZSA9ICFpc1VuZGVmaW5lZChmb3JjZSk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlYWNoKGNsYXNzZXMsIGZ1bmN0aW9uIChpLCBjKSB7XG4gICAgICBpZiAoaXNGb3JjZSkge1xuICAgICAgICBmb3JjZSA/IGVsZS5jbGFzc0xpc3QuYWRkKGMpIDogZWxlLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuY2xhc3NMaXN0LnRvZ2dsZShjKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5mbi5hZGRDbGFzcyA9IGZ1bmN0aW9uIChjbHMpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCB0cnVlKTtcbn07XG5cbmZuLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzLmF0dHIoJ2NsYXNzJywgJycpO1xufTtcblxuZnVuY3Rpb24gcGx1Y2soYXJyLCBwcm9wLCBkZWVwLCB1bnRpbCkge1xuICB2YXIgcGx1Y2tlZCA9IFtdLFxuICAgICAgaXNDYWxsYmFjayA9IGlzRnVuY3Rpb24ocHJvcCksXG4gICAgICBjb21wYXJlID0gdW50aWwgJiYgZ2V0Q29tcGFyZUZ1bmN0aW9uKHVudGlsKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaXNDYWxsYmFjaykge1xuICAgICAgdmFyIHZhbF8xID0gcHJvcChhcnJbaV0pO1xuICAgICAgaWYgKHZhbF8xLmxlbmd0aCkgcHVzaC5hcHBseShwbHVja2VkLCB2YWxfMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWxfMiA9IGFycltpXVtwcm9wXTtcblxuICAgICAgd2hpbGUgKHZhbF8yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHVudGlsICYmIGNvbXBhcmUoLTEsIHZhbF8yKSkgYnJlYWs7XG4gICAgICAgIHBsdWNrZWQucHVzaCh2YWxfMik7XG4gICAgICAgIHZhbF8yID0gZGVlcCA/IHZhbF8yW3Byb3BdIDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGx1Y2tlZDtcbn1cblxuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICByZXR1cm4gYXJyLmxlbmd0aCA+IDEgPyBmaWx0ZXIuY2FsbChhcnIsIGZ1bmN0aW9uIChpdGVtLCBpbmRleCwgc2VsZikge1xuICAgIHJldHVybiBpbmRleE9mLmNhbGwoc2VsZiwgaXRlbSkgPT09IGluZGV4O1xuICB9KSA6IGFycjtcbn1cblxuY2FzaC51bmlxdWUgPSB1bmlxdWU7XG5cbmZuLmFkZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gY2FzaCh1bmlxdWUodGhpcy5nZXQoKS5jb25jYXQoY2FzaChzZWxlY3RvciwgY29udGV4dCkuZ2V0KCkpKSk7XG59OyAvLyBAcmVxdWlyZSBjb3JlL3R5cGVfY2hlY2tpbmcudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlKGVsZSwgcHJvcCwgaXNWYXJpYWJsZSkge1xuICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gIHZhciBzdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZSwgbnVsbCk7XG4gIHJldHVybiBpc1ZhcmlhYmxlID8gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB8fCB1bmRlZmluZWQgOiBzdHlsZVtwcm9wXSB8fCBlbGUuc3R5bGVbcHJvcF07XG59IC8vIEByZXF1aXJlIC4vY29tcHV0ZV9zdHlsZS50c1xuXG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZUludChlbGUsIHByb3ApIHtcbiAgcmV0dXJuIHBhcnNlSW50KGNvbXB1dGVTdHlsZShlbGUsIHByb3ApLCAxMCkgfHwgMDtcbn1cblxudmFyIGNzc1ZhcmlhYmxlUmUgPSAvXi0tLzsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gaXNDU1NWYXJpYWJsZShwcm9wKSB7XG4gIHJldHVybiBjc3NWYXJpYWJsZVJlLnRlc3QocHJvcCk7XG59IC8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuLy8gQHJlcXVpcmUgY29yZS9jYXNoLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2VhY2gudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG5cbnZhciBwcmVmaXhlZFByb3BzID0ge30sXG4gICAgc3R5bGUgPSBkaXYuc3R5bGUsXG4gICAgdmVuZG9yc1ByZWZpeGVzID0gWyd3ZWJraXQnLCAnbW96JywgJ21zJ107XG5cbmZ1bmN0aW9uIGdldFByZWZpeGVkUHJvcChwcm9wLCBpc1ZhcmlhYmxlKSB7XG4gIGlmIChpc1ZhcmlhYmxlID09PSB2b2lkIDApIHtcbiAgICBpc1ZhcmlhYmxlID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgfVxuXG4gIGlmIChpc1ZhcmlhYmxlKSByZXR1cm4gcHJvcDtcblxuICBpZiAoIXByZWZpeGVkUHJvcHNbcHJvcF0pIHtcbiAgICB2YXIgcHJvcENDID0gY2FtZWxDYXNlKHByb3ApLFxuICAgICAgICBwcm9wVUMgPSBcIlwiICsgcHJvcENDWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wQ0Muc2xpY2UoMSksXG4gICAgICAgIHByb3BzID0gKHByb3BDQyArIFwiIFwiICsgdmVuZG9yc1ByZWZpeGVzLmpvaW4ocHJvcFVDICsgXCIgXCIpICsgcHJvcFVDKS5zcGxpdCgnICcpO1xuICAgIGVhY2gocHJvcHMsIGZ1bmN0aW9uIChpLCBwKSB7XG4gICAgICBpZiAocCBpbiBzdHlsZSkge1xuICAgICAgICBwcmVmaXhlZFByb3BzW3Byb3BdID0gcDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHByZWZpeGVkUHJvcHNbcHJvcF07XG59XG5cbjsgLy8gQHJlcXVpcmUgY29yZS90eXBlX2NoZWNraW5nLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG52YXIgbnVtZXJpY1Byb3BzID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wLCB2YWx1ZSwgaXNWYXJpYWJsZSkge1xuICBpZiAoaXNWYXJpYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgaXNWYXJpYWJsZSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gIH1cblxuICByZXR1cm4gIWlzVmFyaWFibGUgJiYgIW51bWVyaWNQcm9wc1twcm9wXSAmJiBpc051bWVyaWModmFsdWUpID8gdmFsdWUgKyBcInB4XCIgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY3NzKHByb3AsIHZhbHVlKSB7XG4gIGlmIChpc1N0cmluZyhwcm9wKSkge1xuICAgIHZhciBpc1ZhcmlhYmxlXzEgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICAgIHByb3AgPSBnZXRQcmVmaXhlZFByb3AocHJvcCwgaXNWYXJpYWJsZV8xKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGNvbXB1dGVTdHlsZSh0aGlzWzBdLCBwcm9wLCBpc1ZhcmlhYmxlXzEpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIHRoaXM7XG4gICAgdmFsdWUgPSBnZXRTdWZmaXhlZFZhbHVlKHByb3AsIHZhbHVlLCBpc1ZhcmlhYmxlXzEpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaXNWYXJpYWJsZV8xKSB7XG4gICAgICAgIGVsZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5jc3Moa2V5LCBwcm9wW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbjtcbmZuLmNzcyA9IGNzczsgLy8gQG9wdGlvbmFsIC4vY3NzLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2F0dGVtcHQudHNcbi8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuXG52YXIgSlNPTlN0cmluZ1JlID0gL15cXHMrfFxccyskLztcblxuZnVuY3Rpb24gZ2V0RGF0YShlbGUsIGtleSkge1xuICB2YXIgdmFsdWUgPSBlbGUuZGF0YXNldFtrZXldIHx8IGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXTtcbiAgaWYgKEpTT05TdHJpbmdSZS50ZXN0KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gYXR0ZW1wdChKU09OLnBhcnNlLCB2YWx1ZSk7XG59IC8vIEByZXF1aXJlIGNvcmUvYXR0ZW1wdC50c1xuLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG5cblxuZnVuY3Rpb24gc2V0RGF0YShlbGUsIGtleSwgdmFsdWUpIHtcbiAgdmFsdWUgPSBhdHRlbXB0KEpTT04uc3RyaW5naWZ5LCB2YWx1ZSk7XG4gIGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBkYXRhKG5hbWUsIHZhbHVlKSB7XG4gIGlmICghbmFtZSkge1xuICAgIGlmICghdGhpc1swXSkgcmV0dXJuO1xuICAgIHZhciBkYXRhcyA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXNbMF0uZGF0YXNldCkge1xuICAgICAgZGF0YXNba2V5XSA9IGdldERhdGEodGhpc1swXSwga2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXM7XG4gIH1cblxuICBpZiAoaXNTdHJpbmcobmFtZSkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGdldERhdGEodGhpc1swXSwgbmFtZSk7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBzZXREYXRhKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICB0aGlzLmRhdGEoa2V5LCBuYW1lW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLmRhdGEgPSBkYXRhOyAvLyBAb3B0aW9uYWwgLi9kYXRhLnRzXG5cbmZ1bmN0aW9uIGdldERvY3VtZW50RGltZW5zaW9uKGRvYywgZGltZW5zaW9uKSB7XG4gIHZhciBkb2NFbGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICByZXR1cm4gTWF0aC5tYXgoZG9jLmJvZHlbXCJzY3JvbGxcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcInNjcm9sbFwiICsgZGltZW5zaW9uXSwgZG9jLmJvZHlbXCJvZmZzZXRcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcIm9mZnNldFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wiY2xpZW50XCIgKyBkaW1lbnNpb25dKTtcbn0gLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZV9pbnQudHNcblxuXG5mdW5jdGlvbiBnZXRFeHRyYVNwYWNlKGVsZSwgeEF4aXMpIHtcbiAgcmV0dXJuIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykgKyBcIldpZHRoXCIpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpKSArIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpICsgXCJXaWR0aFwiKTtcbn1cblxuZWFjaChbdHJ1ZSwgZmFsc2VdLCBmdW5jdGlvbiAoaSwgb3V0ZXIpIHtcbiAgZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAoaSwgcHJvcCkge1xuICAgIHZhciBuYW1lID0gXCJcIiArIChvdXRlciA/ICdvdXRlcicgOiAnaW5uZXInKSArIHByb3A7XG5cbiAgICBmbltuYW1lXSA9IGZ1bmN0aW9uIChpbmNsdWRlTWFyZ2lucykge1xuICAgICAgaWYgKCF0aGlzWzBdKSByZXR1cm47XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiBvdXRlciA/IHRoaXNbMF1bXCJpbm5lclwiICsgcHJvcF0gOiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF1bXCJcIiArIChvdXRlciA/ICdvZmZzZXQnIDogJ2NsaWVudCcpICsgcHJvcF0gKyAoaW5jbHVkZU1hcmdpbnMgJiYgb3V0ZXIgPyBjb21wdXRlU3R5bGVJbnQodGhpc1swXSwgXCJtYXJnaW5cIiArIChpID8gJ1RvcCcgOiAnTGVmdCcpKSArIGNvbXB1dGVTdHlsZUludCh0aGlzWzBdLCBcIm1hcmdpblwiICsgKGkgPyAnQm90dG9tJyA6ICdSaWdodCcpKSA6IDApO1xuICAgIH07XG4gIH0pO1xufSk7XG5lYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChpbmRleCwgcHJvcCkge1xuICB2YXIgcHJvcExDID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gIGZuW3Byb3BMQ10gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXRoaXNbMF0pIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzO1xuXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbcHJvcExDXSAtIGdldEV4dHJhU3BhY2UodGhpc1swXSwgIWluZGV4KTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVOdW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgdmFyIGJveFNpemluZyA9IGNvbXB1dGVTdHlsZShlbGUsICdib3hTaXppbmcnKTtcbiAgICAgIGVsZS5zdHlsZVtwcm9wTENdID0gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wTEMsIHZhbHVlTnVtYmVyICsgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnID8gZ2V0RXh0cmFTcGFjZShlbGUsICFpbmRleCkgOiAwKSk7XG4gICAgfSk7XG4gIH07XG59KTsgLy8gQG9wdGlvbmFsIC4vaW5uZXJfb3V0ZXIudHNcbi8vIEBvcHRpb25hbCAuL25vcm1hbC50c1xuLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZS50c1xuXG52YXIgZGVmYXVsdERpc3BsYXkgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkodGFnTmFtZSkge1xuICBpZiAoZGVmYXVsdERpc3BsYXlbdGFnTmFtZV0pIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXTtcbiAgdmFyIGVsZSA9IGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gIGRvYy5ib2R5Lmluc2VydEJlZm9yZShlbGUsIG51bGwpO1xuICB2YXIgZGlzcGxheSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gIGRvYy5ib2R5LnJlbW92ZUNoaWxkKGVsZSk7XG4gIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXSA9IGRpc3BsYXkgIT09ICdub25lJyA/IGRpc3BsYXkgOiAnYmxvY2snO1xufSAvLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlLnRzXG5cblxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlKSB7XG4gIHJldHVybiBjb21wdXRlU3R5bGUoZWxlLCAnZGlzcGxheScpID09PSAnbm9uZSc7XG59XG5cbnZhciBkaXNwbGF5UHJvcGVydHkgPSAnX19fY2QnO1xuXG5mbi50b2dnbGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIHZhciBzaG93ID0gaXNVbmRlZmluZWQoZm9yY2UpID8gaXNIaWRkZW4oZWxlKSA6IGZvcmNlO1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZWxlW2Rpc3BsYXlQcm9wZXJ0eV0gfHwgJyc7XG5cbiAgICAgIGlmIChpc0hpZGRlbihlbGUpKSB7XG4gICAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZ2V0RGVmYXVsdERpc3BsYXkoZWxlLnRhZ05hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVbZGlzcGxheVByb3BlcnR5XSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gICAgICBlbGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xufTtcblxuZm4uaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlKGZhbHNlKTtcbn07XG5cbmZuLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRvZ2dsZSh0cnVlKTtcbn07IC8vIEBvcHRpb25hbCAuL2hpZGUudHNcbi8vIEBvcHRpb25hbCAuL3Nob3cudHNcbi8vIEBvcHRpb25hbCAuL3RvZ2dsZS50c1xuXG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZXMobnMxLCBuczIpIHtcbiAgcmV0dXJuICFuczIgfHwgIXNvbWUuY2FsbChuczIsIGZ1bmN0aW9uIChucykge1xuICAgIHJldHVybiBuczEuaW5kZXhPZihucykgPCAwO1xuICB9KTtcbn1cblxudmFyIGV2ZW50c05hbWVzcGFjZSA9ICdfX19jZScsXG4gICAgZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvciA9ICcuJyxcbiAgICBldmVudHNGb2N1cyA9IHtcbiAgZm9jdXM6ICdmb2N1c2luJyxcbiAgYmx1cjogJ2ZvY3Vzb3V0J1xufSxcbiAgICBldmVudHNIb3ZlciA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn0sXG4gICAgZXZlbnRzTW91c2VSZSA9IC9eKG1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wfGNsaWNrfGRibGNsaWNrKS9pOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lKSB7XG4gIHJldHVybiBldmVudHNIb3ZlcltuYW1lXSB8fCBldmVudHNGb2N1c1tuYW1lXSB8fCBuYW1lO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50c0NhY2hlKGVsZSkge1xuICByZXR1cm4gZWxlW2V2ZW50c05hbWVzcGFjZV0gPSBlbGVbZXZlbnRzTmFtZXNwYWNlXSB8fCB7fTtcbn0gLy8gQHJlcXVpcmUgY29yZS9ndWlkLnRzXG4vLyBAcmVxdWlyZSBldmVudHMvaGVscGVycy9nZXRfZXZlbnRzX2NhY2hlLnRzXG5cblxuZnVuY3Rpb24gYWRkRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIGV2ZW50Q2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuICBldmVudENhY2hlW25hbWVdID0gZXZlbnRDYWNoZVtuYW1lXSB8fCBbXTtcbiAgZXZlbnRDYWNoZVtuYW1lXS5wdXNoKFtuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2tdKTtcbiAgZWxlLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgY2FsbGJhY2spO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICB2YXIgcGFydHMgPSBldmVudE5hbWUuc3BsaXQoZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvcik7XG4gIHJldHVybiBbcGFydHNbMF0sIHBhcnRzLnNsaWNlKDEpLnNvcnQoKV07IC8vIFtuYW1lLCBuYW1lc3BhY2VbXV1cbn0gLy8gQHJlcXVpcmUgLi9nZXRfZXZlbnRzX2NhY2hlLnRzXG4vLyBAcmVxdWlyZSAuL2hhc19uYW1lc3BhY2VzLnRzXG4vLyBAcmVxdWlyZSAuL3BhcnNlX2V2ZW50X25hbWUudHNcblxuXG5mdW5jdGlvbiByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgY2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuXG4gIGlmICghbmFtZSkge1xuICAgIGZvciAobmFtZSBpbiBjYWNoZSkge1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjYWNoZVtuYW1lXSkge1xuICAgIGNhY2hlW25hbWVdID0gY2FjaGVbbmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIG5zID0gX2FbMF0sXG4gICAgICAgICAgc2VsID0gX2FbMV0sXG4gICAgICAgICAgY2IgPSBfYVsyXTtcbiAgICAgIGlmIChjYWxsYmFjayAmJiBjYi5ndWlkICE9PSBjYWxsYmFjay5ndWlkIHx8ICFoYXNOYW1lc3BhY2VzKG5zLCBuYW1lc3BhY2VzKSB8fCBzZWxlY3RvciAmJiBzZWxlY3RvciAhPT0gc2VsKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGVsZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGNiKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mbi5vZmYgPSBmdW5jdGlvbiAoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50RnVsbE5hbWUpKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vZmYoa2V5LCBldmVudEZ1bGxOYW1lW2tleV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH1cblxuICAgIGVhY2goZ2V0U3BsaXRWYWx1ZXMoZXZlbnRGdWxsTmFtZSksIGZ1bmN0aW9uIChpLCBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCk7XG5cbiAgICAgIF90aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcbiAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIG9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgX29uZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vbihrZXksIHNlbGVjdG9yLCBkYXRhLCBldmVudEZ1bGxOYW1lW2tleV0sIF9vbmUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoc2VsZWN0b3IpIHx8IGlzTnVsbChzZWxlY3RvcikpIHtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChkYXRhKSkge1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgZWFjaChnZXRTcGxpdFZhbHVlcyhldmVudEZ1bGxOYW1lKSwgZnVuY3Rpb24gKGksIGV2ZW50RnVsbE5hbWUpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgbmFtZU9yaWdpbmFsID0gX2FbMF0sXG4gICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCksXG4gICAgICAgIGlzRXZlbnRIb3ZlciA9IG5hbWVPcmlnaW5hbCBpbiBldmVudHNIb3ZlcixcbiAgICAgICAgaXNFdmVudEZvY3VzID0gbmFtZU9yaWdpbmFsIGluIGV2ZW50c0ZvY3VzO1xuXG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICBfdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uIGZpbmFsQ2FsbGJhY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldFtcIl9fX2lcIiArIGV2ZW50LnR5cGVdKSByZXR1cm4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIElnbm9yaW5nIG5hdGl2ZSBldmVudCBpbiBmYXZvciBvZiB0aGUgdXBjb21pbmcgY3VzdG9tIG9uZVxuXG4gICAgICAgIGlmIChldmVudC5uYW1lc3BhY2UgJiYgIWhhc05hbWVzcGFjZXMobmFtZXNwYWNlcywgZXZlbnQubmFtZXNwYWNlLnNwbGl0KGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXNlbGVjdG9yICYmIChpc0V2ZW50Rm9jdXMgJiYgKGV2ZW50LnRhcmdldCAhPT0gZWxlIHx8IGV2ZW50Ll9fX290ID09PSBuYW1lKSB8fCBpc0V2ZW50SG92ZXIgJiYgZXZlbnQucmVsYXRlZFRhcmdldCAmJiBlbGUuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSByZXR1cm47XG4gICAgICAgIHZhciB0aGlzQXJnID0gZWxlO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB3aGlsZSAoIW1hdGNoZXModGFyZ2V0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGVsZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNBcmcgPSB0YXJnZXQ7XG4gICAgICAgICAgZXZlbnQuX19fY2QgPSB0cnVlOyAvLyBEZWxlZ2F0ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50Ll9fX2NkKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnY3VycmVudFRhcmdldCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpc0FyZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2RhdGEnLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBldmVudCwgZXZlbnQuX19fdGQpO1xuXG4gICAgICAgIGlmIChfb25lKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgZmluYWxDYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZmluYWxDYWxsYmFjay5ndWlkID0gY2FsbGJhY2suZ3VpZCA9IGNhbGxiYWNrLmd1aWQgfHwgY2FzaC5ndWlkKys7XG4gICAgICBhZGRFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBmaW5hbENhbGxiYWNrKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5vbiA9IG9uO1xuXG5mdW5jdGlvbiBvbmUoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgdHJ1ZSk7XG59XG5cbjtcbmZuLm9uZSA9IG9uZTtcblxuZm4ucmVhZHkgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoY2FsbGJhY2ssIDAsIGNhc2gpO1xuICB9O1xuXG4gIGlmIChkb2MucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgY2IoKTtcbiAgfSBlbHNlIHtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICBpZiAoaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgdmFyIF9hID0gcGFyc2VFdmVudE5hbWUoZXZlbnQpLFxuICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICBuYW1lXzEgPSBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lT3JpZ2luYWwpO1xuXG4gICAgaWYgKCFuYW1lXzEpIHJldHVybiB0aGlzO1xuICAgIHZhciB0eXBlID0gZXZlbnRzTW91c2VSZS50ZXN0KG5hbWVfMSkgPyAnTW91c2VFdmVudHMnIDogJ0hUTUxFdmVudHMnO1xuICAgIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KHR5cGUpO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lXzEsIHRydWUsIHRydWUpO1xuICAgIGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKTtcbiAgICBldmVudC5fX19vdCA9IG5hbWVPcmlnaW5hbDtcbiAgfVxuXG4gIGV2ZW50Ll9fX3RkID0gZGF0YTtcbiAgdmFyIGlzRXZlbnRGb2N1cyA9IGV2ZW50Ll9fX290IGluIGV2ZW50c0ZvY3VzO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoaXNFdmVudEZvY3VzICYmIGlzRnVuY3Rpb24oZWxlW2V2ZW50Ll9fX290XSkpIHtcbiAgICAgIGVsZVtcIl9fX2lcIiArIGV2ZW50LnR5cGVdID0gdHJ1ZTsgLy8gRW5zdXJpbmcgdGhlIG5hdGl2ZSBldmVudCBpcyBpZ25vcmVkXG5cbiAgICAgIGVsZVtldmVudC5fX19vdF0oKTtcblxuICAgICAgZWxlW1wiX19faVwiICsgZXZlbnQudHlwZV0gPSBmYWxzZTsgLy8gRW5zdXJpbmcgdGhlIGN1c3RvbSBldmVudCBpcyBub3QgaWdub3JlZFxuICAgIH1cblxuICAgIGVsZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSk7XG59OyAvLyBAb3B0aW9uYWwgLi9vZmYudHNcbi8vIEBvcHRpb25hbCAuL29uLnRzXG4vLyBAb3B0aW9uYWwgLi9vbmUudHNcbi8vIEBvcHRpb25hbCAuL3JlYWR5LnRzXG4vLyBAb3B0aW9uYWwgLi90cmlnZ2VyLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3BsdWNrLnRzXG4vLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGdldFZhbHVlKGVsZSkge1xuICBpZiAoZWxlLm11bHRpcGxlICYmIGVsZS5vcHRpb25zKSByZXR1cm4gcGx1Y2soZmlsdGVyLmNhbGwoZWxlLm9wdGlvbnMsIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICByZXR1cm4gb3B0aW9uLnNlbGVjdGVkICYmICFvcHRpb24uZGlzYWJsZWQgJiYgIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkO1xuICB9KSwgJ3ZhbHVlJyk7XG4gIHJldHVybiBlbGUudmFsdWUgfHwgJyc7XG59XG5cbnZhciBxdWVyeUVuY29kZVNwYWNlUmUgPSAvJTIwL2csXG4gICAgcXVlcnlFbmNvZGVDUkxGUmUgPSAvXFxyP1xcbi9nO1xuXG5mdW5jdGlvbiBxdWVyeUVuY29kZShwcm9wLCB2YWx1ZSkge1xuICByZXR1cm4gXCImXCIgKyBlbmNvZGVVUklDb21wb25lbnQocHJvcCkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS5yZXBsYWNlKHF1ZXJ5RW5jb2RlQ1JMRlJlLCAnXFxyXFxuJykpLnJlcGxhY2UocXVlcnlFbmNvZGVTcGFjZVJlLCAnKycpO1xufVxuXG52YXIgc2tpcHBhYmxlUmUgPSAvZmlsZXxyZXNldHxzdWJtaXR8YnV0dG9ufGltYWdlL2ksXG4gICAgY2hlY2thYmxlUmUgPSAvcmFkaW98Y2hlY2tib3gvaTtcblxuZm4uc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcXVlcnkgPSAnJztcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBlYWNoKGVsZS5lbGVtZW50cyB8fCBbZWxlXSwgZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKGVsZS5kaXNhYmxlZCB8fCAhZWxlLm5hbWUgfHwgZWxlLnRhZ05hbWUgPT09ICdGSUVMRFNFVCcgfHwgc2tpcHBhYmxlUmUudGVzdChlbGUudHlwZSkgfHwgY2hlY2thYmxlUmUudGVzdChlbGUudHlwZSkgJiYgIWVsZS5jaGVja2VkKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShlbGUpO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgIGVhY2godmFsdWVzLCBmdW5jdGlvbiAoaSwgdmFsdWUpIHtcbiAgICAgICAgICBxdWVyeSArPSBxdWVyeUVuY29kZShlbGUubmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBxdWVyeS5zbGljZSgxKTtcbn07XG5cbmZ1bmN0aW9uIHZhbCh2YWx1ZSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzWzBdICYmIGdldFZhbHVlKHRoaXNbMF0pO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgaXNTZWxlY3QgPSBlbGUubXVsdGlwbGUgJiYgZWxlLm9wdGlvbnM7XG5cbiAgICBpZiAoaXNTZWxlY3QgfHwgY2hlY2thYmxlUmUudGVzdChlbGUudHlwZSkpIHtcbiAgICAgIHZhciBlbGVWYWx1ZV8xID0gaXNBcnJheSh2YWx1ZSkgPyBtYXAuY2FsbCh2YWx1ZSwgU3RyaW5nKSA6IGlzTnVsbCh2YWx1ZSkgPyBbXSA6IFtTdHJpbmcodmFsdWUpXTtcblxuICAgICAgaWYgKGlzU2VsZWN0KSB7XG4gICAgICAgIGVhY2goZWxlLm9wdGlvbnMsIGZ1bmN0aW9uIChpLCBvcHRpb24pIHtcbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBlbGVWYWx1ZV8xLmluZGV4T2Yob3B0aW9uLnZhbHVlKSA+PSAwO1xuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5jaGVja2VkID0gZWxlVmFsdWVfMS5pbmRleE9mKGVsZS52YWx1ZSkgPj0gMDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlLnZhbHVlID0gaXNVbmRlZmluZWQodmFsdWUpIHx8IGlzTnVsbCh2YWx1ZSkgPyAnJyA6IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZuLnZhbCA9IHZhbDtcblxuZm4uY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jbG9uZU5vZGUodHJ1ZSk7XG4gIH0pO1xufTtcblxuZm4uZGV0YWNoID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgZmlsdGVyZWQodGhpcywgY29tcGFyYXRvcikuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGVsZS5wYXJlbnROb2RlKSB7XG4gICAgICBlbGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIGZyYWdtZW50UmUgPSAvXlxccyo8KFxcdyspW14+XSo+LyxcbiAgICBzaW5nbGVUYWdSZSA9IC9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+KT8kLztcbnZhciBjb250YWluZXJzID0ge1xuICAnKic6IGRpdixcbiAgdHI6IHRib2R5LFxuICB0ZDogdHIsXG4gIHRoOiB0cixcbiAgdGhlYWQ6IHRhYmxlLFxuICB0Ym9keTogdGFibGUsXG4gIHRmb290OiB0YWJsZVxufTsgLy9UT0RPOiBDcmVhdGUgZWxlbWVudHMgaW5zaWRlIGEgZG9jdW1lbnQgZnJhZ21lbnQsIGluIG9yZGVyIHRvIHByZXZlbnQgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gZmlyaW5nXG4vL1RPRE86IEVuc3VyZSB0aGUgY3JlYXRlZCBlbGVtZW50cyBoYXZlIHRoZSBmcmFnbWVudCBhcyB0aGVpciBwYXJlbnQgaW5zdGVhZCBvZiBudWxsLCB0aGlzIGFsc28gZW5zdXJlcyB3ZSBjYW4gZGVhbCB3aXRoIGRldGF0Y2hlZCBub2RlcyBtb3JlIHJlbGlhYmx5XG5cbmZ1bmN0aW9uIHBhcnNlSFRNTChodG1sKSB7XG4gIGlmICghaXNTdHJpbmcoaHRtbCkpIHJldHVybiBbXTtcbiAgaWYgKHNpbmdsZVRhZ1JlLnRlc3QoaHRtbCkpIHJldHVybiBbY3JlYXRlRWxlbWVudChSZWdFeHAuJDEpXTtcbiAgdmFyIGZyYWdtZW50ID0gZnJhZ21lbnRSZS50ZXN0KGh0bWwpICYmIFJlZ0V4cC4kMSxcbiAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbZnJhZ21lbnRdIHx8IGNvbnRhaW5lcnNbJyonXTtcbiAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIHJldHVybiBjYXNoKGNvbnRhaW5lci5jaGlsZE5vZGVzKS5kZXRhY2goKS5nZXQoKTtcbn1cblxuY2FzaC5wYXJzZUhUTUwgPSBwYXJzZUhUTUw7XG5cbmZuLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB3aGlsZSAoZWxlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGVsZS5yZW1vdmVDaGlsZChlbGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGh0bWwoaHRtbCkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0uaW5uZXJIVE1MO1xuICBpZiAoaXNVbmRlZmluZWQoaHRtbCkpIHJldHVybiB0aGlzO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWxlLmlubmVySFRNTCA9IGh0bWw7XG4gIH0pO1xufVxuXG5mbi5odG1sID0gaHRtbDtcblxuZm4ucmVtb3ZlID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgZmlsdGVyZWQodGhpcywgY29tcGFyYXRvcikuZGV0YWNoKCkub2ZmKCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gdGV4dCh0ZXh0KSB7XG4gIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSkgcmV0dXJuIHRoaXNbMF0gPyB0aGlzWzBdLnRleHRDb250ZW50IDogJyc7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlbGUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9KTtcbn1cblxuO1xuZm4udGV4dCA9IHRleHQ7XG5cbmZuLnVud3JhcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoZWxlLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuO1xuICAgIHZhciAkZWxlID0gY2FzaChlbGUpO1xuICAgICRlbGUucmVwbGFjZVdpdGgoJGVsZS5jaGlsZHJlbigpKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ub2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKCFlbGUpIHJldHVybjtcbiAgdmFyIHJlY3QgPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgdG9wOiByZWN0LnRvcCArIHdpbi5wYWdlWU9mZnNldCxcbiAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcbiAgfTtcbn07XG5cbmZuLm9mZnNldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlLm9mZnNldFBhcmVudDtcblxuICAgIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgY29tcHV0ZVN0eWxlKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlO1xuICB9KTtcbn07XG5cbmZuLnBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgaWYgKCFlbGUpIHJldHVybjtcbiAgdmFyIGlzRml4ZWQgPSBjb21wdXRlU3R5bGUoZWxlLCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJyxcbiAgICAgIG9mZnNldCA9IGlzRml4ZWQgPyBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiB0aGlzLm9mZnNldCgpO1xuXG4gIGlmICghaXNGaXhlZCkge1xuICAgIHZhciBkb2NfMSA9IGVsZS5vd25lckRvY3VtZW50O1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGUub2Zmc2V0UGFyZW50IHx8IGRvY18xLmRvY3VtZW50RWxlbWVudDtcblxuICAgIHdoaWxlICgob2Zmc2V0UGFyZW50ID09PSBkb2NfMS5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jXzEuZG9jdW1lbnRFbGVtZW50KSAmJiBjb21wdXRlU3R5bGUob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXRQYXJlbnQgIT09IGVsZSAmJiBpc0VsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgdmFyIHBhcmVudE9mZnNldCA9IGNhc2gob2Zmc2V0UGFyZW50KS5vZmZzZXQoKTtcbiAgICAgIG9mZnNldC50b3AgLT0gcGFyZW50T2Zmc2V0LnRvcCArIGNvbXB1dGVTdHlsZUludChvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcpO1xuICAgICAgb2Zmc2V0LmxlZnQgLT0gcGFyZW50T2Zmc2V0LmxlZnQgKyBjb21wdXRlU3R5bGVJbnQob2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG9mZnNldC50b3AgLSBjb21wdXRlU3R5bGVJbnQoZWxlLCAnbWFyZ2luVG9wJyksXG4gICAgbGVmdDogb2Zmc2V0LmxlZnQgLSBjb21wdXRlU3R5bGVJbnQoZWxlLCAnbWFyZ2luTGVmdCcpXG4gIH07XG59O1xuXG5mbi5jaGlsZHJlbiA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jaGlsZHJlbjtcbiAgfSkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5jb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRhZ05hbWUgPT09ICdJRlJBTUUnID8gW2VsZS5jb250ZW50RG9jdW1lbnRdIDogZWxlLnRhZ05hbWUgPT09ICdURU1QTEFURScgPyBlbGUuY29udGVudC5jaGlsZE5vZGVzIDogZWxlLmNoaWxkTm9kZXM7XG4gIH0pKSk7XG59O1xuXG5mbi5maW5kID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGZpbmQoc2VsZWN0b3IsIGVsZSk7XG4gIH0pKSk7XG59OyAvLyBAcmVxdWlyZSBjb3JlL3ZhcmlhYmxlcy50c1xuLy8gQHJlcXVpcmUgY29sbGVjdGlvbi9maWx0ZXIudHNcbi8vIEByZXF1aXJlIHRyYXZlcnNhbC9maW5kLnRzXG5cblxudmFyIEhUTUxDREFUQVJlID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nLFxuICAgIHNjcmlwdFR5cGVSZSA9IC9eJHxebW9kdWxlJHxcXC8oamF2YXxlY21hKXNjcmlwdC9pLFxuICAgIHNjcmlwdEF0dHJpYnV0ZXMgPSBbJ3R5cGUnLCAnc3JjJywgJ25vbmNlJywgJ25vTW9kdWxlJ107XG5cbmZ1bmN0aW9uIGV2YWxTY3JpcHRzKG5vZGUsIGRvYykge1xuICB2YXIgY29sbGVjdGlvbiA9IGNhc2gobm9kZSk7XG4gIGNvbGxlY3Rpb24uZmlsdGVyKCdzY3JpcHQnKS5hZGQoY29sbGVjdGlvbi5maW5kKCdzY3JpcHQnKSkuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKHNjcmlwdFR5cGVSZS50ZXN0KGVsZS50eXBlKSAmJiBkb2NFbGUuY29udGFpbnMoZWxlKSkge1xuICAgICAgLy8gVGhlIHNjcmlwdCB0eXBlIGlzIHN1cHBvcnRlZCAvLyBUaGUgZWxlbWVudCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NIC8vIFVzaW5nIGBkb2N1bWVudEVsZW1lbnRgIGZvciBicm9hZGVyIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgdmFyIHNjcmlwdF8xID0gY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRfMS50ZXh0ID0gZWxlLnRleHRDb250ZW50LnJlcGxhY2UoSFRNTENEQVRBUmUsICcnKTtcbiAgICAgIGVhY2goc2NyaXB0QXR0cmlidXRlcywgZnVuY3Rpb24gKGksIGF0dHIpIHtcbiAgICAgICAgaWYgKGVsZVthdHRyXSkgc2NyaXB0XzFbYXR0cl0gPSBlbGVbYXR0cl07XG4gICAgICB9KTtcbiAgICAgIGRvYy5oZWFkLmluc2VydEJlZm9yZShzY3JpcHRfMSwgbnVsbCk7XG4gICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRfMSk7XG4gICAgfVxuICB9KTtcbn0gLy8gQHJlcXVpcmUgLi9ldmFsX3NjcmlwdHMudHNcblxuXG5mdW5jdGlvbiBpbnNlcnRFbGVtZW50KGFuY2hvciwgdGFyZ2V0LCBsZWZ0LCBpbnNpZGUsIGV2YWx1YXRlKSB7XG4gIGlmIChpbnNpZGUpIHtcbiAgICAvLyBwcmVwZW5kL2FwcGVuZFxuICAgIGFuY2hvci5pbnNlcnRCZWZvcmUodGFyZ2V0LCBsZWZ0ID8gYW5jaG9yLmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBiZWZvcmUvYWZ0ZXJcbiAgICBhbmNob3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFyZ2V0LCBsZWZ0ID8gYW5jaG9yIDogYW5jaG9yLm5leHRTaWJsaW5nKTtcbiAgfVxuXG4gIGlmIChldmFsdWF0ZSkge1xuICAgIGV2YWxTY3JpcHRzKHRhcmdldCwgYW5jaG9yLm93bmVyRG9jdW1lbnQpO1xuICB9XG59IC8vIEByZXF1aXJlIC4vaW5zZXJ0X2VsZW1lbnQudHNcblxuXG5mdW5jdGlvbiBpbnNlcnRTZWxlY3RvcnMoc2VsZWN0b3JzLCBhbmNob3JzLCBpbnZlcnNlLCBsZWZ0LCBpbnNpZGUsIHJldmVyc2VMb29wMSwgcmV2ZXJzZUxvb3AyLCByZXZlcnNlTG9vcDMpIHtcbiAgZWFjaChzZWxlY3RvcnMsIGZ1bmN0aW9uIChzaSwgc2VsZWN0b3IpIHtcbiAgICBlYWNoKGNhc2goc2VsZWN0b3IpLCBmdW5jdGlvbiAodGksIHRhcmdldCkge1xuICAgICAgZWFjaChjYXNoKGFuY2hvcnMpLCBmdW5jdGlvbiAoYWksIGFuY2hvcikge1xuICAgICAgICB2YXIgYW5jaG9yRmluYWwgPSBpbnZlcnNlID8gdGFyZ2V0IDogYW5jaG9yLFxuICAgICAgICAgICAgdGFyZ2V0RmluYWwgPSBpbnZlcnNlID8gYW5jaG9yIDogdGFyZ2V0LFxuICAgICAgICAgICAgaW5kZXhGaW5hbCA9IGludmVyc2UgPyB0aSA6IGFpO1xuICAgICAgICBpbnNlcnRFbGVtZW50KGFuY2hvckZpbmFsLCAhaW5kZXhGaW5hbCA/IHRhcmdldEZpbmFsIDogdGFyZ2V0RmluYWwuY2xvbmVOb2RlKHRydWUpLCBsZWZ0LCBpbnNpZGUsICFpbmRleEZpbmFsKTtcbiAgICAgIH0sIHJldmVyc2VMb29wMyk7XG4gICAgfSwgcmV2ZXJzZUxvb3AyKTtcbiAgfSwgcmV2ZXJzZUxvb3AxKTtcbiAgcmV0dXJuIGFuY2hvcnM7XG59XG5cbmZuLmFmdGVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uYXBwZW5kVG8gPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmluc2VydEFmdGVyID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIHRydWUpO1xufTtcblxuZm4ucHJlcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLnByZXBlbmRUbyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmJlZm9yZShzZWxlY3RvcikucmVtb3ZlKCk7XG59O1xuXG5mbi5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIGNhc2goc2VsZWN0b3IpLnJlcGxhY2VXaXRoKHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLndyYXBBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIHN0cnVjdHVyZSA9IGNhc2goc2VsZWN0b3IpLFxuICAgICAgd3JhcHBlciA9IHN0cnVjdHVyZVswXTtcblxuICB3aGlsZSAod3JhcHBlci5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICB3cmFwcGVyID0gd3JhcHBlci5maXJzdEVsZW1lbnRDaGlsZDtcbiAgfVxuXG4gIHRoaXMuZmlyc3QoKS5iZWZvcmUoc3RydWN0dXJlKTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG8od3JhcHBlcik7XG59O1xuXG5mbi53cmFwID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciB3cmFwcGVyID0gY2FzaChzZWxlY3RvcilbMF07XG4gICAgY2FzaChlbGUpLndyYXBBbGwoIWkgPyB3cmFwcGVyIDogd3JhcHBlci5jbG9uZU5vZGUodHJ1ZSkpO1xuICB9KTtcbn07XG5cbmZuLndyYXBJbm5lciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgJGVsZSA9IGNhc2goZWxlKSxcbiAgICAgICAgY29udGVudHMgPSAkZWxlLmNvbnRlbnRzKCk7XG4gICAgY29udGVudHMubGVuZ3RoID8gY29udGVudHMud3JhcEFsbChzZWxlY3RvcikgOiAkZWxlLmFwcGVuZChzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxuZm4uaGFzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBjb21wYXJhdG9yID0gaXNTdHJpbmcoc2VsZWN0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBmaW5kKHNlbGVjdG9yLCBlbGUpLmxlbmd0aDtcbiAgfSA6IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNvbnRhaW5zKHNlbGVjdG9yKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMuZmlsdGVyKGNvbXBhcmF0b3IpO1xufTtcblxuZm4uaXMgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgY29tcGFyZSA9IGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKTtcbiAgcmV0dXJuIHNvbWUuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pO1xufTtcblxuZm4ubmV4dCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfYWxsLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICduZXh0RWxlbWVudFNpYmxpbmcnLCBfYWxsLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ubmV4dEFsbCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLm5leHQoY29tcGFyYXRvciwgdHJ1ZSk7XG59O1xuXG5mbi5uZXh0VW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMubmV4dChjb21wYXJhdG9yLCB0cnVlLCB1bnRpbCk7XG59O1xuXG5mbi5ub3QgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgY29tcGFyZSA9IGdldENvbXBhcmVGdW5jdGlvbihjb21wYXJhdG9yKTtcbiAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gKCFpc1N0cmluZyhjb21wYXJhdG9yKSB8fCBpc0VsZW1lbnQoZWxlKSkgJiYgIWNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pO1xufTtcblxuZm4ucGFyZW50ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwYXJlbnROb2RlJykpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5pbmRleCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgY2hpbGQgPSBzZWxlY3RvciA/IGNhc2goc2VsZWN0b3IpWzBdIDogdGhpc1swXSxcbiAgICAgIGNvbGxlY3Rpb24gPSBzZWxlY3RvciA/IHRoaXMgOiBjYXNoKGNoaWxkKS5wYXJlbnQoKS5jaGlsZHJlbigpO1xuICByZXR1cm4gaW5kZXhPZi5jYWxsKGNvbGxlY3Rpb24sIGNoaWxkKTtcbn07XG5cbmZuLmNsb3Nlc3QgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICB2YXIgZmlsdGVyZWQgPSB0aGlzLmZpbHRlcihjb21wYXJhdG9yKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuICB2YXIgJHBhcmVudCA9IHRoaXMucGFyZW50KCk7XG4gIGlmICghJHBhcmVudC5sZW5ndGgpIHJldHVybiBmaWx0ZXJlZDtcbiAgcmV0dXJuICRwYXJlbnQuY2xvc2VzdChjb21wYXJhdG9yKTtcbn07XG5cbmZuLnBhcmVudHMgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncGFyZW50RWxlbWVudCcsIHRydWUsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5wYXJlbnRzVW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50cyhjb21wYXJhdG9yLCB1bnRpbCk7XG59O1xuXG5mbi5wcmV2ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF9hbGwsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnLCBfYWxsLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucHJldkFsbCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnByZXYoY29tcGFyYXRvciwgdHJ1ZSk7XG59O1xuXG5mbi5wcmV2VW50aWwgPSBmdW5jdGlvbiAodW50aWwsIGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucHJldihjb21wYXJhdG9yLCB0cnVlLCB1bnRpbCk7XG59O1xuXG5mbi5zaWJsaW5ncyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGNhc2goZWxlKS5wYXJlbnQoKS5jaGlsZHJlbigpLm5vdChlbGUpO1xuICB9KSkpLCBjb21wYXJhdG9yKTtcbn07IC8vIEBvcHRpb25hbCAuL2NoaWxkcmVuLnRzXG4vLyBAb3B0aW9uYWwgLi9jbG9zZXN0LnRzXG4vLyBAb3B0aW9uYWwgLi9jb250ZW50cy50c1xuLy8gQG9wdGlvbmFsIC4vZmluZC50c1xuLy8gQG9wdGlvbmFsIC4vaGFzLnRzXG4vLyBAb3B0aW9uYWwgLi9pcy50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dC50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dF9hbGwudHNcbi8vIEBvcHRpb25hbCAuL25leHRfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL25vdC50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50LnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnRzLnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnRzX3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2LnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2X2FsbC50c1xuLy8gQG9wdGlvbmFsIC4vcHJldl91bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vc2libGluZ3MudHNcbi8vIEBvcHRpb25hbCBhdHRyaWJ1dGVzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgY29sbGVjdGlvbi9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGNzcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGRhdGEvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBkaW1lbnNpb25zL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZWZmZWN0cy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGV2ZW50cy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGZvcm1zL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgbWFuaXB1bGF0aW9uL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgb2Zmc2V0L2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgdHJhdmVyc2FsL2luZGV4LnRzXG4vLyBAcmVxdWlyZSBjb3JlL2luZGV4LnRzXG4vLyBAcHJpb3JpdHkgLTEwMFxuLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG4vLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gTm9kZS5qc1xuICBtb2R1bGUuZXhwb3J0cyA9IGNhc2g7XG59IGVsc2Uge1xuICAvLyBCcm93c2VyXG4gIHdpblsnY2FzaCddID0gd2luWyckJ10gPSBjYXNoO1xufVxufSkoKTsiLCIndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBvdXQkID0gdHlwZW9mIGV4cG9ydHMgIT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0cyB8fCB0eXBlb2YgZGVmaW5lICE9ICd1bmRlZmluZWQnICYmIHt9IHx8IHRoaXMgfHwgd2luZG93O1xuICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIGRlZmluZSgnc2F2ZS1zdmctYXMtcG5nJywgW10sIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb3V0JDtcbiAgfSk7XG4gIG91dCQuZGVmYXVsdCA9IG91dCQ7XG5cbiAgdmFyIHhtbE5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJztcbiAgdmFyIHhodG1sTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gIHZhciBzdmdOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIHZhciBkb2N0eXBlID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCIgWzwhRU5USVRZIG5ic3AgXCImIzE2MDtcIj5dPic7XG4gIHZhciB1cmxSZWdleCA9IC91cmxcXChbXCInXT8oLis/KVtcIiddP1xcKS87XG4gIHZhciBmb250Rm9ybWF0cyA9IHtcbiAgICB3b2ZmMjogJ2ZvbnQvd29mZjInLFxuICAgIHdvZmY6ICdmb250L3dvZmYnLFxuICAgIG90ZjogJ2FwcGxpY2F0aW9uL3gtZm9udC1vcGVudHlwZScsXG4gICAgdHRmOiAnYXBwbGljYXRpb24veC1mb250LXR0ZicsXG4gICAgZW90OiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIHNmbnQ6ICdhcHBsaWNhdGlvbi9mb250LXNmbnQnLFxuICAgIHN2ZzogJ2ltYWdlL3N2Zyt4bWwnXG4gIH07XG5cbiAgdmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgb2JqIGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbiAgfTtcbiAgdmFyIHJlcXVpcmVEb21Ob2RlID0gZnVuY3Rpb24gcmVxdWlyZURvbU5vZGUoZWwpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbCkpIHRocm93IG5ldyBFcnJvcignYW4gSFRNTEVsZW1lbnQgb3IgU1ZHRWxlbWVudCBpcyByZXF1aXJlZDsgZ290ICcgKyBlbCk7XG4gIH07XG4gIHZhciByZXF1aXJlRG9tTm9kZVByb21pc2UgPSBmdW5jdGlvbiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKGlzRWxlbWVudChlbCkpIHJlc29sdmUoZWwpO2Vsc2UgcmVqZWN0KG5ldyBFcnJvcignYW4gSFRNTEVsZW1lbnQgb3IgU1ZHRWxlbWVudCBpcyByZXF1aXJlZDsgZ290ICcgKyBlbCkpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgaXNFeHRlcm5hbCA9IGZ1bmN0aW9uIGlzRXh0ZXJuYWwodXJsKSB7XG4gICAgcmV0dXJuIHVybCAmJiB1cmwubGFzdEluZGV4T2YoJ2h0dHAnLCAwKSA9PT0gMCAmJiB1cmwubGFzdEluZGV4T2Yod2luZG93LmxvY2F0aW9uLmhvc3QpID09PSAtMTtcbiAgfTtcblxuICB2YXIgZ2V0Rm9udE1pbWVUeXBlRnJvbVVybCA9IGZ1bmN0aW9uIGdldEZvbnRNaW1lVHlwZUZyb21VcmwoZm9udFVybCkge1xuICAgIHZhciBmb3JtYXRzID0gT2JqZWN0LmtleXMoZm9udEZvcm1hdHMpLmZpbHRlcihmdW5jdGlvbiAoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gZm9udFVybC5pbmRleE9mKCcuJyArIGV4dGVuc2lvbikgPiAwO1xuICAgIH0pLm1hcChmdW5jdGlvbiAoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gZm9udEZvcm1hdHNbZXh0ZW5zaW9uXTtcbiAgICB9KTtcbiAgICBpZiAoZm9ybWF0cykgcmV0dXJuIGZvcm1hdHNbMF07XG4gICAgY29uc29sZS5lcnJvcignVW5rbm93biBmb250IGZvcm1hdCBmb3IgJyArIGZvbnRVcmwgKyAnLiBGb250cyBtYXkgbm90IGJlIHdvcmtpbmcgY29ycmVjdGx5LicpO1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgfTtcblxuICB2YXIgYXJyYXlCdWZmZXJUb0Jhc2U2NCA9IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyKSB7XG4gICAgdmFyIGJpbmFyeSA9ICcnO1xuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICB9cmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XG4gIH07XG5cbiAgdmFyIGdldERpbWVuc2lvbiA9IGZ1bmN0aW9uIGdldERpbWVuc2lvbihlbCwgY2xvbmUsIGRpbSkge1xuICAgIHZhciB2ID0gZWwudmlld0JveCAmJiBlbC52aWV3Qm94LmJhc2VWYWwgJiYgZWwudmlld0JveC5iYXNlVmFsW2RpbV0gfHwgY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkgIT09IG51bGwgJiYgIWNsb25lLmdldEF0dHJpYnV0ZShkaW0pLm1hdGNoKC8lJC8pICYmIHBhcnNlSW50KGNsb25lLmdldEF0dHJpYnV0ZShkaW0pKSB8fCBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1dIHx8IHBhcnNlSW50KGNsb25lLnN0eWxlW2RpbV0pIHx8IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKGRpbSkpO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgfHwgdiA9PT0gbnVsbCB8fCBpc05hTihwYXJzZUZsb2F0KHYpKSA/IDAgOiB2O1xuICB9O1xuXG4gIHZhciBnZXREaW1lbnNpb25zID0gZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbCwgY2xvbmUsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ3N2ZycpIHJldHVybiB7XG4gICAgICB3aWR0aDogd2lkdGggfHwgZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgJ3dpZHRoJyksXG4gICAgICBoZWlnaHQ6IGhlaWdodCB8fCBnZXREaW1lbnNpb24oZWwsIGNsb25lLCAnaGVpZ2h0JylcbiAgICB9O2Vsc2UgaWYgKGVsLmdldEJCb3gpIHtcbiAgICAgIHZhciBfZWwkZ2V0QkJveCA9IGVsLmdldEJCb3goKSxcbiAgICAgICAgICB4ID0gX2VsJGdldEJCb3gueCxcbiAgICAgICAgICB5ID0gX2VsJGdldEJCb3gueSxcbiAgICAgICAgICBfd2lkdGggPSBfZWwkZ2V0QkJveC53aWR0aCxcbiAgICAgICAgICBfaGVpZ2h0ID0gX2VsJGdldEJCb3guaGVpZ2h0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogeCArIF93aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5ICsgX2hlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJlRW5jb2RlID0gZnVuY3Rpb24gcmVFbmNvZGUoZGF0YSkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csIGZ1bmN0aW9uIChtYXRjaCwgcDEpIHtcbiAgICAgIHZhciBjID0gU3RyaW5nLmZyb21DaGFyQ29kZSgnMHgnICsgcDEpO1xuICAgICAgcmV0dXJuIGMgPT09ICclJyA/ICclMjUnIDogYztcbiAgICB9KSk7XG4gIH07XG5cbiAgdmFyIHVyaVRvQmxvYiA9IGZ1bmN0aW9uIHVyaVRvQmxvYih1cmkpIHtcbiAgICB2YXIgYnl0ZVN0cmluZyA9IHdpbmRvdy5hdG9iKHVyaS5zcGxpdCgnLCcpWzFdKTtcbiAgICB2YXIgbWltZVN0cmluZyA9IHVyaS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgICB2YXIgaW50QXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaW50QXJyYXlbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBtaW1lU3RyaW5nIH0pO1xuICB9O1xuXG4gIHZhciBxdWVyeSA9IGZ1bmN0aW9uIHF1ZXJ5KGVsLCBzZWxlY3Rvcikge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIHx8IGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBDU1Mgc2VsZWN0b3IgXCInICsgc2VsZWN0b3IgKyAnXCInLCBlcnIpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZGV0ZWN0Q3NzRm9udCA9IGZ1bmN0aW9uIGRldGVjdENzc0ZvbnQocnVsZSwgaHJlZikge1xuICAgIC8vIE1hdGNoIENTUyBmb250LWZhY2UgcnVsZXMgdG8gZXh0ZXJuYWwgbGlua3MuXG4gICAgLy8gQGZvbnQtZmFjZSB7XG4gICAgLy8gICBzcmM6IGxvY2FsKCdBYmVsJyksIHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvYWJlbC92Ni9Vek4taWVqUjFWb1hVMk9jLTdMc2J2ZXNaVzJ4T1EteHNOcU80N201NURBLndvZmYyKTtcbiAgICAvLyB9XG4gICAgdmFyIG1hdGNoID0gcnVsZS5jc3NUZXh0Lm1hdGNoKHVybFJlZ2V4KTtcbiAgICB2YXIgdXJsID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgaWYgKCF1cmwgfHwgdXJsLm1hdGNoKC9eZGF0YTovKSB8fCB1cmwgPT09ICdhYm91dDpibGFuaycpIHJldHVybjtcbiAgICB2YXIgZnVsbFVybCA9IHVybC5zdGFydHNXaXRoKCcuLi8nKSA/IGhyZWYgKyAnLy4uLycgKyB1cmwgOiB1cmwuc3RhcnRzV2l0aCgnLi8nKSA/IGhyZWYgKyAnLy4nICsgdXJsIDogdXJsO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBydWxlLmNzc1RleHQsXG4gICAgICBmb3JtYXQ6IGdldEZvbnRNaW1lVHlwZUZyb21VcmwoZnVsbFVybCksXG4gICAgICB1cmw6IGZ1bGxVcmxcbiAgICB9O1xuICB9O1xuXG4gIHZhciBpbmxpbmVJbWFnZXMgPSBmdW5jdGlvbiBpbmxpbmVJbWFnZXMoZWwpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsKCdpbWFnZScpKS5tYXAoZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICB2YXIgaHJlZiA9IGltYWdlLmdldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ2hyZWYnKSB8fCBpbWFnZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIGlmICghaHJlZikgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgIGlmIChpc0V4dGVybmFsKGhyZWYpKSB7XG4gICAgICAgIGhyZWYgKz0gKGhyZWYuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyAndD0nICsgbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICAgIGltZy5zcmMgPSBocmVmO1xuICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgJyArIGhyZWYpKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicsIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciBjYWNoZWRGb250cyA9IHt9O1xuICB2YXIgaW5saW5lRm9udHMgPSBmdW5jdGlvbiBpbmxpbmVGb250cyhmb250cykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmb250cy5tYXAoZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChjYWNoZWRGb250c1tmb250LnVybF0pIHJldHVybiByZXNvbHZlKGNhY2hlZEZvbnRzW2ZvbnQudXJsXSk7XG5cbiAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBUT0RPOiBpdCBtYXkgYWxzbyBiZSB3b3J0aCBpdCB0byB3YWl0IHVudGlsIGZvbnRzIGFyZSBmdWxseSBsb2FkZWQgYmVmb3JlXG4gICAgICAgICAgLy8gYXR0ZW1wdGluZyB0byByYXN0ZXJpemUgdGhlbS4gKGUuZy4gdXNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Gb250RmFjZVNldClcbiAgICAgICAgICB2YXIgZm9udEluQmFzZTY0ID0gYXJyYXlCdWZmZXJUb0Jhc2U2NChyZXEucmVzcG9uc2UpO1xuICAgICAgICAgIHZhciBmb250VXJpID0gZm9udC50ZXh0LnJlcGxhY2UodXJsUmVnZXgsICd1cmwoXCJkYXRhOicgKyBmb250LmZvcm1hdCArICc7YmFzZTY0LCcgKyBmb250SW5CYXNlNjQgKyAnXCIpJykgKyAnXFxuJztcbiAgICAgICAgICBjYWNoZWRGb250c1tmb250LnVybF0gPSBmb250VXJpO1xuICAgICAgICAgIHJlc29sdmUoZm9udFVyaSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgZm9udCBmcm9tOiAnICsgZm9udC51cmwsIGUpO1xuICAgICAgICAgIGNhY2hlZEZvbnRzW2ZvbnQudXJsXSA9IG51bGw7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdBYm9ydGVkIGxvYWRpbmcgZm9udCBmcm9tOiAnICsgZm9udC51cmwsIGUpO1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEub3BlbignR0VUJywgZm9udC51cmwpO1xuICAgICAgICByZXEucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgcmVxLnNlbmQoKTtcbiAgICAgIH0pO1xuICAgIH0pKS50aGVuKGZ1bmN0aW9uIChmb250Q3NzKSB7XG4gICAgICByZXR1cm4gZm9udENzcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgY2FjaGVkUnVsZXMgPSBudWxsO1xuICB2YXIgc3R5bGVTaGVldFJ1bGVzID0gZnVuY3Rpb24gc3R5bGVTaGVldFJ1bGVzKCkge1xuICAgIGlmIChjYWNoZWRSdWxlcykgcmV0dXJuIGNhY2hlZFJ1bGVzO1xuICAgIHJldHVybiBjYWNoZWRSdWxlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMpLm1hcChmdW5jdGlvbiAoc2hlZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IHJ1bGVzOiBzaGVldC5jc3NSdWxlcywgaHJlZjogc2hlZXQuaHJlZiB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1N0eWxlc2hlZXQgY291bGQgbm90IGJlIGxvYWRlZDogJyArIHNoZWV0LmhyZWYsIGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGlubGluZUNzcyA9IGZ1bmN0aW9uIGlubGluZUNzcyhlbCwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgc2VsZWN0b3JSZW1hcCA9IF9yZWYuc2VsZWN0b3JSZW1hcCxcbiAgICAgICAgbW9kaWZ5U3R5bGUgPSBfcmVmLm1vZGlmeVN0eWxlLFxuICAgICAgICBtb2RpZnlDc3MgPSBfcmVmLm1vZGlmeUNzcyxcbiAgICAgICAgZm9udHMgPSBfcmVmLmZvbnRzLFxuICAgICAgICBleGNsdWRlVW51c2VkQ3NzID0gX3JlZi5leGNsdWRlVW51c2VkQ3NzO1xuXG4gICAgdmFyIGdlbmVyYXRlQ3NzID0gbW9kaWZ5Q3NzIHx8IGZ1bmN0aW9uIChzZWxlY3RvciwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHNlbCA9IHNlbGVjdG9yUmVtYXAgPyBzZWxlY3RvclJlbWFwKHNlbGVjdG9yKSA6IHNlbGVjdG9yO1xuICAgICAgdmFyIHByb3BzID0gbW9kaWZ5U3R5bGUgPyBtb2RpZnlTdHlsZShwcm9wZXJ0aWVzKSA6IHByb3BlcnRpZXM7XG4gICAgICByZXR1cm4gc2VsICsgJ3snICsgcHJvcHMgKyAnfVxcbic7XG4gICAgfTtcbiAgICB2YXIgY3NzID0gW107XG4gICAgdmFyIGRldGVjdEZvbnRzID0gdHlwZW9mIGZvbnRzID09PSAndW5kZWZpbmVkJztcbiAgICB2YXIgZm9udExpc3QgPSBmb250cyB8fCBbXTtcbiAgICBzdHlsZVNoZWV0UnVsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIHJ1bGVzID0gX3JlZjIucnVsZXMsXG4gICAgICAgICAgaHJlZiA9IF9yZWYyLmhyZWY7XG5cbiAgICAgIGlmICghcnVsZXMpIHJldHVybjtcbiAgICAgIEFycmF5LmZyb20ocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBydWxlLnN0eWxlICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHF1ZXJ5KGVsLCBydWxlLnNlbGVjdG9yVGV4dCkpIGNzcy5wdXNoKGdlbmVyYXRlQ3NzKHJ1bGUuc2VsZWN0b3JUZXh0LCBydWxlLnN0eWxlLmNzc1RleHQpKTtlbHNlIGlmIChkZXRlY3RGb250cyAmJiBydWxlLmNzc1RleHQubWF0Y2goL15AZm9udC1mYWNlLykpIHtcbiAgICAgICAgICAgIHZhciBmb250ID0gZGV0ZWN0Q3NzRm9udChydWxlLCBocmVmKTtcbiAgICAgICAgICAgIGlmIChmb250KSBmb250TGlzdC5wdXNoKGZvbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWV4Y2x1ZGVVbnVzZWRDc3MpIHtcbiAgICAgICAgICAgIGNzcy5wdXNoKHJ1bGUuY3NzVGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbmxpbmVGb250cyhmb250TGlzdCkudGhlbihmdW5jdGlvbiAoZm9udENzcykge1xuICAgICAgcmV0dXJuIGNzcy5qb2luKCdcXG4nKSArIGZvbnRDc3M7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGRvd25sb2FkT3B0aW9ucyA9IGZ1bmN0aW9uIGRvd25sb2FkT3B0aW9ucygpIHtcbiAgICBpZiAoIW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iICYmICEoJ2Rvd25sb2FkJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykpKSB7XG4gICAgICByZXR1cm4geyBwb3B1cDogd2luZG93Lm9wZW4oKSB9O1xuICAgIH1cbiAgfTtcblxuICBvdXQkLnByZXBhcmVTdmcgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG5cbiAgICB2YXIgX3JlZjMgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMyRsZWZ0ID0gX3JlZjMubGVmdCxcbiAgICAgICAgbGVmdCA9IF9yZWYzJGxlZnQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmMyRsZWZ0LFxuICAgICAgICBfcmVmMyR0b3AgPSBfcmVmMy50b3AsXG4gICAgICAgIHRvcCA9IF9yZWYzJHRvcCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYzJHRvcCxcbiAgICAgICAgdyA9IF9yZWYzLndpZHRoLFxuICAgICAgICBoID0gX3JlZjMuaGVpZ2h0LFxuICAgICAgICBfcmVmMyRzY2FsZSA9IF9yZWYzLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9yZWYzJHNjYWxlID09PSB1bmRlZmluZWQgPyAxIDogX3JlZjMkc2NhbGUsXG4gICAgICAgIF9yZWYzJHJlc3BvbnNpdmUgPSBfcmVmMy5yZXNwb25zaXZlLFxuICAgICAgICByZXNwb25zaXZlID0gX3JlZjMkcmVzcG9uc2l2ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmMyRyZXNwb25zaXZlLFxuICAgICAgICBfcmVmMyRleGNsdWRlQ3NzID0gX3JlZjMuZXhjbHVkZUNzcyxcbiAgICAgICAgZXhjbHVkZUNzcyA9IF9yZWYzJGV4Y2x1ZGVDc3MgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjMkZXhjbHVkZUNzcztcblxuICAgIHJldHVybiBpbmxpbmVJbWFnZXMoZWwpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNsb25lID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgY2xvbmUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKG9wdGlvbnMgfHwge30pLmJhY2tncm91bmRDb2xvciB8fCBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgIHZhciBfZ2V0RGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoZWwsIGNsb25lLCB3LCBoKSxcbiAgICAgICAgICB3aWR0aCA9IF9nZXREaW1lbnNpb25zLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9nZXREaW1lbnNpb25zLmhlaWdodDtcblxuICAgICAgaWYgKGVsLnRhZ05hbWUgIT09ICdzdmcnKSB7XG4gICAgICAgIGlmIChlbC5nZXRCQm94KSB7XG4gICAgICAgICAgaWYgKGNsb25lLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBjbG9uZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLnJlcGxhY2UoL3RyYW5zbGF0ZVxcKC4qP1xcKS8sICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgICAgY2xvbmUgPSBzdmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXR0ZW1wdGVkIHRvIHJlbmRlciBub24tU1ZHIGVsZW1lbnQnLCBlbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndmVyc2lvbicsICcxLjEnKTtcbiAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdLmpvaW4oJyAnKSk7XG4gICAgICBpZiAoIWNsb25lLmdldEF0dHJpYnV0ZSgneG1sbnMnKSkgY2xvbmUuc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxucycsIHN2Z05zKTtcbiAgICAgIGlmICghY2xvbmUuZ2V0QXR0cmlidXRlKCd4bWxuczp4bGluaycpKSBjbG9uZS5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zOnhsaW5rJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnKTtcblxuICAgICAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICAgICAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pbllNaW4gbWVldCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoICogc2NhbGUpO1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodCAqIHNjYWxlKTtcbiAgICAgIH1cblxuICAgICAgQXJyYXkuZnJvbShjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCdmb3JlaWduT2JqZWN0ID4gKicpKS5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduT2JqZWN0KSB7XG4gICAgICAgIGZvcmVpZ25PYmplY3Quc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxucycsIGZvcmVpZ25PYmplY3QudGFnTmFtZSA9PT0gJ3N2ZycgPyBzdmdOcyA6IHhodG1sTnMpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGNsdWRlQ3NzKSB7XG4gICAgICAgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgIHZhciBzcmMgPSBvdXRlci5pbm5lckhUTUw7XG4gICAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShzcmMsIHdpZHRoLCBoZWlnaHQpO2Vsc2UgcmV0dXJuIHsgc3JjOiBzcmMsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVDc3MoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKGNzcykge1xuICAgICAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG4gICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gJzwhW0NEQVRBW1xcbicgKyBjc3MgKyAnXFxuXV0+JztcblxuICAgICAgICAgIHZhciBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGVmcycpO1xuICAgICAgICAgIGRlZnMuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICAgIGNsb25lLmluc2VydEJlZm9yZShkZWZzLCBjbG9uZS5maXJzdENoaWxkKTtcblxuICAgICAgICAgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIG91dGVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgICB2YXIgc3JjID0gb3V0ZXIuaW5uZXJIVE1MLnJlcGxhY2UoL05TXFxkKzpocmVmL2dpLCAneG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeGxpbms6aHJlZicpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHNyYywgd2lkdGgsIGhlaWdodCk7ZWxzZSByZXR1cm4geyBzcmM6IHNyYywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnN2Z0FzRGF0YVVyaSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcbiAgICByZXR1cm4gb3V0JC5wcmVwYXJlU3ZnKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgdmFyIHNyYyA9IF9yZWY0LnNyYyxcbiAgICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWY0LmhlaWdodDtcblxuICAgICAgdmFyIHN2Z1htbCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyB3aW5kb3cuYnRvYShyZUVuY29kZShkb2N0eXBlICsgc3JjKSk7XG4gICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZG9uZShzdmdYbWwsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN2Z1htbDtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnN2Z0FzUG5nVXJpID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuXG4gICAgdmFyIF9yZWY1ID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgX3JlZjUkZW5jb2RlclR5cGUgPSBfcmVmNS5lbmNvZGVyVHlwZSxcbiAgICAgICAgZW5jb2RlclR5cGUgPSBfcmVmNSRlbmNvZGVyVHlwZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlL3BuZycgOiBfcmVmNSRlbmNvZGVyVHlwZSxcbiAgICAgICAgX3JlZjUkZW5jb2Rlck9wdGlvbnMgPSBfcmVmNS5lbmNvZGVyT3B0aW9ucyxcbiAgICAgICAgZW5jb2Rlck9wdGlvbnMgPSBfcmVmNSRlbmNvZGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMC44IDogX3JlZjUkZW5jb2Rlck9wdGlvbnMsXG4gICAgICAgIGNhbnZnID0gX3JlZjUuY2Fudmc7XG5cbiAgICB2YXIgY29udmVydFRvUG5nID0gZnVuY3Rpb24gY29udmVydFRvUG5nKF9yZWY2KSB7XG4gICAgICB2YXIgc3JjID0gX3JlZjYuc3JjLFxuICAgICAgICAgIHdpZHRoID0gX3JlZjYud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZjYuaGVpZ2h0O1xuXG4gICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgdmFyIHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcbiAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGNhbnZhcy53aWR0aCArICdweCc7XG4gICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gY2FudmFzLmhlaWdodCArICdweCc7XG4gICAgICBjb250ZXh0LnNldFRyYW5zZm9ybShwaXhlbFJhdGlvLCAwLCAwLCBwaXhlbFJhdGlvLCAwLCAwKTtcblxuICAgICAgaWYgKGNhbnZnKSBjYW52ZyhjYW52YXMsIHNyYyk7ZWxzZSBjb250ZXh0LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuXG4gICAgICB2YXIgcG5nID0gdm9pZCAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcG5nID0gY2FudmFzLnRvRGF0YVVSTChlbmNvZGVyVHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodHlwZW9mIFNlY3VyaXR5RXJyb3IgIT09ICd1bmRlZmluZWQnICYmIGUgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yIHx8IGUubmFtZSA9PT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVuZGVyZWQgU1ZHIGltYWdlcyBjYW5ub3QgYmUgZG93bmxvYWRlZCBpbiB0aGlzIGJyb3dzZXIuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShwbmcsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBuZyk7XG4gICAgfTtcblxuICAgIGlmIChjYW52ZykgcmV0dXJuIG91dCQucHJlcGFyZVN2ZyhlbCwgb3B0aW9ucykudGhlbihjb252ZXJ0VG9QbmcpO2Vsc2UgcmV0dXJuIG91dCQuc3ZnQXNEYXRhVXJpKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoY29udmVydFRvUG5nKHtcbiAgICAgICAgICAgIHNyYzogaW1hZ2UsXG4gICAgICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZWplY3QoJ1RoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHRoZSBkYXRhIFVSSSBhcyBhbiBpbWFnZSBvbiB0aGUgZm9sbG93aW5nIFNWR1xcbicgKyB3aW5kb3cuYXRvYih1cmkuc2xpY2UoMjYpKSArICdPcGVuIHRoZSBmb2xsb3dpbmcgbGluayB0byBzZWUgYnJvd3NlclxcJ3MgZGlhZ25vc2lzXFxuJyArIHVyaSk7XG4gICAgICAgIH07XG4gICAgICAgIGltYWdlLnNyYyA9IHVyaTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuZG93bmxvYWQgPSBmdW5jdGlvbiAobmFtZSwgdXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYih1cmlUb0Jsb2IodXJpKSwgbmFtZSk7ZWxzZSB7XG4gICAgICB2YXIgc2F2ZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBpZiAoJ2Rvd25sb2FkJyBpbiBzYXZlTGluaykge1xuICAgICAgICBzYXZlTGluay5kb3dubG9hZCA9IG5hbWU7XG4gICAgICAgIHNhdmVMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2F2ZUxpbmspO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBibG9iID0gdXJpVG9CbG9iKHVyaSk7XG4gICAgICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICBzYXZlTGluay5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHdoaWxlIGdldHRpbmcgb2JqZWN0IFVSTC4gRmFsbGluZyBiYWNrIHRvIHN0cmluZyBVUkwuJyk7XG4gICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IHVyaTtcbiAgICAgICAgfVxuICAgICAgICBzYXZlTGluay5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNhdmVMaW5rKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBvcHVwKSB7XG4gICAgICAgIG9wdGlvbnMucG9wdXAuZG9jdW1lbnQudGl0bGUgPSBuYW1lO1xuICAgICAgICBvcHRpb25zLnBvcHVwLmxvY2F0aW9uLnJlcGxhY2UodXJpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3V0JC5zYXZlU3ZnID0gZnVuY3Rpb24gKGVsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIGRvd25sb2FkT3B0cyA9IGRvd25sb2FkT3B0aW9ucygpOyAvLyBkb24ndCBpbmxpbmUsIGNhbid0IGJlIGFzeW5jXG4gICAgcmV0dXJuIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkudGhlbihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBvdXQkLnN2Z0FzRGF0YVVyaShlbCwgb3B0aW9ucyB8fCB7fSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gb3V0JC5kb3dubG9hZChuYW1lLCB1cmksIGRvd25sb2FkT3B0cyk7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zYXZlU3ZnQXNQbmcgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZG93bmxvYWRPcHRzID0gZG93bmxvYWRPcHRpb25zKCk7IC8vIGRvbid0IGlubGluZSwgY2FuJ3QgYmUgYXN5bmNcbiAgICByZXR1cm4gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKS50aGVuKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIG91dCQuc3ZnQXNQbmdVcmkoZWwsIG9wdGlvbnMgfHwge30pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG91dCQuZG93bmxvYWQobmFtZSwgdXJpLCBkb3dubG9hZE9wdHMpO1xuICAgIH0pO1xuICB9O1xufSkoKTsiLCJleHBvcnQgY29uc3QgSUNEUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwiZXhwb3J0IGNvbnN0IElEUFMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImNvbnN0IHJuYUNvbG9yID0gJ3JnYigyNTUsMjMwLDE1MyknO1xuY29uc3QgaW52QWJhc2ljQ29sb3IgPSAncmdiKDI1NSwyMzAsMTUzKSc7XG5leHBvcnQgY29uc3QgYXhvbGFic01hcCA9IHtcbiAgICAnUk5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1JOQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQScsICdDJywgJ0cnLCAnVSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnRE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ROQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnZEEnLCAnZEMnLCAnZEcnLCAnZFQnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTk3LDIyNCwxODApJyxcbiAgICB9LFxuICAgICcyXFwnLUZsdW9ybyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLUZsdW9ybyBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQWYnLCAnQ2YnLCAnR2YnLCAnVWYnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNjgsMTE0LDE5NiknLFxuICAgIH0sXG4gICAgJzJcXCctTy1NZXRoeWwnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1ldGh5bCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnYScsICdjJywgJ2cnLCAndSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNjYsMTY2LDE2NiknLFxuICAgIH0sXG4gICAgJzJcXCctTy1NT0UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1PRSBudWNsZW90aWRlcyAoaW5jbHVkaW5nIDUtTWV0aHlsIEMpJyxcbiAgICAgICAgc3ltYm9sczogWydBbScsICdDbScsICdHbScsICdUbSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxMTIsNDgsMTYwKScsXG4gICAgfSxcbiAgICAnR05BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0dseWNvbCBudWNsZWljIGFjaWQnLFxuICAgICAgICBzeW1ib2xzOiBbJyhHTkEtQSknLCAnKEdOQS1DKScsICcoR05BLUcpJywgJyhHTkEtVCknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnTE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0xvY2tlZCBudWNsZWljIGFjaWQgKGluY2x1ZGluZyA1LU1ldGh5bCBDKScsXG4gICAgICAgIHN5bWJvbHM6IFsnQWInLCAnQ2InLCAnR2InLCAnVGInXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNTQsMjI5LDIzOCknLFxuICAgIH0sXG4gICAgJ1VOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdVbmxvY2tlZCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQW8nLCAnQ28nLCAnR28nLCAnVW8nXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdBZGVuaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydhJywgJ2EnLCAnYScsICdhJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdDJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0N5dG9zaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydjJywgJ2MnLCAnYycsICdjJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdHJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0d1YW5pbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2cnLCAnZycsICdnJywgJ2cnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ1UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnVXJhY2lsJyxcbiAgICAgICAgc3ltYm9sczogWyd1JywgJ3UnLCAndScsICd1J10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdYLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1gnLCAnWCcsICdYJywgJ1gnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTA4LDAsMCknLFxuICAgIH0sXG4gICAgJ1ktTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWScsICdZJywgJ1knLCAnWSddLFxuICAgICAgICBjb2xvcjogJ3JnYigyMTAsMTQ2LDE0NiknLFxuICAgIH0sXG4gICAgJ1otTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWicsICdaJywgJ1onLCAnWiddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNTUsMTA4LDEzMiknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkJyxcbiAgICAgICAgc3ltYm9sczogWycoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKSddLFxuICAgICAgICBjb2xvcjogaW52QWJhc2ljQ29sb3IsXG4gICAgfSxcbiAgICAnNVxcJy12aW55bHBzJzoge1xuICAgICAgICBmdWxsTmFtZTogJzVcXCctdmlueWxwaG9zcGhvbmF0ZS0yXFwnLU9NZS11cmlkaW5lJyxcbiAgICAgICAgc3ltYm9sczogWycodmludSknLCAnKHZpbnUpJywgJyh2aW51KScsICcodmludSknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMCwwLDEzOSknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyhvKSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJ10sXG4gICAgICAgIGNvbG9yOiBpbnZBYmFzaWNDb2xvcixcbiAgICB9LFxuICAgICcyXFwnLU9NZS1VKG8pJzoge1xuICAgICAgICBmdWxsTmFtZTogJ051Y2xlb3RpZGUgVXJpZGluZSB3aXRoIDLigJlPLU1ldGh5bCBwcm90ZWN0aW9uIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJ21VJywgJ21VJywgJ21VJywgJ21VJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDY1LDIzMyw4MCknLFxuICAgIH0sXG59O1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKiBEbyBub3QgY2hhbmdlIHRoZXNlIGltcG9ydCBsaW5lcy4gRGF0YWdyb2sgd2lsbCBpbXBvcnQgQVBJIGxpYnJhcnkgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBzdmcgZnJvbSAnc2F2ZS1zdmctYXMtcG5nJztcbmltcG9ydCAkIGZyb20gJ2Nhc2gtZG9tJztcbmltcG9ydCB7IGRyYXdBeG9sYWJzUGF0dGVybiB9IGZyb20gJy4vZHJhd0F4b2xhYnNQYXR0ZXJuJztcbmltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2F4b2xhYnNNYXAnO1xuY29uc3QgYmFzZUNob2ljZXMgPSBPYmplY3Qua2V5cyhheG9sYWJzTWFwKTtcbmNvbnN0IGRlZmF1bHRCYXNlID0gYmFzZUNob2ljZXNbMF07XG5jb25zdCBkZWZhdWx0UHRvID0gdHJ1ZTtcbmNvbnN0IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCA9IDIzO1xuY29uc3QgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGggPSAzNTtcbmNvbnN0IHVzZXJTdG9yYWdlS2V5ID0gJ1NlcXVlbmNlVHJhbnNsYXRvcic7XG5jb25zdCBleGFtcGxlTWluV2lkdGggPSAnNDAwcHgnO1xuZnVuY3Rpb24gZ2VuZXJhdGVFeGFtcGxlKHNlcXVlbmNlTGVuZ3RoLCBzZXF1ZW5jZUJhc2lzKSB7XG4gICAgY29uc3QgdW5pcXVlU3ltYm9scyA9IGF4b2xhYnNNYXBbc2VxdWVuY2VCYXNpc10uc3ltYm9scy5qb2luKCcnKTtcbiAgICByZXR1cm4gdW5pcXVlU3ltYm9scy5yZXBlYXQoTWF0aC5mbG9vcihzZXF1ZW5jZUxlbmd0aCAvIDQpKSArIHVuaXF1ZVN5bWJvbHMuc2xpY2UoMCwgc2VxdWVuY2VMZW5ndGggJSA0KTtcbn1cbmZ1bmN0aW9uIGZpbmREdXBsaWNhdGVzKGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKS5maWx0ZXIoKHZhbHVlKSA9PiBkYXRhLmluZGV4T2YodmFsdWUpICE9PSBkYXRhLmxhc3RJbmRleE9mKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHBhdHRlcm5OYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkIGdyb2suZGFwaS51c2Vycy5jdXJyZW50KCkudGhlbigodXNlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgbGFzdE5hbWVdID0gZ2V0VXNlck5hbWUocGF0dGVybk5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICh1c2VyLmZpcnN0TmFtZSAhPSBmaXJzdE5hbWUgfHwgdXNlci5sYXN0TmFtZSAhPSBsYXN0TmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0U2hvcnROYW1lKHBhdHRlcm5OYW1lKSB7XG4gICAgbGV0IGZpcnN0ID0gcGF0dGVybk5hbWUubGVuZ3RoICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5OYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuTmFtZVtpXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuTmFtZS5zbGljZSgwLCBmaXJzdCAtIDEpO1xufVxuZnVuY3Rpb24gZ2V0VXNlck5hbWUocGF0dGVybk5hbWUpIHtcbiAgICBsZXQgZmlyc3QgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5OYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuTmFtZVtpXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoZmlyc3QgPT0gLTEpID8gWycnLCAnJ10gOiBwYXR0ZXJuTmFtZS5zbGljZShmaXJzdCArIDksIHBhdHRlcm5OYW1lLmxlbmd0aCAtIDEpLnNwbGl0KCcgJykuc2xpY2UoMSk7XG59XG5mdW5jdGlvbiB0cmFuc2xhdGVTZXF1ZW5jZShzZXF1ZW5jZSwgYmFzZXMsIHB0b0xpbmthZ2VzLCBzdGFydE1vZGlmaWNhdGlvbiwgZW5kTW9kaWZpY2F0aW9uLCBmaXJzdFB0b0V4aXN0KSB7XG4gICAgbGV0IGNvdW50ZXIgPSAtMTtcbiAgICBsZXQgbWFpblNlcXVlbmNlID0gc2VxdWVuY2UucmVwbGFjZSgvW0FVR0NdL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgY29uc3QgaW5kZXhPZlN5bWJvbCA9IGF4b2xhYnNNYXBbJ1JOQSddWydzeW1ib2xzJ10uaW5kZXhPZih4KTtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gYXhvbGFic01hcFtiYXNlc1tjb3VudGVyXS52YWx1ZV1bJ3N5bWJvbHMnXVtpbmRleE9mU3ltYm9sXTtcbiAgICAgICAgcmV0dXJuIChwdG9MaW5rYWdlc1tjb3VudGVyXS52YWx1ZSkgPyBzeW1ib2wgKyAncycgOiBzeW1ib2w7XG4gICAgfSk7XG4gICAgaWYgKG1haW5TZXF1ZW5jZS5zbGljZSgwLCA1KS5zcGxpdCgnbVUnKS5sZW5ndGggPT0gMylcbiAgICAgICAgbWFpblNlcXVlbmNlID0gJyh1dSknICsgbWFpblNlcXVlbmNlLnNsaWNlKDQpO1xuICAgIGlmIChtYWluU2VxdWVuY2Uuc2xpY2UobWFpblNlcXVlbmNlLmxlbmd0aCAtIDcpLnNwbGl0KCdtVScpLmxlbmd0aCA9PSAzKVxuICAgICAgICBtYWluU2VxdWVuY2UgPSBtYWluU2VxdWVuY2Uuc2xpY2UoMCwgbWFpblNlcXVlbmNlLmxlbmd0aCAtIDQpICsgJyh1dSknO1xuICAgIHJldHVybiBzdGFydE1vZGlmaWNhdGlvbi52YWx1ZSArIChmaXJzdFB0b0V4aXN0ID8gJ3MnIDogJycpICsgbWFpblNlcXVlbmNlICsgZW5kTW9kaWZpY2F0aW9uLnZhbHVlO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uV2l0aElkcyh0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIHBhdHRlcm5OYW1lKSB7XG4gICAgY29uc3QgbmFtZU9mTmV3Q29sdW1uID0gJ0lEICcgKyBwYXR0ZXJuTmFtZTtcbiAgICBjb25zdCBjb2x1bW5zID0gZ3Jvay5zaGVsbC50YWJsZSh0YWJsZU5hbWUpLmNvbHVtbnM7XG4gICAgaWYgKGNvbHVtbnMuY29udGFpbnMobmFtZU9mTmV3Q29sdW1uKSlcbiAgICAgICAgY29sdW1ucy5yZW1vdmUobmFtZU9mTmV3Q29sdW1uKTtcbiAgICBjb25zdCBjb2x1bW5XaXRoSWRzID0gY29sdW1ucy5ieU5hbWUoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGNvbHVtbnMuYWRkTmV3U3RyaW5nKG5hbWVPZk5ld0NvbHVtbikuaW5pdCgoaSkgPT4ge1xuICAgICAgICByZXR1cm4gKGNvbHVtbldpdGhJZHMuZ2V0U3RyaW5nKGkpID09ICcnKSA/ICcnIDogY29sdW1uV2l0aElkcy5nZXQoaSkgKyAnXycgKyBwYXR0ZXJuTmFtZTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgYmFzZXMsIHB0b0xpbmthZ2VzLCBzdGFydE1vZGlmaWNhdGlvbiwgZW5kTW9kaWZpY2F0aW9uLCBmaXJzdFB0b0V4aXN0KSB7XG4gICAgY29uc3QgbmFtZU9mTmV3Q29sdW1uID0gJ0F4b2xhYnMgJyArIGNvbHVtbk5hbWU7XG4gICAgY29uc3QgY29sdW1ucyA9IGdyb2suc2hlbGwudGFibGUodGFibGVOYW1lKS5jb2x1bW5zO1xuICAgIGlmIChjb2x1bW5zLmNvbnRhaW5zKG5hbWVPZk5ld0NvbHVtbikpXG4gICAgICAgIGNvbHVtbnMucmVtb3ZlKG5hbWVPZk5ld0NvbHVtbik7XG4gICAgY29uc3QgY29sdW1uV2l0aElucHV0U2VxdWVuY2VzID0gY29sdW1ucy5ieU5hbWUoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGNvbHVtbnMuYWRkTmV3U3RyaW5nKG5hbWVPZk5ld0NvbHVtbikuaW5pdCgoaSkgPT4ge1xuICAgICAgICByZXR1cm4gY29sdW1uV2l0aElucHV0U2VxdWVuY2VzLmdldFN0cmluZyhpKSA9PSAnJyA/XG4gICAgICAgICAgICAnJyA6XG4gICAgICAgICAgICB0cmFuc2xhdGVTZXF1ZW5jZShjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMuZ2V0U3RyaW5nKGkpLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUF4b2xhYnNQYXR0ZXJuKCkge1xuICAgIGNvbnN0IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMgPSBbZGVmYXVsdEJhc2VdO1xuICAgIGxldCBtYXhpbWFsU3NMZW5ndGggPSBkZWZhdWx0U2VxdWVuY2VMZW5ndGg7XG4gICAgbGV0IG1heGltYWxBc0xlbmd0aCA9IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aDtcbiAgICBmdW5jdGlvbiB1cGRhdGVBc01vZGlmaWNhdGlvbigpIHtcbiAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcy5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgYXNQdG9MaW5rYWdlcyA9IGFzUHRvTGlua2FnZXMuY29uY2F0KEFycmF5KG1heGltYWxBc0xlbmd0aCAtIGFzQmFzZXMubGVuZ3RoKS5maWxsKGZ1bGx5UHRvKSk7XG4gICAgICAgIGFzQmFzZXMgPSBhc0Jhc2VzLmNvbmNhdChBcnJheShtYXhpbWFsQXNMZW5ndGggLSBhc0Jhc2VzLmxlbmd0aCkuZmlsbChzZXF1ZW5jZUJhc2UpKTtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0xlbmd0aC52YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICBhc1B0b0xpbmthZ2VzW2ldID0gdWkuYm9vbElucHV0KCcnLCBhc1B0b0xpbmthZ2VzW2ldLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNCYXNlc1tpXSA9IHVpLmNob2ljZUlucHV0KCcnLCBhc0Jhc2VzW2ldLnZhbHVlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYuYXBwZW5kKHVpLmJvb2xJbnB1dCh2LCB0cnVlLCAoYm9vbFYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib29sVikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YodiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5yb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlQXNNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXIrKztcbiAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uSXRlbXMuYXBwZW5kKHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgIHVpLmRpdihbdWkubGFiZWwoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgPT0gJyhvKScgPyAnJyA6IFN0cmluZyhudWNsZW90aWRlQ291bnRlcikpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICAgICAgdWkuYmxvY2s3NShbYXNCYXNlc1tpXV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbYXNQdG9MaW5rYWdlc1tpXV0pLFxuICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTc01vZGlmaWNhdGlvbigpIHtcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcy5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgc3NQdG9MaW5rYWdlcyA9IHNzUHRvTGlua2FnZXMuY29uY2F0KEFycmF5KG1heGltYWxTc0xlbmd0aCAtIHNzQmFzZXMubGVuZ3RoKS5maWxsKGZ1bGx5UHRvKSk7XG4gICAgICAgIHNzQmFzZXMgPSBzc0Jhc2VzLmNvbmNhdChBcnJheShtYXhpbWFsU3NMZW5ndGggLSBzc0Jhc2VzLmxlbmd0aCkuZmlsbChzZXF1ZW5jZUJhc2UpKTtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0xlbmd0aC52YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICBzc1B0b0xpbmthZ2VzW2ldID0gdWkuYm9vbElucHV0KCcnLCBzc1B0b0xpbmthZ2VzW2ldLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3NCYXNlc1tpXSA9IHVpLmNob2ljZUlucHV0KCcnLCBzc0Jhc2VzW2ldLnZhbHVlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYuYXBwZW5kKHVpLmJvb2xJbnB1dCh2LCB0cnVlLCAoYm9vbFYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib29sVikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YodiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5yb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlU3NNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc3NCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXIrKztcbiAgICAgICAgICAgIHNzTW9kaWZpY2F0aW9uSXRlbXMuYXBwZW5kKHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgIHVpLmRpdihbdWkubGFiZWwoc3NCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgPT0gJyhvKScgPyAnJyA6IFN0cmluZyhudWNsZW90aWRlQ291bnRlcikpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICAgICAgdWkuYmxvY2s3NShbc3NCYXNlc1tpXV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbc3NQdG9MaW5rYWdlc1tpXV0pLFxuICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkge1xuICAgICAgICBpZiAoc3NMZW5ndGgudmFsdWUgPCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCAmJiBhc0xlbmd0aC52YWx1ZSA8IG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc3NMZW5ndGgudmFsdWUgPiBtYXhpbWFsU3NMZW5ndGgpXG4gICAgICAgICAgICAgICAgbWF4aW1hbFNzTGVuZ3RoID0gc3NMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAoYXNMZW5ndGgudmFsdWUgPiBtYXhpbWFsQXNMZW5ndGgpXG4gICAgICAgICAgICAgICAgbWF4aW1hbEFzTGVuZ3RoID0gYXNMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICB1cGRhdGVTc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdXBkYXRlQXNNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgdXBkYXRlSW5wdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnU2VxdWVuY2UgbGVuZ3RoIGlzIG91dCBvZiByYW5nZScpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdTZXF1ZW5jZSBsZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiAnICtcbiAgICAgICAgICAgICAgICBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aC50b1N0cmluZygpICsgJyBkdWUgdG8gVUkgY29uc3RyYWlucy4nKSlcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1BsZWFzZSBjaGFuZ2Ugc2VxdWVuY2UgbGVuZ3RoIGluIG9yZGVyIHRvIGRlZmluZSBuZXcgcGF0dGVybi4nKSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVB0byhuZXdQdG9WYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzUHRvTGlua2FnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzc1B0b0xpbmthZ2VzW2ldLnZhbHVlID0gbmV3UHRvVmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNQdG9MaW5rYWdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGFzUHRvTGlua2FnZXNbaV0udmFsdWUgPSBuZXdQdG9WYWx1ZTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUJhc2VzKG5ld0Jhc2lzVmFsdWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0Jhc2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc3NCYXNlc1tpXS52YWx1ZSA9IG5ld0Jhc2lzVmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNCYXNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGFzQmFzZXNbaV0udmFsdWUgPSBuZXdCYXNpc1ZhbHVlO1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW5wdXRFeGFtcGxlcygpIHtcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBnZW5lcmF0ZUV4YW1wbGUoc3NMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSlcbiAgICAgICAgICAgIGFzSW5wdXRFeGFtcGxlLnZhbHVlID0gZ2VuZXJhdGVFeGFtcGxlKGFzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPdXRwdXRFeGFtcGxlcygpIHtcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSkge1xuICAgICAgICAgICAgYXNPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RBc1B0by52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlU3ZnU2NoZW1lKCkge1xuICAgICAgICBzdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHN2Z0Rpdi5hcHBlbmQodWkuc3BhbihbXG4gICAgICAgICAgICBkcmF3QXhvbGFic1BhdHRlcm4oZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSksIGNyZWF0ZUFzU3RyYW5kLnZhbHVlLCBzc0Jhc2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBhc0Jhc2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBbZmlyc3RTc1B0by52YWx1ZV0uY29uY2F0KHNzUHRvTGlua2FnZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBbZmlyc3RBc1B0by52YWx1ZV0uY29uY2F0KGFzUHRvTGlua2FnZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLCBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsIGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSwgY29tbWVudC52YWx1ZSwgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGV0ZWN0RGVmYXVsdEJhc2lzKGFycmF5KSB7XG4gICAgICAgIGNvbnN0IG1vZGVNYXAgPSB7fTtcbiAgICAgICAgbGV0IG1heEVsID0gYXJyYXlbMF07XG4gICAgICAgIGxldCBtYXhDb3VudCA9IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gYXJyYXlbaV07XG4gICAgICAgICAgICBpZiAobW9kZU1hcFtlbF0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICBtb2RlTWFwW2VsXSA9IDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9kZU1hcFtlbF0rKztcbiAgICAgICAgICAgIGlmIChtb2RlTWFwW2VsXSA+IG1heENvdW50KSB7XG4gICAgICAgICAgICAgICAgbWF4RWwgPSBlbDtcbiAgICAgICAgICAgICAgICBtYXhDb3VudCA9IG1vZGVNYXBbZWxdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXhFbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkobmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdMb2FkaW5nIHBhdHRlcm4uLi4nKTtcbiAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSkudGhlbigoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGVudGl0aWVzW25ld05hbWVdKTtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUJhc2UudmFsdWUgPSBkZXRlY3REZWZhdWx0QmFzaXMob2JqWydhc0Jhc2VzJ10uY29uY2F0KG9ialsnc3NCYXNlcyddKSk7XG4gICAgICAgICAgICAgICAgY3JlYXRlQXNTdHJhbmQudmFsdWUgPSAob2JqWydhc0Jhc2VzJ10ubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gbmV3TmFtZTtcbiAgICAgICAgICAgICAgICBzc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ3NzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc3NCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ3NzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBhc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ2FzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYXNCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ2FzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBmaXJzdFNzUHRvLnZhbHVlID0gb2JqWydzc1B0b0xpbmthZ2VzJ11bMF07XG4gICAgICAgICAgICAgICAgc3NQdG9MaW5rYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2JqWydzc1B0b0xpbmthZ2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHNzUHRvTGlua2FnZXMucHVzaCh1aS5ib29sSW5wdXQoJycsIG9ialsnc3NQdG9MaW5rYWdlcyddW2ldKSk7XG4gICAgICAgICAgICAgICAgZmlyc3RBc1B0by52YWx1ZSA9IG9ialsnYXNQdG9MaW5rYWdlcyddWzBdO1xuICAgICAgICAgICAgICAgIGFzUHRvTGlua2FnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9ialsnYXNQdG9MaW5rYWdlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBhc1B0b0xpbmthZ2VzLnB1c2godWkuYm9vbElucHV0KCcnLCBvYmpbJ2FzUHRvTGlua2FnZXMnXVtpXSkpO1xuICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnZhbHVlID0gb2JqWydzc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gb2JqWydhc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQudmFsdWUgPSBvYmpbJ2NvbW1lbnQnXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGkuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSkge1xuICAgICAgICBjb25zdCBjb2wgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSk7XG4gICAgICAgIGxldCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29sLmdldChpIC0gMSkubGVuZ3RoICE9IGNvbC5nZXQoaSkubGVuZ3RoICYmIGNvbC5nZXQoaSkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYWxsTGVuZ3Roc0FyZVRoZVNhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnU2VxdWVuY2VzIGxlbmd0aHMgbWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdUaGUgc2VxdWVuY2UgbGVuZ3RoIHNob3VsZCBtYXRjaCB0aGUgbnVtYmVyIG9mIFJhdyBzZXF1ZW5jZXMgaW4gdGhlIGlucHV0IGZpbGUnKSlcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1xcJ0FERCBDT0xVTU5cXCcgdG8gc2VlIHNlcXVlbmNlcyBsZW5ndGhzJykpXG4gICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignQUREIENPTFVNTicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YWJsZXMudmFsdWUuY29sdW1ucy5hZGROZXdJbnQoJ1NlcXVlbmNlcyBsZW5ndGhzIGluICcgKyBjb2xOYW1lKS5pbml0KChqKSA9PiBjb2wuZ2V0KGopLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdDb2x1bW4gd2l0aCBsZW5ndGhzIGFkZGVkIHRvIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbExlbmd0aHNBcmVUaGVTYW1lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VXNlck5hbWUoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgZ3Jvay5kYXBpLnVzZXJzLmN1cnJlbnQoKS50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcgKGNyZWF0ZWQgYnkgJyArIHVzZXIuZmlyc3ROYW1lICsgJyAnICsgdXNlci5sYXN0TmFtZSArICcpJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgY3VyclVzZXJOYW1lID0geWllbGQgZ2V0Q3VycmVudFVzZXJOYW1lKCk7XG4gICAgICAgICAgICBzYXZlQXMudmFsdWUgPSAoc2F2ZUFzLnN0cmluZ1ZhbHVlLmluY2x1ZGVzKCcoY3JlYXRlZCBieSAnKSkgP1xuICAgICAgICAgICAgICAgIGdldFNob3J0TmFtZShzYXZlQXMudmFsdWUpICsgY3VyclVzZXJOYW1lIDpcbiAgICAgICAgICAgICAgICBzYXZlQXMuc3RyaW5nVmFsdWUgKyBjdXJyVXNlck5hbWU7XG4gICAgICAgICAgICByZXR1cm4gZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5wb3N0VmFsdWUodXNlclN0b3JhZ2VLZXksIHNhdmVBcy52YWx1ZSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICdzc0Jhc2VzJzogc3NCYXNlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAnYXNCYXNlcyc6IGFzQmFzZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksXG4gICAgICAgICAgICAgICAgJ3NzUHRvTGlua2FnZXMnOiBbZmlyc3RTc1B0by52YWx1ZV0uY29uY2F0KHNzUHRvTGlua2FnZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICdhc1B0b0xpbmthZ2VzJzogW2ZpcnN0QXNQdG8udmFsdWVdLmNvbmNhdChhc1B0b0xpbmthZ2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAnc3NUaHJlZU1vZGlmaWNhdGlvbic6IHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ3NzRml2ZU1vZGlmaWNhdGlvbic6IHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnYXNUaHJlZU1vZGlmaWNhdGlvbic6IGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2FzRml2ZU1vZGlmaWNhdGlvbic6IGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnY29tbWVudCc6IGNvbW1lbnQudmFsdWUsXG4gICAgICAgICAgICB9KSwgZmFsc2UpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBzYXZlQXMudmFsdWUgKyAnXFwnIHdhcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWQhJykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlUGF0dGVybnNMaXN0KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKS50aGVuKChlbnRpdGllcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxzdE15ID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbHN0T3RoZXJzID0gW107XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZGlzcGxheSBzaG9ydCBuYW1lLCBidXQgdXNlIGxvbmcgZm9yIHF1ZXJ5aW5nIHVzZXJkYXRhU3RvcmFnZVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZW50IG9mIE9iamVjdC5rZXlzKGVudGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbHN0T3RoZXJzLnB1c2goZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbHN0TXkucHVzaChlbnQpOyAvL2dldFNob3J0TmFtZShlbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxvYWRQYXR0ZXJuID0gdWkuY2hvaWNlSW5wdXQoJ0xvYWQgUGF0dGVybicsICcnLCBsc3RNeSwgKHYpID0+IHBhcnNlUGF0dGVybkFuZFVwZGF0ZVVpKHYpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteU9yT3RoZXJzUGF0dGVybkxpc3QgPSB1aS5jaG9pY2VJbnB1dCgnJywgJ01pbmUnLCBbJ01pbmUnLCAnT3RoZXJzJ10sICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0ID0gdiA9PSAnTWluZScgPyBsc3RNeSA6IGxzdE90aGVycztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4gPSB1aS5jaG9pY2VJbnB1dCgnTG9hZCBQYXR0ZXJuJywgJycsIGN1cnJlbnRMaXN0LCAodikgPT4gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkodikpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChteU9yT3RoZXJzUGF0dGVybkxpc3QuaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChsb2FkUGF0dGVybi5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uaW5wdXQuc3R5bGUubWF4V2lkdGggPSAnMTAwcHgnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5zZXRUb29sdGlwKCdBcHBseSBFeGlzdGluZyBQYXR0ZXJuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5hcHBlbmQobG9hZFBhdHRlcm4ucm9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCd0cmFzaC1hbHQnLCAoKSA9PiB7IH0pLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRQYXR0ZXJuLnZhbHVlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2hvb3NlIHBhdHRlcm4gdG8gZGVsZXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihzYXZlQXMudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nhbm5vdCBkZWxldGUgcGF0dGVybiwgY3JlYXRlZCBieSBvdGhlciB1c2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBsb2FkUGF0dGVybi52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIGxvYWRQYXR0ZXJuLnZhbHVlICsgJ1xcJyBkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobXlPck90aGVyc1BhdHRlcm5MaXN0LmlucHV0KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChsb2FkUGF0dGVybi5pbnB1dCk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLmlucHV0LnN0eWxlLm1heFdpZHRoID0gJzEwMHB4JztcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5zZXRUb29sdGlwKCdBcHBseSBFeGlzdGluZyBQYXR0ZXJuJyk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuYXBwZW5kKGxvYWRQYXR0ZXJuLnJvb3QpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ3RyYXNoLWFsdCcsICgpID0+IHsgfSksICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGF0dGVybi52YWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2hvb3NlIHBhdHRlcm4gdG8gZGVsZXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHNhdmVBcy52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDYW5ub3QgZGVsZXRlIHBhdHRlcm4sIGNyZWF0ZWQgYnkgb3RoZXIgdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIGxvYWRQYXR0ZXJuLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBsb2FkUGF0dGVybi52YWx1ZSArICdcXCcgZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzYXZlUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSlcbiAgICAgICAgICAgICAgICAudGhlbigoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZW50aXRpZXMpLmluY2x1ZGVzKHNhdmVBcy52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdWkuZGlhbG9nKCdQYXR0ZXJuIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgICAgICAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUGF0dGVybiBuYW1lIFxcJycgKyBzYXZlQXMudmFsdWUgKyAnXFwnIGFscmVhZHkgZXhpc3RzLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdSZXBsYWNlIHBhdHRlcm4/JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdZRVMnLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgc2F2ZUFzLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3NDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0QXNDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlucHV0SWRDb2x1bW5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IHNzTW9kaWZpY2F0aW9uSXRlbXMgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzTW9kaWZpY2F0aW9uSXRlbXMgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IHN2Z0RpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNFeGFtcGxlRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhcHBBeG9sYWJzRGVzY3JpcHRpb24gPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGxvYWRQYXR0ZXJuRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgZmlyc3RBc1B0b0RpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2ID0gdWkuZGl2SChbdWkuYm9vbElucHV0KGRlZmF1bHRCYXNlLCB0cnVlLCAodikgPT4ge1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXMoZGVmYXVsdEJhc2UpKVxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2goZGVmYXVsdEJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YoZGVmYXVsdEJhc2UsIDApO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgIH0pLnJvb3RdKTtcbiAgICBsZXQgc3NCYXNlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5jaG9pY2VJbnB1dCgnJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzKSk7XG4gICAgbGV0IGFzQmFzZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuY2hvaWNlSW5wdXQoJycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcykpO1xuICAgIGxldCBzc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGxldCBhc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGNvbnN0IHNzTGVuZ3RoID0gdWkuaW50SW5wdXQoJ1NTIExlbmd0aCcsIGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCwgKCkgPT4gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpKTtcbiAgICBjb25zdCBhc0xlbmd0aCA9IHVpLmludElucHV0KCdBUyBMZW5ndGgnLCBkZWZhdWx0U2VxdWVuY2VMZW5ndGgsICgpID0+IHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSk7XG4gICAgY29uc3QgYXNMZW5ndGhEaXYgPSB1aS5kaXYoW2FzTGVuZ3RoLnJvb3RdKTtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpO1xuICAgICAgICBjb25zdCBmaXJzdFNlcXVlbmNlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKTtcbiAgICAgICAgaWYgKGFsbExlbmd0aHNBcmVUaGVTYW1lICYmIGZpcnN0U2VxdWVuY2UubGVuZ3RoICE9IHNzTGVuZ3RoLnZhbHVlKVxuICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpO1xuICAgICAgICBjb25zdCBmaXJzdFNlcXVlbmNlID0gdGFibGVzLnZhbHVlLmNvbHVtbnMuYnlOYW1lKGNvbE5hbWUpLmdldCgwKTtcbiAgICAgICAgaWYgKGFsbExlbmd0aHNBcmVUaGVTYW1lICYmIGZpcnN0U2VxdWVuY2UubGVuZ3RoICE9IGFzTGVuZ3RoLnZhbHVlKVxuICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgYXNMZW5ndGhEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGFzTGVuZ3RoRGl2LmFwcGVuZChhc0xlbmd0aC5yb290KTtcbiAgICAgICAgYXNJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShjb2xOYW1lKTtcbiAgICAgICAgaWYgKGNvbC50eXBlICE9IERHLlRZUEUuSU5UKVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC5lcnJvcignQ29sdW1uIHNob3VsZCBjb250YWluIGludGVnZXJzIG9ubHknKTtcbiAgICAgICAgZWxzZSBpZiAoY29sLmNhdGVnb3JpZXMuZmlsdGVyKChlKSA9PiBlICE9ICcnKS5sZW5ndGggPCBjb2wudG9MaXN0KCkuZmlsdGVyKChlKSA9PiBlICE9ICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBmaW5kRHVwbGljYXRlcyhjb2wuZ2V0UmF3RGF0YSgpKTtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnTm9uLXVuaXF1ZSBJRHMnKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUHJlc3MgXFwnT0tcXCcgdG8gc2VsZWN0IHJvd3Mgd2l0aCBub24tdW5pcXVlIHZhbHVlcycpKVxuICAgICAgICAgICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0YWJsZXMudmFsdWUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbml0KChpKSA9PiBkdXBsaWNhdGVzLmluZGV4T2YoY29sLmdldChpKSkgPiAtMSk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUm93cyBhcmUgc2VsZWN0ZWQgaW4gdGFibGUgXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlcyA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlcycsIGdyb2suc2hlbGwudGFibGVzWzBdLCBncm9rLnNoZWxsLnRhYmxlcywgKHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICAgICAgc3NWYXIgPSBjb2xOYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRTc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRBc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdBUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICAgICAgYXNWYXIgPSBjb2xOYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRBc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRJZENvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdJRCBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKTtcbiAgICAgICAgICAgIGlkVmFyID0gY29sTmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuYXBwZW5kKGlucHV0SWRDb2x1bW4ucm9vdCk7XG4gICAgfSk7XG4gICAgbGV0IHNzVmFyID0gJyc7XG4gICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgW10sIChjb2xOYW1lKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlU3NDb2x1bW4oY29sTmFtZSk7XG4gICAgICAgIHNzVmFyID0gY29sTmFtZTtcbiAgICB9KTtcbiAgICBpbnB1dFNzQ29sdW1uRGl2LmFwcGVuZChpbnB1dFNzQ29sdW1uLnJvb3QpO1xuICAgIGxldCBhc1ZhciA9ICcnO1xuICAgIGNvbnN0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIFtdLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICBhc1ZhciA9IGNvbE5hbWU7XG4gICAgfSk7XG4gICAgaW5wdXRBc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRBc0NvbHVtbi5yb290KTtcbiAgICBsZXQgaWRWYXIgPSAnJztcbiAgICBjb25zdCBpbnB1dElkQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0lEIENvbHVtbicsICcnLCBbXSwgKGNvbE5hbWUpID0+IHtcbiAgICAgICAgdmFsaWRhdGVJZHNDb2x1bW4oY29sTmFtZSk7XG4gICAgICAgIGlkVmFyID0gY29sTmFtZTtcbiAgICB9KTtcbiAgICBpbnB1dElkQ29sdW1uRGl2LmFwcGVuZChpbnB1dElkQ29sdW1uLnJvb3QpO1xuICAgIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgIGNvbnN0IHNlcXVlbmNlQmFzZSA9IHVpLmNob2ljZUlucHV0KCdTZXF1ZW5jZSBCYXNpcycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgdXBkYXRlQmFzZXModik7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZnVsbHlQdG8gPSB1aS5ib29sSW5wdXQoJ0Z1bGx5IFBUTycsIGRlZmF1bHRQdG8sICh2KSA9PiB7XG4gICAgICAgIGZpcnN0U3NQdG8udmFsdWUgPSB2O1xuICAgICAgICBmaXJzdEFzUHRvLnZhbHVlID0gdjtcbiAgICAgICAgdXBkYXRlUHRvKHYpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0U3NQdG8gPSB1aS5ib29sSW5wdXQoJ0ZpcnN0IFNTIFBUTycsIGZ1bGx5UHRvLnZhbHVlLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgY29uc3QgZmlyc3RBc1B0byA9IHVpLmJvb2xJbnB1dCgnRmlyc3QgQVMgUFRPJywgZnVsbHlQdG8udmFsdWUsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBmaXJzdEFzUHRvRGl2LmFwcGVuZChmaXJzdEFzUHRvLnJvb3QpO1xuICAgIGNvbnN0IGNyZWF0ZUFzU3RyYW5kID0gdWkuYm9vbElucHV0KCdDcmVhdGUgQVMgU3RyYW5kJywgdHJ1ZSwgKHYpID0+IHtcbiAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLmhpZGRlbiA9ICghdik7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNMZW5ndGhEaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNNb2RpZmljYXRpb25EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNFeGFtcGxlRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGZpcnN0QXNQdG9EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZUFzID0gdWkudGV4dElucHV0KCdTYXZlIEFzJywgJ1BhdHRlcm4gTmFtZScsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBzYXZlQXMuc2V0VG9vbHRpcCgnTmFtZSBPZiBOZXcgUGF0dGVybicpO1xuICAgIGNvbnN0IHNzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgU1MgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBzc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBTUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IGFzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgQVMgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBhc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBBUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc1RocmVlTW9kaWZpY2F0aW9uLnJvb3QpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc0ZpdmVNb2RpZmljYXRpb24ucm9vdCk7XG4gICAgY29uc3QgY29tbWVudCA9IHVpLnRleHRJbnB1dCgnQ29tbWVudCcsICcnLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgY29uc3Qgc2F2ZVBhdHRlcm5CdXR0b24gPSB1aS5idXR0b24oJ1NhdmUnLCAoKSA9PiB7XG4gICAgICAgIGlmIChzYXZlQXMudmFsdWUgIT0gJycpXG4gICAgICAgICAgICBzYXZlUGF0dGVybigpLnRoZW4oKHIpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBzYXZlZCcpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdWkuc3RyaW5nSW5wdXQoJ0VudGVyIE5hbWUnLCAnJyk7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ1BhdHRlcm4gTmFtZScpXG4gICAgICAgICAgICAgICAgLmFkZChuYW1lLnJvb3QpXG4gICAgICAgICAgICAgICAgLm9uT0soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IG5hbWUudmFsdWU7XG4gICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm4oKS50aGVuKChyKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gc2F2ZWQnKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0U2VxdWVuY2VCdXR0b24gPSB1aS5idXR0b24oJ0NvbnZlcnQgU2VxdWVuY2VzJywgKCkgPT4ge1xuICAgICAgICBpZiAoc3NWYXIgPT0gJycgfHwgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlICYmIGFzVmFyID09ICcnKSlcbiAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUGxlYXNlIHNlbGVjdCB0YWJsZSBhbmQgY29sdW1ucyBvbiB3aGljaCB0byBhcHBseSBwYXR0ZXJuJyk7XG4gICAgICAgIGVsc2UgaWYgKHNzTGVuZ3RoLnZhbHVlICE9IHNzSW5wdXRFeGFtcGxlLnZhbHVlLmxlbmd0aCB8fCBhc0xlbmd0aC52YWx1ZSAhPSBhc0lucHV0RXhhbXBsZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnTGVuZ3RoIE1pc21hdGNoJyk7XG4gICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnTGVuZ3RoIG9mIHNlcXVlbmNlcyBpbiBjb2x1bW5zIGRvZXNuXFwndCBtYXRjaCBlbnRlcmVkIGxlbmd0aC4gVXBkYXRlIGxlbmd0aCB2YWx1ZT8nKSlcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdZRVMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuY29sdW1ucy5ieU5hbWUoaW5wdXRTc0NvbHVtbi52YWx1ZSkuZ2V0U3RyaW5nKDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5jb2x1bW5zLmJ5TmFtZShpbnB1dEFzQ29sdW1uLnZhbHVlKS5nZXRTdHJpbmcoMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlkVmFyICE9ICcnKVxuICAgICAgICAgICAgICAgIGFkZENvbHVtbldpdGhJZHModGFibGVzLnZhbHVlLm5hbWUsIGlkVmFyLCBnZXRTaG9ydE5hbWUoc2F2ZUFzLnZhbHVlKSk7XG4gICAgICAgICAgICBhZGRDb2x1bW5XaXRoVHJhbnNsYXRlZFNlcXVlbmNlcyh0YWJsZXMudmFsdWUubmFtZSwgc3NWYXIsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoY3JlYXRlQXNTdHJhbmQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRDb2x1bW5XaXRoVHJhbnNsYXRlZFNlcXVlbmNlcyh0YWJsZXMudmFsdWUubmFtZSwgYXNWYXIsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RBc1B0by52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oKChjcmVhdGVBc1N0cmFuZC52YWx1ZSkgPyAnQ29sdW1ucyB3ZXJlJyA6ICdDb2x1bW4gd2FzJykgK1xuICAgICAgICAgICAgICAgICcgYWRkZWQgdG8gdGFibGUgXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3NJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ1NlbnNlIFN0cmFuZCcsIGdlbmVyYXRlRXhhbXBsZShzc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKSwgKCkgPT4ge1xuICAgICAgICBzc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBzc091dHB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJyAnLCB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKSk7XG4gICAgc3NJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIHNzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuZGlzYWJsZWQgPSAndHJ1ZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ2NvcHknLCAoKSA9PiB7IH0pLCAoKSA9PiB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzc091dHB1dEV4YW1wbGUudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdTZXF1ZW5jZSB3YXMgY29waWVkIHRvIGNsaXBib2FyZCcpKTtcbiAgICAgICAgfSksXG4gICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgY29uc3QgYXNJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ0FudGlzZW5zZSBTdHJhbmQnLCBnZW5lcmF0ZUV4YW1wbGUoYXNMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSksICgpID0+IHtcbiAgICAgICAgYXNPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgfSk7XG4gICAgY29uc3QgYXNPdXRwdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCcgJywgdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSkpO1xuICAgIGFzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBhc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LmRpc2FibGVkID0gJ3RydWUnO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCdjb3B5JywgKCkgPT4geyB9KSwgKCkgPT4ge1xuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYXNPdXRwdXRFeGFtcGxlLnZhbHVlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnU2VxdWVuY2Ugd2FzIGNvcGllZCB0byBjbGlwYm9hcmQnKSk7XG4gICAgICAgIH0pLFxuICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgIGFzRXhhbXBsZURpdi5hcHBlbmQoYXNJbnB1dEV4YW1wbGUucm9vdCk7XG4gICAgYXNFeGFtcGxlRGl2LmFwcGVuZChhc091dHB1dEV4YW1wbGUucm9vdCk7XG4gICAgdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpO1xuICAgIGNvbnN0IGV4YW1wbGVTZWN0aW9uID0gdWkuZGl2KFtcbiAgICAgICAgdWkuaDEoJ0V4YW1wbGUnKSxcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUucm9vdCxcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnJvb3QsXG4gICAgICAgIGFzRXhhbXBsZURpdixcbiAgICBdLCAndWktZm9ybScpO1xuICAgIGNvbnN0IGlucHV0c1NlY3Rpb24gPSB1aS5kaXYoW1xuICAgICAgICB1aS5oMSgnSW5wdXRzJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdGFibGVzLnJvb3QsXG4gICAgICAgICAgICBpbnB1dFNzQ29sdW1uRGl2LFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LFxuICAgICAgICAgICAgaW5wdXRJZENvbHVtbkRpdixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbXG4gICAgICAgICAgICBjb252ZXJ0U2VxdWVuY2VCdXR0b24sXG4gICAgICAgIF0pLFxuICAgIF0sICd1aS1mb3JtJyk7XG4gICAgY29uc3QgbWFpblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmJsb2NrKFtcbiAgICAgICAgICAgIHN2Z0RpdixcbiAgICAgICAgXSwgeyBzdHlsZTogeyBvdmVyZmxvd1g6ICdzY3JvbGwnIH0gfSksXG4gICAgICAgIHVpLmJ1dHRvbignRG93bmxvYWQnLCAoKSA9PiBzdmcuc2F2ZVN2Z0FzUG5nKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteVN2ZycpLCBzYXZlQXMudmFsdWUpKSxcbiAgICAgICAgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2LFxuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuaDEoJ1BhdHRlcm4nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmljb25GQSgncXVlc3Rpb24tY2lyY2xlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24uYXBwZW5kKGluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgcGFkZGluZzogJzJweCcgfSB9KSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc0xlbmd0aERpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlQmFzZS5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXMucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm5CdXR0b24sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFzU3RyYW5kLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxseVB0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTc1B0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBc1B0b0RpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzRml2ZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3NUaHJlZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNNb2RpZmljYXRpb25EaXYsXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBpbnB1dHNTZWN0aW9uLFxuICAgICAgICAgICAgZXhhbXBsZVNlY3Rpb24sXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgZmxleFdyYXA6ICd3cmFwJyB9IH0pLFxuICAgIF0pO1xuICAgIGNvbnN0IHNzTW9kaWZpY2F0aW9uU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuaDEoJ1NlbnNlIFN0cmFuZCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnIycpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICB1aS5ibG9jazc1KFt1aS5kaXZUZXh0KCdNb2RpZmljYXRpb24nKV0pLFxuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCdQVE8nKV0sIHsgc3R5bGU6IHsgcGFkZGluZ1JpZ2h0OiAnOHB4JyB9IH0pLFxuICAgICAgICBdKSxcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcyxcbiAgICBdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmgxKCdBbnRpc2Vuc2UgU3RyYW5kJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCcjJyldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgIHVpLmJsb2NrNzUoW3VpLmRpdlRleHQoJ01vZGlmaWNhdGlvbicpXSksXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJ1BUTycpXSwgeyBzdHlsZTogeyBwYWRkaW5nUmlnaHQ6ICc4cHgnIH0gfSksXG4gICAgICAgIF0pLFxuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLFxuICAgIF0pO1xuICAgIGNvbnN0IGluZm8gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnXFxuIEhvdyB0byBkZWZpbmUgbmV3IHBhdHRlcm46JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBDaG9vc2UgdGFibGUgYW5kIGNvbHVtbnMgd2l0aCBzZW5zZSBhbmQgYW50aXNlbnNlIHN0cmFuZHMnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMi4gQ2hvb3NlIGxlbmd0aHMgb2YgYm90aCBzdHJhbmRzIGJ5IGVkaXRpbmcgY2hlY2tib3hlcyBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCczLiBDaG9vc2UgYmFzaXMgYW5kIFBUTyBzdGF0dXMgZm9yIGVhY2ggbnVjbGVvdGlkZScpLFxuICAgICAgICB1aS5kaXZUZXh0KCc0LiBTZXQgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGZvciBzZXF1ZW5jZSBlZGdlcycpLFxuICAgICAgICB1aS5kaXZUZXh0KCc1LiBQcmVzcyBcXCdDb252ZXJ0IFNlcXVlbmNlc1xcJyBidXR0b24nKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnVGhpcyB3aWxsIGFkZCB0aGUgcmVzdWx0IGNvbHVtbihzKSB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlJyksXG4gICAgXSwgJ0NyZWF0ZSBhbmQgYXBwbHkgQXhvbGFicyB0cmFuc2xhdGlvbiBwYXR0ZXJucy4nKTtcbiAgICByZXR1cm4gdWkuc3BsaXRIKFtcbiAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1haW5TZWN0aW9uLFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuYm94KHVpLmRpdkgoW1xuICAgICAgICAgICAgc3NNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICBdKSwgeyBzdHlsZTogeyBtYXhXaWR0aDogJzM2MHB4JyB9IH0pLFxuICAgIF0pO1xufVxuIiwiaW1wb3J0IHsgYXhvbGFic01hcCB9IGZyb20gJy4vYXhvbGFic01hcCc7XG4vLyBodHRwczovL3V4ZGVzaWduLmNjL3N0YXItcmF0aW5nLW1ha2Utc3ZnLWdyZWF0LWFnYWluLWQ0Y2U0NzMxMzQ3ZVxuZnVuY3Rpb24gZ2V0UG9pbnRzVG9EcmF3U3RhcihjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgY29uc3QgaW5uZXJDaXJjbGVQb2ludHMgPSA1OyAvLyBhIDUgcG9pbnQgc3RhclxuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gMTUgLyBpbm5lckNpcmNsZVBvaW50cztcbiAgICBjb25zdCBpbm5lck91dGVyUmFkaXVzUmF0aW8gPSAyOyAvLyBvdXR0ZXIgY2lyY2xlIGlzIHgyIHRoZSBpbm5lclxuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gaW5uZXJSYWRpdXMgKiBpbm5lck91dGVyUmFkaXVzUmF0aW87XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLlBJIC8gaW5uZXJDaXJjbGVQb2ludHM7XG4gICAgY29uc3QgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIgPSA2MDtcbiAgICBjb25zdCB0b3RhbE51bWJlck9mUG9pbnRzID0gaW5uZXJDaXJjbGVQb2ludHMgKiAyOyAvLyAxMCBpbiBhIDUtcG9pbnRzIHN0YXJcbiAgICBsZXQgcG9pbnRzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbE51bWJlck9mUG9pbnRzOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IChpICUgMiA9PSAwKSA/IG91dGVyUmFkaXVzIDogaW5uZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRYID0gY2VudGVyWCArIE1hdGguY29zKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZID0gY2VudGVyWSArIE1hdGguc2luKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIHBvaW50cyArPSBjdXJyZW50WCArICcsJyArIGN1cnJlbnRZICsgJyAnO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuZnVuY3Rpb24gY291bnRPdmVyaGFuZ3NPblRoZVJpZ2h0RWRnZShtb2RpZmljYXRpb25zKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbW9kaWZpY2F0aW9ucy5sZW5ndGggJiYgbW9kaWZpY2F0aW9uc1tpXS5zbGljZSgtMykgPT0gJyhvKScpXG4gICAgICAgIGkrKztcbiAgICByZXR1cm4gKGkgPT0gbW9kaWZpY2F0aW9ucy5sZW5ndGggLSAxKSA/IDAgOiBpO1xufVxuZnVuY3Rpb24gZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29udGV4dC5mb250ID0gU3RyaW5nKGZvbnQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gMiAqIGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG59XG5mdW5jdGlvbiBnZXRUZXh0SW5zaWRlQ2lyY2xlKGJhc2VzLCBpbmRleCwgbnVjbGVvdGlkZUNvdW50ZXIsIG51bWJlck9mTnVjbGVvdGlkZXMsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpIHtcbiAgICByZXR1cm4gKGJhc2VzW2luZGV4XS5zbGljZSgtMykgPT0gJyhvKScpIHx8ICFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKGJhc2VzW2luZGV4XSkgPyAnJyA6XG4gICAgICAgIFsnQScsICdHJywgJ0MnLCAnVScsICdUJ10uaW5jbHVkZXMoYmFzZXNbaW5kZXhdKSA/IGJhc2VzW2luZGV4XSA6IFN0cmluZyhudW1iZXJPZk51Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChyZ2JTdHJpbmcpIHtcbiAgICBjb25zdCByZ2JJbnRMaXN0ID0gcmdiU3RyaW5nLm1hdGNoKC9cXGQrL2cpLm1hcCgoZSkgPT4gTnVtYmVyKGUpKTtcbiAgICByZXR1cm4gKHJnYkludExpc3RbMF0gKiAwLjI5OSArIHJnYkludExpc3RbMV0gKiAwLjU4NyArIHJnYkludExpc3RbMl0gKiAwLjExNCkgPiAxODYgPyAnIzMzMzMzJyA6ICcjZmZmZmZmJztcbn1cbmZ1bmN0aW9uIGdldEJhc2VDb2xvcihiYXNlKSB7XG4gICAgcmV0dXJuIGF4b2xhYnNNYXBbYmFzZV1bJ2NvbG9yJ107XG59XG5leHBvcnQgZnVuY3Rpb24gZHJhd0F4b2xhYnNQYXR0ZXJuKHBhdHRlcm5OYW1lLCBhc0V4aXN0cywgc3NCYXNlcywgYXNCYXNlcywgc3NQdG9TdGF0dXNlcywgYXNQdG9TdGF0dXNlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBhc0ZpdmVNb2RpZmljYXRpb24sIGNvbW1lbnQsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGluZGV4ICsgc3RhcnRGcm9tKSAqIHdpZHRoIC8gKHVuaXF1ZUJhc2VzLmxlbmd0aCArIHN0YXJ0RnJvbSkgKyBsZWdlbmRSYWRpdXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRYT2ZCYXNlQ2lyY2xlcyhpbmRleCwgcmlnaHRPdmVyaGFuZ3MpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoT2ZSaWdodE1vZGlmaWNhdGlvbiArXG4gICAgICAgICAgICAocmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyAtIGluZGV4ICsgcmlnaHRPdmVyaGFuZ3MgKyAxKSAqIGJhc2VEaWFtZXRlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKGJhc2VzLCBnZW5lcmFsSW5kZXgsIG51Y2xlb3RpZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gKG51Y2xlb3RpZGVJbmRleCA8IDEwIHx8IFsnQScsICdHJywgJ0MnLCAnVScsICdUJ10uXG4gICAgICAgICAgICBpbmNsdWRlcyhiYXNlc1tnZW5lcmFsSW5kZXhdKSkgPyBzaGlmdFRvQWxpZ25PbmVEaWdpdE51bWJlckluc2lkZUNpcmNsZSA6IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlO1xuICAgIH1cbiAgICBjb25zdCBzdmcgPSB7XG4gICAgICAgIHhtbG5zOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICdzdmcnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdpZCcsICdteVN2ZycpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHdpZHRoKSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKGhlaWdodCkpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNpcmNsZTogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ2NpcmNsZScpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2N4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjeScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgncicsIFN0cmluZyhyYWRpdXMpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0ZXh0LCB4LCB5LCBmb250U2l6ZSwgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3RleHQnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCBTdHJpbmcoZm9udFNpemUpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXdlaWdodCcsICdub3JtYWwnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsICdBcmlhbCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICBlLmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcjogZnVuY3Rpb24gKHgsIHksIGZpbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3BvbHlnb24nKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBnZXRQb2ludHNUb0RyYXdTdGFyKHgsIHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgZmlsbCk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHNzQmFzZXMgPSBzc0Jhc2VzLnJldmVyc2UoKTtcbiAgICBzc1B0b1N0YXR1c2VzID0gc3NQdG9TdGF0dXNlcy5yZXZlcnNlKCk7XG4gICAgY29uc3QgYmFzZVJhZGl1cyA9IDE1O1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTEwO1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnbk9uZURpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTU7XG4gICAgY29uc3QgbGVnZW5kUmFkaXVzID0gNjtcbiAgICBjb25zdCBwc0xpbmthZ2VSYWRpdXMgPSA1O1xuICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IDE3O1xuICAgIGNvbnN0IGxlZ2VuZEZvbnRTaXplID0gMTQ7XG4gICAgY29uc3QgcHNMaW5rYWdlQ29sb3IgPSAncmVkJztcbiAgICBjb25zdCBmb250Q29sb3IgPSAndmFyKC0tZ3JleS02KSc7XG4gICAgY29uc3QgdGl0bGVGb250Q29sb3IgPSAnYmxhY2snO1xuICAgIGNvbnN0IG1vZGlmaWNhdGlvbnNDb2xvciA9ICdyZWQnO1xuICAgIGNvbnN0IHNzTGVmdFRleHQgPSAnU1M6IDVcXCcnO1xuICAgIGNvbnN0IGFzTGVmdFRleHQgPSAnQVM6IDNcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRUZXh0ID0gJzNcXCcnO1xuICAgIGNvbnN0IGFzUmlnaHRUZXh0ID0gJzVcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKHNzQmFzZXMpO1xuICAgIGNvbnN0IGFzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKGFzQmFzZXMpO1xuICAgIGNvbnN0IHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgPSBNYXRoLm1heChzc0Jhc2VzLmxlbmd0aCAtIHNzUmlnaHRPdmVyaGFuZ3MsIGFzQmFzZXMubGVuZ3RoIC0gYXNSaWdodE92ZXJoYW5ncyk7XG4gICAgY29uc3QgYmFzZURpYW1ldGVyID0gMiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3Qgd2lkdGhPZkJhc2VzID0gYmFzZURpYW1ldGVyICogKHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgKyBNYXRoLm1heChzc1JpZ2h0T3ZlcmhhbmdzLCBhc1JpZ2h0T3ZlcmhhbmdzKSk7XG4gICAgY29uc3Qgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NUaHJlZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzVGhyZWVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoT2ZMZWZ0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc0xlZnRUZXh0LCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNMZWZ0VGV4dCwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc1JpZ2h0VGV4dCwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzUmlnaHRUZXh0LCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aCA9IHdpZHRoT2ZMZWZ0VGV4dCArIHdpZHRoT2ZMZWZ0TW9kaWZpY2F0aW9uICsgd2lkdGhPZkJhc2VzICtcbiAgICAgICAgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uICsgd2lkdGhPZlJpZ2h0VGV4dCArIGJhc2VEaWFtZXRlcjtcbiAgICBjb25zdCBoZWlnaHQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDkgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHhPZlRpdGxlID0gYmFzZVJhZGl1czsgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDQpLFxuICAgIGNvbnN0IHVuaXF1ZUJhc2VzID0gYXNFeGlzdHMgPyBbLi4ubmV3IFNldChzc0Jhc2VzLmNvbmNhdChhc0Jhc2VzKSldIDogWy4uLm5ldyBTZXQoc3NCYXNlcyldO1xuICAgIGNvbnN0IGlzUHRvRXhpc3QgPSBhc0V4aXN0cyA/IFsuLi5uZXcgU2V0KHNzUHRvU3RhdHVzZXMuY29uY2F0KGFzUHRvU3RhdHVzZXMpKV0uaW5jbHVkZXModHJ1ZSkgOlxuICAgICAgICBbLi4ubmV3IFNldChzc1B0b1N0YXR1c2VzKV0uaW5jbHVkZXModHJ1ZSk7XG4gICAgY29uc3Qgc3RhcnRGcm9tID0gaXNQdG9FeGlzdCA/IDEgOiAwO1xuICAgIGNvbnN0IHhPZkxlZnRUZXh0cyA9IDA7XG4gICAgY29uc3QgeE9mTGVmdE1vZGlmaWNhdGlvbnMgPSB4T2ZMZWZ0VGV4dHMgKyB3aWR0aE9mTGVmdFRleHQgLSA1O1xuICAgIGNvbnN0IHhPZlNzUmlnaHRNb2RpZmljYXRpb25zID0gc3NSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZkFzUmlnaHRNb2RpZmljYXRpb25zID0gYXNSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZlJpZ2h0VGV4dHMgPSBNYXRoLm1heCh4T2ZTc1JpZ2h0TW9kaWZpY2F0aW9ucywgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMpICtcbiAgICAgICAgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gKyBiYXNlRGlhbWV0ZXIgKiAoTWF0aC5tYXgoc3NSaWdodE92ZXJoYW5ncywgYXNSaWdodE92ZXJoYW5ncykpO1xuICAgIGNvbnN0IHlPZlRpdGxlID0gYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc1RleHRzID0gNCAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQXNUZXh0cyA9IDcgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNvbW1lbnQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDguNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mU3NDaXJjbGVzID0gMy41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc0NpcmNsZXMgPSA2LjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNpcmNsZXNJbkxlZ2VuZHMgPSBhc0V4aXN0cyA/IDkgKiBiYXNlUmFkaXVzIDogNiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mVGV4dExlZ2VuZCA9IGFzRXhpc3RzID8gOS41ICogYmFzZVJhZGl1cyAtIDMgOiB5T2ZBc0NpcmNsZXMgLSAzO1xuICAgIGNvbnN0IGltYWdlID0gc3ZnLnJlbmRlcih3aWR0aCwgaGVpZ2h0KTtcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQoc3NMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NSaWdodFRleHQsIHhPZlJpZ2h0VGV4dHMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1JpZ2h0VGV4dCwgeE9mUmlnaHRUZXh0cywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpIDogJycsIHN2Zy50ZXh0KHNzRml2ZU1vZGlmaWNhdGlvbiwgeE9mTGVmdE1vZGlmaWNhdGlvbnMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1RocmVlTW9kaWZpY2F0aW9uLCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KHNzVGhyZWVNb2RpZmljYXRpb24sIHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNGaXZlTW9kaWZpY2F0aW9uLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KGNvbW1lbnQsIHhPZkxlZnRUZXh0cywgeU9mQ29tbWVudCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIGlzUHRvRXhpc3QgPyBzdmcuc3RhcihiYXNlUmFkaXVzLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBwc0xpbmthZ2VDb2xvcikgOiAnJywgaXNQdG9FeGlzdCA/IHN2Zy50ZXh0KCdwcyBsaW5rYWdlJywgMiAqIGJhc2VSYWRpdXMgLSA4LCB5T2ZUZXh0TGVnZW5kLCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZTc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZTc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mU3NOdWNsZW90aWRlcztcbiAgICBmb3IgKGxldCBpID0gc3NCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICBpZiAoc3NCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSwgeU9mU3NDaXJjbGVzLCBiYXNlUmFkaXVzLCBnZXRCYXNlQ29sb3Ioc3NCYXNlc1tpXSkpLCBzdmcudGV4dChnZXRUZXh0SW5zaWRlQ2lyY2xlKHNzQmFzZXMsIGksIG51Y2xlb3RpZGVDb3VudGVyLCBudW1iZXJPZlNzTnVjbGVvdGlkZXMsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpLCBnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoc3NCYXNlcywgc3NCYXNlcy5sZW5ndGggLSBpLCBudW1iZXJPZlNzTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlciksIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChheG9sYWJzTWFwW3NzQmFzZXNbaV1dWydjb2xvciddKSksIHNzUHRvU3RhdHVzZXNbaV0gP1xuICAgICAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncykgKyBiYXNlUmFkaXVzLCB5T2ZTc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOlxuICAgICAgICAgICAgJycpO1xuICAgIH1cbiAgICBpbWFnZS5hcHBlbmQoc3NQdG9TdGF0dXNlc1tzc0Jhc2VzLmxlbmd0aF0gP1xuICAgICAgICBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhzc0Jhc2VzLmxlbmd0aCwgc3NSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgYmFzZVJhZGl1cywgeU9mU3NUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDogJycpO1xuICAgIGxldCBudW1iZXJPZkFzTnVjbGVvdGlkZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXNCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXNCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudW1iZXJPZkFzTnVjbGVvdGlkZXMrKztcbiAgICB9XG4gICAgaWYgKGFzRXhpc3RzKSB7XG4gICAgICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mQXNOdWNsZW90aWRlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IGFzQmFzZXMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChhc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncyksIHlPZkFzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKGFzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShhc0Jhc2VzLCBpLCBudW1iZXJPZkFzTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlciAtIDEsIG51bWJlck9mQXNOdWNsZW90aWRlcywgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksIGdldFhPZkJhc2VDaXJjbGVzKGksIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoYXNCYXNlcywgaSwgbnVjbGVvdGlkZUNvdW50ZXIgKyAxKSwgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGF4b2xhYnNNYXBbYXNCYXNlc1tpXV1bJ2NvbG9yJ10pKSwgYXNQdG9TdGF0dXNlc1tpXSA/IHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGksIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZBc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaW1hZ2UuYXBwZW5kKGFzUHRvU3RhdHVzZXNbYXNCYXNlcy5sZW5ndGhdID9cbiAgICAgICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGFzQmFzZXMubGVuZ3RoLCBhc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICAgICAgYmFzZVJhZGl1cywgeU9mQXNUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDogJycpO1xuICAgIH1cbiAgICBjb25zdCB0aXRsZSA9IHBhdHRlcm5OYW1lICsgJyBmb3IgJyArXG4gICAgICAgIFN0cmluZyhudW1iZXJPZlNzTnVjbGVvdGlkZXMpICsgKGFzRXhpc3RzID8gJy8nICsgU3RyaW5nKG51bWJlck9mQXNOdWNsZW90aWRlcykgOiAnJykgKyAnbWVyJztcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQodGl0bGUsIHhPZlRpdGxlLCB5T2ZUaXRsZSwgYmFzZUZvbnRTaXplLCB0aXRsZUZvbnRDb2xvcikpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pcXVlQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy5jaXJjbGUoZ2V0RXF1aWRpc3RhbnRYRm9yTGVnZW5kKGkpLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBsZWdlbmRSYWRpdXMsIGdldEJhc2VDb2xvcih1bmlxdWVCYXNlc1tpXSkpLCBzdmcudGV4dCh1bmlxdWVCYXNlc1tpXSwgZ2V0RXF1aWRpc3RhbnRYRm9yTGVnZW5kKGkpICtcbiAgICAgICAgICAgIGxlZ2VuZFJhZGl1cyArIDQsIHlPZlRleHRMZWdlbmQsIGxlZ2VuZEZvbnRTaXplLCBmb250Q29sb3IpKTtcbiAgICB9XG4gICAgcmV0dXJuIGltYWdlO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNBTFRTX0NTViA9IGBESVNQTEFZLE1PTFdFSUdIVFxubm8gRGF0YSBBZGRlZCwxMDBgO1xuIiwiZXhwb3J0IGNvbnN0IFNPVVJDRVMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImltcG9ydCB7IGxjbXNUb0djcnMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuLy9uYW1lOiBnY3JzVG9MY21zXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogTENNU31cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9MY21zKHNlcXVlbmNlKSB7XG4gICAgY29uc3QgZGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihsY21zVG9HY3JzKTtcbiAgICBjb25zdCBhcnIxID0gZGYuZ2V0Q29sKCdHQ1JTJykudG9MaXN0KCk7XG4gICAgY29uc3QgYXJyMiA9IGRmLmdldENvbCgnTENNUycpLnRvTGlzdCgpO1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGFycjEuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IG9ialtlbGVtZW50XSA9IGFycjJbaW5kZXhdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyMVtpXSA9IGFycjFbaV0ucmVwbGFjZSgnKCcsICdcXFxcKCcpO1xuICAgICAgICBhcnIxW2ldID0gYXJyMVtpXS5yZXBsYWNlKCcpJywgJ1xcXFwpJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoJygnICsgYXJyMS5qb2luKCd8JykgKyAnKScsICdnJyk7XG4gICAgcmV0dXJuIHNlcXVlbmNlLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gb2JqW2NvZGVdOyB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnNSonLCAnQSc6ICc2KicsICdDJzogJzcqJywgJ0cnOiAnOConXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJ1QqJywgJ0EnOiAnQSonLCAnQyc6ICc5KicsICdHJzogJ0cqJ1xuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VHxDfEcpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPiA0ICYmIGNvdW50IDwgMTUpID8gb2JqRm9yQ2VudGVyW3hdIDogb2JqRm9yRWRnZXNbeF07XG4gICAgfSkuc2xpY2UoMCwgKG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoaW52YWJhc2ljKScpIHx8IG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoR2FsTkFjLTItSk5KKScpKSA/XG4gICAgICAgIG51Y2xlb3RpZGVzLmxlbmd0aCA6IDIgKiBjb3VudCArIDEpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckVkZ2VzID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdtb2VVbnBzJyxcbiAgICAgICAgJ0EnOiAnbW9lQW5wcycsICdDJzogJ21vZTVtQ25wcycsICdHJzogJ21vZUducHMnXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdDJzogJzVtQ3BzJywgJ0EnOiAnQXBzJywgJ1QnOiAnVHBzJywgJ0cnOiAnR3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCA1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9iakZvckVkZ2VzW3hdLnNsaWNlKDAsIC0zKSArICdwcycgOiBvYmpGb3JFZGdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50IDwgMTUpXG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ID09IDE0KSA/IG9iakZvckNlbnRlclt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9iakZvckNlbnRlclt4XTtcbiAgICAgICAgcmV0dXJuIG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAtMyk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnKic6ICcnLCAnNSc6ICdUJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJzknOiAnQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8XFwqfDV8Nnw3fDh8OSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnNSonOiAnbW9lVW5wcycsICc2Kic6ICdtb2VBbnBzJywgJzcqJzogJ21vZTVtQ25wcycsICc4Kic6ICdtb2VHbnBzJywgJzkqJzogJzVtQ3BzJywgJ0EqJzogJ0FwcycsICdUKic6ICdUcHMnLFxuICAgICAgICAnRyonOiAnR3BzJywgJ0MqJzogJ0NwcycsICc1JzogJ21vZVUnLCAnNic6ICdtb2VBJywgJzcnOiAnbW9lNW1DJywgJzgnOiAnbW9lRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8NVxcKnw2XFwqfDdcXCp8OFxcKnw5XFwqfEFcXCp8VFxcKnxHXFwqfENcXCp8NXw2fDd8OCkvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9ialt4XS5zbGljZSgwLCAtMykgKyAncHMnIDogKGNvdW50ID09IDE0KSA/IG9ialt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtb2VUJzogJzUnLCAnbW9lQSc6ICc2JywgJ21vZTVtQyc6ICc3JywgJ21vZUcnOiAnOCcsICdtb2VVJzogJzUnLCAnNW1DJzogJzknLCAnbnBzJzogJyonLCAncHMnOiAnKicsICdVJzogJ1QnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZVR8bW9lQXxtb2U1bUN8bW9lR3xtb2VVfDVtQ3xucHN8cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbW9lJzogJycsICc1bSc6ICcnLCAnbic6ICcnLCAncHMnOiAnJywgJ1UnOiAnVCcgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bW9lfDVtfG58cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdVJywgJzInOiAnQScsICczJzogJ0MnLCAnNCc6ICdHJywgJzUnOiAnVScsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICcqJzogJycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVWYnLCAnMic6ICdBZicsICczJzogJ0NmJywgJzQnOiAnR2YnLCAnNSc6ICd1JywgJzYnOiAnYScsICc3JzogJ2MnLCAnOCc6ICdnJywgJyonOiAncycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ2ZVJywgJzInOiAnZkEnLCAnMyc6ICdmQycsICc0JzogJ2ZHJywgJzUnOiAnbVUnLCAnNic6ICdtQScsICc3JzogJ21DJywgJzgnOiAnbUcnLCAnKic6ICdwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdmVScsICdBZic6ICdmQScsICdDZic6ICdmQycsICdHZic6ICdmRycsICd1JzogJ21VJywgJ2EnOiAnbUEnLCAnYyc6ICdtQycsICdnJzogJ21HJywgJ3MnOiAncHMnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJzEnLCAnQWYnOiAnMicsICdDZic6ICczJywgJ0dmJzogJzQnLCAndSc6ICc1JywgJ2EnOiAnNicsICdjJzogJzcnLCAnZyc6ICc4JywgJ3MnOiAnKicsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdVJywgJ0FmJzogJ0EnLCAnQ2YnOiAnQycsICdHZic6ICdHJywgJ3UnOiAnVScsICdhJzogJ0EnLCAnYyc6ICdDJywgJ2cnOiAnRycsICdzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnVScsICdmQSc6ICdBJywgJ2ZDJzogJ0MnLCAnZkcnOiAnRycsICdtVSc6ICdVJywgJ21BJzogJ0EnLCAnbUMnOiAnQycsICdtRyc6ICdHJywgJ3BzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnMScsICdmQSc6ICcyJywgJ2ZDJzogJzMnLCAnZkcnOiAnNCcsICdtVSc6ICc1JywgJ21BJzogJzYnLCAnbUMnOiAnNycsICdtRyc6ICc4JywgJ3BzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1VmJywgJ2ZBJzogJ0FmJywgJ2ZDJzogJ0NmJywgJ2ZHJzogJ0dmJywgJ21VJzogJ3UnLCAnbUEnOiAnYScsICdtQyc6ICdjJywgJ21HJzogJ2cnLCAncHMnOiAncycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYqJywgJ1UnOiAnNSonLCAnRyc6ICc4KicsICdDJzogJzcqJyB9O1xuICAgIGNvbnN0IG9iakZvclJpZ2h0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnKjYnLCAnVSc6ICcqNScsICdHJzogJyo4JywgJ0MnOiAnKjcnIH07XG4gICAgY29uc3Qgb2JqRm9yT2RkSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnNicsICdVJzogJzUnLCAnRyc6ICc4JywgJ0MnOiAnNycgfTtcbiAgICBjb25zdCBvYmpGb3JFdmVuSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnMicsICdVJzogJzEnLCAnRyc6ICc0JywgJ0MnOiAnMycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnbUFwcycsICdVJzogJ21VcHMnLCAnRyc6ICdtR3BzJywgJ0MnOiAnbUNwcycgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ3BzbUEnLCAnVSc6ICdwc21VJywgJ0cnOiAncHNtRycsICdDJzogJ3BzbUMnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2ZBJywgJ1UnOiAnZlUnLCAnRyc6ICdmRycsICdDJzogJ2ZDJyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ21BJywgJ1UnOiAnbVUnLCAnRyc6ICdtRycsICdDJzogJ21DJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPiBudWNsZW90aWRlcy5sZW5ndGggLSAzKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclJpZ2h0RWRnZVt4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCAlIDIgPT0gMCkgPyBvYmpGb3JFdmVuSW5kaWNlc1t4XSA6IG9iakZvck9kZEluZGljZXNbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSA2IHx8IChjb3VudCA+IDcgJiYgY291bnQgPCAxMSkpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU29tZUluZGljZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSBudWNsZW90aWRlcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgcmV0dXJuICdhJztcbiAgICAgICAgcmV0dXJuIG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzQW50aXNlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvclNtYWxsTGlua2FnZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvckJpZ0xpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZnMnLCAnVSc6ICdVZnMnLCAnRyc6ICdHZnMnLCAnQyc6ICdDZnMnIH07XG4gICAgY29uc3Qgb2JqRm9yU29tZUluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmJywgJ1UnOiAnVWYnLCAnRyc6ICdHZicsICdDJzogJ0NmJyB9O1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnYScsICdVJzogJ3UnLCAnRyc6ICdnJywgJ0MnOiAnYycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50ID4gMTkgJiYgY291bnQgPCAyMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JTbWFsbExpbmthZ2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiAndXMnO1xuICAgICAgICBpZiAoY291bnQgPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JCaWdMaW5rYWdlc1t4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA1IHx8IGNvdW50ID09IDcgfHwgY291bnQgPT0gOCB8fCBjb3VudCA9PSAxMyB8fCBjb3VudCA9PSAxNSkgPyBvYmpGb3JTb21lSW5kaWNlc1t4XSA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ0EnLCAnbVVwcyc6ICdVJywgJ21HcHMnOiAnRycsICdtQ3BzJzogJ0MnLCAnZkFwcyc6ICdBJywgJ2ZVcHMnOiAnVScsICdmR3BzJzogJ0cnLCAnZkNwcyc6ICdDJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTWVybWFkZTEyXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogTWVybWFkZSAxMiAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb01lcm1hZGUxMihudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21BcHMnOiAnZScsICdtVXBzJzogJ2gnLCAnbUdwcyc6ICdnJywgJ21DcHMnOiAnZicsICdmQXBzJzogJ2knLCAnZlVwcyc6ICdsJywgJ2ZHcHMnOiAnaycsICdmQ3BzJzogJ2onLCAnZlUnOiAnTCcsXG4gICAgICAgICdmQSc6ICdJJywgJ2ZDJzogJ0onLCAnZkcnOiAnSycsICdtVSc6ICdIJywgJ21BJzogJ0UnLCAnbUMnOiAnRicsICdtRyc6ICdHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtQXBzfG1VcHN8bUdwc3xtQ3BzfGZBcHN8ZlVwc3xmR3BzfGZDcHN8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUcpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuIiwiaW1wb3J0IHsgbWFwLCBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcywgU1lOVEhFU0laRVJTLCBURUNITk9MT0dJRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBpc1ZhbGlkU2VxdWVuY2UgfSBmcm9tICcuL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IGdldE51Y2xlb3RpZGVzTW9sIH0gZnJvbSAnLi9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRvTW9sVjMwMDAoc2VxdWVuY2UsIGludmVydGVkID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHNtaWxlc0NvZGVzID0gW107XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0IDogTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQpO1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb1NtaWxlcyhzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpO1xuICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKG9iaikpO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgc21pbGVzID0gJyc7XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXMgKz0gKGkgPj0gY29kZXNMaXN0Lmxlbmd0aCAvIDIpID9cbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ucmlnaHQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyA6XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICAoaSA8IGNvZGVzTGlzdC5sZW5ndGggLSAxICYmIGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpICsgMV0pKSlcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc21pbGVzICs9IG9ialtjb2Rlc0xpc3RbaV1dICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc21pbGVzID0gc21pbGVzLnJlcGxhY2UoL09PL2csICdPJyk7XG4gICAgcmV0dXJuICgobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgJiZcbiAgICAgICAgY29kZXNMaXN0Lmxlbmd0aCA+IDEgJiZcbiAgICAgICAgIWluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDJdKSkgfHxcbiAgICAgICAgZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pIHx8XG4gICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSkgP1xuICAgICAgICBzbWlsZXMgOlxuICAgICAgICBzbWlsZXMuc2xpY2UoMCwgc21pbGVzLmxlbmd0aCAtIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzLmxlbmd0aCArIDEpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBpZiAoZm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBzeW50aGVzaXplciBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV1bY29kZV0uU01JTEVTO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtmb3JtYXRdW3RlY2hub2xvZ3ldW2NvZGVdLlNNSUxFUztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBjcmVhdGUgb2JqZWN0IGJhc2VkIGZyb20gc3ludGhlc2l6ZXIgdHlwZSB0byBhdm9pZCBrZXkoY29kZXMpIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuTUVSTUFERV8xMikpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5NRVJNQURFXzEyXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICBlbHNlIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGdldEFsbENvZGVzT2ZTeW50aGVzaXplciB9IGZyb20gJy4vc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuZXhwb3J0IGNvbnN0IFNZTlRIRVNJWkVSUyA9IHtcbiAgICBSQVdfTlVDTEVPVElERVM6ICdSYXcgTnVjbGVvdGlkZXMnLFxuICAgIEJJT1NQUklORzogJ0Jpb1NwcmluZyBDb2RlcycsXG4gICAgR0NSUzogJ0phbnNzZW4gR0NSUyBDb2RlcycsXG4gICAgQVhPTEFCUzogJ0F4b2xhYnMgQ29kZXMnLFxuICAgIE1FUk1BREVfMTI6ICdNZXJtYWRlIDEyJyxcbiAgICBMQ01TOiAnTENNUycsXG59O1xuZXhwb3J0IGNvbnN0IFRFQ0hOT0xPR0lFUyA9IHtcbiAgICBETkE6ICdETkEnLFxuICAgIFJOQTogJ1JOQScsXG4gICAgQVNPX0dBUE1FUlM6ICdGb3IgQVNPIEdhcG1lcnMnLFxuICAgIFNJX1JOQTogJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJyxcbn07XG5leHBvcnQgY29uc3QgQ09MX05BTUVTID0ge1xuICAgIENIRU1JU1RSWTogJ0NoZW1pc3RyeScsXG4gICAgTlVNQkVSOiAnTnVtYmVyJyxcbiAgICBUWVBFOiAnVHlwZScsXG4gICAgQ0hFTUlTVFJZX05BTUU6ICdDaGVtaXN0cnkgTmFtZScsXG4gICAgSU5URVJOQUxfQ09NUE9VTkRfSUQ6ICdJbnRlcm5hbCBjb21wb3VuZCBJRCcsXG4gICAgSURQOiAnSURQJyxcbiAgICBTRVFVRU5DRTogJ1NlcXVlbmNlJyxcbiAgICBDT01QT1VORF9OQU1FOiAnQ29tcG91bmQgTmFtZScsXG4gICAgQ09NUE9VTkRfQ09NTUVOVFM6ICdDb21wb3VuZCBDb21tZW50cycsXG4gICAgU0FMVDogJ1NhbHQnLFxuICAgIEVRVUlWQUxFTlRTOiAnRXF1aXZhbGVudHMnLFxuICAgIFBVUklUWTogJ1B1cml0eScsXG4gICAgQ1BEX01XOiAnQ3BkIE1XJyxcbiAgICBTQUxUX01BU1M6ICdTYWx0IG1hc3MnLFxuICAgIEJBVENIX01XOiAnQmF0Y2ggTVcnLFxuICAgIFNPVVJDRTogJ1NvdXJjZScsXG4gICAgSUNEOiAnSUNEJyxcbiAgICBPV05FUjogJ093bmVyJyxcbn07XG4vLyBpbnRlcmZhY2UgQ09ERVMge1xuLy8gfVxuZXhwb3J0IGNvbnN0IE1PRElGSUNBVElPTlMgPSB7XG4gICAgJyhpbnZhYmFzaWMpJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDExOC4xMyxcbiAgICAgICAgbGVmdDogJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycsXG4gICAgICAgIHJpZ2h0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICB9LFxuICAgICcoR2FsTkFjLTItSk5KKSc6IHtcbiAgICAgICAgbW9sZWN1bGFyV2VpZ2h0OiAxMjczLjMsXG4gICAgICAgIGxlZnQ6ICdDKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpTkMoPU8pQ0NDQyg9TylOQ0MoTylDTycsXG4gICAgICAgIHJpZ2h0OiAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzID0gJ09QKD1PKShPKU8nO1xuZXhwb3J0IGNvbnN0IG1hcCA9IHtcbiAgICAnUmF3IE51Y2xlb3RpZGVzJzoge1xuICAgICAgICAnRE5BJzoge1xuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnUk5BJzoge1xuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdVcmFjaWwnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDYuMTcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0Jpb1NwcmluZyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICc1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzgnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDQwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc5Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnMSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnMic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICczJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc0Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjAuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc2Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzgnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0F4b2xhYnMgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdVZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQWYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0dmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICd1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjAuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdhJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4sXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdKYW5zc2VuIEdDUlMgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgQVNPIEdhcG1lcnMnOiB7XG4gICAgICAgICAgICAnbW9lVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3OC4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2VBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzODcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lNW1DJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyg1bSltb2VDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDQwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyg1bSlDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdwcyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZFQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA1LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0NS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnZlUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdmRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbVUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21BJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnT3RoZXJzJzoge30sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgLy8gJ0xDTVMnOiB7XG4gICAgLy8gICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG59O1xuZXhwb3J0IGNvbnN0IGxjbXNUb0djcnMgPSBgTENNUywgR0NSU1xuQSwgQVxuQywgQ1xuLzVtQy8sICg1bSlDXG5HLCBHXG5ULCBUXG5yQSwgckFcbnJDLCByQ1xuckcsIHJHXG5yVSwgclVcbm1BLCBtQVxubUMsIG1DXG4vNW1tQy8sICg1bSltQ1xubUcsIG1HXG5tVSwgbVVcbmZBLCBmQVxuZkMsIGZDXG4vNW1mQy8sICg1bSlmQ1xuZkcsIGZHXG5mVSwgZlVcbi9hZkEvLCBhZkFcbi9hZkMvLCBhZkNcbi9hZkcvLCBhZkdcbi9hZlUvLCBhZlVcbitBLCBsbmEgQVxuK0MsIGxuYSBDXG4rRywgbG5hIEdcbitULCBsbmEgVFxuL21vZUEvLCBtb2VBXG4vbW9lQy8sIG1vZUNcbi81bW1vZUMvLCAoNW0pbW9lQ1xuL21vZUcvLCBtb2VHXG4vbW9lVC8sIG1vZVRcbi9tb2VVLywgbW9lVVxuL3hBLywgQW5wXG4veEMvLCBDbnBcbi94NW1DLywgKDVtKUNucFxuL3hHLywgR25wXG4veFQvLCBUbnBcbi94ckEvLCByQW5wXG4veHJDLywgckNucFxuL3hyRy8sIHJHbnBcbi94clUvLCByVW5wXG4veG1BLywgbUFucFxuL3htQy8sIG1DbnBcbi94NW1tQy8sICg1bSltQ25wXG4veG1HLywgbUducFxuL3htVS8sIG1VbnBcbi94ZkEvLCBmQW5wXG4veGZDLywgZkNucFxuL3hmRy8sIGZHbnBcbi94ZlQvLCBmVG5wXG4veGZVLywgZlVucFxuL3hhZkEvLCBhZkFucFxuL3hhZkMvLCBhZkNucFxuL3hhZkcvLCBhZkducFxuL3hhZlUvLCBhZlVucFxuL3hlQS8sIGVBbnBcbi94ZUMvLCBlQ25wXG4veGVHLywgZUducFxuL3hlVS8sIGVVbnBcbi94bW9lQS8sIG1vZUFucFxuL3htb2VDLywgbW9lQ25wXG4veDVtbW9lQy8sICg1bSltb2VDbnBcbi94bW9lRy8sIG1vZUducFxuL3htb2VVLywgbW9lVW5wXG4vVU5BLUEvLCAoVU5BLUEpXG4vVU5BLUMvLCAoVU5BLUMpXG4vVU5BLUcvLCAoVU5BLUcpXG4vVU5BLVQvLCAoVU5BLVQpXG4vVU5BLVUvLCAoVU5BLVUpXG4vR05BLUEvLCAoR05BLUEpXG4vR05BLUMvLCAoR05BLUMpXG4vR05BLUcvLCAoR05BLUcpXG4vR05BLVQvLCAoR05BLVQpXG4vR05BLVUvLCAoR05BLVUpXG4vNUNob2xURUcvLCAoNS1DaG9sVEVHKVxuLzNDaG9sVEVHLywgKFRFR0Nob2wtMylcbi9Ub2NvLywgVG9jb1xuL1BhbG0vLCBQYWxtXG4vR2FsTkFjLywgR2FsTkFjXG4vR2FsTkFjMi8sIEdhbE5BYzJcbi9HYWxOQWMzLywgR2FsTkFjM1xuL0dhbE5BYzYvLCBHYWxOQWM2XG4vR2FsTkFjNy8sIEdhbE5BYzdcbi9HYWxOQWM5LywgR2FsTkFjOVxuL0dhbE5BYzE0LywgR2FsTkFjMTRcbi9OQUczNy8sIE5BRzM3XG4vSEVHLywgKEhFRylcbi9URUcvLCAoVEVHKVxuL0FtbUM2LywgKE5IQzYpXG4vQW1tQzcvLCAoTkhDNylcbi9BbW1DMTIvLCAoTkhDMTIpXG4vaW52QWIvLCAoaW52YWJhc2ljKVxuL2ludmRULywgKGludmRUKVxuL1ZQbVUvLCAodmludSlcbiosIHBzXG4vMi1DMTZVLywgMi1DMTZVIFxuLzItQzE4dzlVLywgMi1DMTh3OVVcbi9KRGktUGFsbS8sIEpEaS1QYWxtXG4vSjItQ09OQzE2VS8sIEoyLUNPTkMxNlVcbi9KMi1DM05DMTZVLywgSjItQzNOQzE2VVxuL0otQzE1QWRhLywgSi1DMTVBZGFcbi9KLTJDMTVBZGFVLywgSi0yQzE1QWRhVVxuL0otQzE2TkM2LywgSi1DMTZOQzZcbi9SMi1DNk5ILVUvLCBSMi1DNk5ILVVcbi9KLU0xLywgSi1NMVxuL0otQjEvLCBKLUIxXG4vSi1CMi8sIEotQjJcbi9KLU0yLywgSi1NMlxuLzItQzE2Qy8sIDItQzE2Q1xuLzItQzE2QS8sIDItQzE2QVxuLzItQzE2Ry8sIDItQzE2R1xuL1IyLUM2TkgtRy8sIFIyLUM2TkgtR1xuL1IyLUM2TkgtQy8sIFIyLUM2TkgtQ1xuL0oyLUNPTkMxNkEvLCBKMi1DT05DMTZBXG4vSjItQ09OQzE2Qy8sIEoyLUNPTkMxNkNcbi9KMi1DT05DMTZHLywgSjItQ09OQzE2R1xuL0oyLUMxNUFkYUMvLCBKMi1DMTVBZGFDXG4vSjItTTJVLywgSjItTTJVXG4vSjItQjJVLywgSjItQjJVXG4vSjItQzNOQzE2Qy8sIEoyLUMzTkMxNkNcbi9KMi1DM05DMTZHLywgSjItQzNOQzE2R1xuL1IyLUM2TkgtQS8sIFIyLUM2TkgtQVxuL0oyLUMxNUFkYUEvLCBKMi1DMTVBZGFBXG4vSjItQzNOQzE2QS8sIEoyLUMzTkMxNkFcbi9KLUM1LVNFUi0xLywgSi1DNS1TRVItMVxuL0otQzE2LVNFUi0xLywgSi1DMTYtU0VSLTFcbi9KLUEyLywgSi1BMlxuL0otQTEvLCBKLUExXG4vSjItQzE1QWRhRy8sIEoyLUMxNUFkYUdcbi9KLUMxNk5Bc3AvLCBKLUMxNk5Bc3Bcbi9KMi1DMTZOQzZVLywgSjItQzE2TkM2VVxuL0otQzUtUkVCTy0xLywgSi1DNS1SRUJPLTFcbi9KLUMxNi1SRUJPLTEvLCBKLUMxNi1SRUJPLTFcbi9KLUMxNi1JTkQtMS8sIEotQzE2LUlORC0xXG4vSi1DNS1JTkQtMS8sIEotQzUtSU5ELTFcbi9KLTFDMTVBZGEtMk1hbi8sIEotMUMxNUFkYS0yTWFuXG4vSkctMUMxNUFkYS0yM0RpTWFuLywgSkctMUMxNUFkYS0yLDNEaU1hblxuL0otVHJpTWFuUEMvLCBKLVRyaU1hblBDXG4vSi10cmlNYW5QTy8sIEotdHJpTWFuUE9cbi9KLUE0LywgSi1BNFxuL0otQXJhLTEvLCBKLUFyYS0xXG4vSi1BcmEtMi8sIEotQXJhLTJcbi9KLUFjQ1MvLCBKLUFjQ1Ncbi9KLUNiQ1MvLCBKLUNiQ1Ncbi9KLU10Q0QvLCBKLU10Q0RgO1xuZnVuY3Rpb24gZGlmZmVyZW5jZU9mVHdvQXJyYXlzKGEsIGIpIHtcbiAgICByZXR1cm4gYS5maWx0ZXIoKHgpID0+ICFiLmluY2x1ZGVzKHgpKTtcbn1cbmNvbnN0IGNvZGVzV2l0aFNtaWxlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihTWU5USEVTSVpFUlMuR0NSUyk7XG5jb25zdCBhbGxHY3JzQ29kZXMgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihsY21zVG9HY3JzKS5nZXRDb2woJ0dDUlMnKS50b0xpc3QoKTtcbmV4cG9ydCBjb25zdCBnY3JzQ29kZXNXaXRob3V0U21pbGVzID0gZGlmZmVyZW5jZU9mVHdvQXJyYXlzKGFsbEdjcnNDb2RlcywgY29kZXNXaXRoU21pbGVzKTtcbmZvciAoY29uc3QgZSBvZiBnY3JzQ29kZXNXaXRob3V0U21pbGVzKVxuICAgIG1hcFtTWU5USEVTSVpFUlMuR0NSU11bJ090aGVycyddW2VdID0geyAnU01JTEVTJzogJycgfTtcbiIsImNvbnN0IFBIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgTyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IFRISU9QSE9TSEFURSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDUgNCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gLTEuNSAwIDAgMFxuTSAgVjMwIDIgUCAwIDAgMCAwXG5NICBWMzAgMyBPIDAgMSAwIDBcbk0gIFYzMCA0IFMgMCAtMSAwIDBcbk0gIFYzMCA1IE8gMS41IDAgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDEgMlxuTSAgVjMwIDIgMiAyIDNcbk0gIFYzMCAzIDEgMiA0XG5NICBWMzAgNCAxIDIgNVxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIEVORGA7XG5jb25zdCBJTlZBQkFTSUMgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA4IDggMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIDEuMDkzNCAtMi4xNjM2IDAgMFxuTSAgVjMwIDIgQyAxLjgzNjUgLTEuNDk0NSAwIDAgQ0ZHPTJcbk0gIFYzMCAzIEMgMi44MTQ3IC0xLjcwMjQgMCAwXG5NICBWMzAgNCBDIDMuMzE0NyAtMC44MzY0IDAgMCBWQUw9M1xuTSAgVjMwIDUgTyAyLjY0NTUgLTAuMDkzMiAwIDBcbk0gIFYzMCA2IEMgMS43MzIgLTAuNSAwIDAgQ0ZHPTFcbk0gIFYzMCA3IEMgMC44NjYgMCAwIDBcbk0gIFYzMCA4IE8gMC44NjYgMSAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMiAxIENGRz0xXG5NICBWMzAgMiAxIDIgM1xuTSAgVjMwIDMgMSAzIDRcbk0gIFYzMCA0IDEgNCA1XG5NICBWMzAgNSAxIDYgNVxuTSAgVjMwIDYgMSAyIDZcbk0gIFYzMCA3IDEgNiA3IENGRz0zXG5NICBWMzAgOCAxIDcgOFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KDIgMiA2KVxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlciA9IGZhbHNlKSB7XG4gICAgY29uc3QgbW9sQmxvY2tzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbWlsZXNDb2Rlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShPKU8nID8gbW9sQmxvY2tzLnB1c2goUEhPU0hBVEUpIDpcbiAgICAgICAgICAgIHNtaWxlc0NvZGVzW2ldID09ICdPUCg9TykoUylPJyA/IG1vbEJsb2Nrcy5wdXNoKFRISU9QSE9TSEFURSkgOlxuICAgICAgICAgICAgICAgIHNtaWxlc0NvZGVzW2ldID09ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nID8gbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChJTlZBQkFTSUMpKSA6XG4gICAgICAgICAgICAgICAgICAgIG1vbEJsb2Nrcy5wdXNoKHJvdGF0ZU51Y2xlb3RpZGVzVjMwMDAoc21pbGVzQ29kZXNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmtWMzAwMChtb2xCbG9ja3MsIGZhbHNlLCBvY2xSZW5kZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtWMzAwMChtb2xCbG9ja3MsIHR3b0NoYWlucyA9IGZhbHNlLCBvY2xSZW5kZXIgPSBmYWxzZSkge1xuICAgIGxldCBtYWNyb01vbEJsb2NrID0gJ1xcbkRhdGFncm9rIG1hY3JvbW9sZWN1bGUgaGFuZGxlclxcblxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgOTk5IFYzMDAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ1RBQlxcbic7XG4gICAgbGV0IGF0b21CbG9jayA9ICcnO1xuICAgIGxldCBib25kQmxvY2sgPSAnJztcbiAgICBsZXQgY29sbGVjdGlvbkJsb2NrID0gJyc7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IFtdO1xuICAgIGxldCBuYXRvbSA9IDA7XG4gICAgbGV0IG5ib25kID0gMDtcbiAgICBsZXQgeFNoaWZ0ID0gMDtcbiAgICBpZiAodHdvQ2hhaW5zICYmIG1vbEJsb2Nrcy5sZW5ndGggPiAxKVxuICAgICAgICBtb2xCbG9ja3NbMV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbEJsb2Nrc1sxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2xCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnJlcGxhY2VBbGwoJygtXFxuTSAgVjMwICcsICcoJylcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCctXFxuTSAgVjMwICcsICcnKS5yZXBsYWNlQWxsKCcgKScsICcpJyk7XG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGlmICh0d29DaGFpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHhTaGlmdFJpZ2h0ID0gTWF0aC5taW4oLi4uY29vcmRpbmF0ZXMueCk7XG4gICAgICAgICAgICBjb25zdCB5U2hpZnQgPSBpID09IDAgPyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSAtIDEgOiBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KSArIDE7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb3JkaW5hdGVzLngubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMueFtqXSAtPSB4U2hpZnRSaWdodDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29vcmRpbmF0ZXMueS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy55W2pdIC09IHlTaGlmdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXhBdG9tcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICAgICAgaW5kZXhBdG9tcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEF0b21zKTtcbiAgICAgICAgbGV0IGluZGV4ID0gaW5kZXhBdG9tcztcbiAgICAgICAgbGV0IGluZGV4RW5kID0gaW5kZXhBdG9tcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJzLm5hdG9tOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5hdG9tSW5kZXhbal0gIT0gMSB8fCBpID09IDAgfHwgdHdvQ2hhaW5zKSB7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGF0b20gbnVtYmVyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIC8vcmV3cml0ZSBjb29yZGluYXRlc1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG90YWxTaGlmdCA9IHR3b0NoYWlucyA/IDAgOiB4U2hpZnQgLSBjb29yZGluYXRlcy54WzBdO1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlID0gdHdvQ2hhaW5zID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIGNvb3JkaW5hdGVzLnhbal0pIC8gMTAwMDAgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKDEwMDAwICogKHBhcnNlRmxvYXQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIHRvdGFsU2hpZnQpKSAvIDEwMDAwO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBjb29yZGluYXRlICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgPSB0d29DaGFpbnMgP1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKDEwMDAwICogY29vcmRpbmF0ZXMueVtqXSkgLyAxMDAwMCA6XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpKSkgLyAxMDAwMDtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgY29vcmRpbmF0ZSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCcsIGluZGV4KSAtIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEF0b21zRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBFTkQgQVRPTScpO1xuICAgICAgICBhdG9tQmxvY2sgKz0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleEF0b21zICsgMSwgaW5kZXhBdG9tc0VuZCk7XG4gICAgICAgIGxldCBpbmRleEJvbmRzID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBCT05EJyk7IC8vIFYzMDAwIGluZGV4IGZvciBib25kc1xuICAgICAgICBpbmRleEJvbmRzID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4Qm9uZHMpO1xuICAgICAgICBpbmRleCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGluZGV4RW5kID0gaW5kZXhCb25kcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJzLm5ib25kOyBqKyspIHtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBib25kIG51bWJlclxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBjb25zdCBib25kTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5ib25kO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGJvbmROdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgLy9yZXdyaXRlIGF0b20gcGFpciBpbiBib25kXG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgIGxldCBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleEVuZCA9IE1hdGgubWluKG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCksIG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpKTtcbiAgICAgICAgICAgIGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4Qm9uZEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEJPTkQnKTtcbiAgICAgICAgYm9uZEJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhCb25kcyArIDEsIGluZGV4Qm9uZEVuZCk7XG4gICAgICAgIGxldCBpbmRleENvbGxlY3Rpb24gPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgY29sbGVjdGlvbnNcbiAgICAgICAgd2hpbGUgKGluZGV4Q29sbGVjdGlvbiAhPSAtMSkge1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uICs9IDI4O1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcpJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleENvbGxlY3Rpb24sIGNvbGxlY3Rpb25FbmQpLnNwbGl0KCcgJykuc2xpY2UoMSk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uRW50cmllcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKHBhcnNlSW50KGUpICsgbmF0b20pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uRW5kO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnLCBpbmRleENvbGxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIG5hdG9tICs9IHR3b0NoYWlucyA/IG51bWJlcnMubmF0b20gOiBudW1iZXJzLm5hdG9tIC0gMTtcbiAgICAgICAgbmJvbmQgKz0gbnVtYmVycy5uYm9uZDtcbiAgICAgICAgeFNoaWZ0ICs9IHR3b0NoYWlucyA/IDAgOiBjb29yZGluYXRlcy54W251bWJlcnMubmF0b20gLSAxXSAtIGNvb3JkaW5hdGVzLnhbMF07XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXMgPSA0O1xuICAgIGNvbnN0IGNvbGxOdW1iZXIgPSBNYXRoLmNlaWwoY29sbGVjdGlvbi5sZW5ndGggLyBlbnRyaWVzKTtcbiAgICBpZiAob2NsUmVuZGVyKSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICcgJyArIGNvbGxlY3Rpb25bal07XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnKVxcbic7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnICsgY29sbGVjdGlvbi5sZW5ndGggKyAnIC1cXG4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbGxOdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgJztcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXNDdXJyZW50ID0gaSArIDEgPT0gY29sbE51bWJlciA/IGNvbGxlY3Rpb24ubGVuZ3RoIC0gKGNvbGxOdW1iZXIgLSAxKSAqIGVudHJpZXMgOiBlbnRyaWVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbnRyaWVzQ3VycmVudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9IChqICsgMSA9PSBlbnRyaWVzQ3VycmVudCkgP1xuICAgICAgICAgICAgICAgICAgICAoaSA9PSBjb2xsTnVtYmVyIC0gMSA/IGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcpXFxuJyA6IGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcgLVxcbicpIDpcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vZ2VuZXJhdGUgZmlsZVxuICAgIHR3b0NoYWlucyA/IG5hdG9tIDogbmF0b20rKztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQ09VTlRTICcgKyBuYXRvbSArICcgJyArIG5ib25kICsgJyAwIDAgMFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEJFR0lOIEFUT01cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gYXRvbUJsb2NrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEJFR0lOIEJPTkRcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gYm9uZEJsb2NrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gY29sbGVjdGlvbkJsb2NrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDVEFCXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBFTkRcXG4nO1xuICAgIHJldHVybiBtYWNyb01vbEJsb2NrO1xufVxuZnVuY3Rpb24gcm90YXRlTnVjbGVvdGlkZXNWMzAwMChtb2xlY3VsZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsZXQgbW9sQmxvY2sgPSBtb2xlY3VsZS5pbmNsdWRlcygnTSAgRU5EJykgPyBtb2xlY3VsZSA6IE9DTC5Nb2xlY3VsZS5mcm9tU21pbGVzKG1vbGVjdWxlKS50b01vbGZpbGVWMygpO1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZXh0cmFjdEF0b21EYXRhVjMwMDAobW9sQmxvY2spO1xuICAgIGNvbnN0IG5hdG9tID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4Lmxlbmd0aDtcbiAgICBjb25zdCBpbmRleEZpdmVQcmltZSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5pbmRleE9mKDEpO1xuICAgIGNvbnN0IGluZGV4VGhyZWVQcmltZSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5pbmRleE9mKG5hdG9tKTtcbiAgICAvL2ZpeCA1IHByaW1lIGlmIGluYWRlcXVhdGVcbiAgICBpZiAobmF0b20gPiA4KVxuICAgICAgICBmaXg1UHJpbWUoY29vcmRpbmF0ZXMsIGluZGV4Rml2ZVByaW1lLCBpbmRleFRocmVlUHJpbWUpO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoY29vcmRpbmF0ZXMueFtpbmRleFRocmVlUHJpbWVdICsgY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0pIC8gMjtcbiAgICBjb25zdCB5Q2VudGVyID0gKGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgLy9wbGFjZSB0byBjZW50ZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gICAgfVxuICAgIGxldCBhbmdsZSA9IDA7XG4gICAgaWYgKGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID09IDApXG4gICAgICAgIGFuZ2xlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPiBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gPyBNYXRoLlBJIC8gMiA6IDMgKiBNYXRoLlBJIC8gMjtcbiAgICBlbHNlIGlmIChjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueFtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSA6IDA7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlcml2YXRpdmUgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSAvIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgICAgICBhbmdsZSA9IGRlcml2YXRpdmUgPiAwID8gTWF0aC5QSSAtIE1hdGguYXRhbihkZXJpdmF0aXZlKSA6IE1hdGguYXRhbihkZXJpdmF0aXZlKTtcbiAgICB9XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIHRvIHJpZ2h0XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKVxuICAgICAgICBjb29yZGluYXRlcy54W2ldIC09IHhTaGlmdDtcbiAgICAvL3Jld3JpdGUgbW9sQmxvY2tcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleEVuZCk7XG4gICAgICAgIG1vbEJsb2NrID0gbW9sQmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgICAgICAgIG1vbEJsb2NrLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbW9sQmxvY2s7XG59XG5mdW5jdGlvbiBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEk7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIGJhY2tcbiAgICBjb25zdCB5U2hpZnQgPSBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlTaGlmdDtcbiAgICB9XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKSB7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWVOZWlnaGJvdXIgPSBpbmRleEZpdmVQcmltZSArIDE7XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgeVNoaWZ0ID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgYmFzZTNQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gLSB4U2hpZnQ7XG4gICAgY29uc3QgYmFzZTNQcmltZVkgPSBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3QgYmFzZTVQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC0geVNoaWZ0O1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVYID0gYmFzZTVQcmltZVggKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpIC0gYmFzZTVQcmltZVkgKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVZID0gYmFzZTVQcmltZVggKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpICsgYmFzZTVQcmltZVkgKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IGR4ID0gYmFzZTVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeSA9IGJhc2U1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgY29uc3QgZHhSb3RhdGVkID0gcm90YXRlZDVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeVJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWSAtIGJhc2UzUHJpbWVZO1xuICAgIGlmIChNYXRoLnNxcnQoZHlSb3RhdGVkICogZHlSb3RhdGVkICsgZHhSb3RhdGVkICogZHhSb3RhdGVkKSA+PSBNYXRoLnNxcnQoZHkgKiBkeSArIGR4ICogZHgpKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVggKyB4U2hpZnQ7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVkgKyB5U2hpZnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2spIHtcbiAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3OyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgYW5kIGJvbmRzIG51bWJlclxuICAgIGxldCBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYXRvbXNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgIGNvbnN0IGJvbmRzTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgIHJldHVybiB7IG5hdG9tOiBhdG9tc051bWJlciwgbmJvbmQ6IGJvbmRzTnVtYmVyIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jaykge1xuICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jayk7XG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgY29uc3QgaW5kZXhlcyA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHR5cGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeCA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHkgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgaW5kZXhlc1tpXSA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgdHlwZXNbaV0gPSBtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgeFtpXSA9IHBhcnNlRmxvYXQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB5W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXRvbUluZGV4OiBpbmRleGVzLCBhdG9tVHlwZTogdHlwZXMsIHg6IHgsIHk6IHkgfTtcbn1cbiIsImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0IHsgbGlua1YzMDAwIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmltcG9ydCB7IGdldEZvcm1hdCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNhdmVTZGYoYXMsIHNzLCBvbmVFbnRpdHksIGZpdDNkeCkge1xuICAgIGNvbnN0IGZvcm1hdEFzID0gZ2V0Rm9ybWF0KGFzKTtcbiAgICBjb25zdCBmb3JtYXRTcyA9IGdldEZvcm1hdChzcyk7XG4gICAgY29uc3QgbW9sU1MgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoc3MsIGZhbHNlLCBmYWxzZSwgZm9ybWF0U3MpO1xuICAgIGNvbnN0IG1vbEFTID0gc2VxdWVuY2VUb01vbFYzMDAwKGFzLCB0cnVlLCBmYWxzZSwgZm9ybWF0QXMpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG9uZUVudGl0eSlcbiAgICAgICAgcmVzdWx0ID0gbGlua1YzMDAwKFttb2xTUywgbW9sQVNdLCB0cnVlLCAhZml0M2R4KSArICdcXG5cXG4kJCQkXFxuJztcbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIG1vbFNTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuJCQkJFxcbmAgK1xuICAgICAgICAgICAgICAgIG1vbEFTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+ICA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbiQkJCRcXG5gO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0KSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgc3MucmVwbGFjZSgvXFxzL2csICcnKSArICcuc2RmJyk7XG4gICAgZWxlbWVudC5jbGljaygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVTZW5zZUFudGlTZW5zZSgpIHtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBzc0lucHV0ID0gdWkudGV4dElucHV0KCdTZW5zZSBTdHJhbmQgNVxcJyAtPjNcXCcnLCAnJyk7XG4gICAgY29uc3QgYXNJbnB1dCA9IHVpLnRleHRJbnB1dCgnQW50aSBTZW5zZSAzXFwnIC0+NVxcJycsICcnKTtcbiAgICBjb25zdCBzYXZlT3B0aW9uID0gdWkuc3dpdGNoSW5wdXQoJ1NhdmUgYXMgb25lIGVudGl0eScsIHRydWUpO1xuICAgIGNvbnN0IHNhdmUzZHggPSB1aS5zd2l0Y2hJbnB1dCgnU2F2ZSAzZHgnLCB0cnVlKTtcbiAgICBjb25zdCBzYXZlQnRuID0gdWkuYnV0dG9uKCdTYXZlIFNERicsICgpID0+IHNhdmVTZGYoYXNJbnB1dC52YWx1ZSwgc3NJbnB1dC52YWx1ZSwgc2F2ZU9wdGlvbi52YWx1ZSwgc2F2ZTNkeC52YWx1ZSkpO1xuICAgIGNvbnN0IHNhdmVTZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFt1aS5oMSgnSW5wdXRzJyldKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtzc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFthc0lucHV0LnJvb3RdKSxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc2F2ZTNkeCxcbiAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtzYXZlQnRuXSksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LFxuICAgIF0pO1xuICAgIHJldHVybiBzYXZlU2VjdGlvbjtcbn1cbiIsImltcG9ydCB7IG1hcCwgU1lOVEhFU0laRVJTLCBURUNITk9MT0dJRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZywgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycywgYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzLCBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nLCBnY3JzVG9NZXJtYWRlMTIsIHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmQsIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzLCBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzLCBzaVJuYUJpb1NwcmluZ1RvR2Nycywgc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcywgc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcsIHNpUm5hQXhvbGFic1RvR2Nycywgc2lSbmFHY3JzVG9OdWNsZW90aWRlcywgc2lSbmFHY3JzVG9CaW9TcHJpbmcsIHNpUm5hR2Nyc1RvQXhvbGFicywgZ2Nyc1RvTnVjbGVvdGlkZXMsIGdjcnNUb0xjbXMgfSBmcm9tICcuL2NvbnZlcnRlcnMnO1xuY29uc3Qgbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlID0gJ05vIHRyYW5zbGF0aW9uIHRhYmxlIGF2YWlsYWJsZSc7XG5leHBvcnQgY29uc3QgdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSA9ICdUeXBlIG9mIGlucHV0IHNlcXVlbmNlIGlzIHVuZGVmaW5lZCc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0KHNlcXVlbmNlKSB7XG4gICAgY29uc3QgcG9zc2libGVTeW50aGVzaXplcnMgPSBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSk7XG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9IChvdXRwdXRJbmRleCA9PSBzZXF1ZW5jZS5sZW5ndGgpID8gLTEgOiBvdXRwdXRJbmRleDtcbiAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKVxuICAgICAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG4gICAgY29uc3QgcG9zc2libGVUZWNobm9sb2dpZXMgPSBnZXRMaXN0T2ZQb3NzaWJsZVRlY2hub2xvZ2llc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSwgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgb3V0cHV0SW5kZXggPSAwO1xuICAgIHBvc3NpYmxlVGVjaG5vbG9naWVzLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbcG9zc2libGVTeW50aGVzaXplcnNbMF1dW3RlY2hub2xvZ3ldKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwb3NzaWJsZVN5bnRoZXNpemVyc1swXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZm9ybWF0ID09IG51bGwgP1xuICAgICAgICBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkgOlxuICAgICAgICBbZm9ybWF0XTtcbiAgICAvLyBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgIC8vICAgY29uc3Qgc3ludGhlc2l6ZXIgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHN5bnRoZXNpemVyIGZyb20gbGlzdDogJywgcG9zc2libGVTeW50aGVzaXplcnNbMF0sXG4gICAgLy8gIHBvc3NpYmxlU3ludGhlc2l6ZXJzKTtcbiAgICAvLyAgIHVpLmRpYWxvZygnQ2hvb3NlIFN5bnRoZXNpemVyJylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbc3ludGhlc2l6ZXIucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVTeW50aGVzaXplcnMgPSBbc3ludGhlc2l6ZXIudmFsdWVdKVxuICAgIC8vICAgICAub25DYW5jZWwoKCkgPT4ge1xuICAgIC8vICAgICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXTtcbiAgICAvLyAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vICAgICB9KVxuICAgIC8vICAgICAuc2hvdygpO1xuICAgIC8vIH0gZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4geyBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IDAsIHN5bnRoZXNpemVyOiBudWxsLCB0ZWNobm9sb2d5OiBudWxsIH07XG4gICAgbGV0IG91dHB1dEluZGV4ID0gMDtcbiAgICBjb25zdCBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMgPSBbJ3InLCAnZCddO1xuICAgIGNvbnN0IG51Y2xlb3RpZGVzID0gWydBJywgJ1UnLCAnVCcsICdDJywgJ0cnXTtcbiAgICBwb3NzaWJsZVN5bnRoZXNpemVycy5mb3JFYWNoKChzeW50aGVzaXplcikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcik7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgICAgICBzeW50aGVzaXplcjogcG9zc2libGVTeW50aGVzaXplcnMsXG4gICAgICAgICAgICB0ZWNobm9sb2d5OiBudWxsLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSk7XG4gICAgLy8gaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyAgIGNvbnN0IHRlY2hub2xvZ3kgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHRlY2hub2xvZ3kgZnJvbSBsaXN0OiAnLCBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSxcbiAgICAvLyBwb3NzaWJsZVRlY2hub2xvZ2llcyk7XG4gICAgLy8gICB1aS5kaWFsb2coJ0Nob29zZSBUZWNobm9sb2d5JylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbdGVjaG5vbG9neS5yb290XSwge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnfX0pKVxuICAgIC8vICAgICAub25PSygoKSA9PiBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IFt0ZWNobm9sb2d5LnZhbHVlXSlcbiAgICAvLyAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAvLyAgICAgICBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IFtwb3NzaWJsZVRlY2hub2xvZ2llc1swXV07XG4gICAgLy8gICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdJbnB1dCBzZXF1ZW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbiBmb3JtYXQgJyArIHBvc3NpYmxlVGVjaG5vbG9naWVzWzBdKTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLnNob3coKTtcbiAgICAvLyB9IGVsc2UgaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA9PSAwKVxuICAgIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzLFxuICAgICAgICB0ZWNobm9sb2d5OiBbcG9zc2libGVUZWNobm9sb2dpZXNbb3V0cHV0SW5kZXhdXSxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikge1xuICAgIGxldCBjb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSlcbiAgICAgICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpO1xuICAgIHJldHVybiBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpLmNvbmNhdCgnLCcpO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpKSB7IC8vJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5ETkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyArICcgJyArIFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUykgJiYgb3V0cHV0LnRlY2hub2xvZ3kuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlJOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgKyAnICcgKyBURUNITk9MT0dJRVMuUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5TSV9STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQklPU1BSSU5HICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQmlvU3ByaW5nVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQVhPTEFCUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5BWE9MQUJTICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2VxdWVuY2UsXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUF4b2xhYnNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBnY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIExDTVM6IGdjcnNUb0xjbXMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBVU0VSU19DU1YgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIm1vZHVsZS5leHBvcnRzID0gdWk7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9hO1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMuIERhdGFncm9rIHdpbGwgaW1wb3J0IEFQSSBsaWJyYXJ5IGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0IHsgZGVmaW5lQXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RlZmluZUF4b2xhYnNQYXR0ZXJuJztcbmltcG9ydCB7IHNhdmVTZW5zZUFudGlTZW5zZSB9IGZyb20gJy4vc3RydWN0dXJlcy13b3Jrcy9zYXZlLXNlbnNlLWFudGlzZW5zZSc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvU21pbGVzLCBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBjb252ZXJ0U2VxdWVuY2UsIHVuZGVmaW5lZElucHV0U2VxdWVuY2UsIGlzVmFsaWRTZXF1ZW5jZSwgZ2V0Rm9ybWF0IH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IG1hcCwgQ09MX05BTUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL21hcCc7XG5pbXBvcnQgeyBzaVJuYUF4b2xhYnNUb0djcnMsIGdjcnNUb051Y2xlb3RpZGVzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzLCBnY3JzVG9NZXJtYWRlMTIsIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzLXdvcmtzL2NvbnZlcnRlcnMnO1xuaW1wb3J0IHsgU0FMVFNfQ1NWIH0gZnJvbSAnLi9zYWx0cyc7XG5pbXBvcnQgeyBVU0VSU19DU1YgfSBmcm9tICcuL3VzZXJzJztcbmltcG9ydCB7IElDRFMgfSBmcm9tICcuL0lDRHMnO1xuaW1wb3J0IHsgU09VUkNFUyB9IGZyb20gJy4vc291cmNlcyc7XG5pbXBvcnQgeyBJRFBTIH0gZnJvbSAnLi9JRFBzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5jb25zdCBkZWZhdWx0SW5wdXQgPSAnZkFtQ21HbUFtQ3BzbVUnO1xuY29uc3Qgc2VxdWVuY2VXYXNDb3BpZWQgPSAnQ29waWVkJztcbmNvbnN0IHRvb2x0aXBTZXF1ZW5jZSA9ICdDb3B5IHNlcXVlbmNlJztcbi8vbmFtZTogU2VxdWVuY2UgVHJhbnNsYXRvclxuLy90YWdzOiBhcHBcbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRyYW5zbGF0b3IoKSB7XG4gICAgY29uc3Qgd2luZG93cyA9IGdyb2suc2hlbGwud2luZG93cztcbiAgICB3aW5kb3dzLnNob3dQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgd2luZG93cy5zaG93VG9vbGJveCA9IGZhbHNlO1xuICAgIHdpbmRvd3Muc2hvd0hlbHAgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlLCBpbnB1dEZvcm1hdCwgaXNTZXQpIHtcbiAgICAgICAgbW9sZWN1bGVTdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIG91dHB1dFRhYmxlRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjb25zdCBwaSA9IERHLlRhc2tCYXJQcm9ncmVzc0luZGljYXRvci5jcmVhdGUoJ1JlbmRlcmluZyB0YWJsZSBhbmQgbW9sZWN1bGUuLi4nKTtcbiAgICAgICAgbGV0IGVycm9yc0V4aXN0ID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXF1ZW5jZSA9IHNlcXVlbmNlLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIG51bGwpO1xuICAgICAgICAgICAgaWYgKGlzU2V0KVxuICAgICAgICAgICAgICAgIG91dHB1dC5zeW50aGVzaXplciA9IFtpbnB1dEZvcm1hdF07XG4gICAgICAgICAgICBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlID0gb3V0cHV0LnN5bnRoZXNpemVyWzBdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2VxdWVuY2VPYmogPSBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVJvd3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG91dHB1dFNlcXVlbmNlT2JqKS5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9ICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikgP1xuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyIDpcbiAgICAgICAgICAgICAgICAgICAgLTE7XG4gICAgICAgICAgICAgICAgaWYgKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9ICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA6XG4gICAgICAgICAgICAgICAgICAgICAgICAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFibGVSb3dzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAna2V5Jzoga2V5LFxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdlRleHQoc2VxdWVuY2Uuc2xpY2UoMCwgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKSwgeyBzdHlsZTogeyBjb2xvcjogJ2dyZXknIH0gfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkudG9vbHRpcC5iaW5kKHVpLmRpdlRleHQoc2VxdWVuY2Uuc2xpY2UoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKSwgeyBzdHlsZTogeyBjb2xvcjogJ3JlZCcgfSB9KSwgJ0V4cGVjdGVkIGZvcm1hdDogJyArIEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5zeW50aGVzaXplciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuIFNlZSB0YWJsZXMgd2l0aCB2YWxpZCBjb2RlcyBvbiB0aGUgcmlnaHQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pIDogLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5saW5rKG91dHB1dFNlcXVlbmNlT2JqW2tleV0sICgpID0+IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KG91dHB1dFNlcXVlbmNlT2JqW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKHNlcXVlbmNlV2FzQ29waWVkKSksIHRvb2x0aXBTZXF1ZW5jZSwgJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yc0V4aXN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ludGhlc2l6ZXIgPSBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuc3ludGhlc2l6ZXIuc2xpY2UoMCwgLTYpO1xuICAgICAgICAgICAgICAgIGFzb0dhcG1lcnNHcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7XG4gICAgICAgICAgICAgICAgICAgIGdjLnN0eWxlLmJhY2tDb2xvciA9IChnYy5ncmlkQ29sdW1uLm5hbWUgPT0gc3ludGhlc2l6ZXIpID8gMHhGRkYwMDAwMCA6IDB4RkZGRkZGRkY7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb21lQW5kRmx1b3JvR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykge1xuICAgICAgICAgICAgICAgICAgICBnYy5zdHlsZS5iYWNrQ29sb3IgPSAoZ2MuZ3JpZENvbHVtbi5uYW1lID09IHN5bnRoZXNpemVyKSA/IDB4RkZGMDAwMDAgOiAweEZGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN3aXRjaElucHV0LmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNvR2FwbWVyc0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHsgZ2Muc3R5bGUuYmFja0NvbG9yID0gMHhGRkZGRkZGRjsgfSk7XG4gICAgICAgICAgICAgICAgb21lQW5kRmx1b3JvR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykgeyBnYy5zdHlsZS5iYWNrQ29sb3IgPSAweEZGRkZGRkZGOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFRhYmxlRGl2LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgIERHLkh0bWxUYWJsZS5jcmVhdGUodGFibGVSb3dzLCAoaXRlbSkgPT4gW2l0ZW0ua2V5LCBpdGVtLnZhbHVlXSwgWydDb2RlJywgJ1NlcXVlbmNlJ10pLnJvb3QsXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBpZiAob3V0cHV0U2VxdWVuY2VPYmoudHlwZSAhPSB1bmRlZmluZWRJbnB1dFNlcXVlbmNlICYmIG91dHB1dFNlcXVlbmNlT2JqLkVycm9yICE9IHVuZGVmaW5lZElucHV0U2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSB1aS5jYW52YXMoMzAwLCAxNzApO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudiA9IHVpLmNhbnZhcygkKHdpbmRvdykud2lkdGgoKSwgJCh3aW5kb3cpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9sID0gc2VxdWVuY2VUb01vbFYzMDAwKGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpLCBmYWxzZSwgdHJ1ZSwgb3V0cHV0LnN5bnRoZXNpemVyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudiwgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB1aS5kaWFsb2coJ01vbGVjdWxlOiAnICsgaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjYW52KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dNb2RhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKGNhbnZhcykub24oJ21vdXNlb3ZlcicsICgpID0+ICQoY2FudmFzKS5jc3MoJ2N1cnNvcicsICd6b29tLWluJykpO1xuICAgICAgICAgICAgICAgICQoY2FudmFzKS5vbignbW91c2VvdXQnLCAoKSA9PiAkKGNhbnZhcykuY3NzKCdjdXJzb3InLCAnZGVmYXVsdCcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlLCBvdXRwdXQuc3ludGhlc2l6ZXJbMF0pO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudmFzLCBPQ0wuTW9sZWN1bGUuZnJvbU1vbGZpbGUobW9sKSwgeyBzdXBwcmVzc0NoaXJhbFRleHQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuYXBwZW5kKGNhbnZhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBwaS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnSW5wdXQgZm9ybWF0OiAnLCAnSmFuc3NlbiBHQ1JTIENvZGVzJywgT2JqZWN0LmtleXMobWFwKSwgKGZvcm1hdCkgPT4ge1xuICAgICAgICB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpLCBmb3JtYXQsIHRydWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1vbGVjdWxlU3ZnRGl2ID0gdWkuYmxvY2soW10pO1xuICAgIGNvbnN0IG91dHB1dFRhYmxlRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpbnB1dFNlcXVlbmNlRmllbGQgPSB1aS50ZXh0SW5wdXQoJycsIGRlZmF1bHRJbnB1dCwgKHNlcXVlbmNlKSA9PiB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlLCBmYWxzZSkpO1xuICAgIGNvbnN0IGFzb0RmID0gREcuRGF0YUZyYW1lLmZyb21PYmplY3RzKFtcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLTVNZS1yVScsICdCaW9TcHJpbmcnOiAnNScsICdKYW5zc2VuIEdDUlMnOiAnbW9lVCcgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLXJBJywgJ0Jpb1NwcmluZyc6ICc2JywgJ0phbnNzZW4gR0NSUyc6ICdtb2VBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtNU1lLXJDJywgJ0Jpb1NwcmluZyc6ICc3JywgJ0phbnNzZW4gR0NSUyc6ICdtb2U1bUMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS1yRycsICdCaW9TcHJpbmcnOiAnOCcsICdKYW5zc2VuIEdDUlMnOiAnbW9lRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICc1LU1ldGh5bC1kQycsICdCaW9TcHJpbmcnOiAnOScsICdKYW5zc2VuIEdDUlMnOiAnNW1DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ3BzIGxpbmthZ2UnLCAnQmlvU3ByaW5nJzogJyonLCAnSmFuc3NlbiBHQ1JTJzogJ3BzJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RBJywgJ0Jpb1NwcmluZyc6ICdBJywgJ0phbnNzZW4gR0NSUyc6ICdBLCBkQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkQycsICdCaW9TcHJpbmcnOiAnQycsICdKYW5zc2VuIEdDUlMnOiAnQywgZEMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEcnLCAnQmlvU3ByaW5nJzogJ0cnLCAnSmFuc3NlbiBHQ1JTJzogJ0csIGRHJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RUJywgJ0Jpb1NwcmluZyc6ICdUJywgJ0phbnNzZW4gR0NSUyc6ICdULCBkVCcgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdyQScsICdCaW9TcHJpbmcnOiAnJywgJ0phbnNzZW4gR0NSUyc6ICdyQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdyQycsICdCaW9TcHJpbmcnOiAnJywgJ0phbnNzZW4gR0NSUyc6ICdyQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdyRycsICdCaW9TcHJpbmcnOiAnJywgJ0phbnNzZW4gR0NSUyc6ICdyRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdyVScsICdCaW9TcHJpbmcnOiAnJywgJ0phbnNzZW4gR0NSUyc6ICdyVScgfSxcbiAgICBdKTtcbiAgICBjb25zdCBhc29HYXBtZXJzR3JpZCA9IERHLlZpZXdlci5ncmlkKGFzb0RmLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIGFzb0RmLm9uQ3VycmVudENlbGxDaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChhc29EZi5jdXJyZW50Q2VsbC52YWx1ZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ0NvcGllZCcpKTtcbiAgICB9KTtcbiAgICBjb25zdCBvbWVBbmRGbHVvcm9HcmlkID0gREcuVmlld2VyLmdyaWQoREcuRGF0YUZyYW1lLmZyb21PYmplY3RzKFtcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1VJywgJ0Jpb1NwcmluZyc6ICcxJywgJ0F4b2xhYnMnOiAnVWYnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZVJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUEnLCAnQmlvU3ByaW5nJzogJzInLCAnQXhvbGFicyc6ICdBZicsICdKYW5zc2VuIEdDUlMnOiAnZkEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tQycsICdCaW9TcHJpbmcnOiAnMycsICdBeG9sYWJzJzogJ0NmJywgJ0phbnNzZW4gR0NSUyc6ICdmQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1HJywgJ0Jpb1NwcmluZyc6ICc0JywgJ0F4b2xhYnMnOiAnR2YnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZHJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtclUnLCAnQmlvU3ByaW5nJzogJzUnLCAnQXhvbGFicyc6ICd1JywgJ0phbnNzZW4gR0NSUyc6ICdtVScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJBJywgJ0Jpb1NwcmluZyc6ICc2JywgJ0F4b2xhYnMnOiAnYScsICdKYW5zc2VuIEdDUlMnOiAnbUEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yQycsICdCaW9TcHJpbmcnOiAnNycsICdBeG9sYWJzJzogJ2MnLCAnSmFuc3NlbiBHQ1JTJzogJ21DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckcnLCAnQmlvU3ByaW5nJzogJzgnLCAnQXhvbGFicyc6ICdnJywgJ0phbnNzZW4gR0NSUyc6ICdtRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdwcyBsaW5rYWdlJywgJ0Jpb1NwcmluZyc6ICcqJywgJ0F4b2xhYnMnOiAncycsICdKYW5zc2VuIEdDUlMnOiAncHMnIH0sXG4gICAgXSksIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UgfSk7XG4gICAgY29uc3Qgb3ZlcmhhbmdNb2RpZmljYXRpb25zR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tQ29sdW1ucyhbXG4gICAgICAgIERHLkNvbHVtbi5mcm9tU3RyaW5ncygnTmFtZScsIE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpKSxcbiAgICBdKSwgeyBzaG93Um93SGVhZGVyOiBmYWxzZSwgc2hvd0NlbGxUb29sdGlwOiBmYWxzZSB9KTtcbiAgICB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKGRlZmF1bHRJbnB1dCwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgYXBwTWFpbkRlc2NyaXB0aW9uID0gdWkuaW5mbyhbXG4gICAgICAgIHVpLmRpdlRleHQoJ0hvdyB0byBjb252ZXJ0IG9uZSBzZXF1ZW5jZTonLCB7IHN0eWxlOiB7ICdmb250LXdlaWdodCc6ICdib2xkZXInIH0gfSksXG4gICAgICAgIHVpLmRpdlRleHQoJ1Bhc3RlIHNlcXVlbmNlIGludG8gdGhlIHRleHQgZmllbGQgYmVsb3cnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnXFxuIEhvdyB0byBjb252ZXJ0IG1hbnkgc2VxdWVuY2VzOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMS4gRHJhZyAmIGRyb3AgYW4gRXhjZWwgb3IgQ1NWIGZpbGUgd2l0aCBzZXF1ZW5jZXMgaW50byBEYXRhZ3JvaycpLFxuICAgICAgICB1aS5kaXZUZXh0KCcyLiBSaWdodC1jbGljayBvbiB0aGUgY29sdW1uIGhlYWRlciwgdGhlbiBzZWUgdGhlIFxcJ0NvbnZlcnRcXCcgbWVudScpLFxuICAgICAgICB1aS5kaXZUZXh0KCdUaGlzIHdpbGwgYWRkIHRoZSByZXN1bHQgY29sdW1uIHRvIHRoZSByaWdodCBvZiB0aGUgdGFibGUnKSxcbiAgICBdLCAnQ29udmVydCBvbGlnb251Y2xlb3RpZGUgc2VxdWVuY2VzIGJldHdlZW4gTnVjbGVvdGlkZXMsIEJpb1NwcmluZywgQXhvbGFicywgTWVybWFkZSAxMiBhbmQgR0NSUyByZXByZXNlbnRhdGlvbnMuJyk7XG4gICAgY29uc3QgY29kZXNUYWJsZXNEaXYgPSB1aS5zcGxpdFYoW1xuICAgICAgICB1aS5ib3godWkuaDIoJ0FTTyBHYXBtZXJzJyksIHsgc3R5bGU6IHsgbWF4SGVpZ2h0OiAnNDBweCcgfSB9KSxcbiAgICAgICAgYXNvR2FwbWVyc0dyaWQucm9vdCxcbiAgICAgICAgdWkuYm94KHVpLmgyKCcyXFwnLU9NZSBhbmQgMlxcJy1GIHNpUk5BJyksIHsgc3R5bGU6IHsgbWF4SGVpZ2h0OiAnNDBweCcgfSB9KSxcbiAgICAgICAgb21lQW5kRmx1b3JvR3JpZC5yb290LFxuICAgICAgICB1aS5ib3godWkuaDIoJ092ZXJoYW5nIG1vZGlmaWNhdGlvbnMnKSwgeyBzdHlsZTogeyBtYXhIZWlnaHQ6ICc0MHB4JyB9IH0pLFxuICAgICAgICBvdmVyaGFuZ01vZGlmaWNhdGlvbnNHcmlkLnJvb3QsXG4gICAgXSwgeyBzdHlsZTogeyBtYXhXaWR0aDogJzM1MHB4JyB9IH0pO1xuICAgIGNvbnN0IHRhYkNvbnRyb2wgPSB1aS50YWJDb250cm9sKHtcbiAgICAgICAgJ01BSU4nOiB1aS5ib3godWkuc3BsaXRIKFtcbiAgICAgICAgICAgIHVpLnNwbGl0VihbXG4gICAgICAgICAgICAgICAgdWkucGFuZWwoW1xuICAgICAgICAgICAgICAgICAgICBhcHBNYWluRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5oMSgnSW5wdXQgc2VxdWVuY2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTZXF1ZW5jZUZpZWxkLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLCAnaW5wdXQtYmFzZScpLFxuICAgICAgICAgICAgICAgICAgICBdLCAnaW5wdXRTZXF1ZW5jZScpLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW2lucHV0Rm9ybWF0Q2hvaWNlSW5wdXRdLCB7IHN0eWxlOiB7IHBhZGRpbmc6ICc1cHggMCcgfSB9KSxcbiAgICAgICAgICAgICAgICAgICAgdWkuYmxvY2soW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuaDEoJ091dHB1dCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGFibGVEaXYsXG4gICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICBtb2xlY3VsZVN2Z0RpdixcbiAgICAgICAgICAgICAgICBdLCAnc2VxdWVuY2UnKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgY29kZXNUYWJsZXNEaXYsXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgaGVpZ2h0OiAnMTAwJScsIHdpZHRoOiAnMTAwJScgfSB9KSksXG4gICAgICAgICdBWE9MQUJTJzogZGVmaW5lQXhvbGFic1BhdHRlcm4oKSxcbiAgICAgICAgJ1NERic6IHNhdmVTZW5zZUFudGlTZW5zZSgpLFxuICAgIH0pO1xuICAgICQoY29kZXNUYWJsZXNEaXYpLmhpZGUoKTtcbiAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC5uZXdWaWV3KCdTZXF1ZW5jZSBUcmFuc2xhdG9yJywgW3RhYkNvbnRyb2xdKTtcbiAgICB2LmJveCA9IHRydWU7XG4gICAgY29uc3Qgc3dpdGNoSW5wdXQgPSB1aS5zd2l0Y2hJbnB1dCgnQ29kZXMnLCBmYWxzZSwgKHYpID0+ICh2KSA/XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLnNob3coKSA6XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLmhpZGUoKSk7XG4gICAgY29uc3QgdG9wUGFuZWwgPSBbXG4gICAgICAgIHVpLmljb25GQSgnZG93bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBmYWxzZSwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5tb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfSwgJ1NhdmUgLm1vbCBmaWxlJyksXG4gICAgICAgIHVpLmljb25GQSgnY29weScsICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlcXVlbmNlVG9TbWlsZXMoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oc2VxdWVuY2VXYXNDb3BpZWQpKTtcbiAgICAgICAgfSwgJ0NvcHkgU01JTEVTJyksXG4gICAgICAgIHN3aXRjaElucHV0LnJvb3QsXG4gICAgXTtcbiAgICB0YWJDb250cm9sLm9uVGFiQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHYuc2V0UmliYm9uUGFuZWxzKFsodGFiQ29udHJvbC5jdXJyZW50UGFuZS5uYW1lID09ICdNQUlOJykgPyB0b3BQYW5lbCA6IFtdXSkpO1xuICAgIHYuc2V0UmliYm9uUGFuZWxzKFt0b3BQYW5lbF0pO1xufVxuZnVuY3Rpb24gc2F2ZVRhYmxlQXNTZEZpbGUodGFibGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRhYmxlLmNvbHVtbnMuY29udGFpbnMoJ0NvbXBvdW5kIE5hbWUnKSkge1xuICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdGaWxlIHNhdmVkIHdpdGhvdXQgY29sdW1ucyBcXCcnICtcbiAgICAgICAgICAgICAgICBbQ09MX05BTUVTLkNPTVBPVU5EX05BTUUsIENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUywgQ09MX05BTUVTLkNQRF9NVyxcbiAgICAgICAgICAgICAgICAgICAgQ09MX05BTUVTLlNBTFRfTUFTUywgQ09MX05BTUVTLkJBVENIX01XXS5qb2luKCdcXCcsIFxcJycpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmVDb2x1bW4gPSB0YWJsZS5jb2woQ09MX05BTUVTLlNFUVVFTkNFKTtcbiAgICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRhYmxlLmNvbChDT0xfTkFNRVMuVFlQRSk7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQoc3RydWN0dXJlQ29sdW1uLmdldChpKSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gKHR5cGVDb2x1bW4uZ2V0KGkpID09ICdTUycpID9cbiAgICAgICAgICAgICAgICBzZXF1ZW5jZVRvTW9sVjMwMDAoc3RydWN0dXJlQ29sdW1uLmdldChpKSwgZmFsc2UsIHRydWUsIGZvcm1hdCkgKyAnXFxuJyArIGA+ICA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuXFxuYCA6XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VUb01vbFYzMDAwKHN0cnVjdHVyZUNvbHVtbi5nZXQoaSksIHRydWUsIHRydWUsIGZvcm1hdCkgKyAnXFxuJyArIGA+ICA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbmA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0YWJsZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5uYW1lICE9IENPTF9OQU1FUy5TRVFVRU5DRSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGA+ICA8JHtjb2wubmFtZX0+XFxuJHtjb2wuZ2V0KGkpfVxcblxcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gJyQkJCRcXG5cXG4nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0KSk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRhYmxlLm5hbWUgKyAnLnNkZicpO1xuICAgICAgICBlbGVtZW50LmNsaWNrKCk7XG4gICAgfSk7XG59XG5jb25zdCB3ZWlnaHRzT2JqID0ge307XG5mb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgKF9hID0gd2VpZ2h0c09ialtjb2RlXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XVtjb2RlXS53ZWlnaHQ7XG4gICAgfVxufVxuZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoTU9ESUZJQ0FUSU9OUykpXG4gICAgd2VpZ2h0c09ialtrZXldID0gdmFsdWUubW9sZWN1bGFyV2VpZ2h0O1xuZnVuY3Rpb24gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtcyhpdGVtcykge1xuICAgIHJldHVybiAnW1wiJyArIGl0ZW1zLmpvaW4oJ1wiLCBcIicpICsgJ1wiXSc7XG59XG5mdW5jdGlvbiBtb2xlY3VsYXJXZWlnaHQoc2VxdWVuY2UsIHdlaWdodHNPYmopIHtcbiAgICBjb25zdCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKHdlaWdodHNPYmopKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgIGxldCB3ZWlnaHQgPSAwO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIHdlaWdodCArPSB3ZWlnaHRzT2JqW3NlcXVlbmNlLnNsaWNlKGksIGkgKyBtYXRjaGVkQ29kZS5sZW5ndGgpXTtcbiAgICAgICAgaSArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB3ZWlnaHQgLSA2MS45Nztcbn1cbi8vdGFnczogYXV0b3N0YXJ0XG5leHBvcnQgZnVuY3Rpb24gYXV0b3N0YXJ0T2xpZ29TZEZpbGVTdWJzY3JpcHRpb24oKSB7XG4gICAgZ3Jvay5ldmVudHMub25WaWV3QWRkZWQuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICAgIGlmICh2LnR5cGUgPT0gJ1RhYmxlVmlldycpIHtcbiAgICAgICAgICAgIGlmICh2LmRhdGFGcmFtZS5jb2x1bW5zLmNvbnRhaW5zKENPTF9OQU1FUy5UWVBFKSlcbiAgICAgICAgICAgICAgICBvbGlnb1NkRmlsZSh2LmRhdGFGcmFtZSk7XG4gICAgICAgICAgICBncm9rLmV2ZW50cy5vbkNvbnRleHRNZW51LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcUNvbCA9IGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2w7XG4gICAgICAgICAgICAgICAgaWYgKERHLkRldGVjdG9yLnNhbXBsZUNhdGVnb3JpZXMoc2VxQ29sLCAocykgPT4gL15bZnNBQ0dVYWNndV17Nix9JC8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBBeG9sYWJzIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lSbmFBeG9sYWJzVG9HY3JzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC9eW2ZtcHNBQ0dVXXs2LH0kLy50ZXN0KHMpKSB8fFxuICAgICAgICAgICAgICAgICAgICBERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC9eKD89Liptb2UpKD89Lio1bUMpKD89Lipwcyl7Nix9Ly50ZXN0KHMpKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MubWVudS5pdGVtKCdDb252ZXJ0IEdDUlMgdG8gcmF3JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLmNvbnRleHQudGFibGUuY29sdW1ucy5hZGROZXdTdHJpbmcoc2VxQ29sLm5hbWUgKyAnIHRvIHJhdycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2Nyc1RvTnVjbGVvdGlkZXMoc2VxQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgR0NSUyB0byBNTTEyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLmNvbnRleHQudGFibGUuY29sdW1ucy5hZGROZXdTdHJpbmcoc2VxQ29sLm5hbWUgKyAnIHRvIE1NMTInKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjcnNUb01lcm1hZGUxMihzZXFDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvXlsqNTY3ODlBVEdDXXs2LH0kLy50ZXN0KHMpKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MubWVudS5pdGVtKCdDb252ZXJ0IEJpb3NwcmluZyB0byBHQ1JTJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxQ29sID0gYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byBHQ1JTJykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC9eWyoxLThdezYsfSQvLnRlc3QocykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgQmlvc3ByaW5nIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lSbmFBeG9sYWJzVG9HY3JzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2xpZ29TZEZpbGUodGFibGUpIHtcbiAgICBjb25zdCBzYWx0c0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoU0FMVFNfQ1NWKTtcbiAgICBjb25zdCB1c2Vyc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoVVNFUlNfQ1NWKTtcbiAgICBjb25zdCBzb3VyY2VzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihTT1VSQ0VTKTtcbiAgICBjb25zdCBpY2RzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihJQ0RTKTtcbiAgICBjb25zdCBpZHBzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihJRFBTKTtcbiAgICBmdW5jdGlvbiBhZGRDb2x1bW5zKHQsIHNhbHRzRGYpIHtcbiAgICAgICAgaWYgKHQuY29sdW1ucy5jb250YWlucyhDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSkpXG4gICAgICAgICAgICByZXR1cm4gZ3Jvay5zaGVsbC5lcnJvcignQ29sdW1ucyBhbHJlYWR5IGV4aXN0IScpO1xuICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IHQuY29sKENPTF9OQU1FUy5TRVFVRU5DRSk7XG4gICAgICAgIGNvbnN0IHNhbHQgPSB0LmNvbChDT0xfTkFNRVMuU0FMVCk7XG4gICAgICAgIGNvbnN0IGVxdWl2YWxlbnRzID0gdC5jb2woQ09MX05BTUVTLkVRVUlWQUxFTlRTKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld1N0cmluZyhDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSkuaW5pdCgoaSkgPT4gc2VxdWVuY2UuZ2V0KGkpKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld1N0cmluZyhDT0xfTkFNRVMuQ09NUE9VTkRfQ09NTUVOVFMpLmluaXQoKGkpID0+IChpID4gMCAmJiBpICUgMiA9PSAwKSA/XG4gICAgICAgICAgICBzZXF1ZW5jZS5nZXRTdHJpbmcoaSkgKyAnOyBkdXBsZXggb2YgU1M6ICcgKyBzZXF1ZW5jZS5nZXRTdHJpbmcoaSAtIDIpICsgJyBhbmQgQVM6ICcgKyBzZXF1ZW5jZS5nZXRTdHJpbmcoaSAtIDEpIDpcbiAgICAgICAgICAgIHNlcXVlbmNlLmdldFN0cmluZyhpKSk7XG4gICAgICAgIGNvbnN0IG1vbFdlaWdodENvbCA9IHNhbHRzRGYuY29sKCdNT0xXRUlHSFQnKTtcbiAgICAgICAgY29uc3Qgc2FsdE5hbWVzTGlzdCA9IHNhbHRzRGYuY29sKCdESVNQTEFZJykudG9MaXN0KCk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdGbG9hdChDT0xfTkFNRVMuQ1BEX01XKVxuICAgICAgICAgICAgLmluaXQoKGkpID0+IG1vbGVjdWxhcldlaWdodChzZXF1ZW5jZS5nZXQoaSksIHdlaWdodHNPYmopKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5TQUxUX01BU1MpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNhbHRSb3dJbmRleCA9IHNhbHROYW1lc0xpc3QuaW5kZXhPZihzYWx0LmdldChpKSk7XG4gICAgICAgICAgICBjb25zdCBtdyA9IG1vbFdlaWdodENvbC5nZXQoc2FsdFJvd0luZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBtdyAqIGVxdWl2YWxlbnRzLmdldChpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdDYWxjdWxhdGVkKENPTF9OQU1FUy5CQVRDSF9NVywgJyR7JyArIENPTF9OQU1FUy5DUERfTVcgKyAnfSArICR7JyArIENPTF9OQU1FUy5TQUxUX01BU1MgKyAnfScsIERHLkNPTFVNTl9UWVBFLkZMT0FULCBmYWxzZSk7XG4gICAgICAgIGFkZENvbHVtbnNQcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ld0RmID0gdDtcbiAgICB9XG4gICAgbGV0IG5ld0RmO1xuICAgIGxldCBhZGRDb2x1bW5zUHJlc3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGQgPSB1aS5kaXYoW1xuICAgICAgICB1aS5pY29ucy5lZGl0KCgpID0+IHtcbiAgICAgICAgICAgIGQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBpZiAodGFibGUuY29sKENPTF9OQU1FUy5JRFApLnR5cGUgIT0gREcuQ09MVU1OX1RZUEUuU1RSSU5HKVxuICAgICAgICAgICAgICAgIHRhYmxlLmNoYW5nZUNvbHVtblR5cGUoQ09MX05BTUVTLklEUCwgREcuQ09MVU1OX1RZUEUuU1RSSU5HKTtcbiAgICAgICAgICAgIGQuYXBwZW5kKHVpLmxpbmsoJ0FkZCBDb2x1bW5zJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFkZENvbHVtbnModGFibGUsIHNhbHRzRGYpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwudGFibGVWaWV3KHRhYmxlLm5hbWUpLmdyaWQuY29sdW1ucy5zZXRPcmRlcihPYmplY3QudmFsdWVzKENPTF9OQU1FUykpO1xuICAgICAgICAgICAgfSwgJ0FkZCBjb2x1bW5zOiBcXCcnICsgW0NPTF9OQU1FUy5DT01QT1VORF9OQU1FLCBDT0xfTkFNRVMuQ09NUE9VTkRfQ09NTUVOVFMsIENPTF9OQU1FUy5DUERfTVcsXG4gICAgICAgICAgICAgICAgQ09MX05BTUVTLlNBTFRfTUFTUywgQ09MX05BTUVTLkJBVENIX01XXS5qb2luKCdcXCcsIFxcJycpLCAnJyksIHVpLmJ1dHRvbignU2F2ZSBTRCBmaWxlJywgKCkgPT4gc2F2ZVRhYmxlQXNTZEZpbGUoYWRkQ29sdW1uc1ByZXNzZWQgPyBuZXdEZiA6IHRhYmxlKSkpO1xuICAgICAgICAgICAgY29uc3QgdmlldyA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgdmlldy50YWJsZS5jb2woQ09MX05BTUVTLlRZUEUpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsICdbXCJBU1wiLCBcIlNTXCIsIFwiRHVwbGV4XCJdJyk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuT1dORVIpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKHVzZXJzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LnRhYmxlLmNvbChDT0xfTkFNRVMuU0FMVCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5SXRlbXMoc2FsdHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5TT1VSQ0UpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKHNvdXJjZXNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5JQ0QpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKGljZHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcudGFibGUuY29sKENPTF9OQU1FUy5JRFApLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeUl0ZW1zKGlkcHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIGdyb2suZXZlbnRzLm9uQ29udGV4dE1lbnUuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFtDT0xfTkFNRVMuVFlQRSwgQ09MX05BTUVTLk9XTkVSLCBDT0xfTkFNRVMuU0FMVCwgQ09MX05BTUVTLlNPVVJDRSwgQ09MX05BTUVTLklDRCwgQ09MX05BTUVTLklEUF1cbiAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGVzKGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2wubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnRmlsbCBDb2x1bW4gV2l0aCBWYWx1ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q2VsbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDZWxsLmNvbHVtbi5pbml0KHYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgXSk7XG4gICAgZ3Jvay5zaGVsbC52LnNldFJpYmJvblBhbmVscyhbW2RdXSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|