webdriverio-automation
Version:
WebdriverIO-Automation android ios project
121 lines (86 loc) • 14.1 kB
JavaScript
;
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 _path = _interopRequireDefault(require("path"));
var _child_process = _interopRequireDefault(require("child_process"));
var _logger = _interopRequireDefault(require("../logger"));
var _bluebird = _interopRequireDefault(require("bluebird"));
const BASE_PATH = '/wd/hub';
const FEAT_FLAG = 'execute_driver_script';
const DEFAULT_SCRIPT_TIMEOUT = 1000 * 60 * 60;
const SCRIPT_TYPE_WDIO = 'webdriverio';
let commands = {};
commands.executeDriverScript = async function (script, scriptType = 'webdriverio', timeout = DEFAULT_SCRIPT_TIMEOUT) {
if (!this.isFeatureEnabled(FEAT_FLAG)) {
throw new Error(`Execute driver script functionality is not available ` + `unless server is started with --allow-insecure including ` + `the '${FEAT_FLAG}' flag, e.g., --allow-insecure=${FEAT_FLAG}`);
}
if (scriptType !== SCRIPT_TYPE_WDIO) {
throw new Error(`Only the '${SCRIPT_TYPE_WDIO}' script type is currently supported`);
}
if (!this.opts.address || !this.opts.port) {
throw new Error('Address or port of running server were not defined; this ' + 'is required. This is probably a programming error in the driver');
}
if (!_lodash.default.isNumber(timeout)) {
throw new Error('Timeout parameter must be a number');
}
const driverOpts = {
sessionId: this.sessionId,
protocol: 'http',
hostname: this.opts.address,
port: this.opts.port,
path: BASE_PATH,
isW3C: this.isW3CProtocol(),
isMobile: true,
capabilities: this.caps
};
_logger.default.info(`Constructed webdriverio driver options; W3C mode is ${driverOpts.isW3C ? 'on' : 'off'}`);
const childScript = _path.default.join(__dirname, 'execute-child.js');
_logger.default.info(`Forking process to run webdriver script as child using ${childScript}`);
const scriptProc = _child_process.default.fork(childScript);
let timeoutCanceled = false;
try {
const timeoutStart = Date.now();
const waitForResult = async function () {
const resPromise = new _bluebird.default(res => {
scriptProc.on('message', res);
});
const res = await resPromise;
_logger.default.info('Received execute driver script result from child process, shutting it down');
if (res.error) {
throw new Error(res.error.message);
}
return res.success;
};
const waitForTimeout = async function () {
while (!timeoutCanceled && Date.now() - timeoutStart < timeout) {
await _bluebird.default.delay(500);
}
if (timeoutCanceled) {
return;
}
throw new Error(`Execute driver script timed out after ${timeout}ms. ` + `You can adjust this with the 'timeout' parameter.`);
};
_logger.default.info('Sending driver and script data to child');
scriptProc.send({
driverOpts,
script,
timeout
});
return await _bluebird.default.race([waitForResult(), waitForTimeout()]);
} catch (err) {
throw new Error(`Could not execute driver script. Original error was: ${err}`);
} finally {
timeoutCanceled = true;
_logger.default.info('Disconnecting from and killing driver script child proc');
scriptProc.disconnect();
scriptProc.kill();
}
};
var _default = commands;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwibmFtZXMiOlsiQkFTRV9QQVRIIiwiRkVBVF9GTEFHIiwiREVGQVVMVF9TQ1JJUFRfVElNRU9VVCIsIlNDUklQVF9UWVBFX1dESU8iLCJjb21tYW5kcyIsImV4ZWN1dGVEcml2ZXJTY3JpcHQiLCJzY3JpcHQiLCJzY3JpcHRUeXBlIiwidGltZW91dCIsImlzRmVhdHVyZUVuYWJsZWQiLCJFcnJvciIsIm9wdHMiLCJhZGRyZXNzIiwicG9ydCIsIl8iLCJpc051bWJlciIsImRyaXZlck9wdHMiLCJzZXNzaW9uSWQiLCJwcm90b2NvbCIsImhvc3RuYW1lIiwicGF0aCIsImlzVzNDIiwiaXNXM0NQcm90b2NvbCIsImlzTW9iaWxlIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsImxvZyIsImluZm8iLCJjaGlsZFNjcmlwdCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJzY3JpcHRQcm9jIiwiY3AiLCJmb3JrIiwidGltZW91dENhbmNlbGVkIiwidGltZW91dFN0YXJ0IiwiRGF0ZSIsIm5vdyIsIndhaXRGb3JSZXN1bHQiLCJyZXNQcm9taXNlIiwiQiIsInJlcyIsIm9uIiwiZXJyb3IiLCJtZXNzYWdlIiwic3VjY2VzcyIsIndhaXRGb3JUaW1lb3V0IiwiZGVsYXkiLCJzZW5kIiwicmFjZSIsImVyciIsImRpc2Nvbm5lY3QiLCJraWxsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFNBQVMsR0FBRyxTQUFsQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyx1QkFBbEI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxPQUFPLEVBQVAsR0FBWSxFQUEzQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLGFBQXpCO0FBR0EsSUFBSUMsUUFBUSxHQUFHLEVBQWY7O0FBY0FBLFFBQVEsQ0FBQ0MsbUJBQVQsR0FBK0IsZ0JBQWdCQyxNQUFoQixFQUF3QkMsVUFBVSxHQUFHLGFBQXJDLEVBQzdCQyxPQUFPLEdBQUdOLHNCQURtQixFQUNLO0FBRWxDLE1BQUksQ0FBQyxLQUFLTyxnQkFBTCxDQUFzQlIsU0FBdEIsQ0FBTCxFQUF1QztBQUNyQyxVQUFNLElBQUlTLEtBQUosQ0FBVyx1REFBRCxHQUNDLDJEQURELEdBRUMsUUFBT1QsU0FBVSxrQ0FBaUNBLFNBQVUsRUFGdkUsQ0FBTjtBQUdEOztBQUVELE1BQUlNLFVBQVUsS0FBS0osZ0JBQW5CLEVBQXFDO0FBQ25DLFVBQU0sSUFBSU8sS0FBSixDQUFXLGFBQVlQLGdCQUFpQixzQ0FBeEMsQ0FBTjtBQUNEOztBQUVELE1BQUksQ0FBQyxLQUFLUSxJQUFMLENBQVVDLE9BQVgsSUFBc0IsQ0FBQyxLQUFLRCxJQUFMLENBQVVFLElBQXJDLEVBQTJDO0FBQ3pDLFVBQU0sSUFBSUgsS0FBSixDQUFVLDhEQUNBLGlFQURWLENBQU47QUFFRDs7QUFFRCxNQUFJLENBQUNJLGdCQUFFQyxRQUFGLENBQVdQLE9BQVgsQ0FBTCxFQUEwQjtBQUN4QixVQUFNLElBQUlFLEtBQUosQ0FBVSxvQ0FBVixDQUFOO0FBQ0Q7O0FBRUQsUUFBTU0sVUFBVSxHQUFHO0FBQ2pCQyxJQUFBQSxTQUFTLEVBQUUsS0FBS0EsU0FEQztBQUVqQkMsSUFBQUEsUUFBUSxFQUFFLE1BRk87QUFHakJDLElBQUFBLFFBQVEsRUFBRSxLQUFLUixJQUFMLENBQVVDLE9BSEg7QUFJakJDLElBQUFBLElBQUksRUFBRSxLQUFLRixJQUFMLENBQVVFLElBSkM7QUFLakJPLElBQUFBLElBQUksRUFBRXBCLFNBTFc7QUFNakJxQixJQUFBQSxLQUFLLEVBQUUsS0FBS0MsYUFBTCxFQU5VO0FBT2pCQyxJQUFBQSxRQUFRLEVBQUUsSUFQTztBQVFqQkMsSUFBQUEsWUFBWSxFQUFFLEtBQUtDO0FBUkYsR0FBbkI7O0FBVUFDLGtCQUFJQyxJQUFKLENBQVUsdURBQXNEWCxVQUFVLENBQUNLLEtBQVgsR0FBbUIsSUFBbkIsR0FBMEIsS0FBTSxFQUFoRzs7QUFJQSxRQUFNTyxXQUFXLEdBQUdSLGNBQUtTLElBQUwsQ0FBVUMsU0FBVixFQUFxQixrQkFBckIsQ0FBcEI7O0FBQ0FKLGtCQUFJQyxJQUFKLENBQVUsMERBQXlEQyxXQUFZLEVBQS9FOztBQUNBLFFBQU1HLFVBQVUsR0FBR0MsdUJBQUdDLElBQUgsQ0FBUUwsV0FBUixDQUFuQjs7QUFJQSxNQUFJTSxlQUFlLEdBQUcsS0FBdEI7O0FBRUEsTUFBSTtBQUNGLFVBQU1DLFlBQVksR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEVBQXJCOztBQUdBLFVBQU1DLGFBQWEsR0FBRyxrQkFBa0I7QUFDdEMsWUFBTUMsVUFBVSxHQUFHLElBQUlDLGlCQUFKLENBQU9DLEdBQUQsSUFBUztBQUNoQ1YsUUFBQUEsVUFBVSxDQUFDVyxFQUFYLENBQWMsU0FBZCxFQUF5QkQsR0FBekI7QUFDRCxPQUZrQixDQUFuQjtBQUlBLFlBQU1BLEdBQUcsR0FBRyxNQUFNRixVQUFsQjs7QUFDQWIsc0JBQUlDLElBQUosQ0FBUyw0RUFBVDs7QUFFQSxVQUFJYyxHQUFHLENBQUNFLEtBQVIsRUFBZTtBQUNiLGNBQU0sSUFBSWpDLEtBQUosQ0FBVStCLEdBQUcsQ0FBQ0UsS0FBSixDQUFVQyxPQUFwQixDQUFOO0FBQ0Q7O0FBRUQsYUFBT0gsR0FBRyxDQUFDSSxPQUFYO0FBQ0QsS0FiRDs7QUFrQkEsVUFBTUMsY0FBYyxHQUFHLGtCQUFrQjtBQUN2QyxhQUFPLENBQUNaLGVBQUQsSUFBcUJFLElBQUksQ0FBQ0MsR0FBTCxLQUFhRixZQUFkLEdBQThCM0IsT0FBekQsRUFBa0U7QUFDaEUsY0FBTWdDLGtCQUFFTyxLQUFGLENBQVEsR0FBUixDQUFOO0FBQ0Q7O0FBRUQsVUFBSWIsZUFBSixFQUFxQjtBQUNuQjtBQUNEOztBQUVELFlBQU0sSUFBSXhCLEtBQUosQ0FBVyx5Q0FBd0NGLE9BQVEsTUFBakQsR0FDQyxtREFEWCxDQUFOO0FBRUQsS0FYRDs7QUFlQWtCLG9CQUFJQyxJQUFKLENBQVMseUNBQVQ7O0FBQ0FJLElBQUFBLFVBQVUsQ0FBQ2lCLElBQVgsQ0FBZ0I7QUFBQ2hDLE1BQUFBLFVBQUQ7QUFBYVYsTUFBQUEsTUFBYjtBQUFxQkUsTUFBQUE7QUFBckIsS0FBaEI7QUFHQSxXQUFPLE1BQU1nQyxrQkFBRVMsSUFBRixDQUFPLENBQUNYLGFBQWEsRUFBZCxFQUFrQlEsY0FBYyxFQUFoQyxDQUFQLENBQWI7QUFDRCxHQTFDRCxDQTBDRSxPQUFPSSxHQUFQLEVBQVk7QUFDWixVQUFNLElBQUl4QyxLQUFKLENBQVcsd0RBQXVEd0MsR0FBSSxFQUF0RSxDQUFOO0FBQ0QsR0E1Q0QsU0E0Q1U7QUFHUmhCLElBQUFBLGVBQWUsR0FBRyxJQUFsQjs7QUFFQVIsb0JBQUlDLElBQUosQ0FBUyx5REFBVDs7QUFDQUksSUFBQUEsVUFBVSxDQUFDb0IsVUFBWDtBQUNBcEIsSUFBQUEsVUFBVSxDQUFDcUIsSUFBWDtBQUNEO0FBQ0YsQ0FqR0Q7O2VBb0dlaEQsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjcCBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9QQVRIID0gJy93ZC9odWInOyAvLyBUT0RPIGRlZmluaW5nIHRoaXMgaGVyZSBpcyBicml0dGxlIGJ1dCBpdCBpcyBoYXJkY29kZWQgaW4gcm91dGVzLCBzby4uLlxuY29uc3QgRkVBVF9GTEFHID0gJ2V4ZWN1dGVfZHJpdmVyX3NjcmlwdCc7XG5jb25zdCBERUZBVUxUX1NDUklQVF9USU1FT1VUID0gMTAwMCAqIDYwICogNjA7IC8vIGRlZmF1bHQgdG8gMSBob3VyIHRpbWVvdXRcbmNvbnN0IFNDUklQVF9UWVBFX1dESU8gPSAnd2ViZHJpdmVyaW8nO1xuLy8gVE9ETyBhZGQgd2Qgc2NyaXB0IHR5cGUgYXQgc29tZSBwb2ludFxuXG5sZXQgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHN0cmluZyB3aGljaCBpcyBleGVjdXRlZCBhcyBqYXZhc2NyaXB0IGluIHRoZSBjb250ZXh0IG9mXG4gKiBhIG5ldyBub2RlanMgVk0sIGFuZCB3aGljaCBoYXMgYXZhaWxhYmxlIGEgd2ViZHJpdmVyaW8gZHJpdmVyIG9iamVjdCwgaGF2aW5nXG4gKiBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nIHNlc3Npb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdCAtIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkcml2ZXIgc2NyaXB0IHRvIHJ1blxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHRUeXBlPSd3ZWJkcml2ZXJpbyddIC0gdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBzY3JpcHRcbiAqIGxpYnJhcnkgKGN1cnJlbnRseSBvbmx5IHdlYmRyaXZlcmlvIGlzIHN1cHBvcnRlZClcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIGEgSlNPTmlmaWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mXG4gKiB0aGUgc2NyaXB0XG4gKi9cbmNvbW1hbmRzLmV4ZWN1dGVEcml2ZXJTY3JpcHQgPSBhc3luYyBmdW5jdGlvbiAoc2NyaXB0LCBzY3JpcHRUeXBlID0gJ3dlYmRyaXZlcmlvJyxcbiAgdGltZW91dCA9IERFRkFVTFRfU0NSSVBUX1RJTUVPVVQpIHtcblxuICBpZiAoIXRoaXMuaXNGZWF0dXJlRW5hYmxlZChGRUFUX0ZMQUcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeGVjdXRlIGRyaXZlciBzY3JpcHQgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdW5sZXNzIHNlcnZlciBpcyBzdGFydGVkIHdpdGggLS1hbGxvdy1pbnNlY3VyZSBpbmNsdWRpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgJyR7RkVBVF9GTEFHfScgZmxhZywgZS5nLiwgLS1hbGxvdy1pbnNlY3VyZT0ke0ZFQVRfRkxBR31gKTtcbiAgfVxuXG4gIGlmIChzY3JpcHRUeXBlICE9PSBTQ1JJUFRfVFlQRV9XRElPKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRoZSAnJHtTQ1JJUFRfVFlQRV9XRElPfScgc2NyaXB0IHR5cGUgaXMgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYWRkcmVzcyB8fCAhdGhpcy5vcHRzLnBvcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZHJlc3Mgb3IgcG9ydCBvZiBydW5uaW5nIHNlcnZlciB3ZXJlIG5vdCBkZWZpbmVkOyB0aGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAnaXMgcmVxdWlyZWQuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvciBpbiB0aGUgZHJpdmVyJyk7XG4gIH1cblxuICBpZiAoIV8uaXNOdW1iZXIodGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGRyaXZlck9wdHMgPSB7XG4gICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICBwcm90b2NvbDogJ2h0dHAnLCAvLyBBcHBpdW0gd29uJ3QgZXZlciBiZSBiZWhpbmQgc3NsIGxvY2FsbHlcbiAgICBob3N0bmFtZTogdGhpcy5vcHRzLmFkZHJlc3MsXG4gICAgcG9ydDogdGhpcy5vcHRzLnBvcnQsXG4gICAgcGF0aDogQkFTRV9QQVRILFxuICAgIGlzVzNDOiB0aGlzLmlzVzNDUHJvdG9jb2woKSxcbiAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2Fwc1xuICB9O1xuICBsb2cuaW5mbyhgQ29uc3RydWN0ZWQgd2ViZHJpdmVyaW8gZHJpdmVyIG9wdGlvbnM7IFczQyBtb2RlIGlzICR7ZHJpdmVyT3B0cy5pc1czQyA/ICdvbicgOiAnb2ZmJ31gKTtcblxuXG4gIC8vIGZvcmsgdGhlIGV4ZWN1dGlvbiBzY3JpcHQgYXMgYSBjaGlsZCBwcm9jZXNzXG4gIGNvbnN0IGNoaWxkU2NyaXB0ID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2V4ZWN1dGUtY2hpbGQuanMnKTtcbiAgbG9nLmluZm8oYEZvcmtpbmcgcHJvY2VzcyB0byBydW4gd2ViZHJpdmVyIHNjcmlwdCBhcyBjaGlsZCB1c2luZyAke2NoaWxkU2NyaXB0fWApO1xuICBjb25zdCBzY3JpcHRQcm9jID0gY3AuZm9yayhjaGlsZFNjcmlwdCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGhhdmUgY2FuY2VsZWQgdGhlIHNjcmlwdCB0aW1lb3V0LCBzbyB3ZSBjYW4gc3RvcFxuICAvLyB3YWl0aW5nIGZvciBpdCBhbmQgYWxsb3cgdGhpcyBwcm9jZXNzIHRvIGZpbmlzaCBncmFjZWZ1bGx5XG4gIGxldCB0aW1lb3V0Q2FuY2VsZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRpbWVvdXRTdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgZGVhbHMgd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCB3YWl0Rm9yUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzUHJvbWlzZSA9IG5ldyBCKChyZXMpID0+IHtcbiAgICAgICAgc2NyaXB0UHJvYy5vbignbWVzc2FnZScsIHJlcyk7IC8vIHRoaXMgaXMgbm9kZSBJUENcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXNQcm9taXNlO1xuICAgICAgbG9nLmluZm8oJ1JlY2VpdmVkIGV4ZWN1dGUgZHJpdmVyIHNjcmlwdCByZXN1bHQgZnJvbSBjaGlsZCBwcm9jZXNzLCBzaHV0dGluZyBpdCBkb3duJyk7XG5cbiAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5lcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcy5zdWNjZXNzO1xuICAgIH07XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgd2FpdHMgdXAgdG8gdGhlIHRpbWVvdXQgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzbywgb3IgZG9lc1xuICAgIC8vIG5vdGhpbmcgaWYgdGhlIHRpbWVvdXQgaXMgY2FuY2VsZWQgYmVjYXVzZSB3ZSBnb3QgYSByZXN1bHQgZnJvbSB0aGVcbiAgICAvLyBjaGlsZCBzY3JpcHRcbiAgICBjb25zdCB3YWl0Rm9yVGltZW91dCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICghdGltZW91dENhbmNlbGVkICYmIChEYXRlLm5vdygpIC0gdGltZW91dFN0YXJ0KSA8IHRpbWVvdXQpIHtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZW91dENhbmNlbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeGVjdXRlIGRyaXZlciBzY3JpcHQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW4gYWRqdXN0IHRoaXMgd2l0aCB0aGUgJ3RpbWVvdXQnIHBhcmFtZXRlci5gKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRoYXQgdGhlIGNoaWxkIHNjcmlwdCBpcyBhbGl2ZSwgc2VuZCBpdCB0aGUgZGF0YSBpdCBuZWVkcyB0byBzdGFydFxuICAgIC8vIHJ1bm5pbmcgdGhlIGRyaXZlciBzY3JpcHRcbiAgICBsb2cuaW5mbygnU2VuZGluZyBkcml2ZXIgYW5kIHNjcmlwdCBkYXRhIHRvIGNoaWxkJyk7XG4gICAgc2NyaXB0UHJvYy5zZW5kKHtkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXR9KTtcblxuICAgIC8vIGFuZCBzZXQgdXAgYSByYWNlIGJldHdlZW4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNoaWxkIGFuZCB0aGUgdGltZW91dFxuICAgIHJldHVybiBhd2FpdCBCLnJhY2UoW3dhaXRGb3JSZXN1bHQoKSwgd2FpdEZvclRpbWVvdXQoKV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleGVjdXRlIGRyaXZlciBzY3JpcHQuIE9yaWdpbmFsIGVycm9yIHdhczogJHtlcnJ9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gZW5zdXJlIHdlIGFsd2F5cyBjYW5jZWwgdGhlIHRpbWVvdXQgc28gdGhhdCB0aGUgdGltZW91dCBwcm9taXNlIHN0b3BzXG4gICAgLy8gc3Bpbm5pbmcgYW5kIGFsbG93cyB0aGlzIHByb2Nlc3MgdG8gZGllIGdyYWNlZnVsbHlcbiAgICB0aW1lb3V0Q2FuY2VsZWQgPSB0cnVlO1xuXG4gICAgbG9nLmluZm8oJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBhbmQga2lsbGluZyBkcml2ZXIgc2NyaXB0IGNoaWxkIHByb2MnKTtcbiAgICBzY3JpcHRQcm9jLmRpc2Nvbm5lY3QoKTtcbiAgICBzY3JpcHRQcm9jLmtpbGwoKTtcbiAgfVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2Jhc2Vkcml2ZXIvY29tbWFuZHMvZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLiJ9