UNPKG

@testim/testim-cli

Version:

Command line interface for running Testing on you CI

384 lines (317 loc) 30.6 kB
'use strict'; var _createClass = require('babel-runtime/helpers/create-class')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _getIterator = require('babel-runtime/core-js/get-iterator')['default']; var _Object$keys = require('babel-runtime/core-js/object/keys')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; var _deepmerge = require('deepmerge'); var _deepmerge2 = _interopRequireDefault(_deepmerge); var _utilsConfigParser = require('./utils/ConfigParser'); var _utilsConfigParser2 = _interopRequireDefault(_utilsConfigParser); var _ = require('../'); var Runner = (function () { function Runner() { _classCallCheck(this, Runner); this.haltSIGINT = false; this.sigintWasCalled = false; this.hasSessionID = false; this.failures = 0; } _createClass(Runner, [{ key: 'run', value: function run(m) { var config, capabilities; return _regeneratorRuntime.async(function run$(context$2$0) { var _this = this; while (1) switch (context$2$0.prev = context$2$0.next) { case 0: this.cid = m.cid; this.configParser = new _utilsConfigParser2['default'](); this.configParser.addConfigFile(m.configFile); this.configParser.merge(m.argv); config = this.configParser.getConfig(); capabilities = this.configParser.getCapabilities(m.cid); this.framework = this.initialiseFramework(config); global.browser = this.initialiseInstance(m.isMultiremote, capabilities); this.initialisePlugins(config); /** * store end method before it gets fiberised by wdio-sync */ this.endSession = global.browser.end.bind(global.browser); /** * initialisation successful, send start message */ process.send({ event: 'runner:start', cid: m.cid, capabilities: capabilities, config: config }); /** * register runner events */ global.browser.on('init', function (payload) { process.send({ event: 'runner:init', cid: m.cid, sessionID: payload.sessionID, options: payload.options, desiredCapabilities: payload.desiredCapabilities }); _this.hasSessionID = true; }); global.browser.on('command', function (payload) { process.send({ event: 'runner:command', cid: m.cid, method: payload.method, uri: payload.uri, data: payload.data }); }); global.browser.on('result', function (payload) { process.send({ event: 'runner:result', cid: m.cid, requestData: payload.requestData, requestOptions: payload.requestOptions, body: payload.body // ToDo figure out if this slows down the execution time }); }); global.browser.on('error', function (payload) { process.send({ event: 'runner:error', cid: m.cid, err: payload.err, requestData: payload.requestData, requestOptions: payload.requestOptions, body: payload.body }); }); this.haltSIGINT = true; context$2$0.prev = 16; context$2$0.next = 19; return _regeneratorRuntime.awrap(global.browser.init()); case 19: this.haltSIGINT = false; /** * kill session of SIGINT signal showed up while trying to * get a session ID */ if (!this.sigintWasCalled) { context$2$0.next = 23; break; } context$2$0.next = 23; return _regeneratorRuntime.awrap(this.end(1)); case 23: context$2$0.next = 25; return _regeneratorRuntime.awrap(this.framework.run(m.cid, config, m.specs, capabilities)); case 25: this.failures = context$2$0.sent; context$2$0.next = 28; return _regeneratorRuntime.awrap(this.end(this.failures)); case 28: context$2$0.next = 35; break; case 30: context$2$0.prev = 30; context$2$0.t0 = context$2$0['catch'](16); process.send({ event: 'error', cid: this.cid, capabilities: capabilities, error: { message: context$2$0.t0.message, stack: context$2$0.t0.stack } }); context$2$0.next = 35; return _regeneratorRuntime.awrap(this.end(1)); case 35: case 'end': return context$2$0.stop(); } }, null, this, [[16, 30]]); } /** * end test runner instance and exit process */ }, { key: 'end', value: function end() { var failures = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; return _regeneratorRuntime.async(function end$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: if (!this.hasSessionID) { context$2$0.next = 3; break; } context$2$0.next = 3; return _regeneratorRuntime.awrap(this.endSession()); case 3: process.send({ event: 'runner:end', failures: failures, cid: this.cid }); process.exit(failures === 0 ? 0 : 1); case 5: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'sigintHandler', value: function sigintHandler() { if (this.sigintWasCalled) { return; } this.sigintWasCalled = true; if (this.haltSIGINT) { return; } global.browser.removeAllListeners(); this.end(1); } }, { key: 'initialiseFramework', value: function initialiseFramework(config) { if (typeof config.framework !== 'string') { throw new Error('You haven\'t defined a valid framework. ' + 'Please checkout http://webdriver.io/guide/testrunner/frameworks.html'); } var frameworkLibrary = config.framework.toLowerCase(); try { return require('wdio-' + frameworkLibrary + '-framework'); } catch (e) { throw new Error('Couldn\'t load "' + frameworkLibrary + '" framework. You need to install ' + ('it with `$ npm install wdio-' + frameworkLibrary + '-framework`!')); } } }, { key: 'initialiseInstance', value: function initialiseInstance(isMultiremote, capabilities) { var config = this.configParser.getConfig(); if (!isMultiremote) { config.desiredCapabilities = capabilities; return (0, _.remote)(config); } var options = capabilities; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = _getIterator(_Object$keys(options)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var browserName = _step.value; options[browserName] = (0, _deepmerge2['default'])(config, options[browserName]); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator['return']) { _iterator['return'](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var browser = (0, _.multiremote)(options); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = _getIterator(_Object$keys(options)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var browserName = _step2.value; global[browserName] = browser.select(browserName); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2['return']) { _iterator2['return'](); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return browser; } /** * initialise WebdriverIO compliant plugins */ }, { key: 'initialisePlugins', value: function initialisePlugins(config) { if (typeof config.plugins !== 'object') { return; } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = _getIterator(_Object$keys(config.plugins)), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var pluginName = _step3.value; var plugin = undefined; try { plugin = require(pluginName); } catch (e) { throw new Error('Couldn\'t find plugin "' + pluginName + '". You need to install it ' + ('with `$ npm install ' + pluginName + '`!')); } if (typeof plugin.init !== 'function') { throw new Error('The plugin "' + pluginName + '" is not WebdriverIO compliant!'); } plugin.init(global.browser, config.plugins[pluginName]); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3['return']) { _iterator3['return'](); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } }]); return Runner; })(); var runner = new Runner(); process.on('message', function (m) { runner[m.command](m)['catch'](function (e) { /** * custom exit code to propagate initialisation error */ process.send({ event: 'runner:error', error: { message: e.message, stack: e.stack }, capabilities: runner.configParser.getCapabilities(runner.cid), cid: runner.cid }); process.exit(1); }); }); /** * catches ctrl+c event */ process.on('SIGINT', function () { runner.sigintHandler(); }); //# sourceMappingURL=data:application/json;base64,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O0FBS0YsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBTTtBQUN2QixVQUFNLENBQUMsYUFBYSxFQUFFLENBQUE7Q0FDekIsQ0FBQyxDQUFBIiwiZmlsZSI6InJ1bm5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnXG5cbmltcG9ydCBDb25maWdQYXJzZXIgZnJvbSAnLi91dGlscy9Db25maWdQYXJzZXInXG5pbXBvcnQgeyByZW1vdGUsIG11bHRpcmVtb3RlIH0gZnJvbSAnLi4vJ1xuXG5jbGFzcyBSdW5uZXIge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5oYWx0U0lHSU5UID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaWdpbnRXYXNDYWxsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmhhc1Nlc3Npb25JRCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZmFpbHVyZXMgPSAwXG4gICAgfVxuXG4gICAgYXN5bmMgcnVuIChtKSB7XG4gICAgICAgIHRoaXMuY2lkID0gbS5jaWRcblxuICAgICAgICB0aGlzLmNvbmZpZ1BhcnNlciA9IG5ldyBDb25maWdQYXJzZXIoKVxuICAgICAgICB0aGlzLmNvbmZpZ1BhcnNlci5hZGRDb25maWdGaWxlKG0uY29uZmlnRmlsZSlcbiAgICAgICAgdGhpcy5jb25maWdQYXJzZXIubWVyZ2UobS5hcmd2KVxuXG4gICAgICAgIGxldCBjb25maWcgPSB0aGlzLmNvbmZpZ1BhcnNlci5nZXRDb25maWcoKVxuICAgICAgICBsZXQgY2FwYWJpbGl0aWVzID0gdGhpcy5jb25maWdQYXJzZXIuZ2V0Q2FwYWJpbGl0aWVzKG0uY2lkKVxuXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrID0gdGhpcy5pbml0aWFsaXNlRnJhbWV3b3JrKGNvbmZpZylcbiAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSB0aGlzLmluaXRpYWxpc2VJbnN0YW5jZShtLmlzTXVsdGlyZW1vdGUsIGNhcGFiaWxpdGllcylcbiAgICAgICAgdGhpcy5pbml0aWFsaXNlUGx1Z2lucyhjb25maWcpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHN0b3JlIGVuZCBtZXRob2QgYmVmb3JlIGl0IGdldHMgZmliZXJpc2VkIGJ5IHdkaW8tc3luY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmRTZXNzaW9uID0gZ2xvYmFsLmJyb3dzZXIuZW5kLmJpbmQoZ2xvYmFsLmJyb3dzZXIpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGluaXRpYWxpc2F0aW9uIHN1Y2Nlc3NmdWwsIHNlbmQgc3RhcnQgbWVzc2FnZVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOnN0YXJ0JyxcbiAgICAgICAgICAgIGNpZDogbS5jaWQsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlZ2lzdGVyIHJ1bm5lciBldmVudHNcbiAgICAgICAgICovXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdpbml0JywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc2VuZCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6aW5pdCcsXG4gICAgICAgICAgICAgICAgY2lkOiBtLmNpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSUQ6IHBheWxvYWQuc2Vzc2lvbklELFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHBheWxvYWQub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBkZXNpcmVkQ2FwYWJpbGl0aWVzOiBwYXlsb2FkLmRlc2lyZWRDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuaGFzU2Vzc2lvbklEID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdjb21tYW5kJywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc2VuZCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6Y29tbWFuZCcsXG4gICAgICAgICAgICAgICAgY2lkOiBtLmNpZCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBheWxvYWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIHVyaTogcGF5bG9hZC51cmksXG4gICAgICAgICAgICAgICAgZGF0YTogcGF5bG9hZC5kYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdyZXN1bHQnLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgICAgICBldmVudDogJ3J1bm5lcjpyZXN1bHQnLFxuICAgICAgICAgICAgICAgIGNpZDogbS5jaWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHBheWxvYWQucmVxdWVzdERhdGEsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHBheWxvYWQucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgYm9keTogcGF5bG9hZC5ib2R5IC8vIFRvRG8gZmlndXJlIG91dCBpZiB0aGlzIHNsb3dzIGRvd24gdGhlIGV4ZWN1dGlvbiB0aW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdlcnJvcicsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOmVycm9yJyxcbiAgICAgICAgICAgICAgICBjaWQ6IG0uY2lkLFxuICAgICAgICAgICAgICAgIGVycjogcGF5bG9hZC5lcnIsXG4gICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHBheWxvYWQucmVxdWVzdERhdGEsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHBheWxvYWQucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgYm9keTogcGF5bG9hZC5ib2R5XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaGFsdFNJR0lOVCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZ2xvYmFsLmJyb3dzZXIuaW5pdCgpXG4gICAgICAgICAgICB0aGlzLmhhbHRTSUdJTlQgPSBmYWxzZVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGtpbGwgc2Vzc2lvbiBvZiBTSUdJTlQgc2lnbmFsIHNob3dlZCB1cCB3aGlsZSB0cnlpbmcgdG9cbiAgICAgICAgICAgICAqIGdldCBhIHNlc3Npb24gSURcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnaW50V2FzQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmQoMSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mYWlsdXJlcyA9IGF3YWl0IHRoaXMuZnJhbWV3b3JrLnJ1bihtLmNpZCwgY29uZmlnLCBtLnNwZWNzLCBjYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVuZCh0aGlzLmZhaWx1cmVzKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNpZDogdGhpcy5jaWQsXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2s6IGUuc3RhY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVuZCgxKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZW5kIHRlc3QgcnVubmVyIGluc3RhbmNlIGFuZCBleGl0IHByb2Nlc3NcbiAgICAgKi9cbiAgICBhc3luYyBlbmQgKGZhaWx1cmVzID0gMCkge1xuICAgICAgICBpZiAodGhpcy5oYXNTZXNzaW9uSUQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5kU2Vzc2lvbigpXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6ZW5kJyxcbiAgICAgICAgICAgIGZhaWx1cmVzOiBmYWlsdXJlcyxcbiAgICAgICAgICAgIGNpZDogdGhpcy5jaWRcbiAgICAgICAgfSlcbiAgICAgICAgcHJvY2Vzcy5leGl0KGZhaWx1cmVzID09PSAwID8gMCA6IDEpXG4gICAgfVxuXG4gICAgc2lnaW50SGFuZGxlciAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ2ludFdhc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNpZ2ludFdhc0NhbGxlZCA9IHRydWVcblxuICAgICAgICBpZiAodGhpcy5oYWx0U0lHSU5UKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgICAgIHRoaXMuZW5kKDEpXG4gICAgfVxuXG4gICAgaW5pdGlhbGlzZUZyYW1ld29yayAoY29uZmlnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmZyYW1ld29yayAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgWW91IGhhdmVuJ3QgZGVmaW5lZCBhIHZhbGlkIGZyYW1ld29yay4gYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSBjaGVja291dCBodHRwOi8vd2ViZHJpdmVyLmlvL2d1aWRlL3Rlc3RydW5uZXIvZnJhbWV3b3Jrcy5odG1sYFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZyYW1ld29ya0xpYnJhcnkgPSBjb25maWcuZnJhbWV3b3JrLnRvTG93ZXJDYXNlKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKGB3ZGlvLSR7ZnJhbWV3b3JrTGlicmFyeX0tZnJhbWV3b3JrYClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZG4ndCBsb2FkIFwiJHtmcmFtZXdvcmtMaWJyYXJ5fVwiIGZyYW1ld29yay4gWW91IG5lZWQgdG8gaW5zdGFsbCBgICtcbiAgICAgICAgICAgICAgICBgaXQgd2l0aCBcXGAkIG5wbSBpbnN0YWxsIHdkaW8tJHtmcmFtZXdvcmtMaWJyYXJ5fS1mcmFtZXdvcmtcXGAhYFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGlzZUluc3RhbmNlIChpc011bHRpcmVtb3RlLCBjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHRoaXMuY29uZmlnUGFyc2VyLmdldENvbmZpZygpXG5cbiAgICAgICAgaWYgKCFpc011bHRpcmVtb3RlKSB7XG4gICAgICAgICAgICBjb25maWcuZGVzaXJlZENhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZShjb25maWcpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IGNhcGFiaWxpdGllc1xuICAgICAgICBmb3IgKGxldCBicm93c2VyTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9uc1ticm93c2VyTmFtZV0gPSBtZXJnZShjb25maWcsIG9wdGlvbnNbYnJvd3Nlck5hbWVdKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJyb3dzZXIgPSBtdWx0aXJlbW90ZShvcHRpb25zKVxuICAgICAgICBmb3IgKGxldCBicm93c2VyTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgICAgICAgICAgZ2xvYmFsW2Jyb3dzZXJOYW1lXSA9IGJyb3dzZXIuc2VsZWN0KGJyb3dzZXJOYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaW5pdGlhbGlzZSBXZWJkcml2ZXJJTyBjb21wbGlhbnQgcGx1Z2luc1xuICAgICAqL1xuICAgIGluaXRpYWxpc2VQbHVnaW5zIChjb25maWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcucGx1Z2lucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgcGx1Z2luTmFtZSBvZiBPYmplY3Qua2V5cyhjb25maWcucGx1Z2lucykpIHtcbiAgICAgICAgICAgIGxldCBwbHVnaW5cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4gPSByZXF1aXJlKHBsdWdpbk5hbWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgZmluZCBwbHVnaW4gXCIke3BsdWdpbk5hbWV9XCIuIFlvdSBuZWVkIHRvIGluc3RhbGwgaXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3aXRoIFxcYCQgbnBtIGluc3RhbGwgJHtwbHVnaW5OYW1lfVxcYCFgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5pbml0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGx1Z2luIFwiJHtwbHVnaW5OYW1lfVwiIGlzIG5vdCBXZWJkcml2ZXJJTyBjb21wbGlhbnQhYClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGx1Z2luLmluaXQoZ2xvYmFsLmJyb3dzZXIsIGNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgcnVubmVyID0gbmV3IFJ1bm5lcigpXG5cbnByb2Nlc3Mub24oJ21lc3NhZ2UnLCAobSkgPT4ge1xuICAgIHJ1bm5lclttLmNvbW1hbmRdKG0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjdXN0b20gZXhpdCBjb2RlIHRvIHByb3BhZ2F0ZSBpbml0aWFsaXNhdGlvbiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOmVycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN0YWNrOiBlLnN0YWNrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBydW5uZXIuY29uZmlnUGFyc2VyLmdldENhcGFiaWxpdGllcyhydW5uZXIuY2lkKSxcbiAgICAgICAgICAgIGNpZDogcnVubmVyLmNpZFxuICAgICAgICB9KVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9KVxufSlcblxuLyoqXG4gKiBjYXRjaGVzIGN0cmwrYyBldmVudFxuICovXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgcnVubmVyLnNpZ2ludEhhbmRsZXIoKVxufSlcbiJdfQ==