gst-atom-xcuitest-driver
Version:
ATOM driver for iOS using XCUITest for backend
212 lines (155 loc) • 23.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createSim = createSim;
exports.getExistingSim = getExistingSim;
exports.runSimulatorReset = runSimulatorReset;
exports.installToSimulator = installToSimulator;
exports.shutdownSimulator = shutdownSimulator;
exports.shutdownOtherSimulators = shutdownOtherSimulators;
require("source-map-support/register");
var _appiumIosSimulator = require("appium-ios-simulator");
var _nodeSimctl = _interopRequireDefault(require("node-simctl"));
var _appiumWebdriveragent = require("appium-webdriveragent");
var _lodash = _interopRequireDefault(require("lodash"));
var _logger = _interopRequireDefault(require("./logger"));
var _appiumSupport = require("appium-support");
var _desiredCaps = require("./desired-caps");
const APPIUM_SIM_PREFIX = 'appiumTest';
async function createSim(caps, platform = _desiredCaps.PLATFORM_NAME_IOS) {
const udid = await new _nodeSimctl.default().createDevice(`${APPIUM_SIM_PREFIX}-${_appiumSupport.util.uuidV4().toUpperCase()}-${caps.deviceName}`, caps.deviceName, caps.platformVersion, {
platform
});
return await (0, _appiumIosSimulator.getSimulator)(udid, {
platform,
checkExistence: false
});
}
async function getExistingSim(opts) {
let appiumTestDevice;
for (const device of _lodash.default.values(await new _nodeSimctl.default().getDevices(opts.platformVersion))) {
if (device.name === opts.deviceName) {
return await (0, _appiumIosSimulator.getSimulator)(device.udid, {
platform: device.platform,
checkExistence: false
});
}
if (device.name.startsWith(APPIUM_SIM_PREFIX) && device.name.endsWith(opts.deviceName)) {
appiumTestDevice = device;
if (device.state === 'Booted') {
break;
}
}
}
if (appiumTestDevice) {
_logger.default.warn(`Unable to find device '${opts.deviceName}'. Found '${appiumTestDevice.name}' (udid: '${appiumTestDevice.udid}') instead`);
return await (0, _appiumIosSimulator.getSimulator)(appiumTestDevice.udid, {
platform: appiumTestDevice.platform,
checkExistence: false
});
}
return null;
}
async function shutdownSimulator(device) {
await (0, _appiumWebdriveragent.resetTestProcesses)(device.udid, true);
await device.shutdown();
}
async function runSimulatorReset(device, opts) {
if (opts.noReset && !opts.fullReset) {
_logger.default.debug('Reset: noReset is on. Leaving simulator as is');
return;
}
if (!device) {
_logger.default.debug('Reset: no device available. Skipping');
return;
}
if (opts.fullReset) {
_logger.default.debug('Reset: fullReset is on. Cleaning simulator');
await shutdownSimulator(device);
let isKeychainsBackupSuccessful = false;
if (opts.keychainsExcludePatterns || opts.keepKeyChains) {
isKeychainsBackupSuccessful = await device.backupKeychains();
}
await device.clean();
if (isKeychainsBackupSuccessful) {
await device.restoreKeychains(opts.keychainsExcludePatterns || []);
_logger.default.info(`Successfully restored keychains after full reset`);
} else if (opts.keychainsExcludePatterns || opts.keepKeyChains) {
_logger.default.warn('Cannot restore keychains after full reset, because ' + 'the backup operation did not succeed');
}
} else if (opts.bundleId) {
if (await device.isRunning()) {
if (opts.enforceSimulatorShutdown) {
await shutdownSimulator(device);
} else {
try {
await device.simctl.terminateApp(opts.bundleId);
} catch (err) {
_logger.default.warn(`Reset: failed to terminate Simulator application with id "${opts.bundleId}"`);
}
}
}
if (opts.app) {
_logger.default.info('Not scrubbing third party app in anticipation of uninstall');
return;
}
const isSafari = (opts.browserName || '').toLowerCase() === 'safari';
try {
if (isSafari) {
await device.cleanSafari();
} else {
await device.scrubCustomApp('', opts.bundleId);
}
} catch (err) {
_logger.default.warn(err.message);
_logger.default.warn(`Reset: could not scrub ${isSafari ? 'Safari browser' : 'application with id "' + opts.bundleId + '"'}. Leaving as is.`);
}
}
}
async function installToSimulator(device, app, bundleId, opts = {}) {
if (!app) {
_logger.default.debug('No app path is given. Nothing to install.');
return;
}
const {
noReset = true,
newSimulator = false
} = opts;
if (!newSimulator && bundleId && (await device.isAppInstalled(bundleId))) {
if (noReset) {
_logger.default.debug(`App '${bundleId}' is already installed. No need to reinstall.`);
return;
}
_logger.default.debug(`Reset requested. Removing app with id '${bundleId}' from the device`);
await device.removeApp(bundleId);
}
_logger.default.debug(`Installing '${app}' on Simulator with UUID '${device.udid}'...`);
try {
await device.installApp(app);
} catch (e) {
_logger.default.info(`Got an error on '${app}' install: ${e.message}`);
_logger.default.info('Retrying application install');
await device.installApp(app);
}
_logger.default.debug('The app has been installed successfully.');
}
async function shutdownOtherSimulators(currentDevice) {
const simctl = new _nodeSimctl.default();
const allDevices = _lodash.default.flatMap(_lodash.default.values(await simctl.getDevices()));
const otherBootedDevices = allDevices.filter(device => device.udid !== currentDevice.udid && device.state === 'Booted');
if (_lodash.default.isEmpty(otherBootedDevices)) {
_logger.default.info('No other running simulators have been detected');
return;
}
_logger.default.info(`Detected ${otherBootedDevices.length} other running ${_appiumSupport.util.pluralize('Simulator', otherBootedDevices.length)}.` + `Shutting them down...`);
for (const {
udid
} of otherBootedDevices) {
await (0, _appiumWebdriveragent.resetTestProcesses)(udid, true);
simctl.udid = udid;
await simctl.shutdownDevice();
}
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3ItbWFuYWdlbWVudC5qcyJdLCJuYW1lcyI6WyJBUFBJVU1fU0lNX1BSRUZJWCIsImNyZWF0ZVNpbSIsImNhcHMiLCJwbGF0Zm9ybSIsIlBMQVRGT1JNX05BTUVfSU9TIiwidWRpZCIsIlNpbWN0bCIsImNyZWF0ZURldmljZSIsInV0aWwiLCJ1dWlkVjQiLCJ0b1VwcGVyQ2FzZSIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJjaGVja0V4aXN0ZW5jZSIsImdldEV4aXN0aW5nU2ltIiwib3B0cyIsImFwcGl1bVRlc3REZXZpY2UiLCJkZXZpY2UiLCJfIiwidmFsdWVzIiwiZ2V0RGV2aWNlcyIsIm5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzdGF0ZSIsImxvZyIsIndhcm4iLCJzaHV0ZG93blNpbXVsYXRvciIsInNodXRkb3duIiwicnVuU2ltdWxhdG9yUmVzZXQiLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZGVidWciLCJpc0tleWNoYWluc0JhY2t1cFN1Y2Nlc3NmdWwiLCJrZXljaGFpbnNFeGNsdWRlUGF0dGVybnMiLCJrZWVwS2V5Q2hhaW5zIiwiYmFja3VwS2V5Y2hhaW5zIiwiY2xlYW4iLCJyZXN0b3JlS2V5Y2hhaW5zIiwiaW5mbyIsImJ1bmRsZUlkIiwiaXNSdW5uaW5nIiwiZW5mb3JjZVNpbXVsYXRvclNodXRkb3duIiwic2ltY3RsIiwidGVybWluYXRlQXBwIiwiZXJyIiwiYXBwIiwiaXNTYWZhcmkiLCJicm93c2VyTmFtZSIsInRvTG93ZXJDYXNlIiwiY2xlYW5TYWZhcmkiLCJzY3J1YkN1c3RvbUFwcCIsIm1lc3NhZ2UiLCJpbnN0YWxsVG9TaW11bGF0b3IiLCJuZXdTaW11bGF0b3IiLCJpc0FwcEluc3RhbGxlZCIsInJlbW92ZUFwcCIsImluc3RhbGxBcHAiLCJlIiwic2h1dGRvd25PdGhlclNpbXVsYXRvcnMiLCJjdXJyZW50RGV2aWNlIiwiYWxsRGV2aWNlcyIsImZsYXRNYXAiLCJvdGhlckJvb3RlZERldmljZXMiLCJmaWx0ZXIiLCJpc0VtcHR5IiwibGVuZ3RoIiwicGx1cmFsaXplIiwic2h1dGRvd25EZXZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxpQkFBaUIsR0FBRyxZQUExQjs7QUFlQSxlQUFlQyxTQUFmLENBQTBCQyxJQUExQixFQUFnQ0MsUUFBUSxHQUFHQyw4QkFBM0MsRUFBOEQ7QUFDNUQsUUFBTUMsSUFBSSxHQUFHLE1BQU0sSUFBSUMsbUJBQUosR0FBYUMsWUFBYixDQUNoQixHQUFFUCxpQkFBa0IsSUFBR1Esb0JBQUtDLE1BQUwsR0FBY0MsV0FBZCxFQUE0QixJQUFHUixJQUFJLENBQUNTLFVBQVcsRUFEdEQsRUFFakJULElBQUksQ0FBQ1MsVUFGWSxFQUdqQlQsSUFBSSxDQUFDVSxlQUhZLEVBSWpCO0FBQUNULElBQUFBO0FBQUQsR0FKaUIsQ0FBbkI7QUFNQSxTQUFPLE1BQU0sc0NBQWFFLElBQWIsRUFBbUI7QUFDOUJGLElBQUFBLFFBRDhCO0FBRTlCVSxJQUFBQSxjQUFjLEVBQUU7QUFGYyxHQUFuQixDQUFiO0FBSUQ7O0FBVUQsZUFBZUMsY0FBZixDQUErQkMsSUFBL0IsRUFBcUM7QUFDbkMsTUFBSUMsZ0JBQUo7O0FBRUEsT0FBSyxNQUFNQyxNQUFYLElBQXFCQyxnQkFBRUMsTUFBRixDQUFTLE1BQU0sSUFBSWIsbUJBQUosR0FBYWMsVUFBYixDQUF3QkwsSUFBSSxDQUFDSCxlQUE3QixDQUFmLENBQXJCLEVBQW9GO0FBQ2xGLFFBQUlLLE1BQU0sQ0FBQ0ksSUFBUCxLQUFnQk4sSUFBSSxDQUFDSixVQUF6QixFQUFxQztBQUNuQyxhQUFPLE1BQU0sc0NBQWFNLE1BQU0sQ0FBQ1osSUFBcEIsRUFBMEI7QUFDckNGLFFBQUFBLFFBQVEsRUFBRWMsTUFBTSxDQUFDZCxRQURvQjtBQUVyQ1UsUUFBQUEsY0FBYyxFQUFFO0FBRnFCLE9BQTFCLENBQWI7QUFJRDs7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QkFBa0IsQ0FBQ0csTUFBL0MsQ0FBdUQsR0FBOUcsR0FDTix1QkFESDs7QUFFQSxPQUFLLE1BQU07QUFBQzdELElBQUFBO0FBQUQsR0FBWCxJQUFxQjBELGtCQUFyQixFQUF5QztBQUd2QyxVQUFNLDhDQUFtQjFELElBQW5CLEVBQXlCLElBQXpCLENBQU47QUFDQXNDLElBQUFBLE1BQU0sQ0FBQ3RDLElBQVAsR0FBY0EsSUFBZDtBQUNBLFVBQU1zQyxNQUFNLENBQUN5QixjQUFQLEVBQU47QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U2ltdWxhdG9yIH0gZnJvbSAnYXBwaXVtLWlvcy1zaW11bGF0b3InO1xuaW1wb3J0IFNpbWN0bCBmcm9tICdub2RlLXNpbWN0bCc7XG5pbXBvcnQgeyByZXNldFRlc3RQcm9jZXNzZXMgfSBmcm9tICdhcHBpdW0td2ViZHJpdmVyYWdlbnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IFBMQVRGT1JNX05BTUVfSU9TIH0gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuXG5cbmNvbnN0IEFQUElVTV9TSU1fUFJFRklYID0gJ2FwcGl1bVRlc3QnO1xuXG4vKipcbiAqIENhcGFiaWxpdHkgc2V0IGJ5IGEgdXNlclxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2VOYW1lIC0gQSBuYW1lIGZvciB0aGUgZGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhdGZvcm1WZXJzaW9uIC0gVGhlIHZlcnNpb24gb2YgaU9TIHRvIHVzZVxuICovXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBzaW11bGF0b3Igd2l0aCBgYXBwaXVtVGVzdC1gIHByZWZpeCBhbmQgcmV0dXJuIHRoZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFNpbUNyZWF0aW9uQ2FwcyAtIENhcGFiaWxpdHkgc2V0IGJ5IGEgdXNlci4gVGhlIG9wdGlvbnMgYXZhaWxhYmxlIGFyZTpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybSBbaU9TXSAtIFBsYXRmb3JtIG5hbWUgaW4gb3JkZXIgdG8gc3BlY2lmeSBydW50aW1lIHN1Y2ggYXMgJ2lPUycsICd0dk9TJywgJ3dhdGNoT1MnXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBTaW11bGF0b3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdWRpZCBwYXNzZWQgaW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpbSAoY2FwcywgcGxhdGZvcm0gPSBQTEFURk9STV9OQU1FX0lPUykge1xuICBjb25zdCB1ZGlkID0gYXdhaXQgbmV3IFNpbWN0bCgpLmNyZWF0ZURldmljZShcbiAgICBgJHtBUFBJVU1fU0lNX1BSRUZJWH0tJHt1dGlsLnV1aWRWNCgpLnRvVXBwZXJDYXNlKCl9LSR7Y2Fwcy5kZXZpY2VOYW1lfWAsXG4gICAgY2Fwcy5kZXZpY2VOYW1lLFxuICAgIGNhcHMucGxhdGZvcm1WZXJzaW9uLFxuICAgIHtwbGF0Zm9ybX0sXG4gICk7XG4gIHJldHVybiBhd2FpdCBnZXRTaW11bGF0b3IodWRpZCwge1xuICAgIHBsYXRmb3JtLFxuICAgIGNoZWNrRXhpc3RlbmNlOiBmYWxzZSxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGEgc2ltdWxhdG9yIHdoaWNoIGlzIGFscmVhZHkgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIENhcGFiaWxpdHkgc2V0IGJ5IGEgdXNlci4gVGhlIG9wdGlvbnMgYXZhaWxhYmxlIGFyZTpcbiAqICAgLSBgZGV2aWNlTmFtZWAgLSBhIG5hbWUgZm9yIHRoZSBkZXZpY2VcbiAqICAgLSBgcGxhdGZvcm1WZXJzaW9uYCAtIHRoZSB2ZXJzaW9uIG9mIGlPUyB0byB1c2VcbiAqIEByZXR1cm5zIHs/b2JqZWN0fSBTaW11bGF0b3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdWRpZCBwYXNzZWQgaW4uIE9yIG51bGwgaWYgbm8gZGV2aWNlIGlzIHJ1bm5pbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nU2ltIChvcHRzKSB7XG4gIGxldCBhcHBpdW1UZXN0RGV2aWNlO1xuXG4gIGZvciAoY29uc3QgZGV2aWNlIG9mIF8udmFsdWVzKGF3YWl0IG5ldyBTaW1jdGwoKS5nZXREZXZpY2VzKG9wdHMucGxhdGZvcm1WZXJzaW9uKSkpIHtcbiAgICBpZiAoZGV2aWNlLm5hbWUgPT09IG9wdHMuZGV2aWNlTmFtZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldFNpbXVsYXRvcihkZXZpY2UudWRpZCwge1xuICAgICAgICBwbGF0Zm9ybTogZGV2aWNlLnBsYXRmb3JtLFxuICAgICAgICBjaGVja0V4aXN0ZW5jZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlLm5hbWUuc3RhcnRzV2l0aChBUFBJVU1fU0lNX1BSRUZJWCkgJiYgZGV2aWNlLm5hbWUuZW5kc1dpdGgob3B0cy5kZXZpY2VOYW1lKSkge1xuICAgICAgYXBwaXVtVGVzdERldmljZSA9IGRldmljZTtcbiAgICAgIC8vIGNob29zZSB0aGUgZmlyc3QgYm9vdGVkIHNpbXVsYXRvclxuICAgICAgaWYgKGRldmljZS5zdGF0ZSA9PT0gJ0Jvb3RlZCcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFwcGl1bVRlc3REZXZpY2UpIHtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIGZpbmQgZGV2aWNlICcke29wdHMuZGV2aWNlTmFtZX0nLiBGb3VuZCAnJHthcHBpdW1UZXN0RGV2aWNlLm5hbWV9JyAodWRpZDogJyR7YXBwaXVtVGVzdERldmljZS51ZGlkfScpIGluc3RlYWRgKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0U2ltdWxhdG9yKGFwcGl1bVRlc3REZXZpY2UudWRpZCwge1xuICAgICAgcGxhdGZvcm06IGFwcGl1bVRlc3REZXZpY2UucGxhdGZvcm0sXG4gICAgICBjaGVja0V4aXN0ZW5jZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNodXRkb3duU2ltdWxhdG9yIChkZXZpY2UpIHtcbiAgLy8gc3RvcCBYQ1Rlc3QgcHJvY2Vzc2VzIGlmIHJ1bm5pbmcgdG8gYXZvaWQgdW5leHBlY3RlZCBzaWRlIGVmZmVjdHNcbiAgYXdhaXQgcmVzZXRUZXN0UHJvY2Vzc2VzKGRldmljZS51ZGlkLCB0cnVlKTtcbiAgYXdhaXQgZGV2aWNlLnNodXRkb3duKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNpbXVsYXRvclJlc2V0IChkZXZpY2UsIG9wdHMpIHtcbiAgaWYgKG9wdHMubm9SZXNldCAmJiAhb3B0cy5mdWxsUmVzZXQpIHtcbiAgICAvLyBub1Jlc2V0ID09PSB0cnVlICYmIGZ1bGxSZXNldCA9PT0gZmFsc2VcbiAgICBsb2cuZGVidWcoJ1Jlc2V0OiBub1Jlc2V0IGlzIG9uLiBMZWF2aW5nIHNpbXVsYXRvciBhcyBpcycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghZGV2aWNlKSB7XG4gICAgbG9nLmRlYnVnKCdSZXNldDogbm8gZGV2aWNlIGF2YWlsYWJsZS4gU2tpcHBpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0cy5mdWxsUmVzZXQpIHtcbiAgICBsb2cuZGVidWcoJ1Jlc2V0OiBmdWxsUmVzZXQgaXMgb24uIENsZWFuaW5nIHNpbXVsYXRvcicpO1xuICAgIGF3YWl0IHNodXRkb3duU2ltdWxhdG9yKGRldmljZSk7XG4gICAgbGV0IGlzS2V5Y2hhaW5zQmFja3VwU3VjY2Vzc2Z1bCA9IGZhbHNlO1xuICAgIGlmIChvcHRzLmtleWNoYWluc0V4Y2x1ZGVQYXR0ZXJucyB8fCBvcHRzLmtlZXBLZXlDaGFpbnMpIHtcbiAgICAgIGlzS2V5Y2hhaW5zQmFja3VwU3VjY2Vzc2Z1bCA9IGF3YWl0IGRldmljZS5iYWNrdXBLZXljaGFpbnMoKTtcbiAgICB9XG4gICAgYXdhaXQgZGV2aWNlLmNsZWFuKCk7XG4gICAgaWYgKGlzS2V5Y2hhaW5zQmFja3VwU3VjY2Vzc2Z1bCkge1xuICAgICAgYXdhaXQgZGV2aWNlLnJlc3RvcmVLZXljaGFpbnMob3B0cy5rZXljaGFpbnNFeGNsdWRlUGF0dGVybnMgfHwgW10pO1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSByZXN0b3JlZCBrZXljaGFpbnMgYWZ0ZXIgZnVsbCByZXNldGApO1xuICAgIH0gZWxzZSBpZiAob3B0cy5rZXljaGFpbnNFeGNsdWRlUGF0dGVybnMgfHwgb3B0cy5rZWVwS2V5Q2hhaW5zKSB7XG4gICAgICBsb2cud2FybignQ2Fubm90IHJlc3RvcmUga2V5Y2hhaW5zIGFmdGVyIGZ1bGwgcmVzZXQsIGJlY2F1c2UgJyArXG4gICAgICAgICAgICAgICAndGhlIGJhY2t1cCBvcGVyYXRpb24gZGlkIG5vdCBzdWNjZWVkJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9wdHMuYnVuZGxlSWQpIHtcbiAgICAvLyBmYXN0UmVzZXQgb3Igbm9SZXNldFxuXG4gICAgLy8gVGVybWluYXRlIHRoZSBhcHAgdW5kZXIgdGVzdCBpZiBpdCBpcyBzdGlsbCBydW5uaW5nIG9uIFNpbXVsYXRvclxuICAgIC8vIFRlcm1pbmF0aW9uIGlzIG5vdCBuZWVkZWQgaWYgU2ltdWxhdG9yIGlzIG5vdCBydW5uaW5nXG4gICAgaWYgKGF3YWl0IGRldmljZS5pc1J1bm5pbmcoKSkge1xuICAgICAgaWYgKG9wdHMuZW5mb3JjZVNpbXVsYXRvclNodXRkb3duKSB7XG4gICAgICAgIGF3YWl0IHNodXRkb3duU2ltdWxhdG9yKGRldmljZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGRldmljZS5zaW1jdGwudGVybWluYXRlQXBwKG9wdHMuYnVuZGxlSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2cud2FybihgUmVzZXQ6IGZhaWxlZCB0byB0ZXJtaW5hdGUgU2ltdWxhdG9yIGFwcGxpY2F0aW9uIHdpdGggaWQgXCIke29wdHMuYnVuZGxlSWR9XCJgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0cy5hcHApIHtcbiAgICAgIGxvZy5pbmZvKCdOb3Qgc2NydWJiaW5nIHRoaXJkIHBhcnR5IGFwcCBpbiBhbnRpY2lwYXRpb24gb2YgdW5pbnN0YWxsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzU2FmYXJpID0gKG9wdHMuYnJvd3Nlck5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdzYWZhcmknO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNTYWZhcmkpIHtcbiAgICAgICAgYXdhaXQgZGV2aWNlLmNsZWFuU2FmYXJpKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpT1MgOCsgZG9lcyBub3QgbmVlZCBiYXNlbmFtZVxuICAgICAgICBhd2FpdCBkZXZpY2Uuc2NydWJDdXN0b21BcHAoJycsIG9wdHMuYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oZXJyLm1lc3NhZ2UpO1xuICAgICAgbG9nLndhcm4oYFJlc2V0OiBjb3VsZCBub3Qgc2NydWIgJHtpc1NhZmFyaSA/ICdTYWZhcmkgYnJvd3NlcicgOiAnYXBwbGljYXRpb24gd2l0aCBpZCBcIicgKyBvcHRzLmJ1bmRsZUlkICsgJ1wiJ30uIExlYXZpbmcgYXMgaXMuYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBub1Jlc2V0IFtmYWxzZV0gV2hldGhlciB0byBkaXNhYmxlIHJlc2V0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBuZXdTaW11bGF0b3IgW2ZhbHNlXSBXaGV0aGVyIHRoZSBzaW11bGF0b3IgaXMgYnJhbmQgbmV3XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGV2aWNlIFRoZSBzaW11bGF0b3IgZGV2aWNlIG9iamVjdFxuICogQHBhcmFtIHs/c3RyaW5nfSBhcHAgVGhlIGFwcCB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIFRoZSBidW5kbGUgaWQgdG8gZW5zdXJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIHVuaW5zdGFsbCBpdFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFRvU2ltdWxhdG9yIChkZXZpY2UsIGFwcCwgYnVuZGxlSWQsIG9wdHMgPSB7fSkge1xuICBpZiAoIWFwcCkge1xuICAgIGxvZy5kZWJ1ZygnTm8gYXBwIHBhdGggaXMgZ2l2ZW4uIE5vdGhpbmcgdG8gaW5zdGFsbC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgbm9SZXNldCA9IHRydWUsXG4gICAgbmV3U2ltdWxhdG9yID0gZmFsc2UsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghbmV3U2ltdWxhdG9yICYmIGJ1bmRsZUlkICYmIGF3YWl0IGRldmljZS5pc0FwcEluc3RhbGxlZChidW5kbGVJZCkpIHtcbiAgICBpZiAobm9SZXNldCkge1xuICAgICAgbG9nLmRlYnVnKGBBcHAgJyR7YnVuZGxlSWR9JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gTm8gbmVlZCB0byByZWluc3RhbGwuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgUmVzZXQgcmVxdWVzdGVkLiBSZW1vdmluZyBhcHAgd2l0aCBpZCAnJHtidW5kbGVJZH0nIGZyb20gdGhlIGRldmljZWApO1xuICAgIGF3YWl0IGRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBJbnN0YWxsaW5nICcke2FwcH0nIG9uIFNpbXVsYXRvciB3aXRoIFVVSUQgJyR7ZGV2aWNlLnVkaWR9Jy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IGRldmljZS5pbnN0YWxsQXBwKGFwcCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBpdCBzb21ldGltZXMgZmFpbHMgb24gWGNvZGUgMTAgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uXG4gICAgbG9nLmluZm8oYEdvdCBhbiBlcnJvciBvbiAnJHthcHB9JyBpbnN0YWxsOiAke2UubWVzc2FnZX1gKTtcbiAgICBsb2cuaW5mbygnUmV0cnlpbmcgYXBwbGljYXRpb24gaW5zdGFsbCcpO1xuICAgIGF3YWl0IGRldmljZS5pbnN0YWxsQXBwKGFwcCk7XG4gIH1cbiAgbG9nLmRlYnVnKCdUaGUgYXBwIGhhcyBiZWVuIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNodXRkb3duT3RoZXJTaW11bGF0b3JzIChjdXJyZW50RGV2aWNlKSB7XG4gIGNvbnN0IHNpbWN0bCA9IG5ldyBTaW1jdGwoKTtcbiAgY29uc3QgYWxsRGV2aWNlcyA9IF8uZmxhdE1hcChfLnZhbHVlcyhhd2FpdCBzaW1jdGwuZ2V0RGV2aWNlcygpKSk7XG4gIGNvbnN0IG90aGVyQm9vdGVkRGV2aWNlcyA9IGFsbERldmljZXMuZmlsdGVyKChkZXZpY2UpID0+IGRldmljZS51ZGlkICE9PSBjdXJyZW50RGV2aWNlLnVkaWQgJiYgZGV2aWNlLnN0YXRlID09PSAnQm9vdGVkJyk7XG4gIGlmIChfLmlzRW1wdHkob3RoZXJCb290ZWREZXZpY2VzKSkge1xuICAgIGxvZy5pbmZvKCdObyBvdGhlciBydW5uaW5nIHNpbXVsYXRvcnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy5pbmZvKGBEZXRlY3RlZCAke290aGVyQm9vdGVkRGV2aWNlcy5sZW5ndGh9IG90aGVyIHJ1bm5pbmcgJHt1dGlsLnBsdXJhbGl6ZSgnU2ltdWxhdG9yJywgb3RoZXJCb290ZWREZXZpY2VzLmxlbmd0aCl9LmAgK1xuICAgIGBTaHV0dGluZyB0aGVtIGRvd24uLi5gKTtcbiAgZm9yIChjb25zdCB7dWRpZH0gb2Ygb3RoZXJCb290ZWREZXZpY2VzKSB7XG4gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHN0b3AgdGhlIGNvcnJlc3BvbmRpbmcgeGNvZGVidWlsZCBwcm9jZXNzIGJlZm9yZSBraWxsaW5nXG4gICAgLy8gdGhlIHNpbXVsYXRvciwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModWRpZCwgdHJ1ZSk7XG4gICAgc2ltY3RsLnVkaWQgPSB1ZGlkO1xuICAgIGF3YWl0IHNpbWN0bC5zaHV0ZG93bkRldmljZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVNpbSwgZ2V0RXhpc3RpbmdTaW0sIHJ1blNpbXVsYXRvclJlc2V0LCBpbnN0YWxsVG9TaW11bGF0b3IsXG4gIHNodXRkb3duU2ltdWxhdG9yLCBzaHV0ZG93bk90aGVyU2ltdWxhdG9ycyB9O1xuIl0sImZpbGUiOiJsaWIvc2ltdWxhdG9yLW1hbmFnZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==