testcafe 1.20.2-alpha.1 → 2.0.0-rc.3
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/lib/api/request-hooks/assert-type.js +2 -2
- package/lib/api/request-hooks/hook.js +2 -2
- package/lib/api/request-hooks/request-logger.js +2 -2
- package/lib/api/skip-js-errors/index.js +62 -0
- package/lib/api/structure/base-unit.js +2 -2
- package/lib/api/structure/fixture.js +13 -13
- package/lib/api/structure/test.js +18 -17
- package/lib/api/structure/testing-unit.js +26 -16
- package/lib/api/test-controller/assertion.js +5 -5
- package/lib/api/test-controller/execution-context.js +2 -2
- package/lib/api/test-controller/index.js +33 -30
- package/lib/api/test-controller/proxy.js +2 -2
- package/lib/api/test-page-url.js +4 -4
- package/lib/api/test-run-tracker.js +2 -2
- package/lib/api/wrap-test-function.js +3 -3
- package/lib/assertions/executor.js +4 -4
- package/lib/assertions/get-fn.js +3 -3
- package/lib/browser/connection/gateway.js +18 -18
- package/lib/browser/connection/get-hints.js +8 -8
- package/lib/browser/connection/index.js +11 -11
- package/lib/browser/connection/remotes-queue.js +4 -4
- package/lib/browser/provider/built-in/dedicated/base.js +6 -6
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +4 -4
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +6 -6
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +6 -6
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +4 -4
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +2 -2
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +8 -8
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +3 -3
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +5 -5
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +2 -2
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +7 -7
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +3 -3
- package/lib/browser/provider/built-in/path.js +2 -2
- package/lib/browser/provider/built-in/remote.js +3 -3
- package/lib/browser/provider/index.js +5 -5
- package/lib/browser/provider/plugin-host.js +5 -6
- package/lib/browser/provider/pool.js +4 -4
- package/lib/browser/provider/utils/argument-parsing.js +3 -3
- package/lib/browser/provider/utils/browser-starter.js +2 -2
- package/lib/cli/argument-parser/index.js +52 -41
- package/lib/cli/argument-parser/parse-utils.js +2 -2
- package/lib/cli/authentication-helper.js +3 -3
- package/lib/cli/cli.js +8 -8
- package/lib/cli/correct-browsers-and-sources.js +2 -2
- package/lib/cli/index.js +2 -2
- package/lib/cli/log.js +3 -3
- package/lib/cli/remotes-wizard.js +3 -3
- package/lib/client/automation/index.js +120 -34
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.js +321 -317
- package/lib/client/browser/service-worker.js +244 -290
- package/lib/client/core/deps/hammerhead.js +12 -4
- package/lib/client/core/index.js +145 -55
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/core/utils/dom.js +33 -28
- package/lib/client/core/utils/position.js +18 -14
- package/lib/client/core/utils/style.js +8 -4
- package/lib/client/driver/command-executors/client-functions/selector-executor/filter.js +5 -5
- package/lib/client/driver/command-executors/client-functions/selector-executor/utils.js +3 -3
- package/lib/client/driver/deps/hammerhead.js +12 -4
- package/lib/client/driver/deps/testcafe-core.js +12 -4
- package/lib/client/driver/deps/testcafe-ui.js +12 -4
- package/lib/client/driver/index.js +654 -630
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/status.js +2 -2
- package/lib/client/ui/index.js +10 -8
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client-functions/builder-symbol.js +1 -2
- package/lib/client-functions/client-function-builder.js +12 -12
- package/lib/client-functions/replicator.js +2 -2
- package/lib/client-functions/selector-api-execution-mode.js +2 -2
- package/lib/client-functions/selectors/add-api.js +48 -48
- package/lib/client-functions/selectors/selector-builder.js +17 -17
- package/lib/compiler/compile-client-function.js +6 -6
- package/lib/compiler/index.js +9 -9
- package/lib/compiler/test-file/api-based.js +8 -8
- package/lib/compiler/test-file/base.js +6 -6
- package/lib/compiler/test-file/exportble-lib-path.js +2 -2
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +2 -2
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +2 -2
- package/lib/compiler/test-file/formats/es-next/compiler.js +4 -4
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +4 -4
- package/lib/compiler/test-file/formats/raw.js +2 -2
- package/lib/compiler/test-file/formats/typescript/compiler.js +11 -11
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +3 -3
- package/lib/compiler/test-file/test-file-parser-base.js +3 -3
- package/lib/configuration/configuration-base.js +15 -15
- package/lib/configuration/interfaces.js +1 -1
- package/lib/configuration/skip-js-errors-option-names.js +11 -0
- package/lib/configuration/testcafe-configuration.js +21 -16
- package/lib/configuration/types.js +1 -1
- package/lib/configuration/typescript-configuration.js +4 -4
- package/lib/custom-client-scripts/assert-type.js +2 -2
- package/lib/custom-client-scripts/client-script.js +6 -6
- package/lib/custom-client-scripts/get-code.js +2 -2
- package/lib/custom-client-scripts/routing.js +3 -3
- package/lib/custom-client-scripts/utils.js +3 -3
- package/lib/dashboard/connector.js +4 -4
- package/lib/dashboard/get-default-project-link.js +2 -2
- package/lib/dashboard/index.js +26 -26
- package/lib/errors/create-stack-filter.js +2 -2
- package/lib/errors/error-list.js +2 -2
- package/lib/errors/get-callsite.js +2 -2
- package/lib/errors/is-internal-stack-frame.js +5 -5
- package/lib/errors/process-test-fn-error.js +2 -2
- package/lib/errors/runtime/index.js +10 -10
- package/lib/errors/runtime/templates.js +5 -2
- package/lib/errors/runtime/type-assertions.js +6 -6
- package/lib/errors/stack-cleaning-hook.js +2 -2
- package/lib/errors/test-run/formattable-adapter.js +7 -7
- package/lib/errors/test-run/index.js +25 -5
- package/lib/errors/test-run/render-error-template/index.js +6 -6
- package/lib/errors/test-run/render-error-template/utils.js +2 -2
- package/lib/errors/test-run/templates.js +40 -31
- package/lib/errors/test-run/utils.js +7 -7
- package/lib/errors/types.js +5 -1
- package/lib/index.js +1 -1
- package/lib/live/file-watcher/index.js +2 -2
- package/lib/live/keyboard-observer.js +3 -3
- package/lib/live/test-run-controller.js +3 -3
- package/lib/live/test-run.js +3 -2
- package/lib/live/test-runner.js +2 -2
- package/lib/load-assets.js +2 -2
- package/lib/notifications/add-rendered-warning.js +4 -4
- package/lib/notifications/debug-logger.js +6 -6
- package/lib/notifications/deprecated.js +2 -2
- package/lib/notifications/information-message.js +4 -3
- package/lib/proxyless/resource-injector.js +4 -4
- package/lib/reporter/command/command-formatter.js +4 -4
- package/lib/reporter/index.js +10 -10
- package/lib/reporter/plugin-host.js +7 -7
- package/lib/role/index.js +8 -8
- package/lib/role/role.js +2 -2
- package/lib/runner/bootstrapper.js +20 -20
- package/lib/runner/browser-job.js +3 -3
- package/lib/runner/browser-set.js +12 -12
- package/lib/runner/fixture-hook-controller.js +5 -5
- package/lib/runner/index.js +43 -33
- package/lib/runner/task/index.js +10 -6
- package/lib/runner/test-run-hook-controller.js +5 -5
- package/lib/runner/tested-app.js +7 -7
- package/lib/screenshots/capturer.js +17 -17
- package/lib/screenshots/crop.js +8 -8
- package/lib/screenshots/index.js +6 -10
- package/lib/screenshots/utils.js +4 -4
- package/lib/services/compiler/host.js +8 -8
- package/lib/services/compiler/service.js +13 -13
- package/lib/services/compiler/test-run-proxy.js +8 -8
- package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +2 -2
- package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +2 -1
- package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +3 -3
- package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +2 -2
- package/lib/services/serialization/test-structure.js +4 -4
- package/lib/services/utils/ipc/interfaces.js +1 -3
- package/lib/services/utils/ipc/io.js +3 -3
- package/lib/services/utils/ipc/message.js +2 -2
- package/lib/services/utils/ipc/proxy.js +4 -4
- package/lib/services/utils/ipc/transport.js +2 -2
- package/lib/shared/errors/index.js +9 -2
- package/lib/shared/errors/selector-error-ctor-callback.js +7 -3
- package/lib/test-run/bookmark.js +1 -1
- package/lib/test-run/browser-manipulation-queue.js +3 -3
- package/lib/test-run/commands/actions.js +66 -46
- package/lib/test-run/commands/assertion.js +3 -3
- package/lib/test-run/commands/base.js +2 -2
- package/lib/test-run/commands/browser-manipulation.js +8 -8
- package/lib/test-run/commands/observation.js +4 -4
- package/lib/test-run/commands/options.js +27 -12
- package/lib/test-run/commands/type.js +2 -1
- package/lib/test-run/commands/utils.js +3 -2
- package/lib/test-run/commands/validations/argument.js +19 -10
- package/lib/test-run/commands/validations/factories.js +10 -2
- package/lib/test-run/commands/validations/initializers.js +4 -4
- package/lib/test-run/debug-log.js +4 -4
- package/lib/test-run/execute-js-expression/index.js +4 -4
- package/lib/test-run/index.js +48 -41
- package/lib/test-run/request/create-request-options.js +9 -9
- package/lib/test-run/request/process-response-data.js +2 -2
- package/lib/test-run/request/send.js +5 -5
- package/lib/testcafe.js +8 -4
- package/lib/utils/check-file-path.js +2 -2
- package/lib/utils/check-url.js +2 -2
- package/lib/utils/correct-file-path.js +4 -4
- package/lib/utils/delegated-api.js +1 -1
- package/lib/utils/detect-ffmpeg.js +3 -3
- package/lib/utils/diff/colors.js +2 -2
- package/lib/utils/diff/index.js +11 -7
- package/lib/utils/diff/util.js +5 -5
- package/lib/utils/diff.js +4 -4
- package/lib/utils/escape-user-agent.js +2 -2
- package/lib/utils/execute-fn-with-timeout.js +2 -2
- package/lib/utils/get-browser.js +2 -2
- package/lib/utils/get-filter-fn.js +4 -4
- package/lib/utils/get-options/base.js +2 -2
- package/lib/utils/get-options/compiler.js +2 -2
- package/lib/utils/get-options/dashboard.js +2 -2
- package/lib/utils/get-options/get-assertion-timeout.js +1 -1
- package/lib/utils/get-options/index.js +4 -2
- package/lib/utils/get-options/meta.js +2 -2
- package/lib/utils/get-options/quarantine.js +8 -6
- package/lib/utils/get-options/screenshot.js +2 -2
- package/lib/utils/get-options/skip-js-errors.js +35 -0
- package/lib/utils/get-options/ssl.js +6 -6
- package/lib/utils/get-options/video.js +2 -2
- package/lib/utils/is-password-input.js +1 -1
- package/lib/utils/log-entry.js +2 -2
- package/lib/utils/make-reg-exp.js +19 -6
- package/lib/utils/moment-loader.js +2 -2
- package/lib/utils/parse-file-list.js +7 -7
- package/lib/utils/path-pattern.js +4 -4
- package/lib/utils/prepare-reporters.js +2 -2
- package/lib/utils/prerender-callsite.js +6 -6
- package/lib/utils/process.js +7 -7
- package/lib/utils/promisified-functions.js +14 -14
- package/lib/utils/raw-command-callsite-record.js +2 -2
- package/lib/utils/resolve-path-relatively-cwd.js +2 -2
- package/lib/utils/string.js +3 -3
- package/lib/utils/temp-directory/cleanup-process/index.js +6 -6
- package/lib/utils/temp-directory/cleanup-process/worker.js +4 -4
- package/lib/utils/temp-directory/index.js +6 -6
- package/lib/utils/temp-directory/lockfile.js +2 -2
- package/lib/video-recorder/process.js +6 -6
- package/lib/video-recorder/recorder.js +9 -9
- package/lib/video-recorder/test-run-video-recorder.js +2 -2
- package/package.json +8 -7
- package/ts-defs/index.d.ts +46 -7
- package/ts-defs/selectors.d.ts +39 -0
- package/ts-defs/testcafe-scripts.d.ts +39 -0
package/lib/screenshots/index.js
CHANGED
|
@@ -13,7 +13,7 @@ const temp_directory_1 = __importDefault(require("../utils/temp-directory"));
|
|
|
13
13
|
const create_safe_listener_1 = __importDefault(require("../utils/create-safe-listener"));
|
|
14
14
|
const debug_1 = __importDefault(require("debug"));
|
|
15
15
|
const events_1 = require("events");
|
|
16
|
-
const DEBUG_LOGGER = debug_1.default('testcafe:screenshots');
|
|
16
|
+
const DEBUG_LOGGER = (0, debug_1.default)('testcafe:screenshots');
|
|
17
17
|
const TEMP_DIR_PREFIX = 'screenshots';
|
|
18
18
|
class Screenshots extends events_1.EventEmitter {
|
|
19
19
|
constructor({ enabled, path, pathPattern, fullPage, thumbnails, autoTakeOnFails, messageBus }) {
|
|
@@ -24,24 +24,20 @@ class Screenshots extends events_1.EventEmitter {
|
|
|
24
24
|
this.fullPage = fullPage;
|
|
25
25
|
this.thumbnails = thumbnails;
|
|
26
26
|
this.testEntries = [];
|
|
27
|
-
this.now = moment_1.default();
|
|
27
|
+
this.now = (0, moment_1.default)();
|
|
28
28
|
this.tempDirectory = new temp_directory_1.default(TEMP_DIR_PREFIX);
|
|
29
29
|
this.autoTakeOnFails = autoTakeOnFails;
|
|
30
30
|
this._assignEventHandlers(messageBus);
|
|
31
31
|
}
|
|
32
32
|
_createSafeListener(listener) {
|
|
33
|
-
return create_safe_listener_1.default(this, listener, DEBUG_LOGGER);
|
|
33
|
+
return (0, create_safe_listener_1.default)(this, listener, DEBUG_LOGGER);
|
|
34
34
|
}
|
|
35
35
|
_assignEventHandlers(messageBus) {
|
|
36
36
|
messageBus.once('start', this._createSafeListener(this._onMessageBusStart));
|
|
37
|
-
messageBus.once('done', this._createSafeListener(this._onMessageBusDone));
|
|
38
37
|
}
|
|
39
38
|
async _onMessageBusStart() {
|
|
40
39
|
await this.tempDirectory.init();
|
|
41
40
|
}
|
|
42
|
-
async _onMessageBusDone() {
|
|
43
|
-
await this.tempDirectory.dispose();
|
|
44
|
-
}
|
|
45
41
|
_addTestEntry(test) {
|
|
46
42
|
const testEntry = {
|
|
47
43
|
test: test,
|
|
@@ -52,7 +48,7 @@ class Screenshots extends events_1.EventEmitter {
|
|
|
52
48
|
return testEntry;
|
|
53
49
|
}
|
|
54
50
|
_getTestEntry(test) {
|
|
55
|
-
return lodash_1.find(this.testEntries, entry => entry.test === test);
|
|
51
|
+
return (0, lodash_1.find)(this.testEntries, entry => entry.test === test);
|
|
56
52
|
}
|
|
57
53
|
_ensureTestEntry(test) {
|
|
58
54
|
let testEntry = this._getTestEntry(test);
|
|
@@ -69,7 +65,7 @@ class Screenshots extends events_1.EventEmitter {
|
|
|
69
65
|
getPathFor(test) {
|
|
70
66
|
const testEntry = this._getTestEntry(test);
|
|
71
67
|
const screenshotPaths = testEntry.screenshots.map(screenshot => screenshot.screenshotPath);
|
|
72
|
-
return get_common_path_1.default(screenshotPaths);
|
|
68
|
+
return (0, get_common_path_1.default)(screenshotPaths);
|
|
73
69
|
}
|
|
74
70
|
createCapturerFor(test, testIndex, quarantine, connection, warningLog) {
|
|
75
71
|
const testEntry = this._ensureTestEntry(test);
|
|
@@ -90,4 +86,4 @@ class Screenshots extends events_1.EventEmitter {
|
|
|
90
86
|
}
|
|
91
87
|
exports.default = Screenshots;
|
|
92
88
|
module.exports = exports.default;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBOEI7QUFDOUIsb0RBQTRCO0FBQzVCLDBEQUFrQztBQUNsQyx5RUFBZ0Q7QUFDaEQsK0VBQXFEO0FBQ3JELDRFQUErRDtBQUMvRCw2RUFBb0Q7QUFDcEQseUZBQStEO0FBQy9ELGtEQUEwQjtBQUMxQixtQ0FBc0M7QUFFdEMsTUFBTSxZQUFZLEdBQUcsSUFBQSxlQUFLLEVBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVuRCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFFdEMsTUFBcUIsV0FBWSxTQUFRLHFCQUFZO0lBQ2pELFlBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUU7UUFDMUYsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsT0FBTyxHQUFjLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFNLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQWEsUUFBUSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQVcsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQVUsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQWtCLElBQUEsZ0JBQU0sR0FBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLEdBQVEsSUFBSSx3QkFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxlQUFlLEdBQU0sZUFBZSxDQUFDO1FBRTFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsbUJBQW1CLENBQUUsUUFBUTtRQUN6QixPQUFPLElBQUEsOEJBQWtCLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsb0JBQW9CLENBQUUsVUFBVTtRQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQjtRQUNwQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWEsQ0FBRSxJQUFJO1FBQ2YsTUFBTSxTQUFTLEdBQUc7WUFDZCxJQUFJLEVBQVMsSUFBSTtZQUNqQixRQUFRLEVBQUssRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1NBQ2xCLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqQyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYSxDQUFFLElBQUk7UUFDZixPQUFPLElBQUEsYUFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxJQUFJO1FBQ2xCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLFNBQVM7WUFDVixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsa0JBQWtCLENBQUUsSUFBSTtRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ2hELENBQUM7SUFFRCxjQUFjLENBQUUsSUFBSTtRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxVQUFVLENBQUUsSUFBSTtRQUNaLE1BQU0sU0FBUyxHQUFTLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFM0YsT0FBTyxJQUFBLHlCQUFhLEVBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGlCQUFpQixDQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO1FBQ2xFLE1BQU0sU0FBUyxHQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLHNCQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLDJCQUE0QixFQUFFO1lBQ3ZGLFNBQVM7WUFDVCxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3hFLEdBQUcsRUFBZ0IsSUFBSSxDQUFDLEdBQUc7WUFDM0IsT0FBTyxFQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUNwQyxJQUFJLEVBQWUsSUFBSSxDQUFDLElBQUk7WUFDNUIsZUFBZSxFQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZTtTQUM1RCxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksa0JBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdLLENBQUM7SUFFRCxVQUFVLENBQUUsSUFBSSxFQUFFLE9BQU87UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDL0QsQ0FBQztDQUNKO0FBeEZELDhCQXdGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IENhcHR1cmVyIGZyb20gJy4vY2FwdHVyZXInO1xuaW1wb3J0IFBhdGhQYXR0ZXJuIGZyb20gJy4uL3V0aWxzL3BhdGgtcGF0dGVybic7XG5pbXBvcnQgZ2V0Q29tbW9uUGF0aCBmcm9tICcuLi91dGlscy9nZXQtY29tbW9uLXBhdGgnO1xuaW1wb3J0IERFRkFVTFRfU0NSRUVOU0hPVF9FWFRFTlNJT04gZnJvbSAnLi9kZWZhdWx0LWV4dGVuc2lvbic7XG5pbXBvcnQgVGVtcERpcmVjdG9yeSBmcm9tICcuLi91dGlscy90ZW1wLWRpcmVjdG9yeSc7XG5pbXBvcnQgY3JlYXRlU2FmZUxpc3RlbmVyIGZyb20gJy4uL3V0aWxzL2NyZWF0ZS1zYWZlLWxpc3RlbmVyJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5jb25zdCBERUJVR19MT0dHRVIgPSBkZWJ1ZygndGVzdGNhZmU6c2NyZWVuc2hvdHMnKTtcblxuY29uc3QgVEVNUF9ESVJfUFJFRklYID0gJ3NjcmVlbnNob3RzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NyZWVuc2hvdHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yICh7IGVuYWJsZWQsIHBhdGgsIHBhdGhQYXR0ZXJuLCBmdWxsUGFnZSwgdGh1bWJuYWlscywgYXV0b1Rha2VPbkZhaWxzLCBtZXNzYWdlQnVzIH0pIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmVuYWJsZWQgICAgICAgICAgICA9IGVuYWJsZWQ7XG4gICAgICAgIHRoaXMuc2NyZWVuc2hvdHNQYXRoICAgID0gcGF0aDtcbiAgICAgICAgdGhpcy5zY3JlZW5zaG90c1BhdHRlcm4gPSBwYXRoUGF0dGVybjtcbiAgICAgICAgdGhpcy5mdWxsUGFnZSAgICAgICAgICAgPSBmdWxsUGFnZTtcbiAgICAgICAgdGhpcy50aHVtYm5haWxzICAgICAgICAgPSB0aHVtYm5haWxzO1xuICAgICAgICB0aGlzLnRlc3RFbnRyaWVzICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLm5vdyAgICAgICAgICAgICAgICA9IG1vbWVudCgpO1xuICAgICAgICB0aGlzLnRlbXBEaXJlY3RvcnkgICAgICA9IG5ldyBUZW1wRGlyZWN0b3J5KFRFTVBfRElSX1BSRUZJWCk7XG4gICAgICAgIHRoaXMuYXV0b1Rha2VPbkZhaWxzICAgID0gYXV0b1Rha2VPbkZhaWxzO1xuXG4gICAgICAgIHRoaXMuX2Fzc2lnbkV2ZW50SGFuZGxlcnMobWVzc2FnZUJ1cyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVNhZmVMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNhZmVMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lciwgREVCVUdfTE9HR0VSKTtcbiAgICB9XG5cbiAgICBfYXNzaWduRXZlbnRIYW5kbGVycyAobWVzc2FnZUJ1cykge1xuICAgICAgICBtZXNzYWdlQnVzLm9uY2UoJ3N0YXJ0JywgdGhpcy5fY3JlYXRlU2FmZUxpc3RlbmVyKHRoaXMuX29uTWVzc2FnZUJ1c1N0YXJ0KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX29uTWVzc2FnZUJ1c1N0YXJ0ICgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50ZW1wRGlyZWN0b3J5LmluaXQoKTtcbiAgICB9XG5cbiAgICBfYWRkVGVzdEVudHJ5ICh0ZXN0KSB7XG4gICAgICAgIGNvbnN0IHRlc3RFbnRyeSA9IHtcbiAgICAgICAgICAgIHRlc3Q6ICAgICAgICB0ZXN0LFxuICAgICAgICAgICAgdGVzdFJ1bnM6ICAgIHt9LFxuICAgICAgICAgICAgc2NyZWVuc2hvdHM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudGVzdEVudHJpZXMucHVzaCh0ZXN0RW50cnkpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0RW50cnk7XG4gICAgfVxuXG4gICAgX2dldFRlc3RFbnRyeSAodGVzdCkge1xuICAgICAgICByZXR1cm4gZmluZCh0aGlzLnRlc3RFbnRyaWVzLCBlbnRyeSA9PiBlbnRyeS50ZXN0ID09PSB0ZXN0KTtcbiAgICB9XG5cbiAgICBfZW5zdXJlVGVzdEVudHJ5ICh0ZXN0KSB7XG4gICAgICAgIGxldCB0ZXN0RW50cnkgPSB0aGlzLl9nZXRUZXN0RW50cnkodGVzdCk7XG5cbiAgICAgICAgaWYgKCF0ZXN0RW50cnkpXG4gICAgICAgICAgICB0ZXN0RW50cnkgPSB0aGlzLl9hZGRUZXN0RW50cnkodGVzdCk7XG5cbiAgICAgICAgcmV0dXJuIHRlc3RFbnRyeTtcbiAgICB9XG5cbiAgICBnZXRTY3JlZW5zaG90c0luZm8gKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRlc3RFbnRyeSh0ZXN0KS5zY3JlZW5zaG90cztcbiAgICB9XG5cbiAgICBoYXNDYXB0dXJlZEZvciAodGVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JlZW5zaG90c0luZm8odGVzdCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXRQYXRoRm9yICh0ZXN0KSB7XG4gICAgICAgIGNvbnN0IHRlc3RFbnRyeSAgICAgICA9IHRoaXMuX2dldFRlc3RFbnRyeSh0ZXN0KTtcbiAgICAgICAgY29uc3Qgc2NyZWVuc2hvdFBhdGhzID0gdGVzdEVudHJ5LnNjcmVlbnNob3RzLm1hcChzY3JlZW5zaG90ID0+IHNjcmVlbnNob3Quc2NyZWVuc2hvdFBhdGgpO1xuXG4gICAgICAgIHJldHVybiBnZXRDb21tb25QYXRoKHNjcmVlbnNob3RQYXRocyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2FwdHVyZXJGb3IgKHRlc3QsIHRlc3RJbmRleCwgcXVhcmFudGluZSwgY29ubmVjdGlvbiwgd2FybmluZ0xvZykge1xuICAgICAgICBjb25zdCB0ZXN0RW50cnkgICA9IHRoaXMuX2Vuc3VyZVRlc3RFbnRyeSh0ZXN0KTtcbiAgICAgICAgY29uc3QgcGF0aFBhdHRlcm4gPSBuZXcgUGF0aFBhdHRlcm4odGhpcy5zY3JlZW5zaG90c1BhdHRlcm4sIERFRkFVTFRfU0NSRUVOU0hPVF9FWFRFTlNJT04sIHtcbiAgICAgICAgICAgIHRlc3RJbmRleCxcbiAgICAgICAgICAgIHF1YXJhbnRpbmVBdHRlbXB0OiBxdWFyYW50aW5lID8gcXVhcmFudGluZS5nZXROZXh0QXR0ZW1wdE51bWJlcigpIDogbnVsbCxcbiAgICAgICAgICAgIG5vdzogICAgICAgICAgICAgICB0aGlzLm5vdyxcbiAgICAgICAgICAgIGZpeHR1cmU6ICAgICAgICAgICB0ZXN0LmZpeHR1cmUubmFtZSxcbiAgICAgICAgICAgIHRlc3Q6ICAgICAgICAgICAgICB0ZXN0Lm5hbWUsXG4gICAgICAgICAgICBwYXJzZWRVc2VyQWdlbnQ6ICAgY29ubmVjdGlvbi5icm93c2VySW5mby5wYXJzZWRVc2VyQWdlbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ2FwdHVyZXIodGhpcy5zY3JlZW5zaG90c1BhdGgsIHRlc3RFbnRyeSwgY29ubmVjdGlvbiwgcGF0aFBhdHRlcm4sIHRoaXMuZnVsbFBhZ2UsIHRoaXMudGh1bWJuYWlscywgd2FybmluZ0xvZywgdGhpcy50ZW1wRGlyZWN0b3J5LnBhdGgsIHRoaXMuYXV0b1Rha2VPbkZhaWxzKTtcbiAgICB9XG5cbiAgICBhZGRUZXN0UnVuICh0ZXN0LCB0ZXN0UnVuKSB7XG4gICAgICAgIGNvbnN0IHRlc3RFbnRyeSA9IHRoaXMuX2dldFRlc3RFbnRyeSh0ZXN0KTtcblxuICAgICAgICB0ZXN0RW50cnkudGVzdFJ1bnNbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF0gPSB0ZXN0UnVuO1xuICAgIH1cbn1cbiJdfQ==
|
package/lib/screenshots/utils.js
CHANGED
|
@@ -8,13 +8,13 @@ const constants_1 = require("./constants");
|
|
|
8
8
|
const ALPHABET = '01';
|
|
9
9
|
function generateScreenshotMark() {
|
|
10
10
|
// NOTE: 32-bit id
|
|
11
|
-
const id = nanoid_1.customAlphabet(ALPHABET, constants_1.MARK_LENGTH)();
|
|
11
|
+
const id = (0, nanoid_1.customAlphabet)(ALPHABET, constants_1.MARK_LENGTH)();
|
|
12
12
|
// NOTE: array of RGB values
|
|
13
|
-
const markSeed = lodash_1.flatten(lodash_1.map(id, bit => bit === '0' ? [0, 0, 0, 255] : [255, 255, 255, 255]));
|
|
13
|
+
const markSeed = (0, lodash_1.flatten)((0, lodash_1.map)(id, bit => bit === '0' ? [0, 0, 0, 255] : [255, 255, 255, 255]));
|
|
14
14
|
// NOTE: macOS browsers can't display an element, if it's CSS height is lesser than 1.
|
|
15
15
|
// It happens on Retina displays, because they have more than 1 physical pixel in a CSS pixel.
|
|
16
16
|
// So increase mark size by prepending transparent pixels before the actual mark.
|
|
17
|
-
const imageData = lodash_1.times(constants_1.MARK_BYTES_PER_PIXEL * constants_1.MARK_LENGTH * (constants_1.MARK_HEIGHT - 1), lodash_1.constant(0)).concat(markSeed);
|
|
17
|
+
const imageData = (0, lodash_1.times)(constants_1.MARK_BYTES_PER_PIXEL * constants_1.MARK_LENGTH * (constants_1.MARK_HEIGHT - 1), (0, lodash_1.constant)(0)).concat(markSeed);
|
|
18
18
|
const imageDataBuffer = Buffer.from(imageData);
|
|
19
19
|
const pngImage = new pngjs_1.PNG({ width: constants_1.MARK_LENGTH, height: constants_1.MARK_HEIGHT });
|
|
20
20
|
imageDataBuffer.copy(pngImage.data);
|
|
@@ -34,4 +34,4 @@ function copyImagePart(pngImage, { clipLeft, clipTop, clipRight, clipBottom }) {
|
|
|
34
34
|
return dstImage;
|
|
35
35
|
}
|
|
36
36
|
exports.copyImagePart = copyImagePart;
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQTRCO0FBQzVCLG1DQUtnQjtBQUVoQixtQ0FBd0M7QUFDeEMsMkNBSXFCO0FBRXJCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUV0QixTQUFnQixzQkFBc0I7SUFDbEMsa0JBQWtCO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsdUJBQWMsRUFBQyxRQUFRLEVBQUUsdUJBQVcsQ0FBQyxFQUFFLENBQUM7SUFFbkQsNEJBQTRCO0lBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQU8sRUFBQyxJQUFBLFlBQUcsRUFBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RixzRkFBc0Y7SUFDdEYsOEZBQThGO0lBQzlGLGlGQUFpRjtJQUNqRixNQUFNLFNBQVMsR0FBUyxJQUFBLGNBQUssRUFBQyxnQ0FBb0IsR0FBRyx1QkFBVyxHQUFHLENBQUMsdUJBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFBLGlCQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEgsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBVSxJQUFJLFdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSx1QkFBVyxFQUFFLE1BQU0sRUFBRSx1QkFBVyxFQUFFLENBQUMsQ0FBQztJQUU3RSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsR0FBRyxXQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBbkJELHdEQW1CQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7SUFDakYsTUFBTSxLQUFLLEdBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLElBQUksV0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxnQ0FBb0IsQ0FBQztJQUVyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxnQ0FBb0IsQ0FBQztRQUV6RixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsYUFBYSxFQUFFLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQztLQUN4RjtJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFmRCxzQ0FlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBORyB9IGZyb20gJ3BuZ2pzJztcbmltcG9ydCB7XG4gICAgbWFwLFxuICAgIGZsYXR0ZW4sXG4gICAgdGltZXMsXG4gICAgY29uc3RhbnQsXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IGN1c3RvbUFscGhhYmV0IH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gICAgTUFSS19MRU5HVEgsXG4gICAgTUFSS19IRUlHSFQsXG4gICAgTUFSS19CWVRFU19QRVJfUElYRUwsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgQUxQSEFCRVQgPSAnMDEnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JlZW5zaG90TWFyayAoKSB7XG4gICAgLy8gTk9URTogMzItYml0IGlkXG4gICAgY29uc3QgaWQgPSBjdXN0b21BbHBoYWJldChBTFBIQUJFVCwgTUFSS19MRU5HVEgpKCk7XG5cbiAgICAvLyBOT1RFOiBhcnJheSBvZiBSR0IgdmFsdWVzXG4gICAgY29uc3QgbWFya1NlZWQgPSBmbGF0dGVuKG1hcChpZCwgYml0ID0+IGJpdCA9PT0gJzAnID8gWzAsIDAsIDAsIDI1NV0gOiBbMjU1LCAyNTUsIDI1NSwgMjU1XSkpO1xuXG4gICAgLy8gTk9URTogbWFjT1MgYnJvd3NlcnMgY2FuJ3QgZGlzcGxheSBhbiBlbGVtZW50LCBpZiBpdCdzIENTUyBoZWlnaHQgaXMgbGVzc2VyIHRoYW4gMS5cbiAgICAvLyBJdCBoYXBwZW5zIG9uIFJldGluYSBkaXNwbGF5cywgYmVjYXVzZSB0aGV5IGhhdmUgbW9yZSB0aGFuIDEgcGh5c2ljYWwgcGl4ZWwgaW4gYSBDU1MgcGl4ZWwuXG4gICAgLy8gU28gaW5jcmVhc2UgbWFyayBzaXplIGJ5IHByZXBlbmRpbmcgdHJhbnNwYXJlbnQgcGl4ZWxzIGJlZm9yZSB0aGUgYWN0dWFsIG1hcmsuXG4gICAgY29uc3QgaW1hZ2VEYXRhICAgICAgID0gdGltZXMoTUFSS19CWVRFU19QRVJfUElYRUwgKiBNQVJLX0xFTkdUSCAqIChNQVJLX0hFSUdIVCAtIDEpLCBjb25zdGFudCgwKSkuY29uY2F0KG1hcmtTZWVkKTtcbiAgICBjb25zdCBpbWFnZURhdGFCdWZmZXIgPSBCdWZmZXIuZnJvbShpbWFnZURhdGEpO1xuICAgIGNvbnN0IHBuZ0ltYWdlICAgICAgICA9IG5ldyBQTkcoeyB3aWR0aDogTUFSS19MRU5HVEgsIGhlaWdodDogTUFSS19IRUlHSFQgfSk7XG5cbiAgICBpbWFnZURhdGFCdWZmZXIuY29weShwbmdJbWFnZS5kYXRhKTtcblxuICAgIGNvbnN0IG1hcmtEYXRhID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgUE5HLnN5bmMud3JpdGUocG5nSW1hZ2UpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHJldHVybiB7IG1hcmtTZWVkLCBtYXJrRGF0YSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUltYWdlUGFydCAocG5nSW1hZ2UsIHsgY2xpcExlZnQsIGNsaXBUb3AsIGNsaXBSaWdodCwgY2xpcEJvdHRvbSB9KSB7XG4gICAgY29uc3Qgd2lkdGggID0gY2xpcFJpZ2h0IC0gY2xpcExlZnQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gY2xpcEJvdHRvbSAtIGNsaXBUb3A7XG5cbiAgICBjb25zdCBkc3RJbWFnZSA9IG5ldyBQTkcoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuXG4gICAgY29uc3Qgc3RyaWRlID0gZHN0SW1hZ2Uud2lkdGggKiBNQVJLX0JZVEVTX1BFUl9QSVhFTDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3JjU3RhcnRJbmRleCA9IChwbmdJbWFnZS53aWR0aCAqIChpICsgY2xpcFRvcCkgKyBjbGlwTGVmdCkgKiBNQVJLX0JZVEVTX1BFUl9QSVhFTDtcblxuICAgICAgICBwbmdJbWFnZS5kYXRhLmNvcHkoZHN0SW1hZ2UuZGF0YSwgc3RyaWRlICogaSwgc3JjU3RhcnRJbmRleCwgc3JjU3RhcnRJbmRleCArIHN0cmlkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdEltYWdlO1xufVxuIl19
|
|
@@ -24,7 +24,7 @@ const test_run_1 = require("../../errors/test-run");
|
|
|
24
24
|
const handle_errors_1 = require("../../utils/handle-errors");
|
|
25
25
|
const node_arguments_filter_1 = require("../../cli/node-arguments-filter");
|
|
26
26
|
const SERVICE_PATH = require.resolve('./service-loader');
|
|
27
|
-
const INTERNAL_FILES_URL = url_1.pathToFileURL(path_1.default.join(__dirname, '../../'));
|
|
27
|
+
const INTERNAL_FILES_URL = (0, url_1.pathToFileURL)(path_1.default.join(__dirname, '../../'));
|
|
28
28
|
const INSPECT_RE = new RegExp(`^(${node_arguments_filter_1.V8_DEBUG_FLAGS.join('|')})`);
|
|
29
29
|
const INSPECT_PORT_RE = new RegExp(`^(${node_arguments_filter_1.V8_DEBUG_FLAGS.join('|')})=(.+:)?(\\d+)$`);
|
|
30
30
|
const INITIAL_DEBUGGER_BREAK_ON_START = 'Break on start';
|
|
@@ -151,14 +151,14 @@ class CompilerHost extends async_event_emitter_1.default {
|
|
|
151
151
|
if (resolvedRuntime)
|
|
152
152
|
return resolvedRuntime;
|
|
153
153
|
try {
|
|
154
|
-
const port = this.parseDebugPort() || await endpoint_utils_1.getFreePort();
|
|
154
|
+
const port = this.parseDebugPort() || await (0, endpoint_utils_1.getFreePort)();
|
|
155
155
|
const args = this._getServiceProcessArgs(port.toString());
|
|
156
|
-
const service = child_process_1.spawn(process.argv0, args, { stdio: [0, 1, 2, 'pipe', 'pipe', 'pipe'] });
|
|
156
|
+
const service = (0, child_process_1.spawn)(process.argv0, args, { stdio: [0, 1, 2, 'pipe', 'pipe', 'pipe'] });
|
|
157
157
|
// NOTE: need to wait, otherwise the error will be at `await cdp(...)`
|
|
158
158
|
// TODO: debugging: refactor to use delay and multiple tries
|
|
159
159
|
await new Promise(r => setTimeout(r, 2000));
|
|
160
160
|
// @ts-ignore
|
|
161
|
-
this.cdp = await chrome_remote_interface_1.default({ port });
|
|
161
|
+
this.cdp = await (0, chrome_remote_interface_1.default)({ port });
|
|
162
162
|
if (!this.cdp)
|
|
163
163
|
return void 0;
|
|
164
164
|
if (!this.developmentMode)
|
|
@@ -237,7 +237,7 @@ class CompilerHost extends async_event_emitter_1.default {
|
|
|
237
237
|
async getTests({ sourceList, compilerOptions, runnableConfigurationId }, baseUrl) {
|
|
238
238
|
const { proxy } = await this._getRuntime();
|
|
239
239
|
const units = await proxy.call(this.getTests, { sourceList, compilerOptions, runnableConfigurationId }, baseUrl);
|
|
240
|
-
return test_structure_1.restore(units, (...args) => this._wrapTestFunction(...args), (ruleLocator) => this._wrapRequestFilterRulePredicate(ruleLocator));
|
|
240
|
+
return (0, test_structure_1.restore)(units, (...args) => this._wrapTestFunction(...args), (ruleLocator) => this._wrapRequestFilterRulePredicate(ruleLocator));
|
|
241
241
|
}
|
|
242
242
|
async runTestFn({ id, functionName, testRunId }) {
|
|
243
243
|
const { proxy } = await this._getRuntime();
|
|
@@ -253,7 +253,7 @@ class CompilerHost extends async_event_emitter_1.default {
|
|
|
253
253
|
}
|
|
254
254
|
async setOptions({ value }) {
|
|
255
255
|
const { proxy } = await this._getRuntime();
|
|
256
|
-
const preparedOptions = prepare_options_1.default(value);
|
|
256
|
+
const preparedOptions = (0, prepare_options_1.default)(value);
|
|
257
257
|
await proxy.call(this.setOptions, { value: preparedOptions });
|
|
258
258
|
}
|
|
259
259
|
async onRequestHookEvent({ name, testId, hookId, eventData }) {
|
|
@@ -346,7 +346,7 @@ class CompilerHost extends async_event_emitter_1.default {
|
|
|
346
346
|
}
|
|
347
347
|
async addUnexpectedError({ type, message }) {
|
|
348
348
|
const ErrorTypeConstructor = this._getErrorTypeConstructor(type);
|
|
349
|
-
handle_errors_1.handleUnexpectedError(ErrorTypeConstructor, message);
|
|
349
|
+
(0, handle_errors_1.handleUnexpectedError)(ErrorTypeConstructor, message);
|
|
350
350
|
}
|
|
351
351
|
async checkWindow({ testRunId, commandId, url, title }) {
|
|
352
352
|
const { proxy } = await this._getRuntime();
|
|
@@ -367,4 +367,4 @@ class CompilerHost extends async_event_emitter_1.default {
|
|
|
367
367
|
}
|
|
368
368
|
exports.default = CompilerHost;
|
|
369
369
|
module.exports = exports.default;
|
|
370
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDZCQUFvQztBQUNwQyxzRkFBMEM7QUFFMUMsaURBQW9EO0FBQ3BELG1EQUE2QztBQUU3Qyw2QkFJYztBQUVkLG9FQUFrRjtBQUNsRix1RkFBOEQ7QUFDOUQsa0ZBQXVFO0FBQ3ZFLGdGQUF1RDtBQUV2RCw4Q0FBOEM7QUFDOUMsc0RBQXVEO0FBQ3ZELDBGQUFnRTtBQUNoRSx5RUFBd0Q7QUFDeEQsNEVBQW9EO0FBaUJwRCxxRUFBd0Y7QUFDeEYsbUhBQXNGO0FBNkJ0RixvREFBK0Y7QUFDL0YsNkRBQWtFO0FBQ2xFLDJFQUFpRTtBQUdqRSxNQUFNLFlBQVksR0FBUyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0QsTUFBTSxrQkFBa0IsR0FBRyxtQkFBYSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFekUsTUFBTSxVQUFVLEdBQVEsSUFBSSxNQUFNLENBQUMsS0FBSyxzQ0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckUsTUFBTSxlQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxzQ0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQW1CbkYsTUFBTSwrQkFBK0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUV6RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFtQjtJQUNwRCxDQUFDLHlDQUE4QixDQUFDLElBQUksRUFBRSx5Q0FBOEIsQ0FBQztJQUNyRSxDQUFDLGlDQUFzQixDQUFDLElBQUksRUFBRSxpQ0FBc0IsQ0FBQztDQUN4RCxDQUFDLENBQUM7QUFPSCxNQUFxQixZQUFh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SUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBRSxFQUFFLFNBQVMsRUFBa0I7UUFDOUQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxLQUFLLENBQUMsMEJBQTBCLENBQUUsRUFBRSxVQUFVLEVBQThCO1FBQy9FLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQixDQUFFLEVBQUUsdUJBQXVCLEVBQWlDO1FBQ3pGLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7Q0FDSjtBQTNjRCwrQkEyY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IGNkcCBmcm9tICdjaHJvbWUtcmVtb3RlLWludGVyZmFjZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBzcGF3biwgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBnZXRGcmVlUG9ydCB9IGZyb20gJ2VuZHBvaW50LXV0aWxzJztcblxuaW1wb3J0IHtcbiAgICBIT1NUX0lOUFVUX0ZELFxuICAgIEhPU1RfT1VUUFVUX0ZELFxuICAgIEhPU1RfU1lOQ19GRCxcbn0gZnJvbSAnLi9pbyc7XG5cbmltcG9ydCB7IHJlc3RvcmUgYXMgcmVzdG9yZVRlc3RTdHJ1Y3R1cmUgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL3Rlc3Qtc3RydWN0dXJlJztcbmltcG9ydCBwcmVwYXJlT3B0aW9ucyBmcm9tICcuLi9zZXJpYWxpemF0aW9uL3ByZXBhcmUtb3B0aW9ucyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHRlc3RSdW5UcmFja2VyIH0gZnJvbSAnLi4vLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IFRlc3RDb250cm9sbGVyIGZyb20gJy4uLy4uL2FwaS90ZXN0LWNvbnRyb2xsZXInO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi4vLi4vdGVzdC1ydW4nO1xuaW1wb3J0IHsgSVBDUHJveHkgfSBmcm9tICcuLi91dGlscy9pcGMvcHJveHknO1xuaW1wb3J0IHsgSG9zdFRyYW5zcG9ydCB9IGZyb20gJy4uL3V0aWxzL2lwYy90cmFuc3BvcnQnO1xuaW1wb3J0IEFzeW5jRXZlbnRFbWl0dGVyIGZyb20gJy4uLy4uL3V0aWxzL2FzeW5jLWV2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IFRlc3RDYWZlRXJyb3JMaXN0IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvci1saXN0JztcbmltcG9ydCBERUJVR19BQ1RJT04gZnJvbSAnLi4vLi4vdXRpbHMvZGVidWctYWN0aW9uJztcblxuaW1wb3J0IHtcbiAgICBDb21waWxlclByb3RvY29sLFxuICAgIFJ1blRlc3RBcmd1bWVudHMsXG4gICAgRnVuY3Rpb25Qcm9wZXJ0aWVzLFxufSBmcm9tICcuL3Byb3RvY29sJztcblxuaW1wb3J0IHsgQ29tcGlsZXJBcmd1bWVudHMgfSBmcm9tICcuLi8uLi9jb21waWxlci9pbnRlcmZhY2VzJztcbmltcG9ydCBUZXN0IGZyb20gJy4uLy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUmVxdWVzdEluZm8sXG4gICAgUmVzcG9uc2VNb2NrLFxuICAgIEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucyxcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmltcG9ydCB7IERlYnVnQ29tbWFuZCwgRGlzYWJsZURlYnVnQ29tbWFuZCB9IGZyb20gJy4uLy4uL3Rlc3QtcnVuL2NvbW1hbmRzL29ic2VydmF0aW9uJztcbmltcG9ydCBNZXRob2RTaG91bGROb3RCZUNhbGxlZEVycm9yIGZyb20gJy4uL3V0aWxzL21ldGhvZC1zaG91bGQtbm90LWJlLWNhbGxlZC1lcnJvcic7XG5cbmltcG9ydCB7XG4gICAgQWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVDb21tYW5kQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVNb2NrUHJlZGljYXRlLFxuICAgIEV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZUFyZ3VtZW50cyxcbiAgICBFeGVjdXRlUm9sZUluaXRGbkFyZ3VtZW50cyxcbiAgICBJbml0aWFsaXplVGVzdFJ1bkRhdGFBcmd1bWVudHMsXG4gICAgUmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzLFxuICAgIFJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyxcbiAgICBSZXF1ZXN0RmlsdGVyUnVsZUxvY2F0b3IsXG4gICAgUmVxdWVzdEhvb2tFdmVudEFyZ3VtZW50cyxcbiAgICBTZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9uc0FyZ3VtZW50cyxcbiAgICBTZXRDdHhBcmd1bWVudHMsXG4gICAgU2V0TW9ja0FyZ3VtZW50cyxcbiAgICBTZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMsXG4gICAgU2V0T3B0aW9uc0FyZ3VtZW50cyxcbiAgICBUZXN0UnVuTG9jYXRvcixcbiAgICBVcGRhdGVSb2xlUHJvcGVydHlBcmd1bWVudHMsXG4gICAgRXhlY3V0ZUpzRXhwcmVzc2lvbkFyZ3VtZW50cyxcbiAgICBFeGVjdXRlQXN5bmNKc0V4cHJlc3Npb25Bcmd1bWVudHMsXG4gICAgQ29tbWFuZExvY2F0b3IsXG4gICAgQWRkVW5leHBlY3RlZEVycm9yQXJndW1lbnRzLFxuICAgIENoZWNrV2luZG93QXJndW1lbnQsXG4gICAgUmVtb3ZlRml4dHVyZUN0eHNBcmd1bWVudHMsXG4gICAgUmVtb3ZlVW5pdHNGcm9tU3RhdGVBcmd1bWVudHMsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IFVuY2F1Z2h0RXhjZXB0aW9uRXJyb3IsIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycy90ZXN0LXJ1bic7XG5pbXBvcnQgeyBoYW5kbGVVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9oYW5kbGUtZXJyb3JzJztcbmltcG9ydCB7IFY4X0RFQlVHX0ZMQUdTIH0gZnJvbSAnLi4vLi4vY2xpL25vZGUtYXJndW1lbnRzLWZpbHRlcic7XG5pbXBvcnQgeyBXYXJuaW5nTG9nTWVzc2FnZSB9IGZyb20gJy4uLy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuXG5jb25zdCBTRVJWSUNFX1BBVEggICAgICAgPSByZXF1aXJlLnJlc29sdmUoJy4vc2VydmljZS1sb2FkZXInKTtcbmNvbnN0IElOVEVSTkFMX0ZJTEVTX1VSTCA9IHBhdGhUb0ZpbGVVUkwocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uLycpKTtcblxuY29uc3QgSU5TUEVDVF9SRSAgICAgID0gbmV3IFJlZ0V4cChgXigke1Y4X0RFQlVHX0ZMQUdTLmpvaW4oJ3wnKX0pYCk7XG5jb25zdCBJTlNQRUNUX1BPUlRfUkUgPSBuZXcgUmVnRXhwKGBeKCR7VjhfREVCVUdfRkxBR1Muam9pbignfCcpfSk9KC4rOik/KFxcXFxkKykkYCk7XG5cbmludGVyZmFjZSBSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBzZXJ2aWNlOiBDaGlsZFByb2Nlc3M7XG4gICAgcHJveHk6IElQQ1Byb3h5O1xufVxuXG5pbnRlcmZhY2UgVGVzdEZ1bmN0aW9uIHtcbiAgICAodGVzdFJ1bjogVGVzdFJ1bik6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSB7XG4gICAgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmludGVyZmFjZSBXcmFwTW9ja1ByZWRpY2F0ZUFyZ3VtZW50cyBleHRlbmRzIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvciB7XG4gICAgbW9jazogUmVzcG9uc2VNb2NrO1xufVxuXG5jb25zdCBJTklUSUFMX0RFQlVHR0VSX0JSRUFLX09OX1NUQVJUID0gJ0JyZWFrIG9uIHN0YXJ0JztcblxuY29uc3QgZXJyb3JUeXBlQ29uc3RydWN0b3JzID0gbmV3IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPihbXG4gICAgW1VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25FcnJvci5uYW1lLCBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uRXJyb3JdLFxuICAgIFtVbmNhdWdodEV4Y2VwdGlvbkVycm9yLm5hbWUsIFVuY2F1Z2h0RXhjZXB0aW9uRXJyb3JdLFxuXSk7XG5cbmludGVyZmFjZSBDb21waWxlckhvc3RJbml0T3B0aW9ucyB7XG4gICAgZGV2ZWxvcG1lbnRNb2RlOiBib29sZWFuO1xuICAgIHY4RmxhZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21waWxlckhvc3QgZXh0ZW5kcyBBc3luY0V2ZW50RW1pdHRlciBpbXBsZW1lbnRzIENvbXBpbGVyUHJvdG9jb2wge1xuICAgIHByaXZhdGUgcnVudGltZTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzfHVuZGVmaW5lZD47XG4gICAgcHJpdmF0ZSBjZHA6IGNkcC5Qcm90b2NvbEFwaSAmIEV2ZW50RW1pdHRlciB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRldmVsb3BtZW50TW9kZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHY4RmxhZ3M6IHN0cmluZ1tdO1xuICAgIHB1YmxpYyBpbml0aWFsaXplZDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyBkZXZlbG9wbWVudE1vZGUsIHY4RmxhZ3MgfTogQ29tcGlsZXJIb3N0SW5pdE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJ1bnRpbWUgICAgICAgICA9IFByb21pc2UucmVzb2x2ZSh2b2lkIDApO1xuICAgICAgICB0aGlzLmRldmVsb3BtZW50TW9kZSA9IGRldmVsb3BtZW50TW9kZTtcbiAgICAgICAgdGhpcy52OEZsYWdzICAgICAgICAgPSB2OEZsYWdzO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkICAgICA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldHVwUm91dGVzIChwcm94eTogSVBDUHJveHkpOiB2b2lkIHtcbiAgICAgICAgcHJveHkucmVnaXN0ZXIoW1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZCxcbiAgICAgICAgICAgIHRoaXMucmVhZHksXG4gICAgICAgICAgICB0aGlzLm9uUmVxdWVzdEhvb2tFdmVudCxcbiAgICAgICAgICAgIHRoaXMuc2V0TW9jayxcbiAgICAgICAgICAgIHRoaXMuc2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMsXG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVNb2NrUHJlZGljYXRlLFxuICAgICAgICAgICAgdGhpcy5nZXRXYXJuaW5nTWVzc2FnZXMsXG4gICAgICAgICAgICB0aGlzLmFkZFJlcXVlc3RFdmVudExpc3RlbmVycyxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzLFxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdFJ1bkRhdGEsXG4gICAgICAgICAgICB0aGlzLmdldEFzc2VydGlvbkFjdHVhbFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlUm9sZUluaXRGbixcbiAgICAgICAgICAgIHRoaXMuZ2V0Q3R4LFxuICAgICAgICAgICAgdGhpcy5nZXRGaXh0dXJlQ3R4LFxuICAgICAgICAgICAgdGhpcy5zZXRDdHgsXG4gICAgICAgICAgICB0aGlzLnNldEZpeHR1cmVDdHgsXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJvbGVQcm9wZXJ0eSxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUpzRXhwcmVzc2lvbixcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlQXNzZXJ0aW9uRm4sXG4gICAgICAgICAgICB0aGlzLmFkZFVuZXhwZWN0ZWRFcnJvcixcbiAgICAgICAgICAgIHRoaXMuY2hlY2tXaW5kb3csXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRlc3RSdW5Gcm9tU3RhdGUsXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpeHR1cmVDdHhzRnJvbVN0YXRlLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVbml0c0Zyb21TdGF0ZSxcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0dXBEZWJ1Z2dlckhhbmRsZXJzICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNkcClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0ZXN0UnVuVHJhY2tlci5vbihERUJVR19BQ1RJT04ucmVzdW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2RwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgZGlzYWJsZURlYnVnTWV0aG9kTmFtZSA9IFRlc3RDb250cm9sbGVyLmRpc2FibGVEZWJ1Z0Zvck5vbkRlYnVnQ29tbWFuZHMubmFtZTtcblxuICAgICAgICAgICAgLy8gTk9URTogZGlzYWJsZSBgZGVidWdnZXJgIGZvciBub24tZGVidWcgY29tbWFuZHMgaWYgdGhlIGBSZXN1bWVgIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICAgICAgICAvLyB0aGUgYGluY2x1ZGVDb21tYW5kTGluZUFQSWAgb3B0aW9uIGFsbG93cyB0byB1c2UgdGhlIGByZXF1aXJlYCBmdW5jdG9pb24gaW4gdGhlIGV4cHJlc3Npb25cbiAgICAgICAgICAgIC8vIFRPRE86IGRlYnVnZ2luZzogcmVmYWN0b3IgdG8gdXNlIGFic29sdXRlIHBhdGhzXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkcC5SdW50aW1lLmV2YWx1YXRlKHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiAgICAgICAgICAgIGByZXF1aXJlLm1haW4ucmVxdWlyZSgnLi4vLi4vYXBpL3Rlc3QtY29udHJvbGxlcicpLiR7ZGlzYWJsZURlYnVnTWV0aG9kTmFtZX0oKWAsXG4gICAgICAgICAgICAgICAgaW5jbHVkZUNvbW1hbmRMaW5lQVBJOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2RwLkRlYnVnZ2VyLnJlc3VtZSh7IHRlcm1pbmF0ZU9uUmVzdW1lOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGVzdFJ1blRyYWNrZXIub24oREVCVUdfQUNUSU9OLnN0ZXAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jZHApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBlbmFibGVEZWJ1Z01ldGhvZE5hbWUgPSBUZXN0Q29udHJvbGxlci5lbmFibGVEZWJ1Z0Zvck5vbkRlYnVnQ29tbWFuZHMubmFtZTtcblxuICAgICAgICAgICAgLy8gTk9URTogZW5hYmxlIGBkZWJ1Z2dlcmAgZm9yIG5vbi1kZWJ1ZyBjb21tYW5kcyBpbiB0aGUgYE5leHQgQWN0aW9uYCBidXR0b24gaXMgY2xpY2tlZFxuICAgICAgICAgICAgLy8gdGhlIGBpbmNsdWRlQ29tbWFuZExpbmVBUElgIG9wdGlvbiBhbGxvd3MgdG8gdXNlIHRoZSBgcmVxdWlyZWAgZnVuY3RvaW9uIGluIHRoZSBleHByZXNzaW9uXG4gICAgICAgICAgICAvLyBUT0RPOiBkZWJ1Z2dpbmc6IHJlZmFjdG9yIHRvIHVzZSBhYnNvbHV0ZSBwYXRoc1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHAuUnVudGltZS5ldmFsdWF0ZSh7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogICAgICAgICAgICBgcmVxdWlyZS5tYWluLnJlcXVpcmUoJy4uLy4uL2FwaS90ZXN0LWNvbnRyb2xsZXInKS4ke2VuYWJsZURlYnVnTWV0aG9kTmFtZX0oKWAsXG4gICAgICAgICAgICAgICAgaW5jbHVkZUNvbW1hbmRMaW5lQVBJOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2RwLkRlYnVnZ2VyLnJlc3VtZSh7IHRlcm1pbmF0ZU9uUmVzdW1lOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTk9URTogbmVlZCB0byBzdGVwIG91dCBmcm9tIHRoZSBzb3VyY2UgY29kZSB1bnRpbCBicmVha3BvaW50IGlzIHNldCBpbiB0aGUgY29kZSBvZiB0ZXN0XG4gICAgICAgIC8vIGZvcmNlIERlYnVnQ29tbWFuZCBpZiBicmVha3BvaW50IHN0b3BwZWQgaW4gdGhlIHRlc3QgY29kZVxuICAgICAgICAvLyBUT0RPOiBkZWJ1Z2dpbmc6IHJlZmFjdG9yIHRvIHRoaXMuY2RwLkRlYnVnZ2VyLm9uKCdwYXVzZWQnKSBhZnRlciB1cGRhdGluZyB0byBjaHJvbWUtcmVtb3RlLWludGVyZmFjZUAwLjMwLjBcbiAgICAgICAgdGhpcy5jZHAub24oJ0RlYnVnZ2VyLnBhdXNlZCcsIChhcmdzOiBhbnkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbEZyYW1lcyB9ID0gYXJncztcblxuICAgICAgICAgICAgaWYgKHRoaXMuY2RwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MucmVhc29uID09PSBJTklUSUFMX0RFQlVHR0VSX0JSRUFLX09OX1NUQVJUKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jZHAuRGVidWdnZXIucmVzdW1lKHsgdGVybWluYXRlT25SZXN1bWU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxGcmFtZXNbMF0udXJsLmluY2x1ZGVzKElOVEVSTkFMX0ZJTEVTX1VSTCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNkcC5EZWJ1Z2dlci5zdGVwT3V0KCk7XG5cbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHRlc3RSdW5UcmFja2VyLmFjdGl2ZVRlc3RSdW5zKS5mb3JFYWNoKHRlc3RSdW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlc3RSdW4uZGVidWdnaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bi5leGVjdXRlQ29tbWFuZChuZXcgRGVidWdDb21tYW5kKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5PVEU6IG5lZWQgdG8gaGlkZSBTdGF0dXMgQmFyIGlmIGRlYnVnZ2VyIGlzIHJlc3VtZWRcbiAgICAgICAgLy8gVE9ETzogZGVidWdnaW5nOiByZWZhY3RvciB0byB0aGlzLmNkcC5EZWJ1Z2dlci5vbigncmVzdW1lZCcpIGFmdGVyIHVwZGF0aW5nIHRvIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlQDAuMzAuMFxuICAgICAgICB0aGlzLmNkcC5vbignRGVidWdnZXIucmVzdW1lZCcsICgpID0+IHtcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnMpLmZvckVhY2godGVzdFJ1biA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RSdW4uZGVidWdnaW5nKVxuICAgICAgICAgICAgICAgICAgICB0ZXN0UnVuLmV4ZWN1dGVDb21tYW5kKG5ldyBEaXNhYmxlRGVidWdDb21tYW5kKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWJ1Z1BvcnQgKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy52OEZsYWdzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudjhGbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy52OEZsYWdzW2ldLm1hdGNoKElOU1BFQ1RfUE9SVF9SRSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNlcnZpY2VQcm9jZXNzQXJncyAocG9ydDogc3RyaW5nKTogc3RyaW5nIFtdIHtcbiAgICAgICAgbGV0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMudjhGbGFncylcbiAgICAgICAgICAgIGFyZ3MgPSB0aGlzLnY4RmxhZ3MuZmlsdGVyKGZsYWcgPT4gIUlOU1BFQ1RfUkUudGVzdChmbGFnKSk7XG5cbiAgICAgICAgLy8gVE9ETzogZGVidWdnaW5nOiByZWZhY3RvciB0byBhIHNlcGFyYXRlIGRlYnVnIGluZm8gcGFyc2luZyB1bml0XG4gICAgICAgIGNvbnN0IGluc3BlY3RCcmtGbGFnID0gYC0taW5zcGVjdC1icms9MTI3LjAuMC4xOiR7cG9ydH1gO1xuXG4gICAgICAgIGFyZ3MucHVzaChpbnNwZWN0QnJrRmxhZywgU0VSVklDRV9QQVRIKTtcblxuICAgICAgICByZXR1cm4gYXJncztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9pbml0IChydW50aW1lOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXN8dW5kZWZpbmVkPik6IFByb21pc2U8UnVudGltZVJlc291cmNlc3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSdW50aW1lID0gYXdhaXQgcnVudGltZTtcblxuICAgICAgICBpZiAocmVzb2x2ZWRSdW50aW1lKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkUnVudGltZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcG9ydCAgICA9IHRoaXMucGFyc2VEZWJ1Z1BvcnQoKSB8fCBhd2FpdCBnZXRGcmVlUG9ydCgpO1xuICAgICAgICAgICAgY29uc3QgYXJncyAgICA9IHRoaXMuX2dldFNlcnZpY2VQcm9jZXNzQXJncyhwb3J0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHNwYXduKHByb2Nlc3MuYXJndjAsIGFyZ3MsIHsgc3RkaW86IFswLCAxLCAyLCAncGlwZScsICdwaXBlJywgJ3BpcGUnXSB9KTtcblxuICAgICAgICAgICAgLy8gTk9URTogbmVlZCB0byB3YWl0LCBvdGhlcndpc2UgdGhlIGVycm9yIHdpbGwgYmUgYXQgYGF3YWl0IGNkcCguLi4pYFxuICAgICAgICAgICAgLy8gVE9ETzogZGVidWdnaW5nOiByZWZhY3RvciB0byB1c2UgZGVsYXkgYW5kIG11bHRpcGxlIHRyaWVzXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjAwMCkpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmNkcCA9IGF3YWl0IGNkcCh7IHBvcnQgfSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jZHApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmRldmVsb3BtZW50TW9kZSlcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR1cERlYnVnZ2VySGFuZGxlcnMoKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHAuRGVidWdnZXIuZW5hYmxlKHt9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2RwLlJ1bnRpbWUuZW5hYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkcC5SdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7XG5cbiAgICAgICAgICAgIC8vIEhBQ0s6IE5vZGUuanMgZGVmaW5pdGlvbiBhcmUgbm90IGNvcnJlY3Qgd2hlbiBhZGRpdGlvbmFsIEkvTyBjaGFubmVscyBhcmUgc3BcbiAgICAgICAgICAgIGNvbnN0IHN0ZGlvID0gc2VydmljZS5zdGRpbyBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBJUENQcm94eShuZXcgSG9zdFRyYW5zcG9ydChzdGRpb1tIT1NUX0lOUFVUX0ZEXSwgc3RkaW9bSE9TVF9PVVRQVVRfRkRdLCBzdGRpb1tIT1NUX1NZTkNfRkRdKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3NldHVwUm91dGVzKHByb3h5KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmNlKCdyZWFkeScpO1xuXG4gICAgICAgICAgICByZXR1cm4geyBwcm94eSwgc2VydmljZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0UnVudGltZSAoKTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzPiB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBhd2FpdCB0aGlzLnJ1bnRpbWU7XG5cbiAgICAgICAgaWYgKCFydW50aW1lKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0VGFyZ2V0VGVzdFJ1biAoaWQ6IHN0cmluZyk6IFRlc3RSdW4ge1xuICAgICAgICByZXR1cm4gdGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnNbaWRdIGFzIHVua25vd24gYXMgVGVzdFJ1bjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucnVudGltZSA9IHRoaXMuX2luaXQodGhpcy5ydW50aW1lKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJ1bnRpbWU7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0b3AgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgeyBzZXJ2aWNlLCBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHNlcnZpY2Uua2lsbCgpO1xuICAgICAgICBwcm94eS5zdG9wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcFRlc3RGdW5jdGlvbiAoaWQ6IHN0cmluZywgZnVuY3Rpb25OYW1lOiBGdW5jdGlvblByb3BlcnRpZXMpOiBUZXN0RnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gYXN5bmMgdGVzdFJ1biA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blRlc3RGbih7IGlkLCBmdW5jdGlvbk5hbWUsIHRlc3RSdW5JZDogdGVzdFJ1bi5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJMaXN0ID0gbmV3IFRlc3RDYWZlRXJyb3JMaXN0KCk7XG5cbiAgICAgICAgICAgICAgICBlcnJMaXN0LmFkZEVycm9yKGVycik7XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJMaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkIH06IFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcik6IFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0SW5mbzogUmVxdWVzdEluZm8pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBNb2NrUHJlZGljYXRlICh7IG1vY2ssIHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfTogV3JhcE1vY2tQcmVkaWNhdGVBcmd1bWVudHMpOiB2b2lkIHtcbiAgICAgICAgbW9jay5ib2R5ID0gYXN5bmMgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbywgcmVzOiBJbmNvbWluZ01lc3NhZ2VMaWtlSW5pdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVNb2NrUHJlZGljYXRlKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8sIHJlcyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRFcnJvclR5cGVDb25zdHJ1Y3RvciAodHlwZTogc3RyaW5nKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gZXJyb3JUeXBlQ29uc3RydWN0b3JzLmdldCh0eXBlKSBhcyBGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZHkgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVtaXQoJ3JlYWR5Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGV4ZWN1dGVDb21tYW5kU3luYyAoKTogbmV2ZXIge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kU2hvdWxkTm90QmVDYWxsZWRFcnJvcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoeyBjb21tYW5kLCBpZCwgY2FsbHNpdGUgfTogRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5fZ2V0VGFyZ2V0VGVzdFJ1bihpZClcbiAgICAgICAgICAgIC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFRlc3RzICh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfTogQ29tcGlsZXJBcmd1bWVudHMsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgY29uc3QgdW5pdHMgPSBhd2FpdCBwcm94eS5jYWxsKHRoaXMuZ2V0VGVzdHMsIHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9LCBiYXNlVXJsKTtcblxuICAgICAgICByZXR1cm4gcmVzdG9yZVRlc3RTdHJ1Y3R1cmUoXG4gICAgICAgICAgICB1bml0cyxcbiAgICAgICAgICAgICguLi5hcmdzKSA9PiB0aGlzLl93cmFwVGVzdEZ1bmN0aW9uKC4uLmFyZ3MpLFxuICAgICAgICAgICAgKHJ1bGVMb2NhdG9yOiBSZXF1ZXN0RmlsdGVyUnVsZUxvY2F0b3IpID0+IHRoaXMuX3dyYXBSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZShydWxlTG9jYXRvcilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuVGVzdEZuICh7IGlkLCBmdW5jdGlvbk5hbWUsIHRlc3RSdW5JZCB9OiBSdW5UZXN0QXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgcHJveHkuY2FsbCh0aGlzLnJ1blRlc3RGbiwgeyBpZCwgZnVuY3Rpb25OYW1lLCB0ZXN0UnVuSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFuVXAgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLmNsZWFuVXApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRVc2VyVmFyaWFibGVzICh1c2VyVmFyaWFibGVzOiBVc2VyVmFyaWFibGVzIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLnNldFVzZXJWYXJpYWJsZXMsIHVzZXJWYXJpYWJsZXMpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGFzeW5jIHNldE9wdGlvbnMgKHsgdmFsdWUgfTogU2V0T3B0aW9uc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgY29uc3QgcHJlcGFyZWRPcHRpb25zID0gcHJlcGFyZU9wdGlvbnModmFsdWUpO1xuXG4gICAgICAgIGF3YWl0IHByb3h5LmNhbGwodGhpcy5zZXRPcHRpb25zLCB7IHZhbHVlOiBwcmVwYXJlZE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmVxdWVzdEhvb2tFdmVudCAoeyBuYW1lLCB0ZXN0SWQsIGhvb2tJZCwgZXZlbnREYXRhIH06IFJlcXVlc3RIb29rRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIGF3YWl0IHByb3h5LmNhbGwodGhpcy5vblJlcXVlc3RIb29rRXZlbnQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXN0SWQsXG4gICAgICAgICAgICBob29rSWQsXG4gICAgICAgICAgICBldmVudERhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRNb2NrICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlc3BvbnNlRXZlbnRJZCwgbW9jayB9OiBTZXRNb2NrQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChtb2NrLmlzUHJlZGljYXRlKVxuICAgICAgICAgICAgdGhpcy5fd3JhcE1vY2tQcmVkaWNhdGUoeyBtb2NrLCB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2V0TW9jaycsIFtyZXNwb25zZUV2ZW50SWQsIG1vY2tdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMgKHsgZXZlbnRJZCwgb3B0cyB9OiBTZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9uc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zJywgW2V2ZW50SWQsIG9wdHNdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50ICh7IGV2ZW50SWQsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlIH06IFNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsIFtldmVudElkLCBoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQgKHsgZXZlbnRJZCwgaGVhZGVyTmFtZSB9OiBSZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdyZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQnLCBbZXZlbnRJZCwgaGVhZGVyTmFtZV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUgKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8gfTogRXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlQXJndW1lbnRzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgcHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSwgeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZU1vY2tQcmVkaWNhdGUgKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8sIHJlcyB9OiBFeGVjdXRlTW9ja1ByZWRpY2F0ZSk6IFByb21pc2U8SW5jb21pbmdNZXNzYWdlTGlrZUluaXRPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgcHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVNb2NrUHJlZGljYXRlLCB7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvLCByZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFdhcm5pbmdNZXNzYWdlcyAoeyB0ZXN0UnVuSWQgfTogVGVzdFJ1bkxvY2F0b3IpOiBQcm9taXNlPFdhcm5pbmdMb2dNZXNzYWdlW10+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZ2V0V2FybmluZ01lc3NhZ2VzLCB7IHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzICggeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH06IEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2FkZFJlcXVlc3RFdmVudExpc3RlbmVycycsIHsgaG9va0lkLCBob29rQ2xhc3NOYW1lLCBydWxlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzICh7IHJ1bGVzIH06IFJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3JlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycycsIHsgcnVsZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVUZXN0UnVuRGF0YSAoeyB0ZXN0UnVuSWQsIHRlc3RJZCwgYnJvd3NlciwgYWN0aXZlV2luZG93SWQsIG1lc3NhZ2VCdXMgfTogSW5pdGlhbGl6ZVRlc3RSdW5EYXRhQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmluaXRpYWxpemVUZXN0UnVuRGF0YSwgeyB0ZXN0UnVuSWQsIHRlc3RJZCwgYnJvd3NlciwgYWN0aXZlV2luZG93SWQsIG1lc3NhZ2VCdXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEFzc2VydGlvbkFjdHVhbFZhbHVlICh7IHRlc3RSdW5JZCwgY29tbWFuZElkIH06IENvbW1hbmRMb2NhdG9yKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmdldEFzc2VydGlvbkFjdHVhbFZhbHVlLCB7IHRlc3RSdW5JZCwgY29tbWFuZElkOiBjb21tYW5kSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVSb2xlSW5pdEZuICh7IHRlc3RSdW5JZCwgcm9sZUlkIH06IEV4ZWN1dGVSb2xlSW5pdEZuQXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVSb2xlSW5pdEZuLCB7IHRlc3RSdW5JZCwgcm9sZUlkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDdHggKHsgdGVzdFJ1bklkIH06IFRlc3RSdW5Mb2NhdG9yKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZ2V0Q3R4LCB7IHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Rml4dHVyZUN0eCAoeyB0ZXN0UnVuSWQgfTogVGVzdFJ1bkxvY2F0b3IpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5nZXRGaXh0dXJlQ3R4LCB7IHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0Q3R4ICh7IHRlc3RSdW5JZCwgdmFsdWUgfTogU2V0Q3R4QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLnNldEN0eCwgeyB0ZXN0UnVuSWQsIHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRGaXh0dXJlQ3R4ICh7IHRlc3RSdW5JZCwgdmFsdWUgfTogU2V0Q3R4QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLnNldEZpeHR1cmVDdHgsIHsgdGVzdFJ1bklkLCB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Sb2xlQXBwZWFyZWQgKCk6IHZvaWQge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kU2hvdWxkTm90QmVDYWxsZWRFcnJvcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVSb2xlUHJvcGVydHkgKHsgcm9sZUlkLCBuYW1lLCB2YWx1ZSB9OiBVcGRhdGVSb2xlUHJvcGVydHlBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMudXBkYXRlUm9sZVByb3BlcnR5LCB7IHJvbGVJZCwgbmFtZSwgdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVKc0V4cHJlc3Npb24gKHsgZXhwcmVzc2lvbiwgdGVzdFJ1bklkLCBvcHRpb25zIH06IEV4ZWN1dGVKc0V4cHJlc3Npb25Bcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZUpzRXhwcmVzc2lvbiwgeyBleHByZXNzaW9uLCB0ZXN0UnVuSWQsIG9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiAoeyBleHByZXNzaW9uLCB0ZXN0UnVuSWQsIGNhbGxzaXRlIH06IEV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbkFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24sIHsgZXhwcmVzc2lvbiwgdGVzdFJ1bklkLCBjYWxsc2l0ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUFzc2VydGlvbkZuICh7IHRlc3RSdW5JZCwgY29tbWFuZElkIH06IENvbW1hbmRMb2NhdG9yKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVBc3NlcnRpb25GbiwgeyB0ZXN0UnVuSWQsIGNvbW1hbmRJZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkVW5leHBlY3RlZEVycm9yICh7IHR5cGUsIG1lc3NhZ2UgfTogQWRkVW5leHBlY3RlZEVycm9yQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IEVycm9yVHlwZUNvbnN0cnVjdG9yID0gdGhpcy5fZ2V0RXJyb3JUeXBlQ29uc3RydWN0b3IodHlwZSk7XG5cbiAgICAgICAgaGFuZGxlVW5leHBlY3RlZEVycm9yKEVycm9yVHlwZUNvbnN0cnVjdG9yLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2hlY2tXaW5kb3cgKHsgdGVzdFJ1bklkLCBjb21tYW5kSWQsIHVybCwgdGl0bGUgfTogQ2hlY2tXaW5kb3dBcmd1bWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5jaGVja1dpbmRvdywgeyB0ZXN0UnVuSWQsIGNvbW1hbmRJZCwgdXJsLCB0aXRsZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlVGVzdFJ1bkZyb21TdGF0ZSAoeyB0ZXN0UnVuSWQgfTogVGVzdFJ1bkxvY2F0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMucmVtb3ZlVGVzdFJ1bkZyb21TdGF0ZSwgeyB0ZXN0UnVuSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUZpeHR1cmVDdHhzRnJvbVN0YXRlICh7IGZpeHR1cmVJZHMgfTogUmVtb3ZlRml4dHVyZUN0eHNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMucmVtb3ZlRml4dHVyZUN0eHNGcm9tU3RhdGUsIHsgZml4dHVyZUlkcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlVW5pdHNGcm9tU3RhdGUgKHsgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfTogUmVtb3ZlVW5pdHNGcm9tU3RhdGVBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMucmVtb3ZlVW5pdHNGcm9tU3RhdGUsIHsgcnVubmFibGVDb25maWd1cmF0aW9uSWQgfSk7XG4gICAgfVxufVxuIl19
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDZCQUFvQztBQUNwQyxzRkFBMEM7QUFFMUMsaURBQW9EO0FBQ3BELG1EQUE2QztBQUU3Qyw2QkFJYztBQUVkLG9FQUFrRjtBQUNsRix1RkFBOEQ7QUFDOUQsa0ZBQXVFO0FBQ3ZFLGdGQUF1RDtBQUV2RCw4Q0FBOEM7QUFDOUMsc0RBQXVEO0FBQ3ZELDBGQUFnRTtBQUNoRSx5RUFBd0Q7QUFDeEQsNEVBQW9EO0FBaUJwRCxxRUFBd0Y7QUFDeEYsbUhBQXNGO0FBNkJ0RixvREFBK0Y7QUFDL0YsNkRBQWtFO0FBQ2xFLDJFQUFpRTtBQUdqRSxNQUFNLFlBQVksR0FBUyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLG1CQUFhLEVBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLFVBQVUsR0FBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLHNDQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRSxNQUFNLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLHNDQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBbUJuRixNQUFNLCtCQUErQixHQUFHLGdCQUFnQixDQUFDO0FBRXpELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQW1CO0lBQ3BELENBQUMseUNBQThCLENBQUMsSUFBSSxFQUFFLHlDQUE4QixDQUFDO0lBQ3JFLENBQUMsaUNBQXNCLENBQUMsSUFBSSxFQUFFLGlDQUFzQixDQUFDO0NBQ3hELENBQUMsQ0FBQztBQU9ILE1BQXFC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QUFDO1FBRTNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFFLEVBQUUsU0FBUyxFQUFrQjtRQUM5RCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLEtBQUssQ0FBQywwQkFBMEIsQ0FBRSxFQUFFLFVBQVUsRUFBOEI7UUFDL0UsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSxLQUFLLENBQUMsb0JBQW9CLENBQUUsRUFBRSx1QkFBdUIsRUFBaUM7UUFDekYsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNKO0FBM2NELCtCQTJjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgY2RwIGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IHNwYXduLCBDaGlsZFByb2Nlc3MgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGdldEZyZWVQb3J0IH0gZnJvbSAnZW5kcG9pbnQtdXRpbHMnO1xuXG5pbXBvcnQge1xuICAgIEhPU1RfSU5QVVRfRkQsXG4gICAgSE9TVF9PVVRQVVRfRkQsXG4gICAgSE9TVF9TWU5DX0ZELFxufSBmcm9tICcuL2lvJztcblxuaW1wb3J0IHsgcmVzdG9yZSBhcyByZXN0b3JlVGVzdFN0cnVjdHVyZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vdGVzdC1zdHJ1Y3R1cmUnO1xuaW1wb3J0IHByZXBhcmVPcHRpb25zIGZyb20gJy4uL3NlcmlhbGl6YXRpb24vcHJlcGFyZS1vcHRpb25zJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgdGVzdFJ1blRyYWNrZXIgfSBmcm9tICcuLi8uLi9hcGkvdGVzdC1ydW4tdHJhY2tlcic7XG5pbXBvcnQgVGVzdENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vYXBpL3Rlc3QtY29udHJvbGxlcic7XG5pbXBvcnQgVGVzdFJ1biBmcm9tICcuLi8uLi90ZXN0LXJ1bic7XG5pbXBvcnQgeyBJUENQcm94eSB9IGZyb20gJy4uL3V0aWxzL2lwYy9wcm94eSc7XG5pbXBvcnQgeyBIb3N0VHJhbnNwb3J0IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3RyYW5zcG9ydCc7XG5pbXBvcnQgQXN5bmNFdmVudEVtaXR0ZXIgZnJvbSAnLi4vLi4vdXRpbHMvYXN5bmMtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgVGVzdENhZmVFcnJvckxpc3QgZnJvbSAnLi4vLi4vZXJyb3JzL2Vycm9yLWxpc3QnO1xuaW1wb3J0IERFQlVHX0FDVElPTiBmcm9tICcuLi8uLi91dGlscy9kZWJ1Zy1hY3Rpb24nO1xuXG5pbXBvcnQge1xuICAgIENvbXBpbGVyUHJvdG9jb2wsXG4gICAgUnVuVGVzdEFyZ3VtZW50cyxcbiAgICBGdW5jdGlvblByb3BlcnRpZXMsXG59IGZyb20gJy4vcHJvdG9jb2wnO1xuXG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uLy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3QgZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS90ZXN0JztcblxuaW1wb3J0IHtcbiAgICBSZXF1ZXN0SW5mbyxcbiAgICBSZXNwb25zZU1vY2ssXG4gICAgSW5jb21pbmdNZXNzYWdlTGlrZUluaXRPcHRpb25zLFxufSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuaW1wb3J0IHsgRGVidWdDb21tYW5kLCBEaXNhYmxlRGVidWdDb21tYW5kIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvb2JzZXJ2YXRpb24nO1xuaW1wb3J0IE1ldGhvZFNob3VsZE5vdEJlQ2FsbGVkRXJyb3IgZnJvbSAnLi4vdXRpbHMvbWV0aG9kLXNob3VsZC1ub3QtYmUtY2FsbGVkLWVycm9yJztcblxuaW1wb3J0IHtcbiAgICBBZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMsXG4gICAgRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMsXG4gICAgRXhlY3V0ZU1vY2tQcmVkaWNhdGUsXG4gICAgRXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVSb2xlSW5pdEZuQXJndW1lbnRzLFxuICAgIEluaXRpYWxpemVUZXN0UnVuRGF0YUFyZ3VtZW50cyxcbiAgICBSZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMsXG4gICAgUmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzLFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcixcbiAgICBSZXF1ZXN0SG9va0V2ZW50QXJndW1lbnRzLFxuICAgIFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzLFxuICAgIFNldEN0eEFyZ3VtZW50cyxcbiAgICBTZXRNb2NrQXJndW1lbnRzLFxuICAgIFNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyxcbiAgICBTZXRPcHRpb25zQXJndW1lbnRzLFxuICAgIFRlc3RSdW5Mb2NhdG9yLFxuICAgIFVwZGF0ZVJvbGVQcm9wZXJ0eUFyZ3VtZW50cyxcbiAgICBFeGVjdXRlSnNFeHByZXNzaW9uQXJndW1lbnRzLFxuICAgIEV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbkFyZ3VtZW50cyxcbiAgICBDb21tYW5kTG9jYXRvcixcbiAgICBBZGRVbmV4cGVjdGVkRXJyb3JBcmd1bWVudHMsXG4gICAgQ2hlY2tXaW5kb3dBcmd1bWVudCxcbiAgICBSZW1vdmVGaXh0dXJlQ3R4c0FyZ3VtZW50cyxcbiAgICBSZW1vdmVVbml0c0Zyb21TdGF0ZUFyZ3VtZW50cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgVW5jYXVnaHRFeGNlcHRpb25FcnJvciwgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3Rlc3QtcnVuJztcbmltcG9ydCB7IGhhbmRsZVVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2hhbmRsZS1lcnJvcnMnO1xuaW1wb3J0IHsgVjhfREVCVUdfRkxBR1MgfSBmcm9tICcuLi8uLi9jbGkvbm9kZS1hcmd1bWVudHMtZmlsdGVyJztcbmltcG9ydCB7IFdhcm5pbmdMb2dNZXNzYWdlIH0gZnJvbSAnLi4vLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLWxvZyc7XG5cbmNvbnN0IFNFUlZJQ0VfUEFUSCAgICAgICA9IHJlcXVpcmUucmVzb2x2ZSgnLi9zZXJ2aWNlLWxvYWRlcicpO1xuY29uc3QgSU5URVJOQUxfRklMRVNfVVJMID0gcGF0aFRvRmlsZVVSTChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vJykpO1xuXG5jb25zdCBJTlNQRUNUX1JFICAgICAgPSBuZXcgUmVnRXhwKGBeKCR7VjhfREVCVUdfRkxBR1Muam9pbignfCcpfSlgKTtcbmNvbnN0IElOU1BFQ1RfUE9SVF9SRSA9IG5ldyBSZWdFeHAoYF4oJHtWOF9ERUJVR19GTEFHUy5qb2luKCd8Jyl9KT0oLis6KT8oXFxcXGQrKSRgKTtcblxuaW50ZXJmYWNlIFJ1bnRpbWVSZXNvdXJjZXMge1xuICAgIHNlcnZpY2U6IENoaWxkUHJvY2VzcztcbiAgICBwcm94eTogSVBDUHJveHk7XG59XG5cbmludGVyZmFjZSBUZXN0RnVuY3Rpb24ge1xuICAgICh0ZXN0UnVuOiBUZXN0UnVuKTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlIHtcbiAgICAocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuaW50ZXJmYWNlIFdyYXBNb2NrUHJlZGljYXRlQXJndW1lbnRzIGV4dGVuZHMgUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yIHtcbiAgICBtb2NrOiBSZXNwb25zZU1vY2s7XG59XG5cbmNvbnN0IElOSVRJQUxfREVCVUdHRVJfQlJFQUtfT05fU1RBUlQgPSAnQnJlYWsgb24gc3RhcnQnO1xuXG5jb25zdCBlcnJvclR5cGVDb25zdHJ1Y3RvcnMgPSBuZXcgTWFwPHN0cmluZywgRnVuY3Rpb24+KFtcbiAgICBbVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkVycm9yLm5hbWUsIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25FcnJvcl0sXG4gICAgW1VuY2F1Z2h0RXhjZXB0aW9uRXJyb3IubmFtZSwgVW5jYXVnaHRFeGNlcHRpb25FcnJvcl0sXG5dKTtcblxuaW50ZXJmYWNlIENvbXBpbGVySG9zdEluaXRPcHRpb25zIHtcbiAgICBkZXZlbG9wbWVudE1vZGU6IGJvb2xlYW47XG4gICAgdjhGbGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBpbGVySG9zdCBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIGltcGxlbWVudHMgQ29tcGlsZXJQcm90b2NvbCB7XG4gICAgcHJpdmF0ZSBydW50aW1lOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXN8dW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGNkcDogY2RwLlByb3RvY29sQXBpICYgRXZlbnRFbWl0dGVyIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV2ZWxvcG1lbnRNb2RlOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdjhGbGFnczogc3RyaW5nW107XG4gICAgcHVibGljIGluaXRpYWxpemVkOiBib29sZWFuO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh7IGRldmVsb3BtZW50TW9kZSwgdjhGbGFncyB9OiBDb21waWxlckhvc3RJbml0T3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucnVudGltZSAgICAgICAgID0gUHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7XG4gICAgICAgIHRoaXMuZGV2ZWxvcG1lbnRNb2RlID0gZGV2ZWxvcG1lbnRNb2RlO1xuICAgICAgICB0aGlzLnY4RmxhZ3MgICAgICAgICA9IHY4RmxhZ3M7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgICAgID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0dXBSb3V0ZXMgKHByb3h5OiBJUENQcm94eSk6IHZvaWQge1xuICAgICAgICBwcm94eS5yZWdpc3RlcihbXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVDb21tYW5kLFxuICAgICAgICAgICAgdGhpcy5yZWFkeSxcbiAgICAgICAgICAgIHRoaXMub25SZXF1ZXN0SG9va0V2ZW50LFxuICAgICAgICAgICAgdGhpcy5zZXRNb2NrLFxuICAgICAgICAgICAgdGhpcy5zZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUsXG4gICAgICAgICAgICB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcyxcbiAgICAgICAgICAgIHRoaXMuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMsXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0UnVuRGF0YSxcbiAgICAgICAgICAgIHRoaXMuZ2V0QXNzZXJ0aW9uQWN0dWFsVmFsdWUsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVSb2xlSW5pdEZuLFxuICAgICAgICAgICAgdGhpcy5nZXRDdHgsXG4gICAgICAgICAgICB0aGlzLmdldEZpeHR1cmVDdHgsXG4gICAgICAgICAgICB0aGlzLnNldEN0eCxcbiAgICAgICAgICAgIHRoaXMuc2V0Rml4dHVyZUN0eCxcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZVByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlSnNFeHByZXNzaW9uLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24sXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVBc3NlcnRpb25GbixcbiAgICAgICAgICAgIHRoaXMuYWRkVW5leHBlY3RlZEVycm9yLFxuICAgICAgICAgICAgdGhpcy5jaGVja1dpbmRvdyxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVzdFJ1bkZyb21TdGF0ZSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRml4dHVyZUN0eHNGcm9tU3RhdGUsXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVuaXRzRnJvbVN0YXRlLFxuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXR1cERlYnVnZ2VySGFuZGxlcnMgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2RwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLm9uKERFQlVHX0FDVElPTi5yZXN1bWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jZHApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlRGVidWdNZXRob2ROYW1lID0gVGVzdENvbnRyb2xsZXIuZGlzYWJsZURlYnVnRm9yTm9uRGVidWdDb21tYW5kcy5uYW1lO1xuXG4gICAgICAgICAgICAvLyBOT1RFOiBkaXNhYmxlIGBkZWJ1Z2dlcmAgZm9yIG5vbi1kZWJ1ZyBjb21tYW5kcyBpZiB0aGUgYFJlc3VtZWAgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgICAgICAgIC8vIHRoZSBgaW5jbHVkZUNvbW1hbmRMaW5lQVBJYCBvcHRpb24gYWxsb3dzIHRvIHVzZSB0aGUgYHJlcXVpcmVgIGZ1bmN0b2lvbiBpbiB0aGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgLy8gVE9ETzogZGVidWdnaW5nOiByZWZhY3RvciB0byB1c2UgYWJzb2x1dGUgcGF0aHNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2RwLlJ1bnRpbWUuZXZhbHVhdGUoe1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246ICAgICAgICAgICAgYHJlcXVpcmUubWFpbi5yZXF1aXJlKCcuLi8uLi9hcGkvdGVzdC1jb250cm9sbGVyJykuJHtkaXNhYmxlRGVidWdNZXRob2ROYW1lfSgpYCxcbiAgICAgICAgICAgICAgICBpbmNsdWRlQ29tbWFuZExpbmVBUEk6IHRydWUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHAuRGVidWdnZXIucmVzdW1lKHsgdGVybWluYXRlT25SZXN1bWU6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0ZXN0UnVuVHJhY2tlci5vbihERUJVR19BQ1RJT04uc3RlcCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNkcClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZURlYnVnTWV0aG9kTmFtZSA9IFRlc3RDb250cm9sbGVyLmVuYWJsZURlYnVnRm9yTm9uRGVidWdDb21tYW5kcy5uYW1lO1xuXG4gICAgICAgICAgICAvLyBOT1RFOiBlbmFibGUgYGRlYnVnZ2VyYCBmb3Igbm9uLWRlYnVnIGNvbW1hbmRzIGluIHRoZSBgTmV4dCBBY3Rpb25gIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICAgICAgICAvLyB0aGUgYGluY2x1ZGVDb21tYW5kTGluZUFQSWAgb3B0aW9uIGFsbG93cyB0byB1c2UgdGhlIGByZXF1aXJlYCBmdW5jdG9pb24gaW4gdGhlIGV4cHJlc3Npb25cbiAgICAgICAgICAgIC8vIFRPRE86IGRlYnVnZ2luZzogcmVmYWN0b3IgdG8gdXNlIGFic29sdXRlIHBhdGhzXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkcC5SdW50aW1lLmV2YWx1YXRlKHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiAgICAgICAgICAgIGByZXF1aXJlLm1haW4ucmVxdWlyZSgnLi4vLi4vYXBpL3Rlc3QtY29udHJvbGxlcicpLiR7ZW5hYmxlRGVidWdNZXRob2ROYW1lfSgpYCxcbiAgICAgICAgICAgICAgICBpbmNsdWRlQ29tbWFuZExpbmVBUEk6IHRydWUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHAuRGVidWdnZXIucmVzdW1lKHsgdGVybWluYXRlT25SZXN1bWU6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOT1RFOiBuZWVkIHRvIHN0ZXAgb3V0IGZyb20gdGhlIHNvdXJjZSBjb2RlIHVudGlsIGJyZWFrcG9pbnQgaXMgc2V0IGluIHRoZSBjb2RlIG9mIHRlc3RcbiAgICAgICAgLy8gZm9yY2UgRGVidWdDb21tYW5kIGlmIGJyZWFrcG9pbnQgc3RvcHBlZCBpbiB0aGUgdGVzdCBjb2RlXG4gICAgICAgIC8vIFRPRE86IGRlYnVnZ2luZzogcmVmYWN0b3IgdG8gdGhpcy5jZHAuRGVidWdnZXIub24oJ3BhdXNlZCcpIGFmdGVyIHVwZGF0aW5nIHRvIGNocm9tZS1yZW1vdGUtaW50ZXJmYWNlQDAuMzAuMFxuICAgICAgICB0aGlzLmNkcC5vbignRGVidWdnZXIucGF1c2VkJywgKGFyZ3M6IGFueSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsRnJhbWVzIH0gPSBhcmdzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jZHApIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5yZWFzb24gPT09IElOSVRJQUxfREVCVUdHRVJfQlJFQUtfT05fU1RBUlQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNkcC5EZWJ1Z2dlci5yZXN1bWUoeyB0ZXJtaW5hdGVPblJlc3VtZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FsbEZyYW1lc1swXS51cmwuaW5jbHVkZXMoSU5URVJOQUxfRklMRVNfVVJMKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2RwLkRlYnVnZ2VyLnN0ZXBPdXQoKTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnMpLmZvckVhY2godGVzdFJ1biA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGVzdFJ1bi5kZWJ1Z2dpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVuLmV4ZWN1dGVDb21tYW5kKG5ldyBEZWJ1Z0NvbW1hbmQoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTk9URTogbmVlZCB0byBoaWRlIFN0YXR1cyBCYXIgaWYgZGVidWdnZXIgaXMgcmVzdW1lZFxuICAgICAgICAvLyBUT0RPOiBkZWJ1Z2dpbmc6IHJlZmFjdG9yIHRvIHRoaXMuY2RwLkRlYnVnZ2VyLm9uKCdyZXN1bWVkJykgYWZ0ZXIgdXBkYXRpbmcgdG8gY2hyb21lLXJlbW90ZS1pbnRlcmZhY2VAMC4zMC4wXG4gICAgICAgIHRoaXMuY2RwLm9uKCdEZWJ1Z2dlci5yZXN1bWVkJywgKCkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0ZXN0UnVuVHJhY2tlci5hY3RpdmVUZXN0UnVucykuZm9yRWFjaCh0ZXN0UnVuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGVzdFJ1bi5kZWJ1Z2dpbmcpXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQobmV3IERpc2FibGVEZWJ1Z0NvbW1hbmQoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZURlYnVnUG9ydCAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLnY4RmxhZ3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52OEZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnY4RmxhZ3NbaV0ubWF0Y2goSU5TUEVDVF9QT1JUX1JFKTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2VydmljZVByb2Nlc3NBcmdzIChwb3J0OiBzdHJpbmcpOiBzdHJpbmcgW10ge1xuICAgICAgICBsZXQgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAodGhpcy52OEZsYWdzKVxuICAgICAgICAgICAgYXJncyA9IHRoaXMudjhGbGFncy5maWx0ZXIoZmxhZyA9PiAhSU5TUEVDVF9SRS50ZXN0KGZsYWcpKTtcblxuICAgICAgICAvLyBUT0RPOiBkZWJ1Z2dpbmc6IHJlZmFjdG9yIHRvIGEgc2VwYXJhdGUgZGVidWcgaW5mbyBwYXJzaW5nIHVuaXRcbiAgICAgICAgY29uc3QgaW5zcGVjdEJya0ZsYWcgPSBgLS1pbnNwZWN0LWJyaz0xMjcuMC4wLjE6JHtwb3J0fWA7XG5cbiAgICAgICAgYXJncy5wdXNoKGluc3BlY3RCcmtGbGFnLCBTRVJWSUNFX1BBVEgpO1xuXG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXQgKHJ1bnRpbWU6IFByb21pc2U8UnVudGltZVJlc291cmNlc3x1bmRlZmluZWQ+KTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzfHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZFJ1bnRpbWUgPSBhd2FpdCBydW50aW1lO1xuXG4gICAgICAgIGlmIChyZXNvbHZlZFJ1bnRpbWUpXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRSdW50aW1lO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0ICAgID0gdGhpcy5wYXJzZURlYnVnUG9ydCgpIHx8IGF3YWl0IGdldEZyZWVQb3J0KCk7XG4gICAgICAgICAgICBjb25zdCBhcmdzICAgID0gdGhpcy5fZ2V0U2VydmljZVByb2Nlc3NBcmdzKHBvcnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gc3Bhd24ocHJvY2Vzcy5hcmd2MCwgYXJncywgeyBzdGRpbzogWzAsIDEsIDIsICdwaXBlJywgJ3BpcGUnLCAncGlwZSddIH0pO1xuXG4gICAgICAgICAgICAvLyBOT1RFOiBuZWVkIHRvIHdhaXQsIG90aGVyd2lzZSB0aGUgZXJyb3Igd2lsbCBiZSBhdCBgYXdhaXQgY2RwKC4uLilgXG4gICAgICAgICAgICAvLyBUT0RPOiBkZWJ1Z2dpbmc6IHJlZmFjdG9yIHRvIHVzZSBkZWxheSBhbmQgbXVsdGlwbGUgdHJpZXNcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyMDAwKSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuY2RwID0gYXdhaXQgY2RwKHsgcG9ydCB9KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmNkcClcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGV2ZWxvcG1lbnRNb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHVwRGVidWdnZXJIYW5kbGVycygpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkcC5EZWJ1Z2dlci5lbmFibGUoe30pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHAuUnVudGltZS5lbmFibGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2RwLlJ1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXIoKTtcblxuICAgICAgICAgICAgLy8gSEFDSzogTm9kZS5qcyBkZWZpbml0aW9uIGFyZSBub3QgY29ycmVjdCB3aGVuIGFkZGl0aW9uYWwgSS9PIGNoYW5uZWxzIGFyZSBzcFxuICAgICAgICAgICAgY29uc3Qgc3RkaW8gPSBzZXJ2aWNlLnN0ZGlvIGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IElQQ1Byb3h5KG5ldyBIb3N0VHJhbnNwb3J0KHN0ZGlvW0hPU1RfSU5QVVRfRkRdLCBzdGRpb1tIT1NUX09VVFBVVF9GRF0sIHN0ZGlvW0hPU1RfU1lOQ19GRF0pKTtcblxuICAgICAgICAgICAgdGhpcy5fc2V0dXBSb3V0ZXMocHJveHkpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uY2UoJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHByb3h5LCBzZXJ2aWNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRSdW50aW1lICgpOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXM+IHtcbiAgICAgICAgY29uc3QgcnVudGltZSA9IGF3YWl0IHRoaXMucnVudGltZTtcblxuICAgICAgICBpZiAoIXJ1bnRpbWUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgaXMgbm90IGF2YWlsYWJsZS4nKTtcblxuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUYXJnZXRUZXN0UnVuIChpZDogc3RyaW5nKTogVGVzdFJ1biB7XG4gICAgICAgIHJldHVybiB0ZXN0UnVuVHJhY2tlci5hY3RpdmVUZXN0UnVuc1tpZF0gYXMgdW5rbm93biBhcyBUZXN0UnVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5ydW50aW1lID0gdGhpcy5faW5pdCh0aGlzLnJ1bnRpbWUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZTtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IHNlcnZpY2UsIHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgc2VydmljZS5raWxsKCk7XG4gICAgICAgIHByb3h5LnN0b3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF93cmFwVGVzdEZ1bmN0aW9uIChpZDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uUHJvcGVydGllcyk6IFRlc3RGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBhc3luYyB0ZXN0UnVuID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuVGVzdEZuKHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkOiB0ZXN0UnVuLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyckxpc3QgPSBuZXcgVGVzdENhZmVFcnJvckxpc3QoKTtcblxuICAgICAgICAgICAgICAgIGVyckxpc3QuYWRkRXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgICAgIHRocm93IGVyckxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfTogUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yKTogUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8gfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcE1vY2tQcmVkaWNhdGUgKHsgbW9jaywgdGVzdElkLCBob29rSWQsIHJ1bGVJZCB9OiBXcmFwTW9ja1ByZWRpY2F0ZUFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICBtb2NrLmJvZHkgPSBhc3luYyAocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCByZXM6IEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEVycm9yVHlwZUNvbnN0cnVjdG9yICh0eXBlOiBzdHJpbmcpOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBlcnJvclR5cGVDb25zdHJ1Y3RvcnMuZ2V0KHR5cGUpIGFzIEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhlY3V0ZUNvbW1hbmRTeW5jICgpOiBuZXZlciB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2RTaG91bGROb3RCZUNhbGxlZEVycm9yKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVDb21tYW5kICh7IGNvbW1hbmQsIGlkLCBjYWxsc2l0ZSB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgLl9nZXRUYXJnZXRUZXN0UnVuKGlkKVxuICAgICAgICAgICAgLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9OiBDb21waWxlckFyZ3VtZW50cywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBjb25zdCB1bml0cyA9IGF3YWl0IHByb3h5LmNhbGwodGhpcy5nZXRUZXN0cywgeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMsIHJ1bm5hYmxlQ29uZmlndXJhdGlvbklkIH0sIGJhc2VVcmwpO1xuXG4gICAgICAgIHJldHVybiByZXN0b3JlVGVzdFN0cnVjdHVyZShcbiAgICAgICAgICAgIHVuaXRzLFxuICAgICAgICAgICAgKC4uLmFyZ3MpID0+IHRoaXMuX3dyYXBUZXN0RnVuY3Rpb24oLi4uYXJncyksXG4gICAgICAgICAgICAocnVsZUxvY2F0b3I6IFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcikgPT4gdGhpcy5fd3JhcFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlKHJ1bGVMb2NhdG9yKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW5UZXN0Rm4gKHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkIH06IFJ1blRlc3RBcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMucnVuVGVzdEZuLCB7IGlkLCBmdW5jdGlvbk5hbWUsIHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW5VcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBhd2FpdCBwcm94eS5jYWxsKHRoaXMuY2xlYW5VcCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldFVzZXJWYXJpYWJsZXMgKHVzZXJWYXJpYWJsZXM6IFVzZXJWYXJpYWJsZXMgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBhd2FpdCBwcm94eS5jYWxsKHRoaXMuc2V0VXNlclZhcmlhYmxlcywgdXNlclZhcmlhYmxlcyk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0T3B0aW9ucyAoeyB2YWx1ZSB9OiBTZXRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBjb25zdCBwcmVwYXJlZE9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyh2YWx1ZSk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLnNldE9wdGlvbnMsIHsgdmFsdWU6IHByZXBhcmVkT3B0aW9ucyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25SZXF1ZXN0SG9va0V2ZW50ICh7IG5hbWUsIHRlc3RJZCwgaG9va0lkLCBldmVudERhdGEgfTogUmVxdWVzdEhvb2tFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLm9uUmVxdWVzdEhvb2tFdmVudCwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlc3RJZCxcbiAgICAgICAgICAgIGhvb2tJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldE1vY2sgKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVzcG9uc2VFdmVudElkLCBtb2NrIH06IFNldE1vY2tBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKG1vY2suaXNQcmVkaWNhdGUpXG4gICAgICAgICAgICB0aGlzLl93cmFwTW9ja1ByZWRpY2F0ZSh7IG1vY2ssIHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzZXRNb2NrJywgW3Jlc3BvbnNlRXZlbnRJZCwgbW9ja10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyAoeyBldmVudElkLCBvcHRzIH06IFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMnLCBbZXZlbnRJZCwgb3B0c10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQgKHsgZXZlbnRJZCwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUgfTogU2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50JywgW2V2ZW50SWQsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCAoeyBldmVudElkLCBoZWFkZXJOYW1lIH06IFJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3JlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsIFtldmVudElkLCBoZWFkZXJOYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbyB9OiBFeGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGVBcmd1bWVudHMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlLCB7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlTW9ja1ByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH06IEV4ZWN1dGVNb2NrUHJlZGljYXRlKTogUHJvbWlzZTxJbmNvbWluZ01lc3NhZ2VMaWtlSW5pdE9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUsIHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8sIHJlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0V2FybmluZ01lc3NhZ2VzICh7IHRlc3RSdW5JZCB9OiBUZXN0UnVuTG9jYXRvcik6IFByb21pc2U8V2FybmluZ0xvZ01lc3NhZ2VbXT4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5nZXRXYXJuaW5nTWVzc2FnZXMsIHsgdGVzdFJ1bklkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMgKCB7IGhvb2tJZCwgaG9va0NsYXNzTmFtZSwgcnVsZXMgfTogQWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMgKHsgcnVsZXMgfTogUmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgncmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgeyBydWxlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZVRlc3RSdW5EYXRhICh7IHRlc3RSdW5JZCwgdGVzdElkLCBicm93c2VyLCBhY3RpdmVXaW5kb3dJZCwgbWVzc2FnZUJ1cyB9OiBJbml0aWFsaXplVGVzdFJ1bkRhdGFBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuaW5pdGlhbGl6ZVRlc3RSdW5EYXRhLCB7IHRlc3RSdW5JZCwgdGVzdElkLCBicm93c2VyLCBhY3RpdmVXaW5kb3dJZCwgbWVzc2FnZUJ1cyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0QXNzZXJ0aW9uQWN0dWFsVmFsdWUgKHsgdGVzdFJ1bklkLCBjb21tYW5kSWQgfTogQ29tbWFuZExvY2F0b3IpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZ2V0QXNzZXJ0aW9uQWN0dWFsVmFsdWUsIHsgdGVzdFJ1bklkLCBjb21tYW5kSWQ6IGNvbW1hbmRJZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZVJvbGVJbml0Rm4gKHsgdGVzdFJ1bklkLCByb2xlSWQgfTogRXhlY3V0ZVJvbGVJbml0Rm5Bcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZVJvbGVJbml0Rm4sIHsgdGVzdFJ1bklkLCByb2xlSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEN0eCAoeyB0ZXN0UnVuSWQgfTogVGVzdFJ1bkxvY2F0b3IpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5nZXRDdHgsIHsgdGVzdFJ1bklkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRGaXh0dXJlQ3R4ICh7IHRlc3RSdW5JZCB9OiBUZXN0UnVuTG9jYXRvcik6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmdldEZpeHR1cmVDdHgsIHsgdGVzdFJ1bklkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRDdHggKHsgdGVzdFJ1bklkLCB2YWx1ZSB9OiBTZXRDdHhBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuc2V0Q3R4LCB7IHRlc3RSdW5JZCwgdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEZpeHR1cmVDdHggKHsgdGVzdFJ1bklkLCB2YWx1ZSB9OiBTZXRDdHhBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuc2V0Rml4dHVyZUN0eCwgeyB0ZXN0UnVuSWQsIHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJvbGVBcHBlYXJlZCAoKTogdm9pZCB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2RTaG91bGROb3RCZUNhbGxlZEVycm9yKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZVJvbGVQcm9wZXJ0eSAoeyByb2xlSWQsIG5hbWUsIHZhbHVlIH06IFVwZGF0ZVJvbGVQcm9wZXJ0eUFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy51cGRhdGVSb2xlUHJvcGVydHksIHsgcm9sZUlkLCBuYW1lLCB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUpzRXhwcmVzc2lvbiAoeyBleHByZXNzaW9uLCB0ZXN0UnVuSWQsIG9wdGlvbnMgfTogRXhlY3V0ZUpzRXhwcmVzc2lvbkFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5leGVjdXRlSnNFeHByZXNzaW9uLCB7IGV4cHJlc3Npb24sIHRlc3RSdW5JZCwgb3B0aW9ucyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uICh7IGV4cHJlc3Npb24sIHRlc3RSdW5JZCwgY2FsbHNpdGUgfTogRXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uQXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbiwgeyBleHByZXNzaW9uLCB0ZXN0UnVuSWQsIGNhbGxzaXRlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQXNzZXJ0aW9uRm4gKHsgdGVzdFJ1bklkLCBjb21tYW5kSWQgfTogQ29tbWFuZExvY2F0b3IpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZUFzc2VydGlvbkZuLCB7IHRlc3RSdW5JZCwgY29tbWFuZElkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGRVbmV4cGVjdGVkRXJyb3IgKHsgdHlwZSwgbWVzc2FnZSB9OiBBZGRVbmV4cGVjdGVkRXJyb3JBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgRXJyb3JUeXBlQ29uc3RydWN0b3IgPSB0aGlzLl9nZXRFcnJvclR5cGVDb25zdHJ1Y3Rvcih0eXBlKTtcblxuICAgICAgICBoYW5kbGVVbmV4cGVjdGVkRXJyb3IoRXJyb3JUeXBlQ29uc3RydWN0b3IsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjaGVja1dpbmRvdyAoeyB0ZXN0UnVuSWQsIGNvbW1hbmRJZCwgdXJsLCB0aXRsZSB9OiBDaGVja1dpbmRvd0FyZ3VtZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmNoZWNrV2luZG93LCB7IHRlc3RSdW5JZCwgY29tbWFuZElkLCB1cmwsIHRpdGxlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVUZXN0UnVuRnJvbVN0YXRlICh7IHRlc3RSdW5JZCB9OiBUZXN0UnVuTG9jYXRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5yZW1vdmVUZXN0UnVuRnJvbVN0YXRlLCB7IHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlRml4dHVyZUN0eHNGcm9tU3RhdGUgKHsgZml4dHVyZUlkcyB9OiBSZW1vdmVGaXh0dXJlQ3R4c0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5yZW1vdmVGaXh0dXJlQ3R4c0Zyb21TdGF0ZSwgeyBmaXh0dXJlSWRzIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVVbml0c0Zyb21TdGF0ZSAoeyBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9OiBSZW1vdmVVbml0c0Zyb21TdGF0ZUFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5LmNhbGwodGhpcy5yZW1vdmVVbml0c0Zyb21TdGF0ZSwgeyBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZCB9KTtcbiAgICB9XG59XG4iXX0=
|