oxygen-cli 1.22.0 → 1.99.0-alpha.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 +0 -50
- package/build/core/OxygenCore.js +56 -145
- package/build/errors/OxygenError.js +5 -15
- package/build/errors/helper.js +45 -49
- package/build/index.js +14 -6
- package/build/lib/cli-util.js +19 -19
- package/build/lib/cli.js +4 -2
- package/build/lib/parallel-launcher.js +333 -0
- package/build/lib/param-manager.js +66 -47
- package/build/lib/util.js +38 -9
- package/build/ox_modules/index.js +1 -97
- package/build/ox_modules/module-assert.js +19 -9
- package/build/ox_modules/module-dns.js +220 -0
- package/build/ox_modules/module-http.js +39 -51
- package/build/ox_modules/module-shell.js +19 -75
- package/build/ox_modules/module-utils.js +1 -108
- package/build/ox_modules/utils.js +1 -357
- package/build/reporter/FileReporterBase.js +5 -5
- package/build/reporter/ReportAggregator.js +127 -4
- package/build/runners/WorkerProcess.js +15 -28
- package/build/runners/index.js +2 -6
- package/build/runners/oxygen/OxygenWorker.js +8 -8
- package/build/runners/oxygen/index.js +17 -18
- package/build/runners/oxygen/worker.js +10 -8
- package/package.json +12 -46
- package/build/lib/img-merge.js +0 -163
- package/build/ox_modules/module-db.js +0 -146
- package/build/ox_modules/module-email.js +0 -212
- package/build/ox_modules/module-eyes.js +0 -189
- package/build/ox_modules/module-mailinator.js +0 -207
- package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
- package/build/ox_modules/module-mob/commands/assertText.js +0 -45
- package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
- package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
- package/build/ox_modules/module-mob/commands/back.js +0 -27
- package/build/ox_modules/module-mob/commands/clear.js +0 -40
- package/build/ox_modules/module-mob/commands/click.js +0 -35
- package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
- package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
- package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
- package/build/ox_modules/module-mob/commands/debug.js +0 -26
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
- package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
- package/build/ox_modules/module-mob/commands/execute.js +0 -32
- package/build/ox_modules/module-mob/commands/findElement.js +0 -36
- package/build/ox_modules/module-mob/commands/findElements.js +0 -39
- package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
- package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
- package/build/ox_modules/module-mob/commands/getSource.js +0 -26
- package/build/ox_modules/module-mob/commands/getText.js +0 -36
- package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
- package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
- package/build/ox_modules/module-mob/commands/getValue.js +0 -50
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
- package/build/ox_modules/module-mob/commands/index.js +0 -594
- package/build/ox_modules/module-mob/commands/installApp.js +0 -28
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
- package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
- package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
- package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
- package/build/ox_modules/module-mob/commands/isExist.js +0 -36
- package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
- package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
- package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
- package/build/ox_modules/module-mob/commands/open.js +0 -43
- package/build/ox_modules/module-mob/commands/pause.js +0 -27
- package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
- package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
- package/build/ox_modules/module-mob/commands/select.js +0 -54
- package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
- package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
- package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
- package/build/ox_modules/module-mob/commands/setContext.js +0 -28
- package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
- package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
- package/build/ox_modules/module-mob/commands/shake.js +0 -27
- package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
- package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
- package/build/ox_modules/module-mob/commands/swipe.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
- package/build/ox_modules/module-mob/commands/tap.js +0 -34
- package/build/ox_modules/module-mob/commands/type.js +0 -67
- package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
- package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
- package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-mob.js +0 -699
- package/build/ox_modules/module-pdf.js +0 -328
- package/build/ox_modules/module-proxy.js +0 -324
- package/build/ox_modules/module-serial.js +0 -187
- package/build/ox_modules/module-soap.js +0 -260
- package/build/ox_modules/module-twilio.js +0 -192
- package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
- package/build/ox_modules/module-web/commands/assertExist.js +0 -28
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
- package/build/ox_modules/module-web/commands/assertText.js +0 -45
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
- package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
- package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
- package/build/ox_modules/module-web/commands/assertValue.js +0 -44
- package/build/ox_modules/module-web/commands/back.js +0 -27
- package/build/ox_modules/module-web/commands/clear.js +0 -41
- package/build/ox_modules/module-web/commands/click.js +0 -112
- package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
- package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
- package/build/ox_modules/module-web/commands/debug.js +0 -25
- package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
- package/build/ox_modules/module-web/commands/deselect.js +0 -34
- package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
- package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
- package/build/ox_modules/module-web/commands/execute.js +0 -36
- package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
- package/build/ox_modules/module-web/commands/findElement.js +0 -35
- package/build/ox_modules/module-web/commands/findElements.js +0 -38
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
- package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
- package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
- package/build/ox_modules/module-web/commands/getCookies.js +0 -23
- package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
- package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
- package/build/ox_modules/module-web/commands/getHTML.js +0 -30
- package/build/ox_modules/module-web/commands/getSource.js +0 -26
- package/build/ox_modules/module-web/commands/getText.js +0 -36
- package/build/ox_modules/module-web/commands/getTitle.js +0 -22
- package/build/ox_modules/module-web/commands/getUrl.js +0 -26
- package/build/ox_modules/module-web/commands/getValue.js +0 -43
- package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
- package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
- package/build/ox_modules/module-web/commands/index.js +0 -634
- package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
- package/build/ox_modules/module-web/commands/isChecked.js +0 -30
- package/build/ox_modules/module-web/commands/isExist.js +0 -36
- package/build/ox_modules/module-web/commands/isSelected.js +0 -35
- package/build/ox_modules/module-web/commands/isVisible.js +0 -36
- package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
- package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/newWindow.js +0 -27
- package/build/ox_modules/module-web/commands/open.js +0 -42
- package/build/ox_modules/module-web/commands/pause.js +0 -26
- package/build/ox_modules/module-web/commands/point.js +0 -37
- package/build/ox_modules/module-web/commands/pointJS.js +0 -56
- package/build/ox_modules/module-web/commands/refresh.js +0 -26
- package/build/ox_modules/module-web/commands/rightClick.js +0 -61
- package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
- package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
- package/build/ox_modules/module-web/commands/select.js +0 -55
- package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
- package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
- package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
- package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
- package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
- package/build/ox_modules/module-web/commands/type.js +0 -52
- package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
- package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
- package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
- package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
- package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
- package/build/ox_modules/module-web.js +0 -909
- package/build/ox_modules/module-win/commands/assertText.js +0 -41
- package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
- package/build/ox_modules/module-win/commands/assertValue.js +0 -62
- package/build/ox_modules/module-win/commands/back.js +0 -21
- package/build/ox_modules/module-win/commands/clear.js +0 -34
- package/build/ox_modules/module-win/commands/click.js +0 -25
- package/build/ox_modules/module-win/commands/clickLong.js +0 -30
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
- package/build/ox_modules/module-win/commands/findElement.js +0 -31
- package/build/ox_modules/module-win/commands/findElements.js +0 -31
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
- package/build/ox_modules/module-win/commands/getLocation.js +0 -26
- package/build/ox_modules/module-win/commands/getSource.js +0 -22
- package/build/ox_modules/module-win/commands/getText.js +0 -32
- package/build/ox_modules/module-win/commands/getValue.js +0 -46
- package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
- package/build/ox_modules/module-win/commands/index.js +0 -298
- package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
- package/build/ox_modules/module-win/commands/isChecked.js +0 -26
- package/build/ox_modules/module-win/commands/isClickable.js +0 -26
- package/build/ox_modules/module-win/commands/isExist.js +0 -32
- package/build/ox_modules/module-win/commands/isSelected.js +0 -26
- package/build/ox_modules/module-win/commands/isVisible.js +0 -32
- package/build/ox_modules/module-win/commands/open.js +0 -24
- package/build/ox_modules/module-win/commands/pause.js +0 -23
- package/build/ox_modules/module-win/commands/rightClick.js +0 -30
- package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
- package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
- package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
- package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
- package/build/ox_modules/module-win/commands/tap.js +0 -29
- package/build/ox_modules/module-win/commands/type.js +0 -38
- package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
- package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
- package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
- package/build/ox_modules/module-win.js +0 -367
- package/build/ox_services/service-devtools/submodule-network.js +0 -338
- package/build/ox_services/service-devtools.js +0 -83
- package/build/runners/cucumber/CucumberEventListener.js +0 -181
- package/build/runners/cucumber/CucumberReporter.js +0 -277
- package/build/runners/cucumber/CucumberWorker.js +0 -337
- package/build/runners/cucumber/index.js +0 -159
- package/build/runners/cucumber/worker.js +0 -184
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
|
|
10
|
+
var Runners = _interopRequireWildcard(require("../runners"));
|
|
11
|
+
|
|
12
|
+
var _parallelLimit = _interopRequireDefault(require("async/parallelLimit"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
17
|
+
|
|
18
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
19
|
+
|
|
20
|
+
var Duration = require('duration');
|
|
21
|
+
|
|
22
|
+
const PARALLEL_COUNT = 50;
|
|
23
|
+
|
|
24
|
+
class ParallelLauncher {
|
|
25
|
+
constructor(config, reporter) {
|
|
26
|
+
this._config = config;
|
|
27
|
+
this.reporter = reporter;
|
|
28
|
+
this._queue = null;
|
|
29
|
+
this._activeThreads = 0;
|
|
30
|
+
this.runners = [];
|
|
31
|
+
this.createdRunnersStat = [];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async run(capsSet) {
|
|
35
|
+
const collection = [];
|
|
36
|
+
|
|
37
|
+
if (!this._config.parallel) {
|
|
38
|
+
throw new Error('Cannot start the parallel testing - "parallel" settings are missing.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const concurrency = !isNaN(this._config.parallel.concurrency) ? this._config.parallel.concurrency : 1;
|
|
42
|
+
const suites = this._config.suites;
|
|
43
|
+
|
|
44
|
+
if (!suites || !Array.isArray(suites)) {
|
|
45
|
+
throw new Error('Cannot start the parallel testing - no suites are defined.');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let workersConfig = [];
|
|
49
|
+
const testCaps = capsSet ? Array.isArray(capsSet) ? capsSet[0] : capsSet : null;
|
|
50
|
+
let suiteIndex = 0;
|
|
51
|
+
suites.forEach(suiteDef => {
|
|
52
|
+
const suiteKey = suiteDef.key || suiteDef.id || suiteDef.name;
|
|
53
|
+
|
|
54
|
+
if (concurrency == 0) {
|
|
55
|
+
if (suiteDef.paramManager) {
|
|
56
|
+
for (let i = 0; i < suiteDef.paramManager.rows; i++) {
|
|
57
|
+
const mockParamManager = new ParamManagerMock(suiteDef.paramManager.getValues());
|
|
58
|
+
suiteDef.paramManager.readNext();
|
|
59
|
+
const workerId = `${suiteKey}-${suiteIndex}/${i}`;
|
|
60
|
+
const suiteCopy = { ...suiteDef,
|
|
61
|
+
iterationCount: 1,
|
|
62
|
+
paramManager: mockParamManager
|
|
63
|
+
};
|
|
64
|
+
const testConfig = { ...this._config,
|
|
65
|
+
suites: [suiteCopy],
|
|
66
|
+
_groupResult: {
|
|
67
|
+
suiteKey: suiteKey,
|
|
68
|
+
_meta: {
|
|
69
|
+
suiteIterationNum: i + 1
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
workersConfig.push({
|
|
74
|
+
workerId,
|
|
75
|
+
testConfig,
|
|
76
|
+
testCaps,
|
|
77
|
+
startupDelay: 200
|
|
78
|
+
});
|
|
79
|
+
const self = this;
|
|
80
|
+
collection.push(function (callback) {
|
|
81
|
+
const cb = error => {
|
|
82
|
+
if (error) {
|
|
83
|
+
callback(error, null);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
self._launchTest({
|
|
88
|
+
workerId,
|
|
89
|
+
testConfig,
|
|
90
|
+
testCaps,
|
|
91
|
+
startupDelay: 200
|
|
92
|
+
}, cb).then(result => {
|
|
93
|
+
callback(null, result);
|
|
94
|
+
}).catch(error => {
|
|
95
|
+
callback(error, null);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const workerId = `${suiteKey}-${suiteIndex}`;
|
|
101
|
+
const suiteCopy = { ...suiteDef,
|
|
102
|
+
iterationCount: 1
|
|
103
|
+
};
|
|
104
|
+
const testConfig = { ...this._config,
|
|
105
|
+
suites: [suiteCopy],
|
|
106
|
+
_groupResult: {
|
|
107
|
+
suiteKey: suiteKey,
|
|
108
|
+
_meta: {
|
|
109
|
+
suiteIterationNum: 1
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
workersConfig.push({
|
|
114
|
+
workerId,
|
|
115
|
+
testConfig,
|
|
116
|
+
testCaps,
|
|
117
|
+
startupDelay: 200
|
|
118
|
+
});
|
|
119
|
+
const self = this;
|
|
120
|
+
collection.push(function (callback) {
|
|
121
|
+
const cb = error => {
|
|
122
|
+
if (error) {
|
|
123
|
+
callback(error, null);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
self._launchTest({
|
|
128
|
+
workerId,
|
|
129
|
+
testConfig,
|
|
130
|
+
testCaps,
|
|
131
|
+
startupDelay: 200
|
|
132
|
+
}, cb).then(result => {
|
|
133
|
+
callback(null, result);
|
|
134
|
+
}).catch(error => {
|
|
135
|
+
callback(error, null);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
} else if (concurrency == 0 && Array.isArray(suiteDef.cases)) {
|
|
140
|
+
let caseIndex = 0;
|
|
141
|
+
suiteDef.cases.forEach(caseDef => {
|
|
142
|
+
const caseKey = caseDef.key || caseDef.id || caseDef.name;
|
|
143
|
+
|
|
144
|
+
if (caseDef.paramManager) {
|
|
145
|
+
for (let i = 0; i < caseDef.paramManager.rows; i++) {
|
|
146
|
+
const mockParamManager = new ParamManagerMock(caseDef.paramManager.getValues());
|
|
147
|
+
caseDef.paramManager.readNext();
|
|
148
|
+
const workerId = `${caseKey}-${suiteIndex}/${caseIndex}/${i}`;
|
|
149
|
+
const caseCopy = { ...caseDef,
|
|
150
|
+
iterationCount: 1,
|
|
151
|
+
paramManager: mockParamManager
|
|
152
|
+
};
|
|
153
|
+
const suiteCopy = { ...suiteDef,
|
|
154
|
+
cases: [caseCopy]
|
|
155
|
+
};
|
|
156
|
+
const testConfig = { ...this._config,
|
|
157
|
+
suites: [suiteCopy],
|
|
158
|
+
_groupResult: {
|
|
159
|
+
suiteKey: suiteKey,
|
|
160
|
+
caseKey: caseKey,
|
|
161
|
+
_meta: {
|
|
162
|
+
caseIterationNum: i + 1
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
workersConfig.push({
|
|
167
|
+
workerId,
|
|
168
|
+
testConfig,
|
|
169
|
+
testCaps,
|
|
170
|
+
startupDelay: 0
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
const workerId = `${caseKey}-${suiteIndex}/${caseIndex}`;
|
|
175
|
+
const suiteCopy = { ...suiteDef,
|
|
176
|
+
cases: [caseDef]
|
|
177
|
+
};
|
|
178
|
+
const testConfig = { ...this._config,
|
|
179
|
+
suites: [suiteCopy]
|
|
180
|
+
};
|
|
181
|
+
workersConfig.push({
|
|
182
|
+
workerId,
|
|
183
|
+
testConfig,
|
|
184
|
+
testCaps,
|
|
185
|
+
startupDelay: 0
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
caseIndex++;
|
|
190
|
+
});
|
|
191
|
+
} else {
|
|
192
|
+
const suiteKey = suiteDef.key || suiteDef.id || suiteDef.name;
|
|
193
|
+
const workerId = `${suiteKey}-${suiteIndex}`;
|
|
194
|
+
const testConfig = { ...this._config,
|
|
195
|
+
suites: [suiteDef]
|
|
196
|
+
};
|
|
197
|
+
workersConfig.push({
|
|
198
|
+
workerId,
|
|
199
|
+
testConfig,
|
|
200
|
+
testCaps,
|
|
201
|
+
startupDelay: 0
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
suiteIndex++;
|
|
206
|
+
});
|
|
207
|
+
this.reporter.onBeforeStart(collection.length);
|
|
208
|
+
console.log('Collections length', collection.length);
|
|
209
|
+
const start = new Date();
|
|
210
|
+
await (0, _parallelLimit.default)(collection, PARALLEL_COUNT);
|
|
211
|
+
let total = 0;
|
|
212
|
+
console.log('Created Runners Stat', this.createdRunnersStat);
|
|
213
|
+
const runnersIds = Object.keys(this.createdRunnersStat);
|
|
214
|
+
console.log('Created Runners count', runnersIds.length);
|
|
215
|
+
runnersIds.map(item => {
|
|
216
|
+
const cazes = this.createdRunnersStat[item].length;
|
|
217
|
+
total += cazes;
|
|
218
|
+
console.log('Runner', item, ' run ', cazes, ' cases');
|
|
219
|
+
});
|
|
220
|
+
console.log('Parallel count', PARALLEL_COUNT);
|
|
221
|
+
console.log('Total: ', total);
|
|
222
|
+
const end = new Date();
|
|
223
|
+
const duration = new Duration(start, end);
|
|
224
|
+
console.log('Duration: ', duration.toString(1));
|
|
225
|
+
this.reporter.onAfterEnd();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
_instantiateRunner() {
|
|
229
|
+
if (this._config.framework && typeof this._config.framework === 'string') {
|
|
230
|
+
if (Object.prototype.hasOwnProperty.call(Runners, this._config.framework)) {
|
|
231
|
+
return new Runners[this._config.framework]();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return new Runners.oxygen();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async _launchTest({
|
|
241
|
+
workerId,
|
|
242
|
+
testConfig,
|
|
243
|
+
testCaps,
|
|
244
|
+
startupDelay
|
|
245
|
+
}, callback) {
|
|
246
|
+
if (!callback) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await this._sleep(startupDelay);
|
|
251
|
+
this._activeThreads++;
|
|
252
|
+
let runner;
|
|
253
|
+
|
|
254
|
+
if (PARALLEL_COUNT <= this.runners.length) {
|
|
255
|
+
runner = this.runners.shift();
|
|
256
|
+
let arr = this.createdRunnersStat[runner._id];
|
|
257
|
+
let newArray;
|
|
258
|
+
|
|
259
|
+
if (Array.isArray(arr)) {
|
|
260
|
+
newArray = [...arr, workerId];
|
|
261
|
+
} else {
|
|
262
|
+
newArray = [workerId];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
this.createdRunnersStat[runner._id] = newArray;
|
|
266
|
+
} else {
|
|
267
|
+
runner = this._instantiateRunner();
|
|
268
|
+
this.createdRunnersStat[runner._id] = [workerId];
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (!runner) {
|
|
272
|
+
const framework = this._config.framework;
|
|
273
|
+
callback(new Error(`Cannot find runner for the specified framework: ${framework}.`));
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
try {
|
|
278
|
+
await runner.init(testConfig, testCaps, this.reporter);
|
|
279
|
+
const result = await runner.run();
|
|
280
|
+
await runner.dispose(result.status || null);
|
|
281
|
+
callback();
|
|
282
|
+
} catch (e) {
|
|
283
|
+
console.error('Failed to launch the test:', e);
|
|
284
|
+
|
|
285
|
+
if (this._queue) {
|
|
286
|
+
this._queue.kill();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (e.error) {
|
|
290
|
+
var errMsg = '';
|
|
291
|
+
var err = e.error;
|
|
292
|
+
if (err.type) errMsg += err.type + ' - ';
|
|
293
|
+
if (err.message) errMsg += err.message;else errMsg = err.toString();
|
|
294
|
+
callback(new Error(errMsg));
|
|
295
|
+
} else {
|
|
296
|
+
callback(e);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
this.runners.push(runner);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
_sleep(duration) {
|
|
304
|
+
return new Promise(resolve => setTimeout(resolve, duration));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
exports.default = ParallelLauncher;
|
|
310
|
+
|
|
311
|
+
class ParamManagerMock {
|
|
312
|
+
constructor(values) {
|
|
313
|
+
this.values = values;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
init() {}
|
|
317
|
+
|
|
318
|
+
getMode() {}
|
|
319
|
+
|
|
320
|
+
readNext() {}
|
|
321
|
+
|
|
322
|
+
readPrev() {}
|
|
323
|
+
|
|
324
|
+
getValues() {
|
|
325
|
+
return this.values;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
get rows() {
|
|
329
|
+
return 1;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGFyYWxsZWwtbGF1bmNoZXIuanMiXSwibmFtZXMiOlsiRHVyYXRpb24iLCJyZXF1aXJlIiwiUEFSQUxMRUxfQ09VTlQiLCJQYXJhbGxlbExhdW5jaGVyIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJyZXBvcnRlciIsIl9jb25maWciLCJfcXVldWUiLCJfYWN0aXZlVGhyZWFkcyIsInJ1bm5lcnMiLCJjcmVhdGVkUnVubmVyc1N0YXQiLCJydW4iLCJjYXBzU2V0IiwiY29sbGVjdGlvbiIsInBhcmFsbGVsIiwiRXJyb3IiLCJjb25jdXJyZW5jeSIsImlzTmFOIiwic3VpdGVzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya2Vyc0NvbmZpZyIsInRlc3RDYXBzIiwic3VpdGVJbmRleCIsImZvckVhY2giLCJzdWl0ZURlZiIsInN1aXRlS2V5Iiwia2V5IiwiaWQiLCJuYW1lIiwicGFyYW1NYW5hZ2VyIiwiaSIsInJvd3MiLCJtb2NrUGFyYW1NYW5hZ2VyIiwiUGFyYW1NYW5hZ2VyTW9jayIsImdldFZhbHVlcyIsInJlYWROZXh0Iiwid29ya2VySWQiLCJzdWl0ZUNvcHkiLCJpdGVyYXRpb25Db3VudCIsInRlc3RDb25maWciLCJfZ3JvdXBSZXN1bHQiLCJfbWV0YSIsInN1aXRlSXRlcmF0aW9uTnVtIiwicHVzaCIsInN0YXJ0dXBEZWxheSIsInNlbGYiLCJjYWxsYmFjayIsImNiIiwiZXJyb3IiLCJfbGF1bmNoVGVzdCIsInRoZW4iLCJyZXN1bHQiLCJjYXRjaCIsImNhc2VzIiwiY2FzZUluZGV4IiwiY2FzZURlZiIsImNhc2VLZXkiLCJjYXNlQ29weSIsImNhc2VJdGVyYXRpb25OdW0iLCJvbkJlZm9yZVN0YXJ0IiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsInN0YXJ0IiwiRGF0ZSIsInRvdGFsIiwicnVubmVyc0lkcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJpdGVtIiwiY2F6ZXMiLCJlbmQiLCJkdXJhdGlvbiIsInRvU3RyaW5nIiwib25BZnRlckVuZCIsIl9pbnN0YW50aWF0ZVJ1bm5lciIsImZyYW1ld29yayIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlJ1bm5lcnMiLCJveHlnZW4iLCJfc2xlZXAiLCJydW5uZXIiLCJzaGlmdCIsImFyciIsIl9pZCIsIm5ld0FycmF5IiwiaW5pdCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJlIiwia2lsbCIsImVyck1zZyIsImVyciIsInR5cGUiLCJtZXNzYWdlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwidmFsdWVzIiwiZ2V0TW9kZSIsInJlYWRQcmV2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFVQTs7QUFFQTs7Ozs7Ozs7QUFHQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUlBLE1BQU1DLGNBQWMsR0FBRyxFQUF2Qjs7QUFFZSxNQUFNQyxnQkFBTixDQUF1QjtBQUNsQ0MsRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQVNDLFFBQVQsRUFBbUI7QUFDMUIsU0FBS0MsT0FBTCxHQUFlRixNQUFmO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLRSxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLGNBQUwsR0FBc0IsQ0FBdEI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0g7O0FBRVEsUUFBSEMsR0FBRyxDQUFDQyxPQUFELEVBQVU7QUFDZixVQUFNQyxVQUFVLEdBQUcsRUFBbkI7O0FBSUEsUUFBSSxDQUFDLEtBQUtQLE9BQUwsQ0FBYVEsUUFBbEIsRUFBNEI7QUFDeEIsWUFBTSxJQUFJQyxLQUFKLENBQVUsc0VBQVYsQ0FBTjtBQUNIOztBQUNELFVBQU1DLFdBQVcsR0FBRyxDQUFDQyxLQUFLLENBQUMsS0FBS1gsT0FBTCxDQUFhUSxRQUFiLENBQXNCRSxXQUF2QixDQUFOLEdBQTRDLEtBQUtWLE9BQUwsQ0FBYVEsUUFBYixDQUFzQkUsV0FB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RyxDQUVOOztBQUVEYSxFQUFBQSxPQUFPLEdBQUcsQ0FFVDs7QUFFRG5FLEVBQUFBLFFBQVEsR0FBRyxDQUVWOztBQUVEb0UsRUFBQUEsUUFBUSxHQUFHLENBRVY7O0FBRURyRSxFQUFBQSxTQUFTLEdBQUc7QUFDUixXQUFPLEtBQUttRSxNQUFaO0FBQ0g7O0FBRU8sTUFBSnRFLElBQUksR0FBRztBQUNQLFdBQU8sQ0FBUDtBQUNIOztBQTNCa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8vIGltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCAqIGFzIFJ1bm5lcnMgZnJvbSAnLi4vcnVubmVycyc7XHJcbi8vIGltcG9ydCBxdWV1ZSBmcm9tICdhc3luYy9xdWV1ZSc7XHJcbmltcG9ydCBwYXJhbGxlbExpbWl0IGZyb20gJ2FzeW5jL3BhcmFsbGVsTGltaXQnO1xyXG4vLyBpbXBvcnQgeyBwYXJzZVVybEVuY29kZWQgfSBmcm9tICdjaHJvbWUtaGFyL2xpYi91dGlsJztcclxuLy8gaW1wb3J0IG94dXRpbCBmcm9tICcuL3V0aWwnO1xyXG52YXIgRHVyYXRpb24gPSByZXF1aXJlKCdkdXJhdGlvbicpO1xyXG4vLyBjb25zdCBTQ09QRV9TVUlURSA9ICdzdWl0ZSc7XHJcbi8vIGNvbnN0IFNDT1BFX0NBU0UgPSAnY2FzZSc7XHJcblxyXG5jb25zdCBQQVJBTExFTF9DT1VOVCA9IDUwO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyYWxsZWxMYXVuY2hlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHJlcG9ydGVyKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9xdWV1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZlVGhyZWFkcyA9IDA7XHJcbiAgICAgICAgdGhpcy5ydW5uZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkUnVubmVyc1N0YXQgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oY2Fwc1NldCkge1xyXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBbXTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnfn50aGlzLl9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9jb25maWcsIG51bGwsIDIpKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnfn5jYXBzU2V0JywgY2Fwc1NldCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmFsbGVsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN0YXJ0IHRoZSBwYXJhbGxlbCB0ZXN0aW5nIC0gXCJwYXJhbGxlbFwiIHNldHRpbmdzIGFyZSBtaXNzaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9ICFpc05hTih0aGlzLl9jb25maWcucGFyYWxsZWwuY29uY3VycmVuY3kpID8gdGhpcy5fY29uZmlnLnBhcmFsbGVsLmNvbmN1cnJlbmN5IDogMTtcclxuICAgICAgICAvLyBjb25zdCBzY29wZSA9IHRoaXMuX2NvbmZpZy5wYXJhbGxlbC5zY29wZTtcclxuICAgICAgICAvLyBmbGF0dGVuIGFsbCBzdWl0ZXMgYW5kIGNyZWF0ZSBvbmUgdW5pZmllZCBhcnJheSBvZiBhbGwgdGhlIHRlc3QgY2FzZXNcclxuICAgICAgICBjb25zdCBzdWl0ZXMgPSB0aGlzLl9jb25maWcuc3VpdGVzO1xyXG4gICAgICAgIGlmICghc3VpdGVzIHx8ICFBcnJheS5pc0FycmF5KHN1aXRlcykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3RhcnQgdGhlIHBhcmFsbGVsIHRlc3RpbmcgLSBubyBzdWl0ZXMgYXJlIGRlZmluZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB3b3JrZXJzQ29uZmlnID0gW107XHJcbiAgICAgICAgLy8gbGV0IHdvcmtlcnNDb3VudCA9IGNvbmN1cnJlbmN5O1xyXG4gICAgICAgIC8vIGlmIG5vIGNhcGFiaWxpdGllcyBhcmUgc3BlY2lmaWVkLCBydW4gc2luZ2xlIGluc3RhbmNlIHdpdGggZGVmYXVsdCBhcmd1bWVudHNcclxuICAgICAgICAvLyBhbHRlcm5hdGl2ZWx5LCBwaWNrIHRoZSBmaXJzdCBjYXBhYmlsaXRpZXMgc2V0IChsb2FkIHRlc3QgaXMgbGltaXRlZCB0byBhIHNpbmdsZSBicm93c2VyIHR5cGUpXHJcbiAgICAgICAgY29uc3QgdGVzdENhcHMgPSBjYXBzU2V0ID8gKEFycmF5LmlzQXJyYXkoY2Fwc1NldCkgPyBjYXBzU2V0WzBdIDogY2Fwc1NldCkgOiBudWxsO1xyXG4gICAgICAgIC8vIGlmIGNvbmN1cnJlbmN5IHNldCB0byBtYXggYW5kIHBhcmFtZXRlciBmaWxlIGlzIGRlZmluZWQsIFxyXG4gICAgICAgIC8vIHRoZW4gcnVuIGFzIG1hbnkgcGFyYWxsZWwgdGVzdHMgYXMgcm93cyBpbiB0aGUgZmlsZVxyXG4gICAgICAgIGxldCBzdWl0ZUluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgc3VpdGVzLmZvckVhY2goc3VpdGVEZWYgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+c3VpdGVEZWYnLCBzdWl0ZURlZik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fnN1aXRlRGVmLnBhcmFtTWFuYWdlcicsIHN1aXRlRGVmLnBhcmFtTWFuYWdlcik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmNvbmN1cnJlbmN5JywgY29uY3VycmVuY3kpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3VpdGVLZXkgPSBzdWl0ZURlZi5rZXkgfHwgc3VpdGVEZWYuaWQgfHwgc3VpdGVEZWYubmFtZTtcclxuICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmlmJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnfn5zdWl0ZURlZi5wYXJhbU1hbmFnZXIucm93cycsIHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yb3dzKTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZURlZi5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yb3dzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9ja1BhcmFtTWFuYWdlciA9IG5ldyBQYXJhbU1hbmFnZXJNb2NrKHN1aXRlRGVmLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlRGVmLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3N1aXRlS2V5fS0ke3N1aXRlSW5kZXh9LyR7aX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZUNvcHkgPSB7IC4uLnN1aXRlRGVmLCBpdGVyYXRpb25Db3VudDogMSwgcGFyYW1NYW5hZ2VyOiBtb2NrUGFyYW1NYW5hZ2VyIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9jb25maWcsIHN1aXRlczogWyBzdWl0ZUNvcHkgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cFJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlS2V5OiBzdWl0ZUtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWV0YTogeyBzdWl0ZUl0ZXJhdGlvbk51bTogaSArIDEgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzQ29uZmlnLnB1c2goeyB3b3JrZXJJZCwgdGVzdENvbmZpZywgdGVzdENhcHMsIHN0YXJ0dXBEZWxheTogMjAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+Y2IgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAyMDAgfSwgY2IpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Vyc0NvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3N1aXRlS2V5fS0ke3N1aXRlSW5kZXh9YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZUNvcHkgPSB7IC4uLnN1aXRlRGVmLCBpdGVyYXRpb25Db3VudDogMSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZ3JvdXBSZXN1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlS2V5OiBzdWl0ZUtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhOiB7IHN1aXRlSXRlcmF0aW9uTnVtOiAxIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDIwMCB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmNiIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAyMDAgfSwgY2IpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb2YgY2FzZXMgaGF2ZSBwYXJhbSBmaWxlIGF0dGFjaGVkXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmN1cnJlbmN5ID09IDAgJiYgQXJyYXkuaXNBcnJheShzdWl0ZURlZi5jYXNlcykpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjYXNlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgc3VpdGVEZWYuY2FzZXMuZm9yRWFjaChjYXNlRGVmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlS2V5ID0gY2FzZURlZi5rZXkgfHwgY2FzZURlZi5pZCB8fCBjYXNlRGVmLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VEZWYucGFyYW1NYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vd29ya2Vyc0NvdW50ICs9IGNhc2VEZWYucGFyYW1NYW5hZ2VyLnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FzZURlZi5wYXJhbU1hbmFnZXIucm93czsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2NrUGFyYW1NYW5hZ2VyID0gbmV3IFBhcmFtTWFuYWdlck1vY2soY2FzZURlZi5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZURlZi5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7Y2FzZUtleX0tJHtzdWl0ZUluZGV4fS8ke2Nhc2VJbmRleH0vJHtpfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlQ29weSA9IHsgLi4uY2FzZURlZiwgaXRlcmF0aW9uQ291bnQ6IDEsIHBhcmFtTWFuYWdlcjogbW9ja1BhcmFtTWFuYWdlciB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VpdGVDb3B5ID0geyAuLi5zdWl0ZURlZiwgY2FzZXM6IFsgY2FzZUNvcHkgXX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ncm91cFJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUtleTogc3VpdGVLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VLZXk6IGNhc2VLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXRhOiB7IGNhc2VJdGVyYXRpb25OdW06IGkgKyAxIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZXJzQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VySWQgPSBgJHtjYXNlS2V5fS0ke3N1aXRlSW5kZXh9LyR7Y2FzZUluZGV4fWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlQ29weSA9IHsgLi4uc3VpdGVEZWYsIGNhc2VzOiBbIGNhc2VEZWYgXX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RDb25maWcgPSB7IC4uLnRoaXMuX2NvbmZpZywgc3VpdGVzOiBbIHN1aXRlQ29weSBdIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNDb25maWcucHVzaCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5OiAwIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZXJzQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHdvcmtlcnNDb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VpdGVLZXkgPSBzdWl0ZURlZi5rZXkgfHwgc3VpdGVEZWYuaWQgfHwgc3VpdGVEZWYubmFtZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7c3VpdGVLZXl9LSR7c3VpdGVJbmRleH1gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IHsgLi4udGhpcy5fY29uZmlnLCBzdWl0ZXM6IFsgc3VpdGVEZWYgXSB9O1xyXG4gICAgICAgICAgICAgICAgd29ya2Vyc0NvbmZpZy5wdXNoKHsgd29ya2VySWQsIHRlc3RDb25maWcsIHRlc3RDYXBzLCBzdGFydHVwRGVsYXk6IDAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVJbmRleCsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnd29ya2Vyc0NvbmZpZycsIEpTT04uc3RyaW5naWZ5KHdvcmtlcnNDb25maWcsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ35+d29ya2Vyc0NvdW50Jywgd29ya2Vyc0NvdW50KTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fcXVldWUgPSBxdWV1ZSgodGFzaywgY2IpID0+IHRoaXMuX2xhdW5jaFRlc3QodGFzaywgY2IpLCB3b3JrZXJzQ291bnQpO1xyXG4gICAgICAgIC8vIHRoaXMuX3F1ZXVlLmVycm9yKChlcnIsIHRhc2spID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHF1ZXVlOicsIGVycik7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIub25CZWZvcmVTdGFydChjb2xsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDb2xsZWN0aW9ucyBsZW5ndGgnLCBjb2xsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICBhd2FpdCBwYXJhbGxlbExpbWl0KGNvbGxlY3Rpb24sIFBBUkFMTEVMX0NPVU5UKTtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBSdW5uZXJzIFN0YXQnLCB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdCk7XHJcbiAgICAgICAgY29uc3QgcnVubmVyc0lkcyA9IE9iamVjdC5rZXlzKHRoaXMuY3JlYXRlZFJ1bm5lcnNTdGF0KTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBSdW5uZXJzIGNvdW50JywgcnVubmVyc0lkcy5sZW5ndGgpO1xyXG5cclxuICAgICAgICBydW5uZXJzSWRzLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXplcyA9IHRoaXMuY3JlYXRlZFJ1bm5lcnNTdGF0W2l0ZW1dLmxlbmd0aDtcclxuICAgICAgICAgICAgdG90YWwgKz0gY2F6ZXM7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSdW5uZXInLCBpdGVtLCAnIHJ1biAnLCBjYXplcywgJyBjYXNlcycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnUGFyYWxsZWwgY291bnQnLCBQQVJBTExFTF9DT1VOVCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1RvdGFsOiAnLCB0b3RhbCk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoKTtcclxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihzdGFydCwgZW5kKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnRHVyYXRpb246ICcsIGR1cmF0aW9uLnRvU3RyaW5nKDEpKTtcclxuXHJcbiAgICAgICAgLy8gLy8gcHVzaCBhbGwgd29ya2VycyB0byB0aGUgcXVldWVcclxuICAgICAgICAvLyB3b3JrZXJzQ29uZmlnLmZvckVhY2god29ya2VyQ29uZmlnID0+IHRoaXMuX3F1ZXVlLnB1c2god29ya2VyQ29uZmlnKSk7XHJcblxyXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuX3F1ZXVlLmRyYWluKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVwb3J0ZXIub25BZnRlckVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIF9pbnN0YW50aWF0ZVJ1bm5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmZyYW1ld29yayAmJiB0eXBlb2YgdGhpcy5fY29uZmlnLmZyYW1ld29yayA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSdW5uZXJzLCB0aGlzLl9jb25maWcuZnJhbWV3b3JrKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW5uZXJzW3RoaXMuX2NvbmZpZy5mcmFtZXdvcmtdKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUnVubmVycy5veHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfbGF1bmNoVGVzdCh7IHdvcmtlcklkLCB0ZXN0Q29uZmlnLCB0ZXN0Q2Fwcywgc3RhcnR1cERlbGF5IH0sIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ35+X2xhdW5jaFRlc3QnLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLl9zbGVlcChzdGFydHVwRGVsYXkpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZVRocmVhZHMrKztcclxuXHJcbiAgICAgICAgbGV0IHJ1bm5lcjtcclxuXHJcbiAgICAgICAgaWYgKFBBUkFMTEVMX0NPVU5UIDw9IHRoaXMucnVubmVycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcnVubmVyID0gdGhpcy5ydW5uZXJzLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5jcmVhdGVkUnVubmVyc1N0YXRbcnVubmVyLl9pZF07XHJcbiAgICAgICAgICAgIGxldCBuZXdBcnJheTtcclxuXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcclxuICAgICAgICAgICAgICAgIG5ld0FycmF5ID0gWy4uLmFyciwgd29ya2VySWRdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3QXJyYXkgPSBbd29ya2VySWRdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdFtydW5uZXIuX2lkXSA9IG5ld0FycmF5O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBydW5uZXIgPSB0aGlzLl9pbnN0YW50aWF0ZVJ1bm5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRSdW5uZXJzU3RhdFtydW5uZXIuX2lkXSA9IFt3b3JrZXJJZF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJ1bm5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmcmFtZXdvcmsgPSB0aGlzLl9jb25maWcuZnJhbWV3b3JrO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHJ1bm5lciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZXdvcms6ICR7ZnJhbWV3b3JrfS5gKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgZmlyZWZveCBcInByb2ZpbGVcIiB2YWx1ZSBpZiBwcm9maWxlIG9wdGlvbnMgYXJlIHNwZWNpZmllZFxyXG4gICAgICAgICAgICAvL2F3YWl0IG94dXRpbC5nZW5lcmF0ZUZpcmVmb3hPcHRpb25zUHJvZmlsZSh0ZXN0Q2Fwcyk7XHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgb3h5Z2VuXHJcblxyXG4gICAgICAgICAgICBhd2FpdCBydW5uZXIuaW5pdCh0ZXN0Q29uZmlnLCB0ZXN0Q2FwcywgdGhpcy5yZXBvcnRlcik7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd+fmluaXRSdicsIGluaXRSdik7XHJcblxyXG4gICAgICAgICAgICAvLyBydW4gT3h5Z2VuIHRlc3QgXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bm5lci5ydW4oKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ35+cmVzdWx0JywgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHJ1bm5lci5kaXNwb3NlKHJlc3VsdC5zdGF0dXMgfHwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsYXVuY2ggdGhlIHRlc3Q6JywgZSk7XHJcbiAgICAgICAgICAgIC8vIHN0b3AgcHJvY2Vzc2luZyB0aGUgcXVldWVcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5raWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBjdXN0b20gZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBpZiAoZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVyck1zZyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IGUuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnR5cGUpXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnICs9IGVyci50eXBlICsgJyAtICc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnICs9IGVyci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZyA9IGVyci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVyck1zZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZSk7ICAgIC8vIGNhbGwgYmFjayB3aXRoIHRoZSBvcmlnaW5hbCBleGNlcHRpb25cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gocnVubmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBfc2xlZXAoZHVyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZHVyYXRpb24pKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUGFyYW1NYW5hZ2VyTW9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZXMpIHtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2RlKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZWFkTmV4dCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVhZFByZXYoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvd3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,37 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
3
8
|
require("source-map-support/register");
|
|
4
9
|
|
|
5
10
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
6
11
|
|
|
7
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
const ExcelReader = require('./param-reader-excel');
|
|
11
17
|
|
|
12
|
-
|
|
18
|
+
const CsvReader = require('./param-reader-csv');
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
const JsonReader = require('./param-reader-json');
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
const errHelper = require('../errors/helper');
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
const DEFAULT_MODE = 'seq';
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
class ParameterManager {
|
|
27
|
+
constructor({
|
|
28
|
+
paramFile = null,
|
|
29
|
+
fileType = null,
|
|
30
|
+
paramMode = DEFAULT_MODE,
|
|
31
|
+
values = null
|
|
32
|
+
}) {
|
|
33
|
+
this.filePath = paramFile;
|
|
34
|
+
this.fileType = fileType;
|
|
35
|
+
this.mode = paramMode;
|
|
36
|
+
this.table = null;
|
|
37
|
+
this.currentRow = null;
|
|
38
|
+
this.prevRow = null;
|
|
21
39
|
|
|
22
|
-
|
|
40
|
+
if (values && Array.isArray(values)) {
|
|
41
|
+
this.table = values;
|
|
42
|
+
this.currentRow = this.mode === 'random' ? random(0, this.table.length) : 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
23
45
|
|
|
24
|
-
|
|
46
|
+
async init() {
|
|
47
|
+
if (!this.filePath) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
25
50
|
|
|
26
|
-
|
|
27
|
-
var ext = path.extname(filePath);
|
|
51
|
+
let ext = path.extname(this.filePath);
|
|
28
52
|
|
|
29
|
-
if (fileType) {
|
|
30
|
-
ext = fileType;
|
|
53
|
+
if (this.fileType) {
|
|
54
|
+
ext = this.fileType;
|
|
31
55
|
}
|
|
32
56
|
|
|
33
|
-
|
|
34
|
-
var self = this;
|
|
57
|
+
let reader = null;
|
|
35
58
|
|
|
36
59
|
if (ext === '.xlsx' || ext === '.xls') {
|
|
37
60
|
reader = new ExcelReader();
|
|
@@ -40,29 +63,24 @@ module.exports = function (filePath, mode, fileType) {
|
|
|
40
63
|
} else if (ext === '.json' || ext === '.js') {
|
|
41
64
|
reader = new JsonReader();
|
|
42
65
|
} else {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return _whenInitialized.promise;
|
|
66
|
+
new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, `Unsupported parameters file type: ${ext}`);
|
|
67
|
+
return;
|
|
46
68
|
}
|
|
47
69
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
${err.message}`));
|
|
57
|
-
});
|
|
58
|
-
return _whenInitialized.promise;
|
|
59
|
-
};
|
|
70
|
+
try {
|
|
71
|
+
const result = await reader.read(this.filePath, this.fileType || null);
|
|
72
|
+
this.table = result;
|
|
73
|
+
this.currentRow = this.mode === 'random' ? random(0, this.table.length) : 0;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, `${errHelper.errorCode.PARAMETERS_ERROR}: Unable to load parameters file.\n${e.message}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
60
78
|
|
|
61
|
-
|
|
79
|
+
getMode() {
|
|
62
80
|
return this.mode;
|
|
63
|
-
}
|
|
81
|
+
}
|
|
64
82
|
|
|
65
|
-
|
|
83
|
+
readNext() {
|
|
66
84
|
this.prevRow = this.currentRow;
|
|
67
85
|
|
|
68
86
|
if (this.mode === 'random') {
|
|
@@ -74,30 +92,31 @@ ${err.message}`));
|
|
|
74
92
|
if (this.currentRow > this.table.length - 1) {
|
|
75
93
|
this.currentRow = 0;
|
|
76
94
|
}
|
|
77
|
-
}
|
|
95
|
+
}
|
|
78
96
|
|
|
79
|
-
|
|
80
|
-
if (typeof this.prevRow !== 'undefined') {
|
|
97
|
+
readPrev() {
|
|
98
|
+
if (typeof this.prevRow !== 'undefined' && this.prevRow != null) {
|
|
81
99
|
this.currentRow = this.prevRow;
|
|
82
100
|
}
|
|
83
|
-
}
|
|
101
|
+
}
|
|
84
102
|
|
|
85
|
-
|
|
103
|
+
getValues() {
|
|
86
104
|
if (!this.table || this.table.length === 0) {
|
|
87
105
|
throw new _OxygenError.default(errHelper.errorCode.PARAMETERS_ERROR, 'Parameters table is empty');
|
|
88
106
|
}
|
|
89
107
|
|
|
90
108
|
return this.table[this.currentRow];
|
|
91
|
-
}
|
|
109
|
+
}
|
|
92
110
|
|
|
93
|
-
|
|
111
|
+
get rows() {
|
|
94
112
|
return this.table.length;
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
function random(min, max) {
|
|
98
|
-
return Math.floor(Math.random() * (max - min)) + min;
|
|
99
113
|
}
|
|
100
114
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
exports.default = ParameterManager;
|
|
118
|
+
|
|
119
|
+
function random(min, max) {
|
|
120
|
+
return Math.floor(Math.random() * (max - min)) + min;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGFyYW0tbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIkV4Y2VsUmVhZGVyIiwiQ3N2UmVhZGVyIiwiSnNvblJlYWRlciIsImVyckhlbHBlciIsIkRFRkFVTFRfTU9ERSIsIlBhcmFtZXRlck1hbmFnZXIiLCJjb25zdHJ1Y3RvciIsInBhcmFtRmlsZSIsImZpbGVUeXBlIiwicGFyYW1Nb2RlIiwidmFsdWVzIiwiZmlsZVBhdGgiLCJtb2RlIiwidGFibGUiLCJjdXJyZW50Um93IiwicHJldlJvdyIsIkFycmF5IiwiaXNBcnJheSIsInJhbmRvbSIsImxlbmd0aCIsImluaXQiLCJleHQiLCJleHRuYW1lIiwicmVhZGVyIiwiT3hFcnJvciIsImVycm9yQ29kZSIsIlBBUkFNRVRFUlNfRVJST1IiLCJyZXN1bHQiLCJyZWFkIiwiZSIsIm1lc3NhZ2UiLCJnZXRNb2RlIiwicmVhZE5leHQiLCJyZWFkUHJldiIsImdldFZhbHVlcyIsInJvd3MiLCJtaW4iLCJtYXgiLCJNYXRoIiwiZmxvb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBOzs7O0FBR0EsTUFBTUEsSUFBSSxHQUFHQyxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxNQUFNQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxzQkFBRCxDQUEzQjs7QUFDQSxNQUFNRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxvQkFBRCxDQUF6Qjs7QUFDQSxNQUFNRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxxQkFBRCxDQUExQjs7QUFDQSxNQUFNSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxrQkFBRCxDQUF6Qjs7QUFFQSxNQUFNSyxZQUFZLEdBQUcsS0FBckI7O0FBRWUsTUFBTUMsZ0JBQU4sQ0FBdUI7QUFDbENDLEVBQUFBLFdBQVcsQ0FBQztBQUFFQyxJQUFBQSxTQUFTLEdBQUcsSUFBZDtBQUFvQkMsSUFBQUEsUUFBUSxHQUFHLElBQS9CO0FBQXFDQyxJQUFBQSxTQUFTLEdBQUdM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QUFLTCxVQUFMLEdBQWtCLENBQWxCO0FBQ0g7QUFDSjs7QUFFRG1CLEVBQUFBLFFBQVEsR0FBRztBQUNQLFFBQUksT0FBTyxLQUFLbEIsT0FBWixLQUF3QixXQUF4QixJQUF1QyxLQUFLQSxPQUFMLElBQWdCLElBQTNELEVBQWlFO0FBQzdELFdBQUtELFVBQUwsR0FBa0IsS0FBS0MsT0FBdkI7QUFDSDtBQUNKOztBQUVEbUIsRUFBQUEsU0FBUyxHQUFHO0FBQ1IsUUFBSSxDQUFDLEtBQUtyQixLQUFOLElBQWUsS0FBS0EsS0FBTCxDQUFXTSxNQUFYLEtBQXNCLENBQXpDLEVBQTRDO0FBQ3hDLFlBQU0sSUFBSUssb0JBQUosQ0FBWXJCLFNBQVMsQ0FBQ3NCLFNBQVYsQ0FBb0JDLGdCQUFoQyxFQUFrRCwyQkFBbEQsQ0FBTjtBQUNIOztBQUNELFdBQU8sS0FBS2IsS0FBTCxDQUFXLEtBQUtDLFVBQWhCLENBQVA7QUFDSDs7QUFFTyxNQUFKcUIsSUFBSSxHQUFHO0FBQ1AsV0FBTyxLQUFLdEIsS0FBTCxDQUFXTSxNQUFsQjtBQUNIOztBQXRGaUM7Ozs7QUF5RnRDLFNBQVNELE1BQVQsQ0FBZ0JrQixHQUFoQixFQUFxQkMsR0FBckIsRUFBMEI7QUFDdEIsU0FBT0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ3BCLE1BQUwsTUFBaUJtQixHQUFHLEdBQUdELEdBQXZCLENBQVgsSUFBMENBLEdBQWpEO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbi8vIGNvbnN0IGRlZmVyID0gcmVxdWlyZSgnd2hlbicpLmRlZmVyO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG5jb25zdCBFeGNlbFJlYWRlciA9IHJlcXVpcmUoJy4vcGFyYW0tcmVhZGVyLWV4Y2VsJyk7XHJcbmNvbnN0IENzdlJlYWRlciA9IHJlcXVpcmUoJy4vcGFyYW0tcmVhZGVyLWNzdicpO1xyXG5jb25zdCBKc29uUmVhZGVyID0gcmVxdWlyZSgnLi9wYXJhbS1yZWFkZXItanNvbicpO1xyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcblxyXG5jb25zdCBERUZBVUxUX01PREUgPSAnc2VxJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmFtZXRlck1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoeyBwYXJhbUZpbGUgPSBudWxsLCBmaWxlVHlwZSA9IG51bGwsIHBhcmFtTW9kZSA9IERFRkFVTFRfTU9ERSwgdmFsdWVzID0gbnVsbH0pIHtcclxuICAgICAgICB0aGlzLmZpbGVQYXRoID0gcGFyYW1GaWxlO1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGUgPSBmaWxlVHlwZTtcclxuICAgICAgICB0aGlzLm1vZGUgPSBwYXJhbU1vZGU7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Um93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByZXZSb3cgPSBudWxsO1xyXG4gICAgICAgIC8vIGlmIHZhbHVlcyB3ZXJlIHByb3ZpZGVkLCBpbml0aWFsaXplIG1hbmFnZXIgd2l0aCBwcmUtZGVmaW5lZCB0YWJsZVxyXG4gICAgICAgIGlmICh2YWx1ZXMgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUgPSB2YWx1ZXM7XHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgY3VycmVudFJvdyBhY2NvcmRpbmcgd2l0aCBwYXJhbWV0ZXIgcmVhZGluZyBtb2RlIChyYW5kb20gb3Igc2VxdWVudGlhbClcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Um93ID0gdGhpcy5tb2RlID09PSAncmFuZG9tJyA/IHJhbmRvbSgwLCB0aGlzLnRhYmxlLmxlbmd0aCkgOiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5maWxlUGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBleHQgPSBwYXRoLmV4dG5hbWUodGhpcy5maWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbGVUeXBlKSB7XHJcbiAgICAgICAgICAgIGV4dCA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIGNob29zZSB0aGUgcmlnaHQgY29udmVydGVyIGJhc2VkIG9uIGVpdGhlciB4bHMgb3IgeGxzeCBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgIGlmIChleHQgPT09ICcueGxzeCcgfHwgZXh0ID09PSAnLnhscycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEV4Y2VsUmVhZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV4dCA9PT0gJy5jc3YnIHx8IGV4dCA9PT0gJy50eHQnKSB7XHJcbiAgICAgICAgICAgIHJlYWRlciA9IG5ldyBDc3ZSZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXh0ID09PSAnLmpzb24nIHx8IGV4dCA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuUEFSQU1FVEVSU19FUlJPUiwgYFVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgZmlsZSB0eXBlOiAke2V4dH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQodGhpcy5maWxlUGF0aCwgdGhpcy5maWxlVHlwZSB8fCBudWxsKTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXJyZW50Um93IGFjY29yZGluZyB3aXRoIHBhcmFtZXRlciByZWFkaW5nIG1vZGUgKHJhbmRvbSBvciBzZXF1ZW50aWFsKVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3cgPSB0aGlzLm1vZGUgPT09ICdyYW5kb20nID8gcmFuZG9tKDAsIHRoaXMudGFibGUubGVuZ3RoKSA6IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIG5ldyBPeEVycm9yKFxyXG4gICAgICAgICAgICAgICAgZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLFxyXG4gICAgICAgICAgICAgICAgYCR7ZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SfTogVW5hYmxlIHRvIGxvYWQgcGFyYW1ldGVycyBmaWxlLlxcbiR7ZS5tZXNzYWdlfWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRNb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZE5leHQoKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2Um93ID0gdGhpcy5jdXJyZW50Um93O1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5kb20nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IHJhbmRvbSgwLCB0aGlzLnRhYmxlLmxlbmd0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Um93Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um93ID4gdGhpcy50YWJsZS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJvdyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlYWRQcmV2KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmV2Um93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByZXZSb3cgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3cgPSB0aGlzLnByZXZSb3c7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGFibGUgfHwgdGhpcy50YWJsZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5QQVJBTUVURVJTX0VSUk9SLCAnUGFyYW1ldGVycyB0YWJsZSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZVt0aGlzLmN1cnJlbnRSb3ddO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb3dzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmxlbmd0aDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4KSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xyXG59Il19
|