testcafe
Version:
Automated browser testing for the modern web development stack.
122 lines • 19 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandFormatter = void 0;
const lodash_1 = require("lodash");
const execute_client_function_1 = require("../../test-run/commands/execute-client-function");
const actions_1 = require("../../test-run/commands/actions");
const replicator_1 = require("../../client-functions/replicator");
const diff_1 = __importDefault(require("../../utils/diff"));
const options_1 = require("../../test-run/commands/options");
const CONFIDENTIAL_INFO_PLACEHOLDER = '********';
function isCommandOptions(obj) {
return obj instanceof options_1.ActionOptions || obj instanceof options_1.ResizeToFitDeviceOptions || obj instanceof options_1.AssertionOptions;
}
class CommandFormatter {
constructor(command, result) {
this._elements = [];
this._command = command;
this._result = result;
}
format() {
const formattedCommand = { type: this._command.type, actionId: this._command.actionId };
if (this._command instanceof execute_client_function_1.ExecuteSelectorCommand)
formattedCommand.selector = this._prepareSelector(this._command, 'selector');
else if (this._command instanceof execute_client_function_1.ExecuteClientFunctionCommand)
formattedCommand.clientFn = this._prepareClientFunction(this._command);
else if (this._command instanceof actions_1.UseRoleCommand)
formattedCommand.role = this._prepareRole(this._command);
else if (this._command instanceof actions_1.NavigateToCommand)
formattedCommand.url = this._prepareUrl(this._command);
else if (this._command instanceof actions_1.SetNativeDialogHandlerCommand)
formattedCommand.dialogHandler = this._prepareDialogHandler(this._command);
else
this._assignProperties(this._command, formattedCommand);
if (this._command instanceof actions_1.RunCustomActionCommand)
formattedCommand.actionResult = this._result;
this._maskConfidentialInfo(formattedCommand);
return formattedCommand;
}
_maskConfidentialInfo(command) {
var _a;
if (!((_a = command.options) === null || _a === void 0 ? void 0 : _a.confidential))
return;
if (this._command instanceof actions_1.TypeTextCommand)
command.text = CONFIDENTIAL_INFO_PLACEHOLDER;
else if (this._command instanceof actions_1.PressKeyCommand)
command.keys = CONFIDENTIAL_INFO_PLACEHOLDER;
}
_getElementByPropertyName(propertyName) {
this._ensureSelectorElements();
switch (propertyName) {
case 'selector':
case 'startSelector':
return this._elements[0];
case 'endSelector':
case 'destinationSelector':
return this._elements[1];
}
return this._elements[0];
}
_prepareSelector(command, propertyName) {
const selectorChain = command.apiFnChain;
const expression = selectorChain.join('');
const result = { expression };
let element = null;
if (this._result)
element = this._getElementByPropertyName(propertyName);
if (element)
result.element = element;
if (command.timeout)
result.timeout = command.timeout;
return result;
}
_prepareClientFunction(command) {
return {
code: command.fnCode,
args: command.args[0],
};
}
_prepareDialogHandler(command) {
return this._prepareClientFunction(command.dialogHandler);
}
_prepareRole(command) {
const { loginUrl, opts, phase } = command.role;
return { loginUrl, options: opts, phase };
}
_prepareUrl(command) {
return command.url;
}
_assignProperties(command, formattedCommand) {
if (!this._command.getReportedProperties)
return;
const sourceProperties = this._command.getReportedProperties();
sourceProperties.forEach((key) => {
const property = this._command[key];
if (property instanceof execute_client_function_1.ExecuteSelectorCommand)
formattedCommand[key] = this._prepareSelector(property, key);
else if (isCommandOptions(property)) {
const modifiedOptions = CommandFormatter._getModifiedOptions(property);
if (!(0, lodash_1.isEmpty)(modifiedOptions))
formattedCommand[key] = modifiedOptions;
}
else
formattedCommand[key] = property;
});
}
_ensureSelectorElements() {
if (!this._result || this._elements.length)
return;
const decoded = (0, replicator_1.createReplicator)(new replicator_1.SelectorNodeTransform()).decode(this._result);
this._elements = Array.isArray(decoded) ? decoded : [decoded];
}
static _getModifiedOptions(commandOptions) {
const constructor = commandOptions.constructor;
const defaultOptions = new constructor();
return (0, diff_1.default)(defaultOptions, commandOptions);
}
}
exports.CommandFormatter = CommandFormatter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVwb3J0ZXIvY29tbWFuZC9jb21tYW5kLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBaUM7QUFDakMsNkZBQXVIO0FBQ3ZILDZEQU95QztBQUV6QyxrRUFBNEY7QUFJNUYsNERBQW9DO0FBRXBDLDZEQUl5QztBQUl6QyxNQUFNLDZCQUE2QixHQUFHLFVBQVUsQ0FBQztBQUVqRCxTQUFTLGdCQUFnQixDQUFFLEdBQVc7SUFDbEMsT0FBTyxHQUFHLFlBQVksdUJBQWEsSUFBSSxHQUFHLFlBQVksa0NBQXdCLElBQUksR0FBRyxZQUFZLDBCQUFnQixDQUFDO0FBQ3RILENBQUM7QUFFRCxNQUFhLGdCQUFnQjtJQUt6QixZQUFvQixPQUFvQixFQUFFLE1BQWU7UUFKakQsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFLbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVNLE1BQU07UUFDVCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUxRyxJQUFJLElBQUksQ0FBQyxRQUFRLFlBQVksZ0RBQXNCO1lBQy9DLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1RSxJQUFJLElBQUksQ0FBQyxRQUFRLFlBQVksc0RBQTRCO1lBQzFELGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RFLElB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Q0FBQyxNQUFNO1lBQ3RDLE9BQU87UUFFWCxNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFnQixFQUFDLElBQUksa0NBQXFCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBRSxjQUFzQjtRQUN0RCxNQUFNLFdBQVcsR0FBTSxjQUFjLENBQUMsV0FBZ0MsQ0FBQztRQUN2RSxNQUFNLGNBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRXpDLE9BQU8sSUFBQSxjQUFJLEVBQUMsY0FBb0MsRUFBRSxjQUFvQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNKO0FBeklELDRDQXlJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCwgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZCB9IGZyb20gJy4uLy4uL3Rlc3QtcnVuL2NvbW1hbmRzL2V4ZWN1dGUtY2xpZW50LWZ1bmN0aW9uJztcbmltcG9ydCB7XG4gICAgTmF2aWdhdGVUb0NvbW1hbmQsXG4gICAgUHJlc3NLZXlDb21tYW5kLFxuICAgIFJ1bkN1c3RvbUFjdGlvbkNvbW1hbmQsXG4gICAgU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQsXG4gICAgVHlwZVRleHRDb21tYW5kLFxuICAgIFVzZVJvbGVDb21tYW5kLFxufSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9jb21tYW5kcy9hY3Rpb25zJztcblxuaW1wb3J0IHsgY3JlYXRlUmVwbGljYXRvciwgU2VsZWN0b3JOb2RlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY2xpZW50LWZ1bmN0aW9ucy9yZXBsaWNhdG9yJztcbmltcG9ydCB7IEZvcm1hdHRlZENvbW1hbmQsIFNlbGVjdG9ySW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IGRpZmYgZnJvbSAnLi4vLi4vdXRpbHMvZGlmZic7XG5cbmltcG9ydCB7XG4gICAgQWN0aW9uT3B0aW9ucyxcbiAgICBSZXNpemVUb0ZpdERldmljZU9wdGlvbnMsXG4gICAgQXNzZXJ0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvb3B0aW9ucyc7XG5cbmltcG9ydCB7IENvbW1hbmRCYXNlIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvYmFzZSc7XG5cbmNvbnN0IENPTkZJREVOVElBTF9JTkZPX1BMQUNFSE9MREVSID0gJyoqKioqKioqJztcblxuZnVuY3Rpb24gaXNDb21tYW5kT3B0aW9ucyAob2JqOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQWN0aW9uT3B0aW9ucyB8fCBvYmogaW5zdGFuY2VvZiBSZXNpemVUb0ZpdERldmljZU9wdGlvbnMgfHwgb2JqIGluc3RhbmNlb2YgQXNzZXJ0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRGb3JtYXR0ZXIge1xuICAgIHByaXZhdGUgX2VsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVzdWx0OiB1bmtub3duO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjb21tYW5kOiBDb21tYW5kQmFzZSwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMuX2NvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLl9yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdCAoKTogRm9ybWF0dGVkQ29tbWFuZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZENvbW1hbmQ6IEZvcm1hdHRlZENvbW1hbmQgPSB7IHR5cGU6IHRoaXMuX2NvbW1hbmQudHlwZSwgYWN0aW9uSWQ6IHRoaXMuX2NvbW1hbmQuYWN0aW9uSWQgfTtcblxuICAgICAgICBpZiAodGhpcy5fY29tbWFuZCBpbnN0YW5jZW9mIEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQpXG4gICAgICAgICAgICBmb3JtYXR0ZWRDb21tYW5kLnNlbGVjdG9yID0gdGhpcy5fcHJlcGFyZVNlbGVjdG9yKHRoaXMuX2NvbW1hbmQsICdzZWxlY3RvcicpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9jb21tYW5kIGluc3RhbmNlb2YgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZClcbiAgICAgICAgICAgIGZvcm1hdHRlZENvbW1hbmQuY2xpZW50Rm4gPSB0aGlzLl9wcmVwYXJlQ2xpZW50RnVuY3Rpb24odGhpcy5fY29tbWFuZCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbW1hbmQgaW5zdGFuY2VvZiBVc2VSb2xlQ29tbWFuZClcbiAgICAgICAgICAgIGZvcm1hdHRlZENvbW1hbmQucm9sZSA9IHRoaXMuX3ByZXBhcmVSb2xlKHRoaXMuX2NvbW1hbmQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9jb21tYW5kIGluc3RhbmNlb2YgTmF2aWdhdGVUb0NvbW1hbmQpXG4gICAgICAgICAgICBmb3JtYXR0ZWRDb21tYW5kLnVybCA9IHRoaXMuX3ByZXBhcmVVcmwodGhpcy5fY29tbWFuZCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbW1hbmQgaW5zdGFuY2VvZiBTZXROYXRpdmVEaWFsb2dIYW5kbGVyQ29tbWFuZClcbiAgICAgICAgICAgIGZvcm1hdHRlZENvbW1hbmQuZGlhbG9nSGFuZGxlciA9IHRoaXMuX3ByZXBhcmVEaWFsb2dIYW5kbGVyKHRoaXMuX2NvbW1hbmQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLl9hc3NpZ25Qcm9wZXJ0aWVzKHRoaXMuX2NvbW1hbmQsIGZvcm1hdHRlZENvbW1hbmQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb21tYW5kIGluc3RhbmNlb2YgUnVuQ3VzdG9tQWN0aW9uQ29tbWFuZClcbiAgICAgICAgICAgIGZvcm1hdHRlZENvbW1hbmQuYWN0aW9uUmVzdWx0ID0gdGhpcy5fcmVzdWx0O1xuXG4gICAgICAgIHRoaXMuX21hc2tDb25maWRlbnRpYWxJbmZvKGZvcm1hdHRlZENvbW1hbmQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWRDb21tYW5kO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21hc2tDb25maWRlbnRpYWxJbmZvIChjb21tYW5kOiBGb3JtYXR0ZWRDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICghKGNvbW1hbmQub3B0aW9ucyBhcyBhbnkpPy5jb25maWRlbnRpYWwpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbW1hbmQgaW5zdGFuY2VvZiBUeXBlVGV4dENvbW1hbmQpXG4gICAgICAgICAgICBjb21tYW5kLnRleHQgPSBDT05GSURFTlRJQUxfSU5GT19QTEFDRUhPTERFUjtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY29tbWFuZCBpbnN0YW5jZW9mIFByZXNzS2V5Q29tbWFuZClcbiAgICAgICAgICAgIGNvbW1hbmQua2V5cyA9IENPTkZJREVOVElBTF9JTkZPX1BMQUNFSE9MREVSO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEVsZW1lbnRCeVByb3BlcnR5TmFtZSAocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVNlbGVjdG9yRWxlbWVudHMoKTtcblxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnc2VsZWN0b3InOlxuICAgICAgICAgICAgY2FzZSAnc3RhcnRTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzWzBdO1xuICAgICAgICAgICAgY2FzZSAnZW5kU2VsZWN0b3InOlxuICAgICAgICAgICAgY2FzZSAnZGVzdGluYXRpb25TZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVTZWxlY3RvciAoY29tbWFuZDogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTZWxlY3RvckluZm8ge1xuICAgICAgICBjb25zdCBzZWxlY3RvckNoYWluID0gY29tbWFuZC5hcGlGbkNoYWluIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBleHByZXNzaW9uICAgID0gc2VsZWN0b3JDaGFpbi5qb2luKCcnKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IFNlbGVjdG9ySW5mbyA9IHsgZXhwcmVzc2lvbiB9O1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fcmVzdWx0KVxuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnRCeVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50KVxuICAgICAgICAgICAgcmVzdWx0LmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICAgIGlmIChjb21tYW5kLnRpbWVvdXQpXG4gICAgICAgICAgICByZXN1bHQudGltZW91dCA9IGNvbW1hbmQudGltZW91dCBhcyBudW1iZXI7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlQ2xpZW50RnVuY3Rpb24gKGNvbW1hbmQ6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQpOiBvYmplY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogY29tbWFuZC5mbkNvZGUsXG4gICAgICAgICAgICBhcmdzOiBjb21tYW5kLmFyZ3NbMF0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZURpYWxvZ0hhbmRsZXIgKGNvbW1hbmQ6IFNldE5hdGl2ZURpYWxvZ0hhbmRsZXJDb21tYW5kKTogb2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVDbGllbnRGdW5jdGlvbihjb21tYW5kLmRpYWxvZ0hhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVSb2xlIChjb21tYW5kOiBVc2VSb2xlQ29tbWFuZCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHsgbG9naW5VcmwsIG9wdHMsIHBoYXNlIH0gPSBjb21tYW5kLnJvbGU7XG5cbiAgICAgICAgcmV0dXJuIHsgbG9naW5VcmwsIG9wdGlvbnM6IG9wdHMsIHBoYXNlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVVybCAoY29tbWFuZDogTmF2aWdhdGVUb0NvbW1hbmQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gY29tbWFuZC51cmw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXNzaWduUHJvcGVydGllcyAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGZvcm1hdHRlZENvbW1hbmQ6IEZvcm1hdHRlZENvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21tYW5kLmdldFJlcG9ydGVkUHJvcGVydGllcylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2VQcm9wZXJ0aWVzID0gdGhpcy5fY29tbWFuZC5nZXRSZXBvcnRlZFByb3BlcnRpZXMoKTtcblxuICAgICAgICBzb3VyY2VQcm9wZXJ0aWVzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuX2NvbW1hbmRba2V5XTtcblxuICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZClcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRDb21tYW5kW2tleV0gPSB0aGlzLl9wcmVwYXJlU2VsZWN0b3IocHJvcGVydHksIGtleSk7XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NvbW1hbmRPcHRpb25zKHByb3BlcnR5IGFzIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZE9wdGlvbnMgPSBDb21tYW5kRm9ybWF0dGVyLl9nZXRNb2RpZmllZE9wdGlvbnMocHJvcGVydHkgYXMgb2JqZWN0KTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShtb2RpZmllZE9wdGlvbnMpKVxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRDb21tYW5kW2tleV0gPSBtb2RpZmllZE9wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkQ29tbWFuZFtrZXldID0gcHJvcGVydHk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Vuc3VyZVNlbGVjdG9yRWxlbWVudHMgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc3VsdCB8fCB0aGlzLl9lbGVtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGNyZWF0ZVJlcGxpY2F0b3IobmV3IFNlbGVjdG9yTm9kZVRyYW5zZm9ybSgpKS5kZWNvZGUodGhpcy5fcmVzdWx0KTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50cyA9IEFycmF5LmlzQXJyYXkoZGVjb2RlZCkgPyBkZWNvZGVkIDogW2RlY29kZWRdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9nZXRNb2RpZmllZE9wdGlvbnMgKGNvbW1hbmRPcHRpb25zOiBvYmplY3QpOiBEaWN0aW9uYXJ5PG9iamVjdD4ge1xuICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciAgICA9IGNvbW1hbmRPcHRpb25zLmNvbnN0cnVjdG9yIGFzIE9iamVjdENvbnN0cnVjdG9yO1xuICAgICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IG5ldyBjb25zdHJ1Y3RvcigpO1xuXG4gICAgICAgIHJldHVybiBkaWZmKGRlZmF1bHRPcHRpb25zIGFzIERpY3Rpb25hcnk8b2JqZWN0PiwgY29tbWFuZE9wdGlvbnMgYXMgRGljdGlvbmFyeTxvYmplY3Q+KTtcbiAgICB9XG59XG4iXX0=