UNPKG

24.1 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const configuration_base_1 = __importDefault(require("./configuration-base"));
7const lodash_1 = require("lodash");
8const get_options_1 = require("../utils/get-options");
9const option_names_1 = __importDefault(require("./option-names"));
10const get_filter_fn_1 = __importDefault(require("../utils/get-filter-fn"));
11const prepare_reporters_1 = __importDefault(require("../utils/prepare-reporters"));
12const string_1 = require("../utils/string");
13const render_template_1 = __importDefault(require("../utils/render-template"));
14const warning_message_1 = __importDefault(require("../notifications/warning-message"));
15const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd"));
16const default_values_1 = require("./default-values");
17const option_source_1 = __importDefault(require("./option-source"));
18const CONFIGURATION_FILENAME = '.testcaferc.json';
19const DEFAULT_SCREENSHOTS_DIRECTORY = 'screenshots';
20const OPTION_FLAG_NAMES = [
21 option_names_1.default.skipJsErrors,
22 option_names_1.default.quarantineMode,
23 option_names_1.default.debugMode,
24 option_names_1.default.debugOnFail,
25 option_names_1.default.skipUncaughtErrors,
26 option_names_1.default.stopOnFirstFail,
27 option_names_1.default.takeScreenshotsOnFails,
28 option_names_1.default.disablePageCaching,
29 option_names_1.default.disablePageReloads,
30 option_names_1.default.disableScreenshots,
31 option_names_1.default.allowMultipleWindows
32];
33const OPTION_INIT_FLAG_NAMES = [
34 option_names_1.default.developmentMode,
35 option_names_1.default.retryTestPages,
36];
37class TestCafeConfiguration extends configuration_base_1.default {
38 constructor() {
39 super(CONFIGURATION_FILENAME);
40 }
41 async init(options = {}) {
42 await super.init();
43 const opts = await this._load();
44 if (opts) {
45 this._options = configuration_base_1.default._fromObj(opts);
46 await this._normalizeOptionsAfterLoad();
47 }
48 this.mergeOptions(options);
49 }
50 prepare() {
51 this._prepareFlags();
52 this._setDefaultValues();
53 }
54 notifyAboutOverriddenOptions() {
55 if (!this._overriddenOptions.length)
56 return;
57 const optionsStr = string_1.getConcatenatedValuesString(this._overriddenOptions);
58 const optionsSuffix = string_1.getPluralSuffix(this._overriddenOptions);
59 configuration_base_1.default._showConsoleWarning(render_template_1.default(warning_message_1.default.configOptionsWereOverriden, optionsStr, optionsSuffix));
60 this._overriddenOptions = [];
61 }
62 get startOptions() {
63 const result = {
64 hostname: this.getOption('hostname'),
65 port1: this.getOption('port1'),
66 port2: this.getOption('port2'),
67 options: {
68 ssl: this.getOption('ssl'),
69 developmentMode: this.getOption('developmentMode'),
70 retryTestPages: this.getOption('retryTestPages')
71 }
72 };
73 if (result.options.retryTestPages)
74 result.options.staticContentCaching = default_values_1.STATIC_CONTENT_CACHING_SETTINGS;
75 return result;
76 }
77 _prepareFlag(name) {
78 const option = this._ensureOption(name, void 0, option_source_1.default.Configuration);
79 option.value = !!option.value;
80 }
81 _prepareFlags() {
82 OPTION_FLAG_NAMES.forEach(name => this._prepareFlag(name));
83 }
84 _prepareInitFlags() {
85 OPTION_INIT_FLAG_NAMES.forEach(name => this._prepareFlag(name));
86 }
87 async _normalizeOptionsAfterLoad() {
88 await this._prepareSslOptions();
89 this._prepareInitFlags();
90 this._prepareFilterFn();
91 this._ensureArrayOption(option_names_1.default.src);
92 this._ensureArrayOption(option_names_1.default.browsers);
93 this._ensureArrayOption(option_names_1.default.clientScripts);
94 this._prepareReporters();
95 }
96 _prepareFilterFn() {
97 const filterOption = this._ensureOption(option_names_1.default.filter, null, option_source_1.default.Configuration);
98 if (!filterOption.value)
99 return;
100 const filterOptionValue = filterOption.value;
101 if (filterOptionValue.testGrep)
102 filterOptionValue.testGrep = get_options_1.getGrepOptions(option_names_1.default.filterTestGrep, filterOptionValue.testGrep);
103 if (filterOptionValue.fixtureGrep)
104 filterOptionValue.fixtureGrep = get_options_1.getGrepOptions(option_names_1.default.filterFixtureGrep, filterOptionValue.fixtureGrep);
105 filterOption.value = get_filter_fn_1.default(filterOption.value);
106 }
107 _ensureScreenshotPath() {
108 const path = resolve_path_relatively_cwd_1.default(DEFAULT_SCREENSHOTS_DIRECTORY);
109 const screenshots = this._ensureOption(option_names_1.default.screenshots, {}, option_source_1.default.Configuration).value;
110 if (!screenshots.path)
111 screenshots.path = path;
112 }
113 _prepareReporters() {
114 const reporterOption = this._options[option_names_1.default.reporter];
115 if (!reporterOption)
116 return;
117 const optionValue = lodash_1.castArray(reporterOption.value);
118 reporterOption.value = prepare_reporters_1.default(optionValue);
119 }
120 async _prepareSslOptions() {
121 const sslOptions = this._options[option_names_1.default.ssl];
122 if (!sslOptions)
123 return;
124 sslOptions.value = await get_options_1.getSSLOptions(sslOptions.value);
125 }
126 _setDefaultValues() {
127 this._ensureOptionWithValue(option_names_1.default.selectorTimeout, default_values_1.DEFAULT_TIMEOUT.selector, option_source_1.default.Configuration);
128 this._ensureOptionWithValue(option_names_1.default.assertionTimeout, default_values_1.DEFAULT_TIMEOUT.assertion, option_source_1.default.Configuration);
129 this._ensureOptionWithValue(option_names_1.default.pageLoadTimeout, default_values_1.DEFAULT_TIMEOUT.pageLoad, option_source_1.default.Configuration);
130 this._ensureOptionWithValue(option_names_1.default.speed, default_values_1.DEFAULT_SPEED_VALUE, option_source_1.default.Configuration);
131 this._ensureOptionWithValue(option_names_1.default.appInitDelay, default_values_1.DEFAULT_APP_INIT_DELAY, option_source_1.default.Configuration);
132 this._ensureOptionWithValue(option_names_1.default.concurrency, default_values_1.DEFAULT_CONCURRENCY_VALUE, option_source_1.default.Configuration);
133 this._ensureOptionWithValue(option_names_1.default.src, default_values_1.DEFAULT_SOURCE_DIRECTORIES, option_source_1.default.Configuration);
134 this._ensureOptionWithValue(option_names_1.default.developmentMode, default_values_1.DEFAULT_DEVELOPMENT_MODE, option_source_1.default.Configuration);
135 this._ensureOptionWithValue(option_names_1.default.retryTestPages, default_values_1.DEFAULT_RETRY_TEST_PAGES, option_source_1.default.Configuration);
136 this._ensureScreenshotPath();
137 }
138 static get FILENAME() {
139 return CONFIGURATION_FILENAME;
140 }
141}
142exports.default = TestCafeConfiguration;
143module.exports = exports.default;
144//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uL3Rlc3RjYWZlLWNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RUFBaUQ7QUFDakQsbUNBQW1DO0FBQ25DLHNEQUFxRTtBQUNyRSxrRUFBMEM7QUFDMUMsMkVBQWlEO0FBQ2pELG1GQUEwRDtBQUMxRCw0Q0FBK0U7QUFDL0UsK0VBQXNEO0FBQ3RELHVGQUFnRTtBQUNoRSx1R0FBNEU7QUFFNUUscURBUzBCO0FBRTFCLG9FQUEyQztBQUczQyxNQUFNLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDO0FBRWxELE1BQU0sNkJBQTZCLEdBQUcsYUFBYSxDQUFDO0FBRXBELE1BQU0saUJBQWlCLEdBQUc7SUFDdEIsc0JBQVksQ0FBQyxZQUFZO0lBQ3pCLHNCQUFZLENBQUMsY0FBYztJQUMzQixzQkFBWSxDQUFDLFNBQVM7SUFDdEIsc0JBQVksQ0FBQyxXQUFXO0lBQ3hCLHNCQUFZLENBQUMsa0JBQWtCO0lBQy9CLHNCQUFZLENBQUMsZUFBZTtJQUM1QixzQkFBWSxDQUFDLHNCQUFzQjtJQUNuQyxzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLG9CQUFvQjtDQUNwQyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRztJQUMzQixzQkFBWSxDQUFDLGVBQWU7SUFDNUIsc0JBQVksQ0FBQyxjQUFjO0NBQzlCLENBQUM7QUFnQkYsTUFBcUIscUJBQXNCLFNBQVEsNEJBQWE7SUFDNUQ7UUFDSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBRSxPQUFPLEdBQUcsRUFBRTtRQUMzQixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztR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c0IsQ0FBQyxzQkFBWSxDQUFDLEdBQUcsRUFBRSwyQ0FBMEIsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBWSxDQUFDLGVBQWUsRUFBRSx5Q0FBd0IsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBWSxDQUFDLGNBQWMsRUFBRSx5Q0FBd0IsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRS9HLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxNQUFNLEtBQUssUUFBUTtRQUN0QixPQUFPLHNCQUFzQixDQUFDO0lBQ2xDLENBQUM7Q0FDSjtBQTdJRCx3Q0E2SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24tYmFzZSc7XG5pbXBvcnQgeyBjYXN0QXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0R3JlcE9wdGlvbnMsIGdldFNTTE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucyc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4vb3B0aW9uLW5hbWVzJztcbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBwcmVwYXJlUmVwb3J0ZXJzIGZyb20gJy4uL3V0aWxzL3ByZXBhcmUtcmVwb3J0ZXJzJztcbmltcG9ydCB7IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZywgZ2V0UGx1cmFsU3VmZml4IH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCByZW5kZXJUZW1wbGF0ZSBmcm9tICcuLi91dGlscy9yZW5kZXItdGVtcGxhdGUnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuXG5pbXBvcnQge1xuICAgIERFRkFVTFRfQVBQX0lOSVRfREVMQVksXG4gICAgREVGQVVMVF9DT05DVVJSRU5DWV9WQUxVRSxcbiAgICBERUZBVUxUX1NQRUVEX1ZBTFVFLFxuICAgIERFRkFVTFRfVElNRU9VVCxcbiAgICBERUZBVUxUX1NPVVJDRV9ESVJFQ1RPUklFUyxcbiAgICBERUZBVUxUX0RFVkVMT1BNRU5UX01PREUsXG4gICAgREVGQVVMVF9SRVRSWV9URVNUX1BBR0VTLFxuICAgIFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1Ncbn0gZnJvbSAnLi9kZWZhdWx0LXZhbHVlcyc7XG5cbmltcG9ydCBPcHRpb25Tb3VyY2UgZnJvbSAnLi9vcHRpb24tc291cmNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEZpbHRlck9wdGlvbiwgUmVwb3J0ZXJPcHRpb24sIFN0YXRpY0NvbnRlbnRDYWNoaW5nT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IENPTkZJR1VSQVRJT05fRklMRU5BTUUgPSAnLnRlc3RjYWZlcmMuanNvbic7XG5cbmNvbnN0IERFRkFVTFRfU0NSRUVOU0hPVFNfRElSRUNUT1JZID0gJ3NjcmVlbnNob3RzJztcblxuY29uc3QgT1BUSU9OX0ZMQUdfTkFNRVMgPSBbXG4gICAgT1BUSU9OX05BTUVTLnNraXBKc0Vycm9ycyxcbiAgICBPUFRJT05fTkFNRVMucXVhcmFudGluZU1vZGUsXG4gICAgT1BUSU9OX05BTUVTLmRlYnVnTW9kZSxcbiAgICBPUFRJT05fTkFNRVMuZGVidWdPbkZhaWwsXG4gICAgT1BUSU9OX05BTUVTLnNraXBVbmNhdWdodEVycm9ycyxcbiAgICBPUFRJT05fTkFNRVMuc3RvcE9uRmlyc3RGYWlsLFxuICAgIE9QVElPTl9OQU1FUy50YWtlU2NyZWVuc2hvdHNPbkZhaWxzLFxuICAgIE9QVElPTl9OQU1FUy5kaXNhYmxlUGFnZUNhY2hpbmcsXG4gICAgT1BUSU9OX05BTUVTLmRpc2FibGVQYWdlUmVsb2FkcyxcbiAgICBPUFRJT05fTkFNRVMuZGlzYWJsZVNjcmVlbnNob3RzLFxuICAgIE9QVElPTl9OQU1FUy5hbGxvd011bHRpcGxlV2luZG93c1xuXTtcblxuY29uc3QgT1BUSU9OX0lOSVRfRkxBR19OQU1FUyA9IFtcbiAgICBPUFRJT05fTkFNRVMuZGV2ZWxvcG1lbnRNb2RlLFxuICAgIE9QVElPTl9OQU1FUy5yZXRyeVRlc3RQYWdlcyxcbl07XG5cbmludGVyZmFjZSBUZXN0Q2FmZUFkZGl0aW9uYWxTdGFydE9wdGlvbnMge1xuICAgIHJldHJ5VGVzdFBhZ2VzOiBib29sZWFuO1xuICAgIHNzbDogc3RyaW5nO1xuICAgIHN0YXRpY0NvbnRlbnRDYWNoaW5nPzogU3RhdGljQ29udGVudENhY2hpbmdPcHRpb25zO1xuICAgIGRldmVsb3BtZW50TW9kZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRlc3RDYWZlU3RhcnRPcHRpb25zIHtcbiAgICBob3N0bmFtZT86IHN0cmluZztcbiAgICBwb3J0MT86IG51bWJlcjtcbiAgICBwb3J0Mj86IG51bWJlcjtcbiAgICBvcHRpb25zOiBUZXN0Q2FmZUFkZGl0aW9uYWxTdGFydE9wdGlvbnM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYWZlQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbmZpZ3VyYXRpb24ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKENPTkZJR1VSQVRJT05fRklMRU5BTUUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0IChvcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgc3VwZXIuaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdHMgPSBhd2FpdCB0aGlzLl9sb2FkKCk7XG5cbiAgICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBDb25maWd1cmF0aW9uLl9mcm9tT2JqKG9wdHMpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3JtYWxpemVPcHRpb25zQWZ0ZXJMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lcmdlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZSAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVGbGFncygpO1xuICAgICAgICB0aGlzLl9zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeUFib3V0T3ZlcnJpZGRlbk9wdGlvbnMgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX292ZXJyaWRkZW5PcHRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBvcHRpb25zU3RyICAgID0gZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKHRoaXMuX292ZXJyaWRkZW5PcHRpb25zKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1N1ZmZpeCA9IGdldFBsdXJhbFN1ZmZpeCh0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd0NvbnNvbGVXYXJuaW5nKHJlbmRlclRlbXBsYXRlKFdBUk5JTkdfTUVTU0FHRVMuY29uZmlnT3B0aW9uc1dlcmVPdmVycmlkZW4sIG9wdGlvbnNTdHIsIG9wdGlvbnNTdWZmaXgpKTtcblxuICAgICAgICB0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3RhcnRPcHRpb25zICgpOiBUZXN0Q2FmZVN0YXJ0T3B0aW9ucyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogVGVzdENhZmVTdGFydE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBob3N0bmFtZTogdGhpcy5nZXRPcHRpb24oJ2hvc3RuYW1lJykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgcG9ydDE6ICAgIHRoaXMuZ2V0T3B0aW9uKCdwb3J0MScpIGFzIG51bWJlcixcbiAgICAgICAgICAgIHBvcnQyOiAgICB0aGlzLmdldE9wdGlvbigncG9ydDInKSBhcyBudW1iZXIsXG5cbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBzc2w6ICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdzc2wnKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiB0aGlzLmdldE9wdGlvbignZGV2ZWxvcG1lbnRNb2RlJykgYXMgYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZXRyeVRlc3RQYWdlczogIHRoaXMuZ2V0T3B0aW9uKCdyZXRyeVRlc3RQYWdlcycpIGFzIGJvb2xlYW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVzdWx0Lm9wdGlvbnMucmV0cnlUZXN0UGFnZXMpXG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucy5zdGF0aWNDb250ZW50Q2FjaGluZyA9IFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1M7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmxhZyAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihuYW1lLCB2b2lkIDAsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBvcHRpb24udmFsdWUgPSAhIW9wdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmxhZ3MgKCk6IHZvaWQge1xuICAgICAgICBPUFRJT05fRkxBR19OQU1FUy5mb3JFYWNoKG5hbWUgPT4gdGhpcy5fcHJlcGFyZUZsYWcobmFtZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVJbml0RmxhZ3MgKCk6IHZvaWQge1xuICAgICAgICBPUFRJT05fSU5JVF9GTEFHX05BTUVTLmZvckVhY2gobmFtZSA9PiB0aGlzLl9wcmVwYXJlRmxhZyhuYW1lKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfbm9ybWFsaXplT3B0aW9uc0FmdGVyTG9hZCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVTc2xPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVJbml0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUZpbHRlckZuKCk7XG4gICAgICAgIHRoaXMuX2Vuc3VyZUFycmF5T3B0aW9uKE9QVElPTl9OQU1FUy5zcmMpO1xuICAgICAgICB0aGlzLl9lbnN1cmVBcnJheU9wdGlvbihPUFRJT05fTkFNRVMuYnJvd3NlcnMpO1xuICAgICAgICB0aGlzLl9lbnN1cmVBcnJheU9wdGlvbihPUFRJT05fTkFNRVMuY2xpZW50U2NyaXB0cyk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVSZXBvcnRlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmlsdGVyRm4gKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXJPcHRpb24gPSB0aGlzLl9lbnN1cmVPcHRpb24oT1BUSU9OX05BTUVTLmZpbHRlciwgbnVsbCwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmICghZmlsdGVyT3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlck9wdGlvblZhbHVlID0gZmlsdGVyT3B0aW9uLnZhbHVlIGFzIEZpbHRlck9wdGlvbjtcblxuICAgICAgICBpZiAoZmlsdGVyT3B0aW9uVmFsdWUudGVzdEdyZXApXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb25WYWx1ZS50ZXN0R3JlcCA9IGdldEdyZXBPcHRpb25zKE9QVElPTl9OQU1FUy5maWx0ZXJUZXN0R3JlcCwgZmlsdGVyT3B0aW9uVmFsdWUudGVzdEdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAoZmlsdGVyT3B0aW9uVmFsdWUuZml4dHVyZUdyZXApXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb25WYWx1ZS5maXh0dXJlR3JlcCA9IGdldEdyZXBPcHRpb25zKE9QVElPTl9OQU1FUy5maWx0ZXJGaXh0dXJlR3JlcCwgZmlsdGVyT3B0aW9uVmFsdWUuZml4dHVyZUdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBmaWx0ZXJPcHRpb24udmFsdWUgPSBnZXRGaWx0ZXJGbihmaWx0ZXJPcHRpb24udmFsdWUpIGFzIEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Vuc3VyZVNjcmVlbnNob3RQYXRoICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGF0aCAgICAgICAgPSByZXNvbHZlUGF0aFJlbGF0aXZlbHlDd2QoREVGQVVMVF9TQ1JFRU5TSE9UU19ESVJFQ1RPUlkpO1xuICAgICAgICBjb25zdCBzY3JlZW5zaG90cyA9IHRoaXMuX2Vuc3VyZU9wdGlvbihPUFRJT05fTkFNRVMuc2NyZWVuc2hvdHMsIHt9LCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbikudmFsdWUgYXMgRGljdGlvbmFyeTxzdHJpbmc+O1xuXG4gICAgICAgIGlmICghc2NyZWVuc2hvdHMucGF0aClcbiAgICAgICAgICAgIHNjcmVlbnNob3RzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVSZXBvcnRlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXBvcnRlck9wdGlvbiA9IHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnJlcG9ydGVyXTtcblxuICAgICAgICBpZiAoIXJlcG9ydGVyT3B0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gY2FzdEFycmF5KHJlcG9ydGVyT3B0aW9uLnZhbHVlIGFzIFJlcG9ydGVyT3B0aW9uKTtcblxuICAgICAgICByZXBvcnRlck9wdGlvbi52YWx1ZSA9IHByZXBhcmVSZXBvcnRlcnMob3B0aW9uVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3ByZXBhcmVTc2xPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3NsT3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnNzbF07XG5cbiAgICAgICAgaWYgKCFzc2xPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHNzbE9wdGlvbnMudmFsdWUgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHNzbE9wdGlvbnMudmFsdWUgYXMgc3RyaW5nKSBhcyBEaWN0aW9uYXJ5PHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldERlZmF1bHRWYWx1ZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnNlbGVjdG9yVGltZW91dCwgREVGQVVMVF9USU1FT1VULnNlbGVjdG9yLCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuYXNzZXJ0aW9uVGltZW91dCwgREVGQVVMVF9USU1FT1VULmFzc2VydGlvbiwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnBhZ2VMb2FkVGltZW91dCwgREVGQVVMVF9USU1FT1VULnBhZ2VMb2FkLCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuc3BlZWQsIERFRkFVTFRfU1BFRURfVkFMVUUsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5hcHBJbml0RGVsYXksIERFRkFVTFRfQVBQX0lOSVRfREVMQVksIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5jb25jdXJyZW5jeSwgREVGQVVMVF9DT05DVVJSRU5DWV9WQUxVRSwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnNyYywgREVGQVVMVF9TT1VSQ0VfRElSRUNUT1JJRVMsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5kZXZlbG9wbWVudE1vZGUsIERFRkFVTFRfREVWRUxPUE1FTlRfTU9ERSwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnJldHJ5VGVzdFBhZ2VzLCBERUZBVUxUX1JFVFJZX1RFU1RfUEFHRVMsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcblxuICAgICAgICB0aGlzLl9lbnN1cmVTY3JlZW5zaG90UGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEZJTEVOQU1FICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ09ORklHVVJBVElPTl9GSUxFTkFNRTtcbiAgICB9XG59XG4iXX0=
\No newline at end of file