UNPKG

@testim/testim-cli

Version:

Command line interface for running Testing on you CI

272 lines (239 loc) 32.4 kB
'use strict'; var _getIterator = require('babel-runtime/core-js/get-iterator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _ejs = require('ejs'); var _ejs2 = _interopRequireDefault(_ejs); var _inquirer = require('inquirer'); var _inquirer2 = _interopRequireDefault(_inquirer); var _optimist = require('optimist'); var _optimist2 = _interopRequireDefault(_optimist); var _launcher = require('./launcher'); var _launcher2 = _interopRequireDefault(_launcher); var _packageJson = require('../package.json'); var _packageJson2 = _interopRequireDefault(_packageJson); var VERSION = _packageJson2['default'].version; var ALLOWED_ARGV = ['host', 'port', 'path', 'user', 'key', 'updateJob', 'logLevel', 'coloredLogs', 'screenshotPath', 'baseUrl', 'waitforTimeout', 'framework', 'reporter', 'cucumberOpts', 'jasmineOpts', 'mochaOpts']; _optimist2['default'].usage('WebdriverIO CLI runner\n\n' + 'Usage: wdio [options] [configFile]\n' + 'config file defaults to wdio.conf.js\n' + 'The [options] object will override values from the config file.').describe('help', 'prints WebdriverIO help menu').alias('help', 'h').describe('version', 'prints WebdriverIO version').alias('version', 'v').describe('host', 'Selenium server host address').describe('port', 'Selenium server port').describe('path', 'Selenium server path (default: /wd/hub)').describe('user', 'username if using a cloud service as Selenium backend').alias('user', 'u').describe('key', 'corresponding access key to the user').alias('key', 'k').describe('updateJob', 'if true update job properties for Sauce Labs job (default: true)').describe('logLevel', 'level of logging verbosity (default: silent)').alias('logLevel', 'l').describe('coloredLogs', 'if true enables colors for log output (default: true)').alias('coloredLogs', 'c').describe('screenshotPath', 'saves a screenshot to a given path if a command fails').alias('screenshotPath', 's').describe('baseUrl', 'shorten url command calls by setting a base url').alias('baseUrl', 'b').describe('waitforTimeout', 'timeout for all waitForXXX commands (default: 500ms)').alias('waitforTimeout', 'w').describe('framework', 'defines the framework (Mocha, Jasmine or Cucumber) to run the specs (default: mocha)').alias('framework', 'f').describe('reporter', 'reporter to print out the results on stdout').alias('reporter', 'r').describe('cucumberOpts.tags', 'run only certain scenarios annotated by tags').describe('cucumberOpts.ignoreUndefinedDefinitions', 'ignore undefined step definitions').describe('cucumberOpts.require', 'specify where your step definitions are located').describe('jasmineOpts.defaultTimeoutInterval', 'Jasmine default timeout').describe('mochaOpts.ui', 'specify user-interface').describe('mochaOpts.timeout', 'set test-case timeout in milliseconds').describe('mochaOpts.require', 'require the given module').describe('mochaOpts.compilers', 'use the given module(s) to compile files').check(function (arg) { if (arg._.length > 1) { throw new Error('Error: more than one config file specified'); } }); var argv = _optimist2['default'].parse(process.argv.slice(2)); if (argv.help) { _optimist2['default'].showHelp(); process.exit(0); } if (argv.version) { console.log('v' + VERSION); process.exit(0); } if (argv._[0] === 'config') { console.log('\n=========================\nWDIO Configuration Helper\n=========================\n'); _inquirer2['default'].prompt([{ type: 'list', name: 'backend', message: 'Where do you want to execute your tests?', choices: ['On my local machine', 'In the cloud using Sauce Labs, Browsertack or Testingbot', 'In the cloud using a different service', 'I have my own Selenium cloud'] }, { type: 'input', name: 'host', message: 'What is the host address of that cloud service?', when: function when(answers) { return answers.backend.indexOf('different service') > -1; } }, { type: 'input', name: 'port', message: 'What is the port on which that service is running?', 'default': '80', when: function when(answers) { return answers.backend.indexOf('different service') > -1; } }, { type: 'input', name: 'env_user', message: 'Environment letiable for username', 'default': 'SAUCE_USERNAME', when: function when(answers) { return answers.backend.indexOf('In the cloud') > -1; } }, { type: 'input', name: 'env_key', message: 'Environment letiable for access key', 'default': 'SAUCE_ACCESS_KEY', when: function when(answers) { return answers.backend.indexOf('In the cloud') > -1; } }, { type: 'input', name: 'host', message: 'What is the IP or URI to your Selenium standalone server?', 'default': '0.0.0.0', when: function when(answers) { return answers.backend.indexOf('own Selenium cloud') > -1; } }, { type: 'input', name: 'port', message: 'What is the port which your Selenium standalone server is running on?', 'default': '4444', when: function when(answers) { return answers.backend.indexOf('own Selenium cloud') > -1; } }, { type: 'input', name: 'path', message: 'What is the path to your Selenium standalone server?', 'default': '/wd/hub', when: function when(answers) { return answers.backend.indexOf('own Selenium cloud') > -1; } }, { type: 'list', name: 'framework', message: 'Which framework do you want to use?', choices: ['mocha', 'jasmine', 'cucumber'] }, { type: 'input', name: 'specs', message: 'Where are your test specs located?', 'default': './test/specs/**/*.js', when: function when(answers) { return answers.framework.match(/(mocha|jasmine)/); } }, { type: 'input', name: 'specs', message: 'Where are your feature files located?', 'default': './features/**/*.feature', when: function when(answers) { return answers.framework === 'cucumber'; } }, { type: 'input', name: 'stepDefinitions', message: 'Where are your step definitions located?', 'default': './features/step-definitions/**/*.js', when: function when(answers) { return answers.framework === 'cucumber'; } }, { type: 'list', name: 'reporter', message: 'Which reporter do you want to use? (see http://webdriver.io/guide/testrunner/reporters.html)', choices: ['dot', 'spec', 'xunit'] }, { type: 'input', name: 'outputDir', message: 'In which directory should the xunit reports get stored?', 'default': './', when: function when(answers) { return answers.reporter === 'xunit'; } }, { type: 'list', name: 'logLevel', message: 'Level of logging verbosity', 'default': 'silent', choices: ['silent', 'verbose', 'command', 'data', 'result', 'error'] }, { type: 'input', name: 'screenshotPath', message: 'In which directory should screenshots gets saved if a command fails?', 'default': './errorShots/' }, { type: 'input', name: 'baseUrl', message: 'What is the base url?', 'default': 'http://localhost' }], function (answers) { var tpl = _fs2['default'].readFileSync(__dirname + '/helpers/wdio.conf.ejs', 'utf8'); var renderedTpl = _ejs2['default'].render(tpl, { answers: answers }); _fs2['default'].writeFileSync(_path2['default'].join(process.cwd(), 'wdio.conf.js'), renderedTpl); console.log('\nConfiguration file was created successfully!\nTo run your tests, execute:\n\n $ wdio wdio.conf.js\n'); process.exit(0); }); } /** * sanitize cucumberOpts */ if (argv.cucumberOpts) { if (argv.cucumberOpts.tags) { argv.cucumberOpts.tags = argv.cucumberOpts.tags.split(','); } if (argv.cucumberOpts.ignoreUndefinedDefinitions) { argv.cucumberOpts.ignoreUndefinedDefinitions = argv.cucumberOpts.ignoreUndefinedDefinitions === 'true'; } if (argv.cucumberOpts.require) { argv.cucumberOpts.require = argv.cucumberOpts.require.split(','); } } /** * sanitize jasmineOpts */ if (argv.jasmineOpts && argv.jasmineOpts.defaultTimeoutInterval) { argv.jasmineOpts.defaultTimeoutInterval = parseInt(argv.jasmineOpts.defaultTimeoutInterval, 10); } /** * sanitize mochaOpts */ if (argv.mochaOpts) { if (argv.mochaOpts.timeout) { argv.mochaOpts.timeout = parseInt(argv.mochaOpts.timeout, 10); } if (argv.mochaOpts.compilers) { argv.mochaOpts.compilers = argv.mochaOpts.compilers.split(','); } if (argv.mochaOpts.require) { argv.mochaOpts.require = argv.mochaOpts.require.split(','); } } // Use default configuration, if it exists. var configFile = argv._[0]; if (!configFile) { if (_fs2['default'].existsSync('./wdio.conf.js')) { configFile = './wdio.conf.js'; } } var args = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = _getIterator(ALLOWED_ARGV), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; if (argv[key]) { args[key] = argv[key]; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator['return']) { _iterator['return'](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var launcher = new _launcher2['default'](configFile, args); launcher.run().then(function (exitCode) { if (exitCode instanceof Error) { return process.nextTick(function () { throw exitCode; }); } process.exit(exitCode); }); //# sourceMappingURL=data:application/json;base64,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QUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0FBQ3hCLFlBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUM3RDtDQUNKOzs7QUFHRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDYixRQUFJLGdCQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2pDLGtCQUFVLEdBQUcsZ0JBQWdCLENBQUE7S0FDaEM7Q0FDSjs7QUFFRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7Ozs7OztBQUNiLHNDQUFnQixZQUFZLDRHQUFFO1lBQXJCLEdBQUc7O0FBQ1IsWUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDWCxnQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUN4QjtLQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUQsSUFBSSxRQUFRLEdBQUcsMEJBQWEsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQzdDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxRQUFRLEVBQUs7QUFDOUIsUUFBSSxRQUFRLFlBQVksS0FBSyxFQUFFO0FBQzNCLGVBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFNO0FBQUUsa0JBQU0sUUFBUSxDQUFBO1NBQUUsQ0FBQyxDQUFBO0tBQ3BEOztBQUVELFdBQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7Q0FDekIsQ0FBQyxDQUFBIiwiZmlsZSI6ImNsaS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IGVqcyBmcm9tICdlanMnXG5pbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInXG5pbXBvcnQgb3B0aW1pc3QgZnJvbSAnb3B0aW1pc3QnXG5cbmltcG9ydCBMYXVuY2hlciBmcm9tICcuL2xhdW5jaGVyJ1xuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IFZFUlNJT04gPSBwa2cudmVyc2lvblxuY29uc3QgQUxMT1dFRF9BUkdWID0gWydob3N0JywgJ3BvcnQnLCAncGF0aCcsICd1c2VyJywgJ2tleScsICd1cGRhdGVKb2InLCAnbG9nTGV2ZWwnLCAnY29sb3JlZExvZ3MnLCAnc2NyZWVuc2hvdFBhdGgnLFxuICAgICAgICAgICAgICAgICAgICAgICdiYXNlVXJsJywgJ3dhaXRmb3JUaW1lb3V0JywgJ2ZyYW1ld29yaycsICdyZXBvcnRlcicsICdjdWN1bWJlck9wdHMnLCAnamFzbWluZU9wdHMnLCAnbW9jaGFPcHRzJ11cblxub3B0aW1pc3RcbiAgICAudXNhZ2UoJ1dlYmRyaXZlcklPIENMSSBydW5uZXJcXG5cXG4nICtcbiAgICAgICAgJ1VzYWdlOiB3ZGlvIFtvcHRpb25zXSBbY29uZmlnRmlsZV1cXG4nICtcbiAgICAgICAgJ2NvbmZpZyBmaWxlIGRlZmF1bHRzIHRvIHdkaW8uY29uZi5qc1xcbicgK1xuICAgICAgICAnVGhlIFtvcHRpb25zXSBvYmplY3Qgd2lsbCBvdmVycmlkZSB2YWx1ZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUuJylcblxuICAgIC5kZXNjcmliZSgnaGVscCcsICdwcmludHMgV2ViZHJpdmVySU8gaGVscCBtZW51JylcbiAgICAuYWxpYXMoJ2hlbHAnLCAnaCcpXG4gICAgLmRlc2NyaWJlKCd2ZXJzaW9uJywgJ3ByaW50cyBXZWJkcml2ZXJJTyB2ZXJzaW9uJylcbiAgICAuYWxpYXMoJ3ZlcnNpb24nLCAndicpXG4gICAgLmRlc2NyaWJlKCdob3N0JywgJ1NlbGVuaXVtIHNlcnZlciBob3N0IGFkZHJlc3MnKVxuICAgIC5kZXNjcmliZSgncG9ydCcsICdTZWxlbml1bSBzZXJ2ZXIgcG9ydCcpXG4gICAgLmRlc2NyaWJlKCdwYXRoJywgJ1NlbGVuaXVtIHNlcnZlciBwYXRoIChkZWZhdWx0OiAvd2QvaHViKScpXG4gICAgLmRlc2NyaWJlKCd1c2VyJywgJ3VzZXJuYW1lIGlmIHVzaW5nIGEgY2xvdWQgc2VydmljZSBhcyBTZWxlbml1bSBiYWNrZW5kJylcbiAgICAuYWxpYXMoJ3VzZXInLCAndScpXG4gICAgLmRlc2NyaWJlKCdrZXknLCAnY29ycmVzcG9uZGluZyBhY2Nlc3Mga2V5IHRvIHRoZSB1c2VyJylcbiAgICAuYWxpYXMoJ2tleScsICdrJylcbiAgICAuZGVzY3JpYmUoJ3VwZGF0ZUpvYicsICdpZiB0cnVlIHVwZGF0ZSBqb2IgcHJvcGVydGllcyBmb3IgU2F1Y2UgTGFicyBqb2IgKGRlZmF1bHQ6IHRydWUpJylcbiAgICAuZGVzY3JpYmUoJ2xvZ0xldmVsJywgJ2xldmVsIG9mIGxvZ2dpbmcgdmVyYm9zaXR5IChkZWZhdWx0OiBzaWxlbnQpJylcbiAgICAuYWxpYXMoJ2xvZ0xldmVsJywgJ2wnKVxuICAgIC5kZXNjcmliZSgnY29sb3JlZExvZ3MnLCAnaWYgdHJ1ZSBlbmFibGVzIGNvbG9ycyBmb3IgbG9nIG91dHB1dCAoZGVmYXVsdDogdHJ1ZSknKVxuICAgIC5hbGlhcygnY29sb3JlZExvZ3MnLCAnYycpXG4gICAgLmRlc2NyaWJlKCdzY3JlZW5zaG90UGF0aCcsICdzYXZlcyBhIHNjcmVlbnNob3QgdG8gYSBnaXZlbiBwYXRoIGlmIGEgY29tbWFuZCBmYWlscycpXG4gICAgLmFsaWFzKCdzY3JlZW5zaG90UGF0aCcsICdzJylcbiAgICAuZGVzY3JpYmUoJ2Jhc2VVcmwnLCAnc2hvcnRlbiB1cmwgY29tbWFuZCBjYWxscyBieSBzZXR0aW5nIGEgYmFzZSB1cmwnKVxuICAgIC5hbGlhcygnYmFzZVVybCcsICdiJylcbiAgICAuZGVzY3JpYmUoJ3dhaXRmb3JUaW1lb3V0JywgJ3RpbWVvdXQgZm9yIGFsbCB3YWl0Rm9yWFhYIGNvbW1hbmRzIChkZWZhdWx0OiA1MDBtcyknKVxuICAgIC5hbGlhcygnd2FpdGZvclRpbWVvdXQnLCAndycpXG4gICAgLmRlc2NyaWJlKCdmcmFtZXdvcmsnLCAnZGVmaW5lcyB0aGUgZnJhbWV3b3JrIChNb2NoYSwgSmFzbWluZSBvciBDdWN1bWJlcikgdG8gcnVuIHRoZSBzcGVjcyAoZGVmYXVsdDogbW9jaGEpJylcbiAgICAuYWxpYXMoJ2ZyYW1ld29yaycsICdmJylcbiAgICAuZGVzY3JpYmUoJ3JlcG9ydGVyJywgJ3JlcG9ydGVyIHRvIHByaW50IG91dCB0aGUgcmVzdWx0cyBvbiBzdGRvdXQnKVxuICAgIC5hbGlhcygncmVwb3J0ZXInLCAncicpXG4gICAgLmRlc2NyaWJlKCdjdWN1bWJlck9wdHMudGFncycsICdydW4gb25seSBjZXJ0YWluIHNjZW5hcmlvcyBhbm5vdGF0ZWQgYnkgdGFncycpXG4gICAgLmRlc2NyaWJlKCdjdWN1bWJlck9wdHMuaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnMnLCAnaWdub3JlIHVuZGVmaW5lZCBzdGVwIGRlZmluaXRpb25zJylcbiAgICAuZGVzY3JpYmUoJ2N1Y3VtYmVyT3B0cy5yZXF1aXJlJywgJ3NwZWNpZnkgd2hlcmUgeW91ciBzdGVwIGRlZmluaXRpb25zIGFyZSBsb2NhdGVkJylcbiAgICAuZGVzY3JpYmUoJ2phc21pbmVPcHRzLmRlZmF1bHRUaW1lb3V0SW50ZXJ2YWwnLCAnSmFzbWluZSBkZWZhdWx0IHRpbWVvdXQnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLnVpJywgJ3NwZWNpZnkgdXNlci1pbnRlcmZhY2UnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLnRpbWVvdXQnLCAnc2V0IHRlc3QtY2FzZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcycpXG4gICAgLmRlc2NyaWJlKCdtb2NoYU9wdHMucmVxdWlyZScsICdyZXF1aXJlIHRoZSBnaXZlbiBtb2R1bGUnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLmNvbXBpbGVycycsICd1c2UgdGhlIGdpdmVuIG1vZHVsZShzKSB0byBjb21waWxlIGZpbGVzJylcblxuICAgIC5jaGVjaygoYXJnKSA9PiB7XG4gICAgICAgIGlmIChhcmcuXy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yOiBtb3JlIHRoYW4gb25lIGNvbmZpZyBmaWxlIHNwZWNpZmllZCcpXG4gICAgICAgIH1cbiAgICB9KVxuXG5sZXQgYXJndiA9IG9wdGltaXN0LnBhcnNlKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcblxuaWYgKGFyZ3YuaGVscCkge1xuICAgIG9wdGltaXN0LnNob3dIZWxwKClcbiAgICBwcm9jZXNzLmV4aXQoMClcbn1cblxuaWYgKGFyZ3YudmVyc2lvbikge1xuICAgIGNvbnNvbGUubG9nKGB2JHtWRVJTSU9OfWApXG4gICAgcHJvY2Vzcy5leGl0KDApXG59XG5cbmlmIChhcmd2Ll9bMF0gPT09ICdjb25maWcnKSB7XG4gICAgY29uc29sZS5sb2coYFxuPT09PT09PT09PT09PT09PT09PT09PT09PVxuV0RJTyBDb25maWd1cmF0aW9uIEhlbHBlclxuPT09PT09PT09PT09PT09PT09PT09PT09PVxuYClcbiAgICBpbnF1aXJlci5wcm9tcHQoW3tcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICBuYW1lOiAnYmFja2VuZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGVyZSBkbyB5b3Ugd2FudCB0byBleGVjdXRlIHlvdXIgdGVzdHM/JyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgJ09uIG15IGxvY2FsIG1hY2hpbmUnLFxuICAgICAgICAgICAgJ0luIHRoZSBjbG91ZCB1c2luZyBTYXVjZSBMYWJzLCBCcm93c2VydGFjayBvciBUZXN0aW5nYm90JyxcbiAgICAgICAgICAgICdJbiB0aGUgY2xvdWQgdXNpbmcgYSBkaWZmZXJlbnQgc2VydmljZScsXG4gICAgICAgICAgICAnSSBoYXZlIG15IG93biBTZWxlbml1bSBjbG91ZCdcbiAgICAgICAgXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2hvc3QnLFxuICAgICAgICBtZXNzYWdlOiAnV2hhdCBpcyB0aGUgaG9zdCBhZGRyZXNzIG9mIHRoYXQgY2xvdWQgc2VydmljZT8nLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdkaWZmZXJlbnQgc2VydmljZScpID4gLTFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdwb3J0JyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIHBvcnQgb24gd2hpY2ggdGhhdCBzZXJ2aWNlIGlzIHJ1bm5pbmc/JyxcbiAgICAgICAgZGVmYXVsdDogJzgwJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignZGlmZmVyZW50IHNlcnZpY2UnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnZW52X3VzZXInLFxuICAgICAgICBtZXNzYWdlOiAnRW52aXJvbm1lbnQgbGV0aWFibGUgZm9yIHVzZXJuYW1lJyxcbiAgICAgICAgZGVmYXVsdDogJ1NBVUNFX1VTRVJOQU1FJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignSW4gdGhlIGNsb3VkJykgPiAtMVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2Vudl9rZXknLFxuICAgICAgICBtZXNzYWdlOiAnRW52aXJvbm1lbnQgbGV0aWFibGUgZm9yIGFjY2VzcyBrZXknLFxuICAgICAgICBkZWZhdWx0OiAnU0FVQ0VfQUNDRVNTX0tFWScsXG4gICAgICAgIHdoZW46IGFuc3dlcnMgPT4gYW5zd2Vycy5iYWNrZW5kLmluZGV4T2YoJ0luIHRoZSBjbG91ZCcpID4gLTFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdob3N0JyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIElQIG9yIFVSSSB0byB5b3VyIFNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyPycsXG4gICAgICAgIGRlZmF1bHQ6ICcwLjAuMC4wJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignb3duIFNlbGVuaXVtIGNsb3VkJykgPiAtMVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3BvcnQnLFxuICAgICAgICBtZXNzYWdlOiAnV2hhdCBpcyB0aGUgcG9ydCB3aGljaCB5b3VyIFNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGlzIHJ1bm5pbmcgb24/JyxcbiAgICAgICAgZGVmYXVsdDogJzQ0NDQnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdvd24gU2VsZW5pdW0gY2xvdWQnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAncGF0aCcsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGF0IGlzIHRoZSBwYXRoIHRvIHlvdXIgU2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXI/JyxcbiAgICAgICAgZGVmYXVsdDogJy93ZC9odWInLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdvd24gU2VsZW5pdW0gY2xvdWQnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdmcmFtZXdvcmsnLFxuICAgICAgICBtZXNzYWdlOiAnV2hpY2ggZnJhbWV3b3JrIGRvIHlvdSB3YW50IHRvIHVzZT8nLFxuICAgICAgICBjaG9pY2VzOiBbJ21vY2hhJywgJ2phc21pbmUnLCAnY3VjdW1iZXInXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3NwZWNzJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIHRlc3Qgc3BlY3MgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi90ZXN0L3NwZWNzLyoqLyouanMnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrLm1hdGNoKC8obW9jaGF8amFzbWluZSkvKVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3NwZWNzJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIGZlYXR1cmUgZmlsZXMgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9mZWF0dXJlcy8qKi8qLmZlYXR1cmUnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc3RlcERlZmluaXRpb25zJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIHN0ZXAgZGVmaW5pdGlvbnMgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9mZWF0dXJlcy9zdGVwLWRlZmluaXRpb25zLyoqLyouanMnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdyZXBvcnRlcicsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGljaCByZXBvcnRlciBkbyB5b3Ugd2FudCB0byB1c2U/IChzZWUgaHR0cDovL3dlYmRyaXZlci5pby9ndWlkZS90ZXN0cnVubmVyL3JlcG9ydGVycy5odG1sKScsXG4gICAgICAgIGNob2ljZXM6IFsnZG90JywgJ3NwZWMnLCAneHVuaXQnXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ291dHB1dERpcicsXG4gICAgICAgIG1lc3NhZ2U6ICdJbiB3aGljaCBkaXJlY3Rvcnkgc2hvdWxkIHRoZSB4dW5pdCByZXBvcnRzIGdldCBzdG9yZWQ/JyxcbiAgICAgICAgZGVmYXVsdDogJy4vJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLnJlcG9ydGVyID09PSAneHVuaXQnXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdsb2dMZXZlbCcsXG4gICAgICAgIG1lc3NhZ2U6ICdMZXZlbCBvZiBsb2dnaW5nIHZlcmJvc2l0eScsXG4gICAgICAgIGRlZmF1bHQ6ICdzaWxlbnQnLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICAnc2lsZW50JyxcbiAgICAgICAgICAgICd2ZXJib3NlJyxcbiAgICAgICAgICAgICdjb21tYW5kJyxcbiAgICAgICAgICAgICdkYXRhJyxcbiAgICAgICAgICAgICdyZXN1bHQnLFxuICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICBdXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc2NyZWVuc2hvdFBhdGgnLFxuICAgICAgICBtZXNzYWdlOiAnSW4gd2hpY2ggZGlyZWN0b3J5IHNob3VsZCBzY3JlZW5zaG90cyBnZXRzIHNhdmVkIGlmIGEgY29tbWFuZCBmYWlscz8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9lcnJvclNob3RzLydcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdiYXNlVXJsJyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIGJhc2UgdXJsPycsXG4gICAgICAgIGRlZmF1bHQ6ICdodHRwOi8vbG9jYWxob3N0J1xuICAgIH1dLCAoYW5zd2VycykgPT4ge1xuICAgICAgICBsZXQgdHBsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvaGVscGVycy93ZGlvLmNvbmYuZWpzJywgJ3V0ZjgnKVxuICAgICAgICBsZXQgcmVuZGVyZWRUcGwgPSBlanMucmVuZGVyKHRwbCwge1xuICAgICAgICAgICAgYW5zd2VyczogYW5zd2Vyc1xuICAgICAgICB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZGlvLmNvbmYuanMnKSwgcmVuZGVyZWRUcGwpXG4gICAgICAgIGNvbnNvbGUubG9nKGBcbkNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXG5UbyBydW4geW91ciB0ZXN0cywgZXhlY3V0ZTpcblxuICAgICQgd2RpbyB3ZGlvLmNvbmYuanNcbmApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG5cbi8qKlxuICogc2FuaXRpemUgY3VjdW1iZXJPcHRzXG4gKi9cbmlmIChhcmd2LmN1Y3VtYmVyT3B0cykge1xuICAgIGlmIChhcmd2LmN1Y3VtYmVyT3B0cy50YWdzKSB7XG4gICAgICAgIGFyZ3YuY3VjdW1iZXJPcHRzLnRhZ3MgPSBhcmd2LmN1Y3VtYmVyT3B0cy50YWdzLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKGFyZ3YuY3VjdW1iZXJPcHRzLmlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zKSB7XG4gICAgICAgIGFyZ3YuY3VjdW1iZXJPcHRzLmlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zID0gYXJndi5jdWN1bWJlck9wdHMuaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnMgPT09ICd0cnVlJ1xuICAgIH1cbiAgICBpZiAoYXJndi5jdWN1bWJlck9wdHMucmVxdWlyZSkge1xuICAgICAgICBhcmd2LmN1Y3VtYmVyT3B0cy5yZXF1aXJlID0gYXJndi5jdWN1bWJlck9wdHMucmVxdWlyZS5zcGxpdCgnLCcpXG4gICAgfVxufVxuXG4vKipcbiAqIHNhbml0aXplIGphc21pbmVPcHRzXG4gKi9cbmlmIChhcmd2Lmphc21pbmVPcHRzICYmIGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCkge1xuICAgIGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCA9IHBhcnNlSW50KGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCwgMTApXG59XG5cbi8qKlxuICogc2FuaXRpemUgbW9jaGFPcHRzXG4gKi9cbmlmIChhcmd2Lm1vY2hhT3B0cykge1xuICAgIGlmIChhcmd2Lm1vY2hhT3B0cy50aW1lb3V0KSB7XG4gICAgICAgIGFyZ3YubW9jaGFPcHRzLnRpbWVvdXQgPSBwYXJzZUludChhcmd2Lm1vY2hhT3B0cy50aW1lb3V0LCAxMClcbiAgICB9XG4gICAgaWYgKGFyZ3YubW9jaGFPcHRzLmNvbXBpbGVycykge1xuICAgICAgICBhcmd2Lm1vY2hhT3B0cy5jb21waWxlcnMgPSBhcmd2Lm1vY2hhT3B0cy5jb21waWxlcnMuc3BsaXQoJywnKVxuICAgIH1cbiAgICBpZiAoYXJndi5tb2NoYU9wdHMucmVxdWlyZSkge1xuICAgICAgICBhcmd2Lm1vY2hhT3B0cy5yZXF1aXJlID0gYXJndi5tb2NoYU9wdHMucmVxdWlyZS5zcGxpdCgnLCcpXG4gICAgfVxufVxuXG4vLyBVc2UgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBpZiBpdCBleGlzdHMuXG5sZXQgY29uZmlnRmlsZSA9IGFyZ3YuX1swXVxuaWYgKCFjb25maWdGaWxlKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoJy4vd2Rpby5jb25mLmpzJykpIHtcbiAgICAgICAgY29uZmlnRmlsZSA9ICcuL3dkaW8uY29uZi5qcydcbiAgICB9XG59XG5cbmxldCBhcmdzID0ge31cbmZvciAobGV0IGtleSBvZiBBTExPV0VEX0FSR1YpIHtcbiAgICBpZiAoYXJndltrZXldKSB7XG4gICAgICAgIGFyZ3Nba2V5XSA9IGFyZ3Zba2V5XVxuICAgIH1cbn1cblxubGV0IGxhdW5jaGVyID0gbmV3IExhdW5jaGVyKGNvbmZpZ0ZpbGUsIGFyZ3MpXG5sYXVuY2hlci5ydW4oKS50aGVuKChleGl0Q29kZSkgPT4ge1xuICAgIGlmIChleGl0Q29kZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHsgdGhyb3cgZXhpdENvZGUgfSlcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpXG59KVxuIl19