UNPKG

@testim/testim-cli

Version:

Command line interface for running Testing on you CI

237 lines (186 loc) 22.9 kB
'use strict'; var _createClass = require('babel-runtime/helpers/create-class')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _Object$keys = require('babel-runtime/core-js/object/keys')['default']; var _Promise = require('babel-runtime/core-js/promise')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; Object.defineProperty(exports, '__esModule', { value: true }); var _url = require('url'); var _url2 = _interopRequireDefault(_url); var _request = require('request'); var _request2 = _interopRequireDefault(_request); var _deepmerge = require('deepmerge'); var _deepmerge2 = _interopRequireDefault(_deepmerge); var _helpersConstants = require('../helpers/constants'); var _ErrorHandler = require('./ErrorHandler'); var _packageJson = require('../../package.json'); var _packageJson2 = _interopRequireDefault(_packageJson); /** * RequestHandler */ var RequestHandler = (function () { function RequestHandler(options, eventHandler, logger) { _classCallCheck(this, RequestHandler); this.sessionID = null; this.startPath = options.path === '/' ? '' : options.path || '/wd/hub'; this.eventHandler = eventHandler; this.logger = logger; this.defaultOptions = options; /** * actually host is `hostname:port` but to keep config properties * short we abuse host as hostname */ if (options.host !== undefined) { options.hostname = options.host; delete options.host; } /** * set auth from user and password configs */ if (this.defaultOptions.user && this.defaultOptions.key) { this.auth = { user: this.defaultOptions.user, pass: this.defaultOptions.key }; delete this.defaultOptions.user; delete this.defaultOptions.key; } } /** * merges default options with request options * * @param {Object} requestOptions request options */ _createClass(RequestHandler, [{ key: 'createOptions', value: function createOptions(requestOptions, data) { var newOptions = {}; /** * if we don't have a session id we set it here, unless we call commands that don't require session ids, for * example /sessions. The call to /sessions is not connected to a session itself and it therefore doesn't * require it */ if (requestOptions.path.match(/\:sessionId/) && !this.sessionID && requestOptions.requiresSession !== false) { // throw session id error throw new _ErrorHandler.RuntimeError(101); } newOptions.uri = _url2['default'].parse(this.defaultOptions.protocol + '://' + this.defaultOptions.hostname + ':' + this.defaultOptions.port + this.startPath + requestOptions.path.replace(':sessionId', this.sessionID || '')); // send authentication credentials only when creating new session if (requestOptions.path === '/session' && this.auth !== undefined) { newOptions.auth = this.auth; } if (requestOptions.method) { newOptions.method = requestOptions.method; } newOptions.json = true; newOptions.followAllRedirects = true; newOptions.headers = { 'Connection': 'keep-alive', 'Accept': 'application/json', 'User-Agent': 'webdriverio/webdriverio/' + _packageJson2['default'].version }; if (_Object$keys(data).length > 0) { var requestData = JSON.stringify(data); newOptions.body = requestData; newOptions.method = 'POST'; newOptions.headers = (0, _deepmerge2['default'])(newOptions.headers, { 'Content-Type': 'application/json; charset=UTF-8', 'Content-Length': Buffer.byteLength(requestData, 'UTF-8') }); } return newOptions; } /** * creates a http request with its given options and send the protocol * command to the webdriver server * * @param {Object} requestOptions defines url, method and other request options * @param {Object} data contains request data */ }, { key: 'create', value: function create(requestOptions, data) { var _this = this; data = data || {}; /** * allow to pass a string as shorthand argument */ if (typeof requestOptions === 'string') { requestOptions = { path: requestOptions }; } var fullRequestOptions = this.createOptions(requestOptions, data); this.eventHandler.emit('command', { method: fullRequestOptions.method || 'GET', uri: fullRequestOptions.uri, data: data }); return new _Promise(function (resolve, reject) { (0, _request2['default'])(fullRequestOptions, _this.responseHandler(resolve, reject, data, requestOptions, fullRequestOptions)); }); } /** * response handler */ }, { key: 'responseHandler', value: function responseHandler(resolve, reject, data, requestOptions, fullRequestOptions) { var _this2 = this; return function (err, response, body) { var error = null; if (err || body && body.status !== 0) { if (body && typeof body === 'string') { error = new _ErrorHandler.RuntimeError(body); } else if (body) { error = new _ErrorHandler.RuntimeError({ status: body.status, type: _helpersConstants.ERROR_CODES[body.status] ? _helpersConstants.ERROR_CODES[body.status].id : 'unknown', message: _helpersConstants.ERROR_CODES[body.status] ? _helpersConstants.ERROR_CODES[body.status].message : 'unknown', orgStatusMessage: body.value ? body.value.message : '' }); } else { error = new _ErrorHandler.RuntimeError({ status: -1, type: 'ECONNREFUSED', message: 'Couldn\'t connect to selenium server', orgStatusMessage: 'Couldn\'t connect to selenium server' }); } return reject(error); } /** * if no session id was set before we've called the init command */ if (_this2.sessionID === null && requestOptions.requiresSession !== false) { _this2.sessionID = body.sessionId; _this2.eventHandler.emit('init', { sessionID: _this2.sessionID, options: body.value, desiredCapabilities: data.desiredCapabilities }); _this2.logger.log('SET SESSION ID ' + _this2.sessionID); } if (body === undefined) { body = { status: 0, orgStatusMessage: _helpersConstants.ERROR_CODES[0].message }; } _this2.eventHandler.emit('result', { requestData: data, requestOptions: fullRequestOptions, response: response, body: body }); return resolve(body); }; } }]); return RequestHandler; })(); exports['default'] = RequestHandler; module.exports = exports['default']; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9SZXF1ZXN0SGFuZGxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O21CQUFnQixLQUFLOzs7O3VCQUNELFNBQVM7Ozs7eUJBQ1gsV0FBVzs7OztnQ0FFRCxzQkFBc0I7OzRCQUNyQixnQkFBZ0I7OzJCQUM3QixvQkFBb0I7Ozs7Ozs7O0lBSzlCLGNBQWM7QUFDSixhQURWLGNBQWMsQ0FDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRTs4QkFEMUMsY0FBYzs7QUFFWixZQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtBQUNyQixZQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQTtBQUN0RSxZQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtBQUNoQyxZQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtBQUNwQixZQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQTs7Ozs7O0FBTTdCLFlBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDNUIsbUJBQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtBQUMvQixtQkFBTyxPQUFPLENBQUMsSUFBSSxDQUFBO1NBQ3RCOzs7OztBQUtELFlBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUU7QUFDckQsZ0JBQUksQ0FBQyxJQUFJLEdBQUc7QUFDUixvQkFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSTtBQUM5QixvQkFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRzthQUNoQyxDQUFBOztBQUVELG1CQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFBO0FBQy9CLG1CQUFPLElBQUksQ0FBQyxj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O0FBRUQsMkJBQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUN2Qjs7Ozs7QUFLRCxvQkFBSSxPQUFLLFNBQVMsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUU7QUFDckUsMkJBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7O0FBRS9CLDJCQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzNCLGlDQUFTLEVBQUUsT0FBSyxTQUFTO0FBQ3pCLCtCQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7QUFDbkIsMkNBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtxQkFDaEQsQ0FBQyxDQUFBOztBQUVGLDJCQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsT0FBSyxTQUFTLENBQUMsQ0FBQTtpQkFDdEQ7O0FBRUQsb0JBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNwQix3QkFBSSxHQUFHO0FBQ0gsOEJBQU0sRUFBRSxDQUFDO0FBQ1Qsd0NBQWdCLEVBQUUsOEJBQVksQ0FBQyxDQUFDLENBQUMsT0FBTztxQkFDM0MsQ0FBQTtpQkFDSjs7QUFFRCx1QkFBSyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUM3QiwrQkFBVyxFQUFFLElBQUk7QUFDakIsa0NBQWMsRUFBRSxrQkFBa0I7QUFDbEMsNEJBQVEsRUFBRSxRQUFRO0FBQ2xCLHdCQUFJLEVBQUUsSUFBSTtpQkFDYixDQUFDLENBQUE7O0FBRUYsdUJBQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3ZCLENBQUE7U0FDSjs7O1dBbExDLGNBQWM7OztxQkFxTEwsY0FBYyIsImZpbGUiOiJSZXF1ZXN0SGFuZGxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1cmwgZnJvbSAndXJsJ1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCdcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnXG5cbmltcG9ydCB7IEVSUk9SX0NPREVTIH0gZnJvbSAnLi4vaGVscGVycy9jb25zdGFudHMnXG5pbXBvcnQgeyBSdW50aW1lRXJyb3IgfSBmcm9tICcuL0Vycm9ySGFuZGxlcidcbmltcG9ydCBwa2cgZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJ1xuXG4vKipcbiAqIFJlcXVlc3RIYW5kbGVyXG4gKi9cbmNsYXNzIFJlcXVlc3RIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucywgZXZlbnRIYW5kbGVyLCBsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uSUQgPSBudWxsXG4gICAgICAgIHRoaXMuc3RhcnRQYXRoID0gb3B0aW9ucy5wYXRoID09PSAnLycgPyAnJyA6IG9wdGlvbnMucGF0aCB8fCAnL3dkL2h1YidcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICAgICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IG9wdGlvbnNcblxuICAgICAgICAvKipcbiAgICAgICAgICogYWN0dWFsbHkgaG9zdCBpcyBgaG9zdG5hbWU6cG9ydGAgYnV0IHRvIGtlZXAgY29uZmlnIHByb3BlcnRpZXNcbiAgICAgICAgICogc2hvcnQgd2UgYWJ1c2UgaG9zdCBhcyBob3N0bmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhvc3RuYW1lID0gb3B0aW9ucy5ob3N0XG4gICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob3N0XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogc2V0IGF1dGggZnJvbSB1c2VyIGFuZCBwYXNzd29yZCBjb25maWdzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0T3B0aW9ucy51c2VyICYmIHRoaXMuZGVmYXVsdE9wdGlvbnMua2V5KSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSB7XG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy5kZWZhdWx0T3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgIHBhc3M6IHRoaXMuZGVmYXVsdE9wdGlvbnMua2V5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlZmF1bHRPcHRpb25zLnVzZXJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlZmF1bHRPcHRpb25zLmtleVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHJlcXVlc3Qgb3B0aW9uc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSByZXF1ZXN0T3B0aW9ucyAgcmVxdWVzdCBvcHRpb25zXG4gICAgICovXG4gICAgY3JlYXRlT3B0aW9ucyAocmVxdWVzdE9wdGlvbnMsIGRhdGEpIHtcbiAgICAgICAgbGV0IG5ld09wdGlvbnMgPSB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbiBpZCB3ZSBzZXQgaXQgaGVyZSwgdW5sZXNzIHdlIGNhbGwgY29tbWFuZHMgdGhhdCBkb24ndCByZXF1aXJlIHNlc3Npb24gaWRzLCBmb3JcbiAgICAgICAgICogZXhhbXBsZSAvc2Vzc2lvbnMuIFRoZSBjYWxsIHRvIC9zZXNzaW9ucyBpcyBub3QgY29ubmVjdGVkIHRvIGEgc2Vzc2lvbiBpdHNlbGYgYW5kIGl0IHRoZXJlZm9yZSBkb2Vzbid0XG4gICAgICAgICAqIHJlcXVpcmUgaXRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5wYXRoLm1hdGNoKC9cXDpzZXNzaW9uSWQvKSAmJiAhdGhpcy5zZXNzaW9uSUQgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWlyZXNTZXNzaW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gdGhyb3cgc2Vzc2lvbiBpZCBlcnJvclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcigxMDEpXG4gICAgICAgIH1cblxuICAgICAgICBuZXdPcHRpb25zLnVyaSA9IHVybC5wYXJzZShcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMucHJvdG9jb2wgKyAnOi8vJyArXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRPcHRpb25zLmhvc3RuYW1lICsgJzonICsgdGhpcy5kZWZhdWx0T3B0aW9ucy5wb3J0ICtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQYXRoICtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zLnBhdGgucmVwbGFjZSgnOnNlc3Npb25JZCcsIHRoaXMuc2Vzc2lvbklEIHx8ICcnKSlcblxuICAgICAgICAvLyBzZW5kIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIG9ubHkgd2hlbiBjcmVhdGluZyBuZXcgc2Vzc2lvblxuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMucGF0aCA9PT0gJy9zZXNzaW9uJyAmJiB0aGlzLmF1dGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3T3B0aW9ucy5hdXRoID0gdGhpcy5hdXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWV0aG9kKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zLm1ldGhvZCA9IHJlcXVlc3RPcHRpb25zLm1ldGhvZFxuICAgICAgICB9XG5cbiAgICAgICAgbmV3T3B0aW9ucy5qc29uID0gdHJ1ZVxuICAgICAgICBuZXdPcHRpb25zLmZvbGxvd0FsbFJlZGlyZWN0cyA9IHRydWVcblxuICAgICAgICBuZXdPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgICAnQ29ubmVjdGlvbic6ICdrZWVwLWFsaXZlJyxcbiAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICd3ZWJkcml2ZXJpby93ZWJkcml2ZXJpby8nICsgcGtnLnZlcnNpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdERhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICAgICAgbmV3T3B0aW9ucy5ib2R5ID0gcmVxdWVzdERhdGFcbiAgICAgICAgICAgIG5ld09wdGlvbnMubWV0aG9kID0gJ1BPU1QnXG4gICAgICAgICAgICBuZXdPcHRpb25zLmhlYWRlcnMgPSBtZXJnZShuZXdPcHRpb25zLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnLFxuICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcXVlc3REYXRhLCAnVVRGLTgnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPcHRpb25zXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBhIGh0dHAgcmVxdWVzdCB3aXRoIGl0cyBnaXZlbiBvcHRpb25zIGFuZCBzZW5kIHRoZSBwcm90b2NvbFxuICAgICAqIGNvbW1hbmQgdG8gdGhlIHdlYmRyaXZlciBzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gICByZXF1ZXN0T3B0aW9ucyAgZGVmaW5lcyB1cmwsIG1ldGhvZCBhbmQgb3RoZXIgcmVxdWVzdCBvcHRpb25zXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgIGRhdGEgICAgICAgICAgICBjb250YWlucyByZXF1ZXN0IGRhdGFcbiAgICAgKi9cbiAgICBjcmVhdGUgKHJlcXVlc3RPcHRpb25zLCBkYXRhKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IHRvIHBhc3MgYSBzdHJpbmcgYXMgc2hvcnRoYW5kIGFyZ3VtZW50XG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RPcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogcmVxdWVzdE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmdWxsUmVxdWVzdE9wdGlvbnMgPSB0aGlzLmNyZWF0ZU9wdGlvbnMocmVxdWVzdE9wdGlvbnMsIGRhdGEpXG5cbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgnY29tbWFuZCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogZnVsbFJlcXVlc3RPcHRpb25zLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgICAgIHVyaTogZnVsbFJlcXVlc3RPcHRpb25zLnVyaSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdChmdWxsUmVxdWVzdE9wdGlvbnMsIHRoaXMucmVzcG9uc2VIYW5kbGVyKHJlc29sdmUsIHJlamVjdCwgZGF0YSwgcmVxdWVzdE9wdGlvbnMsIGZ1bGxSZXF1ZXN0T3B0aW9ucykpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVzcG9uc2UgaGFuZGxlclxuICAgICAqL1xuICAgIHJlc3BvbnNlSGFuZGxlciAocmVzb2x2ZSwgcmVqZWN0LCBkYXRhLCByZXF1ZXN0T3B0aW9ucywgZnVsbFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiAoZXJyLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbFxuXG4gICAgICAgICAgICBpZiAoZXJyIHx8IChib2R5ICYmIGJvZHkuc3RhdHVzICE9PSAwKSkge1xuICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBSdW50aW1lRXJyb3IoYm9keSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgUnVudGltZUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogYm9keS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10gPyBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10uaWQgOiAndW5rbm93bicsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10gPyBFUlJPUl9DT0RFU1tib2R5LnN0YXR1c10ubWVzc2FnZSA6ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ1N0YXR1c01lc3NhZ2U6IGJvZHkudmFsdWUgPyBib2R5LnZhbHVlLm1lc3NhZ2UgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IFJ1bnRpbWVFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0VDT05OUkVGVVNFRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ291bGRuXFwndCBjb25uZWN0IHRvIHNlbGVuaXVtIHNlcnZlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdTdGF0dXNNZXNzYWdlOiAnQ291bGRuXFwndCBjb25uZWN0IHRvIHNlbGVuaXVtIHNlcnZlcidcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNldCBiZWZvcmUgd2UndmUgY2FsbGVkIHRoZSBpbml0IGNvbW1hbmRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbklEID09PSBudWxsICYmIHJlcXVlc3RPcHRpb25zLnJlcXVpcmVzU2Vzc2lvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25JRCA9IGJvZHkuc2Vzc2lvbklkXG5cbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0KCdpbml0Jywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSUQ6IHRoaXMuc2Vzc2lvbklELFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBib2R5LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2FwYWJpbGl0aWVzOiBkYXRhLmRlc2lyZWRDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdTRVQgU0VTU0lPTiBJRCAnICsgdGhpcy5zZXNzaW9uSUQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBib2R5ID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIG9yZ1N0YXR1c01lc3NhZ2U6IEVSUk9SX0NPREVTWzBdLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXQoJ3Jlc3VsdCcsIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogZnVsbFJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShib2R5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0SGFuZGxlclxuIl19