oxygen-cli 1.39.3 → 1.40.0
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/CHANGELOG.md +14 -0
- package/build/core/OxygenCore.js +2 -2
- package/build/errors/helper.js +2 -4
- package/build/lib/cli-util.js +5 -4
- package/build/lib/cli.js +4 -1
- package/build/lib/parallel-launcher.js +11 -2
- package/build/ox_modules/module-web.js +6 -9
- package/build/ox_reporters/reporter-rp.js +63 -31
- package/build/reporter/ReportAggregator.js +29 -8
- package/build/runners/oxygen/index.js +4 -3
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@ require("source-map-support/register");
|
|
|
9
9
|
|
|
10
10
|
var _ReporterBase = _interopRequireDefault(require("../reporter/ReporterBase"));
|
|
11
11
|
|
|
12
|
+
var _status = _interopRequireDefault(require("../model/status"));
|
|
13
|
+
|
|
12
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
15
|
|
|
14
16
|
const RPClient = require('@oxygenhq/rp-client-javascript');
|
|
@@ -33,6 +35,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
33
35
|
this.cbSuiteToRpIdHash = {};
|
|
34
36
|
this.cbCaseToRpIdHash = {};
|
|
35
37
|
this.cbStepToRpIdHash = {};
|
|
38
|
+
this.cbSuiteResultListByRefId = {};
|
|
36
39
|
this.currentTransactionStepId = undefined;
|
|
37
40
|
this.currentSubStepId = undefined;
|
|
38
41
|
|
|
@@ -57,10 +60,8 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
57
60
|
|
|
58
61
|
async generate(results) {}
|
|
59
62
|
|
|
60
|
-
async
|
|
61
|
-
|
|
62
|
-
opts,
|
|
63
|
-
caps
|
|
63
|
+
async onLaunchStart({
|
|
64
|
+
options
|
|
64
65
|
}) {
|
|
65
66
|
const {
|
|
66
67
|
tempId,
|
|
@@ -75,14 +76,15 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
75
76
|
});
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
async
|
|
79
|
-
|
|
80
|
-
result
|
|
79
|
+
async onLaunchEnd({
|
|
80
|
+
results
|
|
81
81
|
}) {
|
|
82
|
+
await this._reportEndOfStartedSuites();
|
|
83
|
+
const hasFailed = results.some(x => x.status === _status.default.FAILED);
|
|
82
84
|
const {
|
|
83
85
|
promise
|
|
84
86
|
} = await this.rpClient.finishLaunch(this.tempLaunchId, {
|
|
85
|
-
status:
|
|
87
|
+
status: hasFailed ? 'FAILED' : 'PASSED'
|
|
86
88
|
});
|
|
87
89
|
|
|
88
90
|
try {
|
|
@@ -92,11 +94,30 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
|
|
97
|
+
async onRunnerStart({
|
|
98
|
+
rid,
|
|
99
|
+
opts,
|
|
100
|
+
caps
|
|
101
|
+
}) {}
|
|
102
|
+
|
|
103
|
+
async onRunnerEnd({
|
|
104
|
+
rid,
|
|
105
|
+
result
|
|
106
|
+
}) {}
|
|
107
|
+
|
|
95
108
|
async onSuiteStart({
|
|
96
109
|
rid,
|
|
97
110
|
suiteId,
|
|
98
111
|
suite: suiteDef
|
|
99
112
|
}) {
|
|
113
|
+
const suiteRefId = suiteDef.refId;
|
|
114
|
+
|
|
115
|
+
if (this.cbSuiteToRpIdHash[suiteRefId]) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
this.cbSuiteToRpIdHash[suiteRefId] = {};
|
|
120
|
+
this.cbSuiteResultListByRefId[suiteRefId] = [];
|
|
100
121
|
const startTestItemReq = {
|
|
101
122
|
name: suiteDef.name || this.options.name,
|
|
102
123
|
type: TEST_ITEM_TYPES.SUITE
|
|
@@ -105,7 +126,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
105
126
|
tempId,
|
|
106
127
|
promise
|
|
107
128
|
} = this.rpClient.startTestItem(startTestItemReq, this.tempLaunchId);
|
|
108
|
-
this.cbSuiteToRpIdHash[
|
|
129
|
+
this.cbSuiteToRpIdHash[suiteRefId] = tempId;
|
|
109
130
|
|
|
110
131
|
try {
|
|
111
132
|
await this.promiseWithTimeout(promise);
|
|
@@ -119,28 +140,14 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
119
140
|
suiteId,
|
|
120
141
|
result
|
|
121
142
|
}) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const rpSuiteId = this.cbSuiteToRpIdHash[suiteId];
|
|
127
|
-
const finishTestItemReq = {
|
|
128
|
-
status: result.status.toLowerCase()
|
|
129
|
-
};
|
|
130
|
-
const {
|
|
131
|
-
promise
|
|
132
|
-
} = this.rpClient.finishTestItem(rpSuiteId, finishTestItemReq);
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
await this.promiseWithTimeout(promise);
|
|
136
|
-
} catch (e) {
|
|
137
|
-
console.dir(`RP - Failed to finish suite item: ${e}`);
|
|
138
|
-
}
|
|
143
|
+
const suiteRefId = result.refId;
|
|
144
|
+
this.cbSuiteResultListByRefId[suiteRefId] && this.cbSuiteResultListByRefId[suiteRefId].push(result);
|
|
139
145
|
}
|
|
140
146
|
|
|
141
147
|
async onCaseStart({
|
|
142
148
|
rid,
|
|
143
149
|
suiteId,
|
|
150
|
+
suiteRefId,
|
|
144
151
|
caseId,
|
|
145
152
|
'case': caseDef
|
|
146
153
|
}) {
|
|
@@ -149,7 +156,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
149
156
|
type: TEST_ITEM_TYPES.TEST,
|
|
150
157
|
codeRef: caseDef.path
|
|
151
158
|
};
|
|
152
|
-
const rpSuiteId = this.cbSuiteToRpIdHash[
|
|
159
|
+
const rpSuiteId = this.cbSuiteToRpIdHash[suiteRefId];
|
|
153
160
|
|
|
154
161
|
if (!rpSuiteId) {
|
|
155
162
|
return;
|
|
@@ -171,6 +178,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
171
178
|
async onCaseEnd({
|
|
172
179
|
rid,
|
|
173
180
|
suiteId,
|
|
181
|
+
suiteRefId,
|
|
174
182
|
caseId,
|
|
175
183
|
result
|
|
176
184
|
}) {
|
|
@@ -220,6 +228,8 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
220
228
|
} catch (e) {
|
|
221
229
|
console.dir(`RP - Failed to finish test item: ${e}`);
|
|
222
230
|
}
|
|
231
|
+
|
|
232
|
+
this.currentTransactionStepId = undefined;
|
|
223
233
|
}
|
|
224
234
|
|
|
225
235
|
async onStepStart({
|
|
@@ -241,10 +251,11 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
241
251
|
|
|
242
252
|
if (step.name === 'transaction') {
|
|
243
253
|
this.currentTransactionStepId = step.id;
|
|
244
|
-
|
|
254
|
+
this.currentSubStepId = undefined;
|
|
255
|
+
rpParentId = rpCaseId;
|
|
245
256
|
} else {
|
|
246
257
|
this.currentSubStepId = step.id;
|
|
247
|
-
rpParentId = this.currentTransactionStepId ? this.cbStepToRpIdHash[this.currentTransactionStepId] :
|
|
258
|
+
rpParentId = this.currentTransactionStepId ? this.cbStepToRpIdHash[this.currentTransactionStepId] : rpCaseId;
|
|
248
259
|
}
|
|
249
260
|
|
|
250
261
|
if (!rpParentId || !rpCaseId) {
|
|
@@ -281,7 +292,7 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
281
292
|
return;
|
|
282
293
|
}
|
|
283
294
|
|
|
284
|
-
if (result.
|
|
295
|
+
if (result.name && result.name.startsWith('log.')) {
|
|
285
296
|
return;
|
|
286
297
|
}
|
|
287
298
|
|
|
@@ -441,6 +452,27 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
441
452
|
}
|
|
442
453
|
}
|
|
443
454
|
|
|
455
|
+
async _reportEndOfStartedSuites() {
|
|
456
|
+
for (const suiteRefId of Object.keys(this.cbSuiteToRpIdHash)) {
|
|
457
|
+
const rpSuiteId = this.cbSuiteToRpIdHash[suiteRefId];
|
|
458
|
+
const results = this.cbSuiteResultListByRefId[suiteRefId];
|
|
459
|
+
delete this.cbSuiteToRpIdHash[suiteRefId];
|
|
460
|
+
const hasFailedSuite = results.some(x => x.status === _status.default.FAILED);
|
|
461
|
+
const finishTestItemReq = {
|
|
462
|
+
status: hasFailedSuite ? 'failed' : 'passed'
|
|
463
|
+
};
|
|
464
|
+
const {
|
|
465
|
+
promise
|
|
466
|
+
} = this.rpClient.finishTestItem(rpSuiteId, finishTestItemReq);
|
|
467
|
+
|
|
468
|
+
try {
|
|
469
|
+
await this.promiseWithTimeout(promise);
|
|
470
|
+
} catch (e) {
|
|
471
|
+
console.dir(`RP - Failed to finish suite item: ${e}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
444
476
|
_getRpLevel(oxLevel) {
|
|
445
477
|
if (oxLevel) {
|
|
446
478
|
return oxLevel.toLowerCase();
|
|
@@ -499,4 +531,4 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
499
531
|
}
|
|
500
532
|
|
|
501
533
|
exports.default = ReportPortalReporter;
|
|
502
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCIsInVuZGVmaW5lZCIsImN1cnJlbnRTdWJTdGVwSWQiLCJhcGlLZXkiLCJlbmRwb2ludCIsInByb2plY3QiLCJFcnJvciIsInJwQ2xpZW50IiwibGF1bmNoIiwibmFtZSIsImluaXQiLCJjaGVja0Nvbm5lY3QiLCJlIiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uUnVubmVyU3RhcnQiLCJyaWQiLCJvcHRzIiwiY2FwcyIsInRlbXBJZCIsInByb21pc2UiLCJzdGFydExhdW5jaCIsIm1vZGUiLCJkZWJ1ZyIsInRlbXBMYXVuY2hJZCIsInRoZW4iLCJyZXNwb25zZSIsImVycm9yIiwiY29uc29sZSIsImRpciIsIm9uUnVubmVyRW5kIiwicmVzdWx0IiwiZmluaXNoTGF1bmNoIiwic3RhdHVzIiwidG9Mb3dlckNhc2UiLCJwcm9taXNlV2l0aFRpbWVvdXQiLCJvblN1aXRlU3RhcnQiLCJzdWl0ZUlkIiwic3VpdGUiLCJzdWl0ZURlZiIsInN0YXJ0VGVzdEl0ZW1SZXEiLCJ0eXBlIiwic3RhcnRUZXN0SXRlbSIsIm9uU3VpdGVFbmQiLCJycFN1aXRlSWQiLCJmaW5pc2hUZXN0SXRlbVJlcSIsImZpbmlzaFRlc3RJdGVtIiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY29kZVJlZiIsInBhdGgiLCJvbkNhc2VFbmQiLCJycFRlc3RJZCIsImZhaWx1cmUiLCJycEZpbGUiLCJzY3JlZW5zaG90IiwiY29udGVudCIsImxvZ01zZyIsIl9zdHJpbmdpZnkiLCJsb2dSZXEiLCJsZXZlbCIsInNlbmRMb2ciLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJtb2R1bGUiLCJyZXBvcnRMb2dTdGVwIiwicnBDYXNlSWQiLCJycFBhcmVudElkIiwiaWQiLCJzdGVwTmFtZSIsIl9nZXRTdGVwTmFtZSIsImxvY2F0aW9uIiwidGVzdENhc2VJZCIsImhhc1N0YXRzIiwib25TdGVwRW5kIiwicnBTdGVwSWQiLCJmaWxlIiwib25Mb2ciLCJzdGVwSWQiLCJtc2ciLCJ0aW1lIiwic3JjIiwicnBMZXZlbCIsIl9nZXRScExldmVsIiwiYXJncyIsImxlbmd0aCIsInNlbmRScExvZyIsIm94TGV2ZWwiLCJzaWduYXR1cmUiLCJzdWJzdHJpbmciLCJTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwidGltZW91dCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBWUE7Ozs7QUFDQSxNQUFNQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxnQ0FBRCxDQUF4Qjs7QUFDQSxNQUFNQyxZQUFZLEdBQUc7QUFDakJDLEVBQUFBLE9BQU8sRUFBRSxTQURRO0FBRWpCQyxFQUFBQSxLQUFLLEVBQUU7QUFGVSxDQUFyQjtBQUlBLE1BQU1DLGVBQWUsR0FBRztBQUNwQkMsRUFBQUEsS0FBSyxFQUFFLE9BRGE7QUFFcEJDLEVBQUFBLElBQUksRUFBRSxNQUZjO0FBR3BCQyxFQUFBQSxJQUFJLEVBQUU7QUFIYyxDQUF4QjtBQUtBLE1BQU1DLGVBQWUsR0FBRyxHQUF4Qjs7QUFFZSxNQUFNQyxvQkFBTixTQUFtQ0MscUJBQW5DLENBQWdEO0FBQzNEQyxFQUFBQSxXQUFX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TyxJQUFQO0FBQ0g7O0FBRUQsUUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBZixJQUEyQkEsR0FBRyxZQUFZVyxNQUE5QyxFQUFzRDtBQUNsRCxhQUFPWCxHQUFQO0FBQ0g7O0FBRUQsUUFBSTtBQUNBLGFBQU9ZLElBQUksQ0FBQ0MsU0FBTCxDQUFlYixHQUFmLENBQVA7QUFDSCxLQUZELENBRUUsT0FBT3JFLENBQVAsRUFBVTtBQUNSaUIsTUFBQUEsT0FBTyxDQUFDRCxLQUFSLENBQWMseURBQWQ7QUFDSDtBQUNKOztBQUVEUSxFQUFBQSxrQkFBa0IsQ0FBQ2YsT0FBRCxFQUFVMEUsT0FBTyxHQUFHLEtBQUssSUFBekIsRUFBK0I7QUFDN0MsV0FBTyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3BDLFVBQUksQ0FBQzdFLE9BQUQsSUFBWSxDQUFDQSxPQUFPLENBQUNLLElBQXpCLEVBQStCO0FBQzNCd0UsUUFBQUEsTUFBTSxDQUFDLElBQUk1RixLQUFKLENBQVcsNEJBQTJCeUYsT0FBUSxLQUE5QyxDQUFELENBQU47QUFDSDs7QUFDRDFFLE1BQUFBLE9BQU8sQ0FBQ0ssSUFBUixDQUFhdUUsT0FBYixFQUFzQkMsTUFBdEI7QUFDQUMsTUFBQUEsVUFBVSxDQUFDRCxNQUFELEVBQVNILE9BQVQsQ0FBVjtBQUNILEtBTk0sQ0FBUDtBQU9IOztBQXZZMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXHJcbiAqL1xyXG5pbXBvcnQgUmVwb3J0ZXJCYXNlIGZyb20gJy4uL3JlcG9ydGVyL1JlcG9ydGVyQmFzZSc7XHJcbmNvbnN0IFJQQ2xpZW50ID0gcmVxdWlyZSgnQG94eWdlbmhxL3JwLWNsaWVudC1qYXZhc2NyaXB0Jyk7XHJcbmNvbnN0IExBVU5DSF9NT0RFUyA9IHtcclxuICAgIERFRkFVTFQ6ICdERUZBVUxUJyxcclxuICAgIERFQlVHOiAnREVCVUcnLFxyXG59O1xyXG5jb25zdCBURVNUX0lURU1fVFlQRVMgPSB7XHJcbiAgICBTVUlURTogJ1NVSVRFJyxcclxuICAgIFRFU1Q6ICdURVNUJyxcclxuICAgIFNURVA6ICdTVEVQJyxcclxufTtcclxuY29uc3QgTUFYX05BTUVfTEVOR1RIID0gMTI4O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0UG9ydGFsUmVwb3J0ZXIgZXh0ZW5kcyBSZXBvcnRlckJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgcmVwb3J0ZXJPcHRzLCBhZ2dyZWdhdG9yKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlck9wdHMgPSByZXBvcnRlck9wdHMgfHwgb3B0aW9ucy5ycDtcclxuICAgICAgICB0aGlzLnJlcG9ydFN0ZXBzID0gcmVwb3J0ZXJPcHRzLnJlcG9ydFN0ZXBzIHx8IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRMb2dzID0gcmVwb3J0ZXJPcHRzLnJlcG9ydExvZ3MgfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9ScElkSGFzaCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICF0aGlzLnJlcG9ydGVyT3B0c1xyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuYXBpS2V5XHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnJlcG9ydGVyT3B0cy5lbmRwb2ludFxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMucHJvamVjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcG9ydFBvcnRhbCBvcHRpb25zIGFyZSBtaXNzaW5nIGluIG94eWdlbi5jb25mIGZpbGUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWdncmVnYXRvciA9IGFnZ3JlZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5ycENsaWVudCA9IG5ldyBSUENsaWVudCh7XHJcbiAgICAgICAgICAgIGxhdW5jaDogdGhpcy5yZXBvcnRlck9wdHMubGF1bmNoIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICAuLi50aGlzLnJlcG9ydGVyT3B0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ycENsaWVudC5jaGVja0Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUCAtIEVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlcjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2VuZXJhdGUocmVzdWx0cykge1xyXG4gICAgfVxyXG4gICAgLy8gRXZlbnRzXHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHsgcmlkLCBvcHRzLCBjYXBzIH0pIHtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydExhdW5jaCh7XHJcbiAgICAgICAgICAgIG1vZGU6IHRoaXMucmVwb3J0ZXJPcHRzLm1vZGUgfHwgTEFVTkNIX01PREVTLkRFRkFVTFQsXHJcbiAgICAgICAgICAgIGRlYnVnOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnRlbXBMYXVuY2hJZCA9IHRlbXBJZDtcclxuICAgICAgICBwcm9taXNlLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEVycm9yIGF0IHRoZSBzdGFydCBvZiBsYXVuY2g6ICR7ZXJyb3J9YCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblJ1bm5lckVuZCh7IHJpZCwgcmVzdWx0IH0pIHtcclxuICAgICAgICAvLyBhd2FpdCB0aGlzLnJwQ2xpZW50LmdldFByb21pc2VGaW5pc2hBbGxJdGVtcyh0aGlzLnRlbXBMYXVuY2hJZCk7XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSBhd2FpdCB0aGlzLnJwQ2xpZW50LmZpbmlzaExhdW5jaCh0aGlzLnRlbXBMYXVuY2hJZCwge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGVuZCBsYXVuY2g6ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN1aXRlU3RhcnQoeyByaWQsIHN1aXRlSWQsIHN1aXRlOiBzdWl0ZURlZiB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogc3VpdGVEZWYubmFtZSB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlNVSVRFLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgeyB0ZW1wSWQsIHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc3RhcnRUZXN0SXRlbShzdGFydFRlc3RJdGVtUmVxLCB0aGlzLnRlbXBMYXVuY2hJZCk7XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXSA9IHRlbXBJZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IHN1aXRlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN1aXRlRW5kKHsgcmlkLCBzdWl0ZUlkLCByZXN1bHQgfSkge1xyXG4gICAgICAgIGlmICghdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF07XHJcbiAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3VpdGVJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN1aXRlIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VTdGFydCh7IHJpZCwgc3VpdGVJZCwgY2FzZUlkLCAnY2FzZSc6IGNhc2VEZWYgfSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGNhc2VEZWYubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlRFU1QsXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF07XHJcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFN1aXRlSWQpO1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHsgcmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3QgcnBUZXN0SWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBpZiAoIXJwVGVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwVGVzdElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFRlc3RJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3RlcFN0YXJ0KHsgcmlkLCBjYXNlSWQsIHN0ZXAgfSkge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXBvcnRTdGVwcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGVwLm1vZHVsZSAmJiBzdGVwLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRMb2dTdGVwKGNhc2VJZCwgc3RlcCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBDYXNlSWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBsZXQgcnBQYXJlbnRJZDsgLyogPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA/XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZF1cclxuICAgICAgICAgICAgOiB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbY2FzZUlkXTsqL1xyXG4gICAgICAgIC8vIGNvbnN0IHJwQ2FzZUlkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgaWYgKHN0ZXAubmFtZSA9PT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWRdOiB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFycFBhcmVudElkIHx8ICFycENhc2VJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5fZ2V0U3RlcE5hbWUoc3RlcCk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogc3RlcE5hbWUsXHJcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVEVQLFxyXG4gICAgICAgICAgICAvLyBcImNvZGVSZWZcIiArIFwicGFyYW1ldGVyc1wiIHVzZWQgYnkgUlAgbGliIHRvIGdlbmVyYXRlIHRlc3RDYXNlSWQgaWYgdGVzdENhc2VJZCBpcyBub3QgZGVmaW5lZFxyXG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcG9ydHBvcnRhbC9jbGllbnQtamF2YXNjcmlwdC9ibG9iLzQ4NmVmNzBjNjM4YTlhMjMyNjcyOTBjNjJkZjFmYWY5MDBmN2RmNmEvbGliL3JlcG9ydC1wb3J0YWwtY2xpZW50LmpzI0w0OTdcclxuICAgICAgICAgICAgLy8gdGhpcyBpcyBkaXNhYmxlZCBmb3Igbm93LiBub3Qgc3VyZSBpZiBhY3R1YWxseSBuZWVkZWQuLi5cclxuICAgICAgICAgICAgLy9wYXJhbWV0ZXJzOiB0aGlzLl9nZXRScEFyZ3Moc3RlcC5hcmdzKSxcclxuICAgICAgICAgICAgY29kZVJlZjogc3RlcC5sb2NhdGlvbixcclxuICAgICAgICAgICAgdGVzdENhc2VJZDogcnBDYXNlSWQsXHJcbiAgICAgICAgICAgIGhhc1N0YXRzOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0VGVzdEl0ZW0oc3RhcnRUZXN0SXRlbVJlcSwgdGhpcy50ZW1wTGF1bmNoSWQsIHJwUGFyZW50SWQpO1xyXG4gICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwLmlkXSA9IHRlbXBJZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IHN0ZXAgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3RlcEVuZCh7IHJpZCwgc3RlcDogcmVzdWx0IH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0Lm1vZHVsZSAmJiByZXN1bHQubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwU3RlcElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3Jlc3VsdC5pZF07XHJcbiAgICAgICAgaWYgKCFycFN0ZXBJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQubmFtZSAhPT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogcnBGaWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwU3RlcElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFN0ZXBJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN0ZXAgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uTG9nKHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUsIHNyYyB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydExvZ3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwUGFyZW50SWQgfHwgdGhpcy50ZW1wTGF1bmNoSWQsIGxvZ1JlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICBpZiAoIXN0ZXAuYXJncyB8fCAhc3RlcC5hcmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxldmVsID0gc3RlcC5uYW1lO1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICBjb25zdCB0aW1lID0gc3RlcC50aW1lO1xyXG4gICAgICAgIGxldCBzdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN1YlN0ZXBJZCkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmN1cnJlbnRTdWJTdGVwSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkKSB7XHJcbiAgICAgICAgICAgIHN0ZXBJZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRScExvZyh7IHN1aXRlSWQ6IHVuZGVmaW5lZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzZW5kUnBMb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KSB7XHJcbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cclxuICAgICAgICBpZiAoIXRoaXMudGVtcExhdW5jaElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBQYXJlbnRJZCA9IHN0ZXBJZCA/XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwSWRdXHJcbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cclxuICAgICAgICAgICAgOiBzdWl0ZUlkID8gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbG9nTXNnLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBjcmVhdGUgbG9nIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9nZXRScExldmVsKG94TGV2ZWwpIHtcclxuICAgICAgICBpZiAob3hMZXZlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3hMZXZlbC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgLypfZ2V0UnBBcmdzKGNiQXJncykge1xyXG4gICAgICAgIGlmICghY2JBcmdzIHx8ICFjYkFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNiQXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmcgPSBjYkFyZ3NbaV07XHJcbiAgICAgICAgICAgIGxldCBhcmdTdHIgPSB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpO1xyXG4gICAgICAgICAgICBycEFyZ3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGBhcmcke2l9YCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBhcmdTdHJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBycEFyZ3M7XHJcbiAgICB9Ki9cclxuICAgIF9nZXRTdGVwTmFtZShzdGVwKSB7XHJcbiAgICAgICAgbGV0IG5hbWU7XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicgJiYgc3RlcC5hcmdzLmxlbmd0aCA+IDApIHsgIC8vIEZJWE1FOiBzdGVwcyBuZWVkIHRvIGJlIG5lc3RlZCB1bmRlciB0cmFuc2FjdGlvbnNcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RlcC5zaWduYXR1cmUpIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAuc2lnbmF0dXJlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdGVwLm1vZHVsZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogaXMgdGhpcyBldmVyIHJlYWNoZWQ/IFwic3RlcC5zaWduYXR1cmVcIiBzZWVtcyB0byBhbHdheXMgZXhpc3RcclxuICAgICAgICAgICAgbmFtZSA9IGAke3N0ZXAubW9kdWxlfS4ke3N0ZXAubmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmFtZSA9IHN0ZXAubmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1heGltdW0gYWxsb3dlZCBuYW1lIGxlbmd0aCBpbiBSUCBpcyAxMDI0IGJ5dGVzXHJcbiAgICAgICAgLy8gd2UgdHJ1bmNhdGUgaXQgZXZlbiBsb3dlciBzbyBpdCB3aWxsIGRpc3BsYXkgbmljZWx5XHJcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBNQVhfTkFNRV9MRU5HVEgtMykgKyAnLi4uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0dXJucyBudWxsIGlmIG1zZyBjYW5ub3QgYmUgc3RyaW5naWZpZWQsIG9yIHN0cmlnaWZpZXMgaXQgaWYgaXQncyBub3QgYSBzdHJpbmcgYWxyZWFkeVxyXG4gICAgX3N0cmluZ2lmeShtc2cpIHtcclxuICAgICAgICAvLyB3ZSB0ZXN0IGZvciB1bmRlZmluZWQgYW5kIG51bGwgZXhwbGljaXRseSBvbiBwdXJwb3NlIGJlY2F1c2Ugb3RoZXIgZmFsc3kgdmFsdWVzIChlLmcuIDApIGFyZSBva1xyXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAndW5kZWZpbmVkJyB8fCBtc2cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgfHwgbXNnIGluc3RhbmNlb2YgU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JQIC0gZXJyb3Igc2VuZGluZyBsb2c6IG1zZyBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXQgPSAxMCAqIDEwMDApIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXByb21pc2UgfHwgIXByb21pc2UudGhlbikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUHJvbWlzZSBhd2FpdCB0aW1lb3V0IG9mICR7dGltZW91dH0gbXNgKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVqZWN0LCB0aW1lb3V0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuIl19
|
|
534
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCIsImN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCIsInVuZGVmaW5lZCIsImN1cnJlbnRTdWJTdGVwSWQiLCJhcGlLZXkiLCJlbmRwb2ludCIsInByb2plY3QiLCJFcnJvciIsInJwQ2xpZW50IiwibGF1bmNoIiwibmFtZSIsImluaXQiLCJjaGVja0Nvbm5lY3QiLCJlIiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uTGF1bmNoU3RhcnQiLCJ0ZW1wSWQiLCJwcm9taXNlIiwic3RhcnRMYXVuY2giLCJtb2RlIiwiZGVidWciLCJ0ZW1wTGF1bmNoSWQiLCJ0aGVuIiwicmVzcG9uc2UiLCJlcnJvciIsImNvbnNvbGUiLCJkaXIiLCJvbkxhdW5jaEVuZCIsIl9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMiLCJoYXNGYWlsZWQiLCJzb21lIiwieCIsInN0YXR1cyIsIlN0YXR1cyIsIkZBSUxFRCIsImZpbmlzaExhdW5jaCIsInByb21pc2VXaXRoVGltZW91dCIsIm9uUnVubmVyU3RhcnQiLCJyaWQiLCJvcHRzIiwiY2FwcyIsIm9uUnVubmVyRW5kIiwicmVzdWx0Iiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwic3VpdGVEZWYiLCJzdWl0ZVJlZklkIiwicmVmSWQiLCJzdGFydFRlc3RJdGVtUmVxIiwidHlwZSIsInN0YXJ0VGVzdEl0ZW0iLCJvblN1aXRlRW5kIiwicHVzaCIsIm9uQ2FzZVN0YXJ0IiwiY2FzZUlkIiwiY2FzZURlZiIsImNvZGVSZWYiLCJwYXRoIiwicnBTdWl0ZUlkIiwib25DYXNlRW5kIiwicnBUZXN0SWQiLCJ0b0xvd2VyQ2FzZSIsImZhaWx1cmUiLCJycEZpbGUiLCJzY3JlZW5zaG90IiwiY29udGVudCIsImxvZ01zZyIsIl9zdHJpbmdpZnkiLCJsb2dSZXEiLCJsZXZlbCIsInNlbmRMb2ciLCJmaW5pc2hUZXN0SXRlbVJlcSIsImZpbmlzaFRlc3RJdGVtIiwib25TdGVwU3RhcnQiLCJzdGVwIiwibW9kdWxlIiwicmVwb3J0TG9nU3RlcCIsInJwQ2FzZUlkIiwicnBQYXJlbnRJZCIsImlkIiwic3RlcE5hbWUiLCJfZ2V0U3RlcE5hbWUiLCJsb2NhdGlvbiIsInRlc3RDYXNlSWQiLCJoYXNTdGF0cyIsIm9uU3RlcEVuZCIsInN0YXJ0c1dpdGgiLCJycFN0ZXBJZCIsImZpbGUiLCJvbkxvZyIsInN0ZXBJZCIsIm1zZyIsInRpbWUiLCJzcmMiLCJycExldmVsIiwiX2dldFJwTGV2ZWwiLCJhcmdzIiwibGVuZ3RoIiwic2VuZFJwTG9nIiwiT2JqZWN0Iiwia2V5cyIsImhhc0ZhaWxlZFN1aXRlIiwib3hMZXZlbCIsInNpZ25hdHVyZSIsInN1YnN0cmluZyIsIlN0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aW1lb3V0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7OztBQUNBLE1BQU1BLFFBQVEsR0FBR0MsT0FBTyxDQUFDLGdDQUFELENBQXhCOztBQUNBLE1BQU1DLFlBQVksR0FBRztBQUNqQkMsRUFBQUEsT0FBTyxFQUFFLFNBRFE7QUFFakJDLEVBQUFBLEtBQUssRUFB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QUdBLElBQUksQ0FBQ2lHLFNBQUwsQ0FBZSxDQUFmLEVBQWtCeEgsZUFBZSxHQUFDLENBQWxDLElBQXVDLEtBQTlDO0FBQ0g7O0FBQ0QsV0FBT3VCLElBQVA7QUFDSDs7QUFHRDRELEVBQUFBLFVBQVUsQ0FBQ3dCLEdBQUQsRUFBTTtBQUVaLFFBQUksT0FBT0EsR0FBUCxLQUFlLFdBQWYsSUFBOEJBLEdBQUcsS0FBSyxJQUExQyxFQUFnRDtBQUM1QyxhQUFPLElBQVA7QUFDSDs7QUFFRCxRQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFmLElBQTJCQSxHQUFHLFlBQVljLE1BQTlDLEVBQXNEO0FBQ2xELGFBQU9kLEdBQVA7QUFDSDs7QUFFRCxRQUFJO0FBQ0EsYUFBT2UsSUFBSSxDQUFDQyxTQUFMLENBQWVoQixHQUFmLENBQVA7QUFDSCxLQUZELENBRUUsT0FBT2pGLENBQVAsRUFBVTtBQUNSYyxNQUFBQSxPQUFPLENBQUNELEtBQVIsQ0FBYyx5REFBZDtBQUNIO0FBQ0o7O0FBRURZLEVBQUFBLGtCQUFrQixDQUFDbkIsT0FBRCxFQUFVNEYsT0FBTyxHQUFHLEtBQUssSUFBekIsRUFBK0I7QUFDN0MsV0FBTyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3BDLFVBQUksQ0FBQy9GLE9BQUQsSUFBWSxDQUFDQSxPQUFPLENBQUNLLElBQXpCLEVBQStCO0FBQzNCMEYsUUFBQUEsTUFBTSxDQUFDLElBQUkzRyxLQUFKLENBQVcsNEJBQTJCd0csT0FBUSxLQUE5QyxDQUFELENBQU47QUFDSDs7QUFDRDVGLE1BQUFBLE9BQU8sQ0FBQ0ssSUFBUixDQUFheUYsT0FBYixFQUFzQkMsTUFBdEI7QUFDQUMsTUFBQUEsVUFBVSxDQUFDRCxNQUFELEVBQVNILE9BQVQsQ0FBVjtBQUNILEtBTk0sQ0FBUDtBQU9IOztBQWphMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXHJcbiAqL1xyXG5pbXBvcnQgUmVwb3J0ZXJCYXNlIGZyb20gJy4uL3JlcG9ydGVyL1JlcG9ydGVyQmFzZSc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcclxuY29uc3QgUlBDbGllbnQgPSByZXF1aXJlKCdAb3h5Z2VuaHEvcnAtY2xpZW50LWphdmFzY3JpcHQnKTtcclxuY29uc3QgTEFVTkNIX01PREVTID0ge1xyXG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxyXG4gICAgREVCVUc6ICdERUJVRycsXHJcbn07XHJcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcclxuICAgIFNVSVRFOiAnU1VJVEUnLFxyXG4gICAgVEVTVDogJ1RFU1QnLFxyXG4gICAgU1RFUDogJ1NURVAnLFxyXG59O1xyXG5jb25zdCBNQVhfTkFNRV9MRU5HVEggPSAxMjg7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRQb3J0YWxSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCByZXBvcnRlck9wdHMsIGFnZ3JlZ2F0b3IpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVyT3B0cyA9IHJlcG9ydGVyT3B0cyB8fCBvcHRpb25zLnJwO1xyXG4gICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRlck9wdHMucmVwb3J0U3RlcHMgfHwgdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmFwaUtleVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuZW5kcG9pbnRcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLnByb2plY3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvcnRQb3J0YWwgb3B0aW9ucyBhcmUgbWlzc2luZyBpbiBveHlnZW4uY29uZiBmaWxlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yO1xyXG4gICAgICAgIHRoaXMucnBDbGllbnQgPSBuZXcgUlBDbGllbnQoe1xyXG4gICAgICAgICAgICBsYXVuY2g6IHRoaXMucmVwb3J0ZXJPcHRzLmxhdW5jaCB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgLi4udGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnBDbGllbnQuY2hlY2tDb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUlAgLSBFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgIH1cclxuICAgIC8vIEV2ZW50c1xyXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydCh7IG9wdGlvbnMgfSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0TGF1bmNoKHtcclxuICAgICAgICAgICAgbW9kZTogdGhpcy5yZXBvcnRlck9wdHMubW9kZSB8fCBMQVVOQ0hfTU9ERVMuREVGQVVMVCxcclxuICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudGVtcExhdW5jaElkID0gdGVtcElkO1xyXG4gICAgICAgIHByb21pc2UudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRXJyb3IgYXQgdGhlIHN0YXJ0IG9mIGxhdW5jaDogJHtlcnJvcn1gKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uTGF1bmNoRW5kKHsgcmVzdWx0cyB9KSB7XHJcbiAgICAgICAgLy8gcmVwb3J0IHRoZSBlbmQgb2YgYWxsIHN0YXJ0ZWQgc3VpdGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzKCk7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdW5jaCBzdGF0dXNcclxuICAgICAgICBjb25zdCBoYXNGYWlsZWQgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSBhd2FpdCB0aGlzLnJwQ2xpZW50LmZpbmlzaExhdW5jaCh0aGlzLnRlbXBMYXVuY2hJZCwge1xyXG4gICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZCA/ICdGQUlMRUQnIDogJ1BBU1NFRCdcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGVuZCBsYXVuY2g6ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHsgcmlkLCBvcHRzLCBjYXBzIH0pIHtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHsgcmlkLCByZXN1bHQgfSkge1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TdWl0ZVN0YXJ0KHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZTogc3VpdGVEZWYgfSkge1xyXG4gICAgICAgIC8vIGluIHBhcmFsbGVsIHRlc3QgZXhlY3V0aW9uLCBvblN1aXRlU3RhcnQgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHN1aXRlIFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYWxsIFwic3RhcnRUZXN0SXRlbVwiIHRoZSBzYW1lIHN1aXRlIG9ubHkgb25jZVxyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVmSWQgPSBzdWl0ZURlZi5yZWZJZDtcclxuICAgICAgICBpZiAodGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFzc2lnbiBlbXB0eSBvYmplY3QgYXMgYSBmb3JtIG9mIG11bHRpLXRocmVhZCBsb2NrLFxyXG4gICAgICAgIC8vIHNvIHRoZSBwYXJhbGxlbCBjYWxsIHRvIG9uU3VpdGVTdGFydCBmcm9tIHRoZSBuZXh0IHRocmVhZFxyXG4gICAgICAgIC8vIHdpbGwgbm90IHRyeSB0byBwcm9jZWVkIHdpdGggdGhlIGNvZGUgYmVsb3dcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWRbc3VpdGVSZWZJZF0gPSBbXTtcclxuICAgICAgICBjb25zdCBzdGFydFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBzdWl0ZURlZi5uYW1lIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1VJVEUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQoeyByaWQsIHN1aXRlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHJlc3VsdC5yZWZJZDtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSAmJiB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXS5wdXNoKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCAnY2FzZSc6IGNhc2VEZWYgfSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGNhc2VEZWYubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlRFU1QsXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFN1aXRlSWQpO1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3QgcnBUZXN0SWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBpZiAoIXJwVGVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwVGVzdElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFRlc3RJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN0ZXBTdGFydCh7IHJpZCwgY2FzZUlkLCBzdGVwIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RlcC5tb2R1bGUgJiYgc3RlcC5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQ2FzZUlkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgbGV0IHJwUGFyZW50SWQ7XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSBzdGVwLmlkO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSBycENhc2VJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA/IHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZF0gOiBycENhc2VJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcnBQYXJlbnRJZCB8fCAhcnBDYXNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMuX2dldFN0ZXBOYW1lKHN0ZXApO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN0ZXBOYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1RFUCxcclxuICAgICAgICAgICAgLy8gXCJjb2RlUmVmXCIgKyBcInBhcmFtZXRlcnNcIiB1c2VkIGJ5IFJQIGxpYiB0byBnZW5lcmF0ZSB0ZXN0Q2FzZUlkIGlmIHRlc3RDYXNlSWQgaXMgbm90IGRlZmluZWRcclxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXBvcnRwb3J0YWwvY2xpZW50LWphdmFzY3JpcHQvYmxvYi80ODZlZjcwYzYzOGE5YTIzMjY3MjkwYzYyZGYxZmFmOTAwZjdkZjZhL2xpYi9yZXBvcnQtcG9ydGFsLWNsaWVudC5qcyNMNDk3XHJcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgZGlzYWJsZWQgZm9yIG5vdy4gbm90IHN1cmUgaWYgYWN0dWFsbHkgbmVlZGVkLi4uXHJcbiAgICAgICAgICAgIC8vcGFyYW1ldGVyczogdGhpcy5fZ2V0UnBBcmdzKHN0ZXAuYXJncyksXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IHN0ZXAubG9jYXRpb24sXHJcbiAgICAgICAgICAgIHRlc3RDYXNlSWQ6IHJwQ2FzZUlkLFxyXG4gICAgICAgICAgICBoYXNTdGF0czogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFBhcmVudElkKTtcclxuICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcC5pZF0gPSB0ZW1wSWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCBzdGVwIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN0ZXBFbmQoeyByaWQsIHN0ZXA6IHJlc3VsdCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICYmIHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ2xvZy4nKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwU3RlcElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3Jlc3VsdC5pZF07XHJcbiAgICAgICAgaWYgKCFycFN0ZXBJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQubmFtZSAhPT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogcnBGaWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwU3RlcElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFN0ZXBJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN0ZXAgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uTG9nKHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUsIHNyYyB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydExvZ3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwUGFyZW50SWQgfHwgdGhpcy50ZW1wTGF1bmNoSWQsIGxvZ1JlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICBpZiAoIXN0ZXAuYXJncyB8fCAhc3RlcC5hcmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxldmVsID0gc3RlcC5uYW1lO1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICBjb25zdCB0aW1lID0gc3RlcC50aW1lO1xyXG4gICAgICAgIGxldCBzdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN1YlN0ZXBJZCkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmN1cnJlbnRTdWJTdGVwSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkKSB7XHJcbiAgICAgICAgICAgIHN0ZXBJZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRScExvZyh7IHN1aXRlSWQ6IHVuZGVmaW5lZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzZW5kUnBMb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KSB7XHJcbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cclxuICAgICAgICBpZiAoIXRoaXMudGVtcExhdW5jaElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBQYXJlbnRJZCA9IHN0ZXBJZCA/XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwSWRdXHJcbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cclxuICAgICAgICAgICAgOiBzdWl0ZUlkID8gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbG9nTXNnLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBjcmVhdGUgbG9nIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBzdWl0ZVJlZklkIG9mIE9iamVjdC5rZXlzKHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2gpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlID0gcmVzdWx0cy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogaGFzRmFpbGVkU3VpdGUgPyAnZmFpbGVkJyA6ICdwYXNzZWQnLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBTdWl0ZUlkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCBzdWl0ZSBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfZ2V0UnBMZXZlbChveExldmVsKSB7XHJcbiAgICAgICAgaWYgKG94TGV2ZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG94TGV2ZWwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdpbmZvJztcclxuICAgIH1cclxuICAgIC8qX2dldFJwQXJncyhjYkFyZ3MpIHtcclxuICAgICAgICBpZiAoIWNiQXJncyB8fCAhY2JBcmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycEFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjYkFyZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYXJnID0gY2JBcmdzW2ldO1xyXG4gICAgICAgICAgICBsZXQgYXJnU3RyID0gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgYXJnIGluc3RhbmNlb2YgU3RyaW5nID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKTtcclxuICAgICAgICAgICAgcnBBcmdzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAga2V5OiBgYXJnJHtpfWAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYXJnU3RyXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcnBBcmdzO1xyXG4gICAgfSovXHJcbiAgICBfZ2V0U3RlcE5hbWUoc3RlcCkge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG5cclxuICAgICAgICBpZiAoc3RlcC5uYW1lID09PSAndHJhbnNhY3Rpb24nICYmIHN0ZXAuYXJncy5sZW5ndGggPiAwKSB7ICAvLyBGSVhNRTogc3RlcHMgbmVlZCB0byBiZSBuZXN0ZWQgdW5kZXIgdHJhbnNhY3Rpb25zXHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLmFyZ3NbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0ZXAuc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLnNpZ25hdHVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RlcC5tb2R1bGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoaXMgZXZlciByZWFjaGVkPyBcInN0ZXAuc2lnbmF0dXJlXCIgc2VlbXMgdG8gYWx3YXlzIGV4aXN0XHJcbiAgICAgICAgICAgIG5hbWUgPSBgJHtzdGVwLm1vZHVsZX0uJHtzdGVwLm5hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLm5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtYXhpbXVtIGFsbG93ZWQgbmFtZSBsZW5ndGggaW4gUlAgaXMgMTAyNCBieXRlc1xyXG4gICAgICAgIC8vIHdlIHRydW5jYXRlIGl0IGV2ZW4gbG93ZXIgc28gaXQgd2lsbCBkaXNwbGF5IG5pY2VseVxyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IE1BWF9OQU1FX0xFTkdUSCkge1xyXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgTUFYX05BTUVfTEVOR1RILTMpICsgJy4uLic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJldHVybnMgbnVsbCBpZiBtc2cgY2Fubm90IGJlIHN0cmluZ2lmaWVkLCBvciBzdHJpZ2lmaWVzIGl0IGlmIGl0J3Mgbm90IGEgc3RyaW5nIGFscmVhZHlcclxuICAgIF9zdHJpbmdpZnkobXNnKSB7XHJcbiAgICAgICAgLy8gd2UgdGVzdCBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIGV4cGxpY2l0bHkgb24gcHVycG9zZSBiZWNhdXNlIG90aGVyIGZhbHN5IHZhbHVlcyAoZS5nLiAwKSBhcmUgb2tcclxuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcgfHwgbXNnID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnIHx8IG1zZyBpbnN0YW5jZW9mIFN0cmluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbXNnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSUCAtIGVycm9yIHNlbmRpbmcgbG9nOiBtc2cgb2JqZWN0IGNhbm5vdCBiZSBzZXJpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb21pc2VXaXRoVGltZW91dChwcm9taXNlLCB0aW1lb3V0ID0gMTAgKiAxMDAwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFwcm9taXNlIHx8ICFwcm9taXNlLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFByb21pc2UgYXdhaXQgdGltZW91dCBvZiAke3RpbWVvdXR9IG1zYCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb21pc2UudGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlamVjdCwgdGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|