oxygen-cli 1.39.4 → 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 +5 -0
- 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_reporters/reporter-rp.js +57 -28
- 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
|
}) {
|
|
@@ -444,6 +452,27 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
444
452
|
}
|
|
445
453
|
}
|
|
446
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
|
+
|
|
447
476
|
_getRpLevel(oxLevel) {
|
|
448
477
|
if (oxLevel) {
|
|
449
478
|
return oxLevel.toLowerCase();
|
|
@@ -502,4 +531,4 @@ class ReportPortalReporter extends _ReporterBase.default {
|
|
|
502
531
|
}
|
|
503
532
|
|
|
504
533
|
exports.default = ReportPortalReporter;
|
|
505
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCIsInVuZGVmaW5lZCIsImN1cnJlbnRTdWJTdGVwSWQiLCJhcGlLZXkiLCJlbmRwb2ludCIsInByb2plY3QiLCJFcnJvciIsInJwQ2xpZW50IiwibGF1bmNoIiwibmFtZSIsImluaXQiLCJjaGVja0Nvbm5lY3QiLCJlIiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uUnVubmVyU3RhcnQiLCJyaWQiLCJvcHRzIiwiY2FwcyIsInRlbXBJZCIsInByb21pc2UiLCJzdGFydExhdW5jaCIsIm1vZGUiLCJkZWJ1ZyIsInRlbXBMYXVuY2hJZCIsInRoZW4iLCJyZXNwb25zZSIsImVycm9yIiwiY29uc29sZSIsImRpciIsIm9uUnVubmVyRW5kIiwicmVzdWx0IiwiZmluaXNoTGF1bmNoIiwic3RhdHVzIiwidG9Mb3dlckNhc2UiLCJwcm9taXNlV2l0aFRpbWVvdXQiLCJvblN1aXRlU3RhcnQiLCJzdWl0ZUlkIiwic3VpdGUiLCJzdWl0ZURlZiIsInN0YXJ0VGVzdEl0ZW1SZXEiLCJ0eXBlIiwic3RhcnRUZXN0SXRlbSIsIm9uU3VpdGVFbmQiLCJycFN1aXRlSWQiLCJmaW5pc2hUZXN0SXRlbVJlcSIsImZpbmlzaFRlc3RJdGVtIiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY29kZVJlZiIsInBhdGgiLCJvbkNhc2VFbmQiLCJycFRlc3RJZCIsImZhaWx1cmUiLCJycEZpbGUiLCJzY3JlZW5zaG90IiwiY29udGVudCIsImxvZ01zZyIsIl9zdHJpbmdpZnkiLCJsb2dSZXEiLCJsZXZlbCIsInNlbmRMb2ciLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJtb2R1bGUiLCJyZXBvcnRMb2dTdGVwIiwicnBDYXNlSWQiLCJycFBhcmVudElkIiwiaWQiLCJzdGVwTmFtZSIsIl9nZXRTdGVwTmFtZSIsImxvY2F0aW9uIiwidGVzdENhc2VJZCIsImhhc1N0YXRzIiwib25TdGVwRW5kIiwic3RhcnRzV2l0aCIsInJwU3RlcElkIiwiZmlsZSIsIm9uTG9nIiwic3RlcElkIiwibXNnIiwidGltZSIsInNyYyIsInJwTGV2ZWwiLCJfZ2V0UnBMZXZlbCIsImFyZ3MiLCJsZW5ndGgiLCJzZW5kUnBMb2ciLCJveExldmVsIiwic2lnbmF0dXJlIiwic3Vic3RyaW5nIiwiU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInRpbWVvdXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOzs7O0FBQ0EsTUFBTUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsZ0NBQUQsQ0FBeEI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0FBQ2pCQyxFQUFBQSxPQUFPLEVBQUUsU0FEUTtBQUVqQkMsRUFBQUEsS0FBSyxFQUFFO0FBRlUsQ0FBckI7QUFJQSxNQUFNQyxlQUFlLEdBQUc7QUFDcEJDLEVBQUFBLEtBQUssRUFBRSxPQURhO0FBRXBCQyxFQUFBQSxJQUFJLEVBQUUsTUFGYztBQUdwQkMsRUFBQUEsSUFBSSxFQUFFO0FBSGMsQ0FBeEI7QUFLQSxNQUFNQyxlQUFlLEdBQUcsR0FBeEI7O0FBRWUsTUFBTUMsb0JBQU4sU0FBbUNDLHFCQUFuQyxDQUFnRDtBQUMz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LFdBQWYsSUFBOEJBLEdBQUcsS0FBSyxJQUExQyxFQUFnRDtBQUM1QyxhQUFPLElBQVA7QUFDSDs7QUFFRCxRQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFmLElBQTJCQSxHQUFHLFlBQVlXLE1BQTlDLEVBQXNEO0FBQ2xELGFBQU9YLEdBQVA7QUFDSDs7QUFFRCxRQUFJO0FBQ0EsYUFBT1ksSUFBSSxDQUFDQyxTQUFMLENBQWViLEdBQWYsQ0FBUDtBQUNILEtBRkQsQ0FFRSxPQUFPdEUsQ0FBUCxFQUFVO0FBQ1JpQixNQUFBQSxPQUFPLENBQUNELEtBQVIsQ0FBYyx5REFBZDtBQUNIO0FBQ0o7O0FBRURRLEVBQUFBLGtCQUFrQixDQUFDZixPQUFELEVBQVUyRSxPQUFPLEdBQUcsS0FBSyxJQUF6QixFQUErQjtBQUM3QyxXQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDcEMsVUFBSSxDQUFDOUUsT0FBRCxJQUFZLENBQUNBLE9BQU8sQ0FBQ0ssSUFBekIsRUFBK0I7QUFDM0J5RSxRQUFBQSxNQUFNLENBQUMsSUFBSTdGLEtBQUosQ0FBVyw0QkFBMkIwRixPQUFRLEtBQTlDLENBQUQsQ0FBTjtBQUNIOztBQUNEM0UsTUFBQUEsT0FBTyxDQUFDSyxJQUFSLENBQWF3RSxPQUFiLEVBQXNCQyxNQUF0QjtBQUNBQyxNQUFBQSxVQUFVLENBQUNELE1BQUQsRUFBU0gsT0FBVCxDQUFWO0FBQ0gsS0FOTSxDQUFQO0FBT0g7O0FBeFkwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogT3h5Z2VuIFJlcG9ydGVyIGZvciBSZXBvcnRQb3J0YWxcclxuICovXHJcbmltcG9ydCBSZXBvcnRlckJhc2UgZnJvbSAnLi4vcmVwb3J0ZXIvUmVwb3J0ZXJCYXNlJztcclxuY29uc3QgUlBDbGllbnQgPSByZXF1aXJlKCdAb3h5Z2VuaHEvcnAtY2xpZW50LWphdmFzY3JpcHQnKTtcclxuY29uc3QgTEFVTkNIX01PREVTID0ge1xyXG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxyXG4gICAgREVCVUc6ICdERUJVRycsXHJcbn07XHJcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcclxuICAgIFNVSVRFOiAnU1VJVEUnLFxyXG4gICAgVEVTVDogJ1RFU1QnLFxyXG4gICAgU1RFUDogJ1NURVAnLFxyXG59O1xyXG5jb25zdCBNQVhfTkFNRV9MRU5HVEggPSAxMjg7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRQb3J0YWxSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCByZXBvcnRlck9wdHMsIGFnZ3JlZ2F0b3IpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVyT3B0cyA9IHJlcG9ydGVyT3B0cyB8fCBvcHRpb25zLnJwO1xyXG4gICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRlck9wdHMucmVwb3J0U3RlcHMgfHwgdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3ViU3RlcElkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgIXRoaXMucmVwb3J0ZXJPcHRzXHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnJlcG9ydGVyT3B0cy5hcGlLZXlcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmVuZHBvaW50XHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnJlcG9ydGVyT3B0cy5wcm9qZWN0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVwb3J0UG9ydGFsIG9wdGlvbnMgYXJlIG1pc3NpbmcgaW4gb3h5Z2VuLmNvbmYgZmlsZS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZ2dyZWdhdG9yID0gYWdncmVnYXRvcjtcclxuICAgICAgICB0aGlzLnJwQ2xpZW50ID0gbmV3IFJQQ2xpZW50KHtcclxuICAgICAgICAgICAgbGF1bmNoOiB0aGlzLnJlcG9ydGVyT3B0cy5sYXVuY2ggfHwgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgICAgICAgIC4uLnRoaXMucmVwb3J0ZXJPcHRzXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJwQ2xpZW50LmNoZWNrQ29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQIC0gRXJyb3IgY29ubmVjdGluZyB0byB0aGUgc2VydmVyOiAke2UubWVzc2FnZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZW5lcmF0ZShyZXN1bHRzKSB7XHJcbiAgICB9XHJcbiAgICAvLyBFdmVudHNcclxuICAgIGFzeW5jIG9uUnVubmVyU3RhcnQoeyByaWQsIG9wdHMsIGNhcHMgfSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0TGF1bmNoKHtcclxuICAgICAgICAgICAgbW9kZTogdGhpcy5yZXBvcnRlck9wdHMubW9kZSB8fCBMQVVOQ0hfTU9ERVMuREVGQVVMVCxcclxuICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudGVtcExhdW5jaElkID0gdGVtcElkO1xyXG4gICAgICAgIHByb21pc2UudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRXJyb3IgYXQgdGhlIHN0YXJ0IG9mIGxhdW5jaDogJHtlcnJvcn1gKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHsgcmlkLCByZXN1bHQgfSkge1xyXG4gICAgICAgIC8vIGF3YWl0IHRoaXMucnBDbGllbnQuZ2V0UHJvbWlzZUZpbmlzaEFsbEl0ZW1zKHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IGF3YWl0IHRoaXMucnBDbGllbnQuZmluaXNoTGF1bmNoKHRoaXMudGVtcExhdW5jaElkLCB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZW5kIGxhdW5jaDogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGU6IHN1aXRlRGVmIH0pIHtcclxuICAgICAgICBjb25zdCBzdGFydFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBzdWl0ZURlZi5uYW1lIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1VJVEUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQoeyByaWQsIHN1aXRlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXTtcclxuICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBTdWl0ZUlkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHsgcmlkLCBzdWl0ZUlkLCBjYXNlSWQsICdjYXNlJzogY2FzZURlZiB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogY2FzZURlZi5uYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuVEVTVCxcclxuICAgICAgICAgICAgY29kZVJlZjogY2FzZURlZi5wYXRoLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcnBTdWl0ZUlkID0gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXTtcclxuICAgICAgICBpZiAoIXJwU3VpdGVJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0VGVzdEl0ZW0oc3RhcnRUZXN0SXRlbVJlcSwgdGhpcy50ZW1wTGF1bmNoSWQsIHJwU3VpdGVJZCk7XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF0gPSB0ZW1wSWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCB0ZXN0IGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VFbmQoeyByaWQsIHN1aXRlSWQsIGNhc2VJZCwgcmVzdWx0IH0pIHtcclxuICAgICAgICBjb25zdCBycFRlc3RJZCA9IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdO1xyXG4gICAgICAgIGlmICghcnBUZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXN1bHQuc3RhdHVzLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgcmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgY29uc3QgcnBGaWxlID0gcmVzdWx0LnNjcmVlbnNob3QgP1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2NyZWVuc2hvdCcsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdC5zY3JlZW5zaG90LFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KHJlc3VsdC5mYWlsdXJlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAobG9nTXNnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbG9nTXNnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBUZXN0SWQsIGxvZ1JlcSwgcnBGaWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzZW5kIGxvZyBmb3IgZmluaXNoZWQgdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwVGVzdElkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3RlcFN0YXJ0KHsgcmlkLCBjYXNlSWQsIHN0ZXAgfSkge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXBvcnRTdGVwcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGVwLm1vZHVsZSAmJiBzdGVwLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRMb2dTdGVwKGNhc2VJZCwgc3RlcCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBDYXNlSWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBsZXQgcnBQYXJlbnRJZDtcclxuXHJcbiAgICAgICAgaWYgKHN0ZXAubmFtZSA9PT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcnBQYXJlbnRJZCA9IHJwQ2FzZUlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3ViU3RlcElkID0gc3RlcC5pZDtcclxuICAgICAgICAgICAgcnBQYXJlbnRJZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkID8gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3RoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkXSA6IHJwQ2FzZUlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFycFBhcmVudElkIHx8ICFycENhc2VJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5fZ2V0U3RlcE5hbWUoc3RlcCk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgbmFtZTogc3RlcE5hbWUsXHJcbiAgICAgICAgICAgIHR5cGU6IFRFU1RfSVRFTV9UWVBFUy5TVEVQLFxyXG4gICAgICAgICAgICAvLyBcImNvZGVSZWZcIiArIFwicGFyYW1ldGVyc1wiIHVzZWQgYnkgUlAgbGliIHRvIGdlbmVyYXRlIHRlc3RDYXNlSWQgaWYgdGVzdENhc2VJZCBpcyBub3QgZGVmaW5lZFxyXG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcG9ydHBvcnRhbC9jbGllbnQtamF2YXNjcmlwdC9ibG9iLzQ4NmVmNzBjNjM4YTlhMjMyNjcyOTBjNjJkZjFmYWY5MDBmN2RmNmEvbGliL3JlcG9ydC1wb3J0YWwtY2xpZW50LmpzI0w0OTdcclxuICAgICAgICAgICAgLy8gdGhpcyBpcyBkaXNhYmxlZCBmb3Igbm93LiBub3Qgc3VyZSBpZiBhY3R1YWxseSBuZWVkZWQuLi5cclxuICAgICAgICAgICAgLy9wYXJhbWV0ZXJzOiB0aGlzLl9nZXRScEFyZ3Moc3RlcC5hcmdzKSxcclxuICAgICAgICAgICAgY29kZVJlZjogc3RlcC5sb2NhdGlvbixcclxuICAgICAgICAgICAgdGVzdENhc2VJZDogcnBDYXNlSWQsXHJcbiAgICAgICAgICAgIGhhc1N0YXRzOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0VGVzdEl0ZW0oc3RhcnRUZXN0SXRlbVJlcSwgdGhpcy50ZW1wTGF1bmNoSWQsIHJwUGFyZW50SWQpO1xyXG4gICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwLmlkXSA9IHRlbXBJZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIHN0YXJ0IHN0ZXAgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3RlcEVuZCh7IHJpZCwgc3RlcDogcmVzdWx0IH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0Lm5hbWUgJiYgcmVzdWx0Lm5hbWUuc3RhcnRzV2l0aCgnbG9nLicpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBTdGVwSWQgPSB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbcmVzdWx0LmlkXTtcclxuICAgICAgICBpZiAoIXJwU3RlcElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBycEZpbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBTdGVwSWQsIGxvZ1JlcSwgcnBGaWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzZW5kIGxvZyBmb3IgZmluaXNoZWQgdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmluaXNoVGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LmZpbmlzaFRlc3RJdGVtKHJwU3RlcElkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBmaW5pc2ggc3RlcCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25Mb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSwgc3JjIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0TG9ncykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE94eWdlbiBtaWdodCBzdGFydCBnZW5lcmF0aW5nIGxvZ3MgYmVmb3JlIG9uUnVubmVyU3RhcnQgZXZlbnQsIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBMYXVuY2hJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwUGFyZW50SWQgPSBzdGVwSWQgP1xyXG4gICAgICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcElkXVxyXG4gICAgICAgICAgICA6IGNhc2VJZCA/IHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdXHJcbiAgICAgICAgICAgIDogc3VpdGVJZCA/IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVJZF1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgcnBMZXZlbCA9IHRoaXMuX2dldFJwTGV2ZWwobGV2ZWwpO1xyXG5cclxuICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkobXNnKTtcclxuICAgICAgICBpZiAobG9nTXNnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBycExldmVsLFxyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnNlbmRMb2cocnBQYXJlbnRJZCB8fCB0aGlzLnRlbXBMYXVuY2hJZCwgbG9nUmVxKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gY3JlYXRlIGxvZyBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXBvcnRMb2dTdGVwKGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIGlmICghc3RlcC5hcmdzIHx8ICFzdGVwLmFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBzdGVwLm5hbWU7XHJcbiAgICAgICAgY29uc3QgbXNnID0gc3RlcC5hcmdzWzBdO1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBzdGVwLnRpbWU7XHJcbiAgICAgICAgbGV0IHN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3ViU3RlcElkKSB7XHJcbiAgICAgICAgICAgIHN0ZXBJZCA9IHRoaXMuY3VycmVudFN1YlN0ZXBJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQpIHtcclxuICAgICAgICAgICAgc3RlcElkID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFJwTG9nKHsgc3VpdGVJZDogdW5kZWZpbmVkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNlbmRScExvZyh7IHN1aXRlSWQsIGNhc2VJZCwgc3RlcElkLCBsZXZlbCwgbXNnLCB0aW1lIH0pIHtcclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwUGFyZW50SWQgfHwgdGhpcy50ZW1wTGF1bmNoSWQsIGxvZ1JlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFJwTGV2ZWwob3hMZXZlbCkge1xyXG4gICAgICAgIGlmIChveExldmVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBveExldmVsLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaW5mbyc7XHJcbiAgICB9XHJcbiAgICAvKl9nZXRScEFyZ3MoY2JBcmdzKSB7XHJcbiAgICAgICAgaWYgKCFjYkFyZ3MgfHwgIWNiQXJncy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2JBcmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGNiQXJnc1tpXTtcclxuICAgICAgICAgICAgbGV0IGFyZ1N0ciA9IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGFyZyBpbnN0YW5jZW9mIFN0cmluZyA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZyk7XHJcbiAgICAgICAgICAgIHJwQXJncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGtleTogYGFyZyR7aX1gLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFyZ1N0clxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJwQXJncztcclxuICAgIH0qL1xyXG4gICAgX2dldFN0ZXBOYW1lKHN0ZXApIHtcclxuICAgICAgICBsZXQgbmFtZTtcclxuXHJcbiAgICAgICAgaWYgKHN0ZXAubmFtZSA9PT0gJ3RyYW5zYWN0aW9uJyAmJiBzdGVwLmFyZ3MubGVuZ3RoID4gMCkgeyAgLy8gRklYTUU6IHN0ZXBzIG5lZWQgdG8gYmUgbmVzdGVkIHVuZGVyIHRyYW5zYWN0aW9uc1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5hcmdzWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdGVwLnNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5zaWduYXR1cmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0ZXAubW9kdWxlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGlzIGV2ZXIgcmVhY2hlZD8gXCJzdGVwLnNpZ25hdHVyZVwiIHNlZW1zIHRvIGFsd2F5cyBleGlzdFxyXG4gICAgICAgICAgICBuYW1lID0gYCR7c3RlcC5tb2R1bGV9LiR7c3RlcC5uYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBuYW1lID0gc3RlcC5uYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4aW11bSBhbGxvd2VkIG5hbWUgbGVuZ3RoIGluIFJQIGlzIDEwMjQgYnl0ZXNcclxuICAgICAgICAvLyB3ZSB0cnVuY2F0ZSBpdCBldmVuIGxvd2VyIHNvIGl0IHdpbGwgZGlzcGxheSBuaWNlbHlcclxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPiBNQVhfTkFNRV9MRU5HVEgpIHtcclxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSC0zKSArICcuLi4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm5zIG51bGwgaWYgbXNnIGNhbm5vdCBiZSBzdHJpbmdpZmllZCwgb3Igc3RyaWdpZmllcyBpdCBpZiBpdCdzIG5vdCBhIHN0cmluZyBhbHJlYWR5XHJcbiAgICBfc3RyaW5naWZ5KG1zZykge1xyXG4gICAgICAgIC8vIHdlIHRlc3QgZm9yIHVuZGVmaW5lZCBhbmQgbnVsbCBleHBsaWNpdGx5IG9uIHB1cnBvc2UgYmVjYXVzZSBvdGhlciBmYWxzeSB2YWx1ZXMgKGUuZy4gMCkgYXJlIG9rXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICd1bmRlZmluZWQnIHx8IG1zZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJyB8fCBtc2cgaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1zZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUlAgLSBlcnJvciBzZW5kaW5nIGxvZzogbXNnIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSwgdGltZW91dCA9IDEwICogMTAwMCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBQcm9taXNlIGF3YWl0IHRpbWVvdXQgb2YgJHt0aW1lb3V0fSBtc2ApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChyZWplY3QsIHRpbWVvdXQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=
|
|
534
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAuanMiXSwibmFtZXMiOlsiUlBDbGllbnQiLCJyZXF1aXJlIiwiTEFVTkNIX01PREVTIiwiREVGQVVMVCIsIkRFQlVHIiwiVEVTVF9JVEVNX1RZUEVTIiwiU1VJVEUiLCJURVNUIiwiU1RFUCIsIk1BWF9OQU1FX0xFTkdUSCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVwb3J0ZXJPcHRzIiwiYWdncmVnYXRvciIsInJwIiwicmVwb3J0U3RlcHMiLCJyZXBvcnRMb2dzIiwiY2JTdWl0ZVRvUnBJZEhhc2giLCJjYkNhc2VUb1JwSWRIYXNoIiwiY2JTdGVwVG9ScElkSGFzaCIsImNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZCIsImN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCIsInVuZGVmaW5lZCIsImN1cnJlbnRTdWJTdGVwSWQiLCJhcGlLZXkiLCJlbmRwb2ludCIsInByb2plY3QiLCJFcnJvciIsInJwQ2xpZW50IiwibGF1bmNoIiwibmFtZSIsImluaXQiLCJjaGVja0Nvbm5lY3QiLCJlIiwibWVzc2FnZSIsImdlbmVyYXRlIiwicmVzdWx0cyIsIm9uTGF1bmNoU3RhcnQiLCJ0ZW1wSWQiLCJwcm9taXNlIiwic3RhcnRMYXVuY2giLCJtb2RlIiwiZGVidWciLCJ0ZW1wTGF1bmNoSWQiLCJ0aGVuIiwicmVzcG9uc2UiLCJlcnJvciIsImNvbnNvbGUiLCJkaXIiLCJvbkxhdW5jaEVuZCIsIl9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMiLCJoYXNGYWlsZWQiLCJzb21lIiwieCIsInN0YXR1cyIsIlN0YXR1cyIsIkZBSUxFRCIsImZpbmlzaExhdW5jaCIsInByb21pc2VXaXRoVGltZW91dCIsIm9uUnVubmVyU3RhcnQiLCJyaWQiLCJvcHRzIiwiY2FwcyIsIm9uUnVubmVyRW5kIiwicmVzdWx0Iiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwic3VpdGVEZWYiLCJzdWl0ZVJlZklkIiwicmVmSWQiLCJzdGFydFRlc3RJdGVtUmVxIiwidHlwZSIsInN0YXJ0VGVzdEl0ZW0iLCJvblN1aXRlRW5kIiwicHVzaCIsIm9uQ2FzZVN0YXJ0IiwiY2FzZUlkIiwiY2FzZURlZiIsImNvZGVSZWYiLCJwYXRoIiwicnBTdWl0ZUlkIiwib25DYXNlRW5kIiwicnBUZXN0SWQiLCJ0b0xvd2VyQ2FzZSIsImZhaWx1cmUiLCJycEZpbGUiLCJzY3JlZW5zaG90IiwiY29udGVudCIsImxvZ01zZyIsIl9zdHJpbmdpZnkiLCJsb2dSZXEiLCJsZXZlbCIsInNlbmRMb2ciLCJmaW5pc2hUZXN0SXRlbVJlcSIsImZpbmlzaFRlc3RJdGVtIiwib25TdGVwU3RhcnQiLCJzdGVwIiwibW9kdWxlIiwicmVwb3J0TG9nU3RlcCIsInJwQ2FzZUlkIiwicnBQYXJlbnRJZCIsImlkIiwic3RlcE5hbWUiLCJfZ2V0U3RlcE5hbWUiLCJsb2NhdGlvbiIsInRlc3RDYXNlSWQiLCJoYXNTdGF0cyIsIm9uU3RlcEVuZCIsInN0YXJ0c1dpdGgiLCJycFN0ZXBJZCIsImZpbGUiLCJvbkxvZyIsInN0ZXBJZCIsIm1zZyIsInRpbWUiLCJzcmMiLCJycExldmVsIiwiX2dldFJwTGV2ZWwiLCJhcmdzIiwibGVuZ3RoIiwic2VuZFJwTG9nIiwiT2JqZWN0Iiwia2V5cyIsImhhc0ZhaWxlZFN1aXRlIiwib3hMZXZlbCIsInNpZ25hdHVyZSIsInN1YnN0cmluZyIsIlN0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aW1lb3V0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7OztBQUNBLE1BQU1BLFFBQVEsR0FBR0MsT0FBTyxDQUFDLGdDQUFELENBQXhCOztBQUNBLE1BQU1DLFlBQVksR0FBRztBQUNqQkMsRUFBQUEsT0FBTyxFQUFFLFNBRFE7QUFFakJDLEVBQUFBLEtBQUssRUFB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QUdBLElBQUksQ0FBQ2lHLFNBQUwsQ0FBZSxDQUFmLEVBQWtCeEgsZUFBZSxHQUFDLENBQWxDLElBQXVDLEtBQTlDO0FBQ0g7O0FBQ0QsV0FBT3VCLElBQVA7QUFDSDs7QUFHRDRELEVBQUFBLFVBQVUsQ0FBQ3dCLEdBQUQsRUFBTTtBQUVaLFFBQUksT0FBT0EsR0FBUCxLQUFlLFdBQWYsSUFBOEJBLEdBQUcsS0FBSyxJQUExQyxFQUFnRDtBQUM1QyxhQUFPLElBQVA7QUFDSDs7QUFFRCxRQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFmLElBQTJCQSxHQUFHLFlBQVljLE1BQTlDLEVBQXNEO0FBQ2xELGFBQU9kLEdBQVA7QUFDSDs7QUFFRCxRQUFJO0FBQ0EsYUFBT2UsSUFBSSxDQUFDQyxTQUFMLENBQWVoQixHQUFmLENBQVA7QUFDSCxLQUZELENBRUUsT0FBT2pGLENBQVAsRUFBVTtBQUNSYyxNQUFBQSxPQUFPLENBQUNELEtBQVIsQ0FBYyx5REFBZDtBQUNIO0FBQ0o7O0FBRURZLEVBQUFBLGtCQUFrQixDQUFDbkIsT0FBRCxFQUFVNEYsT0FBTyxHQUFHLEtBQUssSUFBekIsRUFBK0I7QUFDN0MsV0FBTyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3BDLFVBQUksQ0FBQy9GLE9BQUQsSUFBWSxDQUFDQSxPQUFPLENBQUNLLElBQXpCLEVBQStCO0FBQzNCMEYsUUFBQUEsTUFBTSxDQUFDLElBQUkzRyxLQUFKLENBQVcsNEJBQTJCd0csT0FBUSxLQUE5QyxDQUFELENBQU47QUFDSDs7QUFDRDVGLE1BQUFBLE9BQU8sQ0FBQ0ssSUFBUixDQUFheUYsT0FBYixFQUFzQkMsTUFBdEI7QUFDQUMsTUFBQUEsVUFBVSxDQUFDRCxNQUFELEVBQVNILE9BQVQsQ0FBVjtBQUNILEtBTk0sQ0FBUDtBQU9IOztBQWphMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qXHJcbiAqIE94eWdlbiBSZXBvcnRlciBmb3IgUmVwb3J0UG9ydGFsXHJcbiAqL1xyXG5pbXBvcnQgUmVwb3J0ZXJCYXNlIGZyb20gJy4uL3JlcG9ydGVyL1JlcG9ydGVyQmFzZSc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcclxuY29uc3QgUlBDbGllbnQgPSByZXF1aXJlKCdAb3h5Z2VuaHEvcnAtY2xpZW50LWphdmFzY3JpcHQnKTtcclxuY29uc3QgTEFVTkNIX01PREVTID0ge1xyXG4gICAgREVGQVVMVDogJ0RFRkFVTFQnLFxyXG4gICAgREVCVUc6ICdERUJVRycsXHJcbn07XHJcbmNvbnN0IFRFU1RfSVRFTV9UWVBFUyA9IHtcclxuICAgIFNVSVRFOiAnU1VJVEUnLFxyXG4gICAgVEVTVDogJ1RFU1QnLFxyXG4gICAgU1RFUDogJ1NURVAnLFxyXG59O1xyXG5jb25zdCBNQVhfTkFNRV9MRU5HVEggPSAxMjg7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRQb3J0YWxSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCByZXBvcnRlck9wdHMsIGFnZ3JlZ2F0b3IpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVyT3B0cyA9IHJlcG9ydGVyT3B0cyB8fCBvcHRpb25zLnJwO1xyXG4gICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRlck9wdHMucmVwb3J0U3RlcHMgfHwgdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlcG9ydExvZ3MgPSByZXBvcnRlck9wdHMucmVwb3J0TG9ncyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYkNhc2VUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWQgPSB7fTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLmFwaUtleVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5yZXBvcnRlck9wdHMuZW5kcG9pbnRcclxuICAgICAgICAgICAgfHwgIXRoaXMucmVwb3J0ZXJPcHRzLnByb2plY3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvcnRQb3J0YWwgb3B0aW9ucyBhcmUgbWlzc2luZyBpbiBveHlnZW4uY29uZiBmaWxlLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yO1xyXG4gICAgICAgIHRoaXMucnBDbGllbnQgPSBuZXcgUlBDbGllbnQoe1xyXG4gICAgICAgICAgICBsYXVuY2g6IHRoaXMucmVwb3J0ZXJPcHRzLmxhdW5jaCB8fCB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgICAgICAgLi4udGhpcy5yZXBvcnRlck9wdHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnBDbGllbnQuY2hlY2tDb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUlAgLSBFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgIH1cclxuICAgIC8vIEV2ZW50c1xyXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydCh7IG9wdGlvbnMgfSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcElkLCBwcm9taXNlIH0gPSB0aGlzLnJwQ2xpZW50LnN0YXJ0TGF1bmNoKHtcclxuICAgICAgICAgICAgbW9kZTogdGhpcy5yZXBvcnRlck9wdHMubW9kZSB8fCBMQVVOQ0hfTU9ERVMuREVGQVVMVCxcclxuICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudGVtcExhdW5jaElkID0gdGVtcElkO1xyXG4gICAgICAgIHByb21pc2UudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRXJyb3IgYXQgdGhlIHN0YXJ0IG9mIGxhdW5jaDogJHtlcnJvcn1gKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uTGF1bmNoRW5kKHsgcmVzdWx0cyB9KSB7XHJcbiAgICAgICAgLy8gcmVwb3J0IHRoZSBlbmQgb2YgYWxsIHN0YXJ0ZWQgc3VpdGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0RW5kT2ZTdGFydGVkU3VpdGVzKCk7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdW5jaCBzdGF0dXNcclxuICAgICAgICBjb25zdCBoYXNGYWlsZWQgPSByZXN1bHRzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgY29uc3QgeyBwcm9taXNlIH0gPSBhd2FpdCB0aGlzLnJwQ2xpZW50LmZpbmlzaExhdW5jaCh0aGlzLnRlbXBMYXVuY2hJZCwge1xyXG4gICAgICAgICAgICBzdGF0dXM6IGhhc0ZhaWxlZCA/ICdGQUlMRUQnIDogJ1BBU1NFRCdcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGVuZCBsYXVuY2g6ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHsgcmlkLCBvcHRzLCBjYXBzIH0pIHtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHsgcmlkLCByZXN1bHQgfSkge1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TdWl0ZVN0YXJ0KHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZTogc3VpdGVEZWYgfSkge1xyXG4gICAgICAgIC8vIGluIHBhcmFsbGVsIHRlc3QgZXhlY3V0aW9uLCBvblN1aXRlU3RhcnQgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHN1aXRlIFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYWxsIFwic3RhcnRUZXN0SXRlbVwiIHRoZSBzYW1lIHN1aXRlIG9ubHkgb25jZVxyXG4gICAgICAgIGNvbnN0IHN1aXRlUmVmSWQgPSBzdWl0ZURlZi5yZWZJZDtcclxuICAgICAgICBpZiAodGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZVJlZklkXSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFzc2lnbiBlbXB0eSBvYmplY3QgYXMgYSBmb3JtIG9mIG11bHRpLXRocmVhZCBsb2NrLFxyXG4gICAgICAgIC8vIHNvIHRoZSBwYXJhbGxlbCBjYWxsIHRvIG9uU3VpdGVTdGFydCBmcm9tIHRoZSBuZXh0IHRocmVhZFxyXG4gICAgICAgIC8vIHdpbGwgbm90IHRyeSB0byBwcm9jZWVkIHdpdGggdGhlIGNvZGUgYmVsb3dcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0ge307XHJcbiAgICAgICAgdGhpcy5jYlN1aXRlUmVzdWx0TGlzdEJ5UmVmSWRbc3VpdGVSZWZJZF0gPSBbXTtcclxuICAgICAgICBjb25zdCBzdGFydFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBzdWl0ZURlZi5uYW1lIHx8IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1VJVEUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkKTtcclxuICAgICAgICB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlUmVmSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgc3VpdGUgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQoeyByaWQsIHN1aXRlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3Qgc3VpdGVSZWZJZCA9IHJlc3VsdC5yZWZJZDtcclxuICAgICAgICB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXSAmJiB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXS5wdXNoKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkNhc2VTdGFydCh7IHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCAnY2FzZSc6IGNhc2VEZWYgfSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGNhc2VEZWYubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogVEVTVF9JVEVNX1RZUEVTLlRFU1QsXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IGNhc2VEZWYucGF0aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgaWYgKCFycFN1aXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFN1aXRlSWQpO1xyXG4gICAgICAgIHRoaXMuY2JDYXNlVG9ScElkSGFzaFtjYXNlSWRdID0gdGVtcElkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc3RhcnQgdGVzdCBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHsgcmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsIHJlc3VsdCB9KSB7XHJcbiAgICAgICAgY29uc3QgcnBUZXN0SWQgPSB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXTtcclxuICAgICAgICBpZiAoIXJwVGVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnICYmIHJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwRmlsZSA9IHJlc3VsdC5zY3JlZW5zaG90ID9cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NjcmVlbnNob3QnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuc2NyZWVuc2hvdCxcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShyZXN1bHQuZmFpbHVyZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvZ01zZyxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwVGVzdElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFRlc3RJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN0ZXBTdGFydCh7IHJpZCwgY2FzZUlkLCBzdGVwIH0pIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVwb3J0U3RlcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RlcC5tb2R1bGUgJiYgc3RlcC5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwQ2FzZUlkID0gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF07XHJcbiAgICAgICAgbGV0IHJwUGFyZW50SWQ7XHJcblxyXG4gICAgICAgIGlmIChzdGVwLm5hbWUgPT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25TdGVwSWQgPSBzdGVwLmlkO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSBycENhc2VJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN1YlN0ZXBJZCA9IHN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIHJwUGFyZW50SWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZCA/IHRoaXMuY2JTdGVwVG9ScElkSGFzaFt0aGlzLmN1cnJlbnRUcmFuc2FjdGlvblN0ZXBJZF0gOiBycENhc2VJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcnBQYXJlbnRJZCB8fCAhcnBDYXNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMuX2dldFN0ZXBOYW1lKHN0ZXApO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGVzdEl0ZW1SZXEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN0ZXBOYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiBURVNUX0lURU1fVFlQRVMuU1RFUCxcclxuICAgICAgICAgICAgLy8gXCJjb2RlUmVmXCIgKyBcInBhcmFtZXRlcnNcIiB1c2VkIGJ5IFJQIGxpYiB0byBnZW5lcmF0ZSB0ZXN0Q2FzZUlkIGlmIHRlc3RDYXNlSWQgaXMgbm90IGRlZmluZWRcclxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXBvcnRwb3J0YWwvY2xpZW50LWphdmFzY3JpcHQvYmxvYi80ODZlZjcwYzYzOGE5YTIzMjY3MjkwYzYyZGYxZmFmOTAwZjdkZjZhL2xpYi9yZXBvcnQtcG9ydGFsLWNsaWVudC5qcyNMNDk3XHJcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgZGlzYWJsZWQgZm9yIG5vdy4gbm90IHN1cmUgaWYgYWN0dWFsbHkgbmVlZGVkLi4uXHJcbiAgICAgICAgICAgIC8vcGFyYW1ldGVyczogdGhpcy5fZ2V0UnBBcmdzKHN0ZXAuYXJncyksXHJcbiAgICAgICAgICAgIGNvZGVSZWY6IHN0ZXAubG9jYXRpb24sXHJcbiAgICAgICAgICAgIHRlc3RDYXNlSWQ6IHJwQ2FzZUlkLFxyXG4gICAgICAgICAgICBoYXNTdGF0czogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB7IHRlbXBJZCwgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zdGFydFRlc3RJdGVtKHN0YXJ0VGVzdEl0ZW1SZXEsIHRoaXMudGVtcExhdW5jaElkLCBycFBhcmVudElkKTtcclxuICAgICAgICB0aGlzLmNiU3RlcFRvUnBJZEhhc2hbc3RlcC5pZF0gPSB0ZW1wSWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBzdGFydCBzdGVwIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblN0ZXBFbmQoeyByaWQsIHN0ZXA6IHJlc3VsdCB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydFN0ZXBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5uYW1lICYmIHJlc3VsdC5uYW1lLnN0YXJ0c1dpdGgoJ2xvZy4nKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJwU3RlcElkID0gdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3Jlc3VsdC5pZF07XHJcbiAgICAgICAgaWYgKCFycFN0ZXBJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQubmFtZSAhPT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJTdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBjb25zdCBycEZpbGUgPSByZXN1bHQuc2NyZWVuc2hvdCA/XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzY3JlZW5zaG90JyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogcmVzdWx0LnNjcmVlbnNob3QsXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2dNc2cgPSB0aGlzLl9zdHJpbmdpZnkocmVzdWx0LmZhaWx1cmUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ1JlcSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogcnBGaWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwU3RlcElkLCBsb2dSZXEsIHJwRmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gc2VuZCBsb2cgZm9yIGZpbmlzaGVkIHRlc3QgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbmlzaFRlc3RJdGVtUmVxID0ge1xyXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5maW5pc2hUZXN0SXRlbShycFN0ZXBJZCwgZmluaXNoVGVzdEl0ZW1SZXEpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvbWlzZVdpdGhUaW1lb3V0KHByb21pc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihgUlAgLSBGYWlsZWQgdG8gZmluaXNoIHN0ZXAgaXRlbTogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uTG9nKHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUsIHNyYyB9KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlcG9ydExvZ3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPeHlnZW4gbWlnaHQgc3RhcnQgZ2VuZXJhdGluZyBsb2dzIGJlZm9yZSBvblJ1bm5lclN0YXJ0IGV2ZW50LCBpZ25vcmUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy50ZW1wTGF1bmNoSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycFBhcmVudElkID0gc3RlcElkID9cclxuICAgICAgICAgICAgdGhpcy5jYlN0ZXBUb1JwSWRIYXNoW3N0ZXBJZF1cclxuICAgICAgICAgICAgOiBjYXNlSWQgPyB0aGlzLmNiQ2FzZVRvUnBJZEhhc2hbY2FzZUlkXVxyXG4gICAgICAgICAgICA6IHN1aXRlSWQgPyB0aGlzLmNiU3VpdGVUb1JwSWRIYXNoW3N1aXRlSWRdXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJwTGV2ZWwgPSB0aGlzLl9nZXRScExldmVsKGxldmVsKTtcclxuXHJcbiAgICAgICAgY29uc3QgbG9nTXNnID0gdGhpcy5fc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgaWYgKGxvZ01zZykge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dSZXEgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBsb2dNc2csXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogcnBMZXZlbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvbWlzZSB9ID0gdGhpcy5ycENsaWVudC5zZW5kTG9nKHJwUGFyZW50SWQgfHwgdGhpcy50ZW1wTGF1bmNoSWQsIGxvZ1JlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGNyZWF0ZSBsb2cgaXRlbTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVwb3J0TG9nU3RlcChjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICBpZiAoIXN0ZXAuYXJncyB8fCAhc3RlcC5hcmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxldmVsID0gc3RlcC5uYW1lO1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IHN0ZXAuYXJnc1swXTtcclxuICAgICAgICBjb25zdCB0aW1lID0gc3RlcC50aW1lO1xyXG4gICAgICAgIGxldCBzdGVwSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN1YlN0ZXBJZCkge1xyXG4gICAgICAgICAgICBzdGVwSWQgPSB0aGlzLmN1cnJlbnRTdWJTdGVwSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkKSB7XHJcbiAgICAgICAgICAgIHN0ZXBJZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uU3RlcElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRScExvZyh7IHN1aXRlSWQ6IHVuZGVmaW5lZCwgY2FzZUlkLCBzdGVwSWQsIGxldmVsLCBtc2csIHRpbWUgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzZW5kUnBMb2coeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCwgbGV2ZWwsIG1zZywgdGltZSB9KSB7XHJcbiAgICAgICAgLy8gT3h5Z2VuIG1pZ2h0IHN0YXJ0IGdlbmVyYXRpbmcgbG9ncyBiZWZvcmUgb25SdW5uZXJTdGFydCBldmVudCwgaWdub3JlIHRoZW1cclxuICAgICAgICBpZiAoIXRoaXMudGVtcExhdW5jaElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnBQYXJlbnRJZCA9IHN0ZXBJZCA/XHJcbiAgICAgICAgICAgIHRoaXMuY2JTdGVwVG9ScElkSGFzaFtzdGVwSWRdXHJcbiAgICAgICAgICAgIDogY2FzZUlkID8gdGhpcy5jYkNhc2VUb1JwSWRIYXNoW2Nhc2VJZF1cclxuICAgICAgICAgICAgOiBzdWl0ZUlkID8gdGhpcy5jYlN1aXRlVG9ScElkSGFzaFtzdWl0ZUlkXVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBycExldmVsID0gdGhpcy5fZ2V0UnBMZXZlbChsZXZlbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxvZ01zZyA9IHRoaXMuX3N0cmluZ2lmeShtc2cpO1xyXG4gICAgICAgIGlmIChsb2dNc2cpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nUmVxID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbG9nTXNnLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IHJwTGV2ZWwsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuc2VuZExvZyhycFBhcmVudElkIHx8IHRoaXMudGVtcExhdW5jaElkLCBsb2dSZXEpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGBSUCAtIEZhaWxlZCB0byBjcmVhdGUgbG9nIGl0ZW06ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9yZXBvcnRFbmRPZlN0YXJ0ZWRTdWl0ZXMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBzdWl0ZVJlZklkIG9mIE9iamVjdC5rZXlzKHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2gpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJwU3VpdGVJZCA9IHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmNiU3VpdGVSZXN1bHRMaXN0QnlSZWZJZFtzdWl0ZVJlZklkXTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2JTdWl0ZVRvUnBJZEhhc2hbc3VpdGVSZWZJZF07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlID0gcmVzdWx0cy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2hUZXN0SXRlbVJlcSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogaGFzRmFpbGVkU3VpdGUgPyAnZmFpbGVkJyA6ICdwYXNzZWQnLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB7IHByb21pc2UgfSA9IHRoaXMucnBDbGllbnQuZmluaXNoVGVzdEl0ZW0ocnBTdWl0ZUlkLCBmaW5pc2hUZXN0SXRlbVJlcSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb21pc2VXaXRoVGltZW91dChwcm9taXNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIoYFJQIC0gRmFpbGVkIHRvIGZpbmlzaCBzdWl0ZSBpdGVtOiAke2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfZ2V0UnBMZXZlbChveExldmVsKSB7XHJcbiAgICAgICAgaWYgKG94TGV2ZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG94TGV2ZWwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdpbmZvJztcclxuICAgIH1cclxuICAgIC8qX2dldFJwQXJncyhjYkFyZ3MpIHtcclxuICAgICAgICBpZiAoIWNiQXJncyB8fCAhY2JBcmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBycEFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjYkFyZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYXJnID0gY2JBcmdzW2ldO1xyXG4gICAgICAgICAgICBsZXQgYXJnU3RyID0gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgYXJnIGluc3RhbmNlb2YgU3RyaW5nID8gYXJnIDogSlNPTi5zdHJpbmdpZnkoYXJnKTtcclxuICAgICAgICAgICAgcnBBcmdzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAga2V5OiBgYXJnJHtpfWAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYXJnU3RyXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcnBBcmdzO1xyXG4gICAgfSovXHJcbiAgICBfZ2V0U3RlcE5hbWUoc3RlcCkge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG5cclxuICAgICAgICBpZiAoc3RlcC5uYW1lID09PSAndHJhbnNhY3Rpb24nICYmIHN0ZXAuYXJncy5sZW5ndGggPiAwKSB7ICAvLyBGSVhNRTogc3RlcHMgbmVlZCB0byBiZSBuZXN0ZWQgdW5kZXIgdHJhbnNhY3Rpb25zXHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLmFyZ3NbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0ZXAuc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLnNpZ25hdHVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RlcC5tb2R1bGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoaXMgZXZlciByZWFjaGVkPyBcInN0ZXAuc2lnbmF0dXJlXCIgc2VlbXMgdG8gYWx3YXlzIGV4aXN0XHJcbiAgICAgICAgICAgIG5hbWUgPSBgJHtzdGVwLm1vZHVsZX0uJHtzdGVwLm5hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBzdGVwLm5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtYXhpbXVtIGFsbG93ZWQgbmFtZSBsZW5ndGggaW4gUlAgaXMgMTAyNCBieXRlc1xyXG4gICAgICAgIC8vIHdlIHRydW5jYXRlIGl0IGV2ZW4gbG93ZXIgc28gaXQgd2lsbCBkaXNwbGF5IG5pY2VseVxyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IE1BWF9OQU1FX0xFTkdUSCkge1xyXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgTUFYX05BTUVfTEVOR1RILTMpICsgJy4uLic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJldHVybnMgbnVsbCBpZiBtc2cgY2Fubm90IGJlIHN0cmluZ2lmaWVkLCBvciBzdHJpZ2lmaWVzIGl0IGlmIGl0J3Mgbm90IGEgc3RyaW5nIGFscmVhZHlcclxuICAgIF9zdHJpbmdpZnkobXNnKSB7XHJcbiAgICAgICAgLy8gd2UgdGVzdCBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIGV4cGxpY2l0bHkgb24gcHVycG9zZSBiZWNhdXNlIG90aGVyIGZhbHN5IHZhbHVlcyAoZS5nLiAwKSBhcmUgb2tcclxuICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcgfHwgbXNnID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnIHx8IG1zZyBpbnN0YW5jZW9mIFN0cmluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbXNnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1zZyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSUCAtIGVycm9yIHNlbmRpbmcgbG9nOiBtc2cgb2JqZWN0IGNhbm5vdCBiZSBzZXJpYWxpemVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb21pc2VXaXRoVGltZW91dChwcm9taXNlLCB0aW1lb3V0ID0gMTAgKiAxMDAwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFwcm9taXNlIHx8ICFwcm9taXNlLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFByb21pc2UgYXdhaXQgdGltZW91dCBvZiAke3RpbWVvdXR9IG1zYCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb21pc2UudGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlamVjdCwgdGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|