UNPKG

babel-plugin-debug-macros

Version:
213 lines 23.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); class Builder { constructor(t, util, options) { this.t = t; this.expressions = []; this.module = options.module; this.global = options.global; this.assertPredicateIndex = options.assertPredicateIndex; this.isDebug = options.isDebug; this.util = util; } /** * Expands: * * assert($PREDICATE, $MESSAGE) * * into * * ($DEBUG && console.assert($PREDICATE, $MESSAGE)); * * or * * ($DEBUG && assert($PREDICATE, $MESSAGE)); * * or * * ($DEBUG && $GLOBAL_NS.assert($PREDICATE, $MESSAGE)); */ assert(path) { let predicate; const index = this.assertPredicateIndex; if (index !== undefined) { predicate = (expression, args) => { return args[index]; }; } this._createMacroExpression(path, { predicate, }); } /** * Expands: * * warn($MESSAGE) * * into * * ($DEBUG && console.warn($MESSAGE)); * * or * * ($DEBUG && warn($MESSAGE)); * * or * * ($DEBUG && $GLOBAL_NS.warn($MESSAGE)); */ warn(path) { this._createMacroExpression(path); } /** * Expands: * * log($MESSAGE) * * into * * ($DEBUG && console.log($MESSAGE)); * * or * * ($DEBUG && log($MESSAGE)); * * or * * ($DEBUG && $GLOBAL_NS.log($MESSAGE)); */ log(path) { this._createMacroExpression(path); } _createMacroExpression(path, options = {}) { let t = this.t; let expression = path.node.expression; let callee = expression.callee; let args = expression.arguments; if (options.validate) { options.validate(expression, args); } let callExpression; if (this.module) { callExpression = expression; } else if (this.global) { callExpression = this._createGlobalExternalHelper(callee, args, this.global); } else if (options.buildConsoleAPI) { callExpression = options.buildConsoleAPI(expression, args); } else { callExpression = this._createConsoleAPI(options.consoleAPI || callee, args); } let prefixedIdentifiers = []; if (options.predicate) { let predicate = options.predicate(expression, args) || t.identifier('false'); if (!this.t.isExpression(predicate)) { throw new Error(`bug: this doesn't support ${predicate.type}`); } let negatedPredicate = t.unaryExpression('!', t.parenthesizedExpression(predicate)); prefixedIdentifiers.push(negatedPredicate); } this.expressions.push([ path, this._buildLogicalExpressions(prefixedIdentifiers, callExpression), ]); } /** * Expands: * * deprecate($MESSAGE, $PREDICATE) * * or * * deprecate($MESSAGE, $PREDICATE, { * $ID, * $URL, * $UNIL * }); * * into * * ($DEBUG && $PREDICATE && console.warn($MESSAGE)); * * or * * ($DEBUG && $PREDICATE && deprecate($MESSAGE, $PREDICATE, { $ID, $URL, $UNTIL })); * * or * * ($DEBUG && $PREDICATE && $GLOBAL_NS.deprecate($MESSAGE, $PREDICATE, { $ID, $URL, $UNTIL })); */ deprecate(path) { this._createMacroExpression(path, { predicate: (expression, args) => args[1], buildConsoleAPI: (expression, args) => { let message = args[0]; return this._createConsoleAPI(this.t.identifier('warn'), [message]); }, validate: (expression, args) => { let meta = args[2]; if (meta && this.t.isObjectExpression(meta) && meta.properties && !meta.properties.some((prop) => this.t.isObjectProperty(prop) && ((this.t.isIdentifier(prop.key) && prop.key.name === 'id') || (this.t.isStringLiteral(prop.key) && prop.key.value === 'id')))) { throw new ReferenceError(`deprecate's meta information requires an "id" field.`); } }, }); } /** * Performs the actually expansion of macros */ expandMacros() { let t = this.t; for (let i = 0; i < this.expressions.length; i++) { let expression = this.expressions[i]; let exp = expression[0]; let flag = this._debugExpression(exp); let logicalExp = expression[1]; exp.replaceWith(t.parenthesizedExpression(logicalExp(flag))); exp.scope.crawl(); } } _debugExpression(target) { if (typeof this.isDebug === 'boolean') { return this.t.booleanLiteral(this.isDebug); } else { return this.t.callExpression(this.util.import(target, '@embroider/macros', 'isDevelopingApp'), []); } } _createGlobalExternalHelper(identifier, args, ns) { let t = this.t; return t.callExpression(t.memberExpression(t.identifier(ns), identifier), args); } _createConsoleAPI(identifier, args) { let t = this.t; return t.callExpression(t.memberExpression(t.identifier('console'), identifier), args); } _buildLogicalExpressions(identifiers, callExpression) { let t = this.t; return (debugIdentifier) => { identifiers.unshift(debugIdentifier); identifiers.push(callExpression); let logicalExpressions; for (let i = 0; i < identifiers.length; i++) { let left = identifiers[i]; let right = identifiers[i + 1]; if (!logicalExpressions) { logicalExpressions = t.logicalExpression('&&', left, right); } else if (right) { logicalExpressions = t.logicalExpression('&&', logicalExpressions, right); } } return logicalExpressions; }; } } exports.default = Builder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUJBLE1BQXFCLE9BQU87SUFTMUIsWUFDVyxDQUFxQixFQUM5QixJQUFnQixFQUNoQixPQUFnQjtRQUZQLE1BQUMsR0FBRCxDQUFDLENBQW9CO1FBSHhCLGdCQUFXLEdBQTJFLEVBQUUsQ0FBQztRQU8vRixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILE1BQU0sQ0FBQyxJQUF1QjtRQUM1QixJQUFJLFNBQTJDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3hDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLFNBQVMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsU0FBUztTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILElBQUksQ0FBQyxJQUF1QjtRQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVE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RSxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsd0JBQXdCLENBQ3RCLFdBQTJCLEVBQzNCLGNBQTRCO1FBRTVCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFZixPQUFPLENBQUMsZUFBNkIsRUFBRSxFQUFFO1lBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDckMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqQyxJQUFJLGtCQUFrQixDQUFDO1lBRXZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVDLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3hCLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO3FCQUFNLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ2pCLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzVFLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxrQkFBbUIsQ0FBQztRQUM3QixDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEzUEQsMEJBMlBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBCYWJlbCBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE5vZGVQYXRoLCB0eXBlcyBhcyB0IH0gZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IHsgQ2FsbElkZW50aWZpZXJFeHByZXNzaW9uLCBDYWxsU3RhdGVtZW50UGF0aCB9IGZyb20gJy4vYmFiZWwtdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IEltcG9ydFV0aWwgfSBmcm9tICdiYWJlbC1pbXBvcnQtdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIG1vZHVsZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgZ2xvYmFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFzc2VydFByZWRpY2F0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlzRGVidWc6IGJvb2xlYW4gfCBcIkBlbWJyb2lkZXIvbWFjcm9zXCI7XG59XG5cbmludGVyZmFjZSBNYWNyb0V4cHJlc3Npb25PcHRzIHtcbiAgdmFsaWRhdGU/OiAoZXhwcmVzc2lvbjogQ2FsbElkZW50aWZpZXJFeHByZXNzaW9uLCBhcmdzOiB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXSkgPT4gdm9pZDtcbiAgYnVpbGRDb25zb2xlQVBJPzogKFxuICAgIGV4cHJlc3Npb246IENhbGxJZGVudGlmaWVyRXhwcmVzc2lvbixcbiAgICBhcmdzOiB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXVxuICApID0+IHQuQ2FsbEV4cHJlc3Npb247XG4gIGNvbnNvbGVBUEk/OiB0LklkZW50aWZpZXI7XG4gIHByZWRpY2F0ZT86IChcbiAgICBleHByZXNzaW9uOiBDYWxsSWRlbnRpZmllckV4cHJlc3Npb24sXG4gICAgYXJnczogdC5DYWxsRXhwcmVzc2lvblsnYXJndW1lbnRzJ11cbiAgKSA9PiB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXVtudW1iZXJdIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWlsZGVyIHtcbiAgcHJpdmF0ZSBtb2R1bGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZ2xvYmFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgYXNzZXJ0UHJlZGljYXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc0RlYnVnOiBib29sZWFuIHwgJ0BlbWJyb2lkZXIvbWFjcm9zJztcbiAgcHJpdmF0ZSB1dGlsOiBJbXBvcnRVdGlsO1xuXG4gIHByaXZhdGUgZXhwcmVzc2lvbnM6IFtDYWxsU3RhdGVtZW50UGF0aCwgKGRlYnVnSWRlbnRpZmllcjogdC5FeHByZXNzaW9uKSA9PiB0LkV4cHJlc3Npb25dW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0OiB0eXBlb2YgQmFiZWwudHlwZXMsXG4gICAgdXRpbDogSW1wb3J0VXRpbCxcbiAgICBvcHRpb25zOiBPcHRpb25zXG4gICkge1xuICAgIHRoaXMubW9kdWxlID0gb3B0aW9ucy5tb2R1bGU7XG4gICAgdGhpcy5nbG9iYWwgPSBvcHRpb25zLmdsb2JhbDtcbiAgICB0aGlzLmFzc2VydFByZWRpY2F0ZUluZGV4ID0gb3B0aW9ucy5hc3NlcnRQcmVkaWNhdGVJbmRleDtcbiAgICB0aGlzLmlzRGVidWcgPSBvcHRpb25zLmlzRGVidWc7XG4gICAgdGhpcy51dGlsID0gdXRpbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzOlxuICAgKlxuICAgKiBhc3NlcnQoJFBSRURJQ0FURSwgJE1FU1NBR0UpXG4gICAqXG4gICAqIGludG9cbiAgICpcbiAgICogKCRERUJVRyAmJiBjb25zb2xlLmFzc2VydCgkUFJFRElDQVRFLCAkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmIGFzc2VydCgkUFJFRElDQVRFLCAkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmICRHTE9CQUxfTlMuYXNzZXJ0KCRQUkVESUNBVEUsICRNRVNTQUdFKSk7XG4gICAqL1xuICBhc3NlcnQocGF0aDogQ2FsbFN0YXRlbWVudFBhdGgpIHtcbiAgICBsZXQgcHJlZGljYXRlOiBNYWNyb0V4cHJlc3Npb25PcHRzWydwcmVkaWNhdGUnXTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYXNzZXJ0UHJlZGljYXRlSW5kZXg7XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZWRpY2F0ZSA9IChleHByZXNzaW9uLCBhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiBhcmdzW2luZGV4XTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY3JlYXRlTWFjcm9FeHByZXNzaW9uKHBhdGgsIHtcbiAgICAgIHByZWRpY2F0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzOlxuICAgKlxuICAgKiB3YXJuKCRNRVNTQUdFKVxuICAgKlxuICAgKiBpbnRvXG4gICAqXG4gICAqICgkREVCVUcgJiYgY29uc29sZS53YXJuKCRNRVNTQUdFKSk7XG4gICAqXG4gICAqIG9yXG4gICAqXG4gICAqICgkREVCVUcgJiYgd2FybigkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmICRHTE9CQUxfTlMud2FybigkTUVTU0FHRSkpO1xuICAgKi9cbiAgd2FybihwYXRoOiBDYWxsU3RhdGVtZW50UGF0aCkge1xuICAgIHRoaXMuX2NyZWF0ZU1hY3JvRXhwcmVzc2lvbihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzOlxuICAgKlxuICAgKiBsb2coJE1FU1NBR0UpXG4gICAqXG4gICAqIGludG9cbiAgICpcbiAgICogKCRERUJVRyAmJiBjb25zb2xlLmxvZygkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmIGxvZygkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmICRHTE9CQUxfTlMubG9nKCRNRVNTQUdFKSk7XG4gICAqL1xuICBsb2cocGF0aDogQ2FsbFN0YXRlbWVudFBhdGgpIHtcbiAgICB0aGlzLl9jcmVhdGVNYWNyb0V4cHJlc3Npb24ocGF0aCk7XG4gIH1cblxuICBfY3JlYXRlTWFjcm9FeHByZXNzaW9uKHBhdGg6IENhbGxTdGF0ZW1lbnRQYXRoLCBvcHRpb25zOiBNYWNyb0V4cHJlc3Npb25PcHRzID0ge30pIHtcbiAgICBsZXQgdCA9IHRoaXMudDtcbiAgICBsZXQgZXhwcmVzc2lvbiA9IHBhdGgubm9kZS5leHByZXNzaW9uO1xuICAgIGxldCBjYWxsZWUgPSBleHByZXNzaW9uLmNhbGxlZTtcbiAgICBsZXQgYXJncyA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xuXG4gICAgaWYgKG9wdGlvbnMudmFsaWRhdGUpIHtcbiAgICAgIG9wdGlvbnMudmFsaWRhdGUoZXhwcmVzc2lvbiwgYXJncyk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxFeHByZXNzaW9uO1xuICAgIGlmICh0aGlzLm1vZHVsZSkge1xuICAgICAgY2FsbEV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH0gZWxzZSBpZiAodGhpcy5nbG9iYWwpIHtcbiAgICAgIGNhbGxFeHByZXNzaW9uID0gdGhpcy5fY3JlYXRlR2xvYmFsRXh0ZXJuYWxIZWxwZXIoY2FsbGVlLCBhcmdzLCB0aGlzLmdsb2JhbCk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmJ1aWxkQ29uc29sZUFQSSkge1xuICAgICAgY2FsbEV4cHJlc3Npb24gPSBvcHRpb25zLmJ1aWxkQ29uc29sZUFQSShleHByZXNzaW9uLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEV4cHJlc3Npb24gPSB0aGlzLl9jcmVhdGVDb25zb2xlQVBJKG9wdGlvbnMuY29uc29sZUFQSSB8fCBjYWxsZWUsIGFyZ3MpO1xuICAgIH1cblxuICAgIGxldCBwcmVmaXhlZElkZW50aWZpZXJzOiB0LkV4cHJlc3Npb25bXSA9IFtdO1xuXG4gICAgaWYgKG9wdGlvbnMucHJlZGljYXRlKSB7XG4gICAgICBsZXQgcHJlZGljYXRlID0gb3B0aW9ucy5wcmVkaWNhdGUoZXhwcmVzc2lvbiwgYXJncykgfHwgdC5pZGVudGlmaWVyKCdmYWxzZScpO1xuICAgICAgaWYgKCF0aGlzLnQuaXNFeHByZXNzaW9uKHByZWRpY2F0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBidWc6IHRoaXMgZG9lc24ndCBzdXBwb3J0ICR7cHJlZGljYXRlLnR5cGV9YCk7XG4gICAgICB9XG4gICAgICBsZXQgbmVnYXRlZFByZWRpY2F0ZSA9IHQudW5hcnlFeHByZXNzaW9uKCchJywgdC5wYXJlbnRoZXNpemVkRXhwcmVzc2lvbihwcmVkaWNhdGUpKTtcbiAgICAgIHByZWZpeGVkSWRlbnRpZmllcnMucHVzaChuZWdhdGVkUHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25zLnB1c2goW1xuICAgICAgcGF0aCxcbiAgICAgIHRoaXMuX2J1aWxkTG9naWNhbEV4cHJlc3Npb25zKHByZWZpeGVkSWRlbnRpZmllcnMsIGNhbGxFeHByZXNzaW9uKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzOlxuICAgKlxuICAgKiBkZXByZWNhdGUoJE1FU1NBR0UsICRQUkVESUNBVEUpXG4gICAqXG4gICAqIG9yXG4gICAqXG4gICAqIGRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwge1xuICAgKiAgJElELFxuICAgKiAgJFVSTCxcbiAgICogICRVTklMXG4gICAqIH0pO1xuICAgKlxuICAgKiBpbnRvXG4gICAqXG4gICAqICgkREVCVUcgJiYgJFBSRURJQ0FURSAmJiBjb25zb2xlLndhcm4oJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiAkUFJFRElDQVRFICYmIGRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwgeyAkSUQsICRVUkwsICRVTlRJTCB9KSk7XG4gICAqXG4gICAqIG9yXG4gICAqXG4gICAqICgkREVCVUcgJiYgJFBSRURJQ0FURSAmJiAkR0xPQkFMX05TLmRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwgeyAkSUQsICRVUkwsICRVTlRJTCB9KSk7XG4gICAqL1xuICBkZXByZWNhdGUocGF0aDogQ2FsbFN0YXRlbWVudFBhdGgpIHtcbiAgICB0aGlzLl9jcmVhdGVNYWNyb0V4cHJlc3Npb24ocGF0aCwge1xuICAgICAgcHJlZGljYXRlOiAoZXhwcmVzc2lvbiwgYXJncykgPT4gYXJnc1sxXSxcblxuICAgICAgYnVpbGRDb25zb2xlQVBJOiAoZXhwcmVzc2lvbiwgYXJncykgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGFyZ3NbMF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbnNvbGVBUEkodGhpcy50LmlkZW50aWZpZXIoJ3dhcm4nKSwgW21lc3NhZ2VdKTtcbiAgICAgIH0sXG5cbiAgICAgIHZhbGlkYXRlOiAoZXhwcmVzc2lvbiwgYXJncykgPT4ge1xuICAgICAgICBsZXQgbWV0YSA9IGFyZ3NbMl07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldGEgJiZcbiAgICAgICAgICB0aGlzLnQuaXNPYmplY3RFeHByZXNzaW9uKG1ldGEpICYmXG4gICAgICAgICAgbWV0YS5wcm9wZXJ0aWVzICYmXG4gICAgICAgICAgIW1ldGEucHJvcGVydGllcy5zb21lKFxuICAgICAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgICAgIHRoaXMudC5pc09iamVjdFByb3BlcnR5KHByb3ApICYmXG4gICAgICAgICAgICAgICgodGhpcy50LmlzSWRlbnRpZmllcihwcm9wLmtleSkgJiYgcHJvcC5rZXkubmFtZSA9PT0gJ2lkJykgfHxcbiAgICAgICAgICAgICAgICAodGhpcy50LmlzU3RyaW5nTGl0ZXJhbChwcm9wLmtleSkgJiYgcHJvcC5rZXkudmFsdWUgPT09ICdpZCcpKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBkZXByZWNhdGUncyBtZXRhIGluZm9ybWF0aW9uIHJlcXVpcmVzIGFuIFwiaWRcIiBmaWVsZC5gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyB0aGUgYWN0dWFsbHkgZXhwYW5zaW9uIG9mIG1hY3Jvc1xuICAgKi9cbiAgZXhwYW5kTWFjcm9zKCkge1xuICAgIGxldCB0ID0gdGhpcy50O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25zW2ldO1xuICAgICAgbGV0IGV4cCA9IGV4cHJlc3Npb25bMF07XG4gICAgICBsZXQgZmxhZyA9IHRoaXMuX2RlYnVnRXhwcmVzc2lvbihleHApO1xuICAgICAgbGV0IGxvZ2ljYWxFeHAgPSBleHByZXNzaW9uWzFdO1xuICAgICAgZXhwLnJlcGxhY2VXaXRoKHQucGFyZW50aGVzaXplZEV4cHJlc3Npb24obG9naWNhbEV4cChmbGFnKSkpO1xuICAgICAgZXhwLnNjb3BlLmNyYXdsKCk7XG4gICAgfVxuICB9XG5cbiAgX2RlYnVnRXhwcmVzc2lvbih0YXJnZXQ6IE5vZGVQYXRoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmlzRGVidWcgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHRoaXMudC5ib29sZWFuTGl0ZXJhbCh0aGlzLmlzRGVidWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy50LmNhbGxFeHByZXNzaW9uKFxuICAgICAgICB0aGlzLnV0aWwuaW1wb3J0KHRhcmdldCwgJ0BlbWJyb2lkZXIvbWFjcm9zJywgJ2lzRGV2ZWxvcGluZ0FwcCcpLFxuICAgICAgICBbXVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlR2xvYmFsRXh0ZXJuYWxIZWxwZXIoXG4gICAgaWRlbnRpZmllcjogdC5JZGVudGlmaWVyLFxuICAgIGFyZ3M6IHQuQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddLFxuICAgIG5zOiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IHQgPSB0aGlzLnQ7XG4gICAgcmV0dXJuIHQuY2FsbEV4cHJlc3Npb24odC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcihucyksIGlkZW50aWZpZXIpLCBhcmdzKTtcbiAgfVxuXG4gIF9jcmVhdGVDb25zb2xlQVBJKGlkZW50aWZpZXI6IHQuSWRlbnRpZmllciwgYXJnczogdC5DYWxsRXhwcmVzc2lvblsnYXJndW1lbnRzJ10pIHtcbiAgICBsZXQgdCA9IHRoaXMudDtcbiAgICByZXR1cm4gdC5jYWxsRXhwcmVzc2lvbih0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdjb25zb2xlJyksIGlkZW50aWZpZXIpLCBhcmdzKTtcbiAgfVxuXG4gIF9idWlsZExvZ2ljYWxFeHByZXNzaW9ucyhcbiAgICBpZGVudGlmaWVyczogdC5FeHByZXNzaW9uW10sXG4gICAgY2FsbEV4cHJlc3Npb246IHQuRXhwcmVzc2lvblxuICApOiAoZGVidWdJZGVudGlmaWVyOiB0LkV4cHJlc3Npb24pID0+IHQuRXhwcmVzc2lvbiB7XG4gICAgbGV0IHQgPSB0aGlzLnQ7XG5cbiAgICByZXR1cm4gKGRlYnVnSWRlbnRpZmllcjogdC5FeHByZXNzaW9uKSA9PiB7XG4gICAgICBpZGVudGlmaWVycy51bnNoaWZ0KGRlYnVnSWRlbnRpZmllcik7XG4gICAgICBpZGVudGlmaWVycy5wdXNoKGNhbGxFeHByZXNzaW9uKTtcbiAgICAgIGxldCBsb2dpY2FsRXhwcmVzc2lvbnM7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGxlZnQgPSBpZGVudGlmaWVyc1tpXTtcbiAgICAgICAgbGV0IHJpZ2h0ID0gaWRlbnRpZmllcnNbaSArIDFdO1xuICAgICAgICBpZiAoIWxvZ2ljYWxFeHByZXNzaW9ucykge1xuICAgICAgICAgIGxvZ2ljYWxFeHByZXNzaW9ucyA9IHQubG9naWNhbEV4cHJlc3Npb24oJyYmJywgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgbG9naWNhbEV4cHJlc3Npb25zID0gdC5sb2dpY2FsRXhwcmVzc2lvbignJiYnLCBsb2dpY2FsRXhwcmVzc2lvbnMsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9naWNhbEV4cHJlc3Npb25zITtcbiAgICB9O1xuICB9XG59XG4iXX0=