Socket
Socket
Sign inDemoInstall

appium-idb

Package Overview
Dependencies
302
Maintainers
7
Versions
48
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.6.5 to 1.6.6

70

build/lib/tools/system-commands.js

@@ -16,20 +16,6 @@ "use strict";

var _logger = _interopRequireDefault(require("../logger.js"));
const PROCESS_INIT_TIMEOUT = 5000;
const COMPANION_PGREP_PATTERN = udid => `${_helpers.IDB_COMPANION_EXECUTABLE}.*--udid[[:space:]]+${udid}`;
const COMPANION_STARTUP_REGEXP = /Started GRPC server on port (\d+)/;
const COMPANION_STARTUP_REGEXP = /"grpc_port":(\d+)/;
const COMPANION_STARTUP_ERROR_REGEXP = /New Error Built ==> (.+)/;
function buildDaemonArgs(opts = {}) {
const {
port,
grpcPort
} = opts;
const result = ['daemon'];
if (port) {
result.push('--port', port);
}
if (grpcPort) {
result.push('--grpc-port', grpcPort);
}
return result;
}
const COMPANION_STARTUP_TIMEOUT_SEC = 30;
const systemCallMethods = {};

@@ -95,3 +81,3 @@ systemCallMethods.connect = async function connect(opts = {}) {

companionProc.once('exit', listeners.exit);
}).timeout(60000, 'Was unable to acquire a GRPC port after 60 seconds timeout');
}).timeout(COMPANION_STARTUP_TIMEOUT_SEC * 1000, `Was unable to acquire a GRPC port after ${COMPANION_STARTUP_TIMEOUT_SEC}s timeout`);
} catch (err) {

@@ -110,3 +96,3 @@ cleanupListeners();

try {
await (0, _teen_process.exec)(_helpers.IDB_EXECUTABLE, ['connect', '127.0.0.1', grpcPort]);
await (0, _teen_process.exec)(_helpers.IDB_EXECUTABLE, ['connect', this.udid, grpcPort]);
} catch (connectionError) {

@@ -118,44 +104,10 @@ await (0, _asyncbox.retryInterval)(2, 100, async () => {

} catch (ign) {}
let isStartupMonitorEnabled = true;
try {
const daemon = new _teen_process.SubProcess(_helpers.IDB_EXECUTABLE, buildDaemonArgs({
port: this.executable.port,
grpcPort
}));
let daemonOutput = '';
daemon.on('output', (stdout, stderr) => {
if (isStartupMonitorEnabled && _lodash.default.trim(stdout || stderr)) {
daemonOutput += `[daemon] ${stdout || stderr}\n`;
}
});
try {
await daemon.start(null, PROCESS_INIT_TIMEOUT);
await _bluebird.default.delay(300);
} catch (ign) {}
if (daemon.isRunning) {
_logger.default.debug(`${_helpers.IDB_EXECUTABLE} daemon started on port ${this.executable.port || _helpers.DEFAULT_IDB_PORT}`);
} else {
if (!daemonOutput.includes('address already in use')) {
const message = `${_helpers.IDB_EXECUTABLE} daemon has failed to start: ${daemonOutput}`;
_logger.default.warn(message);
throw new Error(message);
}
_logger.default.debug(`The port ${this.executable.port || _helpers.DEFAULT_IDB_PORT} is already in use. ` + `Assuming it is used by ${_helpers.IDB_EXECUTABLE} daemon`);
}
await (0, _teen_process.exec)(_helpers.IDB_EXECUTABLE, ['connect', '127.0.0.1', grpcPort]);
} catch (connectionError2) {
if (connectionError2.stderr || connectionError2.stdout) {
_logger.default.debug(connectionError2.stderr || connectionError2.stdout);
}
throw connectionError2;
} finally {
isStartupMonitorEnabled = false;
}
await (0, _teen_process.exec)(_helpers.IDB_EXECUTABLE, ['connect', this.udid, grpcPort]);
});
}
} catch (e) {
if (e.stderr) {
_logger.default.debug(e.stderr);
if (e.stderr || e.stdout) {
_logger.default.debug(e.stderr || e.stdout);
}
throw new Error(`Cannot start ${_helpers.IDB_EXECUTABLE} service for '${this.udid}'. ` + `Check the server log for more details.`);
throw new Error(`Cannot start ${_helpers.IDB_EXECUTABLE} service for the device '${this.udid}'. ` + `Check the server log for more details.`);
}

@@ -176,2 +128,3 @@ _logger.default.info(`Successfully established the connection to ${_helpers.IDB_EXECUTABLE} service for '${this.udid}'`);

const timer = new _support.timing.Timer().start();
let lastError = null;
try {

@@ -183,2 +136,3 @@ await (0, _asyncbox.waitForCondition)(async () => {

} catch (e) {
lastError = e.stderr || e.message;
return false;

@@ -191,3 +145,3 @@ }

} catch (e) {
throw new Error(`The device '${this.udid}' is not responding to idb requests after ${timeoutMs}ms timeout. ` + `Original error: ${e.stderr || e.message}`);
throw new Error(`The device '${this.udid}' is not responding to idb requests after ${timeoutMs}ms timeout. ` + `Original error: ${lastError || e.message}`);
}

@@ -239,2 +193,2 @@ _logger.default.debug(`The device '${this.udid}' is online and ready to accept idb commands in ` + `${timer.getDuration().asSeconds.toFixed(3)}s`);

exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQUk9DRVNTX0lOSVRfVElNRU9VVCIsIkNPTVBBTklPTl9QR1JFUF9QQVRURVJOIiwidWRpZCIsIklEQl9DT01QQU5JT05fRVhFQ1VUQUJMRSIsIkNPTVBBTklPTl9TVEFSVFVQX1JFR0VYUCIsIkNPTVBBTklPTl9TVEFSVFVQX0VSUk9SX1JFR0VYUCIsImJ1aWxkRGFlbW9uQXJncyIsIm9wdHMiLCJwb3J0IiwiZ3JwY1BvcnQiLCJyZXN1bHQiLCJwdXNoIiwic3lzdGVtQ2FsbE1ldGhvZHMiLCJjb25uZWN0Iiwib25saW5lVGltZW91dCIsImxvZyIsImRlYnVnIiwiSURCX0VYRUNVVEFCTEUiLCJiaW5hcnlQYXRocyIsImJpbmFyeSIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJERUZBVUxUX0NPTVBBTklPTl9HUlBDX1BPUlQiLCJjb21wYW5pb25Qcm9jIiwiU3ViUHJvY2VzcyIsImxpc3RlbmVycyIsImV4aXQiLCJjbGVhbnVwTGlzdGVuZXJzIiwiXyIsInRvUGFpcnMiLCJmaWx0ZXIiLCJ2IiwiaXNGdW5jdGlvbiIsIm1hcCIsImsiLCJyZW1vdmVMaXN0ZW5lciIsInN0YXJ0IiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJvdXRUeXBlIiwiZXZlbnROYW1lIiwibGluZXMiLCJsaW5lIiwiaXNFbXB0eSIsInRyaW0iLCJ2ZXJib3NlIiwicmVhZHlNYXRjaCIsImV4ZWMiLCJlcnJvck1hdGNoIiwib24iLCJjb2RlIiwic2lnbmFsIiwibWVzc2FnZSIsIm9uY2UiLCJ0aW1lb3V0IiwiZXJyIiwiaXNSdW5uaW5nIiwic3RvcCIsImlnbiIsImVycm9yIiwidHBFeGVjIiwiY29ubmVjdGlvbkVycm9yIiwicmV0cnlJbnRlcnZhbCIsImRpc2Nvbm5lY3QiLCJpc1N0YXJ0dXBNb25pdG9yRW5hYmxlZCIsImRhZW1vbiIsImV4ZWN1dGFibGUiLCJkYWVtb25PdXRwdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJkZWxheSIsIkRFRkFVTFRfSURCX1BPUlQiLCJpbmNsdWRlcyIsIndhcm4iLCJjb25uZWN0aW9uRXJyb3IyIiwiaW5mbyIsIndhaXRGb3JEZXZpY2UiLCJwYXRoIiwiY29tcGFuaW9uIiwidGltZW91dE1zIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZ2V0RHVyYXRpb24iLCJhc1NlY29uZHMiLCJ0b0ZpeGVkIiwiY29tcGFuaW9uUGlkcyIsImdldFBpZHMiLCJsZW5ndGgiLCJjbWQiLCJhcmdzIiwiaXNBcnJheSIsImNsb25lRGVlcCIsImV4ZWNUaW1lb3V0IiwiREVGQVVMVF9JREJfRVhFQ19USU1FT1VUIiwidGltZW91dENhcE5hbWUiLCJmdWxsQXJncyIsImRlZmF1bHRBcmdzIiwidXRpbCIsInF1b3RlIiwiaGFzVmFsdWUiLCJjcmVhdGVTdWJQcm9jZXNzIiwiY29tbWFuZCIsImlkYkFyZ3MiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvc3lzdGVtLWNvbW1hbmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyBhcyB0cEV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQge1xuICBnZXRQaWRzLCBERUZBVUxUX0lEQl9FWEVDX1RJTUVPVVQsIElEQl9FWEVDVVRBQkxFLFxuICBJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEUsIERFRkFVTFRfSURCX1BPUlQsIERFRkFVTFRfQ09NUEFOSU9OX0dSUENfUE9SVCxcbn0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cblxuY29uc3QgUFJPQ0VTU19JTklUX1RJTUVPVVQgPSA1MDAwO1xuY29uc3QgQ09NUEFOSU9OX1BHUkVQX1BBVFRFUk4gPSAodWRpZCkgPT5cbiAgYCR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfS4qLS11ZGlkW1s6c3BhY2U6XV0rJHt1ZGlkfWA7XG5jb25zdCBDT01QQU5JT05fU1RBUlRVUF9SRUdFWFAgPSAvU3RhcnRlZCBHUlBDIHNlcnZlciBvbiBwb3J0IChcXGQrKS87XG5jb25zdCBDT01QQU5JT05fU1RBUlRVUF9FUlJPUl9SRUdFWFAgPSAvTmV3IEVycm9yIEJ1aWx0ID09PiAoLispLztcblxuZnVuY3Rpb24gYnVpbGREYWVtb25BcmdzIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHBvcnQsXG4gICAgZ3JwY1BvcnQsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHJlc3VsdCA9IFsnZGFlbW9uJ107XG4gIGlmIChwb3J0KSB7XG4gICAgcmVzdWx0LnB1c2goJy0tcG9ydCcsIHBvcnQpO1xuICB9XG4gIGlmIChncnBjUG9ydCkge1xuICAgIHJlc3VsdC5wdXNoKCctLWdycGMtcG9ydCcsIGdycGNQb3J0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmNvbnN0IHN5c3RlbUNhbGxNZXRob2RzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29ubmVjdE9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IG9ubGluZVRpbWVvdXQgLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0XG4gKiB1bnRpbCB0aGUgZGV2aWNlIHVuZGVyIHRlc3RzIGlzIG9ubGluZS4gTm8gd2FpdCBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWRcbiAqIGlmIHRoZSB0aW1lb3V0IGlzIG5vdCBzZXQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgdGhpcyB2YWx1ZSBpZlxuICogYGNvbm5lY3RgIGlzIGNhbGxlZCByaWdodCBhZnRlciBkZXZpY2UgaXMgYm9vdGVkLCBzbyBub3QgYWxsIHRoZSByZXF1aXJlZFxuICogZGV2aWNlIHNlcnZpY2VzIGhhdmUgYmVlbiBzdGFydGVkIHlldC5cbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGlkYiBhbmQgY29tcGFuaW9uIHByb2Nlc3NlcyBpZiBuZWNlc3NhcnkgYW5kXG4gKiBhc3NpZ25zIHBhdGggcHJvcGVydGllcy4gSXQgaXMgbWFuZGF0b3J5IHRvIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlXG4gKiBvbmUgY2FuIHN0YXJ0IHVzaW5nIElEQiBpbnN0YW5jZSxcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbWFuZGF0b3J5IGlkYiBleGVjdXRhYmxlcyBhcmUgbm90IHByZXNlbnQgb24gdGhlXG4gKiBsb2NhbGhvc3Qgb3IgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBzdGFydGluZy9kZXRlY3RpbmcgdGhlbVxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5jb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gY29ubmVjdCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBvbmxpbmVUaW1lb3V0LFxuICB9ID0gb3B0cztcblxuICBsb2cuZGVidWcoYENvbm5lY3RpbmcgJHtJREJfRVhFQ1VUQUJMRX0gc2VydmljZSB0byAnJHt0aGlzLnVkaWR9J2ApO1xuXG4gIGNvbnN0IGJpbmFyeVBhdGhzID0ge307XG4gIGZvciAoY29uc3QgYmluYXJ5IG9mIFtJREJfRVhFQ1VUQUJMRSwgSURCX0NPTVBBTklPTl9FWEVDVVRBQkxFXSkge1xuICAgIHRyeSB7XG4gICAgICBiaW5hcnlQYXRoc1tiaW5hcnldID0gYXdhaXQgZnMud2hpY2goYmluYXJ5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2JpbmFyeX0nIGhhcyBub3QgYmVlbiBmb3VuZCBpbiBQQVRILiBgICtcbiAgICAgICAgYElzIGl0IGluc3RhbGxlZD8gUmVhZCBodHRwczovL3d3dy5mYmlkYi5pbyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGdycGNQb3J0ID0gREVGQVVMVF9DT01QQU5JT05fR1JQQ19QT1JUO1xuICBsb2cuZGVidWcoYFN0YXJ0aW5nIGNvbXBhbmlvbjogJyR7YmluYXJ5UGF0aHNbSURCX0NPTVBBTklPTl9FWEVDVVRBQkxFXX0nYCk7XG4gIGNvbnN0IGNvbXBhbmlvblByb2MgPSBuZXcgU3ViUHJvY2VzcyhiaW5hcnlQYXRoc1tJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEVdLCBbJy0tdWRpZCcsIHRoaXMudWRpZF0pO1xuICBsZXQgbGlzdGVuZXJzID0ge1xuICAgICdsaW5lcy1zdGRvdXQnOiBudWxsLFxuICAgICdsaW5lcy1zdGRlcnInOiBudWxsLFxuICAgIGV4aXQ6IG51bGwsXG4gIH07XG4gIGNvbnN0IGNsZWFudXBMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgXy50b1BhaXJzKGxpc3RlbmVycylcbiAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiBfLmlzRnVuY3Rpb24odikpXG4gICAgICAubWFwKChbaywgdl0pID0+IGNvbXBhbmlvblByb2MucmVtb3ZlTGlzdGVuZXIoaywgdikpO1xuICAgIGxpc3RlbmVycyA9IHt9O1xuICB9O1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBhbmlvblByb2Muc3RhcnQoMCk7XG5cbiAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG91dFR5cGUgb2YgWydzdGRlcnInLCAnc3Rkb3V0J10pIHtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gYGxpbmVzLSR7b3V0VHlwZX1gO1xuICAgICAgICBsaXN0ZW5lcnNbZXZlbnROYW1lXSA9IChsaW5lcykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgaWYgKF8uaXNFbXB0eShfLnRyaW0obGluZSkpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgWyR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfSAke291dFR5cGV9XSAke2xpbmV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBtYXJrZXIgdGhhdCB0aGluZ3MgYXJlIHJlYWR5IHRvIGdvXG4gICAgICAgICAgICBjb25zdCByZWFkeU1hdGNoID0gQ09NUEFOSU9OX1NUQVJUVVBfUkVHRVhQLmV4ZWMobGluZSk7XG4gICAgICAgICAgICBpZiAocmVhZHlNYXRjaCkge1xuICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBwb3J0IGFuZCBzYXZlLCBzbyBpZGIgY2FuIGNvbm5lY3RcbiAgICAgICAgICAgICAgZ3JwY1BvcnQgPSByZWFkeU1hdGNoWzFdO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvclxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1hdGNoID0gQ09NUEFOSU9OX1NUQVJUVVBfRVJST1JfUkVHRVhQLmV4ZWMobGluZSk7XG4gICAgICAgICAgICAgIGlmIChlcnJvck1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvck1hdGNoWzFdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbXBhbmlvblByb2Mub24oZXZlbnROYW1lLCBsaXN0ZW5lcnNbZXZlbnROYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycy5leGl0ID0gKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXJzKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEV9IGV4aXRlZCB3aXRoIGNvZGUgJyR7Y29kZX0nIGZyb20gc2lnbmFsICcke3NpZ25hbH0nYDtcbiAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICAgIH07XG4gICAgICBjb21wYW5pb25Qcm9jLm9uY2UoJ2V4aXQnLCBsaXN0ZW5lcnMuZXhpdCk7XG4gICAgfSkudGltZW91dCg2MDAwMCwgJ1dhcyB1bmFibGUgdG8gYWNxdWlyZSBhIEdSUEMgcG9ydCBhZnRlciA2MCBzZWNvbmRzIHRpbWVvdXQnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2xlYW51cExpc3RlbmVycygpO1xuICAgIGlmIChjb21wYW5pb25Qcm9jLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29tcGFuaW9uUHJvYy5zdG9wKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0ICR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsb2cuZGVidWcoYCR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfSBpcyBsaXN0ZW5pbmcgb24gR1JQQyBwb3J0ICcke2dycGNQb3J0fSdgKTtcblxuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cEV4ZWMoSURCX0VYRUNVVEFCTEUsIFsnY29ubmVjdCcsICcxMjcuMC4wLjEnLCBncnBjUG9ydF0pO1xuICAgIH0gY2F0Y2ggKGNvbm5lY3Rpb25FcnJvcikge1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCgyLCAxMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdHBFeGVjKElEQl9FWEVDVVRBQkxFLCBbJ2tpbGwnXSk7XG4gICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgbGV0IGlzU3RhcnR1cE1vbml0b3JFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYWVtb24gPSBuZXcgU3ViUHJvY2VzcyhJREJfRVhFQ1VUQUJMRSwgYnVpbGREYWVtb25BcmdzKHtcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMuZXhlY3V0YWJsZS5wb3J0LFxuICAgICAgICAgICAgZ3JwY1BvcnQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGxldCBkYWVtb25PdXRwdXQgPSAnJztcbiAgICAgICAgICBkYWVtb24ub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzU3RhcnR1cE1vbml0b3JFbmFibGVkICYmIF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKSkge1xuICAgICAgICAgICAgICBkYWVtb25PdXRwdXQgKz0gYFtkYWVtb25dICR7c3Rkb3V0IHx8IHN0ZGVycn1cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkYWVtb24uc3RhcnQobnVsbCwgUFJPQ0VTU19JTklUX1RJTUVPVVQpO1xuICAgICAgICAgICAgYXdhaXQgQi5kZWxheSgzMDApO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgICAgICAgIGlmIChkYWVtb24uaXNSdW5uaW5nKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYCR7SURCX0VYRUNVVEFCTEV9IGRhZW1vbiBzdGFydGVkIG9uIHBvcnQgJHt0aGlzLmV4ZWN1dGFibGUucG9ydCB8fCBERUZBVUxUX0lEQl9QT1JUfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWRhZW1vbk91dHB1dC5pbmNsdWRlcygnYWRkcmVzcyBhbHJlYWR5IGluIHVzZScpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtJREJfRVhFQ1VUQUJMRX0gZGFlbW9uIGhhcyBmYWlsZWQgdG8gc3RhcnQ6ICR7ZGFlbW9uT3V0cHV0fWA7XG4gICAgICAgICAgICAgIGxvZy53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2cuZGVidWcoYFRoZSBwb3J0ICR7dGhpcy5leGVjdXRhYmxlLnBvcnQgfHwgREVGQVVMVF9JREJfUE9SVH0gaXMgYWxyZWFkeSBpbiB1c2UuIGAgK1xuICAgICAgICAgICAgICBgQXNzdW1pbmcgaXQgaXMgdXNlZCBieSAke0lEQl9FWEVDVVRBQkxFfSBkYWVtb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdHBFeGVjKElEQl9FWEVDVVRBQkxFLCBbJ2Nvbm5lY3QnLCAnMTI3LjAuMC4xJywgZ3JwY1BvcnRdKTtcbiAgICAgICAgfSBjYXRjaCAoY29ubmVjdGlvbkVycm9yMikge1xuICAgICAgICAgIGlmIChjb25uZWN0aW9uRXJyb3IyLnN0ZGVyciB8fCBjb25uZWN0aW9uRXJyb3IyLnN0ZG91dCkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGNvbm5lY3Rpb25FcnJvcjIuc3RkZXJyIHx8IGNvbm5lY3Rpb25FcnJvcjIuc3Rkb3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgY29ubmVjdGlvbkVycm9yMjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpc1N0YXJ0dXBNb25pdG9yRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0ZGVycik7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0ICR7SURCX0VYRUNVVEFCTEV9IHNlcnZpY2UgZm9yICcke3RoaXMudWRpZH0nLiBgICtcbiAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICB9XG4gIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgdGhlIGNvbm5lY3Rpb24gdG8gJHtJREJfRVhFQ1VUQUJMRX0gc2VydmljZSBmb3IgJyR7dGhpcy51ZGlkfSdgKTtcblxuICBpZiAob25saW5lVGltZW91dCkge1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZShvbmxpbmVUaW1lb3V0KTtcbiAgfVxuXG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYmluYXJ5UGF0aHNbSURCX0VYRUNVVEFCTEVdO1xuICB0aGlzLmNvbXBhbmlvbi5wYXRoID0gYmluYXJ5UGF0aHNbSURCX0NPTVBBTklPTl9FWEVDVVRBQkxFXTtcbn07XG5cbi8qKlxuICogQmxvY2tzIHVudGlsIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBzdGFydHMgcmVzcG9uZGluZyB0byBpZGIgY29tbWFuZHMuXG4gKiBUaGUgZGV2aWNlIG11c3QgYmUgYm9vdGVkL29ubGluZSBhbmQgaWRiIG11c3QgYmUgYWxyZWFkeSBjb25uZWN0ZWQgZm9yIHRoYXQgdG8gaGFwcGVuXG4gKlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0TXMgWzEwMDAwXSAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXRcbiAqIHVudGlsIHRoZSBkZXZpY2UgdW5kZXIgdGVzdHMgaXMgb25saW5lLiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5XG4gKiBpZiB0aGUgdGltZW91dCBpcyBmYWxzeVxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBkZXZpY2UgaXMgbm90IHJlc3BvbmRpbmcgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLndhaXRGb3JEZXZpY2UgPSBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRGV2aWNlICh0aW1lb3V0TXMgPSAxMDAwMCkge1xuICBpZiAoIXRpbWVvdXRNcykge1xuICAgIGxvZy5kZWJ1ZygnTm8gdGltZW91dCBpcyBwcm92aWRlZCwgc28gbm90IHdhaXRpbmcgdW50aWwgdGhlIGRldmljZSBpcyBvbmxpbmUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0TXN9bXMgZm9yIHRoZSBkZXZpY2UgdG8gYmUgb25saW5lYCk7XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmV4ZWMoWyd1aScsICdkZXNjcmliZS1hbGwnXSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScgaXMgbm90IHJlc3BvbmRpbmcgdG8gaWRiIHJlcXVlc3RzIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXQuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxuICBsb2cuZGVidWcoYFRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScgaXMgb25saW5lIGFuZCByZWFkeSB0byBhY2NlcHQgaWRiIGNvbW1hbmRzIGluIGAgK1xuICAgIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9c2ApO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBjbGVhbnVwIG9mIG9ic29sZXRlIGNvbXBhbmlvbiBwcm9jZXNzZXNcbiAqIFRoZSBkYWVtb24gcHJvY2VzcyBpcyBsZWZ0IHVudG91Y2hlZCwgYmVjYXVzZSBraWxsaW5nIGl0IG1pZ2h0XG4gKiBwb3RlbnRpYWxseSBhZmZlY3Qgb3RoZXIgcGFyYWxsZWwgc2Vzc2lvbnMuIE5vdGhpbmdcbiAqIGlzIGRvbmUgaWYgbm8gb2Jzb2xldGUgcHJvY2Vzc2VzIGFyZSBmb3VuZC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGRpc2Nvbm5lY3QgKCkge1xuICBsb2cuZGVidWcoYERpc2Nvbm5lY3RpbmcgJHtJREJfRVhFQ1VUQUJMRX0gc2VydmljZSBmcm9tICcke3RoaXMudWRpZH0nYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0cEV4ZWModGhpcy5leGVjdXRhYmxlLnBhdGgsIFsnZGlzY29ubmVjdCcsIHRoaXMudWRpZF0pO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgY29uc3QgY29tcGFuaW9uUGlkcyA9IGF3YWl0IGdldFBpZHMoQ09NUEFOSU9OX1BHUkVQX1BBVFRFUk4odGhpcy51ZGlkKSk7XG4gIGlmIChfLmlzRW1wdHkoY29tcGFuaW9uUGlkcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7Y29tcGFuaW9uUGlkcy5sZW5ndGh9IG9ic29sZXRlICR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfSBgICtcbiAgICBgcHJvY2VzcyR7Y29tcGFuaW9uUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9YCk7XG4gIGF3YWl0IHRwRXhlYygna2lsbCcsIFsnLTInLCAuLi5jb21wYW5pb25QaWRzXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGdpdmVuIGlkYiBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNtZCAtIFRoZSBhY3R1YWwgaWRiIGNvbW1hbmQgd2l0aG91dCBhcmd1bWVudHMvcGFyYW1zLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcmdzIC0gT3B0aW9uYWwgY29tbWFuZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3N9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tbWFuZCdzIHN0ZG91dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29tbWFuZCByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmV4ZWMgPSBhc3luYyBmdW5jdGlvbiBleGVjIChjbWQsIGFyZ3MgPSBbXSwgb3B0cyA9IHt9KSB7XG4gIGlmICghY21kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwYXNzIGluIGEgY29tbWFuZCB0byBleGVjKCknKTtcbiAgfVxuICBjbWQgPSBfLmlzQXJyYXkoY21kKSA/IGNtZCA6IFtjbWRdO1xuXG4gIG9wdHMgPSBfLmNsb25lRGVlcChvcHRzKTtcbiAgLy8gc2V0dGluZyBkZWZhdWx0IHRpbWVvdXQgZm9yIGVhY2ggY29tbWFuZCB0byBwcmV2ZW50IGluZmluaXRlIHdhaXQuXG4gIG9wdHMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCB0aGlzLmV4ZWNUaW1lb3V0IHx8IERFRkFVTFRfSURCX0VYRUNfVElNRU9VVDtcbiAgb3B0cy50aW1lb3V0Q2FwTmFtZSA9IG9wdHMudGltZW91dENhcE5hbWUgfHwgJ2V4ZWNUaW1lb3V0JzsgLy8gRm9yIGVycm9yIG1lc3NhZ2VcblxuICBjb25zdCBmdWxsQXJncyA9IFsuLi5jbWQsIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncywgLi4uYXJnc107XG4gIGxvZy5kZWJ1ZyhgUnVubmluZyAnJHt0aGlzLmV4ZWN1dGFibGUucGF0aH0gJHt1dGlsLnF1b3RlKGZ1bGxBcmdzKX0nYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCB0cEV4ZWModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxBcmdzLCBvcHRzKTtcbiAgICByZXR1cm4gc3Rkb3V0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoZS5jb2RlKSkge1xuICAgICAgZS5tZXNzYWdlID0gYEVycm9yIGV4ZWN1dGluZyAke0lEQl9FWEVDVVRBQkxFfS4gT3JpZ2luYWwgZXJyb3I6ICcke2UubWVzc2FnZX0nOyBgICtcbiAgICAgICAgYFN0ZG91dDogJyR7KGUuc3Rkb3V0IHx8ICcnKS50cmltKCl9JzsgYCArXG4gICAgICAgIGBTdGRlcnI6ICckeyhlLnN0ZGVyciB8fCAnJykudHJpbSgpfSc7IGAgK1xuICAgICAgICBgQ29kZTogJyR7ZS5jb2RlfSdgO1xuICAgIH0gZWxzZSB7XG4gICAgICBlLm1lc3NhZ2UgPSBgRXJyb3IgZXhlY3V0aW5nICR7SURCX0VYRUNVVEFCTEV9LiBPcmlnaW5hbCBlcnJvcjogJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgVHJ5IHRvIGluY3JlYXNlIHRoZSAke29wdHMudGltZW91dH1tcyAke0lEQl9FWEVDVVRBQkxFfSBleGVjdXRpb24gdGltZW91dCByZXByZXNlbnRlZCBieSAnJHtvcHRzLnRpbWVvdXRDYXBOYW1lfScgY2FwYWJpbGl0eWA7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBTdWJQcm9jZXNzIGluc3RhbmNlIG9mIGlkYiBmb3IgYmFja2dyb3VuZFxuICogZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tbWFuZCBkZXNpcmVkIGlkYiBjb21tYW5kIChlLmcuOiBbXCJsYXVuY2hcIl0sIFtcInhjdGVzdFwiLCBcInJ1blwiLCBcInVpXCJdKVxuICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBhcmdzIGFkZGl0aW9uYWwgaWRiIGFyZ3VtZW50c1xuICogQHJldHVybnMge1N1YlByb2Nlc3N9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmNyZWF0ZVN1YlByb2Nlc3MgPSBmdW5jdGlvbiBjcmVhdGVTdWJQcm9jZXNzIChjb21tYW5kID0gW10sIGFyZ3MgPSBbXSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGlkYkFyZ3MgPSBbLi4uY29tbWFuZCwgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAuLi5hcmdzXTtcbiAgbG9nLmRlYnVnKGBDcmVhdGluZyAke0lEQl9FWEVDVVRBQkxFfSBzdWJwcm9jZXNzIHdpdGggYXJnczogJHt1dGlsLnF1b3RlKGFyZ3MpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGlkYkFyZ3MsIG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc3lzdGVtQ2FsbE1ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFHQSxNQUFNQSxvQkFBb0IsR0FBRyxJQUFJO0FBQ2pDLE1BQU1DLHVCQUF1QixHQUFJQyxJQUFJLElBQ2xDLEdBQUVDLGlDQUF5Qix1QkFBc0JELElBQUssRUFBQztBQUMxRCxNQUFNRSx3QkFBd0IsR0FBRyxtQ0FBbUM7QUFDcEUsTUFBTUMsOEJBQThCLEdBQUcsMEJBQTBCO0FBRWpFLFNBQVNDLGVBQWUsQ0FBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ25DLE1BQU07SUFDSkMsSUFBSTtJQUNKQztFQUNGLENBQUMsR0FBR0YsSUFBSTtFQUVSLE1BQU1HLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQztFQUN6QixJQUFJRixJQUFJLEVBQUU7SUFDUkUsTUFBTSxDQUFDQyxJQUFJLENBQUMsUUFBUSxFQUFFSCxJQUFJLENBQUM7RUFDN0I7RUFDQSxJQUFJQyxRQUFRLEVBQUU7SUFDWkMsTUFBTSxDQUFDQyxJQUFJ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
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT01QQU5JT05fUEdSRVBfUEFUVEVSTiIsInVkaWQiLCJJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEUiLCJDT01QQU5JT05fU1RBUlRVUF9SRUdFWFAiLCJDT01QQU5JT05fU1RBUlRVUF9FUlJPUl9SRUdFWFAiLCJDT01QQU5JT05fU1RBUlRVUF9USU1FT1VUX1NFQyIsInN5c3RlbUNhbGxNZXRob2RzIiwiY29ubmVjdCIsIm9wdHMiLCJvbmxpbmVUaW1lb3V0IiwibG9nIiwiZGVidWciLCJJREJfRVhFQ1VUQUJMRSIsImJpbmFyeVBhdGhzIiwiYmluYXJ5IiwiZnMiLCJ3aGljaCIsImUiLCJFcnJvciIsImdycGNQb3J0IiwiREVGQVVMVF9DT01QQU5JT05fR1JQQ19QT1JUIiwiY29tcGFuaW9uUHJvYyIsIlN1YlByb2Nlc3MiLCJsaXN0ZW5lcnMiLCJleGl0IiwiY2xlYW51cExpc3RlbmVycyIsIl8iLCJ0b1BhaXJzIiwiZmlsdGVyIiwidiIsImlzRnVuY3Rpb24iLCJtYXAiLCJrIiwicmVtb3ZlTGlzdGVuZXIiLCJzdGFydCIsIkIiLCJyZXNvbHZlIiwicmVqZWN0Iiwib3V0VHlwZSIsImV2ZW50TmFtZSIsImxpbmVzIiwibGluZSIsImlzRW1wdHkiLCJ0cmltIiwidmVyYm9zZSIsInJlYWR5TWF0Y2giLCJleGVjIiwiZXJyb3JNYXRjaCIsIm9uIiwiY29kZSIsInNpZ25hbCIsIm1lc3NhZ2UiLCJvbmNlIiwidGltZW91dCIsImVyciIsImlzUnVubmluZyIsInN0b3AiLCJpZ24iLCJlcnJvciIsInRwRXhlYyIsImNvbm5lY3Rpb25FcnJvciIsInJldHJ5SW50ZXJ2YWwiLCJkaXNjb25uZWN0Iiwic3RkZXJyIiwic3Rkb3V0IiwiaW5mbyIsIndhaXRGb3JEZXZpY2UiLCJleGVjdXRhYmxlIiwicGF0aCIsImNvbXBhbmlvbiIsInRpbWVvdXRNcyIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJsYXN0RXJyb3IiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsImNvbXBhbmlvblBpZHMiLCJnZXRQaWRzIiwibGVuZ3RoIiwiY21kIiwiYXJncyIsImlzQXJyYXkiLCJjbG9uZURlZXAiLCJleGVjVGltZW91dCIsIkRFRkFVTFRfSURCX0VYRUNfVElNRU9VVCIsInRpbWVvdXRDYXBOYW1lIiwiZnVsbEFyZ3MiLCJkZWZhdWx0QXJncyIsInV0aWwiLCJxdW90ZSIsImhhc1ZhbHVlIiwiY3JlYXRlU3ViUHJvY2VzcyIsImNvbW1hbmQiLCJpZGJBcmdzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3Rvb2xzL3N5c3RlbS1jb21tYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMgYXMgdHBFeGVjLCBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHtcbiAgZ2V0UGlkcywgREVGQVVMVF9JREJfRVhFQ19USU1FT1VULCBJREJfRVhFQ1VUQUJMRSxcbiAgSURCX0NPTVBBTklPTl9FWEVDVVRBQkxFLCBERUZBVUxUX0NPTVBBTklPTl9HUlBDX1BPUlQsXG59IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5cbmNvbnN0IENPTVBBTklPTl9QR1JFUF9QQVRURVJOID0gKHVkaWQpID0+XG4gIGAke0lEQl9DT01QQU5JT05fRVhFQ1VUQUJMRX0uKi0tdWRpZFtbOnNwYWNlOl1dKyR7dWRpZH1gO1xuY29uc3QgQ09NUEFOSU9OX1NUQVJUVVBfUkVHRVhQID0gL1wiZ3JwY19wb3J0XCI6KFxcZCspLztcbmNvbnN0IENPTVBBTklPTl9TVEFSVFVQX0VSUk9SX1JFR0VYUCA9IC9OZXcgRXJyb3IgQnVpbHQgPT0+ICguKykvO1xuY29uc3QgQ09NUEFOSU9OX1NUQVJUVVBfVElNRU9VVF9TRUMgPSAzMDtcblxuY29uc3Qgc3lzdGVtQ2FsbE1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb25uZWN0T3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gb25saW5lVGltZW91dCAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXRcbiAqIHVudGlsIHRoZSBkZXZpY2UgdW5kZXIgdGVzdHMgaXMgb25saW5lLiBObyB3YWl0IGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZFxuICogaWYgdGhlIHRpbWVvdXQgaXMgbm90IHNldC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSB0aGlzIHZhbHVlIGlmXG4gKiBgY29ubmVjdGAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIGRldmljZSBpcyBib290ZWQsIHNvIG5vdCBhbGwgdGhlIHJlcXVpcmVkXG4gKiBkZXZpY2Ugc2VydmljZXMgaGF2ZSBiZWVuIHN0YXJ0ZWQgeWV0LlxuICovXG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgaWRiIGFuZCBjb21wYW5pb24gcHJvY2Vzc2VzIGlmIG5lY2Vzc2FyeSBhbmRcbiAqIGFzc2lnbnMgcGF0aCBwcm9wZXJ0aWVzLiBJdCBpcyBtYW5kYXRvcnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmVcbiAqIG9uZSBjYW4gc3RhcnQgdXNpbmcgSURCIGluc3RhbmNlLFxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBtYW5kYXRvcnkgaWRiIGV4ZWN1dGFibGVzIGFyZSBub3QgcHJlc2VudCBvbiB0aGVcbiAqIGxvY2FsaG9zdCBvciB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0YXJ0aW5nL2RldGVjdGluZyB0aGVtXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmNvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiBjb25uZWN0IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIG9ubGluZVRpbWVvdXQsXG4gIH0gPSBvcHRzO1xuXG4gIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyAke0lEQl9FWEVDVVRBQkxFfSBzZXJ2aWNlIHRvICcke3RoaXMudWRpZH0nYCk7XG5cbiAgY29uc3QgYmluYXJ5UGF0aHMgPSB7fTtcbiAgZm9yIChjb25zdCBiaW5hcnkgb2YgW0lEQl9FWEVDVVRBQkxFLCBJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEVdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGJpbmFyeVBhdGhzW2JpbmFyeV0gPSBhd2FpdCBmcy53aGljaChiaW5hcnkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7YmluYXJ5fScgaGFzIG5vdCBiZWVuIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICBgSXMgaXQgaW5zdGFsbGVkPyBSZWFkIGh0dHBzOi8vd3d3LmZiaWRiLmlvIGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgZ3JwY1BvcnQgPSBERUZBVUxUX0NPTVBBTklPTl9HUlBDX1BPUlQ7XG4gIGxvZy5kZWJ1ZyhgU3RhcnRpbmcgY29tcGFuaW9uOiAnJHtiaW5hcnlQYXRoc1tJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEVdfSdgKTtcbiAgY29uc3QgY29tcGFuaW9uUHJvYyA9IG5ldyBTdWJQcm9jZXNzKGJpbmFyeVBhdGhzW0lEQl9DT01QQU5JT05fRVhFQ1VUQUJMRV0sIFsnLS11ZGlkJywgdGhpcy51ZGlkXSk7XG4gIGxldCBsaXN0ZW5lcnMgPSB7XG4gICAgJ2xpbmVzLXN0ZG91dCc6IG51bGwsXG4gICAgJ2xpbmVzLXN0ZGVycic6IG51bGwsXG4gICAgZXhpdDogbnVsbCxcbiAgfTtcbiAgY29uc3QgY2xlYW51cExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBfLnRvUGFpcnMobGlzdGVuZXJzKVxuICAgICAgLmZpbHRlcigoWywgdl0pID0+IF8uaXNGdW5jdGlvbih2KSlcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gY29tcGFuaW9uUHJvYy5yZW1vdmVMaXN0ZW5lcihrLCB2KSk7XG4gICAgbGlzdGVuZXJzID0ge307XG4gIH07XG4gIHRyeSB7XG4gICAgYXdhaXQgY29tcGFuaW9uUHJvYy5zdGFydCgwKTtcblxuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgb3V0VHlwZSBvZiBbJ3N0ZGVycicsICdzdGRvdXQnXSkge1xuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBgbGluZXMtJHtvdXRUeXBlfWA7XG4gICAgICAgIGxpc3RlbmVyc1tldmVudE5hbWVdID0gKGxpbmVzKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoXy5pc0VtcHR5KF8udHJpbShsaW5lKSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgbG9nLmRlYnVnKGBbJHtJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEV9ICR7b3V0VHlwZX1dICR7bGluZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG1hcmtlciB0aGF0IHRoaW5ncyBhcmUgcmVhZHkgdG8gZ29cbiAgICAgICAgICAgIGNvbnN0IHJlYWR5TWF0Y2ggPSBDT01QQU5JT05fU1RBUlRVUF9SRUdFWFAuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIGlmIChyZWFkeU1hdGNoKSB7XG4gICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHBvcnQgYW5kIHNhdmUsIHNvIGlkYiBjYW4gY29ubmVjdFxuICAgICAgICAgICAgICBncnBjUG9ydCA9IHJlYWR5TWF0Y2hbMV07XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWF0Y2ggPSBDT01QQU5JT05fU1RBUlRVUF9FUlJPUl9SRUdFWFAuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yTWF0Y2hbMV0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29tcGFuaW9uUHJvYy5vbihldmVudE5hbWUsIGxpc3RlbmVyc1tldmVudE5hbWVdKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmV4aXQgPSAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lcnMoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke0lEQl9DT01QQU5JT05fRVhFQ1VUQUJMRX0gZXhpdGVkIHdpdGggY29kZSAnJHtjb2RlfScgZnJvbSBzaWduYWwgJyR7c2lnbmFsfSdgO1xuICAgICAgICBsb2cuZGVidWcobWVzc2FnZSk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgICAgfTtcbiAgICAgIGNvbXBhbmlvblByb2Mub25jZSgnZXhpdCcsIGxpc3RlbmVycy5leGl0KTtcbiAgICB9KS50aW1lb3V0KFxuICAgICAgQ09NUEFOSU9OX1NUQVJUVVBfVElNRU9VVF9TRUMgKiAxMDAwLFxuICAgICAgYFdhcyB1bmFibGUgdG8gYWNxdWlyZSBhIEdSUEMgcG9ydCBhZnRlciAke0NPTVBBTklPTl9TVEFSVFVQX1RJTUVPVVRfU0VDfXMgdGltZW91dGBcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjbGVhbnVwTGlzdGVuZXJzKCk7XG4gICAgaWYgKGNvbXBhbmlvblByb2MuaXNSdW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb21wYW5pb25Qcm9jLnN0b3AoKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgJHtJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEV9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgJHtJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEV9IGlzIGxpc3RlbmluZyBvbiBHUlBDIHBvcnQgJyR7Z3JwY1BvcnR9J2ApO1xuXG4gIHRyeSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRwRXhlYyhJREJfRVhFQ1VUQUJMRSwgWydjb25uZWN0JywgdGhpcy51ZGlkLCBncnBjUG9ydF0pO1xuICAgIH0gY2F0Y2ggKGNvbm5lY3Rpb25FcnJvcikge1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCgyLCAxMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdHBFeGVjKElEQl9FWEVDVVRBQkxFLCBbJ2tpbGwnXSk7XG4gICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgYXdhaXQgdHBFeGVjKElEQl9FWEVDVVRBQkxFLCBbJ2Nvbm5lY3QnLCB0aGlzLnVkaWQsIGdycGNQb3J0XSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRlcnIgfHwgZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0ZGVyciB8fCBlLnN0ZG91dCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0ICR7SURCX0VYRUNVVEFCTEV9IHNlcnZpY2UgZm9yIHRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScuIGAgK1xuICAgICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gIH1cbiAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCB0aGUgY29ubmVjdGlvbiB0byAke0lEQl9FWEVDVVRBQkxFfSBzZXJ2aWNlIGZvciAnJHt0aGlzLnVkaWR9J2ApO1xuXG4gIGlmIChvbmxpbmVUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlKG9ubGluZVRpbWVvdXQpO1xuICB9XG5cbiAgdGhpcy5leGVjdXRhYmxlLnBhdGggPSBiaW5hcnlQYXRoc1tJREJfRVhFQ1VUQUJMRV07XG4gIHRoaXMuY29tcGFuaW9uLnBhdGggPSBiaW5hcnlQYXRoc1tJREJfQ09NUEFOSU9OX0VYRUNVVEFCTEVdO1xufTtcblxuLyoqXG4gKiBCbG9ja3MgdW50aWwgdGhlIGRldmljZSB1bmRlciB0ZXN0IHN0YXJ0cyByZXNwb25kaW5nIHRvIGlkYiBjb21tYW5kcy5cbiAqIFRoZSBkZXZpY2UgbXVzdCBiZSBib290ZWQvb25saW5lIGFuZCBpZGIgbXVzdCBiZSBhbHJlYWR5IGNvbm5lY3RlZCBmb3IgdGhhdCB0byBoYXBwZW5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXRNcyBbMTAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdFxuICogdW50aWwgdGhlIGRldmljZSB1bmRlciB0ZXN0cyBpcyBvbmxpbmUuIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHlcbiAqIGlmIHRoZSB0aW1lb3V0IGlzIGZhbHN5XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGRldmljZSBpcyBub3QgcmVzcG9uZGluZyB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXRcbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMud2FpdEZvckRldmljZSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UgKHRpbWVvdXRNcyA9IDEwMDAwKSB7XG4gIGlmICghdGltZW91dE1zKSB7XG4gICAgbG9nLmRlYnVnKCdObyB0aW1lb3V0IGlzIHByb3ZpZGVkLCBzbyBub3Qgd2FpdGluZyB1bnRpbCB0aGUgZGV2aWNlIGlzIG9ubGluZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXRNc31tcyBmb3IgdGhlIGRldmljZSB0byBiZSBvbmxpbmVgKTtcbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmV4ZWMoWyd1aScsICdkZXNjcmliZS1hbGwnXSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsYXN0RXJyb3IgPSBlLnN0ZGVyciB8fCBlLm1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSAnJHt0aGlzLnVkaWR9JyBpcyBub3QgcmVzcG9uZGluZyB0byBpZGIgcmVxdWVzdHMgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7bGFzdEVycm9yIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxuICBsb2cuZGVidWcoYFRoZSBkZXZpY2UgJyR7dGhpcy51ZGlkfScgaXMgb25saW5lIGFuZCByZWFkeSB0byBhY2NlcHQgaWRiIGNvbW1hbmRzIGluIGAgK1xuICAgIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9c2ApO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBjbGVhbnVwIG9mIG9ic29sZXRlIGNvbXBhbmlvbiBwcm9jZXNzZXNcbiAqIFRoZSBkYWVtb24gcHJvY2VzcyBpcyBsZWZ0IHVudG91Y2hlZCwgYmVjYXVzZSBraWxsaW5nIGl0IG1pZ2h0XG4gKiBwb3RlbnRpYWxseSBhZmZlY3Qgb3RoZXIgcGFyYWxsZWwgc2Vzc2lvbnMuIE5vdGhpbmdcbiAqIGlzIGRvbmUgaWYgbm8gb2Jzb2xldGUgcHJvY2Vzc2VzIGFyZSBmb3VuZC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGRpc2Nvbm5lY3QgKCkge1xuICBsb2cuZGVidWcoYERpc2Nvbm5lY3RpbmcgJHtJREJfRVhFQ1VUQUJMRX0gc2VydmljZSBmcm9tICcke3RoaXMudWRpZH0nYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0cEV4ZWModGhpcy5leGVjdXRhYmxlLnBhdGgsIFsnZGlzY29ubmVjdCcsIHRoaXMudWRpZF0pO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgY29uc3QgY29tcGFuaW9uUGlkcyA9IGF3YWl0IGdldFBpZHMoQ09NUEFOSU9OX1BHUkVQX1BBVFRFUk4odGhpcy51ZGlkKSk7XG4gIGlmIChfLmlzRW1wdHkoY29tcGFuaW9uUGlkcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7Y29tcGFuaW9uUGlkcy5sZW5ndGh9IG9ic29sZXRlICR7SURCX0NPTVBBTklPTl9FWEVDVVRBQkxFfSBgICtcbiAgICBgcHJvY2VzcyR7Y29tcGFuaW9uUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9YCk7XG4gIGF3YWl0IHRwRXhlYygna2lsbCcsIFsnLTInLCAuLi5jb21wYW5pb25QaWRzXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGdpdmVuIGlkYiBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNtZCAtIFRoZSBhY3R1YWwgaWRiIGNvbW1hbmQgd2l0aG91dCBhcmd1bWVudHMvcGFyYW1zLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcmdzIC0gT3B0aW9uYWwgY29tbWFuZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3N9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tbWFuZCdzIHN0ZG91dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29tbWFuZCByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmV4ZWMgPSBhc3luYyBmdW5jdGlvbiBleGVjIChjbWQsIGFyZ3MgPSBbXSwgb3B0cyA9IHt9KSB7XG4gIGlmICghY21kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwYXNzIGluIGEgY29tbWFuZCB0byBleGVjKCknKTtcbiAgfVxuICBjbWQgPSBfLmlzQXJyYXkoY21kKSA/IGNtZCA6IFtjbWRdO1xuXG4gIG9wdHMgPSBfLmNsb25lRGVlcChvcHRzKTtcbiAgLy8gc2V0dGluZyBkZWZhdWx0IHRpbWVvdXQgZm9yIGVhY2ggY29tbWFuZCB0byBwcmV2ZW50IGluZmluaXRlIHdhaXQuXG4gIG9wdHMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCB0aGlzLmV4ZWNUaW1lb3V0IHx8IERFRkFVTFRfSURCX0VYRUNfVElNRU9VVDtcbiAgb3B0cy50aW1lb3V0Q2FwTmFtZSA9IG9wdHMudGltZW91dENhcE5hbWUgfHwgJ2V4ZWNUaW1lb3V0JzsgLy8gRm9yIGVycm9yIG1lc3NhZ2VcblxuICBjb25zdCBmdWxsQXJncyA9IFsuLi5jbWQsIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncywgLi4uYXJnc107XG4gIGxvZy5kZWJ1ZyhgUnVubmluZyAnJHt0aGlzLmV4ZWN1dGFibGUucGF0aH0gJHt1dGlsLnF1b3RlKGZ1bGxBcmdzKX0nYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCB0cEV4ZWModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxBcmdzLCBvcHRzKTtcbiAgICByZXR1cm4gc3Rkb3V0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoZS5jb2RlKSkge1xuICAgICAgZS5tZXNzYWdlID0gYEVycm9yIGV4ZWN1dGluZyAke0lEQl9FWEVDVVRBQkxFfS4gT3JpZ2luYWwgZXJyb3I6ICcke2UubWVzc2FnZX0nOyBgICtcbiAgICAgICAgYFN0ZG91dDogJyR7KGUuc3Rkb3V0IHx8ICcnKS50cmltKCl9JzsgYCArXG4gICAgICAgIGBTdGRlcnI6ICckeyhlLnN0ZGVyciB8fCAnJykudHJpbSgpfSc7IGAgK1xuICAgICAgICBgQ29kZTogJyR7ZS5jb2RlfSdgO1xuICAgIH0gZWxzZSB7XG4gICAgICBlLm1lc3NhZ2UgPSBgRXJyb3IgZXhlY3V0aW5nICR7SURCX0VYRUNVVEFCTEV9LiBPcmlnaW5hbCBlcnJvcjogJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgVHJ5IHRvIGluY3JlYXNlIHRoZSAke29wdHMudGltZW91dH1tcyAke0lEQl9FWEVDVVRBQkxFfSBleGVjdXRpb24gdGltZW91dCByZXByZXNlbnRlZCBieSAnJHtvcHRzLnRpbWVvdXRDYXBOYW1lfScgY2FwYWJpbGl0eWA7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBTdWJQcm9jZXNzIGluc3RhbmNlIG9mIGlkYiBmb3IgYmFja2dyb3VuZFxuICogZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tbWFuZCBkZXNpcmVkIGlkYiBjb21tYW5kIChlLmcuOiBbXCJsYXVuY2hcIl0sIFtcInhjdGVzdFwiLCBcInJ1blwiLCBcInVpXCJdKVxuICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBhcmdzIGFkZGl0aW9uYWwgaWRiIGFyZ3VtZW50c1xuICogQHJldHVybnMge1N1YlByb2Nlc3N9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmNyZWF0ZVN1YlByb2Nlc3MgPSBmdW5jdGlvbiBjcmVhdGVTdWJQcm9jZXNzIChjb21tYW5kID0gW10sIGFyZ3MgPSBbXSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGlkYkFyZ3MgPSBbLi4uY29tbWFuZCwgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAuLi5hcmdzXTtcbiAgbG9nLmRlYnVnKGBDcmVhdGluZyAke0lEQl9FWEVDVVRBQkxFfSBzdWJwcm9jZXNzIHdpdGggYXJnczogJHt1dGlsLnF1b3RlKGFyZ3MpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGlkYkFyZ3MsIG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc3lzdGVtQ2FsbE1ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFHQSxNQUFNQSx1QkFBdUIsR0FBSUMsSUFBSSxJQUNsQyxHQUFFQyxpQ0FBeUIsdUJBQXNCRCxJQUFLLEVBQUM7QUFDMUQsTUFBTUUsd0JBQXdCLEdBQUcsbUJBQW1CO0FBQ3BELE1BQU1DLDhCQUE4QixHQUFHLDBCQUEwQjtBQUNqRSxNQUFNQyw2QkFBNkIsR0FBRyxFQUFFO0FBRXhDLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQW9CNUJBLGlCQUFpQixDQUFDQyxPQUFPLEdBQUcsZUFBZUEsT0FBTyxDQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDN0QsTUFBTTtJQUNKQztFQUNGLENBQUMsR0FBR0QsSUFBSTtFQUVSRSxlQUFHLENBQUNDLEtBQUssQ0FBRSxjQUFhQyx1QkFBZSxnQkFBZSxJQUFJLENBQUNYLElBQUssR0FBRSxDQUFDO0VBRW5FLE1B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

7

CHANGELOG.md

@@ -0,1 +1,8 @@

## [1.6.6](https://github.com/appium/appium-idb/compare/v1.6.5...v1.6.6) (2022-12-11)
### Miscellaneous Chores
* Update idb startup logic ([#61](https://github.com/appium/appium-idb/issues/61)) ([c2ed8e9](https://github.com/appium/appium-idb/commit/c2ed8e978947ba41868d06e851518c0eb77017b8))
## [1.6.5](https://github.com/appium/appium-idb/compare/v1.6.4...v1.6.5) (2022-12-01)

@@ -2,0 +9,0 @@

@@ -8,3 +8,3 @@ import B from 'bluebird';

getPids, DEFAULT_IDB_EXEC_TIMEOUT, IDB_EXECUTABLE,
IDB_COMPANION_EXECUTABLE, DEFAULT_IDB_PORT, DEFAULT_COMPANION_GRPC_PORT,
IDB_COMPANION_EXECUTABLE, DEFAULT_COMPANION_GRPC_PORT,
} from '../helpers';

@@ -14,25 +14,8 @@ import log from '../logger.js';

const PROCESS_INIT_TIMEOUT = 5000;
const COMPANION_PGREP_PATTERN = (udid) =>
`${IDB_COMPANION_EXECUTABLE}.*--udid[[:space:]]+${udid}`;
const COMPANION_STARTUP_REGEXP = /Started GRPC server on port (\d+)/;
const COMPANION_STARTUP_REGEXP = /"grpc_port":(\d+)/;
const COMPANION_STARTUP_ERROR_REGEXP = /New Error Built ==> (.+)/;
const COMPANION_STARTUP_TIMEOUT_SEC = 30;
function buildDaemonArgs (opts = {}) {
const {
port,
grpcPort,
} = opts;
const result = ['daemon'];
if (port) {
result.push('--port', port);
}
if (grpcPort) {
result.push('--grpc-port', grpcPort);
}
return result;
}
const systemCallMethods = {};

@@ -130,3 +113,6 @@

companionProc.once('exit', listeners.exit);
}).timeout(60000, 'Was unable to acquire a GRPC port after 60 seconds timeout');
}).timeout(
COMPANION_STARTUP_TIMEOUT_SEC * 1000,
`Was unable to acquire a GRPC port after ${COMPANION_STARTUP_TIMEOUT_SEC}s timeout`
);
} catch (err) {

@@ -147,3 +133,3 @@ cleanupListeners();

try {
await tpExec(IDB_EXECUTABLE, ['connect', '127.0.0.1', grpcPort]);
await tpExec(IDB_EXECUTABLE, ['connect', this.udid, grpcPort]);
} catch (connectionError) {

@@ -155,46 +141,10 @@ await retryInterval(2, 100, async () => {

} catch (ign) {}
let isStartupMonitorEnabled = true;
try {
const daemon = new SubProcess(IDB_EXECUTABLE, buildDaemonArgs({
port: this.executable.port,
grpcPort,
}));
let daemonOutput = '';
daemon.on('output', (stdout, stderr) => {
if (isStartupMonitorEnabled && _.trim(stdout || stderr)) {
daemonOutput += `[daemon] ${stdout || stderr}\n`;
}
});
try {
await daemon.start(null, PROCESS_INIT_TIMEOUT);
await B.delay(300);
} catch (ign) {}
if (daemon.isRunning) {
log.debug(`${IDB_EXECUTABLE} daemon started on port ${this.executable.port || DEFAULT_IDB_PORT}`);
} else {
if (!daemonOutput.includes('address already in use')) {
const message = `${IDB_EXECUTABLE} daemon has failed to start: ${daemonOutput}`;
log.warn(message);
throw new Error(message);
}
log.debug(`The port ${this.executable.port || DEFAULT_IDB_PORT} is already in use. ` +
`Assuming it is used by ${IDB_EXECUTABLE} daemon`);
}
await tpExec(IDB_EXECUTABLE, ['connect', '127.0.0.1', grpcPort]);
} catch (connectionError2) {
if (connectionError2.stderr || connectionError2.stdout) {
log.debug(connectionError2.stderr || connectionError2.stdout);
}
throw connectionError2;
} finally {
isStartupMonitorEnabled = false;
}
await tpExec(IDB_EXECUTABLE, ['connect', this.udid, grpcPort]);
});
}
} catch (e) {
if (e.stderr) {
log.debug(e.stderr);
if (e.stderr || e.stdout) {
log.debug(e.stderr || e.stdout);
}
throw new Error(`Cannot start ${IDB_EXECUTABLE} service for '${this.udid}'. ` +
throw new Error(`Cannot start ${IDB_EXECUTABLE} service for the device '${this.udid}'. ` +
`Check the server log for more details.`);

@@ -229,2 +179,3 @@ }

const timer = new timing.Timer().start();
let lastError = null;
try {

@@ -236,2 +187,3 @@ await waitForCondition(async () => {

} catch (e) {
lastError = e.stderr || e.message;
return false;

@@ -245,3 +197,3 @@ }

throw new Error(`The device '${this.udid}' is not responding to idb requests after ${timeoutMs}ms timeout. ` +
`Original error: ${e.stderr || e.message}`);
`Original error: ${lastError || e.message}`);
}

@@ -248,0 +200,0 @@ log.debug(`The device '${this.udid}' is online and ready to accept idb commands in ` +

@@ -7,3 +7,3 @@ {

],
"version": "1.6.5",
"version": "1.6.6",
"author": "appium",

@@ -10,0 +10,0 @@ "license": "Apache-2.0",

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc