UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

258 lines (186 loc) 26.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _logger = _interopRequireDefault(require("./logger")); var _remoteDebugger = require("./remote-debugger"); var _remoteMessages = _interopRequireDefault(require("./remote-messages")); var _ws = _interopRequireDefault(require("ws")); var _bluebird = _interopRequireDefault(require("bluebird")); var _lodash = _interopRequireDefault(require("lodash")); var _events = _interopRequireDefault(require("events")); var _helpers = require("./helpers"); var _es6Error = _interopRequireDefault(require("es6-error")); var _appiumSupport = require("appium-support"); const DATA_LOG_LENGTH = { length: 200 }; class WebKitRpcClient extends _events.default.EventEmitter { constructor(host, port = _remoteDebugger.REMOTE_DEBUGGER_PORT, responseTimeout = _remoteDebugger.RPC_RESPONSE_TIMEOUT_MS) { super(); this.host = host || 'localhost'; this.port = port; this.responseTimeout = responseTimeout; this.curMsgId = 0; this.dataHandlers = {}; this.dataMethods = {}; this.errorHandlers = {}; } connect(pageId) { var _this = this; return (0, _asyncToGenerator2.default)(function* () { return yield new _bluebird.default((resolve, reject) => { let url = `ws://${_this.host}:${_this.port}/devtools/page/${pageId}`; _this.pageIdKey = pageId; _this.socket = new _ws.default(url); _this.socket.on('open', () => { _logger.default.debug(`WebKit debugger web socket connected to url: ${url}`); _this.connected = true; resolve(); }); _this.socket.on('close', () => { _logger.default.debug('WebKit remote debugger socket disconnected'); _this.connected = false; }); _this.socket.on('error', exception => { if (_this.connected) { _logger.default.debug(`WebKit debugger web socket error: ${exception.message}`); _this.connected = false; } reject(exception); }); _this.socket.on('message', _this.receive.bind(_this)); }); })(); } disconnect() { _logger.default.debug('Disconnecting from WebKit remote debugger'); if (this.isConnected()) { this.socket.close(1001); } this.connected = false; } isConnected() { return this.socket !== null && this.connected; } send(command, opts = {}) { var _this2 = this; return (0, _asyncToGenerator2.default)(function* () { let data = (0, _remoteMessages.default)(command, _lodash.default.defaults({ connId: _this2.connId, senderId: _this2.senderId }, opts)); _logger.default.debug(`Sending WebKit data: ${_lodash.default.truncate(JSON.stringify(data), DATA_LOG_LENGTH)}`); _logger.default.debug(`Webkit response timeout: ${_this2.responseTimeout}`); _this2.curMsgId++; data.id = _this2.curMsgId; const id = _this2.curMsgId.toString(); return yield new _bluebird.default((resolve, reject) => { _this2.dataHandlers[id] = resolve; _this2.dataMethods[id] = data.method; _this2.errorHandlers[id] = reject; _this2.socket.send(JSON.stringify(data), function (error) { if (_appiumSupport.util.hasValue(error)) { _logger.default.debug(`WebKit socket error occurred: ${error}`); reject(new Error(error)); } }); }).catch(e => { if (e.constructor.name !== WebKitRPCWarning.name) { throw e; } _logger.default.warn(e.message); return _bluebird.default.resolve(null); }).finally(res => { delete _this2.dataHandlers[id]; delete _this2.dataMethods[id]; delete _this2.errorHandlers[id]; return res; }).timeout(_this2.responseTimeout); })(); } receive(data) { _logger.default.debug(`Received WebKit data: '${_lodash.default.truncate(data, DATA_LOG_LENGTH)}'`); data = _appiumSupport.util.safeJsonParse(data); const rejectCall = error => { if (data && this.errorHandlers[data.id]) { return this.errorHandlers[data.id](error); } if (error.constructor.name === WebKitRPCWarning.name) { _logger.default.warn(error.message); } else { _logger.default.errorAndThrow(error); } }; if (!_lodash.default.isPlainObject(data)) { return rejectCall(new WebKitRPCWarning(`No parseable data found`)); } if (data.wasThrown || data.result && data.result.wasThrown) { const message = data.wasThrown ? data.result.value || data.result.description : data.result.result.value || data.result.result.description; return rejectCall(new Error(message)); } const msgId = data.id; const method = this.dataMethods[msgId] || data.method; if (!method) { return rejectCall(new WebKitRPCWarning(`Did not find any handlers for ${msgId ? `'${msgId}'` : 'the recent'} message`)); } _logger.default.debug(`Found method '${method}'${msgId ? ` for '${msgId}' message` : ''}`); let isEventHandled = false; switch (method) { case 'Profiler.resetProfiles': _logger.default.debug('Device is telling us to reset profiles. Should probably ' + 'do some kind of callback here'); isEventHandled = true; break; case 'Timeline.eventRecorded': if (this.timelineEventHandler) { this.timelineEventHandler(data.result); isEventHandled = true; } break; case 'Console.messageAdded': if (this.consoleEventHandler) { this.consoleEventHandler(data.params.message); isEventHandled = true; } break; case 'Page.navigate': _logger.default.debug(`Received page navigated message: ${(0, _helpers.simpleStringify)(data)}`); isEventHandled = true; break; case 'Network.dataReceived': case 'Network.requestWillBeSent': case 'Network.responseReceived': case 'Network.loadingFinished': case 'Network.loadingFailed': if (_lodash.default.isFunction(this.networkEventHandler)) { this.networkEventHandler(method, data.params); return; } break; } if (!data.error && _lodash.default.has(this.dataHandlers, msgId)) { return this.dataHandlers[msgId](data.result); } if (data.error && _lodash.default.has(this.errorHandlers, msgId)) { return this.errorHandlers[msgId](data.error); } if (!isEventHandled) { _logger.default.debug(`There is no handler scheduled for method '${method}' in ${msgId ? `'${msgId}'` : 'the recent'} message`); } } setTimelineEventHandler(timelineEventHandler) { this.timelineEventHandler = timelineEventHandler; } setConsoleLogEventHandler(consoleEventHandler) { this.consoleEventHandler = consoleEventHandler; } setNetworkLogEventHandler(networkEventHandler) { this.networkEventHandler = networkEventHandler; } } exports.default = WebKitRpcClient; class WebKitRPCWarning extends _es6Error.default {}require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJraXQtcnBjLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJEQVRBX0xPR19MRU5HVEgiLCJsZW5ndGgiLCJXZWJLaXRScGNDbGllbnQiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImhvc3QiLCJwb3J0IiwiUkVNT1RFX0RFQlVHR0VSX1BPUlQiLCJyZXNwb25zZVRpbWVvdXQiLCJSUENfUkVTUE9OU0VfVElNRU9VVF9NUyIsImN1ck1zZ0lkIiwiZGF0YUhhbmRsZXJzIiwiZGF0YU1ldGhvZHMiLCJlcnJvckhhbmRsZXJzIiwiY29ubmVjdCIsInBhZ2VJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXJsIiwicGFnZUlkS2V5Iiwic29ja2V0IiwiV2ViU29ja2V0Iiwib24iLCJsb2ciLCJkZWJ1ZyIsImNvbm5lY3RlZCIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJyZWNlaXZlIiwiYmluZCIsImRpc2Nvbm5lY3QiLCJpc0Nvbm5lY3RlZCIsImNsb3NlIiwic2VuZCIsImNvbW1hbmQiLCJvcHRzIiwiZGF0YSIsIl8iLCJkZWZhdWx0cyIsImNvbm5JZCIsInNlbmRlcklkIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiaWQiLCJ0b1N0cmluZyIsIm1ldGhvZCIsImVycm9yIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJjYXRjaCIsImUiLCJuYW1lIiwiV2ViS2l0UlBDV2FybmluZyIsIndhcm4iLCJmaW5hbGx5IiwicmVzIiwidGltZW91dCIsInNhZmVKc29uUGFyc2UiLCJyZWplY3RDYWxsIiwiZXJyb3JBbmRUaHJvdyIsImlzUGxhaW5PYmplY3QiLCJ3YXNUaHJvd24iLCJyZXN1bHQiLCJ2YWx1ZSIsImRlc2NyaXB0aW9uIiwibXNnSWQiLCJpc0V2ZW50SGFuZGxlZCIsInRpbWVsaW5lRXZlbnRIYW5kbGVyIiwiY29uc29sZUV2ZW50SGFuZGxlciIsInBhcmFtcyIsImlzRnVuY3Rpb24iLCJuZXR3b3JrRXZlbnRIYW5kbGVyIiwiaGFzIiwic2V0VGltZWxpbmVFdmVudEhhbmRsZXIiLCJzZXRDb25zb2xlTG9nRXZlbnRIYW5kbGVyIiwic2V0TmV0d29ya0xvZ0V2ZW50SGFuZGxlciIsIkVTNkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLGVBQWUsR0FBRztBQUFDQyxFQUFBQSxNQUFNLEVBQUU7QUFBVCxDQUF4Qjs7QUFFZSxNQUFNQyxlQUFOLFNBQThCQyxnQkFBT0MsWUFBckMsQ0FBa0Q7QUFDL0RDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRQyxJQUFJLEdBQUdDLG9DQUFmLEVBQXFDQyxlQUFlLEdBQUdDLHVDQUF2RCxFQUFnRjtBQUN6RjtBQUVBLFNBQUtKLElBQUwsR0FBWUEsSUFBSSxJQUFJLFdBQXBCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZQSxJQUFaO0FBRUEsU0FBS0UsZUFBTCxHQUF1QkEsZUFBdkI7QUFFQSxTQUFLRSxRQUFMLEdBQWdCLENBQWhCO0FBRUEsU0FBS0MsWUFBTCxHQUFvQixFQUFwQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUtDLEVBQUFBLE9BQU4sQ0FBZUMsTUFBZixFQUF1QjtBQUFBOztBQUFBO0FBQ3JCLG1CQUFhLElBQUlDLGlCQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBRzVDLFlBQUlDLEdBQUcsR0FBSSxRQUFPLEtBQUksQ0FBQ2QsSUFBSyxJQUFHLEtBQUksQ0FBQ0MsSUFBSyxrQkFBaUJTLE1BQU8sRUFBakU7QUFDQSxRQUFBLEtBQUksQ0FBQ0ssU0FBTCxHQUFpQkwsTUFBakI7QUFHQSxRQUFBLEtBQUksQ0FBQ00sTUFBTCxHQUFjLElBQUlDLFdBQUosQ0FBY0gsR0FBZCxDQUFkOztBQUNBLFFBQUEsS0FBSSxDQUFD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LElBQUksQ0FBQ1csS0FBTixJQUFlVixnQkFBRXFDLEdBQUYsQ0FBTSxLQUFLaEUsWUFBWCxFQUF5QnlELEtBQXpCLENBQW5CLEVBQW9EO0FBQ2xELGFBQU8sS0FBS3pELFlBQUwsQ0FBa0J5RCxLQUFsQixFQUF5Qi9CLElBQUksQ0FBQzRCLE1BQTlCLENBQVA7QUFDRDs7QUFDRCxRQUFJNUIsSUFBSSxDQUFDVyxLQUFMLElBQWNWLGdCQUFFcUMsR0FBRixDQUFNLEtBQUs5RCxhQUFYLEVBQTBCdUQsS0FBMUIsQ0FBbEIsRUFBb0Q7QUFDbEQsYUFBTyxLQUFLdkQsYUFBTCxDQUFtQnVELEtBQW5CLEVBQTBCL0IsSUFBSSxDQUFDVyxLQUEvQixDQUFQO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDcUIsY0FBTCxFQUFxQjtBQUNuQjdDLHNCQUFJQyxLQUFKLENBQVcsNkNBQTRDc0IsTUFBTyxRQUFPcUIsS0FBSyxHQUFJLElBQUdBLEtBQU0sR0FBYixHQUFrQixZQUFhLFVBQXpHO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsdUJBQXVCLENBQUVOLG9CQUFGLEVBQXdCO0FBQzdDLFNBQUtBLG9CQUFMLEdBQTRCQSxvQkFBNUI7QUFDRDs7QUFFRE8sRUFBQUEseUJBQXlCLENBQUVOLG1CQUFGLEVBQXVCO0FBQzlDLFNBQUtBLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDRDs7QUFFRE8sRUFBQUEseUJBQXlCLENBQUVKLG1CQUFGLEVBQXVCO0FBQzlDLFNBQUtBLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDRDs7QUFoTThEOzs7O0FBb01qRSxNQUFNbkIsZ0JBQU4sU0FBK0J3QixpQkFBL0IsQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IFJFTU9URV9ERUJVR0dFUl9QT1JULCBSUENfUkVTUE9OU0VfVElNRU9VVF9NUyB9IGZyb20gJy4vcmVtb3RlLWRlYnVnZ2VyJztcbmltcG9ydCBnZXRSZW1vdGVDb21tYW5kIGZyb20gJy4vcmVtb3RlLW1lc3NhZ2VzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBldmVudHMgZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IHNpbXBsZVN0cmluZ2lmeSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgRVM2RXJyb3IgZnJvbSAnZXM2LWVycm9yJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5cblxuY29uc3QgREFUQV9MT0dfTEVOR1RIID0ge2xlbmd0aDogMjAwfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViS2l0UnBjQ2xpZW50IGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0ID0gUkVNT1RFX0RFQlVHR0VSX1BPUlQsIHJlc3BvbnNlVGltZW91dCA9IFJQQ19SRVNQT05TRV9USU1FT1VUX01TKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcblxuICAgIHRoaXMucmVzcG9uc2VUaW1lb3V0ID0gcmVzcG9uc2VUaW1lb3V0O1xuXG4gICAgdGhpcy5jdXJNc2dJZCA9IDA7XG5cbiAgICB0aGlzLmRhdGFIYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGF0YU1ldGhvZHMgPSB7fTtcbiAgICB0aGlzLmVycm9ySGFuZGxlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QgKHBhZ2VJZCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyB3ZSB3aWxsIG9ubHkgcmVzb2x2ZSB0aGlzIGNhbGwgd2hlbiB0aGUgc29ja2V0IGlzIG9wZW5cbiAgICAgIC8vIFdlYktpdCB1cmxcbiAgICAgIGxldCB1cmwgPSBgd3M6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9L2RldnRvb2xzL3BhZ2UvJHtwYWdlSWR9YDtcbiAgICAgIHRoaXMucGFnZUlkS2V5ID0gcGFnZUlkO1xuXG4gICAgICAvLyBjcmVhdGUgYW5kIHNldCB1cCBzb2NrZXQgd2l0aCBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCk7XG4gICAgICB0aGlzLnNvY2tldC5vbignb3BlbicsICgpID0+IHtcbiAgICAgICAgbG9nLmRlYnVnKGBXZWJLaXQgZGVidWdnZXIgd2ViIHNvY2tldCBjb25uZWN0ZWQgdG8gdXJsOiAke3VybH1gKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgbG9nLmRlYnVnKCdXZWJLaXQgcmVtb3RlIGRlYnVnZ2VyIHNvY2tldCBkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQub24oJ2Vycm9yJywgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYFdlYktpdCBkZWJ1Z2dlciB3ZWIgc29ja2V0IGVycm9yOiAke2V4Y2VwdGlvbi5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QoZXhjZXB0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQub24oJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUuYmluZCh0aGlzKSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ICgpIHtcbiAgICBsb2cuZGVidWcoJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBXZWJLaXQgcmVtb3RlIGRlYnVnZ2VyJyk7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoMTAwMSk7XG4gICAgfVxuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpc0Nvbm5lY3RlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnNvY2tldCAhPT0gbnVsbCAmJiB0aGlzLmNvbm5lY3RlZCk7XG4gIH1cblxuICBhc3luYyBzZW5kIChjb21tYW5kLCBvcHRzID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IGdldFJlbW90ZUNvbW1hbmQoY29tbWFuZCwgXy5kZWZhdWx0cyh7Y29ubklkOiB0aGlzLmNvbm5JZCwgc2VuZGVySWQ6IHRoaXMuc2VuZGVySWR9LCBvcHRzKSk7XG5cbiAgICBsb2cuZGVidWcoYFNlbmRpbmcgV2ViS2l0IGRhdGE6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkYXRhKSwgREFUQV9MT0dfTEVOR1RIKX1gKTtcbiAgICBsb2cuZGVidWcoYFdlYmtpdCByZXNwb25zZSB0aW1lb3V0OiAke3RoaXMucmVzcG9uc2VUaW1lb3V0fWApO1xuXG4gICAgdGhpcy5jdXJNc2dJZCsrO1xuICAgIGRhdGEuaWQgPSB0aGlzLmN1ck1zZ0lkO1xuXG4gICAgY29uc3QgaWQgPSB0aGlzLmN1ck1zZ0lkLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIG9ubHkgcmVzb2x2ZSB0aGUgc2VuZCBjb21tYW5kIHdoZW4gV2ViS2l0IHJldHVybnMgYSByZXNwb25zZVxuICAgICAgLy8gc3RvcmUgdGhlIGhhbmRsZXIgYW5kIHRoZSBkYXRhIHNlbnRcbiAgICAgIHRoaXMuZGF0YUhhbmRsZXJzW2lkXSA9IHJlc29sdmU7XG4gICAgICB0aGlzLmRhdGFNZXRob2RzW2lkXSA9IGRhdGEubWV0aG9kO1xuICAgICAgdGhpcy5lcnJvckhhbmRsZXJzW2lkXSA9IHJlamVjdDtcblxuICAgICAgLy8gc2VuZCB0aGUgZGF0YVxuICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGVycm9yKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2ViS2l0IHNvY2tldCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBpZiAoZS5jb25zdHJ1Y3Rvci5uYW1lICE9PSBXZWJLaXRSUENXYXJuaW5nLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH0pLmZpbmFsbHkoKHJlcykgPT4ge1xuICAgICAgLy8gbm8gbmVlZCB0byBob2xkIG9udG8gYW55dGhpbmdcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFIYW5kbGVyc1tpZF07XG4gICAgICBkZWxldGUgdGhpcy5kYXRhTWV0aG9kc1tpZF07XG4gICAgICBkZWxldGUgdGhpcy5lcnJvckhhbmRsZXJzW2lkXTtcblxuICAgICAgLy8gYW5kIHBhc3MgYWxvbmcgdGhlIHJlc3VsdFxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KS50aW1lb3V0KHRoaXMucmVzcG9uc2VUaW1lb3V0KTtcbiAgfVxuXG4gIHJlY2VpdmUgKGRhdGEpIHtcbiAgICBsb2cuZGVidWcoYFJlY2VpdmVkIFdlYktpdCBkYXRhOiAnJHtfLnRydW5jYXRlKGRhdGEsIERBVEFfTE9HX0xFTkdUSCl9J2ApO1xuICAgIGRhdGEgPSB1dGlsLnNhZmVKc29uUGFyc2UoZGF0YSk7XG5cbiAgICBjb25zdCByZWplY3RDYWxsID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiB0aGlzLmVycm9ySGFuZGxlcnNbZGF0YS5pZF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyc1tkYXRhLmlkXShlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBXZWJLaXRSUENXYXJuaW5nLm5hbWUpIHtcbiAgICAgICAgbG9nLndhcm4oZXJyb3IubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhlcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gcmVqZWN0Q2FsbChuZXcgV2ViS2l0UlBDV2FybmluZyhgTm8gcGFyc2VhYmxlIGRhdGEgZm91bmRgKSk7XG4gICAgfVxuXG4gICAgLy8gd2UgY2FuIGdldCBhbiBlcnJvciwgb3Igd2UgY2FuIGdldCBhIHJlc3BvbnNlIHRoYXQgaXMgYW4gZXJyb3JcbiAgICBpZiAoZGF0YS53YXNUaHJvd24gfHwgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0Lndhc1Rocm93bikpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhLndhc1Rocm93blxuICAgICAgICA/IGRhdGEucmVzdWx0LnZhbHVlIHx8IGRhdGEucmVzdWx0LmRlc2NyaXB0aW9uXG4gICAgICAgIDogZGF0YS5yZXN1bHQucmVzdWx0LnZhbHVlIHx8IGRhdGEucmVzdWx0LnJlc3VsdC5kZXNjcmlwdGlvbjtcbiAgICAgIHJldHVybiByZWplY3RDYWxsKG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbXNnSWQgPSBkYXRhLmlkO1xuICAgIC8vIHdoZW4gc2VuZGluZyB3ZSBzZXQgYSBkYXRhIG1ldGhvZCBhbmQgYXNzb2NpYXRlZCBjYWxsYmFjay5cbiAgICAvLyBnZXQgdGhhdCwgb3IgdGhlIGdlbmVyaWMgKGF1dG9tYXRpY2FsbHkgc2VudCwgbm90IGFzc29jaWF0ZWRcbiAgICAvLyB3aXRoIGEgcGFydGljdWxhciByZXF1ZXN0KSBtZXRob2RcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmRhdGFNZXRob2RzW21zZ0lkXSB8fCBkYXRhLm1ldGhvZDtcbiAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgcmV0dXJuIHJlamVjdENhbGwoXG4gICAgICAgIG5ldyBXZWJLaXRSUENXYXJuaW5nKGBEaWQgbm90IGZpbmQgYW55IGhhbmRsZXJzIGZvciAke21zZ0lkID8gYCcke21zZ0lkfSdgIDogJ3RoZSByZWNlbnQnfSBtZXNzYWdlYCkpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEZvdW5kIG1ldGhvZCAnJHttZXRob2R9JyR7bXNnSWQgPyBgIGZvciAnJHttc2dJZH0nIG1lc3NhZ2VgIDogJyd9YCk7XG4gICAgbGV0IGlzRXZlbnRIYW5kbGVkID0gZmFsc2U7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ1Byb2ZpbGVyLnJlc2V0UHJvZmlsZXMnOlxuICAgICAgICBsb2cuZGVidWcoJ0RldmljZSBpcyB0ZWxsaW5nIHVzIHRvIHJlc2V0IHByb2ZpbGVzLiBTaG91bGQgcHJvYmFibHkgJyArXG4gICAgICAgICAgICAgICAgICAnZG8gc29tZSBraW5kIG9mIGNhbGxiYWNrIGhlcmUnKTtcbiAgICAgICAgaXNFdmVudEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RpbWVsaW5lLmV2ZW50UmVjb3JkZWQnOlxuICAgICAgICBpZiAodGhpcy50aW1lbGluZUV2ZW50SGFuZGxlcikge1xuICAgICAgICAgIHRoaXMudGltZWxpbmVFdmVudEhhbmRsZXIoZGF0YS5yZXN1bHQpO1xuICAgICAgICAgIGlzRXZlbnRIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0NvbnNvbGUubWVzc2FnZUFkZGVkJzpcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUV2ZW50SGFuZGxlcikge1xuICAgICAgICAgIHRoaXMuY29uc29sZUV2ZW50SGFuZGxlcihkYXRhLnBhcmFtcy5tZXNzYWdlKTtcbiAgICAgICAgICBpc0V2ZW50SGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlLm5hdmlnYXRlJzpcbiAgICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCBwYWdlIG5hdmlnYXRlZCBtZXNzYWdlOiAke3NpbXBsZVN0cmluZ2lmeShkYXRhKX1gKTtcbiAgICAgICAgaXNFdmVudEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05ldHdvcmsuZGF0YVJlY2VpdmVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnOlxuICAgICAgY2FzZSAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCc6XG4gICAgICAgIGlmIChfLmlzRnVuY3Rpb24odGhpcy5uZXR3b3JrRXZlbnRIYW5kbGVyKSkge1xuICAgICAgICAgIHRoaXMubmV0d29ya0V2ZW50SGFuZGxlcihtZXRob2QsIGRhdGEucGFyYW1zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghZGF0YS5lcnJvciAmJiBfLmhhcyh0aGlzLmRhdGFIYW5kbGVycywgbXNnSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhSGFuZGxlcnNbbXNnSWRdKGRhdGEucmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZXJyb3IgJiYgXy5oYXModGhpcy5lcnJvckhhbmRsZXJzLCBtc2dJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcnNbbXNnSWRdKGRhdGEuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIWlzRXZlbnRIYW5kbGVkKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIGhhbmRsZXIgc2NoZWR1bGVkIGZvciBtZXRob2QgJyR7bWV0aG9kfScgaW4gJHttc2dJZCA/IGAnJHttc2dJZH0nYCA6ICd0aGUgcmVjZW50J30gbWVzc2FnZWApO1xuICAgIH1cbiAgfVxuXG4gIHNldFRpbWVsaW5lRXZlbnRIYW5kbGVyICh0aW1lbGluZUV2ZW50SGFuZGxlcikge1xuICAgIHRoaXMudGltZWxpbmVFdmVudEhhbmRsZXIgPSB0aW1lbGluZUV2ZW50SGFuZGxlcjtcbiAgfVxuXG4gIHNldENvbnNvbGVMb2dFdmVudEhhbmRsZXIgKGNvbnNvbGVFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLmNvbnNvbGVFdmVudEhhbmRsZXIgPSBjb25zb2xlRXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgc2V0TmV0d29ya0xvZ0V2ZW50SGFuZGxlciAobmV0d29ya0V2ZW50SGFuZGxlcikge1xuICAgIHRoaXMubmV0d29ya0V2ZW50SGFuZGxlciA9IG5ldHdvcmtFdmVudEhhbmRsZXI7XG4gIH1cbn1cblxuXG5jbGFzcyBXZWJLaXRSUENXYXJuaW5nIGV4dGVuZHMgRVM2RXJyb3Ige31cbiJdLCJmaWxlIjoibGliL3dlYmtpdC1ycGMtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=