UNPKG

gst-atom-xcuitest-driver

Version:

ATOM driver for iOS using XCUITest for backend

164 lines (119 loc) 19.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _gstAtomBaseDriver = require("gst-atom-base-driver"); var _gstAtomIosDriver = require("gst-atom-ios-driver"); var _iosCrashLog = require("../device-log/ios-crash-log"); var _iosSimulatorLog = require("../device-log/ios-simulator-log"); var _iosDeviceLog = require("../device-log/ios-device-log"); var _logger = _interopRequireDefault(require("../logger")); var _ws = _interopRequireDefault(require("ws")); var _safariConsoleLog = _interopRequireDefault(require("../device-log/safari-console-log")); var _safariNetworkLog = _interopRequireDefault(require("../device-log/safari-network-log")); let extensions = {}; const WEBSOCKET_ENDPOINT = sessionId => `${_gstAtomBaseDriver.DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/syslog`; Object.assign(extensions, _gstAtomIosDriver.iosCommands.logging); extensions.supportedLogTypes.safariConsole = { description: 'Safari Console Logs - data written to the JS console in Safari', getter: async self => await self.extractLogs('safariConsole', self.logs) }; extensions.supportedLogTypes.safariNetwork = { description: 'Safari Network Logs - information about network operations undertaken by Safari', getter: async self => await self.extractLogs('safariNetwork', self.logs) }; extensions.startLogCapture = async function startLogCapture() { this.logs = this.logs || {}; if (!_lodash.default.isUndefined(this.logs.syslog) && this.logs.syslog.isCapturing) { _logger.default.warn('Trying to start iOS log capture but it has already started!'); return true; } if (_lodash.default.isUndefined(this.logs.syslog)) { this.logs.crashlog = new _iosCrashLog.IOSCrashLog({ sim: this.opts.device, udid: this.isRealDevice() ? this.opts.udid : undefined }); if (this.isRealDevice()) { this.logs.syslog = new _iosDeviceLog.IOSDeviceLog({ udid: this.opts.udid, showLogs: this.opts.showIOSLog }); } else { this.logs.syslog = new _iosSimulatorLog.IOSSimulatorLog({ sim: this.opts.device, showLogs: this.opts.showIOSLog, xcodeVersion: this.xcodeVersion, iosSimulatorLogsPredicate: this.opts.iosSimulatorLogsPredicate }); } this.logs.safariConsole = new _safariConsoleLog.default(!!this.opts.showSafariConsoleLog); this.logs.safariNetwork = new _safariNetworkLog.default(!!this.opts.showSafariNetworkLog); } try { await this.logs.syslog.startCapture(); } catch (err) { _logger.default.warn(`Continuing without capturing device logs: ${err.message}`); return false; } await this.logs.crashlog.startCapture(); await this.logs.safariConsole.startCapture(); await this.logs.safariNetwork.startCapture(); return true; }; extensions.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() { const pathname = WEBSOCKET_ENDPOINT(this.sessionId); if (!_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) { _logger.default.debug(`The system logs broadcasting web socket server is already listening at ${pathname}`); return; } _logger.default.info(`Assigning system logs broadcasting web socket server to ${pathname}`); const wss = new _ws.default.Server({ noServer: true }); wss.on('connection', (ws, req) => { if (req) { const remoteIp = _lodash.default.isEmpty(req.headers['x-forwarded-for']) ? req.connection.remoteAddress : req.headers['x-forwarded-for']; _logger.default.debug(`Established a new system logs listener web socket connection from ${remoteIp}`); } else { _logger.default.debug('Established a new system logs listener web socket connection'); } if (_lodash.default.isEmpty(this._syslogWebsocketListener)) { this._syslogWebsocketListener = logRecord => { if (ws && ws.readyState === _ws.default.OPEN) { ws.send(logRecord.message); } }; } this.logs.syslog.on('output', this._syslogWebsocketListener); ws.on('close', (code, reason) => { if (!_lodash.default.isEmpty(this._syslogWebsocketListener)) { this.logs.syslog.removeListener('output', this._syslogWebsocketListener); this._syslogWebsocketListener = null; } let closeMsg = 'System logs listener web socket is closed.'; if (!_lodash.default.isEmpty(code)) { closeMsg += ` Code: ${code}.`; } if (!_lodash.default.isEmpty(reason)) { closeMsg += ` Reason: ${reason}.`; } _logger.default.debug(closeMsg); }); }); await this.server.addWebSocketHandler(pathname, wss); }; extensions.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast() { const pathname = WEBSOCKET_ENDPOINT(this.sessionId); if (_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) { return; } _logger.default.debug('Stopping the system logs broadcasting web socket server'); await this.server.removeWebSocketHandler(pathname); }; var _default = extensions; exports.default = _default;require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9sb2cuanMiXSwibmFtZXMiOlsiZXh0ZW5zaW9ucyIsIldFQlNPQ0tFVF9FTkRQT0lOVCIsInNlc3Npb25JZCIsIkRFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYIiwiT2JqZWN0IiwiYXNzaWduIiwiaW9zQ29tbWFuZHMiLCJsb2dnaW5nIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJzYWZhcmlDb25zb2xlIiwiZGVzY3JpcHRpb24iLCJnZXR0ZXIiLCJzZWxmIiwiZXh0cmFjdExvZ3MiLCJsb2dzIiwic2FmYXJpTmV0d29yayIsInN0YXJ0TG9nQ2FwdHVyZSIsIl8iLCJpc1VuZGVmaW5lZCIsInN5c2xvZyIsImlzQ2FwdHVyaW5nIiwibG9nIiwid2FybiIsImNyYXNobG9nIiwiSU9TQ3Jhc2hMb2ciLCJzaW0iLCJvcHRzIiwiZGV2aWNlIiwidWRpZCIsImlzUmVhbERldmljZSIsInVuZGVmaW5lZCIsIklPU0RldmljZUxvZyIsInNob3dMb2dzIiwic2hvd0lPU0xvZyIsIklPU1NpbXVsYXRvckxvZyIsInhjb2RlVmVyc2lvbiIsImlvc1NpbXVsYXRvckxvZ3NQcmVkaWNhdGUiLCJTYWZhcmlDb25zb2xlTG9nIiwic2hvd1NhZmFyaUNvbnNvbGVMb2ciLCJTYWZhcmlOZXR3b3JrTG9nIiwic2hvd1NhZmFyaU5ldHdvcmtMb2ciLCJzdGFydENhcHR1cmUiLCJlcnIiLCJtZXNzYWdlIiwibW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0IiwicGF0aG5hbWUiLCJpc0VtcHR5Iiwic2VydmVyIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZXEiLCJyZW1vdGVJcCIsImhlYWRlcnMiLCJjb25uZWN0aW9uIiwicmVtb3RlQWRkcmVzcyIsIl9zeXNsb2dXZWJzb2NrZXRMaXN0ZW5lciIsImxvZ1JlY29yZCIsInJlYWR5U3RhdGUiLCJPUEVOIiwic2VuZCIsImNvZGUiLCJyZWFzb24iLCJyZW1vdmVMaXN0ZW5lciIsImNsb3NlTXNnIiwiYWRkV2ViU29ja2V0SGFuZGxlciIsIm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0IiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7O0FBRUEsTUFBTUMsa0JBQWtCLEdBQUlDLFNBQUQsSUFBZ0IsR0FBRUMsNkNBQTJCLFlBQVdELFNBQVUsdUJBQTdGOztBQUVBRSxNQUFNLENBQUNDLE1BQVAsQ0FBY0wsVUFBZCxFQUEwQk0sOEJBQVlDLE9BQXRDO0FBRUFQLFVBQVUsQ0FBQ1EsaUJBQVgsQ0FBNkJDLGFBQTdCLEdBQTZDO0FBQzNDQyxFQUFBQSxXQUFXLEVBQUUsZ0VBRDhCO0FBRTNDQyxFQUFBQSxNQUFNLEVBQUUsTUFBT0MsSUFBUCxJQUFnQixNQUFNQSxJQUFJLENBQUNDLFdBQUwsQ0FBaUIsZUFBakIsRUFBa0NELElBQUksQ0FBQ0UsSUFBdkM7QUFGYSxDQUE3QztBQUtBZCxVQUFVLENBQUNRLGlCQUFYLENBQTZCTyxhQUE3QixHQUE2QztBQUMzQ0wsRUFBQUEsV0FBVyxFQUFFLGlGQUQ4QjtBQUUzQ0MsRUFBQUEsTUFBTSxFQUFFLE1BQU9DLElBQVAsSUFBZ0IsTUFBTUEsSUFBSSxDQUFDQyxXQUFMLENBQWlCLGVBQWpCLEVBQWtDRCxJQUFJLENBQUNFLElBQXZDO0FBRmEsQ0FBN0M7O0FBS0FkLFVBQVUsQ0FBQ2dCLGVBQVgsR0FBNkIsZUFBZUEsZUFBZixHQUFrQztBQUM3RCxPQUFLRixJQUFMLEdBQVksS0FBS0EsSUFBTCxJQUFhLEVBQXpCOztBQUNBLE1BQUksQ0FBQ0csZ0JBQUVDLFdBQUYsQ0FBYyxLQUFLSixJQUFMLENBQVVLLE1BQXhCLENBQUQsSUFBb0MsS0FBS0wsSUFBTCxDQUFVSyxNQUFW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VUFBSSxDQUFDbEQsZ0JBQUU2QixPQUFGLENBQVVzQixNQUFWLENBQUwsRUFBd0I7QUFDdEJFLFFBQUFBLFFBQVEsSUFBSyxZQUFXRixNQUFPLEdBQS9CO0FBQ0Q7O0FBQ0QvQyxzQkFBSTRCLEtBQUosQ0FBVXFCLFFBQVY7QUFDRCxLQWREO0FBZUQsR0FsQ0Q7QUFtQ0EsUUFBTSxLQUFLdkIsTUFBTCxDQUFZd0IsbUJBQVosQ0FBZ0MxQixRQUFoQyxFQUEwQ00sR0FBMUMsQ0FBTjtBQUNELENBaEREOztBQXNEQW5ELFVBQVUsQ0FBQ3dFLHVCQUFYLEdBQXFDLGVBQWVBLHVCQUFmLEdBQTBDO0FBQzdFLFFBQU0zQixRQUFRLEdBQUc1QyxrQkFBa0IsQ0FBQyxLQUFLQyxTQUFOLENBQW5DOztBQUNBLE1BQUllLGdCQUFFNkIsT0FBRixDQUFVLE1BQU0sS0FBS0MsTUFBTCxDQUFZQyxvQkFBWixDQUFpQ0gsUUFBakMsQ0FBaEIsQ0FBSixFQUFpRTtBQUMvRDtBQUNEOztBQUVEeEIsa0JBQUk0QixLQUFKLENBQVUseURBQVY7O0FBQ0EsUUFBTSxLQUFLRixNQUFMLENBQVkwQixzQkFBWixDQUFtQzVCLFFBQW5DLENBQU47QUFDRCxDQVJEOztlQVdlN0MsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCB9IGZyb20gJ2dzdC1hdG9tLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGlvc0NvbW1hbmRzIH0gZnJvbSAnZ3N0LWF0b20taW9zLWRyaXZlcic7XG5pbXBvcnQgeyBJT1NDcmFzaExvZyB9IGZyb20gJy4uL2RldmljZS1sb2cvaW9zLWNyYXNoLWxvZyc7XG5pbXBvcnQgeyBJT1NTaW11bGF0b3JMb2cgfSBmcm9tICcuLi9kZXZpY2UtbG9nL2lvcy1zaW11bGF0b3ItbG9nJztcbmltcG9ydCB7IElPU0RldmljZUxvZyB9IGZyb20gJy4uL2RldmljZS1sb2cvaW9zLWRldmljZS1sb2cnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgU2FmYXJpQ29uc29sZUxvZyBmcm9tICcuLi9kZXZpY2UtbG9nL3NhZmFyaS1jb25zb2xlLWxvZyc7XG5pbXBvcnQgU2FmYXJpTmV0d29ya0xvZyBmcm9tICcuLi9kZXZpY2UtbG9nL3NhZmFyaS1uZXR3b3JrLWxvZyc7XG5cblxubGV0IGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgV0VCU09DS0VUX0VORFBPSU5UID0gKHNlc3Npb25JZCkgPT4gYCR7REVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVh9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9kZXZpY2Uvc3lzbG9nYDtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBpb3NDb21tYW5kcy5sb2dnaW5nKTtcblxuZXh0ZW5zaW9ucy5zdXBwb3J0ZWRMb2dUeXBlcy5zYWZhcmlDb25zb2xlID0ge1xuICBkZXNjcmlwdGlvbjogJ1NhZmFyaSBDb25zb2xlIExvZ3MgLSBkYXRhIHdyaXR0ZW4gdG8gdGhlIEpTIGNvbnNvbGUgaW4gU2FmYXJpJyxcbiAgZ2V0dGVyOiBhc3luYyAoc2VsZikgPT4gYXdhaXQgc2VsZi5leHRyYWN0TG9ncygnc2FmYXJpQ29uc29sZScsIHNlbGYubG9ncyksXG59O1xuXG5leHRlbnNpb25zLnN1cHBvcnRlZExvZ1R5cGVzLnNhZmFyaU5ldHdvcmsgPSB7XG4gIGRlc2NyaXB0aW9uOiAnU2FmYXJpIE5ldHdvcmsgTG9ncyAtIGluZm9ybWF0aW9uIGFib3V0IG5ldHdvcmsgb3BlcmF0aW9ucyB1bmRlcnRha2VuIGJ5IFNhZmFyaScsXG4gIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IGF3YWl0IHNlbGYuZXh0cmFjdExvZ3MoJ3NhZmFyaU5ldHdvcmsnLCBzZWxmLmxvZ3MpLFxufTtcblxuZXh0ZW5zaW9ucy5zdGFydExvZ0NhcHR1cmUgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ0NhcHR1cmUgKCkge1xuICB0aGlzLmxvZ3MgPSB0aGlzLmxvZ3MgfHwge307XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmxvZ3Muc3lzbG9nKSAmJiB0aGlzLmxvZ3Muc3lzbG9nLmlzQ2FwdHVyaW5nKSB7XG4gICAgbG9nLndhcm4oJ1RyeWluZyB0byBzdGFydCBpT1MgbG9nIGNhcHR1cmUgYnV0IGl0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQhJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5sb2dzLnN5c2xvZykpIHtcbiAgICB0aGlzLmxvZ3MuY3Jhc2hsb2cgPSBuZXcgSU9TQ3Jhc2hMb2coe1xuICAgICAgc2ltOiB0aGlzLm9wdHMuZGV2aWNlLFxuICAgICAgdWRpZDogdGhpcy5pc1JlYWxEZXZpY2UoKSA/IHRoaXMub3B0cy51ZGlkIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNSZWFsRGV2aWNlKCkpIHtcbiAgICAgIHRoaXMubG9ncy5zeXNsb2cgPSBuZXcgSU9TRGV2aWNlTG9nKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIHNob3dMb2dzOiB0aGlzLm9wdHMuc2hvd0lPU0xvZyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ3Muc3lzbG9nID0gbmV3IElPU1NpbXVsYXRvckxvZyh7XG4gICAgICAgIHNpbTogdGhpcy5vcHRzLmRldmljZSxcbiAgICAgICAgc2hvd0xvZ3M6IHRoaXMub3B0cy5zaG93SU9TTG9nLFxuICAgICAgICB4Y29kZVZlcnNpb246IHRoaXMueGNvZGVWZXJzaW9uLFxuICAgICAgICBpb3NTaW11bGF0b3JMb2dzUHJlZGljYXRlOiB0aGlzLm9wdHMuaW9zU2ltdWxhdG9yTG9nc1ByZWRpY2F0ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSA9IG5ldyBTYWZhcmlDb25zb2xlTG9nKCEhdGhpcy5vcHRzLnNob3dTYWZhcmlDb25zb2xlTG9nKTtcbiAgICB0aGlzLmxvZ3Muc2FmYXJpTmV0d29yayA9IG5ldyBTYWZhcmlOZXR3b3JrTG9nKCEhdGhpcy5vcHRzLnNob3dTYWZhcmlOZXR3b3JrTG9nKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9ncy5zeXNsb2cuc3RhcnRDYXB0dXJlKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDb250aW51aW5nIHdpdGhvdXQgY2FwdHVyaW5nIGRldmljZSBsb2dzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCB0aGlzLmxvZ3MuY3Jhc2hsb2cuc3RhcnRDYXB0dXJlKCk7XG4gIGF3YWl0IHRoaXMubG9ncy5zYWZhcmlDb25zb2xlLnN0YXJ0Q2FwdHVyZSgpO1xuICBhd2FpdCB0aGlzLmxvZ3Muc2FmYXJpTmV0d29yay5zdGFydENhcHR1cmUoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogU3RhcnRzIGlPUyBzeXN0ZW0gbG9ncyBicm9hZGNhc3Qgd2Vic29ja2V0IG9uIHRoZSBzYW1lIGhvc3QgYW5kIHBvcnRcbiAqIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBgL3dzL3Nlc3Npb24vOnNlc3Npb25JZDovYXBwaXVtL3N5c2xvZ2AgZW5kcG9pbnQuIFRoZSBtZXRob2RcbiAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB3ZWIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLlxuICpcbiAqIEVhY2ggY29ubmVjdGVkIHdlYmNva2V0IGxpc3RlbmVyIHdpbGwgcmVjZWl2ZSBzeXNsb2cgbGluZXNcbiAqIGFzIHNvb24gYXMgdGhleSBhcmUgdmlzaWJsZSB0byBBcHBpdW0uXG4gKi9cbmV4dGVuc2lvbnMubW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ICgpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBXRUJTT0NLRVRfRU5EUE9JTlQodGhpcy5zZXNzaW9uSWQpO1xuICBpZiAoIV8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgc3lzdGVtIGxvZ3MgYnJvYWRjYXN0aW5nIHdlYiBzb2NrZXQgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nIGF0ICR7cGF0aG5hbWV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYEFzc2lnbmluZyBzeXN0ZW0gbG9ncyBicm9hZGNhc3Rpbmcgd2ViIHNvY2tldCBzZXJ2ZXIgdG8gJHtwYXRobmFtZX1gKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kXG4gIGNvbnN0IHdzcyA9IG5ldyBXZWJTb2NrZXQuU2VydmVyKHtcbiAgICBub1NlcnZlcjogdHJ1ZSxcbiAgfSk7XG4gIHdzcy5vbignY29ubmVjdGlvbicsICh3cywgcmVxKSA9PiB7XG4gICAgaWYgKHJlcSkge1xuICAgICAgY29uc3QgcmVtb3RlSXAgPSBfLmlzRW1wdHkocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddKVxuICAgICAgICA/IHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3NcbiAgICAgICAgOiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ107XG4gICAgICBsb2cuZGVidWcoYEVzdGFibGlzaGVkIGEgbmV3IHN5c3RlbSBsb2dzIGxpc3RlbmVyIHdlYiBzb2NrZXQgY29ubmVjdGlvbiBmcm9tICR7cmVtb3RlSXB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZygnRXN0YWJsaXNoZWQgYSBuZXcgc3lzdGVtIGxvZ3MgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zeXNsb2dXZWJzb2NrZXRMaXN0ZW5lcikpIHtcbiAgICAgIHRoaXMuX3N5c2xvZ1dlYnNvY2tldExpc3RlbmVyID0gKGxvZ1JlY29yZCkgPT4ge1xuICAgICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB3cy5zZW5kKGxvZ1JlY29yZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5sb2dzLnN5c2xvZy5vbignb3V0cHV0JywgdGhpcy5fc3lzbG9nV2Vic29ja2V0TGlzdGVuZXIpO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc3lzbG9nV2Vic29ja2V0TGlzdGVuZXIpKSB7XG4gICAgICAgIHRoaXMubG9ncy5zeXNsb2cucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIHRoaXMuX3N5c2xvZ1dlYnNvY2tldExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5fc3lzbG9nV2Vic29ja2V0TGlzdGVuZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBsZXQgY2xvc2VNc2cgPSAnU3lzdGVtIGxvZ3MgbGlzdGVuZXIgd2ViIHNvY2tldCBpcyBjbG9zZWQuJztcbiAgICAgIGlmICghXy5pc0VtcHR5KGNvZGUpKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgQ29kZTogJHtjb2RlfS5gO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkocmVhc29uKSkge1xuICAgICAgICBjbG9zZU1zZyArPSBgIFJlYXNvbjogJHtyZWFzb259LmA7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoY2xvc2VNc2cpO1xuICAgIH0pO1xuICB9KTtcbiAgYXdhaXQgdGhpcy5zZXJ2ZXIuYWRkV2ViU29ja2V0SGFuZGxlcihwYXRobmFtZSwgd3NzKTtcbn07XG5cbi8qKlxuICogU3RvcHMgdGhlIHByZXZpb3VzbHkgc3RhcnRlZCBzeXNsb2cgYnJvYWRjYXN0aW5nIHdlc29ja2V0IHNlcnZlci5cbiAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIG5vIHNlcnZlciBpcyBydW5uaW5nLlxuICovXG5leHRlbnNpb25zLm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmIChfLmlzRW1wdHkoYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMocGF0aG5hbWUpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnU3RvcHBpbmcgdGhlIHN5c3RlbSBsb2dzIGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlcicpO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2xvZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9