gst-atom-xcuitest-driver
Version:
ATOM driver for iOS using XCUITest for backend
174 lines (134 loc) • 20.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.helpers = exports.commands = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _gstAtomBaseDriver = require("gst-atom-base-driver");
var _appiumSupport = require("appium-support");
var _logger = _interopRequireDefault(require("../logger"));
const MAGIC_FIRST_VIS_CHILD_SEL = /\/\*\[@firstVisible\s*=\s*('|")true\1\]/;
const MAGIC_SCROLLABLE_SEL = /\/\/\*\[@scrollable\s*=\s*('|")true\1\]/;
const WDA_CLASS_CHAIN_STRATEGY = 'class chain';
let helpers = {},
commands = {},
extensions = {};
exports.commands = commands;
exports.helpers = helpers;
helpers.findElOrEls = async function findElOrEls(strategy, selector, mult, context) {
if (this.isWebview()) {
return await this.findWebElementOrElements(strategy, selector, mult, context);
} else {
return await this.findNativeElementOrElements(strategy, selector, mult, context);
}
};
helpers.findNativeElementOrElements = async function findNativeElementOrElements(strategy, selector, mult, context) {
const initSelector = selector;
let rewroteSelector = false;
if (strategy === '-ios predicate string') {
strategy = 'predicate string';
} else if (strategy === '-ios class chain') {
strategy = WDA_CLASS_CHAIN_STRATEGY;
}
function stripViewFromSelector(selector) {
const keepView = ['XCUIElementTypeScrollView', 'XCUIElementTypeCollectionView', 'XCUIElementTypeTextView', 'XCUIElementTypeWebView'].includes(selector);
if (!keepView && selector.indexOf('View') === selector.length - 4) {
return selector.substr(0, selector.length - 4);
} else {
return selector;
}
}
if (strategy === 'class name') {
if (selector.startsWith('UIA')) {
selector = selector.substring(3);
}
if (!selector.startsWith('XCUIElementType')) {
selector = stripViewFromSelector(`XCUIElementType${selector}`);
rewroteSelector = true;
}
}
if (strategy === 'xpath' && MAGIC_FIRST_VIS_CHILD_SEL.test(selector)) {
return await this.getFirstVisibleChild(mult, context);
} else if (strategy === 'xpath' && MAGIC_SCROLLABLE_SEL.test(selector)) {
[strategy, selector] = rewriteMagicScrollable(mult);
} else if (strategy === 'xpath') {
selector = selector.replace(/(^|\/)(UIA)([^[/]+)/g, (str, g1, g2, g3) => {
rewroteSelector = true;
return g1 + stripViewFromSelector(`XCUIElementType${g3}`);
});
}
if (rewroteSelector) {
_logger.default.info(`Rewrote incoming selector from '${initSelector}' to ` + `'${selector}' to match XCUI type. You should consider ` + `updating your tests to use the new selectors directly`);
}
return await this.doNativeFind(strategy, selector, mult, context);
};
helpers.doNativeFind = async function doNativeFind(strategy, selector, mult, context) {
context = _appiumSupport.util.unwrapElement(context);
let endpoint = `/element${context ? `/${context}/element` : ''}${mult ? 's' : ''}`;
let body = {
using: strategy,
value: selector
};
let method = 'POST';
let els;
try {
await this.implicitWaitForCondition(async () => {
try {
els = await this.proxyCommand(endpoint, method, body);
} catch (err) {
els = [];
}
return !_lodash.default.isEmpty(els);
});
} catch (err) {
if (err.message && err.message.match(/Condition unmet/)) {
els = [];
} else {
throw err;
}
}
if (mult) {
return els;
}
if (_lodash.default.isEmpty(els)) {
throw new _gstAtomBaseDriver.errors.NoSuchElementError();
}
return els;
};
helpers.getFirstVisibleChild = async function getFirstVisibleChild(mult, context) {
_logger.default.info(`Getting first visible child`);
if (mult) {
throw new Error('Cannot get multiple first visible children!');
}
if (!context) {
throw new Error('Cannot get first visible child without a context element');
}
let index = 1;
while (true) {
const strategy = WDA_CLASS_CHAIN_STRATEGY;
const selector = `*[${index}]`;
const nthChild = await this.doNativeFind(strategy, selector, false, context);
const visible = await this.getAttribute('visible', nthChild);
if (visible === 'true') {
_logger.default.info(`Found first visible child at position ${index}`);
return nthChild;
}
index++;
}
};
function rewriteMagicScrollable(mult) {
const pred = ['ScrollView', 'Table', 'CollectionView', 'WebView'].map(t => `type == "XCUIElementType${t}"`).join(' OR ');
const strategy = WDA_CLASS_CHAIN_STRATEGY;
let selector = '**/*[`' + pred + '`]';
if (!mult) {
selector += '[1]';
}
_logger.default.info('Rewrote request for scrollable descendants to class chain ' + `format with selector '${selector}'`);
return [strategy, selector];
}
Object.assign(extensions, commands, helpers);
var _default = extensions;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maW5kLmpzIl0sIm5hbWVzIjpbIk1BR0lDX0ZJUlNUX1ZJU19DSElMRF9TRUwiLCJNQUdJQ19TQ1JPTExBQkxFX1NFTCIsIldEQV9DTEFTU19DSEFJTl9TVFJBVEVHWSIsImhlbHBlcnMiLCJjb21tYW5kcyIsImV4dGVuc2lvbnMiLCJmaW5kRWxPckVscyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtdWx0IiwiY29udGV4dCIsImlzV2VidmlldyIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsImluaXRTZWxlY3RvciIsInJld3JvdGVTZWxlY3RvciIsInN0cmlwVmlld0Zyb21TZWxlY3RvciIsImtlZXBWaWV3IiwiaW5jbHVkZXMiLCJpbmRleE9mIiwibGVuZ3RoIiwic3Vic3RyIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInRlc3QiLCJnZXRGaXJzdFZpc2libGVDaGlsZCIsInJld3JpdGVNYWdpY1Njcm9sbGFibGUiLCJyZXBsYWNlIiwic3RyIiwiZzEiLCJnMiIsImczIiwibG9nIiwiaW5mbyIsImRvTmF0aXZlRmluZCIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwiZW5kcG9pbnQiLCJib2R5IiwidXNpbmciLCJ2YWx1ZSIsIm1ldGhvZCIsImVscyIsImltcGxpY2l0V2FpdEZvckNvbmRpdGlvbiIsInByb3h5Q29tbWFuZCIsImVyciIsIl8iLCJpc0VtcHR5IiwibWVzc2FnZSIsIm1hdGNoIiwiZXJyb3JzIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiRXJyb3IiLCJpbmRleCIsIm50aENoaWxkIiwidmlzaWJsZSIsImdldEF0dHJpYnV0ZSIsInByZWQiLCJtYXAiLCJ0Iiwiam9pbiIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQSxNQUFNQSx5QkFBeUIsR0FBRyx5Q0FBbEM7QUFJQSxNQUFN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QUF0QyxFQUE2Q0UsT0FBN0MsQ0FBdkI7QUFDQSxVQUFNNkMsT0FBTyxHQUFHLE1BQU0sS0FBS0MsWUFBTCxDQUFrQixTQUFsQixFQUE2QkYsUUFBN0IsQ0FBdEI7O0FBQ0EsUUFBSUMsT0FBTyxLQUFLLE1BQWhCLEVBQXdCO0FBQ3RCdkIsc0JBQUlDLElBQUosQ0FBVSx5Q0FBd0NvQixLQUFNLEVBQXhEOztBQUNBLGFBQU9DLFFBQVA7QUFDRDs7QUFDREQsSUFBQUEsS0FBSztBQUNOO0FBQ0YsQ0ExQkQ7O0FBNEJBLFNBQVMzQixzQkFBVCxDQUFpQ2pCLElBQWpDLEVBQXVDO0FBQ3JDLFFBQU1nRCxJQUFJLEdBQUcsQ0FDWCxZQURXLEVBRVgsT0FGVyxFQUdYLGdCQUhXLEVBSVgsU0FKVyxFQUtYQyxHQUxXLENBS05DLENBQUQsSUFBUSwyQkFBMEJBLENBQUUsR0FMN0IsRUFLaUNDLElBTGpDLENBS3NDLE1BTHRDLENBQWI7QUFNQSxRQUFNckQsUUFBUSxHQUFHTCx3QkFBakI7QUFDQSxNQUFJTSxRQUFRLEdBQUcsV0FBV2lELElBQVgsR0FBa0IsSUFBakM7O0FBQ0EsTUFBSSxDQUFDaEQsSUFBTCxFQUFXO0FBQ1RELElBQUFBLFFBQVEsSUFBSSxLQUFaO0FBQ0Q7O0FBQ0R3QixrQkFBSUMsSUFBSixDQUFTLCtEQUNDLHlCQUF3QnpCLFFBQVMsR0FEM0M7O0FBRUEsU0FBTyxDQUFDRCxRQUFELEVBQVdDLFFBQVgsQ0FBUDtBQUNEOztBQUdEcUQsTUFBTSxDQUFDQyxNQUFQLENBQWN6RCxVQUFkLEVBQTBCRCxRQUExQixFQUFvQ0QsT0FBcEM7ZUFFZUUsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdnc3QtYXRvbS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG4vLyB3ZSBvdmVycmlkZSB0aGUgeHBhdGggc2VhcmNoIGZvciB0aGlzIGZpcnN0LXZpc2libGUtY2hpbGQgc2VsZWN0b3IsIHdoaWNoXG4vLyBsb29rcyBsaWtlIC8qW0BmaXJzdFZpc2libGU9XCJ0cnVlXCJdXG5jb25zdCBNQUdJQ19GSVJTVF9WSVNfQ0hJTERfU0VMID0gL1xcL1xcKlxcW0BmaXJzdFZpc2libGVcXHMqPVxccyooJ3xcIil0cnVlXFwxXFxdLztcblxuLy8gd2UgbGlrZXdpc2Ugb3ZlcnJpZGUgeHBhdGggc2VhcmNoIHRvIHByb3ZpZGUgYSBzaG9ydGN1dCBmb3IgZmluZGluZyBhbGxcbi8vIHNjcm9sbGFibGUgZWxlbWVudHNcbmNvbnN0IE1BR0lDX1NDUk9MTEFCTEVfU0VMID0gL1xcL1xcL1xcKlxcW0BzY3JvbGxhYmxlXFxzKj1cXHMqKCd8XCIpdHJ1ZVxcMVxcXS87XG5cbmNvbnN0IFdEQV9DTEFTU19DSEFJTl9TVFJBVEVHWSA9ICdjbGFzcyBjaGFpbic7XG5cbmxldCBoZWxwZXJzID0ge30sIGNvbW1hbmRzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuaGVscGVycy5maW5kRWxPckVscyA9IGFzeW5jIGZ1bmN0aW9uIGZpbmRFbE9yRWxzIChzdHJhdGVneSwgc2VsZWN0b3IsIG11bHQsIGNvbnRleHQpIHtcbiAgaWYgKHRoaXMuaXNXZWJ2aWV3KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kV2ViRWxlbWVudE9yRWxlbWVudHMoc3RyYXRlZ3ksIHNlbGVjdG9yLCBtdWx0LCBjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoc3RyYXRlZ3ksIHNlbGVjdG9yLCBtdWx0LCBjb250ZXh0KTtcbiAgfVxufTtcblxuaGVscGVycy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiBmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMgKHN0cmF0ZWd5LCBzZWxlY3RvciwgbXVsdCwgY29udGV4dCkge1xuICBjb25zdCBpbml0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgbGV0IHJld3JvdGVTZWxlY3RvciA9IGZhbHNlO1xuICBpZiAoc3RyYXRlZ3kgPT09ICctaW9zIHByZWRpY2F0ZSBzdHJpbmcnKSB7XG4gICAgLy8gV2ViRHJpdmVyQWdlbnQgdXNlcyAncHJlZGljYXRlIHN0cmluZydcbiAgICBzdHJhdGVneSA9ICdwcmVkaWNhdGUgc3RyaW5nJztcbiAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gJy1pb3MgY2xhc3MgY2hhaW4nKSB7XG4gICAgLy8gV2ViRHJpdmVyQWdlbnQgdXNlcyAnY2xhc3MgY2hhaW4nXG4gICAgc3RyYXRlZ3kgPSBXREFfQ0xBU1NfQ0hBSU5fU1RSQVRFR1k7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgd29yZCAnVmlldycgaXMgYXBwZW5kZWQgdG8gc2VsZWN0b3IgYW5kIGlmIGl0IGlzLCBzdHJpcCBpdCBvdXRcbiAgZnVuY3Rpb24gc3RyaXBWaWV3RnJvbVNlbGVjdG9yIChzZWxlY3Rvcikge1xuICAgIC8vIERvbid0IHN0cmlwIGl0IG91dCBpZiBpdCdzIG9uZSBvZiB0aGVzZSA0IGVsZW1lbnQgdHlwZXNcbiAgICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9XZWJEcml2ZXJBZ2VudC9ibG9iL21hc3Rlci9XZWJEcml2ZXJBZ2VudExpYi9VdGlsaXRpZXMvRkJFbGVtZW50VHlwZVRyYW5zZm9ybWVyLm0gZm9yIHJlZmVyZW5jZSlcbiAgICBjb25zdCBrZWVwVmlldyA9IFtcbiAgICAgICdYQ1VJRWxlbWVudFR5cGVTY3JvbGxWaWV3JyxcbiAgICAgICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldycsXG4gICAgICAnWENVSUVsZW1lbnRUeXBlVGV4dFZpZXcnLFxuICAgICAgJ1hDVUlFbGVtZW50VHlwZVdlYlZpZXcnLFxuICAgIF0uaW5jbHVkZXMoc2VsZWN0b3IpO1xuXG4gICAgaWYgKCFrZWVwVmlldyAmJiBzZWxlY3Rvci5pbmRleE9mKCdWaWV3JykgPT09IHNlbGVjdG9yLmxlbmd0aCAtIDQpIHtcbiAgICAgIHJldHVybiBzZWxlY3Rvci5zdWJzdHIoMCwgc2VsZWN0b3IubGVuZ3RoIC0gNCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RyYXRlZ3kgPT09ICdjbGFzcyBuYW1lJykge1xuICAgIC8vIFhDVUlUZXN0IGNsYXNzZXMgaGF2ZSBgWENVSUVsZW1lbnRUeXBlYCBwcmVwZW5kZWRcbiAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGVyZSBpcyB0aGUgb2xkIGBVSUFgIHByZWZpeFxuICAgIGlmIChzZWxlY3Rvci5zdGFydHNXaXRoKCdVSUEnKSkge1xuICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHJpbmcoMyk7XG4gICAgfVxuICAgIC8vIG5vdyBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBgWENVSUVsZW1lbnRUeXBlYFxuICAgIGlmICghc2VsZWN0b3Iuc3RhcnRzV2l0aCgnWENVSUVsZW1lbnRUeXBlJykpIHtcbiAgICAgIHNlbGVjdG9yID0gc3RyaXBWaWV3RnJvbVNlbGVjdG9yKGBYQ1VJRWxlbWVudFR5cGUke3NlbGVjdG9yfWApO1xuICAgICAgcmV3cm90ZVNlbGVjdG9yID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RyYXRlZ3kgPT09ICd4cGF0aCcgJiYgTUFHSUNfRklSU1RfVklTX0NISUxEX1NFTC50ZXN0KHNlbGVjdG9yKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEZpcnN0VmlzaWJsZUNoaWxkKG11bHQsIGNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSAneHBhdGgnICYmIE1BR0lDX1NDUk9MTEFCTEVfU0VMLnRlc3Qoc2VsZWN0b3IpKSB7XG4gICAgW3N0cmF0ZWd5LCBzZWxlY3Rvcl0gPSByZXdyaXRlTWFnaWNTY3JvbGxhYmxlKG11bHQpO1xuICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSAneHBhdGgnKSB7XG4gICAgLy8gUmVwbGFjZSBVSUEgaWYgaXQgY29tZXMgYWZ0ZXIgYSBmb3J3YXJkIHNsYXNoIG9yIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvKF58XFwvKShVSUEpKFteWy9dKykvZywgKHN0ciwgZzEsIGcyLCBnMykgPT4ge1xuICAgICAgcmV3cm90ZVNlbGVjdG9yID0gdHJ1ZTtcbiAgICAgIHJldHVybiBnMSArIHN0cmlwVmlld0Zyb21TZWxlY3RvcihgWENVSUVsZW1lbnRUeXBlJHtnM31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXdyb3RlU2VsZWN0b3IpIHtcbiAgICBsb2cuaW5mbyhgUmV3cm90ZSBpbmNvbWluZyBzZWxlY3RvciBmcm9tICcke2luaXRTZWxlY3Rvcn0nIHRvIGAgK1xuICAgICAgICAgICAgIGAnJHtzZWxlY3Rvcn0nIHRvIG1hdGNoIFhDVUkgdHlwZS4gWW91IHNob3VsZCBjb25zaWRlciBgICtcbiAgICAgICAgICAgICBgdXBkYXRpbmcgeW91ciB0ZXN0cyB0byB1c2UgdGhlIG5ldyBzZWxlY3RvcnMgZGlyZWN0bHlgKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmRvTmF0aXZlRmluZChzdHJhdGVneSwgc2VsZWN0b3IsIG11bHQsIGNvbnRleHQpO1xufTtcblxuaGVscGVycy5kb05hdGl2ZUZpbmQgPSBhc3luYyBmdW5jdGlvbiBkb05hdGl2ZUZpbmQgKHN0cmF0ZWd5LCBzZWxlY3RvciwgbXVsdCwgY29udGV4dCkge1xuICBjb250ZXh0ID0gdXRpbC51bndyYXBFbGVtZW50KGNvbnRleHQpO1xuXG4gIGxldCBlbmRwb2ludCA9IGAvZWxlbWVudCR7Y29udGV4dCA/IGAvJHtjb250ZXh0fS9lbGVtZW50YCA6ICcnfSR7bXVsdCA/ICdzJyA6ICcnfWA7XG5cbiAgbGV0IGJvZHkgPSB7XG4gICAgdXNpbmc6IHN0cmF0ZWd5LFxuICAgIHZhbHVlOiBzZWxlY3RvclxuICB9O1xuXG4gIGxldCBtZXRob2QgPSAnUE9TVCc7XG5cbiAgLy8gVGhpcyBpcyBlaXRoZXIgYW4gYXJyYXkgaXMgbXVsdCA9PT0gdHJ1ZVxuICAvLyBvciBhbiBvYmplY3QgaWYgbXVsdCA9PT0gZmFsc2VcbiAgbGV0IGVscztcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmltcGxpY2l0V2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBlbHMgPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChlbmRwb2ludCwgbWV0aG9kLCBib2R5KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlbHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8vIHdlIHN1Y2NlZWQgaWYgd2UgZ2V0IHNvbWUgZWxlbWVudHNcbiAgICAgIHJldHVybiAhXy5pc0VtcHR5KGVscyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZSAmJiBlcnIubWVzc2FnZS5tYXRjaCgvQ29uZGl0aW9uIHVubWV0LykpIHtcbiAgICAgIC8vIGNvbmRpdGlvbiB3YXMgbm90IG1ldCBzZXR0aW5nIHJlcyB0byBlbXB0eSBhcnJheVxuICAgICAgZWxzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbiAgaWYgKG11bHQpIHtcbiAgICByZXR1cm4gZWxzO1xuICB9XG4gIGlmIChfLmlzRW1wdHkoZWxzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIGVscztcbn07XG5cbmhlbHBlcnMuZ2V0Rmlyc3RWaXNpYmxlQ2hpbGQgPSBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdFZpc2libGVDaGlsZCAobXVsdCwgY29udGV4dCkge1xuICBsb2cuaW5mbyhgR2V0dGluZyBmaXJzdCB2aXNpYmxlIGNoaWxkYCk7XG4gIGlmIChtdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IG11bHRpcGxlIGZpcnN0IHZpc2libGUgY2hpbGRyZW4hJyk7XG4gIH1cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGZpcnN0IHZpc2libGUgY2hpbGQgd2l0aG91dCBhIGNvbnRleHQgZWxlbWVudCcpO1xuICB9XG4gIGxldCBpbmRleCA9IDE7XG4gIC8vIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiB2aWEgY2xhc3MtY2hhaW4gZmluZHMsIHVudGlsIHdlIHJ1biBvdXQgb2YgY2hpbGRyZW5cbiAgLy8gb3Igd2UgZmluZCBhIHZpc2libGUgb25lLiBUaGlzIGxvb3AgbG9va3MgaW5maW5pdGUgYnV0IGl0cyBub3QsIGJlY2F1c2UgYXRcbiAgLy8gc29tZSBwb2ludCB0aGUgY2FsbCB0byBkb05hdGl2ZUZpbmQgd2lsbCB0aHJvdyB3aXRoIGFuIEVsZW1lbnQgTm90IEZvdW5kXG4gIC8vIGVycm9yLCB3aGVuIHRoZSBpbmRleCBnZXRzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMuIFRoaXNcbiAgLy8gaXMgd2hhdCB3ZSB3YW50IGJlY2F1c2UgdGhhdCBlcnJvciB3aWxsIGhhbHQgdGhlIGxvb3AgYW5kIG1ha2UgaXQgYWxsIHRoZVxuICAvLyB3YXkgdG8gdGhlIGNsaWVudC5cbiAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICBjb25zdCBzdHJhdGVneSA9IFdEQV9DTEFTU19DSEFJTl9TVFJBVEVHWTtcbiAgICBjb25zdCBzZWxlY3RvciA9IGAqWyR7aW5kZXh9XWA7XG4gICAgY29uc3QgbnRoQ2hpbGQgPSBhd2FpdCB0aGlzLmRvTmF0aXZlRmluZChzdHJhdGVneSwgc2VsZWN0b3IsIGZhbHNlLCBjb250ZXh0KTtcbiAgICBjb25zdCB2aXNpYmxlID0gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3Zpc2libGUnLCBudGhDaGlsZCk7XG4gICAgaWYgKHZpc2libGUgPT09ICd0cnVlJykge1xuICAgICAgbG9nLmluZm8oYEZvdW5kIGZpcnN0IHZpc2libGUgY2hpbGQgYXQgcG9zaXRpb24gJHtpbmRleH1gKTtcbiAgICAgIHJldHVybiBudGhDaGlsZDtcbiAgICB9XG4gICAgaW5kZXgrKztcbiAgfVxufTtcblxuZnVuY3Rpb24gcmV3cml0ZU1hZ2ljU2Nyb2xsYWJsZSAobXVsdCkge1xuICBjb25zdCBwcmVkID0gW1xuICAgICdTY3JvbGxWaWV3JyxcbiAgICAnVGFibGUnLFxuICAgICdDb2xsZWN0aW9uVmlldycsXG4gICAgJ1dlYlZpZXcnXG4gIF0ubWFwKCh0KSA9PiBgdHlwZSA9PSBcIlhDVUlFbGVtZW50VHlwZSR7dH1cImApLmpvaW4oJyBPUiAnKTtcbiAgY29uc3Qgc3RyYXRlZ3kgPSBXREFfQ0xBU1NfQ0hBSU5fU1RSQVRFR1k7XG4gIGxldCBzZWxlY3RvciA9ICcqKi8qW2AnICsgcHJlZCArICdgXSc7XG4gIGlmICghbXVsdCkge1xuICAgIHNlbGVjdG9yICs9ICdbMV0nO1xuICB9XG4gIGxvZy5pbmZvKCdSZXdyb3RlIHJlcXVlc3QgZm9yIHNjcm9sbGFibGUgZGVzY2VuZGFudHMgdG8gY2xhc3MgY2hhaW4gJyArXG4gICAgICAgICAgIGBmb3JtYXQgd2l0aCBzZWxlY3RvciAnJHtzZWxlY3Rvcn0nYCk7XG4gIHJldHVybiBbc3RyYXRlZ3ksIHNlbGVjdG9yXTtcbn1cblxuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9maW5kLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=