UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

134 lines 19.8 kB
"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 os_family_1 = __importDefault(require("os-family")); const string_1 = require("../utils/string"); const get_viewport_width_1 = __importDefault(require("../utils/get-viewport-width")); // NOTE: we should not expose internal state to // the plugin, to avoid accidental rewrites. // Therefore we use symbols to store them. /*global Symbol*/ 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 = get_viewport_width_1.default(this[stream]); this.symbols = os_family_1.default.win ? { ok: '√', err: '×' } : { ok: '✓', err: '✖' }; 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), '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 indent_string_1.default(str, ' ', indentVal); } wordWrap(str, indentVal, width) { return string_1.wordWrap(str, indentVal, width); } escapeHtml(str) { return lodash_1.escape(str); } formatError(err, prefix = '') { const prefixLengthWithoutColors = 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'); } } exports.default = ReporterPluginHost; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsa0VBQXlDO0FBQ3pDLG1DQUFrRTtBQUNsRSwyRUFBNEM7QUFDNUMsMERBQTJCO0FBQzNCLDRDQUE0RDtBQUM1RCxxRkFBMkQ7QUFFM0QsK0NBQStDO0FBQy9DLDRDQUE0QztBQUM1QywwQ0FBMEM7QUFFMUMsaUJBQWlCO0FBQ2pCLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sY0FBYyxHQUFJLE1BQU0sRUFBRSxDQUFDO0FBRWpDLE1BQXFCLGtCQUFrQjtJQUNuQyxZQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSTtRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFlLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxDQUFDLENBQUM7UUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksZUFBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFdkYsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLGVBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMs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LEVBQUUsSUFBSSxDQUFDO1lBQ3RGLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUdELHlDQUF5QztJQUN6QyxLQUFLLENBQUMsZUFBZSxFQUFFLHFFQUFxRTtRQUN4RixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0I7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsaURBQWlEO0lBQ2pELDBDQUEwQztJQUMxQyxJQUFJO0lBRUosS0FBSyxDQUFDLGNBQWMsRUFBRSx1QkFBdUI7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLCtCQUErQjtRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNKO0FBbkpELHFDQW1KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgaW5kZW50U3RyaW5nIGZyb20gJ2luZGVudC1zdHJpbmcnO1xuaW1wb3J0IHsgaWRlbnRpdHksIGVzY2FwZSBhcyBlc2NhcGVIdG1sLCBhc3NpZ25JbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uL3V0aWxzL21vbWVudC1sb2FkZXInO1xuaW1wb3J0IE9TIGZyb20gJ29zLWZhbWlseSc7XG5pbXBvcnQgeyB3b3JkV3JhcCwgcmVtb3ZlVFRZQ29sb3JzIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCBnZXRWaWV3cG9ydFdpZHRoIGZyb20gJy4uL3V0aWxzL2dldC12aWV3cG9ydC13aWR0aCc7XG5cbi8vIE5PVEU6IHdlIHNob3VsZCBub3QgZXhwb3NlIGludGVybmFsIHN0YXRlIHRvXG4vLyB0aGUgcGx1Z2luLCB0byBhdm9pZCBhY2NpZGVudGFsIHJld3JpdGVzLlxuLy8gVGhlcmVmb3JlIHdlIHVzZSBzeW1ib2xzIHRvIHN0b3JlIHRoZW0uXG5cbi8qZ2xvYmFsIFN5bWJvbCovXG5jb25zdCBzdHJlYW0gICAgICAgICAgPSBTeW1ib2woKTtcbmNvbnN0IHdvcmRXcmFwRW5hYmxlZCA9IFN5bWJvbCgpO1xuY29uc3QgaW5kZW50ICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCBlcnJvckRlY29yYXRvciAgPSBTeW1ib2woKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJQbHVnaW5Ib3N0IHtcbiAgICBjb25zdHJ1Y3RvciAocGx1Z2luLCBvdXRTdHJlYW0sIG5hbWUpIHtcbiAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICAgID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbnVsbDtcblxuICAgICAgICB0aGlzW3N0cmVhbV0gICAgICAgICAgPSBvdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHRoaXNbd29yZFdyYXBFbmFibGVkXSA9IGZhbHNlO1xuICAgICAgICB0aGlzW2luZGVudF0gICAgICAgICAgPSAwO1xuXG4gICAgICAgIGNvbnN0IHVzZUNvbG9ycyA9IHRoaXNbc3RyZWFtXSA9PT0gcHJvY2Vzcy5zdGRvdXQgJiYgY2hhbGsuZW5hYmxlZCAmJiAhcGx1Z2luLm5vQ29sb3JzO1xuXG4gICAgICAgIHRoaXMuY2hhbGsgICAgICAgICA9IG5ldyBjaGFsay5jb25zdHJ1Y3Rvcih7IGVuYWJsZWQ6IHVzZUNvbG9ycyB9KTtcbiAgICAgICAgdGhpcy5tb21lbnQgICAgICAgID0gbW9tZW50O1xuICAgICAgICB0aGlzLnZpZXdwb3J0V2lkdGggPSBnZXRWaWV3cG9ydFdpZHRoKHRoaXNbc3RyZWFtXSk7XG5cbiAgICAgICAgdGhpcy5zeW1ib2xzID0gT1Mud2luID9cbiAgICAgICAgICAgIHsgb2s6ICfiiJonLCBlcnI6ICfDlycgfSA6XG4gICAgICAgICAgICB7IG9rOiAn4pyTJywgZXJyOiAn4pyWJyB9O1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpc1tlcnJvckRlY29yYXRvcl0gPSB0aGlzLmNyZWF0ZUVycm9yRGVjb3JhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3IgZGVjb3JhdG9yXG4gICAgY3JlYXRlRXJyb3JEZWNvcmF0b3IgKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3NwYW4gdXNlci1hZ2VudCc6IHN0ciA9PiB0aGlzLmNoYWxrLmdyZXkoc3RyKSxcblxuICAgICAgICAgICAgJ3NwYW4gc3VidGl0bGUnOiBzdHIgPT4gYC0gJHt0aGlzLmNoYWxrLmJvbGQucmVkKHN0cil9IC1gLFxuICAgICAgICAgICAgJ2RpdiBtZXNzYWdlJzogICBzdHIgPT4gdGhpcy5jaGFsay5ib2xkLnJlZChzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IHNjcmVlbnNob3QtaW5mbyc6IGlkZW50aXR5LFxuICAgICAgICAgICAgJ2Egc2NyZWVuc2hvdC1wYXRoJzogICBzdHIgPT4gdGhpcy5jaGFsay5ncmV5LnVuZGVybGluZShzdHIpLFxuXG4gICAgICAgICAgICAnY29kZSc6IGlkZW50aXR5LFxuXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtc3RyaW5nJzogICAgIHN0ciA9PiB0aGlzLmNoYWxrLmdyZWVuKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtcHVuY3R1YXRvcic6IHN0ciA9PiB0aGlzLmNoYWxrLmdyZXkoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1rZXl3b3JkJzogICAgc3RyID0+IHRoaXMuY2hhbGsuY3lhbihzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LW51bWJlcic6ICAgICBzdHIgPT4gdGhpcy5jaGFsay5tYWdlbnRhKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtcmVnZXgnOiAgICAgIHN0ciA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1jb21tZW50JzogICAgc3RyID0+IHRoaXMuY2hhbGsuZ3JleS5ib2xkKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtaW52YWxpZCc6ICAgIHN0ciA9PiB0aGlzLmNoYWxrLmludmVyc2Uoc3RyKSxcblxuICAgICAgICAgICAgJ2RpdiBjb2RlLWZyYW1lJzogICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lJzogICAgICAgICAgc3RyID0+IHN0ciArICdcXG4nLFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbGFzdCc6ICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLW51bSc6ICAgICAgc3RyID0+IGAgICAke3N0cn0gfGAsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1udW0tYmFzZSc6IHN0ciA9PiB0aGlzLmNoYWxrLmJnUmVkKGAgPiAke3N0cn0gYCkgKyAnfCcsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1zcmMnOiAgICAgIGlkZW50aXR5LFxuXG4gICAgICAgICAgICAnZGl2IHN0YWNrJzogICAgICAgICAgICAgICBzdHIgPT4gJ1xcblxcbicgKyBzdHIsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUnOiAgICAgICAgICBzdHIgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbGFzdCc6ICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1uYW1lJzogICAgIHN0ciA9PiBgICAgYXQgJHt0aGlzLmNoYWxrLmJvbGQoc3RyKX1gLFxuICAgICAgICAgICAgJ2RpdiBzdGFjay1saW5lLWxvY2F0aW9uJzogc3RyID0+IGAgKCR7dGhpcy5jaGFsay5ncmV5LnVuZGVybGluZShzdHIpfSlgLFxuXG4gICAgICAgICAgICAnc3Ryb25nJzogc3RyID0+IHRoaXMuY2hhbGsuYm9sZChzdHIpLFxuICAgICAgICAgICAgJ2EnOiAgICAgIHN0ciA9PiBgXCIke3RoaXMuY2hhbGsudW5kZXJsaW5lKHN0cil9XCJgXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIGhlbHBlcnNcbiAgICBpbmRlbnRTdHJpbmcgKHN0ciwgaW5kZW50VmFsKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRTdHJpbmcoc3RyLCAnICcsIGluZGVudFZhbCk7XG4gICAgfVxuXG4gICAgd29yZFdyYXAgKHN0ciwgaW5kZW50VmFsLCB3aWR0aCkge1xuICAgICAgICByZXR1cm4gd29yZFdyYXAoc3RyLCBpbmRlbnRWYWwsIHdpZHRoKTtcbiAgICB9XG5cbiAgICBlc2NhcGVIdG1sIChzdHIpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZUh0bWwoc3RyKTtcbiAgICB9XG5cbiAgICBmb3JtYXRFcnJvciAoZXJyLCBwcmVmaXggPSAnJykge1xuICAgICAgICBjb25zdCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzID0gcmVtb3ZlVFRZQ29sb3JzKHByZWZpeCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBtYXhNc2dMZW5ndGggICAgICAgICAgICAgID0gdGhpcy52aWV3cG9ydFdpZHRoIC0gdGhpc1tpbmRlbnRdIC0gcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycztcbiAgICAgICAgbGV0IG1zZyAgICAgICAgICAgICAgICAgICAgICAgICA9IGVyci5mb3JtYXRNZXNzYWdlKHRoaXNbZXJyb3JEZWNvcmF0b3JdLCBtYXhNc2dMZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzW3dvcmRXcmFwRW5hYmxlZF0pXG4gICAgICAgICAgICBtc2cgPSB0aGlzLndvcmRXcmFwKG1zZywgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycywgbWF4TXNnTGVuZ3RoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXNnID0gdGhpcy5pbmRlbnRTdHJpbmcobXNnLCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcblxuICAgICAgICByZXR1cm4gcHJlZml4ICsgbXNnLnN1YnN0cihwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcbiAgICB9XG5cblxuICAgIC8vIFdyaXRpbmcgaGVscGVyc1xuICAgIG5ld2xpbmUgKCkge1xuICAgICAgICB0aGlzLl93cml0ZVRvVW5pcXVlU3RyZWFtKCdcXG4nKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3cml0ZSAodGV4dCkge1xuICAgICAgICBpZiAodGhpc1t3b3JkV3JhcEVuYWJsZWRdKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMud29yZFdyYXAodGV4dCwgdGhpc1tpbmRlbnRdLCB0aGlzLnZpZXdwb3J0V2lkdGgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy5pbmRlbnRTdHJpbmcodGV4dCwgdGhpc1tpbmRlbnRdKTtcblxuICAgICAgICB0aGlzLl93cml0ZVRvVW5pcXVlU3RyZWFtKHRleHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVzZVdvcmRXcmFwICh1c2UpIHtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gdXNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNldEluZGVudCAodmFsKSB7XG4gICAgICAgIHRoaXNbaW5kZW50XSA9IHZhbDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfd3JpdGVUb1VuaXF1ZVN0cmVhbSAodGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtQ29udHJvbGxlciB8fCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuZW5zdXJlVW5pcXVlU3RyZWFtKHRoaXNbc3RyZWFtXSwgdGhpcykpXG4gICAgICAgICAgICB0aGlzW3N0cmVhbV0ud3JpdGUodGV4dCk7XG4gICAgfVxuXG5cbiAgICAvLyBBYnN0cmFjdCBtZXRob2RzIGltcGxlbWVudGVkIGluIHBsdWdpblxuICAgIGFzeW5jIHJlcG9ydFRhc2tTdGFydCAoLyogc3RhcnRUaW1lLCB1c2VyQWdlbnRzLCB0ZXN0Q291bnQsIHRlc3RTdHJ1Y3R1cmUsIHRhc2tQcm9wZXJ0aWVzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVwb3J0Rml4dHVyZVN0YXJ0ICgvKiBuYW1lLCBwYXRoICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICAvLyBhc3luYyByZXBvcnRUZXN0U3RhcnQgKC8qIG5hbWUsIHRlc3RNZXRhICovKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgLy8gfVxuXG4gICAgYXN5bmMgcmVwb3J0VGVzdERvbmUgKC8qIG5hbWUsIHRlc3RSdW5JbmZvICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVwb3J0VGFza0RvbmUgKC8qIGVuZFRpbWUsIHBhc3NlZCwgd2FybmluZ3MgKi8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG59XG4iXX0=