oxygen-cli 1.25.0-beta.2 → 1.25.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/.husky/pre-commit +4 -0
- package/CHANGELOG.md +65 -0
- package/build/core/OxygenCore.js +36 -257
- package/build/core/OxygenEvents.js +1 -11
- package/build/core/OxygenModule.js +1 -14
- package/build/core/OxygenService.js +1 -12
- package/build/core/OxygenSubModule.js +1 -10
- package/build/core/WebDriverModule.js +1 -30
- package/build/core/utils.js +1 -17
- package/build/errors/HookError.js +1 -7
- package/build/errors/ModuleError.js +1 -7
- package/build/errors/ModuleUnavailableError.js +1 -3
- package/build/errors/OxygenError.js +1 -33
- package/build/errors/ScriptNotFound.js +1 -7
- package/build/errors/helper.js +46 -77
- package/build/index.js +6 -18
- package/build/lib/cli-util.js +28 -90
- package/build/lib/cli.js +1 -23
- package/build/lib/debugger.js +1 -144
- package/build/lib/img-merge.js +1 -15
- package/build/lib/launcher.js +1 -28
- package/build/lib/moduleRequire.js +1 -4
- package/build/lib/param-manager.js +1 -28
- package/build/lib/param-reader-csv.js +1 -15
- package/build/lib/param-reader-excel.js +1 -14
- package/build/lib/param-reader-json.js +1 -10
- package/build/lib/util.js +3 -58
- package/build/model/case-result.js +1 -2
- package/build/model/failure.js +1 -2
- package/build/model/status.js +1 -2
- package/build/model/step-result.js +1 -2
- package/build/model/suite-result.js +1 -2
- package/build/model/test-result.js +1 -2
- package/build/model/testcase.js +1 -2
- package/build/model/testsuite.js +1 -2
- package/build/ox_modules/index.js +13 -33
- package/build/ox_modules/module-assert.js +8 -24
- package/build/ox_modules/module-date.js +3 -8
- package/build/ox_modules/module-db.js +7 -28
- package/build/ox_modules/module-email.js +10 -36
- package/build/ox_modules/module-eyes.js +5 -46
- package/build/ox_modules/module-http.js +42 -104
- package/build/ox_modules/module-log.js +5 -22
- package/build/ox_modules/module-mailinator.js +10 -32
- package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
- package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
- package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
- package/build/ox_modules/module-mob/commands/assertText.js +1 -3
- package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
- package/build/ox_modules/module-mob/commands/back.js +1 -2
- package/build/ox_modules/module-mob/commands/clear.js +1 -4
- package/build/ox_modules/module-mob/commands/click.js +3 -4
- package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
- package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
- package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
- package/build/ox_modules/module-mob/commands/debug.js +2 -2
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
- package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
- package/build/ox_modules/module-mob/commands/execute.js +1 -2
- package/build/ox_modules/module-mob/commands/findElement.js +1 -3
- package/build/ox_modules/module-mob/commands/findElements.js +1 -4
- package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
- package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
- package/build/ox_modules/module-mob/commands/getSource.js +1 -2
- package/build/ox_modules/module-mob/commands/getText.js +1 -4
- package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
- package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
- package/build/ox_modules/module-mob/commands/getValue.js +5 -9
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
- package/build/ox_modules/module-mob/commands/index.js +19 -94
- package/build/ox_modules/module-mob/commands/installApp.js +1 -2
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
- package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
- package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
- package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
- package/build/ox_modules/module-mob/commands/isExist.js +1 -3
- package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
- package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
- package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
- package/build/ox_modules/module-mob/commands/open.js +1 -3
- package/build/ox_modules/module-mob/commands/pause.js +1 -2
- package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
- package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
- package/build/ox_modules/module-mob/commands/select.js +1 -4
- package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
- package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
- package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
- package/build/ox_modules/module-mob/commands/setContext.js +1 -2
- package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
- package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
- package/build/ox_modules/module-mob/commands/shake.js +1 -2
- package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
- package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
- package/build/ox_modules/module-mob/commands/swipe.js +1 -2
- package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
- package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
- package/build/ox_modules/module-mob/commands/tap.js +1 -2
- package/build/ox_modules/module-mob/commands/type.js +3 -7
- package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
- package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
- package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-mob.js +72 -142
- package/build/ox_modules/module-pdf.js +23 -62
- package/build/ox_modules/module-proxy.js +8 -68
- package/build/ox_modules/module-serial.js +7 -32
- package/build/ox_modules/module-shell.js +8 -27
- package/build/ox_modules/module-soap.js +14 -47
- package/build/ox_modules/module-twilio.js +10 -53
- package/build/ox_modules/module-utils.js +16 -51
- package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
- package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
- package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
- package/build/ox_modules/module-web/commands/assertExist.js +1 -2
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
- package/build/ox_modules/module-web/commands/assertText.js +1 -3
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
- package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
- package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
- package/build/ox_modules/module-web/commands/assertValue.js +1 -3
- package/build/ox_modules/module-web/commands/back.js +1 -2
- package/build/ox_modules/module-web/commands/clear.js +1 -5
- package/build/ox_modules/module-web/commands/click.js +4 -13
- package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
- package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/debug.js +2 -2
- package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
- package/build/ox_modules/module-web/commands/deselect.js +1 -2
- package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
- package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
- package/build/ox_modules/module-web/commands/execute.js +1 -2
- package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
- package/build/ox_modules/module-web/commands/findElement.js +1 -3
- package/build/ox_modules/module-web/commands/findElements.js +1 -4
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
- package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
- package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
- package/build/ox_modules/module-web/commands/getCookies.js +1 -2
- package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
- package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
- package/build/ox_modules/module-web/commands/getHTML.js +1 -2
- package/build/ox_modules/module-web/commands/getSource.js +1 -2
- package/build/ox_modules/module-web/commands/getText.js +1 -4
- package/build/ox_modules/module-web/commands/getTitle.js +1 -2
- package/build/ox_modules/module-web/commands/getUrl.js +1 -2
- package/build/ox_modules/module-web/commands/getValue.js +1 -5
- package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
- package/build/ox_modules/module-web/commands/index.js +26 -99
- package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
- package/build/ox_modules/module-web/commands/isChecked.js +1 -2
- package/build/ox_modules/module-web/commands/isExist.js +1 -3
- package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
- package/build/ox_modules/module-web/commands/isSelected.js +1 -2
- package/build/ox_modules/module-web/commands/isVisible.js +1 -3
- package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
- package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/newWindow.js +1 -2
- package/build/ox_modules/module-web/commands/open.js +1 -4
- package/build/ox_modules/module-web/commands/pause.js +1 -2
- package/build/ox_modules/module-web/commands/point.js +1 -2
- package/build/ox_modules/module-web/commands/pointJS.js +2 -8
- package/build/ox_modules/module-web/commands/refresh.js +1 -2
- package/build/ox_modules/module-web/commands/rightClick.js +3 -8
- package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
- package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
- package/build/ox_modules/module-web/commands/select.js +1 -5
- package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
- package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
- package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
- package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
- package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
- package/build/ox_modules/module-web/commands/type.js +1 -5
- package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
- package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
- package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
- package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
- package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
- package/build/ox_modules/module-web/commands/waitForText.js +3 -5
- package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
- package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
- package/build/ox_modules/module-web.js +86 -192
- package/build/ox_modules/module-win/commands/assertText.js +1 -3
- package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-win/commands/assertValue.js +9 -15
- package/build/ox_modules/module-win/commands/back.js +1 -2
- package/build/ox_modules/module-win/commands/clear.js +1 -4
- package/build/ox_modules/module-win/commands/click.js +1 -2
- package/build/ox_modules/module-win/commands/clickLong.js +1 -2
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
- package/build/ox_modules/module-win/commands/findElement.js +1 -3
- package/build/ox_modules/module-win/commands/findElements.js +1 -4
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
- package/build/ox_modules/module-win/commands/getLocation.js +1 -2
- package/build/ox_modules/module-win/commands/getSource.js +1 -2
- package/build/ox_modules/module-win/commands/getText.js +1 -4
- package/build/ox_modules/module-win/commands/getValue.js +5 -9
- package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-win/commands/index.js +5 -43
- package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
- package/build/ox_modules/module-win/commands/isChecked.js +1 -2
- package/build/ox_modules/module-win/commands/isClickable.js +1 -2
- package/build/ox_modules/module-win/commands/isExist.js +1 -3
- package/build/ox_modules/module-win/commands/isSelected.js +1 -2
- package/build/ox_modules/module-win/commands/isVisible.js +1 -3
- package/build/ox_modules/module-win/commands/open.js +1 -2
- package/build/ox_modules/module-win/commands/pause.js +1 -2
- package/build/ox_modules/module-win/commands/rightClick.js +1 -2
- package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
- package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
- package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
- package/build/ox_modules/module-win/commands/tap.js +1 -2
- package/build/ox_modules/module-win/commands/type.js +1 -4
- package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
- package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-win.js +48 -87
- package/build/ox_modules/utils.js +22 -76
- package/build/ox_reporters/reporter-excel.js +1 -58
- package/build/ox_reporters/reporter-html.js +1 -28
- package/build/ox_reporters/reporter-json.js +1 -14
- package/build/ox_reporters/reporter-junit.js +1 -24
- package/build/ox_reporters/reporter-pdf.js +1 -19
- package/build/ox_reporters/reporter-xml.js +1 -17
- package/build/ox_services/service-devtools/submodule-network.js +3 -84
- package/build/ox_services/service-devtools.js +1 -23
- package/build/reporter/FileReporterBase.js +5 -44
- package/build/reporter/ReportAggregator.js +1 -65
- package/build/reporter/ReporterBase.js +1 -6
- package/build/runners/WorkerProcess.js +1 -99
- package/build/runners/cucumber/CucumberEventListener.js +4 -29
- package/build/runners/cucumber/CucumberReporter.js +1 -56
- package/build/runners/cucumber/CucumberWorker.js +1 -66
- package/build/runners/cucumber/index.js +1 -30
- package/build/runners/cucumber/worker.js +1 -18
- package/build/runners/index.js +1 -6
- package/build/runners/oxygen/OxygenWorker.js +20 -54
- package/build/runners/oxygen/index.js +17 -177
- package/build/runners/oxygen/worker.js +2 -25
- package/package.json +28 -29
|
@@ -10,47 +10,27 @@ Object.defineProperty(exports, "ParameterManager", {
|
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
exports.default = void 0;
|
|
13
|
-
|
|
14
13
|
require("source-map-support/register");
|
|
15
|
-
|
|
16
14
|
var _logger = _interopRequireDefault(require("../../lib/logger"));
|
|
17
|
-
|
|
18
15
|
var _events = require("events");
|
|
19
|
-
|
|
20
16
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
21
|
-
|
|
22
17
|
var _when = require("when");
|
|
23
|
-
|
|
24
18
|
var _path = _interopRequireDefault(require("path"));
|
|
25
|
-
|
|
26
19
|
var _suiteResult = _interopRequireDefault(require("../../model/suite-result"));
|
|
27
|
-
|
|
28
20
|
var _caseResult = _interopRequireDefault(require("../../model/case-result"));
|
|
29
|
-
|
|
30
21
|
var _testResult = _interopRequireDefault(require("../../model/test-result"));
|
|
31
|
-
|
|
32
22
|
var _status = _interopRequireDefault(require("../../model/status"));
|
|
33
|
-
|
|
34
23
|
var _util = _interopRequireDefault(require("../../lib/util"));
|
|
35
|
-
|
|
36
24
|
var _helper = _interopRequireDefault(require("../../errors/helper"));
|
|
37
|
-
|
|
38
25
|
var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
|
|
39
|
-
|
|
40
26
|
var _paramManager = _interopRequireDefault(require("../../lib/param-manager.js"));
|
|
41
|
-
|
|
42
27
|
var _WorkerProcess = _interopRequireDefault(require("../WorkerProcess"));
|
|
43
|
-
|
|
44
28
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
45
|
-
|
|
46
29
|
const log = (0, _logger.default)('OxygenRunner');
|
|
47
30
|
const DEFAULT_ISSUER = 'user';
|
|
48
|
-
|
|
49
31
|
const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
50
|
-
|
|
51
32
|
const getSuitesBreakpoints = suites => {
|
|
52
33
|
const retval = [];
|
|
53
|
-
|
|
54
34
|
if (suites && Array.isArray(suites) && suites.length > 0) {
|
|
55
35
|
suites.map(suite => {
|
|
56
36
|
if (suite && suite.cases && Array.isArray(suite.cases) && suite.cases.length > 0) {
|
|
@@ -64,10 +44,8 @@ const getSuitesBreakpoints = suites => {
|
|
|
64
44
|
}
|
|
65
45
|
});
|
|
66
46
|
}
|
|
67
|
-
|
|
68
47
|
return retval;
|
|
69
48
|
};
|
|
70
|
-
|
|
71
49
|
const removeBreakpointFromSuites = (suites, removeBreakpoint) => {
|
|
72
50
|
if (suites && Array.isArray(suites) && suites.length > 0) {
|
|
73
51
|
suites.map(suite => {
|
|
@@ -85,7 +63,6 @@ const removeBreakpointFromSuites = (suites, removeBreakpoint) => {
|
|
|
85
63
|
});
|
|
86
64
|
}
|
|
87
65
|
};
|
|
88
|
-
|
|
89
66
|
class OxygenRunner extends _events.EventEmitter {
|
|
90
67
|
constructor(options) {
|
|
91
68
|
super();
|
|
@@ -97,11 +74,9 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
97
74
|
this._debugMode = false;
|
|
98
75
|
this._workerProcLastError = null;
|
|
99
76
|
this._npmGRootExecution = true;
|
|
100
|
-
|
|
101
77
|
if (options && typeof options.npmGRootExecution !== 'undefined') {
|
|
102
78
|
this._npmGRootExecution = options.npmGRootExecution;
|
|
103
79
|
}
|
|
104
|
-
|
|
105
80
|
this._suite;
|
|
106
81
|
this._envVars = {};
|
|
107
82
|
this._vars = {};
|
|
@@ -113,40 +88,36 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
113
88
|
this._scriptContentLineOffset = 3;
|
|
114
89
|
this._whenDisposed = (0, _when.defer)();
|
|
115
90
|
}
|
|
116
|
-
|
|
117
91
|
async init(options, caps = {}, reporter) {
|
|
118
92
|
if (!options.suites) {
|
|
119
93
|
throw new Error('Initialization failed - no test suites are defined. You must define "suites" property in Oxygen options.');
|
|
120
94
|
}
|
|
121
|
-
|
|
122
95
|
this._options = options;
|
|
123
96
|
this._cwd = this._options.cwd || process.cwd();
|
|
124
97
|
this._reporter = reporter;
|
|
125
98
|
this._isInitialized = true;
|
|
126
|
-
|
|
127
99
|
if (options) {
|
|
128
100
|
let optEnv = {};
|
|
129
|
-
|
|
130
101
|
if (options.env) {
|
|
131
102
|
if (typeof options.env === 'string' && typeof options.envs === 'object' && options.envs[options.env]) {
|
|
132
103
|
optEnv = options.envs[options.env];
|
|
133
104
|
} else if (typeof options.env === 'object' && Object.keys(options.env)) {
|
|
134
|
-
|
|
135
|
-
|
|
105
|
+
optEnv = options.env;
|
|
106
|
+
}
|
|
136
107
|
}
|
|
137
|
-
|
|
138
108
|
if (options.envVars && Object.keys(options.envVars)) {
|
|
139
|
-
optEnv = {
|
|
109
|
+
optEnv = {
|
|
110
|
+
...optEnv,
|
|
140
111
|
...options.envVars
|
|
141
112
|
};
|
|
142
113
|
}
|
|
143
|
-
|
|
144
|
-
|
|
114
|
+
this._env = {
|
|
115
|
+
...this._env,
|
|
145
116
|
...optEnv
|
|
146
117
|
};
|
|
147
118
|
}
|
|
148
|
-
|
|
149
|
-
|
|
119
|
+
this._caps = {
|
|
120
|
+
...caps
|
|
150
121
|
};
|
|
151
122
|
this._suites = [...options.suites];
|
|
152
123
|
this._debugMode = options.debugPortIde || options.debugPort ? true : false;
|
|
@@ -156,10 +127,8 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
156
127
|
await this._startWorkerProcess();
|
|
157
128
|
await this._worker_InitOxygen();
|
|
158
129
|
}
|
|
159
|
-
|
|
160
130
|
async dispose(status = null) {
|
|
161
131
|
this._isDisposing = true;
|
|
162
|
-
|
|
163
132
|
try {
|
|
164
133
|
if (this._worker && this._worker.isRunning) {
|
|
165
134
|
await this._worker.stop(status);
|
|
@@ -168,63 +137,47 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
168
137
|
console.log('runner dispose e', e);
|
|
169
138
|
log.warn('Error when disposing Runner:', e);
|
|
170
139
|
}
|
|
171
|
-
|
|
172
140
|
if (status !== 'CANCELED') {
|
|
173
141
|
this._resetGlobalVariables();
|
|
174
142
|
}
|
|
175
143
|
}
|
|
176
|
-
|
|
177
144
|
async run() {
|
|
178
145
|
if (this._isInitializing) {
|
|
179
146
|
throw new Error("Initialization hasn't been completed yet, wait for 'initialized' event");
|
|
180
147
|
}
|
|
181
|
-
|
|
182
148
|
if (this._isRunning) {
|
|
183
149
|
throw new Error("Previous test is still running, wait for 'test-ended' event");
|
|
184
150
|
}
|
|
185
|
-
|
|
186
151
|
this._isRunning = true;
|
|
187
|
-
|
|
188
152
|
this._reporter.onRunnerStart(this._id, this._options, this._caps);
|
|
189
|
-
|
|
190
153
|
let error = null;
|
|
191
154
|
let result = null;
|
|
192
|
-
|
|
193
155
|
try {
|
|
194
156
|
result = await this._runTest();
|
|
195
157
|
} catch (e) {
|
|
196
158
|
error = e;
|
|
197
159
|
}
|
|
198
|
-
|
|
199
160
|
if (!error && result && result.failure) {
|
|
200
161
|
error = result.failure;
|
|
201
162
|
}
|
|
202
|
-
|
|
203
163
|
this._reporter.onRunnerEnd(this._id, result, error);
|
|
204
|
-
|
|
205
164
|
this._isRunning = false;
|
|
206
|
-
|
|
207
165
|
if (error) {
|
|
208
166
|
throw error;
|
|
209
167
|
}
|
|
210
|
-
|
|
211
168
|
return result;
|
|
212
169
|
}
|
|
213
|
-
|
|
214
170
|
async kill(status = null) {
|
|
215
171
|
this._testKilled = true;
|
|
216
|
-
|
|
217
172
|
if (this._worker && this._worker.isRunning) {
|
|
218
173
|
await this._worker.kill(status);
|
|
219
174
|
}
|
|
220
175
|
}
|
|
221
|
-
|
|
222
176
|
debugContinue() {
|
|
223
177
|
if (this._debugMode && this._worker) {
|
|
224
178
|
this._worker.debugger.continue();
|
|
225
179
|
}
|
|
226
180
|
}
|
|
227
|
-
|
|
228
181
|
async updateBreakpoints(breakpoints, filePath) {
|
|
229
182
|
try {
|
|
230
183
|
if (this._worker && this._worker.debugger && this._worker.debugger.setBreakpointsActive) {
|
|
@@ -233,41 +186,32 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
233
186
|
await snooze(500);
|
|
234
187
|
return await this.updateBreakpoints(breakpoints, filePath);
|
|
235
188
|
}
|
|
236
|
-
|
|
237
189
|
if (this._debugMode && this._worker.debugger) {
|
|
238
190
|
let promises = [];
|
|
239
|
-
|
|
240
191
|
const tsBreakpoints = this._worker.debugger.getBreakpoints(filePath);
|
|
241
|
-
|
|
242
192
|
const suitesBreakpoints = getSuitesBreakpoints(this._suites);
|
|
243
|
-
|
|
244
193
|
for (var suiteBp of suitesBreakpoints) {
|
|
245
194
|
if (!breakpoints.includes(suiteBp.line) && filePath === suiteBp.file) {
|
|
246
195
|
removeBreakpointFromSuites(this._suites, suiteBp);
|
|
247
196
|
}
|
|
248
197
|
}
|
|
249
|
-
|
|
250
198
|
for (var actualCurrentBp of tsBreakpoints) {
|
|
251
199
|
if (!breakpoints.includes(actualCurrentBp)) {
|
|
252
200
|
promises.push(this._worker.debugger.removeBreakpointByValue(filePath, actualCurrentBp));
|
|
253
201
|
}
|
|
254
202
|
}
|
|
255
|
-
|
|
256
203
|
for (var userSetBp of breakpoints) {
|
|
257
204
|
if (!tsBreakpoints.includes(userSetBp)) {
|
|
258
205
|
promises.push(this._worker.debugger.setBreakpoint(filePath, userSetBp));
|
|
259
206
|
}
|
|
260
207
|
}
|
|
261
|
-
|
|
262
208
|
let promiseAllPromise = await Promise.all(promises).then(value => {
|
|
263
209
|
return value;
|
|
264
210
|
});
|
|
265
211
|
await this._worker.debugger.setBreakpointsActive(true);
|
|
266
212
|
await snooze(500);
|
|
267
213
|
log.debug('updateBreakpoints() done.');
|
|
268
|
-
|
|
269
214
|
const breakpointsAferManipulations = this._worker.debugger.getBreakpoints(filePath);
|
|
270
|
-
|
|
271
215
|
return {
|
|
272
216
|
promiseAllPromise: promiseAllPromise,
|
|
273
217
|
breakpointsAferManipulations: breakpointsAferManipulations
|
|
@@ -279,14 +223,12 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
279
223
|
log.error('Debugger error', e);
|
|
280
224
|
}
|
|
281
225
|
}
|
|
282
|
-
|
|
283
226
|
async replClose() {
|
|
284
227
|
await this._worker._send({
|
|
285
228
|
event: 'repl',
|
|
286
229
|
name: 'repl_stop'
|
|
287
230
|
});
|
|
288
231
|
}
|
|
289
|
-
|
|
290
232
|
async replSend(cmd) {
|
|
291
233
|
await this._worker._send({
|
|
292
234
|
event: 'repl',
|
|
@@ -296,15 +238,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
296
238
|
}
|
|
297
239
|
});
|
|
298
240
|
}
|
|
299
|
-
|
|
300
241
|
async replStart() {
|
|
301
242
|
await this._worker.invoke('replStart');
|
|
302
243
|
}
|
|
303
|
-
|
|
304
244
|
setBreakpoint(line) {}
|
|
305
|
-
|
|
306
245
|
clearBreakpoint(line) {}
|
|
307
|
-
|
|
308
246
|
async _runTest() {
|
|
309
247
|
const result = new _testResult.default();
|
|
310
248
|
result.startTime = _util.default.getTimeStamp();
|
|
@@ -312,7 +250,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
312
250
|
result.suites = [];
|
|
313
251
|
let error = null;
|
|
314
252
|
await this._worker_callBeforeTestHook();
|
|
315
|
-
|
|
316
253
|
try {
|
|
317
254
|
for (let suite of this._suites) {
|
|
318
255
|
const suiteResult = await this._runSuite(suite);
|
|
@@ -321,7 +258,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
321
258
|
} catch (e) {
|
|
322
259
|
error = e;
|
|
323
260
|
}
|
|
324
|
-
|
|
325
261
|
result.endTime = _util.default.getTimeStamp();
|
|
326
262
|
result.duration = result.endTime - result.startTime;
|
|
327
263
|
const hasFailedSuites = result.suites.some(suiteIterations => {
|
|
@@ -330,49 +266,42 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
330
266
|
}
|
|
331
267
|
});
|
|
332
268
|
result.status = hasFailedSuites ? _status.default.FAILED : _status.default.PASSED;
|
|
333
|
-
result.environment = {
|
|
269
|
+
result.environment = {
|
|
270
|
+
...this._env
|
|
334
271
|
};
|
|
335
|
-
result.capabilities = {
|
|
272
|
+
result.capabilities = {
|
|
273
|
+
...this._caps,
|
|
336
274
|
...this._modCaps
|
|
337
275
|
};
|
|
338
|
-
result.options = {
|
|
276
|
+
result.options = {
|
|
277
|
+
...this._options
|
|
339
278
|
};
|
|
340
|
-
|
|
341
279
|
if (error) {
|
|
342
280
|
result.failure = _helper.default.getFailureFromError(error);
|
|
343
281
|
result.status = _status.default.FAILED;
|
|
344
282
|
}
|
|
345
|
-
|
|
346
283
|
await this._worker_callAfterTestHook(result);
|
|
347
284
|
return result;
|
|
348
285
|
}
|
|
349
|
-
|
|
350
286
|
async _runSuite(suite) {
|
|
351
287
|
if (!suite) {
|
|
352
288
|
log.error('suite is null in _runSuite()!!!');
|
|
353
289
|
}
|
|
354
|
-
|
|
355
290
|
if (!suite.name && !suite.path) {
|
|
356
291
|
return [];
|
|
357
292
|
}
|
|
358
|
-
|
|
359
293
|
if (!suite.iterationCount) {
|
|
360
294
|
suite.iterationCount = 1;
|
|
361
295
|
}
|
|
362
|
-
|
|
363
296
|
let showSuiteIterationsMessages = false;
|
|
364
|
-
|
|
365
297
|
if (suite.iterationCount > 1) {
|
|
366
298
|
showSuiteIterationsMessages = true;
|
|
367
299
|
}
|
|
368
|
-
|
|
369
300
|
const suiteIterations = [];
|
|
370
|
-
|
|
371
301
|
for (let suiteIteration = 1; suiteIteration <= suite.iterationCount; suiteIteration++) {
|
|
372
302
|
if (showSuiteIterationsMessages) {
|
|
373
303
|
this._reporter.onIterationStart(this._id, suiteIteration, 'Suite');
|
|
374
304
|
}
|
|
375
|
-
|
|
376
305
|
const suiteResult = new _suiteResult.default();
|
|
377
306
|
suiteIterations.push(suiteResult);
|
|
378
307
|
suiteResult.name = suite.name || _util.default.getFileNameWithoutExt(suite.path);
|
|
@@ -380,110 +309,79 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
380
309
|
suiteResult.iterationNum = suiteIteration;
|
|
381
310
|
suiteResult.status = _status.default.PASSED;
|
|
382
311
|
await this._worker_callBeforeSuiteHook(suite);
|
|
383
|
-
|
|
384
312
|
this._reporter.onSuiteStart(this._id, suite.uri, suiteResult);
|
|
385
|
-
|
|
386
313
|
for (let caze of suite.cases) {
|
|
387
314
|
if (!caze.path) {
|
|
388
315
|
continue;
|
|
389
316
|
}
|
|
390
|
-
|
|
391
317
|
if (!caze.name) {
|
|
392
318
|
caze.name = _util.default.getFileNameWithoutExt(caze.path);
|
|
393
319
|
}
|
|
394
|
-
|
|
395
320
|
if (!caze.iterationCount) {
|
|
396
321
|
caze.iterationCount = 1;
|
|
397
322
|
}
|
|
398
|
-
|
|
399
323
|
for (let caseIteration = 1; caseIteration <= caze.iterationCount; caseIteration++) {
|
|
400
324
|
let showCaseIterationsMessages = false;
|
|
401
|
-
|
|
402
325
|
if (caze && caze.iterationCount && caze.iterationCount > 1) {
|
|
403
326
|
showCaseIterationsMessages = true;
|
|
404
327
|
}
|
|
405
|
-
|
|
406
328
|
if (showCaseIterationsMessages) {
|
|
407
329
|
this._reporter.onIterationStart(this._id, caseIteration, 'Case');
|
|
408
330
|
}
|
|
409
|
-
|
|
410
331
|
let reRunCount = 0;
|
|
411
332
|
let caseResult = await this._runCase(suite, caze, suiteIteration, caseIteration, false);
|
|
412
|
-
|
|
413
333
|
if (!caseResult) {
|
|
414
334
|
continue;
|
|
415
335
|
}
|
|
416
|
-
|
|
417
336
|
if (caseResult.status === _status.default.FAILED && this._options.reRunOnFailed && reRunCount === 0) {
|
|
418
337
|
reRunCount = 1;
|
|
419
338
|
await (this._worker && this._worker_DisposeModules('passed'));
|
|
420
339
|
caseResult = await this._runCase(suite, caze, suiteIteration, caseIteration, true);
|
|
421
|
-
|
|
422
340
|
if (!caseResult) {
|
|
423
341
|
continue;
|
|
424
342
|
}
|
|
425
343
|
}
|
|
426
|
-
|
|
427
344
|
caseResult.reRunCount = reRunCount;
|
|
428
|
-
|
|
429
345
|
if (showCaseIterationsMessages) {
|
|
430
346
|
this._reporter.onIterationEnd(this._id, caseResult, 'Case');
|
|
431
347
|
}
|
|
432
|
-
|
|
433
348
|
await this._worker_callAfterCaseHook(caze, caseResult);
|
|
434
|
-
|
|
435
349
|
this._reporter.onCaseEnd(this._id, suite.uri || suite.id, caze.uri || caze.id, caseResult);
|
|
436
|
-
|
|
437
350
|
if (typeof this._options.autoDispose !== 'boolean' || this._options.autoDispose === true) {
|
|
438
351
|
await (this._worker && this._worker_DisposeModules(caseResult.status));
|
|
439
352
|
}
|
|
440
|
-
|
|
441
353
|
suiteResult.cases.push(caseResult);
|
|
442
|
-
|
|
443
354
|
if (caseResult.status === _status.default.FAILED) {
|
|
444
355
|
suiteResult.status = _status.default.FAILED;
|
|
445
356
|
}
|
|
446
357
|
}
|
|
447
358
|
}
|
|
448
|
-
|
|
449
359
|
suiteResult.endTime = _util.default.getTimeStamp();
|
|
450
360
|
suiteResult.duration = suiteResult.endTime - suiteResult.startTime;
|
|
451
|
-
|
|
452
361
|
if (showSuiteIterationsMessages) {
|
|
453
362
|
this._reporter.onIterationEnd(this._id, suiteResult, 'Suite');
|
|
454
363
|
}
|
|
455
|
-
|
|
456
364
|
await this._worker_callAfterSuiteHook(suite, suiteResult);
|
|
457
|
-
|
|
458
365
|
this._reporter.onSuiteEnd(this._id, suite.uri, suiteResult);
|
|
459
366
|
}
|
|
460
|
-
|
|
461
367
|
return suiteIterations;
|
|
462
368
|
}
|
|
463
|
-
|
|
464
369
|
async _runCase(suite, caze, suiteIteration, caseIteration, reRun = false) {
|
|
465
370
|
const params = {};
|
|
466
|
-
|
|
467
371
|
if (suite.paramManager) {
|
|
468
372
|
if (reRun) {
|
|
469
373
|
suite.paramManager.readPrev();
|
|
470
374
|
}
|
|
471
|
-
|
|
472
375
|
_lodash.default.extend(params, suite.paramManager.getValues());
|
|
473
|
-
|
|
474
376
|
suite.paramManager.readNext();
|
|
475
377
|
}
|
|
476
|
-
|
|
477
378
|
if (caze.paramManager) {
|
|
478
379
|
if (reRun) {
|
|
479
380
|
caze.paramManager.readPrev();
|
|
480
381
|
}
|
|
481
|
-
|
|
482
382
|
_lodash.default.extend(params, caze.paramManager.getValues());
|
|
483
|
-
|
|
484
383
|
caze.paramManager.readNext();
|
|
485
384
|
}
|
|
486
|
-
|
|
487
385
|
if (this._debugMode && this._worker && this._worker.debugger && caze.breakpoints) {
|
|
488
386
|
for (let i = 0; i < caze.breakpoints.length; i++) {
|
|
489
387
|
let line = caze.breakpoints[i].line;
|
|
@@ -491,16 +389,12 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
491
389
|
await this._worker.debugger.setBreakpoint(file, line);
|
|
492
390
|
}
|
|
493
391
|
}
|
|
494
|
-
|
|
495
392
|
await this._worker_callBeforeCaseHook(caze);
|
|
496
|
-
|
|
497
393
|
this._reporter.onCaseStart(this._id, suite.uri || suite.id, caze.uri || caze.id || caze.path, caze);
|
|
498
|
-
|
|
499
394
|
const caseResult = new _caseResult.default();
|
|
500
395
|
caseResult.name = caze.name;
|
|
501
396
|
caseResult.location = caze.path;
|
|
502
397
|
caseResult.iterationNum = caseIteration;
|
|
503
|
-
|
|
504
398
|
try {
|
|
505
399
|
await (!this._worker && this._worker_InitOxygen());
|
|
506
400
|
} catch (e) {
|
|
@@ -509,15 +403,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
509
403
|
caseResult.duration = 0;
|
|
510
404
|
caseResult.failure = _helper.default.getFailureFromError(e);
|
|
511
405
|
caseResult.status = _status.default.FAILED;
|
|
512
|
-
|
|
513
406
|
this._reporter.onCaseEnd(this._id, suite.uri || suite.id, caze.uri || caze.id, caseResult);
|
|
514
|
-
|
|
515
407
|
return caseResult;
|
|
516
408
|
}
|
|
517
|
-
|
|
518
409
|
try {
|
|
519
410
|
caseResult.startTime = _util.default.getTimeStamp();
|
|
520
|
-
|
|
521
411
|
if (this._worker) {
|
|
522
412
|
const {
|
|
523
413
|
resultStore,
|
|
@@ -525,27 +415,22 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
525
415
|
moduleCaps,
|
|
526
416
|
error
|
|
527
417
|
} = await this._worker_Run(suite, caze, suiteIteration, caseIteration, params);
|
|
528
|
-
|
|
529
418
|
this._processTestResults({
|
|
530
419
|
resultStore,
|
|
531
420
|
context,
|
|
532
421
|
error,
|
|
533
422
|
moduleCaps
|
|
534
423
|
});
|
|
535
|
-
|
|
536
424
|
caseResult.endTime = _util.default.getTimeStamp();
|
|
537
425
|
caseResult.duration = caseResult.endTime - caseResult.startTime;
|
|
538
426
|
caseResult.context = context;
|
|
539
427
|
caseResult.steps = resultStore && resultStore.steps ? resultStore.steps : [];
|
|
540
428
|
caseResult.logs = resultStore && resultStore.logs ? resultStore.logs : [];
|
|
541
429
|
caseResult.har = resultStore && resultStore.har ? resultStore.har : null;
|
|
542
|
-
|
|
543
430
|
var failedSteps = _lodash.default.find(caseResult.steps, {
|
|
544
431
|
status: _status.default.FAILED
|
|
545
432
|
});
|
|
546
|
-
|
|
547
433
|
caseResult.status = _lodash.default.isEmpty(failedSteps) && !error ? _status.default.PASSED : _status.default.FAILED;
|
|
548
|
-
|
|
549
434
|
if (error) {
|
|
550
435
|
caseResult.failure = error;
|
|
551
436
|
caseResult.status = _status.default.FAILED;
|
|
@@ -559,21 +444,16 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
559
444
|
caseResult.failure = _helper.default.getFailureFromError(e);
|
|
560
445
|
caseResult.status = _status.default.FAILED;
|
|
561
446
|
}
|
|
562
|
-
|
|
563
447
|
return caseResult;
|
|
564
448
|
}
|
|
565
|
-
|
|
566
449
|
async _worker_Run(suite, caze, suiteIteration, caseIteration, params) {
|
|
567
450
|
if (!this._worker) {
|
|
568
451
|
log.error('_worker is null but not suppose to!');
|
|
569
|
-
|
|
570
452
|
if (this._whenTestCaseFinished) {
|
|
571
453
|
this._whenTestCaseFinished.reject(new Error('_worker is null'));
|
|
572
454
|
}
|
|
573
|
-
|
|
574
455
|
return;
|
|
575
456
|
}
|
|
576
|
-
|
|
577
457
|
return await this._worker.run({
|
|
578
458
|
scriptName: caze.name,
|
|
579
459
|
scriptPath: caze.path,
|
|
@@ -596,17 +476,14 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
596
476
|
poFile: this._options.po || null
|
|
597
477
|
});
|
|
598
478
|
}
|
|
599
|
-
|
|
600
479
|
async _worker_InitOxygen() {
|
|
601
480
|
await (this._worker && this._worker.init(this._id, this._options, this._caps));
|
|
602
481
|
}
|
|
603
|
-
|
|
604
482
|
async _worker_DisposeModules(status = null) {
|
|
605
483
|
if (this._worker && this._worker.disposeModules) {
|
|
606
484
|
await this._worker.disposeModules(status);
|
|
607
485
|
}
|
|
608
486
|
}
|
|
609
|
-
|
|
610
487
|
async _worker_callBeforeTestHook() {
|
|
611
488
|
try {
|
|
612
489
|
if (this && this._worker && this._worker.invokeTestHook) {
|
|
@@ -617,7 +494,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
617
494
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeTest" hook failed:' + e, DEFAULT_ISSUER);
|
|
618
495
|
}
|
|
619
496
|
}
|
|
620
|
-
|
|
621
497
|
async _worker_callBeforeSuiteHook(suite) {
|
|
622
498
|
try {
|
|
623
499
|
if (this && this._worker && this._worker.invokeTestHook) {
|
|
@@ -628,7 +504,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
628
504
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeSuite" hook failed:' + e, DEFAULT_ISSUER);
|
|
629
505
|
}
|
|
630
506
|
}
|
|
631
|
-
|
|
632
507
|
async _worker_callBeforeCaseHook(caze) {
|
|
633
508
|
try {
|
|
634
509
|
await (this._worker && this._worker.invokeTestHook('beforeCase', [caze]));
|
|
@@ -637,7 +512,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
637
512
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeCase" hook failed:' + e, DEFAULT_ISSUER);
|
|
638
513
|
}
|
|
639
514
|
}
|
|
640
|
-
|
|
641
515
|
async _worker_callAfterTestHook(result) {
|
|
642
516
|
try {
|
|
643
517
|
await (this._worker && this._worker.invokeTestHook('afterTest', [this._id, result]));
|
|
@@ -646,7 +520,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
646
520
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterTest" hook failed:' + e, DEFAULT_ISSUER);
|
|
647
521
|
}
|
|
648
522
|
}
|
|
649
|
-
|
|
650
523
|
async _worker_callAfterSuiteHook(suite, result) {
|
|
651
524
|
try {
|
|
652
525
|
await (this._worker && this._worker.invokeTestHook('afterSuite', [suite, result]));
|
|
@@ -655,7 +528,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
655
528
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterSuite" hook failed:' + e, DEFAULT_ISSUER);
|
|
656
529
|
}
|
|
657
530
|
}
|
|
658
|
-
|
|
659
531
|
async _worker_callAfterCaseHook(caze, result) {
|
|
660
532
|
try {
|
|
661
533
|
await (this._worker && this._worker.invokeTestHook('afterCase', [caze, result]));
|
|
@@ -664,69 +536,51 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
664
536
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterCase" hook failed:' + e, DEFAULT_ISSUER);
|
|
665
537
|
}
|
|
666
538
|
}
|
|
667
|
-
|
|
668
539
|
async _startWorkerProcess() {
|
|
669
540
|
const workerPath = _path.default.join(__dirname, 'worker.js');
|
|
670
|
-
|
|
671
541
|
this._worker = new _WorkerProcess.default(this._id, workerPath, this._debugMode, this._debugPort, 'Oxygen', this._npmGRootExecution);
|
|
672
542
|
await this._worker.start();
|
|
673
|
-
|
|
674
543
|
this._hookWorkerEvents();
|
|
675
|
-
|
|
676
544
|
await this._worker.startDebugger();
|
|
677
|
-
|
|
678
545
|
this._hookWorkerDebuggerEvents();
|
|
679
546
|
}
|
|
680
|
-
|
|
681
547
|
_hookWorkerEvents() {
|
|
682
548
|
const _this = this;
|
|
683
|
-
|
|
684
549
|
this._worker.subscribe('command:before', this._handleBeforeCommand.bind(this));
|
|
685
|
-
|
|
686
550
|
this._worker.subscribe('command:after', this._handleAfterCommand.bind(this));
|
|
687
|
-
|
|
688
551
|
this._worker.on('error', payload => {
|
|
689
552
|
const {
|
|
690
553
|
error
|
|
691
554
|
} = payload;
|
|
692
555
|
log.error('Worker process error: ', error);
|
|
693
|
-
|
|
694
556
|
if (this.exitDone) {
|
|
695
557
|
this.emit('test-error', error);
|
|
696
558
|
} else {
|
|
697
559
|
_this._workerProcLastError = error;
|
|
698
560
|
}
|
|
699
561
|
});
|
|
700
|
-
|
|
701
562
|
this._worker.on('exit', payload => {
|
|
702
563
|
this.exitDone = true;
|
|
703
564
|
const {
|
|
704
565
|
exitCode
|
|
705
566
|
} = payload;
|
|
706
|
-
|
|
707
567
|
if (exitCode && exitCode !== 0) {
|
|
708
568
|
let promise = null;
|
|
709
|
-
|
|
710
569
|
if (_this._isDisposing) {
|
|
711
570
|
promise = _this._whenDisposed;
|
|
712
571
|
} else if (_this._isRunning) {
|
|
713
572
|
promise = _this._whenTestCaseFinished;
|
|
714
573
|
}
|
|
715
|
-
|
|
716
574
|
let error = _this._workerProcLastError || null;
|
|
717
|
-
|
|
718
575
|
if (exitCode == 134) {
|
|
719
576
|
error = new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, 'Out of memory error. Make sure that you don\'t have any memory leaks in the test script.');
|
|
720
577
|
} else if (!error) {
|
|
721
578
|
error = new _OxygenError.default(`Worker process exited with code: ${exitCode}.`);
|
|
722
579
|
}
|
|
723
|
-
|
|
724
580
|
promise && promise.reject(error);
|
|
725
|
-
|
|
726
581
|
_this._resetGlobalVariables();
|
|
727
582
|
}
|
|
728
583
|
});
|
|
729
|
-
|
|
730
584
|
this._worker.on('message', async msg => {
|
|
731
585
|
if (msg.event && msg.event === 'log') {
|
|
732
586
|
if (msg.level === 'DEBUG') {
|
|
@@ -738,9 +592,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
738
592
|
} else if (msg.level === 'WARN') {
|
|
739
593
|
log.warn(msg.msg);
|
|
740
594
|
}
|
|
741
|
-
|
|
742
595
|
_this.emit('log', msg.time, msg.level, msg.msg, msg.src || DEFAULT_ISSUER);
|
|
743
|
-
|
|
744
596
|
_this._reporter && _this._reporter.onLogEntry(msg.time, msg.level, msg.msg, msg.src || DEFAULT_ISSUER);
|
|
745
597
|
} else if (msg.event && msg.event === 'line-update') {
|
|
746
598
|
_this.emit('line-update', msg.line, msg.stack, msg.time);
|
|
@@ -757,7 +609,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
757
609
|
}
|
|
758
610
|
});
|
|
759
611
|
}
|
|
760
|
-
|
|
761
612
|
_hookWorkerDebuggerEvents() {
|
|
762
613
|
this._worker.debugger && this._worker.debugger.on('debugger:break', breakpointData => {
|
|
763
614
|
this.emit('breakpoint', breakpointData);
|
|
@@ -766,10 +617,8 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
766
617
|
this.emit('breakpointError', breakError);
|
|
767
618
|
});
|
|
768
619
|
}
|
|
769
|
-
|
|
770
620
|
async _handleBeforeCommand(e) {
|
|
771
621
|
this._reporter && this._reporter.onStepStart(this._id, e);
|
|
772
|
-
|
|
773
622
|
try {
|
|
774
623
|
if (e && e.module && e.module === 'log') {} else {
|
|
775
624
|
await (this._worker && this._worker.invokeTestHook('beforeCommand', [e]));
|
|
@@ -779,10 +628,8 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
779
628
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeCommand" hook failed:' + e, DEFAULT_ISSUER);
|
|
780
629
|
}
|
|
781
630
|
}
|
|
782
|
-
|
|
783
631
|
async _handleAfterCommand(e) {
|
|
784
632
|
this._reporter && this._reporter.onStepEnd(this._id, e.result);
|
|
785
|
-
|
|
786
633
|
try {
|
|
787
634
|
if (e && e.module && e.module === 'log') {} else {
|
|
788
635
|
await (this._worker && this._worker.invokeTestHook('afterCommand', [e.result]));
|
|
@@ -792,7 +639,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
792
639
|
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterCommand" hook failed:' + e, DEFAULT_ISSUER);
|
|
793
640
|
}
|
|
794
641
|
}
|
|
795
|
-
|
|
796
642
|
_resetGlobalVariables() {
|
|
797
643
|
this._modCaps = {};
|
|
798
644
|
this._worker = null;
|
|
@@ -802,7 +648,6 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
802
648
|
this._testKilled = false;
|
|
803
649
|
this._whenDisposed = (0, _when.defer)();
|
|
804
650
|
}
|
|
805
|
-
|
|
806
651
|
_processTestResults({
|
|
807
652
|
resultStore,
|
|
808
653
|
moduleCaps,
|
|
@@ -812,20 +657,18 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
812
657
|
if (this._testKilled) {
|
|
813
658
|
return null;
|
|
814
659
|
}
|
|
815
|
-
|
|
816
660
|
if (error) {
|
|
817
661
|
this.emit('test-error', error);
|
|
818
662
|
}
|
|
819
|
-
|
|
820
663
|
this._vars = context.vars || this._vars;
|
|
821
|
-
this._modCaps = {
|
|
664
|
+
this._modCaps = {
|
|
665
|
+
...this._modCaps,
|
|
822
666
|
...(moduleCaps || {})
|
|
823
667
|
};
|
|
824
668
|
if (context.caps) delete context.caps;
|
|
825
669
|
if (context.env) delete context.env;
|
|
826
670
|
if (context.test) delete context.test;
|
|
827
671
|
}
|
|
828
|
-
|
|
829
672
|
_emitIterationEnd(ts, tc, suiteIterationNum, caseIterationNum, caseIterationResult) {
|
|
830
673
|
this.emit('iteration-end', {
|
|
831
674
|
status: caseIterationResult._status,
|
|
@@ -844,12 +687,9 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
844
687
|
}
|
|
845
688
|
});
|
|
846
689
|
}
|
|
847
|
-
|
|
848
690
|
_emitTestEnd(result) {
|
|
849
691
|
this.emit('test-end', result);
|
|
850
692
|
}
|
|
851
|
-
|
|
852
693
|
}
|
|
853
|
-
|
|
854
694
|
exports.default = OxygenRunner;
|
|
855
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZ2V0U3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZXMiLCJyZXR2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJzdWl0ZSIsImNhc2VzIiwiY2F6ZSIsImJyZWFrcG9pbnRzIiwiYnJlYWtwb2ludCIsInB1c2giLCJyZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyIsInJlbW92ZUJyZWFrcG9pbnQiLCJpZHgiLCJmaWxlIiwibGluZSIsInNwbGljZSIsIk94eWdlblJ1bm5lciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9pZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6aW5nIiwiX2lzRGlzcG9zaW5nIiwiX3dvcmtlciIsIl9kZWJ1Z01vZGUiLCJfd29ya2VyUHJvY0xhc3RFcnJvciIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIm5wbUdSb290RXhlY3V0aW9uIiwiX3N1aXRlIiwiX2VudlZhcnMiLCJfdmFycyIsIl9jYXBzIiwiX21vZENhcHMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJpbml0IiwiY2FwcyIsInJlcG9ydGVyIiwiRXJyb3IiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIl9yZXBvcnRlciIsIl9pc0luaXRpYWxpemVkIiwib3B0RW52IiwiZW52IiwiZW52cyIsIk9iamVjdCIsImtleXMiLCJlbnZWYXJzIiwiX2VudiIsIl9zdWl0ZXMiLCJkZWJ1Z1BvcnRJZGUiLCJkZWJ1Z1BvcnQiLCJfZGVidWdQb3J0Iiwic2NyaXB0Q29udGVudExpbmVPZmZzZXQiLCJsb2NhbFRpbWUiLCJfc3RhcnRXb3JrZXJQcm9jZXNzIiwiX3dvcmtlcl9Jbml0T3h5Z2VuIiwiZGlzcG9zZSIsInN0YXR1cyIsImlzUnVubmluZyIsInN0b3AiLCJlIiwiY29uc29sZSIsIndhcm4iLCJfcmVzZXRHbG9iYWxWYXJpYWJsZXMiLCJydW4iLCJvblJ1bm5lclN0YXJ0IiwiZXJyb3IiLCJyZXN1bHQiLCJfcnVuVGVzdCIsImZhaWx1cmUiLCJvblJ1bm5lckVuZCIsImtpbGwiLCJkZWJ1Z0NvbnRpbnVlIiwiZGVidWdnZXIiLCJjb250aW51ZSIsInVwZGF0ZUJyZWFrcG9pbnRzIiwiZmlsZVBhdGgiLCJzZXRCcmVha3BvaW50c0FjdGl2ZSIsInByb21pc2VzIiwidHNCcmVha3BvaW50cyIsImdldEJyZWFrcG9pbnRzIiwic3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZUJwIiwiaW5jbHVkZXMiLCJhY3R1YWxDdXJyZW50QnAiLCJyZW1vdmVCcmVha3BvaW50QnlWYWx1ZSIsInVzZXJTZXRCcCIsInNldEJyZWFrcG9pbnQiLCJwcm9taXNlQWxsUHJvbWlzZSIsImFsbCIsInRoZW4iLCJ2YWx1ZSIsImRlYnVnIiwiYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyIsInJlcGxDbG9zZSIsIl9zZW5kIiwiZXZlbnQiLCJuYW1lIiwicmVwbFNlbmQiLCJjbWQiLCJjb250ZW50IiwicmVwbFN0YXJ0IiwiaW52b2tlIiwiY2xlYXJCcmVha3BvaW50IiwiVGVzdFJlc3VsdCIsInN0YXJ0VGltZSIsImdldFRpbWVTdGFtcCIsIlN0YXR1cyIsIlBBU1NFRCIsIl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rIiwic3VpdGVSZXN1bHQiLCJfcnVuU3VpdGUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJoYXNGYWlsZWRTdWl0ZXMiLCJzb21lIiwic3VpdGVJdGVyYXRpb25zIiwieCIsIkZBSUxFRCIsImVudmlyb25tZW50IiwiY2FwYWJpbGl0aWVzIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayIsInBhdGgiLCJpdGVyYXRpb25Db3VudCIsInNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInN1aXRlSXRlcmF0aW9uIiwib25JdGVyYXRpb25TdGFydCIsIlRlc3RTdWl0ZVJlc3VsdCIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsIml0ZXJhdGlvbk51bSIsIl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayIsIm9uU3VpdGVTdGFydCIsInVyaSIsImNhc2VJdGVyYXRpb24iLCJzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInJlUnVuQ291bnQiLCJjYXNlUmVzdWx0IiwiX3J1bkNhc2UiLCJyZVJ1bk9uRmFpbGVkIiwiX3dvcmtlcl9EaXNwb3NlTW9kdWxlcyIsIm9uSXRlcmF0aW9uRW5kIiwiX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayIsIm9uQ2FzZUVuZCIsImlkIiwiYXV0b0Rpc3Bvc2UiLCJfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayIsIm9uU3VpdGVFbmQiLCJyZVJ1biIsInBhcmFtcyIsInBhcmFtTWFuYWdlciIsInJlYWRQcmV2IiwiXyIsImV4dGVuZCIsImdldFZhbHVlcyIsInJlYWROZXh0IiwiaSIsIl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rIiwib25DYXNlU3RhcnQiLCJUZXN0Q2FzZVJlc3VsdCIsImxvY2F0aW9uIiwicmVzdWx0U3RvcmUiLCJjb250ZXh0IiwibW9kdWxlQ2FwcyIsIl93b3JrZXJfUnVuIiwiX3Byb2Nlc3NUZXN0UmVzdWx0cyIsInN0ZXBzIiwibG9ncyIsImhhciIsImZhaWxlZFN0ZXBzIiwiZmluZCIsImlzRW1wdHkiLCJtYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQiLCJfd2hlblRlc3RDYXNlRmluaXNoZWQiLCJyZWplY3QiLCJzY3JpcHROYW1lIiwic2NyaXB0UGF0aCIsInZhcnMiLCJ0ZXN0IiwiY2FzZSIsIml0ZXJhdGlvbiIsInBvRmlsZSIsInBvIiwiZGlzcG9zZU1vZHVsZXMiLCJpbnZva2VUZXN0SG9vayIsIm9uTG9nRW50cnkiLCJ3b3JrZXJQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIldvcmtlclByb2Nlc3MiLCJzdGFydCIsIl9ob29rV29ya2VyRXZlbnRzIiwic3RhcnREZWJ1Z2dlciIsIl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMiLCJfdGhpcyIsInN1YnNjcmliZSIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJvbiIsInBheWxvYWQiLCJleGl0RG9uZSIsImVtaXQiLCJleGl0Q29kZSIsInByb21pc2UiLCJPeHlnZW5FcnJvciIsImVycm9yQ29kZSIsIlNDUklQVF9FUlJPUiIsIm1zZyIsImxldmVsIiwiaW5mbyIsImVyciIsInRpbWUiLCJzcmMiLCJzdGFjayIsIm1ldGhvZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsIm9uU3RlcFN0YXJ0IiwibW9kdWxlIiwib25TdGVwRW5kIiwiX2VtaXRJdGVyYXRpb25FbmQiLCJ0cyIsInRjIiwic3VpdGVJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uTnVtIiwiY2FzZUl0ZXJhdGlvblJlc3VsdCIsIl9zdGF0dXMiLCJfZW1pdFRlc3RFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBaEJBLE1BQU1BLEdBQUcsR0FBRyxxQkFBTyxjQUFQLENBQVo7QUFDQSxNQUFNQyxjQUFjLEdBQUcsTUFBdkI7O0FBa0JBLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQUosQ0FBWUMsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQUQsRUFBVUYsRUFBVixDQUFqQyxDQUFyQjs7QUFFQSxNQUFNSSxvQkFBb0IsR0FBSUMsTUFBRCxJQUFZO0FBQ3JD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QURYO0FBRUZoRCxRQUFBQSxJQUFJLEVBQUUrSCxFQUFFLENBQUMvSCxJQUZQO0FBR0ZvRixRQUFBQSxTQUFTLEVBQUU2QyxnQkFIVDtBQUlGckcsUUFBQUEsY0FBYyxFQUFFbUcsRUFBRSxDQUFDbkc7QUFKakIsT0FIaUI7QUFTdkJsSSxNQUFBQSxLQUFLLEVBQUU7QUFDSHNKLFFBQUFBLEVBQUUsRUFBRThFLEVBQUUsQ0FBQzlFLEVBQUgsSUFBUyxJQURWO0FBRUhoRCxRQUFBQSxJQUFJLEVBQUU4SCxFQUFFLENBQUM5SCxJQUZOO0FBR0hvRixRQUFBQSxTQUFTLEVBQUU0QyxpQkFIUjtBQUlIcEcsUUFBQUEsY0FBYyxFQUFFa0csRUFBRSxDQUFDbEc7QUFKaEI7QUFUZ0IsS0FBM0I7QUFnQkg7O0FBRUR3RyxFQUFBQSxZQUFZLENBQUNsSyxNQUFELEVBQVM7QUFDakIsU0FBS3dJLElBQUwsQ0FBVSxVQUFWLEVBQXNCeEksTUFBdEI7QUFDSDs7QUF2dkJrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ094eWdlblJ1bm5lcicpO1xyXG5jb25zdCBERUZBVUxUX0lTU1VFUiA9ICd1c2VyJztcclxuXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBfICBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuXHJcbmltcG9ydCBUZXN0U3VpdGVSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvc3VpdGUtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RDYXNlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL2Nhc2UtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvdGVzdC1yZXN1bHQnO1xyXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uLy4uL21vZGVsL3N0YXR1cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeHlnZW5FcnJvciBmcm9tICcuLi8uLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgUGFyYW1ldGVyTWFuYWdlciBmcm9tICcuLi8uLi9saWIvcGFyYW0tbWFuYWdlci5qcyc7XHJcbmltcG9ydCBXb3JrZXJQcm9jZXNzIGZyb20gJy4uL1dvcmtlclByb2Nlc3MnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbmNvbnN0IGdldFN1aXRlc0JyZWFrcG9pbnRzID0gKHN1aXRlcykgPT4ge1xyXG4gICAgY29uc3QgcmV0dmFsID0gW107XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAgIHN1aXRlcyAmJlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGVzKSAmJlxyXG4gICAgICAgIHN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgICBzdWl0ZXMubWFwKChzdWl0ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGUuY2FzZXMpICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubWFwKChjYXplKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbC5wdXNoKGJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXR2YWw7XHJcbn07XHJcblxyXG5jb25zdCByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyA9IChzdWl0ZXMsIHJlbW92ZUJyZWFrcG9pbnQpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmZpbGUgPT09IHJlbW92ZUJyZWFrcG9pbnQuZmlsZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQubGluZSA9PT0gcmVtb3ZlQnJlYWtwb2ludC5saW5lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3h5Z2VuUnVubmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIC8vIGNsYXNzIHZhcmlhYmxlc1xyXG4gICAgICAgIHRoaXMuX2lkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG9wdGlvbnMubnBtR1Jvb3RFeGVjdXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWZpbmUgdmFyaWFibGVzIHRvIGl0ZXJhdGUgdGhyb3VnaCB0ZXN0IGNhc2VzIGFuZCB0ZXN0IHN1aXRlIGl0ZXJhdGlvbnNcclxuICAgICAgICB0aGlzLl9zdWl0ZTtcclxuICAgICAgICB0aGlzLl9lbnZWYXJzID0ge307ICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3RcclxuICAgICAgICB0aGlzLl92YXJzID0ge307ICAgICAvLyB1c2VyLWRlZmluZWQgdmFyaWFibGVzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBzY3JpcHRzXHJcbiAgICAgICAgdGhpcy5fY2FwcyA9IHt9OyAvLyBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBwYXNzZWQgdG8gZWFjaCBtb2R1bGVcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gMztcclxuICAgICAgICAvLyBwcm9taXNlc1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQdWJsaWMgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIGFzeW5jIGluaXQob3B0aW9ucywgY2FwcyA9IHt9LCByZXBvcnRlcikge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgdGVzdCBzdWl0ZSBpcyBkZWZpbmVkXHJcbiAgICAgICAgaWYgKCFvcHRpb25zLnN1aXRlcykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luaXRpYWxpemF0aW9uIGZhaWxlZCAtIG5vIHRlc3Qgc3VpdGVzIGFyZSBkZWZpbmVkLiBZb3UgbXVzdCBkZWZpbmUgXCJzdWl0ZXNcIiBwcm9wZXJ0eSBpbiBPeHlnZW4gb3B0aW9ucy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMuX2N3ZCA9IHRoaXMuX29wdGlvbnMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gbWVyZ2UgY3VycmVudCBhbmQgdGVzdCBjb25maWd1cmF0aW9uIGJhc2VkIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBsZXQgb3B0RW52ID0ge307XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudikge1xyXG4gICAgICAgICAgICAgICAgLy8gJ2Vudicgb3B0aW9uIG1pZ2h0IGJlIGRlZmluZWQgZWl0aGVyIGFzIGEgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgb3IgYXMgYW4gb2JqZWN0IHRoYXQgbGlzdHMgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgJ2VudicgaXMgYSBzdHJpbmcsIHRoZW4gcmVzb2x2ZSB0aGUgYWN0dWFsIHZhcmlhYmxlcyBmcm9tICdlbnZzJyBvYmplY3RcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lbnYgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRpb25zLmVudnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuZW52c1tvcHRpb25zLmVudl0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGFuIG9iamVjdCwgdXNlIHRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiBpdFxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudikpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW52VmFycyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudlZhcnMpKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRFbnYgPSB7IC4uLm9wdEVudiwgLi4ub3B0aW9ucy5lbnZWYXJzIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZVxyXG4gICAgICAgICAgICB0aGlzLl9lbnYgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICAuLi5vcHRFbnZcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7IC4uLmNhcHMgfTsgLy8gYXNzaWduIGNhcHMgZm9yIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX3N1aXRlcyA9IFsgLi4ub3B0aW9ucy5zdWl0ZXMgXTtcclxuICAgICAgICAvLyBzZXQgdXAgZGVidWdnaW5nIG9wdGlvbnNcclxuICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIHJlaW1wbGVtZW50ZWQuIEV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBkZWJ1Z2dpbmcgKGluaXRpYWxpemVEZWJ1Z2dlcikgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBPeHlnZW5cclxuICAgICAgICAvLyBhbmQgYWRkZWQgdG8gSURFIGluc3RlYWQuIEkuZS4gdGhlIG9ubHkgdGhpbmcgb3h5Z2VuIHNob3VsZCBkbyBpcyB0byBsYXVuY2ggdGhlIGNoaWxkIHByb2Nlc3Mgd2l0aCB0aGUgZGVidWdnaW5nIHN3aXRjaC5cclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSAgb3B0aW9ucy5kZWJ1Z1BvcnRJZGUgfHwgb3B0aW9ucy5kZWJ1Z1BvcnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gb3B0aW9ucy5kZWJ1Z1BvcnQgfHwgb3B0aW9ucy5kZWJ1Z1BvcnRJZGUgfHwgbnVsbDtcclxuICAgICAgICBvcHRpb25zLnNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQ7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRpbWUpIHx8IHRoaXMuX2xvY2FsVGltZTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFdvcmtlclByb2Nlc3MoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfSW5pdE94eWdlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdydW5uZXIgZGlzcG9zZSBlJywgZSk7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHRoZSBkaXNwb3NlXHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdFcnJvciB3aGVuIGRpc3Bvc2luZyBSdW5uZXI6JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdHVzICE9PSAnQ0FOQ0VMRUQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXppbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5pdGlhbGl6YXRpb24gaGFzbid0IGJlZW4gY29tcGxldGVkIHlldCwgd2FpdCBmb3IgJ2luaXRpYWxpemVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcmV2aW91cyB0ZXN0IGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yICd0ZXN0LWVuZGVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJTdGFydCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwcyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuVGVzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IHJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJFbmQodGhpcy5faWQsIHJlc3VsdCwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBraWxsKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5raWxsKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnQ29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0c0JyZWFrcG9pbnRzID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlc0JyZWFrcG9pbnRzID0gZ2V0U3VpdGVzQnJlYWtwb2ludHModGhpcy5fc3VpdGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYnJlYWtwb2ludHMgZnJvbSBzdWl0ZXMvY2FzZXMgdHJlZVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc3VpdGVCcCBvZiBzdWl0ZXNCcmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtwb2ludHMuaW5jbHVkZXMoc3VpdGVCcC5saW5lKSAmJiAgZmlsZVBhdGggPT09IHN1aXRlQnAuZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyh0aGlzLl9zdWl0ZXMsIHN1aXRlQnApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVsZXRlZCBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYWN0dWFsQ3VycmVudEJwIG9mIHRzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKGFjdHVhbEN1cnJlbnRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGFjdHVhbEN1cnJlbnRCcCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGJyZWFrcG9pbnRzXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1c2VyU2V0QnAgb2YgYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRzQnJlYWtwb2ludHMuaW5jbHVkZXModXNlclNldEJwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGVQYXRoLCB1c2VyU2V0QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygndXBkYXRlQnJlYWtwb2ludHMoKSBkb25lLicpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb21pc2VBbGxQcm9taXNlIDogcHJvbWlzZUFsbFByb21pc2UsIGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgOiBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsQ2xvc2UoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfc3RvcCdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU2VuZChjbWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuX3NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ3JlcGwnLFxyXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9ldmFsJyxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY21kOiBjbWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlKCdyZXBsU3RhcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3N1aXRlICYmIHRoaXMuX3N1aXRlLnRlc3RjYXNlcykge1xyXG4gICAgICAgICAgICBjb25zdCB0YyA9IHRoaXMuX3N1aXRlLnRlc3RjYXNlc1t0Y2luZGV4XTtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKCdveHlnZW4uc2V0QnJlYWtwb2ludDogJyArIChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQpKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQodGMubmFtZSwgbGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckJyZWFrcG9pbnQobGluZSkge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNsZWFyQnJlYWtwb2ludChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQsIG51bGwpO1xyXG4gICAgICAgIH0qL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBhc3luYyBfcnVuVGVzdCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgcmVzdWx0LnN1aXRlcyA9IFtdO1xyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgLy8gY2FsbCBiZWZvcmVUZXN0IGhvb2tcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHN1aXRlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWl0ZSBvZiB0aGlzLl9zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuU3VpdGUoc3VpdGUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5wdXNoKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5kdXJhdGlvbiA9IHJlc3VsdC5lbmRUaW1lIC0gcmVzdWx0LnN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gcmVzdWx0LnN1aXRlcy5zb21lKHN1aXRlSXRlcmF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZUl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShzdWl0ZUl0ZXJhdGlvbnMpICYmIHN1aXRlSXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IGhhc0ZhaWxlZFN1aXRlcyA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5lbnZpcm9ubWVudCA9IHsgLi4udGhpcy5fZW52IH07XHJcbiAgICAgICAgLy8gY29tYmluZSB0ZXN0IGRlZmluZWQgY2FwcyBhbmQgcGVyIG1vZHVsZSBjYXBhYmlsaXRpZXMsIHRoYXQgd2VyZSBwYXNzZWQgYnkgdXNlciBpbiBlYWNoIG1vZHVsZSdzIGluaXQgZnVuY3Rpb25cclxuICAgICAgICByZXN1bHQuY2FwYWJpbGl0aWVzID0geyAuLi50aGlzLl9jYXBzLCAuLi50aGlzLl9tb2RDYXBzIH07ICAgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX2NhcHMgb2JqZWN0XHJcbiAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSB7IC4uLnRoaXMuX29wdGlvbnMgfTsgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX29wdGlvbnMgb2JqZWN0XHJcblxyXG4gICAgICAgIC8vIGlmIGVycm9yIG9jY3VyZWQsIGFkZCBpdCB0byB0aGUgc3VtbWFyeVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuU3VpdGUoc3VpdGUpIHtcclxuICAgICAgICBpZiAoIXN1aXRlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignc3VpdGUgaXMgbnVsbCBpbiBfcnVuU3VpdGUoKSEhIScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgc3VpdGUgd2l0aCBtaXNzaW5nIG1hbmRhdG9yeSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgaWYgKCFzdWl0ZS5uYW1lICYmICFzdWl0ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBzcGVjaWZ5IHN1aXRlLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgaWYgKCFzdWl0ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICBzdWl0ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc3VpdGUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzaW5nbGUgc3VpdGUgbWlnaHQgcHJvZHVjZSBtdWx0aXBsZSByZXN1bHRzLCBiYXNlZCBvbiBhbW91bnQgb2YgZGVmaW5lZCBpdGVyYXRpb25zXHJcbiAgICAgICAgY29uc3Qgc3VpdGVJdGVyYXRpb25zID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgc3VpdGVJdGVyYXRpb249MTsgc3VpdGVJdGVyYXRpb24gPD0gc3VpdGUuaXRlcmF0aW9uQ291bnQ7IHN1aXRlSXRlcmF0aW9uKyspIHtcclxuICAgICAgICAgICAgaWYgKHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25TdGFydCh0aGlzLl9pZCwgc3VpdGVJdGVyYXRpb24sICdTdWl0ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gbmV3IFRlc3RTdWl0ZVJlc3VsdCgpO1xyXG4gICAgICAgICAgICBzdWl0ZUl0ZXJhdGlvbnMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lm5hbWUgPSBzdWl0ZS5uYW1lIHx8IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoc3VpdGUucGF0aCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuaXRlcmF0aW9uTnVtID0gc3VpdGVJdGVyYXRpb247XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rKHN1aXRlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25TdWl0ZVN0YXJ0KHRoaXMuX2lkLCBzdWl0ZS51cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgY2F6ZSBvZiBzdWl0ZS5jYXNlcykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhc2VzIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgJ3BhdGgnIHByb3BlcnR5IFxyXG4gICAgICAgICAgICAgICAgaWYgKCFjYXplLnBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F6ZS5uYW1lID0gb3h1dGlsLmdldEZpbGVOYW1lV2l0aG91dEV4dChjYXplLnBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjYXplLml0ZXJhdGlvbkNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F6ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlSXRlcmF0aW9uPTE7IGNhc2VJdGVyYXRpb24gPD0gY2F6ZS5pdGVyYXRpb25Db3VudDsgY2FzZUl0ZXJhdGlvbisrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXplICYmIGNhemUuaXRlcmF0aW9uQ291bnQgJiYgY2F6ZS5pdGVyYXRpb25Db3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25TdGFydCh0aGlzLl9pZCwgY2FzZUl0ZXJhdGlvbiwgJ0Nhc2UnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlUnVuQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYXNlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc2VSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQgJiYgdGhpcy5fb3B0aW9ucy5yZVJ1bk9uRmFpbGVkICYmIHJlUnVuQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVSdW5Db3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBvbiBjYW5jZWxlZCBzdGF0dXMgbm90IGNsb3NlIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKCdwYXNzZWQnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQgPSBhd2FpdCB0aGlzLl9ydW5DYXNlKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc2VSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQucmVSdW5Db3VudCA9IHJlUnVuQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uRW5kKHRoaXMuX2lkLCBjYXNlUmVzdWx0LCAnQ2FzZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2soY2F6ZSwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5hdXRvRGlzcG9zZSAhPT0gJ2Jvb2xlYW4nIHx8IHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXJfRGlzcG9zZU1vZHVsZXMoY2FzZVJlc3VsdC5zdGF0dXMpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0LmNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGVzdCBjYXNlIGl0ZXJhdGlvbiBoYXMgZmFpbGVkLCB0aGVuIG1hcmsgdGhlIGVudGlyZSB0ZXN0IGNhc2UgYXMgZmFpbGVkLCBcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGl0ZXJhdGluZyBvdmVyIGl0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgY2FzZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQsICdTdWl0ZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVFbmQodGhpcy5faWQsIHN1aXRlLnVyaSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9ydW5DYXNlKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcmVSdW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIGdldCB0ZXN0IHN1aXRlJ3MgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgLy8gZ2V0IHRoZW0gZmlyc3QgYW5kIHRoZW4gb3ZlcnJpZGUgd2l0aCB0ZXN0IGNhc2UgbGV2ZWwgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHN1aXRlLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICBpZiAocmVSdW4pIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF8uZXh0ZW5kKHBhcmFtcywgc3VpdGUucGFyYW1NYW5hZ2VyLmdldFZhbHVlcygpKTtcclxuICAgICAgICAgICAgc3VpdGUucGFyYW1NYW5hZ2VyLnJlYWROZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlYWQgdGVzdCBjYXNlJ3MgbmV4dCBsaW5lcyBvZiBwYXJhbWV0ZXJzIGlmIHBhcmFtZXRlciBtYW5hZ2VyIGlzIGRlZmluZWRcclxuICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF8uZXh0ZW5kKHBhcmFtcywgY2F6ZS5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRkIGJyZWFrcG9pbnRzIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHQgaWYgaW4gZGVidWcgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiBjYXplLmJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTwgY2F6ZS5icmVha3BvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gZWRpdG9yIGluZGV4IHN0YXJ0cyBmcm9tIDEsIGJ1dCB3ZSBuZWVkIHplcm8gYmFzZWQgaW5kZXhcclxuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2F6ZS5icmVha3BvaW50c1tpXS5saW5lO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBjYXplLmJyZWFrcG9pbnRzW2ldLmZpbGU7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQoZmlsZSwgbGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLmVtaXQoJ2l0ZXJhdGlvbjpzdGFydCcsIGNhc2VJdGVyYXRpb24pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2soY2F6ZSk7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlU3RhcnQodGhpcy5faWQsIHN1aXRlLnVyaSB8fCBzdWl0ZS5pZCwgY2F6ZS51cmkgfHwgY2F6ZS5pZCB8fCBjYXplLnBhdGgsIGNhemUpO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBuZXcgVGVzdENhc2VSZXN1bHQoKTtcclxuICAgICAgICBjYXNlUmVzdWx0Lm5hbWUgPSBjYXplLm5hbWU7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5sb2NhdGlvbiA9IGNhemUucGF0aDtcclxuICAgICAgICBjYXNlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IGNhc2VJdGVyYXRpb247XHJcblxyXG4gICAgICAgIC8vIHRyeSB0byBpbml0aWFsaXplIE94eWdlbiBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICghKHRoaXMuX3dvcmtlcikgJiYgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9Jbml0T3h5Z2VuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGluIHRoZSB3b3JrZXIgcHJvY2VzcyBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3VsdFN0b3JlLCBjb250ZXh0LCBtb2R1bGVDYXBzLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgY29udGV4dCwgZXJyb3IsIG1vZHVsZUNhcHMgfSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmR1cmF0aW9uID0gY2FzZVJlc3VsdC5lbmRUaW1lIC0gY2FzZVJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLnN0ZXBzID8gcmVzdWx0U3RvcmUuc3RlcHMgOiBbXTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQubG9ncyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmxvZ3MgPyByZXN1bHRTdG9yZS5sb2dzIDogW107XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmhhciA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmhhciA/IHJlc3VsdFN0b3JlLmhhciA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3QgY2FzZSBpdGVyYXRpb24gc3RhdHVzIC0gbWFyayBpdCBhcyBmYWlsZWQgaWYgYW55IHN0ZXAgaGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgdmFyIGZhaWxlZFN0ZXBzID0gXy5maW5kKGNhc2VSZXN1bHQuc3RlcHMsIHtzdGF0dXM6IFN0YXR1cy5GQUlMRUR9KTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gXy5pc0VtcHR5KGZhaWxlZFN0ZXBzKSAmJiAhZXJyb3IgPyBTdGF0dXMuUEFTU0VEIDogU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0ZXBzID0gb3h1dGlsLm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZChjYXNlUmVzdWx0LnN0ZXBzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyX1J1bigpIHRocm93biBhbiBlcnJvcjonLCBlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjYXNlUmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfUnVuKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyIGlzIG51bGwgYnV0IG5vdCBzdXBwb3NlIHRvIScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZC5yZWplY3QobmV3IEVycm9yKCdfd29ya2VyIGlzIG51bGwnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdGFydCBydW5uaW5nIHRoZSB0ZXN0XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dvcmtlci5ydW4oe1xyXG4gICAgICAgICAgICBzY3JpcHROYW1lOiBjYXplLm5hbWUsXHJcbiAgICAgICAgICAgIHNjcmlwdFBhdGg6IGNhemUucGF0aCxcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBlbnY6IHRoaXMuX2VudixcclxuICAgICAgICAgICAgICAgIGNhcHM6IHRoaXMuX2NhcHMsXHJcbiAgICAgICAgICAgICAgICB2YXJzOiB0aGlzLl92YXJzLFxyXG4gICAgICAgICAgICAgICAgdGVzdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN1aXRlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBvRmlsZTogdGhpcy5fb3B0aW9ucy5wbyB8fCBudWxsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfSW5pdE94eWdlbigpIHtcclxuICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbml0KHRoaXMuX2lkLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9jYXBzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9EaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGlzcG9zZU1vZHVsZXMpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlVGVzdCcsIFt0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwc10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlU3VpdGUnLCBbc3VpdGVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rKGNhemUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlQ2FzZScsIFtjYXplXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlclRlc3QnLCBbdGhpcy5faWQsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJTdWl0ZScsIFtzdWl0ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNhc2UnLCBbY2F6ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3N0YXJ0V29ya2VyUHJvY2VzcygpIHtcclxuICAgICAgICBjb25zdCB3b3JrZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3dvcmtlci5qcycpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBXb3JrZXJQcm9jZXNzKHRoaXMuX2lkLCB3b3JrZXJQYXRoLCB0aGlzLl9kZWJ1Z01vZGUsIHRoaXMuX2RlYnVnUG9ydCwgJ094eWdlbicsIHRoaXMuX25wbUdSb290RXhlY3V0aW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnQoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRXZlbnRzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0RGVidWdnZXIoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckV2ZW50cygpIHtcclxuICAgICAgICAvLyBwcmVzZXJ2ZSB0aGlzIG9iamVjdFxyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl93b3JrZXIuc3Vic2NyaWJlKCdjb21tYW5kOmJlZm9yZScsIHRoaXMuX2hhbmRsZUJlZm9yZUNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2Vycm9yJywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdXb3JrZXIgcHJvY2VzcyBlcnJvcjogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdERvbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2V4aXQnLCAocGF5bG9hZCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgeyBleGl0Q29kZSB9ID0gcGF5bG9hZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSAmJiBleGl0Q29kZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRlc3QgaXMgcnVubmluZyBvciBpcyBiZWluZyBkaXNwb3NlZCBhbmQgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGRpZWQsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGVuZCB0aGUgdGVzdCBvciBkaXNwb3NhbCB3aXRoIGZhdGFsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAvLyAoY2hpbGQgcHJvY2VzcyBub3Qgc3VwcG9zZSB0byBkaWUgd2l0aCBjb2RlID4gMClcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5faXNEaXNwb3NpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5EaXNwb3NlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3RoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAxMzQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnT3V0IG9mIG1lbW9yeSBlcnJvci4gTWFrZSBzdXJlIHRoYXQgeW91IGRvblxcJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzIGluIHRoZSB0ZXN0IHNjcmlwdC4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IE94eWdlbkVycm9yKGBXb3JrZXIgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlOiAke2V4aXRDb2RlfS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlICYmIHByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0lORk8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0VSUk9SJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cubXNnLCBtc2cuZXJyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmxldmVsID09PSAnV0FSTicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cubXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsb2cnLCBtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRlciAmJiBfdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnbGluZS11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsaW5lLXVwZGF0ZScsIG1zZy5saW5lLCBtc2cuc3RhY2ssIG1zZy50aW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAncmVzdWx0LXVwZGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubWV0aG9kID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdpbml0LWRvbmUnLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICd3b3JrZXJFcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3b3JrZXJFcnJvcjonLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMua2lsbCgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3JlcGwnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdyZXBsJywgbXNnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWsnLCAoYnJlYWtwb2ludERhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludERhdGEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLm9uKCdkZWJ1Z2dlcjpicmVha0Vycm9yJywgKGJyZWFrRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha3BvaW50RXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaGFuZGxlQmVmb3JlQ29tbWFuZChlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25TdGVwU3RhcnQodGhpcy5faWQsIGUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1vZHVsZSAmJiBlLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNvbW1hbmQnLCBbZV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaGFuZGxlQWZ0ZXJDb21tYW5kKGUpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vblN0ZXBFbmQodGhpcy5faWQsIGUucmVzdWx0KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1vZHVsZSAmJiBlLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyQ29tbWFuZCcsIFtlLnJlc3VsdF0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJDb21tYW5kXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCkge1xyXG4gICAgICAgIHRoaXMuX21vZENhcHMgPSB7fTtcclxuICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd2hlbkRpc3Bvc2VkID0gZGVmZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc1Rlc3RSZXN1bHRzKHsgcmVzdWx0U3RvcmUsIG1vZHVsZUNhcHMsIGNvbnRleHQgPSB7fSwgZXJyb3IgPSBudWxsIH0pIHtcclxuICAgICAgICAvLyBpZiB0ZXN0IHdhcyBraWxsZWQgYmVmb3JlIGFueSByZXN1bHRzIHdlcmUgZ2VuZXJhdGVkLCB0aGVuIGp1c3QgZmluYWxpemUgdGhlIHRlc3Qgd2l0aG91dCBwcm9jZXNzaW5nIHJlc3VsdHNcclxuICAgICAgICBpZiAodGhpcy5fdGVzdEtpbGxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RvcmUgJ3ZhcnMnIHBhcnQgb2YgdGhlIGNvbnRleHQgZm9yIGEgbGF0ZXIgdXNlXHJcbiAgICAgICAgdGhpcy5fdmFycyA9IGNvbnRleHQudmFycyB8fCB0aGlzLl92YXJzO1xyXG4gICAgICAgIC8vIHN0b3JlICdtb2RDYXBzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX21vZENhcHMgPSB7IC4uLnRoaXMuX21vZENhcHMsIC4uLm1vZHVsZUNhcHMgfHwge30gfTtcclxuICAgICAgICAvLyBjbGVhbiB1cCBjb250ZXh0IGZyb20gaW50ZXJuYWwgZWxlbWVudHMsIG5vdCBuZWVkIGluIHRoZSByZXBvcnQ6XHJcbiAgICAgICAgLy8gcmVtb3ZlIGNhcHMgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQuY2FwcylcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuY2FwcztcclxuICAgICAgICAvLyByZW1vdmUgZW52IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LmVudilcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZW52O1xyXG4gICAgICAgIC8vIHJlbW92ZSB0ZXN0IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LnRlc3QpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LnRlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgX2VtaXRJdGVyYXRpb25FbmQodHMsIHRjLCBzdWl0ZUl0ZXJhdGlvbk51bSwgY2FzZUl0ZXJhdGlvbk51bSwgY2FzZUl0ZXJhdGlvblJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaXRlcmF0aW9uLWVuZCcsIHtcclxuICAgICAgICAgICAgc3RhdHVzOiBjYXNlSXRlcmF0aW9uUmVzdWx0Ll9zdGF0dXMsXHJcbiAgICAgICAgICAgIGZhaWx1cmU6IGNhc2VJdGVyYXRpb25SZXN1bHQuZmFpbHVyZSB8fCBudWxsLFxyXG4gICAgICAgICAgICBjYXNlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogdGMuaWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRjLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25OdW0sXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25Db3VudDogdGMuaXRlcmF0aW9uQ291bnRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3VpdGU6IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0cy5pZCB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogdHMubmFtZSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25OdW0sXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25Db3VudDogdHMuaXRlcmF0aW9uQ291bnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9lbWl0VGVzdEVuZChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZW5kJywgcmVzdWx0KTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBhcmFtZXRlck1hbmFnZXIgfTsiXX0=
|
|
695
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJERUZBVUxUX0lTU1VFUiIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZ2V0U3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZXMiLCJyZXR2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJzdWl0ZSIsImNhc2VzIiwiY2F6ZSIsImJyZWFrcG9pbnRzIiwiYnJlYWtwb2ludCIsInB1c2giLCJyZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyIsInJlbW92ZUJyZWFrcG9pbnQiLCJpZHgiLCJmaWxlIiwibGluZSIsInNwbGljZSIsIk94eWdlblJ1bm5lciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9pZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6aW5nIiwiX2lzRGlzcG9zaW5nIiwiX3dvcmtlciIsIl9kZWJ1Z01vZGUiLCJfd29ya2VyUHJvY0xhc3RFcnJvciIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIm5wbUdSb290RXhlY3V0aW9uIiwiX3N1aXRlIiwiX2VudlZhcnMiLCJfdmFycyIsIl9jYXBzIiwiX21vZENhcHMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJkZWZlciIsImluaXQiLCJjYXBzIiwicmVwb3J0ZXIiLCJFcnJvciIsIl9jd2QiLCJjd2QiLCJwcm9jZXNzIiwiX3JlcG9ydGVyIiwiX2lzSW5pdGlhbGl6ZWQiLCJvcHRFbnYiLCJlbnYiLCJlbnZzIiwiT2JqZWN0Iiwia2V5cyIsImVudlZhcnMiLCJfZW52IiwiX3N1aXRlcyIsImRlYnVnUG9ydElkZSIsImRlYnVnUG9ydCIsIl9kZWJ1Z1BvcnQiLCJzY3JpcHRDb250ZW50TGluZU9mZnNldCIsImxvY2FsVGltZSIsIl9zdGFydFdvcmtlclByb2Nlc3MiLCJfd29ya2VyX0luaXRPeHlnZW4iLCJkaXNwb3NlIiwic3RhdHVzIiwiaXNSdW5uaW5nIiwic3RvcCIsImUiLCJjb25zb2xlIiwid2FybiIsIl9yZXNldEdsb2JhbFZhcmlhYmxlcyIsInJ1biIsIm9uUnVubmVyU3RhcnQiLCJlcnJvciIsInJlc3VsdCIsIl9ydW5UZXN0IiwiZmFpbHVyZSIsIm9uUnVubmVyRW5kIiwia2lsbCIsImRlYnVnQ29udGludWUiLCJkZWJ1Z2dlciIsImNvbnRpbnVlIiwidXBkYXRlQnJlYWtwb2ludHMiLCJmaWxlUGF0aCIsInNldEJyZWFrcG9pbnRzQWN0aXZlIiwicHJvbWlzZXMiLCJ0c0JyZWFrcG9pbnRzIiwiZ2V0QnJlYWtwb2ludHMiLCJzdWl0ZXNCcmVha3BvaW50cyIsInN1aXRlQnAiLCJpbmNsdWRlcyIsImFjdHVhbEN1cnJlbnRCcCIsInJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlIiwidXNlclNldEJwIiwic2V0QnJlYWtwb2ludCIsInByb21pc2VBbGxQcm9taXNlIiwiYWxsIiwidGhlbiIsInZhbHVlIiwiZGVidWciLCJicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIiwicmVwbENsb3NlIiwiX3NlbmQiLCJldmVudCIsIm5hbWUiLCJyZXBsU2VuZCIsImNtZCIsImNvbnRlbnQiLCJyZXBsU3RhcnQiLCJpbnZva2UiLCJjbGVhckJyZWFrcG9pbnQiLCJUZXN0UmVzdWx0Iiwic3RhcnRUaW1lIiwiZ2V0VGltZVN0YW1wIiwiU3RhdHVzIiwiUEFTU0VEIiwiX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2siLCJzdWl0ZVJlc3VsdCIsIl9ydW5TdWl0ZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImhhc0ZhaWxlZFN1aXRlcyIsInNvbWUiLCJzdWl0ZUl0ZXJhdGlvbnMiLCJ4IiwiRkFJTEVEIiwiZW52aXJvbm1lbnQiLCJjYXBhYmlsaXRpZXMiLCJlcnJvckhlbHBlciIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rIiwicGF0aCIsIml0ZXJhdGlvbkNvdW50Iiwic2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzIiwic3VpdGVJdGVyYXRpb24iLCJvbkl0ZXJhdGlvblN0YXJ0IiwiVGVzdFN1aXRlUmVzdWx0IiwiZ2V0RmlsZU5hbWVXaXRob3V0RXh0IiwiaXRlcmF0aW9uTnVtIiwiX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rIiwib25TdWl0ZVN0YXJ0IiwidXJpIiwiY2FzZUl0ZXJhdGlvbiIsInNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzIiwicmVSdW5Db3VudCIsImNhc2VSZXN1bHQiLCJfcnVuQ2FzZSIsInJlUnVuT25GYWlsZWQiLCJfd29ya2VyX0Rpc3Bvc2VNb2R1bGVzIiwib25JdGVyYXRpb25FbmQiLCJfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rIiwib25DYXNlRW5kIiwiaWQiLCJhdXRvRGlzcG9zZSIsIl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rIiwib25TdWl0ZUVuZCIsInJlUnVuIiwicGFyYW1zIiwicGFyYW1NYW5hZ2VyIiwicmVhZFByZXYiLCJfIiwiZXh0ZW5kIiwiZ2V0VmFsdWVzIiwicmVhZE5leHQiLCJpIiwiX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2siLCJvbkNhc2VTdGFydCIsIlRlc3RDYXNlUmVzdWx0IiwibG9jYXRpb24iLCJyZXN1bHRTdG9yZSIsImNvbnRleHQiLCJtb2R1bGVDYXBzIiwiX3dvcmtlcl9SdW4iLCJfcHJvY2Vzc1Rlc3RSZXN1bHRzIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiZmFpbGVkU3RlcHMiLCJmaW5kIiwiaXNFbXB0eSIsIm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZCIsIl93aGVuVGVzdENhc2VGaW5pc2hlZCIsInJlamVjdCIsInNjcmlwdE5hbWUiLCJzY3JpcHRQYXRoIiwidmFycyIsInRlc3QiLCJjYXNlIiwiaXRlcmF0aW9uIiwicG9GaWxlIiwicG8iLCJkaXNwb3NlTW9kdWxlcyIsImludm9rZVRlc3RIb29rIiwib25Mb2dFbnRyeSIsIndvcmtlclBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiV29ya2VyUHJvY2VzcyIsInN0YXJ0IiwiX2hvb2tXb3JrZXJFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2hvb2tXb3JrZXJEZWJ1Z2dlckV2ZW50cyIsIl90aGlzIiwic3Vic2NyaWJlIiwiX2hhbmRsZUJlZm9yZUNvbW1hbmQiLCJiaW5kIiwiX2hhbmRsZUFmdGVyQ29tbWFuZCIsIm9uIiwicGF5bG9hZCIsImV4aXREb25lIiwiZW1pdCIsImV4aXRDb2RlIiwicHJvbWlzZSIsIk94eWdlbkVycm9yIiwiZXJyb3JDb2RlIiwiU0NSSVBUX0VSUk9SIiwibXNnIiwibGV2ZWwiLCJpbmZvIiwiZXJyIiwidGltZSIsInNyYyIsInN0YWNrIiwibWV0aG9kIiwiYnJlYWtwb2ludERhdGEiLCJicmVha0Vycm9yIiwib25TdGVwU3RhcnQiLCJtb2R1bGUiLCJvblN0ZXBFbmQiLCJfZW1pdEl0ZXJhdGlvbkVuZCIsInRzIiwidGMiLCJzdWl0ZUl0ZXJhdGlvbk51bSIsImNhc2VJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uUmVzdWx0IiwiX3N0YXR1cyIsIl9lbWl0VGVzdEVuZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi9saWIvbG9nZ2VyJztcclxuY29uc3QgbG9nID0gbG9nZ2VyKCdPeHlnZW5SdW5uZXInKTtcclxuY29uc3QgREVGQVVMVF9JU1NVRVIgPSAndXNlcic7XHJcblxyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgXyAgZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcblxyXG5pbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0UmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3Rlc3QtcmVzdWx0JztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi8uLi9tb2RlbC9zdGF0dXMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uLy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3h5Z2VuRXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IFBhcmFtZXRlck1hbmFnZXIgZnJvbSAnLi4vLi4vbGliL3BhcmFtLW1hbmFnZXIuanMnO1xyXG5pbXBvcnQgV29ya2VyUHJvY2VzcyBmcm9tICcuLi9Xb3JrZXJQcm9jZXNzJztcclxuXHJcbi8vIHNub296ZSBmdW5jdGlvbiAtIGFzeW5jIHdyYXBwZXIgYXJvdW5kIHNldFRpbWVvdXQgZnVuY3Rpb25cclxuY29uc3Qgc25vb3plID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG5jb25zdCBnZXRTdWl0ZXNCcmVha3BvaW50cyA9IChzdWl0ZXMpID0+IHtcclxuICAgIGNvbnN0IHJldHZhbCA9IFtdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwucHVzaChicmVha3BvaW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG59O1xyXG5cclxuY29uc3QgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMgPSAoc3VpdGVzLCByZW1vdmVCcmVha3BvaW50KSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3VpdGVzICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZXMpICYmXHJcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICAgIHN1aXRlcy5tYXAoKHN1aXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHN1aXRlICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhemUuYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLm1hcCgoYnJlYWtwb2ludCwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5maWxlID09PSByZW1vdmVCcmVha3BvaW50LmZpbGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmxpbmUgPT09IHJlbW92ZUJyZWFrcG9pbnQubGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlblJ1bm5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyBjbGFzcyB2YXJpYWJsZXNcclxuICAgICAgICB0aGlzLl9pZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX25wbUdSb290RXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5ucG1HUm9vdEV4ZWN1dGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVmaW5lIHZhcmlhYmxlcyB0byBpdGVyYXRlIHRocm91Z2ggdGVzdCBjYXNlcyBhbmQgdGVzdCBzdWl0ZSBpdGVyYXRpb25zXHJcbiAgICAgICAgdGhpcy5fc3VpdGU7XHJcbiAgICAgICAgdGhpcy5fZW52VmFycyA9IHt9OyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHBhc3NlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0XHJcbiAgICAgICAgdGhpcy5fdmFycyA9IHt9OyAgICAgLy8gdXNlci1kZWZpbmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgc2NyaXB0c1xyXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7fTsgLy8gZGVzaXJlZCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgcGFzc2VkIHRvIGVhY2ggbW9kdWxlXHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RLaWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IDM7XHJcbiAgICAgICAgLy8gcHJvbWlzZXNcclxuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICogUHVibGljIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICghb3B0aW9ucy5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9jd2QgPSB0aGlzLl9vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIG1lcmdlIGN1cnJlbnQgYW5kIHRlc3QgY29uZmlndXJhdGlvbiBiYXNlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgbGV0IG9wdEVudiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnYpIHtcclxuICAgICAgICAgICAgICAgIC8vICdlbnYnIG9wdGlvbiBtaWdodCBiZSBkZWZpbmVkIGVpdGhlciBhcyBhIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IG9yIGFzIGFuIG9iamVjdCB0aGF0IGxpc3RzIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGEgc3RyaW5nLCB0aGVuIHJlc29sdmUgdGhlIGFjdHVhbCB2YXJpYWJsZXMgZnJvbSAnZW52cycgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3B0aW9ucy5lbnZzID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnZzW29wdGlvbnMuZW52XTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAnZW52JyBpcyBhbiBvYmplY3QsIHVzZSB0aGUgdmFyaWFibGVzIGRlZmluZWQgaW4gaXRcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmVudiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnYpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudlZhcnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnZWYXJzKSkge1xyXG4gICAgICAgICAgICAgICAgb3B0RW52ID0geyAuLi5vcHRFbnYsIC4uLm9wdGlvbnMuZW52VmFycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgICAgdGhpcy5fZW52ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgLi4ub3B0RW52XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYXBzID0geyAuLi5jYXBzIH07IC8vIGFzc2lnbiBjYXBzIGZvciBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XHJcbiAgICAgICAgLy8gc2V0IHVwIGRlYnVnZ2luZyBvcHRpb25zXHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gZGVidWdnaW5nIChpbml0aWFsaXplRGVidWdnZXIpIHNob3VsZCBiZSByZW1vdmVkIGZyb20gT3h5Z2VuXHJcbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG9wdGlvbnMuZGVidWdQb3J0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IG9wdGlvbnMuZGVidWdQb3J0IHx8IG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9ICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubG9jYWxUaW1lKSB8fCB0aGlzLl9sb2NhbFRpbWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRXb3JrZXJQcm9jZXNzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RvcChzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygncnVubmVyIGRpc3Bvc2UgZScsIGUpO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGR1cmluZyB0aGUgZGlzcG9zZVxyXG4gICAgICAgICAgICBsb2cud2FybignRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyOicsIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gJ0NBTkNFTEVEJykge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluaXRpYWxpemF0aW9uIGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQsIHdhaXQgZm9yICdpbml0aWFsaXplZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgdGVzdCBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciAndGVzdC1lbmRlZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyU3RhcnQodGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHMpO1xyXG5cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blRlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlcnJvciAmJiByZXN1bHQgJiYgcmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSByZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyRW5kKHRoaXMuX2lkLCByZXN1bHQsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMga2lsbChzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIua2lsbChzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0NvbnRpbnVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpIHtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHNCcmVha3BvaW50cyA9IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5nZXRCcmVha3BvaW50cyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZXNCcmVha3BvaW50cyA9IGdldFN1aXRlc0JyZWFrcG9pbnRzKHRoaXMuX3N1aXRlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGJyZWFrcG9pbnRzIGZyb20gc3VpdGVzL2Nhc2VzIHRyZWVcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHN1aXRlQnAgb2Ygc3VpdGVzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKHN1aXRlQnAubGluZSkgJiYgIGZpbGVQYXRoID09PSBzdWl0ZUJwLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXModGhpcy5fc3VpdGVzLCBzdWl0ZUJwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlbGV0ZWQgYnJlYWtwb2ludHNcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGFjdHVhbEN1cnJlbnRCcCBvZiB0c0JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmVha3BvaW50cy5pbmNsdWRlcyhhY3R1YWxDdXJyZW50QnApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fd29ya2VyLmRlYnVnZ2VyLnJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlKGZpbGVQYXRoLCBhY3R1YWxDdXJyZW50QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdXNlclNldEJwIG9mIGJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0c0JyZWFrcG9pbnRzLmluY2x1ZGVzKHVzZXJTZXRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludChmaWxlUGF0aCwgdXNlclNldEJwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlQWxsUHJvbWlzZSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoJ3VwZGF0ZUJyZWFrcG9pbnRzKCkgZG9uZS4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9taXNlQWxsUHJvbWlzZSA6IHByb21pc2VBbGxQcm9taXNlLCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIDogYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbENsb3NlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5fc2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAncmVwbCcsXHJcbiAgICAgICAgICAgIG5hbWU6ICdyZXBsX3N0b3AnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbFNlbmQoY21kKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfZXZhbCcsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNtZDogY21kXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZSgncmVwbFN0YXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QnJlYWtwb2ludChsaW5lKSB7XHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl9zdWl0ZSAmJiB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGMgPSB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXNbdGNpbmRleF07XHJcbiAgICAgICAgICAgIGxvZy5kZWJ1Zygnb3h5Z2VuLnNldEJyZWFrcG9pbnQ6ICcgKyAobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KHRjLm5hbWUsIGxpbmUgKyB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCk7XHJcbiAgICAgICAgfSovXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jbGVhckJyZWFrcG9pbnQobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0LCBudWxsKTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgYXN5bmMgX3J1blRlc3QoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICByZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5zdWl0ZXMgPSBbXTtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8vIGNhbGwgYmVmb3JlVGVzdCBob29rXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBzdWl0ZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGUgb2YgdGhpcy5fc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blN1aXRlKHN1aXRlKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICByZXN1bHQuZHVyYXRpb24gPSByZXN1bHQuZW5kVGltZSAtIHJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHJlc3VsdC5zdWl0ZXMuc29tZShzdWl0ZUl0ZXJhdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3VpdGVJdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoc3VpdGVJdGVyYXRpb25zKSAmJiBzdWl0ZUl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBoYXNGYWlsZWRTdWl0ZXMgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICByZXN1bHQuZW52aXJvbm1lbnQgPSB7IC4uLnRoaXMuX2VudiB9O1xyXG4gICAgICAgIC8vIGNvbWJpbmUgdGVzdCBkZWZpbmVkIGNhcHMgYW5kIHBlciBtb2R1bGUgY2FwYWJpbGl0aWVzLCB0aGF0IHdlcmUgcGFzc2VkIGJ5IHVzZXIgaW4gZWFjaCBtb2R1bGUncyBpbml0IGZ1bmN0aW9uXHJcbiAgICAgICAgcmVzdWx0LmNhcGFiaWxpdGllcyA9IHsgLi4udGhpcy5fY2FwcywgLi4udGhpcy5fbW9kQ2FwcyB9OyAgICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9jYXBzIG9iamVjdFxyXG4gICAgICAgIHJlc3VsdC5vcHRpb25zID0geyAuLi50aGlzLl9vcHRpb25zIH07ICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9vcHRpb25zIG9iamVjdFxyXG5cclxuICAgICAgICAvLyBpZiBlcnJvciBvY2N1cmVkLCBhZGQgaXQgdG8gdGhlIHN1bW1hcnlcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3J1blN1aXRlKHN1aXRlKSB7XHJcbiAgICAgICAgaWYgKCFzdWl0ZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ3N1aXRlIGlzIG51bGwgaW4gX3J1blN1aXRlKCkhISEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWdub3JlIHN1aXRlIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgcHJvcGVydGllc1xyXG4gICAgICAgIGlmICghc3VpdGUubmFtZSAmJiAhc3VpdGUucGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBhbHdheXMgc3BlY2lmeSBzdWl0ZS5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgIGlmICghc3VpdGUuaXRlcmF0aW9uQ291bnQpIHtcclxuICAgICAgICAgICAgc3VpdGUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN1aXRlLml0ZXJhdGlvbkNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2luZ2xlIHN1aXRlIG1pZ2h0IHByb2R1Y2UgbXVsdGlwbGUgcmVzdWx0cywgYmFzZWQgb24gYW1vdW50IG9mIGRlZmluZWQgaXRlcmF0aW9uc1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSXRlcmF0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHN1aXRlSXRlcmF0aW9uPTE7IHN1aXRlSXRlcmF0aW9uIDw9IHN1aXRlLml0ZXJhdGlvbkNvdW50OyBzdWl0ZUl0ZXJhdGlvbisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIHN1aXRlSXRlcmF0aW9uLCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IG5ldyBUZXN0U3VpdGVSZXN1bHQoKTtcclxuICAgICAgICAgICAgc3VpdGVJdGVyYXRpb25zLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5uYW1lID0gc3VpdGUubmFtZSB8fCBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHN1aXRlLnBhdGgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IHN1aXRlSXRlcmF0aW9uO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVTdGFydCh0aGlzLl9pZCwgc3VpdGUudXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNhemUgb2Ygc3VpdGUuY2FzZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXNlcyB3aXRoIG1pc3NpbmcgbWFuZGF0b3J5ICdwYXRoJyBwcm9wZXJ0eSBcclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUubmFtZSA9IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoY2F6ZS5wYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZUl0ZXJhdGlvbj0xOyBjYXNlSXRlcmF0aW9uIDw9IGNhemUuaXRlcmF0aW9uQ291bnQ7IGNhc2VJdGVyYXRpb24rKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2F6ZSAmJiBjYXplLml0ZXJhdGlvbkNvdW50ICYmIGNhemUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIGNhc2VJdGVyYXRpb24sICdDYXNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZVJ1bkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEICYmIHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCAmJiByZVJ1bkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlUnVuQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgb24gY2FuY2VsZWQgc3RhdHVzIG5vdCBjbG9zZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlcl9EaXNwb3NlTW9kdWxlcygncGFzc2VkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnJlUnVuQ291bnQgPSByZVJ1bkNvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgY2FzZVJlc3VsdCwgJ0Nhc2UnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgIT09ICdib29sZWFuJyB8fCB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKGNhc2VSZXN1bHQuc3RhdHVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5jYXNlcy5wdXNoKGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRlc3QgY2FzZSBpdGVyYXRpb24gaGFzIGZhaWxlZCwgdGhlbiBtYXJrIHRoZSBlbnRpcmUgdGVzdCBjYXNlIGFzIGZhaWxlZCwgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBpdGVyYXRpbmcgb3ZlciBpdCBhbmQgbW92ZSB0byB0aGUgbmV4dCB0ZXN0IGNhc2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZHVyYXRpb24gPSBzdWl0ZVJlc3VsdC5lbmRUaW1lIC0gc3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25FbmQodGhpcy5faWQsIHN1aXRlUmVzdWx0LCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vblN1aXRlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHJlUnVuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBnZXQgdGVzdCBzdWl0ZSdzIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIC8vIGdldCB0aGVtIGZpcnN0IGFuZCB0aGVuIG92ZXJyaWRlIHdpdGggdGVzdCBjYXNlIGxldmVsIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5wYXJhbU1hbmFnZXIucmVhZFByZXYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIHN1aXRlLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZWFkIHRlc3QgY2FzZSdzIG5leHQgbGluZXMgb2YgcGFyYW1ldGVycyBpZiBwYXJhbWV0ZXIgbWFuYWdlciBpcyBkZWZpbmVkXHJcbiAgICAgICAgaWYgKGNhemUucGFyYW1NYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChyZVJ1bikge1xyXG4gICAgICAgICAgICAgICAgY2F6ZS5wYXJhbU1hbmFnZXIucmVhZFByZXYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIGNhemUucGFyYW1NYW5hZ2VyLmdldFZhbHVlcygpKTtcclxuICAgICAgICAgICAgY2F6ZS5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkZCBicmVha3BvaW50cyBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IGlmIGluIGRlYnVnIG1vZGVcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgY2F6ZS5icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8IGNhemUuYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIGVkaXRvciBpbmRleCBzdGFydHMgZnJvbSAxLCBidXQgd2UgbmVlZCB6ZXJvIGJhc2VkIGluZGV4XHJcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGNhemUuYnJlYWtwb2ludHNbaV0ubGluZTtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gY2F6ZS5icmVha3BvaW50c1tpXS5maWxlO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGUsIGxpbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5lbWl0KCdpdGVyYXRpb246c3RhcnQnLCBjYXNlSXRlcmF0aW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rKGNhemUpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZVN0YXJ0KHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQgfHwgY2F6ZS5wYXRoLCBjYXplKTtcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5uYW1lID0gY2F6ZS5uYW1lO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXplLnBhdGg7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBjYXNlSXRlcmF0aW9uO1xyXG5cclxuICAgICAgICAvLyB0cnkgdG8gaW5pdGlhbGl6ZSBPeHlnZW4gYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAoISh0aGlzLl93b3JrZXIpICYmIHRoaXMuX3dvcmtlcl9Jbml0T3h5Z2VuKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXJfSW5pdE94eWdlbigpIHRocm93biBhbiBlcnJvcjonLCBlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBpbiB0aGUgd29ya2VyIHByb2Nlc3MgYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXN1bHRTdG9yZSwgY29udGV4dCwgbW9kdWxlQ2FwcywgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1Rlc3RSZXN1bHRzKHsgcmVzdWx0U3RvcmUsIGNvbnRleHQsIGVycm9yLCBtb2R1bGVDYXBzIH0pO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IGNhc2VSZXN1bHQuZW5kVGltZSAtIGNhc2VSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RlcHMgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5zdGVwcyA/IHJlc3VsdFN0b3JlLnN0ZXBzIDogW107XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5sb2dzID8gcmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5oYXIgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5oYXIgPyByZXN1bHRTdG9yZS5oYXIgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IGNhc2UgaXRlcmF0aW9uIHN0YXR1cyAtIG1hcmsgaXQgYXMgZmFpbGVkIGlmIGFueSBzdGVwIGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgIHZhciBmYWlsZWRTdGVwcyA9IF8uZmluZChjYXNlUmVzdWx0LnN0ZXBzLCB7c3RhdHVzOiBTdGF0dXMuRkFJTEVEfSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IF8uaXNFbXB0eShmYWlsZWRTdGVwcykgJiYgIWVycm9yID8gU3RhdHVzLlBBU1NFRCA6IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IG94dXRpbC5tYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQoY2FzZVJlc3VsdC5zdGVwcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9SdW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcykge1xyXG4gICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlciBpcyBudWxsIGJ1dCBub3Qgc3VwcG9zZSB0byEnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQucmVqZWN0KG5ldyBFcnJvcignX3dvcmtlciBpcyBudWxsJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RhcnQgcnVubmluZyB0aGUgdGVzdFxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl93b3JrZXIucnVuKHtcclxuICAgICAgICAgICAgc2NyaXB0TmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICBzY3JpcHRQYXRoOiBjYXplLnBhdGgsXHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgZW52OiB0aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICBjYXBzOiB0aGlzLl9jYXBzLFxyXG4gICAgICAgICAgICAgICAgdmFyczogdGhpcy5fdmFycyxcclxuICAgICAgICAgICAgICAgIHRlc3Q6IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNhemUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzdWl0ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwb0ZpbGU6IHRoaXMuX29wdGlvbnMucG8gfHwgbnVsbCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX0luaXRPeHlnZW4oKSB7XHJcbiAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW5pdCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2FwcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfRGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRpc3Bvc2VNb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVRlc3QnLCBbdGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHNdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVTdWl0ZUhvb2soc3VpdGUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVN1aXRlJywgW3N1aXRlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNhc2UnLCBbY2F6ZV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJUZXN0JywgW3RoaXMuX2lkLCByZXN1bHRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlclRlc3RcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgcmVzdWx0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyU3VpdGUnLCBbc3VpdGUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayhjYXplLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDYXNlJywgW2NhemUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zdGFydFdvcmtlclByb2Nlc3MoKSB7XHJcbiAgICAgICAgY29uc3Qgd29ya2VyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd3b3JrZXIuanMnKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgV29ya2VyUHJvY2Vzcyh0aGlzLl9pZCwgd29ya2VyUGF0aCwgdGhpcy5fZGVidWdNb2RlLCB0aGlzLl9kZWJ1Z1BvcnQsICdPeHlnZW4nLCB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0KCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckV2ZW50cygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydERlYnVnZ2VyKCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tXb3JrZXJFdmVudHMoKSB7XHJcbiAgICAgICAgLy8gcHJlc2VydmUgdGhpcyBvYmplY3RcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5zdWJzY3JpYmUoJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLl9oYW5kbGVBZnRlckNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdlcnJvcicsIChwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignV29ya2VyIHByb2Nlc3MgZXJyb3I6ICcsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXREb25lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdleGl0JywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IHBheWxvYWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhpdENvZGUgJiYgZXhpdENvZGUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgb3IgaXMgYmVpbmcgZGlzcG9zZWQgYW5kIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBkaWVkLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBlbmQgdGhlIHRlc3Qgb3IgZGlzcG9zYWwgd2l0aCBmYXRhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgLy8gKGNoaWxkIHByb2Nlc3Mgbm90IHN1cHBvc2UgdG8gZGllIHdpdGggY29kZSA+IDApXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzRGlzcG9zaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuRGlzcG9zZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5faXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpdENvZGUgPT0gMTM0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgT3h5Z2VuRXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ091dCBvZiBtZW1vcnkgZXJyb3IuIE1ha2Ugc3VyZSB0aGF0IHlvdSBkb25cXCd0IGhhdmUgYW55IG1lbW9yeSBsZWFrcyBpbiB0aGUgdGVzdCBzY3JpcHQuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihgV29ya2VyIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZTogJHtleGl0Q29kZX0uYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZSAmJiBwcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVzZXRHbG9iYWxWYXJpYWJsZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5vbignbWVzc2FnZScsIGFzeW5jIChtc2cpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLmxldmVsID09PSAnREVCVUcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdJTkZPJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdFUlJPUicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLm1zZywgbXNnLmVycik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ1dBUk4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbG9nJywgbXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXIgJiYgX3RoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xpbmUtdXBkYXRlJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbGluZS11cGRhdGUnLCBtc2cubGluZSwgbXNnLnN0YWNrLCBtc2cudGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3Jlc3VsdC11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnaW5pdC1kb25lJywgbXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnd29ya2VyRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd29ya2VyRXJyb3I6JywgbXNnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmtpbGwoJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdyZXBsJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgncmVwbCcsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIub24oJ2RlYnVnZ2VyOmJyZWFrJywgKGJyZWFrcG9pbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludCcsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWtFcnJvcicsIChicmVha0Vycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludEVycm9yJywgYnJlYWtFcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUJlZm9yZUNvbW1hbmQoZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uU3RlcFN0YXJ0KHRoaXMuX2lkLCBlKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVDb21tYW5kJywgW2VdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25TdGVwRW5kKHRoaXMuX2lkLCBlLnJlc3VsdCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNvbW1hbmQnLCBbZS5yZXN1bHRdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNldEdsb2JhbFZhcmlhYmxlcygpIHtcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NUZXN0UmVzdWx0cyh7IHJlc3VsdFN0b3JlLCBtb2R1bGVDYXBzLCBjb250ZXh0ID0ge30sIGVycm9yID0gbnVsbCB9KSB7XHJcbiAgICAgICAgLy8gaWYgdGVzdCB3YXMga2lsbGVkIGJlZm9yZSBhbnkgcmVzdWx0cyB3ZXJlIGdlbmVyYXRlZCwgdGhlbiBqdXN0IGZpbmFsaXplIHRoZSB0ZXN0IHdpdGhvdXQgcHJvY2Vzc2luZyByZXN1bHRzXHJcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLaWxsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0b3JlICd2YXJzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX3ZhcnMgPSBjb250ZXh0LnZhcnMgfHwgdGhpcy5fdmFycztcclxuICAgICAgICAvLyBzdG9yZSAnbW9kQ2FwcycgcGFydCBvZiB0aGUgY29udGV4dCBmb3IgYSBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0geyAuLi50aGlzLl9tb2RDYXBzLCAuLi5tb2R1bGVDYXBzIHx8IHt9IH07XHJcbiAgICAgICAgLy8gY2xlYW4gdXAgY29udGV4dCBmcm9tIGludGVybmFsIGVsZW1lbnRzLCBub3QgbmVlZCBpbiB0aGUgcmVwb3J0OlxyXG4gICAgICAgIC8vIHJlbW92ZSBjYXBzIGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LmNhcHMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmNhcHM7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGVudiBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC5lbnYpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmVudjtcclxuICAgICAgICAvLyByZW1vdmUgdGVzdCBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC50ZXN0KVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC50ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIF9lbWl0SXRlcmF0aW9uRW5kKHRzLCB0Yywgc3VpdGVJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25SZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2l0ZXJhdGlvbi1lbmQnLCB7XHJcbiAgICAgICAgICAgIHN0YXR1czogY2FzZUl0ZXJhdGlvblJlc3VsdC5fc3RhdHVzLFxyXG4gICAgICAgICAgICBmYWlsdXJlOiBjYXNlSXRlcmF0aW9uUmVzdWx0LmZhaWx1cmUgfHwgbnVsbCxcclxuICAgICAgICAgICAgY2FzZToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRjLmlkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0Yy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRjLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogdHMuaWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRzLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRzLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZW1pdFRlc3RFbmQocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVuZCcsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQYXJhbWV0ZXJNYW5hZ2VyIH07Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBVUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUE2QztBQWhCN0MsTUFBTUEsR0FBRyxHQUFHLElBQUFDLGVBQU0sRUFBQyxjQUFjLENBQUM7QUFDbEMsTUFBTUMsY0FBYyxHQUFHLE1BQU07QUFrQjdCLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQU8sRUFBRUYsRUFBRSxDQUFDLENBQUM7QUFFcEUsTUFBTUksb0JBQW9CLEdBQUlDLE1BQU0sSUFBSztFQUNyQyxNQUFNQyxNQUFNLEdBQUcsRUFBRTtFQUVqQixJQUNJRCxNQUFNLElBQ05FLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSCxNQUFNLENBQUMsSUFDckJBLE1BQU0sQ0FBQ0ksTUFBTSxHQUFHLENBQUMsRUFDbkI7SUFDRUosTUFBTSxDQUFDSyxHQUFHLENBQUVDLEtBQUssSUFBSztNQUNsQixJQUNJQSxLQUFLLElBQ0xBLEtBQUssQ0FBQ0MsS0FBSyxJQUNYTCxLQUFLLENBQUNDLE9BQU8sQ0FBQ0csS0FBSyxDQUFDQyxLQUFLLENBQUMsSUFDMUJELEtBQUssQ0FBQ0MsS0FBSyxDQUFDSCxNQUFNLEdBQUcsQ0FBQyxFQUN4QjtRQUNFRSxLQUFLLENBQUNDLEtBQUssQ0FBQ0YsR0FBRyxDQUFFRyxJQUFJLElBQUs7VUFDdEIsSUFDSUEsSUFBSSxJQUNKQSxJQUFJLENBQUNDLFdBQVcsSUFDaEJQLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxJQUMvQkQsSUFBSSxDQUFDQyxXQUFXLENBQUNMLE1BQU0sR0FBRyxDQUFDLEVBQzdCO1lBQ0VJLElBQUksQ0FBQ0MsV0FBVyxDQUFDSixHQUFHLENBQUVLLFVBQVUsSUFBSztjQUNqQ1QsTUFBTSxDQUFDVSxJQUFJLENBQUNELFVBQVUsQ0FBQztZQUMzQixDQUFDLENBQUM7VUFDTjtRQUNKLENBQUMsQ0FBQztNQUNOO0lBQ0osQ0FBQyxDQUFDO0VBQ047RUFFQSxPQUFPVCxNQUFNO0FBQ2pCLENBQUM7QUFFRCxNQUFNVywwQkFBMEIsR0FBRyxDQUFDWixNQUFNLEVBQUVhLGdCQUFnQixLQUFLO0VBQzdELElBQ0liLE1BQU0sSUFDTkUsS0FBSyxDQUFDQyxPQUFPLENBQUNILE1BQU0sQ0FBQyxJQUNyQkEsTUFBTSxDQUFDSSxNQUFNLEdBQUcsQ0FBQyxFQUNuQjtJQUNFSixNQUFNLENBQUNLLEdBQUcsQ0FBRUMsS0FBSyxJQUFLO01BQ2xCLElBQ0lBLEtBQUssSUFDTEEsS0FBSyxDQUFDQyxLQUFLLElBQ1hMLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRyxLQUFLLENBQUNDLEtBQUssQ0FBQyxJQUMxQkQsS0FBSyxDQUFDQyxLQUFLLENBQUNILE1BQU0sR0FBRyxDQUFDLEVBQ3hCO1FBQ0VFLEtBQUssQ0FBQ0MsS0FBSyxDQUFDRixHQUFHLENBQUVHLElBQUksSUFBSztVQUN0QixJQUNJQSxJQUFJLElBQ0pBLElBQUksQ0FBQ0MsV0FBVyxJQUNoQlAsS0FBSyxDQUFDQyxPQUFPLENBQUNLLElBQUksQ0FBQ0MsV0FBVyxDQUFDLElBQy9CRCxJQUFJLENBQUNDLFdBQVcsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsRUFDN0I7WUFDRUksSUFBSSxDQUFDQyxXQUFXLENBQUNKLEdBQUcsQ0FBQyxDQUFDSyxVQUFVLEVBQUVJLEdBQUcsS0FBSztjQUN0QyxJQUNJSixVQUFVLENBQUNLLElBQUksS0FBS0YsZ0JBQWdCLENBQUNFLElBQUksSUFDekNMLFVBQVUsQ0FBQ00sSUFBSSxLQUFLSCxnQkFBZ0IsQ0FBQ0csSUFBSSxFQUMzQztnQkFDRVIsSUFBSSxDQUFDQyxXQUFXLENBQUNRLE1BQU0sQ0FBQ0gsR0FBRyxFQUFFLENBQUMsQ0FBQztjQUNuQztZQUNKLENBQUMsQ0FBQztVQUNOO1FBQ0osQ0FBQyxDQUFDO01BQ047SUFDSixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUM7QUFFYyxNQUFNSSxZQUFZLFNBQVNDLG9CQUFZLENBQUM7RUFDbkRDLFdBQVcsQ0FBQ0MsT0FBTyxFQUFFO0lBQ2pCLEtBQUssRUFBRTtJQUVQLElBQUksQ0FBQ0MsR0FBRyxHQUFHQyxhQUFNLENBQUNDLGdCQUFnQixFQUFFO0lBQ3BDLElBQUksQ0FBQ0MsVUFBVSxHQUFHLEtBQUs7SUFDdkIsSUFBSSxDQUFDQyxlQUFlLEdBQUcsS0FBSztJQUM1QixJQUFJLENBQUNDLFlBQVksR0FBRyxLQUFLO0lBQ3pCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7SUFDbkIsSUFBSSxDQUFDQyxVQUFVLEdBQUcsS0FBSztJQUN2QixJQUFJLENBQUNDLG9CQUFvQixHQUFHLElBQUk7SUFFaEMsSUFBSSxDQUFDQyxrQkFBa0IsR0FBRyxJQUFJO0lBQzlCLElBQUlWLE9BQU8sSUFBSSxPQUFPQSxPQUFPLENBQUNXLGlCQUFpQixLQUFLLFdBQVcsRUFBRTtNQUM3RCxJQUFJLENBQUNELGtCQUFrQixHQUFHVixPQUFPLENBQUNXLGlCQUFpQjtJQUN2RDtJQUdBLElBQUksQ0FBQ0MsTUFBTTtJQUNYLElBQUksQ0FBQ0MsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLENBQUNDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUNDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbEIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtJQUNwQixJQUFJLENBQUNDLFVBQVUsR0FBRyxLQUFLO0lBQ3ZCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEtBQUs7SUFDeEIsSUFBSSxDQUFDQyx3QkFBd0IsR0FBRyxDQUFDO0lBRWpDLElBQUksQ0FBQ0MsYUFBYSxHQUFHLElBQUFDLFdBQUssR0FBRTtFQUNoQztFQUlBLE1BQU1DLElBQUksQ0FBQ3ZCLE9BQU8sRUFBRXdCLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsUUFBUSxFQUFFO0lBRXJDLElBQUksQ0FBQ3pCLE9BQU8sQ0FBQ3JCLE1BQU0sRUFBRTtNQUNqQixNQUFNLElBQUkrQyxLQUFLLENBQUMsMEdBQTBHLENBQUM7SUFDL0g7SUFFQSxJQUFJLENBQUNULFFBQVEsR0FBR2pCLE9BQU87SUFDdkIsSUFBSSxDQUFDMkIsSUFBSSxHQUFHLElBQUksQ0FBQ1YsUUFBUSxDQUFDVyxHQUFHLElBQUlDLE9BQU8sQ0FBQ0QsR0FBRyxFQUFFO0lBQzlDLElBQUksQ0FBQ0UsU0FBUyxHQUFHTCxRQUFRO0lBQ3pCLElBQUksQ0FBQ00sY0FBYyxHQUFHLElBQUk7SUFFMUIsSUFBSS9CLE9BQU8sRUFBRTtNQUVULElBQUlnQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO01BQ2YsSUFBSWhDLE9BQU8sQ0FBQ2lDLEdBQUcsRUFBRTtRQUdiLElBQUksT0FBT2pDLE9BQU8sQ0FBQ2lDLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBT2pDLE9BQU8sQ0FBQ2tDLElBQUksS0FBSyxRQUFRLElBQUlsQyxPQUFPLENBQUNrQyxJQUFJLENBQUNsQyxPQUFPLENBQUNpQyxHQUFHLENBQUMsRUFBRTtVQUNsR0QsTUFBTSxHQUFHaEMsT0FBTyxDQUFDa0MsSUFBSSxDQUFDbEMsT0FBTyxDQUFDaUMsR0FBRyxDQUFDO1FBRXRDLENBQUMsTUFFSSxJQUFJLE9BQU9qQyxPQUFPLENBQUNpQyxHQUFHLEtBQUssUUFBUSxJQUFJRSxNQUFNLENBQUNDLElBQUksQ0FBQ3BDLE9BQU8sQ0FBQ2lDLEdBQUcsQ0FBQyxFQUFFO1VBQ2xFRCxNQUFNLEdBQUdoQyxPQUFPLENBQUNpQyxHQUFHO1FBQ3hCO01BQ0o7TUFFQSxJQUFJakMsT0FBTyxDQUFDcUMsT0FBTyxJQUFJRixNQUFNLENBQUNDLElBQUksQ0FBQ3BDLE9BQU8sQ0FBQ3FDLE9BQU8sQ0FBQyxFQUFFO1FBQ2pETCxNQUFNLEdBQUc7VUFBRSxHQUFHQSxNQUFNO1VBQUUsR0FBR2hDLE9BQU8sQ0FBQ3FDO1FBQVEsQ0FBQztNQUM5QztNQUdBLElBQUksQ0FBQ0MsSUFBSSxHQUFHO1FBQ1IsR0FBRyxJQUFJLENBQUNBLElBQUk7UUFDWixHQUFHTjtNQUNQLENBQUM7SUFDTDtJQUVBLElBQUksQ0FBQ2pCLEtBQUssR0FBRztNQUFFLEdBQUdTO0lBQUssQ0FBQztJQUN4QixJQUFJLENBQUNlLE9BQU8sR0FBRyxDQUFFLEdBQUd2QyxPQUFPLENBQUNyQixNQUFNLENBQUU7SUFJcEMsSUFBSSxDQUFDNkIsVUFBVSxHQUFJUixPQUFPLENBQUN3QyxZQUFZLElBQUl4QyxPQUFPLENBQUN5QyxTQUFTLEdBQUcsSUFBSSxHQUFHLEtBQUs7SUFDM0UsSUFBSSxDQUFDQyxVQUFVLEdBQUcxQyxPQUFPLENBQUN5QyxTQUFTLElBQUl6QyxPQUFPLENBQUN3QyxZQUFZLElBQUksSUFBSTtJQUNuRXhDLE9BQU8sQ0FBQzJDLHVCQUF1QixHQUFHLElBQUksQ0FBQ3ZCLHdCQUF3QjtJQUMvRCxJQUFJLENBQUNGLFVBQVUsR0FBSSxJQUFJLENBQUNELFFBQVEsSUFBSSxJQUFJLENBQUNBLFFBQVEsQ0FBQzJCLFNBQVMsSUFBSyxJQUFJLENBQUMxQixVQUFVO0lBQy9FLE1BQU0sSUFBSSxDQUFDMkIsbUJBQW1CLEVBQUU7SUFDaEMsTUFBTSxJQUFJLENBQUNDLGtCQUFrQixFQUFFO0VBQ25DO0VBRUEsTUFBTUMsT0FBTyxDQUFDQyxNQUFNLEdBQUcsSUFBSSxFQUFFO0lBQ3pCLElBQUksQ0FBQzFDLFlBQVksR0FBRyxJQUFJO0lBQ3hCLElBQUk7TUFDQSxJQUFJLElBQUksQ0FBQ0MsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDMEMsU0FBUyxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxDQUFDMUMsT0FBTyxDQUFDMkMsSUFBSSxDQUFDRixNQUFNLENBQUM7TUFDbkM7SUFDSixDQUFDLENBQUMsT0FBT0csQ0FBQyxFQUFFO01BQ1JDLE9BQU8sQ0FBQ2xGLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRWlGLENBQUMsQ0FBQztNQUVsQ2pGLEdBQUcsQ0FBQ21GLElBQUksQ0FBQyw4QkFBOEIsRUFBRUYsQ0FBQyxDQUFDO0lBQy9DO0lBRUEsSUFBSUgsTUFBTSxLQUFLLFVBQVUsRUFBRTtNQUN2QixJQUFJLENBQUNNLHFCQUFxQixFQUFFO0lBQ2hDO0VBQ0o7RUFFQSxNQUFNQyxHQUFHLEdBQUc7SUFDUixJQUFJLElBQUksQ0FBQ2xELGVBQWUsRUFBRTtNQUN0QixNQUFNLElBQUlxQixLQUFLLENBQUMsd0VBQXdFLENBQUM7SUFDN0Y7SUFDQSxJQUFJLElBQUksQ0FBQ3RCLFVBQVUsRUFBRTtNQUNqQixNQUFNLElBQUlzQixLQUFLLENBQUMsNkRBQTZELENBQUM7SUFDbEY7SUFDQSxJQUFJLENBQUN0QixVQUFVLEdBQUcsSUFBSTtJQUV0QixJQUFJLENBQUMwQixTQUFTLENBQUMwQixhQUFhLENBQUMsSUFBSSxDQUFDdkQsR0FBRyxFQUFFLElBQUksQ0FBQ2dCLFFBQVEsRUFBRSxJQUFJLENBQUNGLEtBQUssQ0FBQztJQUVqRSxJQUFJMEMsS0FBSyxHQUFHLElBQUk7SUFDaEIsSUFBSUMsTUFBTSxHQUFHLElBQUk7SUFDakIsSUFBSTtNQUNBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNDLFFBQVEsRUFBRTtJQUNsQyxDQUFDLENBQ0QsT0FBT1IsQ0FBQyxFQUFFO01BQ05NLEtBQUssR0FBR04sQ0FBQztJQUNiO0lBRUEsSUFBSSxDQUFDTSxLQUFLLElBQUlDLE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxPQUFPLEVBQUU7TUFDcENILEtBQUssR0FBR0MsTUFBTSxDQUFDRSxPQUFPO0lBQzFCO0lBRUEsSUFBSSxDQUFDOUIsU0FBUyxDQUFDK0IsV0FBVyxDQUFDLElBQUksQ0FBQzVELEdBQUcsRUFBRXlELE1BQU0sRUFBRUQsS0FBSyxDQUFDO0lBQ25ELElBQUksQ0FBQ3JELFVBQVUsR0FBRyxLQUFLO0lBQ3ZCLElBQUlxRCxLQUFLLEVBQUU7TUFDUCxNQUFNQSxLQUFLO0lBQ2Y7SUFDQSxPQUFPQyxNQUFNO0VBQ2pCO0VBRUEsTUFBTUksSUFBSSxDQUFDZCxNQUFNLEdBQUcsSUFBSSxFQUFFO0lBQ3RCLElBQUksQ0FBQzdCLFdBQVcsR0FBRyxJQUFJO0lBRXZCLElBQUksSUFBSSxDQUFDWixPQUFPLElBQUksSUFBSSxDQUFDQSxPQUFPLENBQUMwQyxTQUFTLEVBQUU7TUFDeEMsTUFBTSxJQUFJLENBQUMxQyxPQUFPLENBQUN1RCxJQUFJLENBQUNkLE1BQU0sQ0FBQztJQUNuQztFQUNKO0VBRUFlLGFBQWEsR0FBRztJQUNaLElBQUksSUFBSSxDQUFDdkQsVUFBVSxJQUFJLElBQUksQ0FBQ0QsT0FBTyxFQUFFO01BQ2pDLElBQUksQ0FBQ0EsT0FBTyxDQUFDeUQsUUFBUSxDQUFDQyxRQUFRLEVBQUU7SUFDcEM7RUFDSjtFQUVBLE1BQU1DLGlCQUFpQixDQUFDOUUsV0FBVyxFQUFFK0UsUUFBUSxFQUFFO0lBQzNDLElBQUk7TUFFQSxJQUFJLElBQUksQ0FBQzVELE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lELFFBQVEsSUFBSSxJQUFJLENBQUN6RCxPQUFPLENBQUN5RCxRQUFRLENBQUNJLG9CQUFvQixFQUFFO1FBQ3JGLE1BQU0sSUFBSSxDQUFDN0QsT0FBTyxDQUFDeUQsUUFBUSxDQUFDSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7TUFDM0QsQ0FBQyxNQUFNO1FBQ0gsTUFBTS9GLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDakIsT0FBTyxNQUFNLElBQUksQ0FBQzZGLGlCQUFpQixDQUFDOUUsV0FBVyxFQUFFK0UsUUFBUSxDQUFDO01BQzlEO01BRUEsSUFBSSxJQUFJLENBQUMzRCxVQUFVLElBQUksSUFBSSxDQUFDRCxPQUFPLENBQUN5RCxRQUFRLEVBQUU7UUFDMUMsSUFBSUssUUFBUSxHQUFHLEVBQUU7UUFFakIsTUFBTUMsYUFBYSxHQUFHLElBQUksQ0FBQy9ELE9BQU8sQ0FBQ3lELFFBQVEsQ0FBQ08sY0FBYyxDQUFDSixRQUFRLENBQUM7UUFDcEUsTUFBTUssaUJBQWlCLEdBQUc5RixvQkFBb0IsQ0FBQyxJQUFJLENBQUM2RCxPQUFPLENBQUM7UUFHNUQsS0FBSyxJQUFJa0MsT0FBTyxJQUFJRCxpQkFBaUIsRUFBRTtVQUNuQyxJQUFJLENBQUNwRixXQUFXLENBQUNzRixRQUFRLENBQUNELE9BQU8sQ0FBQzlFLElBQUksQ0FBQyxJQUFLd0UsUUFBUSxLQUFLTSxPQUFPLENBQUMvRSxJQUFJLEVBQUU7WUFDbkVILDBCQUEwQixDQUFDLElBQUksQ0FBQ2dELE9BQU8sRUFBRWtDLE9BQU8sQ0FBQztVQUNyRDtRQUNKO1FBR0EsS0FBSyxJQUFJRSxlQUFlLElBQUlMLGFBQWEsRUFBRTtVQUN2QyxJQUFJLENBQUNsRixXQUFXLENBQUNzRixRQUFRLENBQUNDLGVBQWUsQ0FBQyxFQUFFO1lBQ3hDTixRQUFRLENBQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDaUIsT0FBTyxDQUFDeUQsUUFBUSxDQUFDWSx1QkFBdUIsQ0FBQ1QsUUFBUSxFQUFFUSxlQUFlLENBQUMsQ0FBQztVQUMzRjtRQUNKO1FBR0EsS0FBSyxJQUFJRSxTQUFTLElBQUl6RixXQUFXLEVBQUU7VUFDL0IsSUFBSSxDQUFDa0YsYUFBYSxDQUFDSSxRQUFRLENBQUNHLFNBQVMsQ0FBQyxFQUFFO1lBQ3BDUixRQUFRLENBQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDaUIsT0FBTyxDQUFDeUQsUUFBUSxDQUFDYyxhQUFhLENBQUNYLFFBQVEsRUFBRVUsU0FBUyxDQUFDLENBQUM7VUFDM0U7UUFDSjtRQUVBLElBQUlFLGlCQUFpQixHQUFHLE1BQU14RyxPQUFPLENBQUN5RyxHQUFHLENBQUNYLFFBQVEsQ0FBQyxDQUFDWSxJQUFJLENBQUVDLEtBQUssSUFBSztVQUNoRSxPQUFPQSxLQUFLO1FBQ2hCLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDM0UsT0FBTyxDQUFDeUQsUUFBUSxDQUFDSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFFdEQsTUFBTS9GLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFFakJILEdBQUcsQ0FBQ2lILEtBQUssQ0FBQywyQkFBMkIsQ0FBQztRQUV0QyxNQUFNQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM3RSxPQUFPLENBQUN5RCxRQUFRLENBQUNPLGNBQWMsQ0FBQ0osUUFBUSxDQUFDO1FBRW5GLE9BQU87VUFBRVksaUJBQWlCLEVBQUdBLGlCQUFpQjtVQUFFSyw0QkFBNEIsRUFBR0E7UUFBNkIsQ0FBQztNQUNqSCxDQUFDLE1BQU07UUFDSCxPQUFPLElBQUk7TUFDZjtJQUNKLENBQUMsQ0FBQyxPQUFPakMsQ0FBQyxFQUFFO01BQ1JqRixHQUFHLENBQUN1RixLQUFLLENBQUMsZ0JBQWdCLEVBQUVOLENBQUMsQ0FBQztJQUNsQztFQUNKO0VBRUEsTUFBTWtDLFNBQVMsR0FBRztJQUNkLE1BQU0sSUFBSSxDQUFDOUUsT0FBTyxDQUFDK0UsS0FBSyxDQUFDO01BQ3JCQyxLQUFLLEVBQUUsTUFBTTtNQUNiQyxJQUFJLEVBQUU7SUFDVixDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU1DLFFBQVEsQ0FBQ0MsR0FBRyxFQUFFO0lBQ2hCLE1BQU0sSUFBSSxDQUFDbkYsT0FBTyxDQUFDK0UsS0FBSyxDQUFDO01BQ3JCQyxLQUFLLEVBQUUsTUFBTTtNQUNiQyxJQUFJLEVBQUUsV0FBVztNQUNqQkcsT0FBTyxFQUFFO1FBQ0xELEdBQUcsRUFBRUE7TUFDVDtJQUNKLENBQUMsQ0FBQztFQUNOO0VBRUEsTUFBTUUsU0FBUyxHQUFHO0lBQ2QsTUFBTSxJQUFJLENBQUNyRixPQUFPLENBQUNzRixNQUFNLENBQUMsV0FBVyxDQUFDO0VBQzFDO0VBRUFmLGFBQWEsQ0FBQ25GLElBQUksRUFBRSxDQU9wQjtFQUVBbUcsZUFBZSxDQUFDbkcsSUFBSSxFQUFFLENBS3RCO0VBTUEsTUFBTWdFLFFBQVEsR0FBRztJQUNiLE1BQU1ELE1BQU0sR0FBRyxJQUFJcUMsbUJBQVUsRUFBRTtJQUMvQnJDLE1BQU0sQ0FBQ3NDLFNBQVMsR0FBRzlGLGFBQU0sQ0FBQytGLFlBQVksRUFBRTtJQUN4Q3ZDLE1BQU0sQ0FBQ1YsTUFBTSxHQUFHa0QsZUFBTSxDQUFDQyxNQUFNO0lBQzdCekMsTUFBTSxDQUFDL0UsTUFBTSxHQUFHLEVBQUU7SUFDbEIsSUFBSThFLEtBQUssR0FBRyxJQUFJO0lBRWhCLE1BQU0sSUFBSSxDQUFDMkMsMEJBQTBCLEVBQUU7SUFDdkMsSUFBSTtNQUVBLEtBQUssSUFBSW5ILEtBQUssSUFBSSxJQUFJLENBQUNzRCxPQUFPLEVBQUU7UUFDNUIsTUFBTThELFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0MsU0FBUyxDQUFDckgsS0FBSyxDQUFDO1FBQy9DeUUsTUFBTSxDQUFDL0UsTUFBTSxDQUFDVyxJQUFJLENBQUMrRyxXQUFXLENBQUM7TUFDbkM7SUFDSixDQUFDLENBQ0QsT0FBT2xELENBQUMsRUFBRTtNQUNOTSxLQUFLLEdBQUdOLENBQUM7SUFDYjtJQUNBTyxNQUFNLENBQUM2QyxPQUFPLEdBQUdyRyxhQUFNLENBQUMrRixZQUFZLEVBQUU7SUFDdEN2QyxNQUFNLENBQUM4QyxRQUFRLEdBQUc5QyxNQUFNLENBQUM2QyxPQUFPLEdBQUc3QyxNQUFNLENBQUNzQyxTQUFTO0lBRW5ELE1BQU1TLGVBQWUsR0FBRy9DLE1BQU0sQ0FBQy9FLE1BQU0sQ0FBQytILElBQUksQ0FBQ0MsZUFBZSxJQUFJO01BQzFELElBQUlBLGVBQWUsSUFBSTlILEtBQUssQ0FBQ0MsT0FBTyxDQUFDNkgsZUFBZSxDQUFDLElBQUlBLGVBQWUsQ0FBQzVILE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDakYsT0FBTzRILGVBQWUsQ0FBQ0QsSUFBSSxDQUFDRSxDQUFDLElBQUlBLENBQUMsQ0FBQzVELE1BQU0sS0FBS2tELGVBQU0sQ0FBQ1csTUFBTSxDQUFDO01BQ2hFO0lBQ0osQ0FBQyxDQUFDO0lBRUZuRCxNQUFNLENBQUNWLE1BQU0sR0FBR3lELGVBQWUsR0FBR1AsZUFBTSxDQUFDVyxNQUFNLEdBQUdYLGVBQU0sQ0FBQ0MsTUFBTTtJQUMvRHpDLE1BQU0sQ0FBQ29ELFdBQVcsR0FBRztNQUFFLEdBQUcsSUFBSSxDQUFDeEU7SUFBSyxDQUFDO0lBRXJDb0IsTUFBTSxDQUFDcUQsWUFBWSxHQUFHO01BQUUsR0FBRyxJQUFJLENBQUNoRyxLQUFLO01BQUUsR0FBRyxJQUFJLENBQUNDO0lBQVMsQ0FBQztJQUN6RDBDLE1BQU0sQ0FBQzFELE9BQU8sR0FBRztNQUFFLEdBQUcsSUFBSSxDQUFDaUI7SUFBUyxDQUFDO0lBR3JDLElBQUl3QyxLQUFLLEVBQUU7TUFDUEMsTUFBTSxDQUFDRSxPQUFPLEdBQUdvRCxlQUFXLENBQUNDLG1CQUFtQixDQUFDeEQsS0FBSyxDQUFDO01BQ3ZEQyxNQUFNLENBQUNWLE1BQU0sR0FBR2tELGVBQU0sQ0FBQ1csTUFBTTtJQUNqQztJQUNBLE1BQU0sSUFBSSxDQUFDSyx5QkFBeUIsQ0FBQ3hELE1BQU0sQ0FBQztJQUM1QyxPQUFPQSxNQUFNO0VBQ2pCO0VBRUEsTUFBTTRDLFNBQVMsQ0FBQ3JILEtBQUssRUFBRTtJQUNuQixJQUFJLENBQUNBLEtBQUssRUFBRTtNQUNSZixHQUFHLENBQUN1RixLQUFLLENBQUMsaUNBQWlDLENBQUM7SUFDaEQ7SUFFQSxJQUFJLENBQUN4RSxLQUFLLENBQUN1RyxJQUFJLElBQUksQ0FBQ3ZHLEtBQUssQ0FBQ2tJLElBQUksRUFBRTtNQUM1QixPQUFPLEVBQUU7SUFDYjtJQUVBLElBQUksQ0FBQ2xJLEtBQUssQ0FBQ21JLGNBQWMsRUFBRTtNQUN2Qm5JLEtBQUssQ0FBQ21JLGNBQWMsR0FBRyxDQUFDO0lBQzVCO0lBQ0EsSUFBSUMsMkJBQTJCLEdBQUcsS0FBSztJQUN2QyxJQUFJcEksS0FBSyxDQUFDbUksY0FBYyxHQUFHLENBQUMsRUFBRTtNQUMxQkMsMkJBQTJCLEdBQUcsSUFBSTtJQUN0QztJQUdBLE1BQU1WLGVBQWUsR0FBRyxFQUFFO0lBQzFCLEtBQUssSUFBSVcsY0FBYyxHQUFDLENBQUMsRUFBRUEsY0FBYyxJQUFJckksS0FBSyxDQUFDbUksY0FBYyxFQUFFRSxjQUFjLEVBQUUsRUFBRTtNQUNqRixJQUFJRCwyQkFBMkIsRUFBRTtRQUM3QixJQUFJLENBQUN2RixTQUFTLENBQUN5RixnQkFBZ0IsQ0FBQyxJQUFJLENBQUN0SCxHQUFHLEVBQUVxSCxjQUFjLEVBQUUsT0FBTyxDQUFDO01BQ3RFO01BQ0EsTUFBTWpCLFdBQVcsR0FBRyxJQUFJbUIsb0JBQWUsRUFBRTtNQUN6Q2IsZUFBZSxDQUFDckgsSUFBSSxDQUFDK0csV0FBVyxDQUFDO01BQ2pDQSxXQUFXLENBQUNiLElBQUksR0FBR3ZHLEtBQUssQ0FBQ3VHLElBQUksSUFBSXRGLGFBQU0sQ0FBQ3VILHFCQUFxQixDQUFDeEksS0FBSyxDQUFDa0ksSUFBSSxDQUFDO01BQ3pFZCxXQUFXLENBQUNMLFNBQVMsR0FBRzlGLGFBQU0sQ0FBQytGLFlBQVksRUFBRTtNQUM3Q0ksV0FBVyxDQUFDcUIsWUFBWSxHQUFHSixjQUFjO01BQ3pDakIsV0FBVyxDQUFDckQsTUFBTSxHQUFHa0QsZUFBTSxDQUFDQyxNQUFNO01BQ2xDLE1BQU0sSUFBSSxDQUFDd0IsMkJBQTJCLENBQUMxSSxLQUFLLENBQUM7TUFDN0MsSUFBSSxDQUFDNkMsU0FBUyxDQUFDOEYsWUFBWSxDQUFDLElBQUksQ0FBQzNILEdBQUcsRUFBRWhCLEtBQUssQ0FBQzRJLEdBQUcsRUFBRXhCLFdBQVcsQ0FBQztNQUM3RCxLQUFLLElBQUlsSCxJQUFJLElBQUlGLEtBQUssQ0FBQ0MsS0FBSyxFQUFFO1FBRTFCLElBQUksQ0FBQ0MsSUFBSSxDQUFDZ0ksSUFBSSxFQUFFO1VBQ1o7UUFDSjtRQUNBLElBQUksQ0FBQ2hJLElBQUksQ0FBQ3FHLElBQUksRUFBRTtVQUNackcsSUFBSSxDQUFDcUcsSUFBSSxHQUFHdEYsYUFBTSxDQUFDdUgscUJBQXFCLENBQUN0SSxJQUFJLENBQUNnSSxJQUFJLENBQUM7UUFDdkQ7UUFDQSxJQUFJLENBQUNoSSxJQUFJLENBQUNpSSxjQUFjLEVBQUU7VUFDdEJqSSxJQUFJLENBQUNpSSxjQUFjLEdBQUcsQ0FBQztRQUMzQjtRQUNBLEtBQUssSUFBSVUsYUFBYSxHQUFDLENBQUMsRUFBRUEsYUFBYSxJQUFJM0ksSUFBSSxDQUFDaUksY0FBYyxFQUFFVSxhQUFhLEVBQUUsRUFBRTtVQUU3RSxJQUFJQywwQkFBMEIsR0FBRyxLQUFLO1VBQ3RDLElBQUk1SSxJQUFJLElBQUlBLElBQUksQ0FBQ2lJLGNBQWMsSUFBSWpJLElBQUksQ0FBQ2lJLGNBQWMsR0FBRyxDQUFDLEVBQUU7WUFDeERXLDBCQUEwQixHQUFHLElBQUk7VUFDckM7VUFDQSxJQUFJQSwwQkFBMEIsRUFBRTtZQUM1QixJQUFJLENBQUNqRyxTQUFTLENBQUN5RixnQkFBZ0IsQ0FBQyxJQUFJLENBQUN0SCxHQUFHLEVBQUU2SCxhQUFhLEVBQUUsTUFBTSxDQUFDO1VBQ3BFO1VBQ0EsSUFBSUUsVUFBVSxHQUFHLENBQUM7VUFDbEIsSUFBSUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxRQUFRLENBQUNqSixLQUFLLEVBQUVFLElBQUksRUFBRW1JLGNBQWMsRUFBRVEsYUFBYSxFQUFFLEtBQUssQ0FBQztVQUN2RixJQUFJLENBQUNHLFVBQVUsRUFBRTtZQUNiO1VBQ0o7VUFFQSxJQUFJQSxVQUFVLENBQUNqRixNQUFNLEtBQUtrRCxlQUFNLENBQUNXLE1BQU0sSUFBSSxJQUFJLENBQUM1RixRQUFRLENBQUNrSCxhQUFhLElBQUlILFVBQVUsS0FBSyxDQUFDLEVBQUU7WUFDeEZBLFVBQVUsR0FBRyxDQUFDO1lBRWQsT0FBTyxJQUFJLENBQUN6SCxPQUFPLElBQUksSUFBSSxDQUFDNkgsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0RILFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsUUFBUSxDQUFDakosS0FBSyxFQUFFRSxJQUFJLEVBQUVtSSxjQUFjLEVBQUVRLGFBQWEsRUFBRSxJQUFJLENBQUM7WUFFbEYsSUFBSSxDQUFDRyxVQUFVLEVBQUU7Y0FDYjtZQUNKO1VBQ0o7VUFDQUEsVUFBVSxDQUFDRCxVQUFVLEdBQUdBLFVBQVU7VUFDbEMsSUFBSUQsMEJBQTBCLEVBQUU7WUFDNUIsSUFBSSxDQUFDakcsU0FBUyxDQUFDdUcsY0FBYyxDQUFDLElBQUksQ0FBQ3BJLEdBQUcsRUFBRWdJLFVBQVUsRUFBRSxNQUFNLENBQUM7VUFDL0Q7VUFDQSxNQUFNLElBQUksQ0FBQ0sseUJBQXlCLENBQUNuSixJQUFJLEVBQUU4SSxVQUFVLENBQUM7VUFDdEQsSUFBSSxDQUFDbkcsU0FBUyxDQUFDeUcsU0FBUyxDQUFDLElBQUksQ0FBQ3RJLEdBQUcsRUFBRWhCLEtBQUssQ0FBQzRJLEdBQUcsSUFBSTVJLEtBQUssQ0FBQ3VKLEVBQUUsRUFBRXJKLElBQUksQ0FBQzBJLEdBQUcsSUFBSTFJLElBQUksQ0FBQ3FKLEVBQUUsRUFBRVAsVUFBVSxDQUFDO1VBQzFGLElBQUksT0FBTyxJQUFJLENBQUNoSCxRQUFRLENBQUN3SCxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQ3hILFFBQVEsQ0FBQ3dILFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDdEYsT0FBTyxJQUFJLENBQUNsSSxPQUFPLElBQUksSUFBSSxDQUFDNkgsc0JBQXNCLENBQUNILFVBQVUsQ0FBQ2pGLE1BQU0sQ0FBQyxDQUFDO1VBQzFFO1VBRUFxRCxXQUFXLENBQUNuSCxLQUFLLENBQUNJLElBQUksQ0FBQzJJLFVBQVUsQ0FBQztVQUdsQyxJQUFJQSxVQUFVLENBQUNqRixNQUFNLEtBQUtrRCxlQUFNLENBQUNXLE1BQU0sRUFBRTtZQUNyQ1IsV0FBVyxDQUFDckQsTUFBTSxHQUFHa0QsZUFBTSxDQUFDVyxNQUFNO1VBQ3RDO1FBQ0o7TUFDSjtNQUNBUixXQUFXLENBQUNFLE9BQU8sR0FBR3JHLGFBQU0sQ0FBQytGLFlBQVksRUFBRTtNQUMzQ0ksV0FBVyxDQUFDRyxRQUFRLEdBQUdILFdBQVcsQ0FBQ0UsT0FBTyxHQUFHRixXQUFXLENBQUNMLFNBQVM7TUFFbEUsSUFBSXFCLDJCQUEyQixFQUFFO1FBQzdCLElBQUksQ0FBQ3ZGLFNBQVMsQ0FBQ3VHLGNBQWMsQ0FBQyxJQUFJLENBQUNwSSxHQUFHLEVBQUVvRyxXQUFXLEVBQUUsT0FBTyxDQUFDO01BQ2pFO01BRUEsTUFBTSxJQUFJLENBQUNxQywwQkFBMEIsQ0FBQ3pKLEtBQUssRUFBRW9ILFdBQVcsQ0FBQztNQUN6RCxJQUFJLENBQUN2RSxTQUFTLENBQUM2RyxVQUFVLENBQUMsSUFBSSxDQUFDMUksR0FBRyxFQUFFaEIsS0FBSyxDQUFDNEksR0FBRyxFQUFFeEIsV0FBVyxDQUFDO0lBQy9EO0lBQ0EsT0FBT00sZUFBZTtFQUMxQjtFQUVBLE1BQU11QixRQUFRLENBQUNqSixLQUFLLEVBQUVFLElBQUksRUFBRW1JLGNBQWMsRUFBRVEsYUFBYSxFQUFFYyxLQUFLLEdBQUcsS0FBSyxFQUFFO0lBQ3RFLE1BQU1DLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFHakIsSUFBSTVKLEtBQUssQ0FBQzZKLFlBQVksRUFBRTtNQUNwQixJQUFJRixLQUFLLEVBQUU7UUFDUDNKLEtBQUssQ0FBQzZKLFlBQVksQ0FBQ0MsUUFBUSxFQUFFO01BQ2pDO01BQ0FDLGVBQUMsQ0FBQ0MsTUFBTSxDQUFDSixNQUFNLEVBQUU1SixLQUFLLENBQUM2SixZQUFZLENBQUNJLFNBQVMsRUFBRSxDQUFDO01BQ2hEakssS0FBSyxDQUFDNkosWUFBWSxDQUFDSyxRQUFRLEVBQUU7SUFDakM7SUFFQSxJQUFJaEssSUFBSSxDQUFDMkosWUFBWSxFQUFFO01BQ25CLElBQUlGLEtBQUssRUFBRTtRQUNQekosSUFBSSxDQUFDMkosWUFBWSxDQUFDQyxRQUFRLEVBQUU7TUFDaEM7TUFDQUMsZUFBQyxDQUFDQyxNQUFNLENBQUNKLE1BQU0sRUFBRTFKLElBQUksQ0FBQzJKLFlBQVksQ0FBQ0ksU0FBUyxFQUFFLENBQUM7TUFDL0MvSixJQUFJLENBQUMySixZQUFZLENBQUNLLFFBQVEsRUFBRTtJQUNoQztJQUdBLElBQUksSUFBSSxDQUFDM0ksVUFBVSxJQUFJLElBQUksQ0FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDeUQsUUFBUSxJQUFJN0UsSUFBSSxDQUFDQyxXQUFXLEVBQUU7TUFDOUUsS0FBSyxJQUFJZ0ssQ0FBQyxHQUFDLENBQUMsRUFBRUEsQ0FBQyxHQUFFakssSUFBSSxDQUFDQyxXQUFXLENBQUNMLE1BQU0sRUFBRXFLLENBQUMsRUFBRSxFQUFFO1FBRTNDLElBQUl6SixJQUFJLEdBQUdSLElBQUksQ0FBQ0MsV0FBVyxDQUFDZ0ssQ0FBQyxDQUFDLENBQUN6SixJQUFJO1FBQ25DLElBQUlELElBQUksR0FBR1AsSUFBSSxDQUFDQyxXQUFXLENBQUNnSyxDQUFDLENBQUMsQ0FBQzFKLElBQUk7UUFFbkMsTUFBTSxJQUFJLENBQUNhLE9BQU8sQ0FBQ3lELFFBQVEsQ0FBQ2MsYUFBYSxDQUFDcEYsSUFBSSxFQUFFQyxJQUFJLENBQUM7TUFDekQ7SUFDSjtJQUVBLE1BQU0sSUFBSSxDQUFDMEosMEJBQTBCLENBQUNsSyxJQUFJLENBQUM7SUFDM0MsSUFBSSxDQUFDMkMsU0FBUyxDQUFDd0gsV0FBVyxDQUFDLElBQUksQ0FBQ3JKLEdBQUcsRUFBRWhCLEtBQUssQ0FBQzRJLEdBQUcsSUFBSTVJLEtBQUssQ0FBQ3VKLEVBQUUsRUFBRXJKLElBQUksQ0FBQzBJLEdBQUcsSUFBSTFJLElBQUksQ0FBQ3FKLEVBQUUsSUFBSXJKLElBQUksQ0FBQ2dJLElBQUksRUFBRWhJLElBQUksQ0FBQztJQUNuRyxNQUFNOEksVUFBVSxHQUFHLElBQUlzQixtQkFBYyxFQUFFO0lBQ3ZDdEIsVUFBVSxDQUFDekMsSUFBSSxHQUFHckcsSUFBSSxDQUFDcUcsSUFBSTtJQUMzQnlDLFVBQVUsQ0FBQ3VCLFFBQVEsR0FBR3JLLElBQUksQ0FBQ2dJLElBQUk7SUFDL0JjLFVBQVUsQ0FBQ1AsWUFBWSxHQUFHSSxhQUFhO0lBR3ZDLElBQUk7TUFDQSxPQUFPLENBQUUsSUFBSSxDQUFDdkgsT0FBUSxJQUFJLElBQUksQ0FBQ3VDLGtCQUFrQixFQUFFLENBQUM7SUFDeEQsQ0FBQyxDQUNELE9BQU9LLENBQUMsRUFBRTtNQUNOakYsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLHVDQUF1QyxFQUFFTixDQUFDLENBQUM7TUFDckQ4RSxVQUFVLENBQUNqQyxTQUFTLEdBQUdpQyxVQUFVLENBQUMxQixPQUFPLEdBQUdyRyxhQUFNLENBQUMrRixZQUFZLEVBQUU7TUFDakVnQyxVQUFVLENBQUN6QixRQUFRLEdBQUcsQ0FBQztNQUN2QnlCLFVBQVUsQ0FBQ3JFLE9BQU8sR0FBR29ELGVBQVcsQ0FBQ0MsbUJBQW1CLENBQUM5RCxDQUFDLENBQUM7TUFDdkQ4RSxVQUFVLENBQUNqRixNQUFNLEdBQUdrRCxlQUFNLENBQUNXLE1BQU07TUFDakMsSUFBSSxDQUFDL0UsU0FBUyxDQUFDeUcsU0FBUyxDQUFDLElBQUksQ0FBQ3RJLEdBQUcsRUFBRWhCLEtBQUssQ0FBQzRJLEdBQUcsSUFBSTVJLEtBQUssQ0FBQ3VKLEVBQUUsRUFBRXJKLElBQUksQ0FBQzBJLEdBQUcsSUFBSTFJLElBQUksQ0FBQ3FKLEVBQUUsRUFBRVAsVUFBVSxDQUFDO01BQzFGLE9BQU9BLFVBQVU7SUFDckI7SUFFQSxJQUFJO01BQ0FBLFVBQVUsQ0FBQ2pDLFNBQVMsR0FBRzlGLGFBQU0sQ0FBQytGLFlBQVksRUFBRTtNQUM1QyxJQUFJLElBQUksQ0FBQzFGLE9BQU8sRUFBRTtRQUNkLE1BQU07VUFBRWtKLFdBQVc7VUFBRUMsT0FBTztVQUFFQyxVQUFVO1VBQUVsRztRQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQ21HLFdBQVcsQ0FBQzNLLEtBQUssRUFBRUUsSUFBSSxFQUFFbUksY0FBYyxFQUFFUSxhQUFhLEVBQUVlLE1BQU0sQ0FBQztRQUM5SCxJQUFJLENBQUNnQixtQkFBbUIsQ0FBQztVQUFFSixXQUFXO1VBQUVDLE9BQU87VUFBRWpHLEtBQUs7VUFBRWtHO1FBQVcsQ0FBQyxDQUFDO1FBQ3JFMUIsVUFBVSxDQUFDMUIsT0FBTyxHQUFHckcsYUFBTSxDQUFDK0YsWUFBWSxFQUFFO1FBQzFDZ0MsVUFBVSxDQUFDekIsUUFBUSxHQUFHeUIsVUFBVSxDQUFDMUIsT0FBTyxHQUFHMEIsVUFBVSxDQUFDakMsU0FBUztRQUMvRGlDLFVBQVUsQ0FBQ3lCLE9BQU8sR0FBR0EsT0FBTztRQUM1QnpCLFVBQVUsQ0FBQzZCLEtBQUssR0FBR0wsV0FBVyxJQUFJQSxXQUFXLENBQUNLLEtBQUssR0FBR0wsV0FBVyxDQUFDSyxLQUFLLEdBQUcsRUFBRTtRQUM1RTdCLFVBQVUsQ0FBQzhCLElBQUksR0FBR04sV0FBVyxJQUFJQSxXQUFXLENBQUNNLElBQUksR0FBR04sV0FBVyxDQUFDTSxJQUFJLEdBQUcsRUFBRTtRQUN6RTlCLFVBQVUsQ0FBQytCLEdBQUcsR0FBR1AsV0FBVyxJQUFJQSxXQUFXLENBQUNPLEdBQUcsR0FBR1AsV0FBVyxDQUFDTyxHQUFHLEdBQUcsSUFBSTtRQUd4RSxJQUFJQyxXQUFXLEdBQUdqQixlQUFDLENBQUNrQixJQUFJLENBQUNqQyxVQUFVLENBQUM2QixLQUFLLEVBQUU7VUFBQzlHLE1BQU0sRUFBRWtELGVBQU0sQ0FBQ1c7UUFBTSxDQUFDLENBQUM7UUFDbkVvQixVQUFVLENBQUNqRixNQUFNLEdBQUdnRyxlQUFDLENBQUNtQixPQUFPLENBQUNGLFdBQVcsQ0FBQyxJQUFJLENBQUN4RyxLQUFLLEdBQUd5QyxlQUFNLENBQUNDLE1BQU0sR0FBR0QsZUFBTSxDQUFDVyxNQUFNO1FBQ3BGLElBQUlwRCxLQUFLLEVBQUU7VUFDUHdFLFVBQVUsQ0FBQ3JFLE9BQU8sR0FBR0gsS0FBSztVQUMxQndFLFVBQVUsQ0FBQ2pGLE1BQU0sR0FBR2tELGVBQU0sQ0FBQ1csTUFBTTtVQUNqQ29CLFVBQVUsQ0FBQzZCLEtBQUssR0FBRzVKLGFBQU0sQ0FBQ2tLLGlDQUFpQyxDQUFDbkMsVUFBVSxDQUFDNkIsS0FBSyxDQUFDO1FBQ2pGO01BQ0osQ0FBQyxNQUFNO1FBQ0g7TUFDSjtJQUNKLENBQUMsQ0FBQyxPQUFPM0csQ0FBQyxFQUFFO01BQ1JqRixHQUFHLENBQUN1RixLQUFLLENBQUMsZ0NBQWdDLEVBQUVOLENBQUMsQ0FBQztNQUM5QzhFLFVBQVUsQ0FBQ3JFLE9BQU8sR0FBR29ELGVBQVcsQ0FBQ0MsbUJBQW1CLENBQUM5RCxDQUFDLENBQUM7TUFDdkQ4RSxVQUFVLENBQUNqRixNQUFNLEdBQUdrRCxlQUFNLENBQUNXLE1BQU07SUFFckM7SUFFQSxPQUFPb0IsVUFBVTtFQUNyQjtFQUVBLE1BQU0yQixXQUFXLENBQUMzSyxLQUFLLEVBQUVFLElBQUksRUFBRW1JLGNBQWMsRUFBRVEsYUFBYSxFQUFFZSxNQUFNLEVBQUU7SUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQ3RJLE9BQU8sRUFBRTtNQUNmckMsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLHFDQUFxQyxDQUFDO01BRWhELElBQUksSUFBSSxDQUFDNEcscUJBQXFCLEVBQUU7UUFDNUIsSUFBSSxDQUFDQSxxQkFBcUIsQ0FBQ0MsTUFBTSxDQUFDLElBQUk1SSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztNQUNuRTtNQUNBO0lBQ0o7SUFFQSxPQUFPLE1BQU0sSUFBSSxDQUFDbkIsT0FBTyxDQUFDZ0QsR0FBRyxDQUFDO01BQzFCZ0gsVUFBVSxFQUFFcEwsSUFBSSxDQUFDcUcsSUFBSTtNQUNyQmdGLFVBQVUsRUFBRXJMLElBQUksQ0FBQ2dJLElBQUk7TUFDckJ1QyxPQUFPLEVBQUU7UUFDTGIsTUFBTSxFQUFFQSxNQUFNO1FBQ2Q1RyxHQUFHLEVBQUUsSUFBSSxDQUFDSyxJQUFJO1FBQ2RkLElBQUksRUFBRSxJQUFJLENBQUNULEtBQUs7UUFDaEIwSixJQUFJLEVBQUUsSUFBSSxDQUFDM0osS0FBSztRQUNoQjRKLElBQUksRUFBRTtVQUNGQyxJQUFJLEVBQUU7WUFDRm5GLElBQUksRUFBRXJHLElBQUksQ0FBQ3FHLElBQUk7WUFDZm9GLFNBQVMsRUFBRTlDO1VBQ2YsQ0FBQztVQUNEN0ksS0FBSyxFQUFFO1lBQ0h1RyxJQUFJLEVBQUV2RyxLQUFLLENBQUN1RyxJQUFJO1lBQ2hCb0YsU0FBUyxFQUFFdEQ7VUFDZjtRQUNKO01BQ0osQ0FBQztNQUNEdUQsTUFBTSxFQUFFLElBQUksQ0FBQzVKLFFBQVEsQ0FBQzZKLEVBQUUsSUFBSTtJQUNoQyxDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU1oSSxrQkFBa0IsR0FBRztJQUN2QixPQUFPLElBQUksQ0FBQ3ZDLE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ2dCLElBQUksQ0FBQyxJQUFJLENBQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDZ0IsUUFBUSxFQUFFLElBQUksQ0FBQ0YsS0FBSyxDQUFDLENBQUM7RUFDbEY7RUFFQSxNQUFNcUgsc0JBQXNCLENBQUNwRixNQUFNLEdBQUcsSUFBSSxFQUFFO0lBQ3hDLElBQUksSUFBSSxDQUFDekMsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDd0ssY0FBYyxFQUFFO01BQzdDLE1BQU0sSUFBSSxDQUFDeEssT0FBTyxDQUFDd0ssY0FBYyxDQUFDL0gsTUFBTSxDQUFDO0lBQzdDO0VBQ0o7RUFFQSxNQUFNb0QsMEJBQTBCLEdBQUc7SUFDL0IsSUFBSTtNQUNBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQzdGLE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lLLGNBQWMsRUFBRTtRQUNyRCxNQUFNLElBQUksQ0FBQ3pLLE9BQU8sQ0FBQ3lLLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMvSyxHQUFHLEVBQUUsSUFBSSxDQUFDZ0IsUUFBUSxFQUFFLElBQUksQ0FBQ0YsS0FBSyxDQUFDLENBQUM7TUFDMUY7SUFDSixDQUFDLENBQ0QsT0FBT29DLENBQUMsRUFBRTtNQUNOakYsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLDJCQUEyQixFQUFFTixDQUFDLENBQUM7TUFDekMsSUFBSSxDQUFDckIsU0FBUyxJQUFJLElBQUksQ0FBQ0EsU0FBUyxDQUFDbUosVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsMkJBQTJCLEdBQUM5SCxDQUFDLEVBQUUvRSxjQUFjLENBQUM7SUFDNUc7RUFDSjtFQUVBLE1BQU11SiwyQkFBMkIsQ0FBQzFJLEtBQUssRUFBRTtJQUNyQyxJQUFJO01BQ0EsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDc0IsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDeUssY0FBYyxFQUFFO1FBQ3JELE1BQU0sSUFBSSxDQUFDekssT0FBTyxDQUFDeUssY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDL0wsS0FBSyxDQUFDLENBQUM7TUFDN0Q7SUFDSixDQUFDLENBQ0QsT0FBT2tFLENBQUMsRUFBRTtNQUNOakYsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLDRCQUE0QixFQUFFTixDQUFDLENBQUM7TUFDMUMsSUFBSSxDQUFDckIsU0FBUyxJQUFJLElBQUksQ0FBQ0EsU0FBUyxDQUFDbUosVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsNEJBQTRCLEdBQUM5SCxDQUFDLEVBQUUvRSxjQUFjLENBQUM7SUFDN0c7RUFDSjtFQUVBLE1BQU1pTCwwQkFBMEIsQ0FBQ2xLLElBQUksRUFBRTtJQUNuQyxJQUFJO01BQ0EsT0FBTyxJQUFJLENBQUNvQixPQUFPLElBQUksSUFBSSxDQUFDQSxPQUFPLENBQUN5SyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM3TCxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUMsQ0FDRCxPQUFPZ0UsQ0FBQyxFQUFFO01BQ05qRixHQUFHLENBQUN1RixLQUFLLENBQUMsMkJBQTJCLEVBQUVOLENBQUMsQ0FBQztNQUN6QyxJQUFJLENBQUNyQixTQUFTLElBQUksSUFBSSxDQUFDQSxTQUFTLENBQUNtSixVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsR0FBQzlILENBQUMsRUFBRS9FLGNBQWMsQ0FBQztJQUM1RztFQUNKO0VBRUEsTUFBTThJLHlCQUF5QixDQUFDeEQsTUFBTSxFQUFFO0lBQ3BDLElBQUk7TUFDQSxPQUFPLElBQUksQ0FBQ25ELE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lLLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMvSyxHQUFHLEVBQUV5RCxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUMsQ0FDRCxPQUFPUCxDQUFDLEVBQUU7TUFDTmpGLEdBQUcsQ0FBQ3VGLEtBQUssQ0FBQywwQkFBMEIsRUFBRU4sQ0FBQyxDQUFDO01BQ3hDLElBQUksQ0FBQ3JCLFNBQVMsSUFBSSxJQUFJLENBQUNBLFNBQVMsQ0FBQ21KLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixHQUFDOUgsQ0FBQyxFQUFFL0UsY0FBYyxDQUFDO0lBQzNHO0VBQ0o7RUFFQSxNQUFNc0ssMEJBQTBCLENBQUN6SixLQUFLLEVBQUV5RSxNQUFNLEVBQUU7SUFDNUMsSUFBSTtNQUNBLE9BQU8sSUFBSSxDQUFDbkQsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxDQUFDeUssY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDL0wsS0FBSyxFQUFFeUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQ0QsT0FBT1AsQ0FBQyxFQUFFO01BQ05qRixHQUFHLENBQUN1RixLQUFLLENBQUMsMkJBQTJCLEVBQUVOLENBQUMsQ0FBQztNQUN6QyxJQUFJLENBQUNyQixTQUFTLElBQUksSUFBSSxDQUFDQSxTQUFTLENBQUNtSixVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsR0FBQzlILENBQUMsRUFBRS9FLGNBQWMsQ0FBQztJQUM1RztFQUNKO0VBRUEsTUFBTWtLLHlCQUF5QixDQUFDbkosSUFBSSxFQUFFdUUsTUFBTSxFQUFFO0lBQzFDLElBQUk7TUFDQSxPQUFPLElBQUksQ0FBQ25ELE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lLLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzdMLElBQUksRUFBRXVFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQyxDQUNELE9BQU9QLENBQUMsRUFBRTtNQUNOakYsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLDBCQUEwQixFQUFFTixDQUFDLENBQUM7TUFDeEMsSUFBSSxDQUFDckIsU0FBUyxJQUFJLElBQUksQ0FBQ0EsU0FBUyxDQUFDbUosVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsMEJBQTBCLEdBQUM5SCxDQUFDLEVBQUUvRSxjQUFjLENBQUM7SUFDM0c7RUFDSjtFQUVBLE1BQU15RSxtQkFBbUIsR0FBRztJQUN4QixNQUFNcUksVUFBVSxHQUFHL0QsYUFBSSxDQUFDZ0UsSUFBSSxDQUFDQyxTQUFTLEVBQUUsV0FBVyxDQUFDO0lBQ3BELElBQUksQ0FBQzdLLE9BQU8sR0FBRyxJQUFJOEssc0JBQWEsQ0FBQyxJQUFJLENBQUNwTCxHQUFHLEVBQUVpTCxVQUFVLEVBQUUsSUFBSSxDQUFDMUssVUFBVSxFQUFFLElBQUksQ0FBQ2tDLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDaEMsa0JBQWtCLENBQUM7SUFDM0gsTUFBTSxJQUFJLENBQUNILE9BQU8sQ0FBQytLLEtBQUssRUFBRTtJQUMxQixJQUFJLENBQUNDLGlCQUFpQixFQUFFO0lBQ3hCLE1BQU0sSUFBSSxDQUFDaEwsT0FBTyxDQUFDaUwsYUFBYSxFQUFFO0lBQ2xDLElBQUksQ0FBQ0MseUJBQXlCLEVBQUU7RUFDcEM7RUFFQUYsaUJBQWlCLEdBQUc7SUFFaEIsTUFBTUcsS0FBSyxHQUFHLElBQUk7SUFDbEIsSUFBSSxDQUFDbkwsT0FBTyxDQUFDb0wsU0FBUyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUN0TCxPQUFPLENBQUNvTCxTQUFTLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQ0csbUJBQW1CLENBQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RSxJQUFJLENBQUN0TCxPQUFPLENBQUN3TCxFQUFFLENBQUMsT0FBTyxFQUFHQyxPQUFPLElBQUs7TUFDbEMsTUFBTTtRQUFFdkk7TUFBTSxDQUFDLEdBQUd1SSxPQUFPO01BQ3pCOU4sR0FBRyxDQUFDdUYsS0FBSyxDQUFDLHdCQUF3QixFQUFFQSxLQUFLLENBQUM7TUFFMUMsSUFBSSxJQUFJLENBQUN3SSxRQUFRLEVBQUU7UUFDZixJQUFJLENBQUNDLElBQUksQ0FBQyxZQUFZLEVBQUV6SSxLQUFLLENBQUM7TUFDbEMsQ0FBQyxNQUFNO1FBQ0hpSSxLQUFLLENBQUNqTCxvQkFBb0IsR0FBR2dELEtBQUs7TUFDdEM7SUFDSixDQUFDLENBQUM7SUFDRixJQUFJLENBQUNsRCxPQUFPLENBQUN3TCxFQUFFLENBQUMsTUFBTSxFQUFHQyxPQUFPLElBQUs7TUFDakMsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtNQUNwQixNQUFNO1FBQUVFO01BQVMsQ0FBQyxHQUFHSCxPQUFPO01BRTVCLElBQUlHLFFBQVEsSUFBSUEsUUFBUSxLQUFLLENBQUMsRUFBRTtRQUk1QixJQUFJQyxPQUFPLEdBQUcsSUFBSTtRQUNsQixJQUFJVixLQUFLLENBQUNwTCxZQUFZLEVBQUU7VUFDcEI4TCxPQUFPLEdBQUdWLEtBQUssQ0FBQ3JLLGFBQWE7UUFDakMsQ0FBQyxNQUNJLElBQUlxSyxLQUFLLENBQUN0TCxVQUFVLEVBQUU7VUFDdkJnTSxPQUFPLEdBQUdWLEtBQUssQ0FBQ3JCLHFCQUFxQjtRQUN6QztRQUNBLElBQUk1RyxLQUFLLEdBQUdpSSxLQUFLLENBQUNqTCxvQkFBb0IsSUFBSSxJQUFJO1FBQzlDLElBQUkwTCxRQUFRLElBQUksR0FBRyxFQUFFO1VBQ2pCMUksS0FBSyxHQUFHLElBQUk0SSxvQkFBVyxDQUFDckYsZUFBVyxDQUFDc0YsU0FBUyxDQUFDQyxZQUFZLEVBQUUsMEZBQTBGLENBQUM7UUFDM0osQ0FBQyxNQUNJLElBQUksQ0FBQzlJLEtBQUssRUFBRTtVQUNiQSxLQUFLLEdBQUcsSUFBSTRJLG9CQUFXLENBQUUsb0NBQW1DRixRQUFTLEdBQUUsQ0FBQztRQUM1RTtRQUVBQyxPQUFPLElBQUlBLE9BQU8sQ0FBQzlCLE1BQU0sQ0FBQzdHLEtBQUssQ0FBQztRQUNoQ2lJLEtBQUssQ0FBQ3BJLHFCQUFxQixFQUFFO01BQ2pDO0lBQ0osQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDL0MsT0FBTyxDQUFDd0wsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFPUyxHQUFHLElBQUs7TUFDdEMsSUFBSUEsR0FBRyxDQUFDakgsS0FBSyxJQUFJaUgsR0FBRyxDQUFDakgsS0FBSyxLQUFLLEtBQUssRUFBRTtRQUNsQyxJQUFJaUgsR0FBRyxDQUFDQyxLQUFLLEtBQUssT0FBTyxFQUFFO1VBQ3ZCdk8sR0FBRyxDQUFDaUgsS0FBSyxDQUFDcUgsR0FBRyxDQUFDQSxHQUFHLENBQUM7UUFDdEIsQ0FBQyxNQUFNLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSyxLQUFLLE1BQU0sRUFBRTtVQUM3QnZPLEdBQUcsQ0FBQ3dPLElBQUksQ0FBQ0YsR0FBRyxDQUFDQSxHQUFHLENBQUM7UUFDckIsQ0FBQyxNQUFNLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSyxLQUFLLE9BQU8sRUFBRTtVQUM5QnZPLEdBQUcsQ0FBQ3VGLEtBQUssQ0FBQytJLEdBQUcsQ0FBQ0EsR0FBRyxFQUFFQSxHQUFHLENBQUNHLEdBQUcsQ0FBQztRQUMvQixDQUFDLE1BQU0sSUFBSUgsR0FBRyxDQUFDQyxLQUFLLEtBQUssTUFBTSxFQUFFO1VBQzdCdk8sR0FBRyxDQUFDbUYsSUFBSSxDQUFDbUosR0FBRyxDQUFDQSxHQUFHLENBQUM7UUFDckI7UUFFQWQsS0FBSyxDQUFDUSxJQUFJLENBQUMsS0FBSyxFQUFFTSxHQUFHLENBQUNJLElBQUksRUFBRUosR0FBRyxDQUFDQyxLQUFLLEVBQUVELEdBQUcsQ0FBQ0EsR0FBRyxFQUFFQSxHQUFHLENBQUNLLEdBQUcsSUFBSXpPLGNBQWMsQ0FBQztRQUMxRXNOLEtBQUssQ0FBQzVKLFNBQVMsSUFBSTRKLEtBQUssQ0FBQzVKLFNBQVMsQ0FBQ21KLFVBQVUsQ0FBQ3VCLEdBQUcsQ0FBQ0ksSUFBSSxFQUFFSixHQUFHLENBQUNDLEtBQUssRUFBRUQsR0FBRyxDQUFDQSxHQUFHLEVBQUVBLEdBQUcsQ0FBQ0ssR0FBRyxJQUFJek8sY0FBYyxDQUFDO01BQzFHLENBQUMsTUFDSSxJQUFJb08sR0FBRyxDQUFDakgsS0FBSyxJQUFJaUgsR0FBRyxDQUFDakgsS0FBSyxLQUFLLGFBQWEsRUFBRTtRQUMvQ21HLEtBQUssQ0FBQ1EsSUFBSSxDQUFDLGFBQWEsRUFBRU0sR0FBRyxDQUFDN00sSUFBSSxFQUFFNk0sR0FBRyxDQUFDTSxLQUFLLEVBQUVOLEdBQUcsQ0FBQ0ksSUFBSSxDQUFDO01BQzVELENBQUMsTUFDSSxJQUFJSixHQUFHLENBQUNqSCxLQUFLLElBQUlpSCxHQUFHLENBQUNqSCxLQUFLLEtBQUssZUFBZSxFQUFFO1FBQ2pELElBQUlpSCxHQUFHLENBQUNPLE1BQU0sS0FBSyxNQUFNLEVBQUU7VUFDdkJyQixLQUFLLENBQUNRLElBQUksQ0FBQyxXQUFXLEVBQUVNLEdBQUcsQ0FBQztRQUNoQztNQUNKLENBQUMsTUFDSSxJQUFJQSxHQUFHLENBQUNqSCxLQUFLLElBQUlpSCxHQUFHLENBQUNqSCxLQUFLLEtBQUssYUFBYSxFQUFFO1FBQy9DbkMsT0FBTyxDQUFDbEYsR0FBRyxDQUFDLGNBQWMsRUFBRXNPLEdBQUcsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQ3pKLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDNUIsTUFBTSxJQUFJLENBQUNlLElBQUksQ0FBQyxRQUFRLENBQUM7TUFDN0IsQ0FBQyxNQUNJLElBQUkwSSxHQUFHLENBQUNqSCxLQUFLLElBQUlpSCxHQUFHLENBQUNqSCxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3hDbUcsS0FBSyxDQUFDUSxJQUFJLENBQUMsTUFBTSxFQUFFTSxHQUFHLENBQUM7TUFDM0I7SUFDSixDQUFDLENBQUM7RUFDTjtFQUVBZix5QkFBeUIsR0FBRztJQUN4QixJQUFJLENBQUNsTCxPQUFPLENBQUN5RCxRQUFRLElBQUksSUFBSSxDQUFDekQsT0FBTyxDQUFDeUQsUUFBUSxDQUFDK0gsRUFBRSxDQUFDLGdCQUFnQixFQUFHaUIsY0FBYyxJQUFLO01BQ3BGLElBQUksQ0FBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRWMsY0FBYyxDQUFDO0lBQzNDLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ3pNLE9BQU8sQ0FBQ3lELFFBQVEsSUFBSSxJQUFJLENBQUN6RCxPQUFPLENBQUN5RCxRQUFRLENBQUMrSCxFQUFFLENBQUMscUJBQXFCLEVBQUdrQixVQUFVLElBQUs7TUFDckYsSUFBSSxDQUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQUVlLFVBQVUsQ0FBQztJQUM1QyxDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU1yQixvQkFBb0IsQ0FBQ3pJLENBQUMsRUFBRTtJQUMxQixJQUFJLENBQUNyQixTQUFTLElBQUksSUFBSSxDQUFDQSxTQUFTLENBQUNvTCxXQUFXLENBQUMsSUFBSSxDQUFDak4sR0FBRyxFQUFFa0QsQ0FBQyxDQUFDO0lBRXpELElBQUk7TUFDQSxJQUFJQSxDQUFDLElBQUlBLENBQUMsQ0FBQ2dLLE1BQU0sSUFBSWhLLENBQUMsQ0FBQ2dLLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FFekMsQ0FBQyxNQUFNO1FBQ0gsT0FBTyxJQUFJLENBQUM1TSxPQUFPLElBQUksSUFBSSxDQUFDQSxPQUFPLENBQUN5SyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM3SCxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzdFO0lBQ0osQ0FBQyxDQUNELE9BQU9BLENBQUMsRUFBRTtNQUNOakYsR0FBRyxDQUFDdUYsS0FBSyxDQUFDLDhCQUE4QixFQUFFTixDQUFDLENBQUM7TUFDNUMsSUFBSSxDQUFDckIsU0FBUyxJQUFJLElBQUksQ0FBQ0EsU0FBUyxDQUFDbUosVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsOEJBQThCLEdBQUM5SCxDQUFDLEVBQUUvRSxjQUFjLENBQUM7SUFDL0c7RUFDSjtFQUVBLE1BQU0wTixtQkFBbUIsQ0FBQzNJLENBQUMsRUFBRTtJQUN6QixJQUFJLENBQUNyQixTQUFTLElBQUksSUFBSSxDQUFDQSxTQUFTLENBQUNzTCxTQUFTLENBQUMsSUFBSSxDQUFDbk4sR0FBRyxFQUFFa0QsQ0FBQyxDQUFDTyxNQUFNLENBQUM7SUFDOUQsSUFBSTtNQUNBLElBQUlQLENBQUMsSUFBSUEsQ0FBQyxDQUFDZ0ssTUFBTSxJQUFJaEssQ0FBQyxDQUFDZ0ssTUFBTSxLQUFLLEtBQUssRUFBRSxDQUV6QyxDQUFDLE1BQU07UUFDSCxPQUFPLElBQUksQ0FBQzVNLE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lLLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzdILENBQUMsQ0FBQ08sTUFBTSxDQUFDLENBQUMsQ0FBQztNQUNuRjtJQUNKLENBQUMsQ0FDRCxPQUFPUCxDQUFDLEVBQUU7TUFDTmpGLEdBQUcsQ0FBQ3VGLEtBQUssQ0FBQyw2QkFBNkIsRUFBRU4sQ0FBQyxDQUFDO01BQzNDLElBQUksQ0FBQ3JCLFNBQVMsSUFBSSxJQUFJLENBQUNBLFNBQVMsQ0FBQ21KLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLDZCQUE2QixHQUFDOUgsQ0FBQyxFQUFFL0UsY0FBYyxDQUFDO0lBQzlHO0VBQ0o7RUFFQWtGLHFCQUFxQixHQUFHO0lBQ3BCLElBQUksQ0FBQ3RDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbEIsSUFBSSxDQUFDVCxPQUFPLEdBQUcsSUFBSTtJQUNuQixJQUFJLENBQUNILFVBQVUsR0FBRyxLQUFLO0lBQ3ZCLElBQUksQ0FBQ0UsWUFBWSxHQUFHLEtBQUs7SUFDekIsSUFBSSxDQUFDRCxlQUFlLEdBQUcsS0FBSztJQUM1QixJQUFJLENBQUNjLFdBQVcsR0FBRyxLQUFLO0lBQ3hCLElBQUksQ0FBQ0UsYUFBYSxHQUFHLElBQUFDLFdBQUssR0FBRTtFQUNoQztFQUVBdUksbUJBQW1CLENBQUM7SUFBRUosV0FBVztJQUFFRSxVQUFVO0lBQUVELE9BQU8sR0FBRyxDQUFDLENBQUM7SUFBRWpHLEtBQUssR0FBRztFQUFLLENBQUMsRUFBRTtJQUV6RSxJQUFJLElBQUksQ0FBQ3RDLFdBQVcsRUFBRTtNQUNsQixPQUFPLElBQUk7SUFDZjtJQUNBLElBQUlzQyxLQUFLLEVBQUU7TUFDUCxJQUFJLENBQUN5SSxJQUFJLENBQUMsWUFBWSxFQUFFekksS0FBSyxDQUFDO0lBQ2xDO0lBRUEsSUFBSSxDQUFDM0MsS0FBSyxHQUFHNEksT0FBTyxDQUFDZSxJQUFJLElBQUksSUFBSSxDQUFDM0osS0FBSztJQUV2QyxJQUFJLENBQUNFLFFBQVEsR0FBRztNQUFFLEdBQUcsSUFBSSxDQUFDQSxRQUFRO01BQUUsSUFBRzJJLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFBQyxDQUFDO0lBR3pELElBQUlELE9BQU8sQ0FBQ2xJLElBQUksRUFDWixPQUFPa0ksT0FBTyxDQUFDbEksSUFBSTtJQUV2QixJQUFJa0ksT0FBTyxDQUFDekgsR0FBRyxFQUNYLE9BQU95SCxPQUFPLENBQUN6SCxHQUFHO0lBRXRCLElBQUl5SCxPQUFPLENBQUNnQixJQUFJLEVBQ1osT0FBT2hCLE9BQU8sQ0FBQ2dCLElBQUk7RUFDM0I7RUFFQTJDLGlCQUFpQixDQUFDQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsaUJBQWlCLEVBQUVDLGdCQUFnQixFQUFFQyxtQkFBbUIsRUFBRTtJQUNoRixJQUFJLENBQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFO01BQ3ZCbEosTUFBTSxFQUFFMEssbUJBQW1CLENBQUNDLE9BQU87TUFDbkMvSixPQUFPLEVBQUU4SixtQkFBbUIsQ0FBQzlKLE9BQU8sSUFBSSxJQUFJO01BQzVDK0csSUFBSSxFQUFFO1FBQ0ZuQyxFQUFFLEVBQUUrRSxFQUFFLENBQUMvRSxFQUFFLElBQUksSUFBSTtRQUNqQmhELElBQUksRUFBRStILEVBQUUsQ0FBQy9ILElBQUk7UUFDYm9GLFNBQVMsRUFBRTZDLGdCQUFnQjtRQUMzQnJHLGNBQWMsRUFBRW1HLEVBQUUsQ0FBQ25HO01BQ3ZCLENBQUM7TUFDRG5JLEtBQUssRUFBRTtRQUNIdUosRUFBRSxFQUFFOEUsRUFBRSxDQUFDOUUsRUFBRSxJQUFJLElBQUk7UUFDakJoRCxJQUFJLEVBQUU4SCxFQUFFLENBQUM5SCxJQUFJO1FBQ2JvRixTQUFTLEVBQUU0QyxpQkFBaUI7UUFDNUJwRyxjQUFjLEVBQUVrRyxFQUFFLENBQUNsRztNQUN2QjtJQUNKLENBQUMsQ0FBQztFQUNOO0VBRUF3RyxZQUFZLENBQUNsSyxNQUFNLEVBQUU7SUFDakIsSUFBSSxDQUFDd0ksSUFBSSxDQUFDLFVBQVUsRUFBRXhJLE1BQU0sQ0FBQztFQUNqQztBQUVKO0FBQUMifQ==
|