"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chalk_1 = __importDefault(require("chalk")); const indent_string_1 = __importDefault(require("indent-string")); const lodash_1 = require("lodash"); const moment_loader_1 = __importDefault(require("../utils/moment-loader")); const string_1 = require("../utils/string"); const get_viewport_width_1 = __importDefault(require("../utils/get-viewport-width")); const colors_1 = require("../utils/diff/colors"); const symbols_1 = __importDefault(require("../reporter/symbols")); // NOTE: we should not expose internal state to // the plugin, to avoid accidental rewrites. // Therefore we use symbols to store them. const stream = Symbol(); const wordWrapEnabled = Symbol(); const indent = Symbol(); const errorDecorator = Symbol(); class ReporterPluginHost { constructor(plugin, outStream, name) { this.name = name; this.streamController = null; this[stream] = outStream || process.stdout; this[wordWrapEnabled] = false; this[indent] = 0; const useColors = this[stream] === process.stdout && chalk_1.default.enabled && !plugin.noColors; this.chalk = new chalk_1.default.constructor({ enabled: useColors }); this.moment = moment_loader_1.default; this.viewportWidth = (0, get_viewport_width_1.default)(this[stream]); this.symbols = Object.assign({}, symbols_1.default); (0, lodash_1.assignIn)(this, plugin); this[errorDecorator] = this.createErrorDecorator(); } // Error decorator createErrorDecorator() { return { 'span user-agent': (str) => this.chalk.grey(str), 'span subtitle': (str) => `- ${this.chalk.bold.red(str)} -`, 'div message': (str) => this.chalk.bold.red(str), 'div screenshot-info': lodash_1.identity, 'a screenshot-path': (str) => this.chalk.grey.underline(str), 'code': lodash_1.identity, 'span syntax-string': (str) => this.chalk.green(str), 'span syntax-punctuator': (str) => this.chalk.grey(str), 'span syntax-keyword': (str) => this.chalk.cyan(str), 'span syntax-number': (str) => this.chalk.magenta(str), 'span syntax-regex': (str) => this.chalk.magenta(str), 'span syntax-comment': (str) => this.chalk.grey.bold(str), 'span syntax-invalid': (str) => this.chalk.inverse(str), [`span ${colors_1.DIFF_COLORS.DIFF_NOT_MODIFIED}`]: (str) => this.chalk.gray(str), [`span ${colors_1.DIFF_COLORS.DIFF_ADDED}`]: (str) => this.chalk.green(str), [`span ${colors_1.DIFF_COLORS.DIFF_REMOVED}`]: (str) => this.chalk.red(str), 'div code-frame': lodash_1.identity, 'div code-line': (str) => str + '\n', 'div code-line-last': lodash_1.identity, 'div code-line-num': (str) => ` ${str} |`, 'div code-line-num-base': (str) => this.chalk.bgRed(` > ${str} `) + '|', 'div code-line-src': lodash_1.identity, 'div stack': (str) => '\n\n' + str, 'div stack-line': (str) => str + '\n', 'div stack-line-last': lodash_1.identity, 'div stack-line-name': (str) => ` at ${this.chalk.bold(str)}`, 'div stack-line-location': (str) => ` (${this.chalk.grey.underline(str)})`, 'strong': (str) => this.chalk.bold(str), 'a': (str) => `"${this.chalk.underline(str)}"`, }; } // String helpers indentString(str, indentVal) { return (0, indent_string_1.default)(str, ' ', indentVal); } wordWrap(str, indentVal, width) { return (0, string_1.wordWrap)(str, indentVal, width); } escapeHtml(str) { return (0, lodash_1.escape)(str); } formatError(err, prefix = '') { const prefixLengthWithoutColors = (0, string_1.removeTTYColors)(prefix).length; const maxMsgLength = this.viewportWidth - this[indent] - prefixLengthWithoutColors; let msg = err.formatMessage(this[errorDecorator], maxMsgLength); if (this[wordWrapEnabled]) msg = this.wordWrap(msg, prefixLengthWithoutColors, maxMsgLength); else msg = this.indentString(msg, prefixLengthWithoutColors); return prefix + msg.substr(prefixLengthWithoutColors); } // Writing helpers newline() { this._writeToUniqueStream('\n'); return this; } write(text) { if (this[wordWrapEnabled]) text = this.wordWrap(text, this[indent], this.viewportWidth); else text = this.indentString(text, this[indent]); this._writeToUniqueStream(text); return this; } useWordWrap(use) { this[wordWrapEnabled] = use; return this; } setIndent(val) { this[indent] = val; return this; } _writeToUniqueStream(text) { if (!this.streamController || this.streamController.ensureUniqueStream(this[stream], this)) this[stream].write(text); } // Abstract methods implemented in plugin async reportTaskStart( /* startTime, userAgents, testCount, testStructure, taskProperties */) { throw new Error('Not implemented'); } async reportFixtureStart( /* name, path */) { throw new Error('Not implemented'); } // NOTE: It's an optional method // async reportTestStart (/* name, testMeta */) { // throw new Error('Not implemented'); // } async reportTestDone( /* name, testRunInfo */) { throw new Error('Not implemented'); } async reportTaskDone( /* endTime, passed, warnings */) { throw new Error('Not implemented'); } // NOTE: It's an optional method async init() { // Optional } // NOTE: It's an optional method async reportWarnings( /* warnings */) { } } exports.default = ReporterPluginHost; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBcUM7QUFDckMsa0VBQXlDO0FBRXpDLG1DQUlnQjtBQUVoQiwyRUFBNEM7QUFDNUMsNENBQTREO0FBQzVELHFGQUEyRDtBQUMzRCxpREFBbUQ7QUFLbkQsa0VBQW1EO0FBR25ELCtDQUErQztBQUMvQyw0Q0FBNEM7QUFDNUMsMENBQTBDO0FBQzFDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sY0FBYyxHQUFJLE1BQU0sRUFBRSxDQUFDO0FBRWpDLE1BQXFCLGtCQUFrQjtJQVluQyxZQUFvQixNQUFXLEVBQUUsU0FBb0IsRUFBRSxJQUFhO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEdBQWUsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFZLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFZLENBQUMsQ0FBQztRQUUxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sSUFBSSxlQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUV2RixJQUFJLENBQUMsS0FBSyxHQUFXLElBQUksZUFBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FB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O1FBQ2IsV0FBVztJQUNmLENBQUM7SUFFRCxnQ0FBZ0M7SUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFjO0lBQzNDLENBQUM7Q0FDSjtBQXhLRCxxQ0F3S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGssIHsgQ2hhbGsgfSBmcm9tICdjaGFsayc7XG5pbXBvcnQgaW5kZW50U3RyaW5nIGZyb20gJ2luZGVudC1zdHJpbmcnO1xuXG5pbXBvcnQge1xuICAgIGlkZW50aXR5LFxuICAgIGVzY2FwZSBhcyBlc2NhcGVIdG1sLFxuICAgIGFzc2lnbkluLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgbW9tZW50IGZyb20gJy4uL3V0aWxzL21vbWVudC1sb2FkZXInO1xuaW1wb3J0IHsgd29yZFdyYXAsIHJlbW92ZVRUWUNvbG9ycyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQgZ2V0Vmlld3BvcnRXaWR0aCBmcm9tICcuLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuaW1wb3J0IHsgRElGRl9DT0xPUlMgfSBmcm9tICcuLi91dGlscy9kaWZmL2NvbG9ycyc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlcG9ydGVyU3RyZWFtQ29udHJvbGxlciBmcm9tICcuLi9ydW5uZXIvcmVwb3J0ZXItc3RyZWFtLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgUkVQT1JURVJfU1lNQk9MUyBmcm9tICcuLi9yZXBvcnRlci9zeW1ib2xzJztcbmltcG9ydCB7IFJlcG9ydGVyU3ltYm9scyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8vIE5PVEU6IHdlIHNob3VsZCBub3QgZXhwb3NlIGludGVybmFsIHN0YXRlIHRvXG4vLyB0aGUgcGx1Z2luLCB0byBhdm9pZCBhY2NpZGVudGFsIHJld3JpdGVzLlxuLy8gVGhlcmVmb3JlIHdlIHVzZSBzeW1ib2xzIHRvIHN0b3JlIHRoZW0uXG5jb25zdCBzdHJlYW0gICAgICAgICAgPSBTeW1ib2woKTtcbmNvbnN0IHdvcmRXcmFwRW5hYmxlZCA9IFN5bWJvbCgpO1xuY29uc3QgaW5kZW50ICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCBlcnJvckRlY29yYXRvciAgPSBTeW1ib2woKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJQbHVnaW5Ib3N0IHtcbiAgICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgICBwdWJsaWMgc3RyZWFtQ29udHJvbGxlcjogUmVwb3J0ZXJTdHJlYW1Db250cm9sbGVyIHwgbnVsbDtcbiAgICBwdWJsaWMgY2hhbGs6IENoYWxrO1xuICAgIHB1YmxpYyBtb21lbnQ6IE1vbWVudDtcbiAgICBwdWJsaWMgdmlld3BvcnRXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBzeW1ib2xzOiBSZXBvcnRlclN5bWJvbHM7XG4gICAgcHJpdmF0ZSBbc3RyZWFtXTogV3JpdGFibGU7XG4gICAgcHJpdmF0ZSBbd29yZFdyYXBFbmFibGVkXTogYm9vbGVhbjtcbiAgICBwcml2YXRlIFtpbmRlbnRdOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBbZXJyb3JEZWNvcmF0b3JdOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHBsdWdpbjogYW55LCBvdXRTdHJlYW0/OiBXcml0YWJsZSwgbmFtZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgICAgPSBuYW1lO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICB0aGlzW3N0cmVhbV0gICAgICAgICAgPSBvdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHRoaXNbd29yZFdyYXBFbmFibGVkXSA9IGZhbHNlO1xuICAgICAgICB0aGlzW2luZGVudF0gICAgICAgICAgPSAwO1xuXG4gICAgICAgIGNvbnN0IHVzZUNvbG9ycyA9IHRoaXNbc3RyZWFtXSA9PT0gcHJvY2Vzcy5zdGRvdXQgJiYgY2hhbGsuZW5hYmxlZCAmJiAhcGx1Z2luLm5vQ29sb3JzO1xuXG4gICAgICAgIHRoaXMuY2hhbGsgICAgICAgICA9IG5ldyBjaGFsay5jb25zdHJ1Y3Rvcih7IGVuYWJsZWQ6IHVzZUNvbG9ycyB9KTtcbiAgICAgICAgdGhpcy5tb21lbnQgICAgICAgID0gbW9tZW50O1xuICAgICAgICB0aGlzLnZpZXdwb3J0V2lkdGggPSBnZXRWaWV3cG9ydFdpZHRoKHRoaXNbc3RyZWFtXSk7XG4gICAgICAgIHRoaXMuc3ltYm9scyAgICAgICA9IE9iamVjdC5hc3NpZ24oe30sIFJFUE9SVEVSX1NZTUJPTFMpO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpc1tlcnJvckRlY29yYXRvcl0gPSB0aGlzLmNyZWF0ZUVycm9yRGVjb3JhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3IgZGVjb3JhdG9yXG4gICAgcHVibGljIGNyZWF0ZUVycm9yRGVjb3JhdG9yICgpOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3NwYW4gdXNlci1hZ2VudCc6IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ncmV5KHN0ciksXG5cbiAgICAgICAgICAgICdzcGFuIHN1YnRpdGxlJzogKHN0cjogc3RyaW5nKSA9PiBgLSAke3RoaXMuY2hhbGsuYm9sZC5yZWQoc3RyKX0gLWAsXG4gICAgICAgICAgICAnZGl2IG1lc3NhZ2UnOiAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ib2xkLnJlZChzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IHNjcmVlbnNob3QtaW5mbyc6IGlkZW50aXR5LFxuICAgICAgICAgICAgJ2Egc2NyZWVuc2hvdC1wYXRoJzogICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JleS51bmRlcmxpbmUoc3RyKSxcblxuICAgICAgICAgICAgJ2NvZGUnOiBpZGVudGl0eSxcblxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LXN0cmluZyc6ICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1wdW5jdHVhdG9yJzogKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZXkoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1rZXl3b3JkJzogICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmN5YW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1udW1iZXInOiAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1yZWdleCc6ICAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1jb21tZW50JzogICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZXkuYm9sZChzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWludmFsaWQnOiAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuaW52ZXJzZShzdHIpLFxuXG4gICAgICAgICAgICBbYHNwYW4gJHtESUZGX0NPTE9SUy5ESUZGX05PVF9NT0RJRklFRH1gXTogKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyYXkoc3RyKSxcbiAgICAgICAgICAgIFtgc3BhbiAke0RJRkZfQ09MT1JTLkRJRkZfQURERUR9YF06ICAgICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgIFtgc3BhbiAke0RJRkZfQ09MT1JTLkRJRkZfUkVNT1ZFRH1gXTogICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsucmVkKHN0ciksXG5cbiAgICAgICAgICAgICdkaXYgY29kZS1mcmFtZSc6ICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZSc6ICAgICAgICAgIChzdHI6IHN0cmluZykgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbnVtJzogICAgICAoc3RyOiBzdHJpbmcpID0+IGAgICAke3N0cn0gfGAsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1udW0tYmFzZSc6IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5iZ1JlZChgID4gJHtzdHJ9IGApICsgJ3wnLFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtc3JjJzogICAgICBpZGVudGl0eSxcblxuICAgICAgICAgICAgJ2RpdiBzdGFjayc6ICAgICAgICAgICAgICAgKHN0cjogc3RyaW5nKSA9PiAnXFxuXFxuJyArIHN0cixcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZSc6ICAgICAgICAgIChzdHI6IHN0cmluZykgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbGFzdCc6ICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1uYW1lJzogICAgIChzdHI6IHN0cmluZykgPT4gYCAgIGF0ICR7dGhpcy5jaGFsay5ib2xkKHN0cil9YCxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1sb2NhdGlvbic6IChzdHI6IHN0cmluZykgPT4gYCAoJHt0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0cil9KWAsXG5cbiAgICAgICAgICAgICdzdHJvbmcnOiAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuYm9sZChzdHIpLFxuICAgICAgICAgICAgJ2EnOiAgICAgIChzdHI6IHN0cmluZykgPT4gYFwiJHt0aGlzLmNoYWxrLnVuZGVybGluZShzdHIpfVwiYCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgaGVscGVyc1xuICAgIHB1YmxpYyBpbmRlbnRTdHJpbmcgKHN0cjogc3RyaW5nLCBpbmRlbnRWYWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpbmRlbnRTdHJpbmcoc3RyLCAnICcsIGluZGVudFZhbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdvcmRXcmFwIChzdHI6IHN0cmluZywgaW5kZW50VmFsOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gd29yZFdyYXAoc3RyLCBpbmRlbnRWYWwsIHdpZHRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXNjYXBlSHRtbCAoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZXNjYXBlSHRtbChzdHIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXRFcnJvciAoZXJyOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIsIHByZWZpeCA9ICcnKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycyA9IHJlbW92ZVRUWUNvbG9ycyhwcmVmaXgpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbWF4TXNnTGVuZ3RoICAgICAgICAgICAgICA9IHRoaXMudmlld3BvcnRXaWR0aCAtIHRoaXNbaW5kZW50XSAtIHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnM7XG5cbiAgICAgICAgbGV0IG1zZyA9IGVyci5mb3JtYXRNZXNzYWdlKHRoaXNbZXJyb3JEZWNvcmF0b3JdLCBtYXhNc2dMZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzW3dvcmRXcmFwRW5hYmxlZF0pXG4gICAgICAgICAgICBtc2cgPSB0aGlzLndvcmRXcmFwKG1zZywgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycywgbWF4TXNnTGVuZ3RoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXNnID0gdGhpcy5pbmRlbnRTdHJpbmcobXNnLCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcblxuICAgICAgICByZXR1cm4gcHJlZml4ICsgbXNnLnN1YnN0cihwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcbiAgICB9XG5cblxuICAgIC8vIFdyaXRpbmcgaGVscGVyc1xuICAgIHB1YmxpYyBuZXdsaW5lICgpOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzLl93cml0ZVRvVW5pcXVlU3RyZWFtKCdcXG4nKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUgKHRleHQ6IHN0cmluZyk6IFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgICAgIGlmICh0aGlzW3dvcmRXcmFwRW5hYmxlZF0pXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy53b3JkV3JhcCh0ZXh0LCB0aGlzW2luZGVudF0sIHRoaXMudmlld3BvcnRXaWR0aCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLmluZGVudFN0cmluZyh0ZXh0LCB0aGlzW2luZGVudF0pO1xuXG4gICAgICAgIHRoaXMuX3dyaXRlVG9VbmlxdWVTdHJlYW0odGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZVdvcmRXcmFwICh1c2U6IGJvb2xlYW4pOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzW3dvcmRXcmFwRW5hYmxlZF0gPSB1c2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEluZGVudCAodmFsOiBudW1iZXIpOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzW2luZGVudF0gPSB2YWw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JpdGVUb1VuaXF1ZVN0cmVhbSAodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1Db250cm9sbGVyIHx8IHRoaXMuc3RyZWFtQ29udHJvbGxlci5lbnN1cmVVbmlxdWVTdHJlYW0odGhpc1tzdHJlYW1dLCB0aGlzKSlcbiAgICAgICAgICAgIHRoaXNbc3RyZWFtXS53cml0ZSh0ZXh0KTtcbiAgICB9XG5cblxuICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gcGx1Z2luXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFRhc2tTdGFydCAoLyogc3RhcnRUaW1lLCB1c2VyQWdlbnRzLCB0ZXN0Q291bnQsIHRlc3RTdHJ1Y3R1cmUsIHRhc2tQcm9wZXJ0aWVzICovKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXBvcnRGaXh0dXJlU3RhcnQgKC8qIG5hbWUsIHBhdGggKi8pOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICAvLyBhc3luYyByZXBvcnRUZXN0U3RhcnQgKC8qIG5hbWUsIHRlc3RNZXRhICovKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgLy8gfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFRlc3REb25lICgvKiBuYW1lLCB0ZXN0UnVuSW5mbyAqLyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0VGFza0RvbmUgKC8qIGVuZFRpbWUsIHBhc3NlZCwgd2FybmluZ3MgKi8pOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICBwdWJsaWMgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIC8vIE9wdGlvbmFsXG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0V2FybmluZ3MgKC8qIHdhcm5pbmdzICovKTogUHJvbWlzZTx2b2lkPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfVxufVxuIl19