UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

119 lines 18.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const correct_file_path_1 = __importDefault(require("../utils/correct-file-path")); const escape_user_agent_1 = __importDefault(require("../utils/escape-user-agent")); const events_1 = __importDefault(require("events")); const DATE_FORMAT = 'YYYY-MM-DD'; const TIME_FORMAT = 'HH-mm-ss'; const ERRORS_FOLDER = 'errors'; const PROBLEMATIC_PLACEHOLDER_VALUE = ''; const PLACEHOLDERS = { DATE: '${DATE}', TIME: '${TIME}', TEST_INDEX: '${TEST_INDEX}', FILE_INDEX: '${FILE_INDEX}', QUARANTINE_ATTEMPT: '${QUARANTINE_ATTEMPT}', FIXTURE: '${FIXTURE}', TEST: '${TEST}', USERAGENT: '${USERAGENT}', BROWSER: '${BROWSER}', BROWSER_VERSION: '${BROWSER_VERSION}', OS: '${OS}', OS_VERSION: '${OS_VERSION}', TEST_ID: '${TEST_ID}', RUN_ID: '${RUN_ID}', }; const DEFAULT_PATH_PATTERN_FOR_REPORT = `${PLACEHOLDERS.DATE}_${PLACEHOLDERS.TIME}\\${PLACEHOLDERS.TEST_ID}\\` + `${PLACEHOLDERS.RUN_ID}\\${PLACEHOLDERS.USERAGENT}\\${PLACEHOLDERS.FILE_INDEX}`; const TEST_ID_TEMPLATE = data => data.testIndex ? `test-${data.testIndex}` : ''; const RUN_ID_TEMPLATE = data => data.quarantineAttempt ? `run-${data.quarantineAttempt}` : ''; class PathPattern extends events_1.default { constructor(pattern, fileExtension, data, patternOnFails) { super(); this.pattern = this._ensurePattern(pattern); this.patternOnFails = patternOnFails; this.data = this._addDefaultFields(data); this.placeholderToDataMap = this._createPlaceholderToDataMap(); this.fileExtension = fileExtension; } _ensurePattern(pattern) { if (pattern) return pattern; return DEFAULT_PATH_PATTERN_FOR_REPORT; } _addDefaultFields(data) { const defaultFields = { testId: TEST_ID_TEMPLATE(data), runId: RUN_ID_TEMPLATE(data), formattedDate: data.now.format(DATE_FORMAT), formattedTime: data.now.format(TIME_FORMAT), fileIndex: 1, errorFileIndex: 1, }; return Object.assign({}, defaultFields, data); } _createPlaceholderToDataMap() { return { [PLACEHOLDERS.TEST_ID]: this.data.testId, [PLACEHOLDERS.RUN_ID]: this.data.runId, [PLACEHOLDERS.DATE]: this.data.formattedDate, [PLACEHOLDERS.TIME]: this.data.formattedTime, [PLACEHOLDERS.TEST_INDEX]: this.data.testIndex, [PLACEHOLDERS.QUARANTINE_ATTEMPT]: this.data.quarantineAttempt || 1, [PLACEHOLDERS.FIXTURE]: this.data.fixture, [PLACEHOLDERS.TEST]: this.data.test, [PLACEHOLDERS.FILE_INDEX]: forError => forError ? this.data.errorFileIndex : this.data.fileIndex, [PLACEHOLDERS.USERAGENT]: this.data.parsedUserAgent.prettyUserAgent, [PLACEHOLDERS.BROWSER]: this.data.parsedUserAgent.name, [PLACEHOLDERS.BROWSER_VERSION]: this.data.parsedUserAgent.version, [PLACEHOLDERS.OS]: this.data.parsedUserAgent.os.name, [PLACEHOLDERS.OS_VERSION]: this.data.parsedUserAgent.os.version, }; } _buildPath(pattern, placeholderToDataMap, forError) { let resultFilePath = pattern; const problematicPlaceholders = []; for (const placeholder in placeholderToDataMap) { const findPlaceholderRegExp = new RegExp((0, lodash_1.escapeRegExp)(placeholder), 'g'); resultFilePath = resultFilePath.replace(findPlaceholderRegExp, () => { if (placeholder === PLACEHOLDERS.FILE_INDEX) { const getFileIndexFn = placeholderToDataMap[placeholder]; let result = getFileIndexFn(forError); if (!this.patternOnFails && forError) result = `${ERRORS_FOLDER}\\${result}`; return result; } else if (placeholder === PLACEHOLDERS.USERAGENT) { const userAgent = placeholderToDataMap[placeholder]; return (0, escape_user_agent_1.default)(userAgent); } let calculatedValue = placeholderToDataMap[placeholder]; if (calculatedValue === null || calculatedValue === void 0) { problematicPlaceholders.push(placeholder); calculatedValue = PROBLEMATIC_PLACEHOLDER_VALUE; } return calculatedValue; }); } if (problematicPlaceholders.length) this.emit('problematic-placeholders-found', { placeholders: problematicPlaceholders }); return resultFilePath; } getPath(forError, customPathPattern) { const pathPattern = customPathPattern || this.pattern; const pattern = this.patternOnFails && forError ? this.patternOnFails : pathPattern; const path = this._buildPath(pattern, this.placeholderToDataMap, forError); return (0, correct_file_path_1.default)(path, this.fileExtension); } // For testing purposes static get PLACEHOLDERS() { return PLACEHOLDERS; } } exports.default = PathPattern; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1wYXR0ZXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGgtcGF0dGVybi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrRDtBQUNsRCxtRkFBeUQ7QUFDekQsbUZBQXlEO0FBQ3pELG9EQUFrQztBQUVsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUUvQixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRztJQUNqQixJQUFJLEVBQWdCLFNBQVM7SUFDN0IsSUFBSSxFQUFnQixTQUFTO0lBQzdCLFVBQVUsRUFBVSxlQUFlO0lBQ25DLFVBQVUsRUFBVSxlQUFlO0lBQ25DLGtCQUFrQixFQUFFLHVCQUF1QjtJQUMzQyxPQUFPLEVBQWEsWUFBWTtJQUNoQyxJQUFJLEVBQWdCLFNBQVM7SUFDN0IsU0FBUyxFQUFXLGNBQWM7SUFDbEMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsZUFBZSxFQUFLLG9CQUFvQjtJQUN4QyxFQUFFLEVBQWtCLE9BQU87SUFDM0IsVUFBVSxFQUFVLGVBQWU7SUFDbkMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsTUFBTSxFQUFjLFdBQVc7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sK0JBQStCLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSTtJQUN0RSxHQUFHLFlBQVksQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFFeEgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFB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QUNyQztnQkFFRCxJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFeEQsSUFBSSxlQUFlLEtBQUssSUFBSSxJQUFJLGVBQWUsS0FBSyxLQUFLLENBQUMsRUFBRTtvQkFDeEQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUUxQyxlQUFlLEdBQUcsNkJBQTZCLENBQUM7aUJBQ25EO2dCQUVELE9BQU8sZUFBZSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLHVCQUF1QixDQUFDLE1BQU07WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7UUFFM0YsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQztJQUVELE9BQU8sQ0FBRSxRQUFRLEVBQUUsaUJBQWlCO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUN4RixNQUFNLElBQUksR0FBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEYsT0FBTyxJQUFBLDJCQUFlLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxZQUFZO1FBQ25CLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7Q0FDSjtBQXhHRCw4QkF3R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgYXMgZXNjYXBlUmUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGNvcnJlY3RGaWxlUGF0aCBmcm9tICcuLi91dGlscy9jb3JyZWN0LWZpbGUtcGF0aCc7XG5pbXBvcnQgZXNjYXBlVXNlckFnZW50IGZyb20gJy4uL3V0aWxzL2VzY2FwZS11c2VyLWFnZW50JztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcblxuY29uc3QgREFURV9GT1JNQVQgPSAnWVlZWS1NTS1ERCc7XG5jb25zdCBUSU1FX0ZPUk1BVCA9ICdISC1tbS1zcyc7XG5cbmNvbnN0IEVSUk9SU19GT0xERVIgPSAnZXJyb3JzJztcblxuY29uc3QgUFJPQkxFTUFUSUNfUExBQ0VIT0xERVJfVkFMVUUgPSAnJztcblxuY29uc3QgUExBQ0VIT0xERVJTID0ge1xuICAgIERBVEU6ICAgICAgICAgICAgICAgJyR7REFURX0nLFxuICAgIFRJTUU6ICAgICAgICAgICAgICAgJyR7VElNRX0nLFxuICAgIFRFU1RfSU5ERVg6ICAgICAgICAgJyR7VEVTVF9JTkRFWH0nLFxuICAgIEZJTEVfSU5ERVg6ICAgICAgICAgJyR7RklMRV9JTkRFWH0nLFxuICAgIFFVQVJBTlRJTkVfQVRURU1QVDogJyR7UVVBUkFOVElORV9BVFRFTVBUfScsXG4gICAgRklYVFVSRTogICAgICAgICAgICAnJHtGSVhUVVJFfScsXG4gICAgVEVTVDogICAgICAgICAgICAgICAnJHtURVNUfScsXG4gICAgVVNFUkFHRU5UOiAgICAgICAgICAnJHtVU0VSQUdFTlR9JyxcbiAgICBCUk9XU0VSOiAgICAgICAgICAgICcke0JST1dTRVJ9JyxcbiAgICBCUk9XU0VSX1ZFUlNJT046ICAgICcke0JST1dTRVJfVkVSU0lPTn0nLFxuICAgIE9TOiAgICAgICAgICAgICAgICAgJyR7T1N9JyxcbiAgICBPU19WRVJTSU9OOiAgICAgICAgICcke09TX1ZFUlNJT059JyxcbiAgICBURVNUX0lEOiAgICAgICAgICAgICcke1RFU1RfSUR9JyxcbiAgICBSVU5fSUQ6ICAgICAgICAgICAgICcke1JVTl9JRH0nLFxufTtcblxuY29uc3QgREVGQVVMVF9QQVRIX1BBVFRFUk5fRk9SX1JFUE9SVCA9IGAke1BMQUNFSE9MREVSUy5EQVRFfV8ke1BMQUNFSE9MREVSUy5USU1FfVxcXFwke1BMQUNFSE9MREVSUy5URVNUX0lEfVxcXFxgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtQTEFDRUhPTERFUlMuUlVOX0lEfVxcXFwke1BMQUNFSE9MREVSUy5VU0VSQUdFTlR9XFxcXCR7UExBQ0VIT0xERVJTLkZJTEVfSU5ERVh9YDtcblxuY29uc3QgVEVTVF9JRF9URU1QTEFURSA9IGRhdGEgPT4gZGF0YS50ZXN0SW5kZXggPyBgdGVzdC0ke2RhdGEudGVzdEluZGV4fWAgOiAnJztcbmNvbnN0IFJVTl9JRF9URU1QTEFURSAgPSBkYXRhID0+IGRhdGEucXVhcmFudGluZUF0dGVtcHQgPyBgcnVuLSR7ZGF0YS5xdWFyYW50aW5lQXR0ZW1wdH1gIDogJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhdGhQYXR0ZXJuIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvciAocGF0dGVybiwgZmlsZUV4dGVuc2lvbiwgZGF0YSwgcGF0dGVybk9uRmFpbHMpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnBhdHRlcm4gICAgICAgICAgICAgID0gdGhpcy5fZW5zdXJlUGF0dGVybihwYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuT25GYWlscyAgICAgICA9IHBhdHRlcm5PbkZhaWxzO1xuICAgICAgICB0aGlzLmRhdGEgICAgICAgICAgICAgICAgID0gdGhpcy5fYWRkRGVmYXVsdEZpZWxkcyhkYXRhKTtcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlclRvRGF0YU1hcCA9IHRoaXMuX2NyZWF0ZVBsYWNlaG9sZGVyVG9EYXRhTWFwKCk7XG4gICAgICAgIHRoaXMuZmlsZUV4dGVuc2lvbiAgICAgICAgPSBmaWxlRXh0ZW5zaW9uO1xuICAgIH1cblxuICAgIF9lbnN1cmVQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuKVxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG5cbiAgICAgICAgcmV0dXJuIERFRkFVTFRfUEFUSF9QQVRURVJOX0ZPUl9SRVBPUlQ7XG4gICAgfVxuXG4gICAgX2FkZERlZmF1bHRGaWVsZHMgKGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEZpZWxkcyA9IHtcbiAgICAgICAgICAgIHRlc3RJZDogICAgICAgICBURVNUX0lEX1RFTVBMQVRFKGRhdGEpLFxuICAgICAgICAgICAgcnVuSWQ6ICAgICAgICAgIFJVTl9JRF9URU1QTEFURShkYXRhKSxcbiAgICAgICAgICAgIGZvcm1hdHRlZERhdGU6ICBkYXRhLm5vdy5mb3JtYXQoREFURV9GT1JNQVQpLFxuICAgICAgICAgICAgZm9ybWF0dGVkVGltZTogIGRhdGEubm93LmZvcm1hdChUSU1FX0ZPUk1BVCksXG4gICAgICAgICAgICBmaWxlSW5kZXg6ICAgICAgMSxcbiAgICAgICAgICAgIGVycm9yRmlsZUluZGV4OiAxLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0RmllbGRzLCBkYXRhKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlUGxhY2Vob2xkZXJUb0RhdGFNYXAgKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5URVNUX0lEXTogICAgICAgICAgICB0aGlzLmRhdGEudGVzdElkLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5SVU5fSURdOiAgICAgICAgICAgICB0aGlzLmRhdGEucnVuSWQsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkRBVEVdOiAgICAgICAgICAgICAgIHRoaXMuZGF0YS5mb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5USU1FXTogICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9ybWF0dGVkVGltZSxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuVEVTVF9JTkRFWF06ICAgICAgICAgdGhpcy5kYXRhLnRlc3RJbmRleCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuUVVBUkFOVElORV9BVFRFTVBUXTogdGhpcy5kYXRhLnF1YXJhbnRpbmVBdHRlbXB0IHx8IDEsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkZJWFRVUkVdOiAgICAgICAgICAgIHRoaXMuZGF0YS5maXh0dXJlLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5URVNUXTogICAgICAgICAgICAgICB0aGlzLmRhdGEudGVzdCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuRklMRV9JTkRFWF06ICAgICAgICAgZm9yRXJyb3IgPT4gZm9yRXJyb3IgPyB0aGlzLmRhdGEuZXJyb3JGaWxlSW5kZXggOiB0aGlzLmRhdGEuZmlsZUluZGV4LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5VU0VSQUdFTlRdOiAgICAgICAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50LnByZXR0eVVzZXJBZ2VudCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuQlJPV1NFUl06ICAgICAgICAgICAgdGhpcy5kYXRhLnBhcnNlZFVzZXJBZ2VudC5uYW1lLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5CUk9XU0VSX1ZFUlNJT05dOiAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50LnZlcnNpb24sXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLk9TXTogICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wYXJzZWRVc2VyQWdlbnQub3MubmFtZSxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuT1NfVkVSU0lPTl06ICAgICAgICAgdGhpcy5kYXRhLnBhcnNlZFVzZXJBZ2VudC5vcy52ZXJzaW9uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9idWlsZFBhdGggKHBhdHRlcm4sIHBsYWNlaG9sZGVyVG9EYXRhTWFwLCBmb3JFcnJvcikge1xuICAgICAgICBsZXQgcmVzdWx0RmlsZVBhdGggICAgICAgICAgICA9IHBhdHRlcm47XG4gICAgICAgIGNvbnN0IHByb2JsZW1hdGljUGxhY2Vob2xkZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwbGFjZWhvbGRlciBpbiBwbGFjZWhvbGRlclRvRGF0YU1hcCkge1xuICAgICAgICAgICAgY29uc3QgZmluZFBsYWNlaG9sZGVyUmVnRXhwID0gbmV3IFJlZ0V4cChlc2NhcGVSZShwbGFjZWhvbGRlciksICdnJyk7XG5cbiAgICAgICAgICAgIHJlc3VsdEZpbGVQYXRoID0gcmVzdWx0RmlsZVBhdGgucmVwbGFjZShmaW5kUGxhY2Vob2xkZXJSZWdFeHAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgPT09IFBMQUNFSE9MREVSUy5GSUxFX0lOREVYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEZpbGVJbmRleEZuID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ICAgICAgICAgICA9IGdldEZpbGVJbmRleEZuKGZvckVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGF0dGVybk9uRmFpbHMgJiYgZm9yRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBgJHtFUlJPUlNfRk9MREVSfVxcXFwke3Jlc3VsdH1gO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGxhY2Vob2xkZXIgPT09IFBMQUNFSE9MREVSUy5VU0VSQUdFTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVVc2VyQWdlbnQodXNlckFnZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY2FsY3VsYXRlZFZhbHVlID0gcGxhY2Vob2xkZXJUb0RhdGFNYXBbcGxhY2Vob2xkZXJdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBjYWxjdWxhdGVkVmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9ibGVtYXRpY1BsYWNlaG9sZGVycy5wdXNoKHBsYWNlaG9sZGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkVmFsdWUgPSBQUk9CTEVNQVRJQ19QTEFDRUhPTERFUl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlZFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvYmxlbWF0aWNQbGFjZWhvbGRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdwcm9ibGVtYXRpYy1wbGFjZWhvbGRlcnMtZm91bmQnLCB7IHBsYWNlaG9sZGVyczogcHJvYmxlbWF0aWNQbGFjZWhvbGRlcnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdEZpbGVQYXRoO1xuICAgIH1cblxuICAgIGdldFBhdGggKGZvckVycm9yLCBjdXN0b21QYXRoUGF0dGVybikge1xuICAgICAgICBjb25zdCBwYXRoUGF0dGVybiA9IGN1c3RvbVBhdGhQYXR0ZXJuIHx8IHRoaXMucGF0dGVybjtcbiAgICAgICAgY29uc3QgcGF0dGVybiAgICAgPSB0aGlzLnBhdHRlcm5PbkZhaWxzICYmIGZvckVycm9yID8gdGhpcy5wYXR0ZXJuT25GYWlscyA6IHBhdGhQYXR0ZXJuO1xuICAgICAgICBjb25zdCBwYXRoICAgICAgICA9IHRoaXMuX2J1aWxkUGF0aChwYXR0ZXJuLCB0aGlzLnBsYWNlaG9sZGVyVG9EYXRhTWFwLCBmb3JFcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIGNvcnJlY3RGaWxlUGF0aChwYXRoLCB0aGlzLmZpbGVFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIC8vIEZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgc3RhdGljIGdldCBQTEFDRUhPTERFUlMgKCkge1xuICAgICAgICByZXR1cm4gUExBQ0VIT0xERVJTO1xuICAgIH1cbn1cbiJdfQ==