Socket
Socket
Sign inDemoInstall

babel-import-util

Package Overview
Dependencies
0
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.1.0 to 2.1.1

33

package.json
{
"name": "babel-import-util",
"version": "2.1.0",
"version": "2.1.1",
"description": "Utility for manipulating imports within babel plugins",

@@ -8,2 +8,16 @@ "repository": "https://github.com/ef4/babel-import-util",

"author": "Edward Faulkner <edward@eaf4.com>",
"scripts": {
"prepare": "tsc",
"build": "tsc",
"pretest": "tsc",
"lint": "tsc && eslint --cache --ext .ts .",
"test": "jest",
"clean": "git clean -d -f -x src __tests__"
},
"jest": {
"testPathIgnorePatterns": [
"test-support.js",
".*\\.ts"
]
},
"main": "src/index.js",

@@ -15,8 +29,2 @@ "files": [

],
"jest": {
"testPathIgnorePatterns": [
"test-support.js",
".*\\.ts"
]
},
"devDependencies": {

@@ -28,3 +36,2 @@ "@babel/core": "^7.14.3",

"@babel/preset-env": "^7.14.7",
"@types/babel__core": "^7.20.5",
"@types/babel__traverse": "^7.11.1",

@@ -41,3 +48,2 @@ "@types/jest": "^29.5.3",

"prettier": "^2.2.1",
"release-plan": "^0.9.0",
"typescript": "^4.3.2"

@@ -47,10 +53,3 @@ },

"node": ">= 12.*"
},
"scripts": {
"build": "tsc",
"clean": "git clean -d -f -x src __tests__",
"lint": "tsc && eslint --cache --ext .ts .",
"pretest": "tsc",
"test": "jest"
}
}
}

@@ -39,5 +39,3 @@ # babel-import-util

if (callee.isIdentifier() && callee.node.name === 'myTarget') {
state.importUtil.replaceWith(callee, (i) =>
i.import(callee, 'my-implementation', 'theMethod')
);
callee.replaceWith(state.importUtil.import(callee, 'my-implementation', 'theMethod'));
}

@@ -57,29 +55,18 @@ },

class ImportUtil {
/*
Replace `target` with the new node produced by your callback. Your
callback can use `i.import` to gain access to imported identifiers.
// Import the given value (if needed) and return an Identifier representing
// it.
import(
// the spot at which you will insert the Identifier we return to you
target: NodePath<t.Node>,
Example:
// the path to the module you're importing from
moduleSpecifier: string,
util.replaceWith(path, (i) =>
t.callExpression(i.import('my-library', 'someFunction'), [])
);
*/
replaceWith<T extends t.Node, R extends t.Node>(
target: NodePath<T>,
fn: (i: Importer) => R
): NodePath<R>;
// the name you're importing from that module. Use "default" for the default
// export. Use "*" for the namespace.
exportedName: string,
/*
Similar to `replaceWith` above, except instead of replacing the target
we will insert the new Node before or after it.
*/
insertAfter<T extends t.Node, R extends t.Node>(
target: NodePath<T>,
fn: (i: Importer) => R
): NodePath<R>;
insertBefore<T extends t.Node, R extends t.Node>(
target: NodePath<T>,
fn: (i: Importer) => R
): NodePath<R>;
// Optional hint for helping us pick a name for the imported binding
nameHint?: string
): t.Identifier;

@@ -102,24 +89,3 @@ // If needed, adds a bare import like:

removeAllImports(moduleSpecifier: string): void;
// Import the given value (if needed) and return an Identifier representing
// it.
// CAUTION: this is a lower-level API that leaves some of the reference
// safety up to you. It's better to use replaceWith, insertAfter, insertBefore,
// or mutate. But this can still be helpful in contexts where you're already
// planning to manage babel's scopes anyawy.
import(
// the spot at which you will insert the Identifier we return to you
target: NodePath<t.Node>,
// the path to the module you're importing from
moduleSpecifier: string,
// the name you're importing from that module. Use "default" for the default
// export. Use "*" for the namespace.
exportedName: string,
// Optional hint for helping us pick a name for the imported binding
nameHint?: string
): t.Identifier;
}
```

@@ -1,17 +0,12 @@

import type * as Babel from '@babel/core';
import type { types as t, NodePath } from '@babel/core';
import type { NodePath } from '@babel/traverse';
import type * as t from '@babel/types';
type BabelTypes = typeof t;
export declare class ImportUtil {
private babel;
private t;
private program;
private t;
constructor(babel: typeof Babel, program: NodePath<t.Program>);
constructor(t: BabelTypes, program: NodePath<t.Program>);
removeImport(moduleSpecifier: string, exportedName: string): void;
removeAllImports(moduleSpecifier: string): void;
import(target: NodePath<t.Node>, moduleSpecifier: string, exportedName: string, nameHint?: string): t.Identifier;
private unreferencedImport;
importForSideEffect(moduleSpecifier: string): void;
replaceWith<T extends t.Node, R extends t.Node>(target: NodePath<T>, fn: (i: Importer) => R): NodePath<R>;
insertAfter<T extends t.Node, R extends t.Node>(target: NodePath<T>, fn: (i: Importer) => R): NodePath<R>;
insertBefore<T extends t.Node, R extends t.Node>(target: NodePath<T>, fn: (i: Importer) => R): NodePath<R>;
mutate<Replacement extends t.Node>(fn: (importer: Importer) => NodePath<Replacement>, defaultNameHint?: string): NodePath<Replacement>;
private addSpecifier;

@@ -22,4 +17,2 @@ private buildSpecifier;

}
export interface Importer {
import(moduleSpecifier: string, exportedName: string, nameHint?: string): t.Identifier;
}
export {};

@@ -5,6 +5,5 @@ "use strict";

class ImportUtil {
constructor(babel, program) {
this.babel = babel;
constructor(t, program) {
this.t = t;
this.program = program;
this.t = babel.types;
}

@@ -41,8 +40,2 @@ // remove one imported binding. If this is the last thing imported from the

// it.
//
// This method is trickier to use safely than our higher-level methods
// (`insertAfter`, `insertBefore`, `replaceWith`, `mutate`) because after you
// insert the identifier into the AST, it's up to you to ensure that babel's
// scope system is aware of the new reference. The other methods do that for
// you automatically.
import(

@@ -58,17 +51,2 @@ // the spot at which you will insert the Identifier we return to you

nameHint) {
return this.unreferencedImport(target, moduleSpecifier, exportedName, desiredName(nameHint, exportedName, defaultNameHint(target)));
}
// Import the given value (if needed) and return an Identifier representing
// it.
unreferencedImport(
// the spot at which you will insert the Identifier we return to you
target,
// the path to the module you're importing from
moduleSpecifier,
// the name you're importing from that module. Use "default" for the default
// export. Use "*" for the namespace.
exportedName,
// the preferred name you want, if we neeed to create a new binding. You
// might get something similar instead, to avoid collisions.
preferredName) {
var _a;

@@ -97,3 +75,3 @@ let isNamespaceImport = exportedName === '*';

else {
return this.addSpecifier(target, declaration, exportedName, preferredName);
return this.addSpecifier(target, declaration, exportedName, nameHint);
}

@@ -103,3 +81,3 @@ }

let declaration = this.insertAfterExistingImports(this.t.importDeclaration([], this.t.stringLiteral(moduleSpecifier)));
return this.addSpecifier(target, declaration, exportedName, preferredName);
return this.addSpecifier(target, declaration, exportedName, nameHint);
}

@@ -113,69 +91,12 @@ }

}
replaceWith(target, fn) {
return this.mutate((i) => {
target.replaceWith(fn(i));
// the return value of replaceWith is not a reliable way to get the
// updated path, at least in the case where the user replaced an
// expression with a statement. Instead we will rely on the fact that path
// replacement also mutates its argument, so `target` now points at the
// newly replaced path.
return target;
}, defaultNameHint(target));
}
insertAfter(target, fn) {
return this.mutate((i) => target.insertAfter(fn(i))[0], defaultNameHint(target));
}
insertBefore(target, fn) {
return this.mutate((i) => target.insertBefore(fn(i))[0], defaultNameHint(target));
}
// Low-level method for when you don't want to use our higher-level methods
// (replaceWith, insertBefore, insertAfter)
mutate(fn, defaultNameHint) {
let symbols = new Map();
const importer = {
import: (moduleSpecifier, exportedName, nameHint) => {
let identifier = this.t.identifier('__babel_import_util_placeholder__');
symbols.set(identifier, { moduleSpecifier, exportedName, nameHint });
return identifier;
},
};
const updateReference = (path) => {
if (!path.isIdentifier()) {
return;
}
let hit = symbols.get(path.node);
if (hit) {
let newIdentifier = this.unreferencedImport(path, hit.moduleSpecifier, hit.exportedName, desiredName(hit.nameHint, hit.exportedName, defaultNameHint));
path.replaceWith(newIdentifier);
let binding = path.scope.getBinding(newIdentifier.name);
if (!binding) {
// we create the binding at the point where we add the import, so this
// would indicate broken behavior
throw new Error(`bug: this is supposed to never happen`);
}
binding.reference(path);
}
};
let result = fn(importer);
updateReference(result);
this.babel.traverse(result.node, {
ReferencedIdentifier: (path) => {
updateReference(path);
},
}, result.scope, {}, result);
return result;
}
addSpecifier(target, declaration, exportedName, preferredName) {
let local = this.t.identifier(unusedNameLike(target, preferredName));
addSpecifier(target, declaration, exportedName, nameHint) {
let local = this.t.identifier(unusedNameLike(target, desiredName(nameHint, exportedName, target)));
let specifier = this.buildSpecifier(exportedName, local);
let added;
if (specifier.type === 'ImportDefaultSpecifier') {
declaration.node.specifiers.unshift(specifier);
added = declaration.get(`specifiers.0`);
}
else {
declaration.node.specifiers.push(specifier);
added = declaration.get(`specifiers.${declaration.node.specifiers.length - 1}`);
}
declaration.scope.registerBinding('module', added);
declaration.scope.registerBinding('module', declaration.get(`specifiers.${declaration.node.specifiers.length - 1}`));
return local;

@@ -241,3 +162,3 @@ }

}
function desiredName(nameHint, exportedName, defaultNameHint) {
function desiredName(nameHint, exportedName, target) {
if (nameHint) {

@@ -253,3 +174,8 @@ // first we opportunistically do camelization when an illegal character is

if (exportedName === 'default' || exportedName === '*') {
return defaultNameHint !== null && defaultNameHint !== void 0 ? defaultNameHint : 'a';
if (target.isIdentifier()) {
return target.node.name;
}
else {
return target.scope.generateUidIdentifierBasedOnNode(target.node).name;
}
}

@@ -260,13 +186,2 @@ else {

}
function defaultNameHint(target) {
if (target === null || target === void 0 ? void 0 : target.isIdentifier()) {
return target.node.name;
}
else if (target) {
return target.scope.generateUidIdentifierBasedOnNode(target.node).name;
}
else {
return undefined;
}
}
function matchSpecifier(spec, exportedName) {

@@ -285,2 +200,2 @@ switch (exportedName) {

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLFVBQVU7SUFHckIsWUFBb0IsS0FBbUIsRUFBVSxPQUE0QjtRQUF6RCxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDM0UsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsbUVBQW1FO0lBQ25FLFlBQVksQ0FBQyxlQUF1QixFQUFFLFlBQW9CO1FBQ3hELEtBQUssSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQUU7Z0JBQy9DLFNBQVM7YUFDVjtZQUVELElBQUksbUJBQW1CLEdBQUcsWUFBWTtpQkFDbkMsR0FBRyxDQUFDLFlBQVksQ0FBQztpQkFDakIsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxtQkFBbUIsRUFBRTtnQkFDdkIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUM3QyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUM5QjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGdCQUFnQixDQUFDLGVBQXVCO1FBQ3RDLEtBQUssSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakQsSUFBSSxXQUFXLENBQUMs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SUFBSSxDQUFDO0tBQ3hFO1NBQU07UUFDTCxPQUFPLFNBQVMsQ0FBQztLQUNsQjtBQUNILENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFtQixFQUFFLFlBQW9CO0lBQy9ELFFBQVEsWUFBWSxFQUFFO1FBQ3BCLEtBQUssU0FBUztZQUNaLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDekMsS0FBSyxHQUFHO1lBQ04sT0FBTyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUMzQztZQUNFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssWUFBWSxDQUFDO0tBQ2hGO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixJQUFtQixFQUNuQixlQUF1QjtJQUV2QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUM7QUFDekYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgQmFiZWwgZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyB0eXBlcyBhcyB0LCBOb2RlUGF0aCB9IGZyb20gJ0BiYWJlbC9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydFV0aWwge1xuICBwcml2YXRlIHQ6IHR5cGVvZiBCYWJlbC50eXBlcztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhYmVsOiB0eXBlb2YgQmFiZWwsIHByaXZhdGUgcHJvZ3JhbTogTm9kZVBhdGg8dC5Qcm9ncmFtPikge1xuICAgIHRoaXMudCA9IGJhYmVsLnR5cGVzO1xuICB9XG5cbiAgLy8gcmVtb3ZlIG9uZSBpbXBvcnRlZCBiaW5kaW5nLiBJZiB0aGlzIGlzIHRoZSBsYXN0IHRoaW5nIGltcG9ydGVkIGZyb20gdGhlXG4gIC8vIGdpdmVuIG1vZHVsZVNwZWNpZmllciwgdGhlIHdob2xlIHN0YXRlbWVudCB3aWxsIGFsc28gYmUgcmVtb3ZlZC5cbiAgcmVtb3ZlSW1wb3J0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLCBleHBvcnRlZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAobGV0IHRvcExldmVsUGF0aCBvZiB0aGlzLnByb2dyYW0uZ2V0KCdib2R5JykpIHtcbiAgICAgIGlmICghbWF0Y2hNb2R1bGUodG9wTGV2ZWxQYXRoLCBtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW1wb3J0U3BlY2lmaWVyUGF0aCA9IHRvcExldmVsUGF0aFxuICAgICAgICAuZ2V0KCdzcGVjaWZpZXJzJylcbiAgICAgICAgLmZpbmQoKHNwZWNpZmllclBhdGgpID0+IG1hdGNoU3BlY2lmaWVyKHNwZWNpZmllclBhdGgsIGV4cG9ydGVkTmFtZSkpO1xuICAgICAgaWYgKGltcG9ydFNwZWNpZmllclBhdGgpIHtcbiAgICAgICAgaWYgKHRvcExldmVsUGF0aC5ub2RlLnNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdG9wTGV2ZWxQYXRoLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydFNwZWNpZmllclBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZW1vdmUgYWxsIGltcG9ydHMgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlU3BlY2lmaWVyXG4gIHJlbW92ZUFsbEltcG9ydHMobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0b3BMZXZlbFBhdGggb2YgdGhpcy5wcm9ncmFtLmdldCgnYm9keScpKSB7XG4gICAgICBpZiAobWF0Y2hNb2R1bGUodG9wTGV2ZWxQYXRoLCBtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIHRvcExldmVsUGF0aC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJbXBvcnQgdGhlIGdpdmVuIHZhbHVlIChpZiBuZWVkZWQpIGFuZCByZXR1cm4gYW4gSWRlbnRpZmllciByZXByZXNlbnRpbmdcbiAgLy8gaXQuXG4gIC8vXG4gIC8vIFRoaXMgbWV0aG9kIGlzIHRyaWNraWVyIHRvIHVzZSBzYWZlbHkgdGhhbiBvdXIgaGlnaGVyLWxldmVsIG1ldGhvZHNcbiAgLy8gKGBpbnNlcnRBZnRlcmAsIGBpbnNlcnRCZWZvcmVgLCBgcmVwbGFjZVdpdGhgLCBgbXV0YXRlYCkgYmVjYXVzZSBhZnRlciB5b3VcbiAgLy8gaW5zZXJ0IHRoZSBpZGVudGlmaWVyIGludG8gdGhlIEFTVCwgaXQncyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoYXQgYmFiZWwnc1xuICAvLyBzY29wZSBzeXN0ZW0gaXMgYXdhcmUgb2YgdGhlIG5ldyByZWZlcmVuY2UuIFRoZSBvdGhlciBtZXRob2RzIGRvIHRoYXQgZm9yXG4gIC8vIHlvdSBhdXRvbWF0aWNhbGx5LlxuICBpbXBvcnQoXG4gICAgLy8gdGhlIHNwb3QgYXQgd2hpY2ggeW91IHdpbGwgaW5zZXJ0IHRoZSBJZGVudGlmaWVyIHdlIHJldHVybiB0byB5b3VcbiAgICB0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT4sXG5cbiAgICAvLyB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSdyZSBpbXBvcnRpbmcgZnJvbVxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuXG4gICAgLy8gdGhlIG5hbWUgeW91J3JlIGltcG9ydGluZyBmcm9tIHRoYXQgbW9kdWxlLiBVc2UgXCJkZWZhdWx0XCIgZm9yIHRoZSBkZWZhdWx0XG4gICAgLy8gZXhwb3J0LiBVc2UgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UuXG4gICAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG5cbiAgICAvLyBPcHRpb25hbCBoaW50IGZvciBoZWxwaW5nIHVzIHBpY2sgYSBuYW1lIGZvciB0aGUgaW1wb3J0ZWQgYmluZGluZ1xuICAgIG5hbWVIaW50Pzogc3RyaW5nXG4gICk6IHQuSWRlbnRpZmllciB7XG4gICAgcmV0dXJuIHRoaXMudW5yZWZlcmVuY2VkSW1wb3J0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgZXhwb3J0ZWROYW1lLFxuICAgICAgZGVzaXJlZE5hbWUobmFtZUhpbnQsIGV4cG9ydGVkTmFtZSwgZGVmYXVsdE5hbWVIaW50KHRhcmdldCkpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEltcG9ydCB0aGUgZ2l2ZW4gdmFsdWUgKGlmIG5lZWRlZCkgYW5kIHJldHVybiBhbiBJZGVudGlmaWVyIHJlcHJlc2VudGluZ1xuICAvLyBpdC5cbiAgcHJpdmF0ZSB1bnJlZmVyZW5jZWRJbXBvcnQoXG4gICAgLy8gdGhlIHNwb3QgYXQgd2hpY2ggeW91IHdpbGwgaW5zZXJ0IHRoZSBJZGVudGlmaWVyIHdlIHJldHVybiB0byB5b3VcbiAgICB0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT4sXG5cbiAgICAvLyB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSdyZSBpbXBvcnRpbmcgZnJvbVxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuXG4gICAgLy8gdGhlIG5hbWUgeW91J3JlIGltcG9ydGluZyBmcm9tIHRoYXQgbW9kdWxlLiBVc2UgXCJkZWZhdWx0XCIgZm9yIHRoZSBkZWZhdWx0XG4gICAgLy8gZXhwb3J0LiBVc2UgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UuXG4gICAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG5cbiAgICAvLyB0aGUgcHJlZmVycmVkIG5hbWUgeW91IHdhbnQsIGlmIHdlIG5lZWVkIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiBZb3VcbiAgICAvLyBtaWdodCBnZXQgc29tZXRoaW5nIHNpbWlsYXIgaW5zdGVhZCwgdG8gYXZvaWQgY29sbGlzaW9ucy5cbiAgICBwcmVmZXJyZWROYW1lOiBzdHJpbmdcbiAgKTogdC5JZGVudGlmaWVyIHtcbiAgICBsZXQgaXNOYW1lc3BhY2VJbXBvcnQgPSBleHBvcnRlZE5hbWUgPT09ICcqJztcbiAgICBsZXQgaXNEZWZhdWx0SW1wb3J0ID0gZXhwb3J0ZWROYW1lID09PSAnZGVmYXVsdCc7XG4gICAgbGV0IGlzTmFtZWRJbXBvcnQgPSAhaXNEZWZhdWx0SW1wb3J0ICYmICFpc05hbWVzcGFjZUltcG9ydDtcbiAgICBsZXQgZGVjbGFyYXRpb24gPSB0aGlzLmZpbmRJbXBvcnRGcm9tKG1vZHVsZVNwZWNpZmllcik7XG4gICAgbGV0IGhhc05hbWVzcGFjZVNwZWNpZmllciA9IGRlY2xhcmF0aW9uPy5ub2RlLnNwZWNpZmllcnMuZmluZChcbiAgICAgIChzKSA9PiBzLnR5cGUgPT09ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInXG4gICAgKTtcbiAgICBsZXQgaGFzTmFtZWRTcGVjaWZpZXJzID0gZGVjbGFyYXRpb24/Lm5vZGUuc3BlY2lmaWVycy5maW5kKChzKSA9PiBzLnR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInKTtcblxuICAgIC8qKlxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5vbi1uYW1lc3BhY2UgaW1wb3J0IGFuZCBhIHRyYW5zZm9ybSB0cmllcyB0byBhZGQgYSBuYW1lc3BhY2UgaW1wb3J0LCBzbyB0aGV5IGRvbid0IGdldCBjb21iaW5lZFxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5hbWVzcGFjZSBpbXBvcnQgYW5kIGEgdHJhbnNmb3JtIHRyaWVzIHRvIGFkZCBhIG5vbi1uYW1lc3BhY2UgaW1wb3J0LCBzbyB0aGV5IGRvbid0IGdldCBjb21iaW5lZFxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5hbWVzcGFjZSBpbXBvcnQgYW5kIGEgdHJhbnNmb3JtIHRyaWVzIHRvIGFkZCBhIG5hbWVzcGFjZSBpbXBvcnQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbWJpbmVkXG4gICAgICovXG4gICAgbGV0IGNhbm5vdFVzZUV4aXN0aW5nRGVjbGFyYXRpb24gPVxuICAgICAgKGhhc05hbWVkU3BlY2lmaWVycyAmJiBpc05hbWVzcGFjZUltcG9ydCkgfHxcbiAgICAgIChoYXNOYW1lc3BhY2VTcGVjaWZpZXIgJiYgaXNOYW1lZEltcG9ydCkgfHxcbiAgICAgIChoYXNOYW1lc3BhY2VTcGVjaWZpZXIgJiYgaXNOYW1lc3BhY2VJbXBvcnQpO1xuXG4gICAgaWYgKCFjYW5ub3RVc2VFeGlzdGluZ0RlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uKSB7XG4gICAgICBsZXQgc3BlY2lmaWVyID0gZGVjbGFyYXRpb25cbiAgICAgICAgLmdldCgnc3BlY2lmaWVycycpXG4gICAgICAgIC5maW5kKChzcGVjKSA9PiBtYXRjaFNwZWNpZmllcihzcGVjLCBleHBvcnRlZE5hbWUpKTtcbiAgICAgIGlmIChzcGVjaWZpZXIgJiYgdGFyZ2V0LnNjb3BlLmdldEJpbmRpbmcoc3BlY2lmaWVyLm5vZGUubG9jYWwubmFtZSk/LmtpbmQgPT09ICdtb2R1bGUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnQuaWRlbnRpZmllcihzcGVjaWZpZXIubm9kZS5sb2NhbC5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNwZWNpZmllcih0YXJnZXQsIGRlY2xhcmF0aW9uLCBleHBvcnRlZE5hbWUsIHByZWZlcnJlZE5hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZGVjbGFyYXRpb24gPSB0aGlzLmluc2VydEFmdGVyRXhpc3RpbmdJbXBvcnRzKFxuICAgICAgICB0aGlzLnQuaW1wb3J0RGVjbGFyYXRpb24oW10sIHRoaXMudC5zdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVyKHRhcmdldCwgZGVjbGFyYXRpb24sIGV4cG9ydGVkTmFtZSwgcHJlZmVycmVkTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgaW1wb3J0Rm9yU2lkZUVmZmVjdChtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBkZWNsYXJhdGlvbiA9IHRoaXMuZmluZEltcG9ydEZyb20obW9kdWxlU3BlY2lmaWVyKTtcbiAgICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgICB0aGlzLmluc2VydEFmdGVyRXhpc3RpbmdJbXBvcnRzKFxuICAgICAgICB0aGlzLnQuaW1wb3J0RGVjbGFyYXRpb24oW10sIHRoaXMudC5zdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlcGxhY2VXaXRoPFQgZXh0ZW5kcyB0Lk5vZGUsIFIgZXh0ZW5kcyB0Lk5vZGU+KFxuICAgIHRhcmdldDogTm9kZVBhdGg8VD4sXG4gICAgZm46IChpOiBJbXBvcnRlcikgPT4gUlxuICApOiBOb2RlUGF0aDxSPiB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKChpKSA9PiB7XG4gICAgICB0YXJnZXQucmVwbGFjZVdpdGgoZm4oaSkpO1xuICAgICAgLy8gdGhlIHJldHVybiB2YWx1ZSBvZiByZXBsYWNlV2l0aCBpcyBub3QgYSByZWxpYWJsZSB3YXkgdG8gZ2V0IHRoZVxuICAgICAgLy8gdXBkYXRlZCBwYXRoLCBhdCBsZWFzdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciByZXBsYWNlZCBhblxuICAgICAgLy8gZXhwcmVzc2lvbiB3aXRoIGEgc3RhdGVtZW50LiBJbnN0ZWFkIHdlIHdpbGwgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHBhdGhcbiAgICAgIC8vIHJlcGxhY2VtZW50IGFsc28gbXV0YXRlcyBpdHMgYXJndW1lbnQsIHNvIGB0YXJnZXRgIG5vdyBwb2ludHMgYXQgdGhlXG4gICAgICAvLyBuZXdseSByZXBsYWNlZCBwYXRoLlxuICAgICAgcmV0dXJuIHRhcmdldCBhcyB1bmtub3duIGFzIE5vZGVQYXRoPFI+O1xuICAgIH0sIGRlZmF1bHROYW1lSGludCh0YXJnZXQpKTtcbiAgfVxuXG4gIGluc2VydEFmdGVyPFQgZXh0ZW5kcyB0Lk5vZGUsIFIgZXh0ZW5kcyB0Lk5vZGU+KFxuICAgIHRhcmdldDogTm9kZVBhdGg8VD4sXG4gICAgZm46IChpOiBJbXBvcnRlcikgPT4gUlxuICApOiBOb2RlUGF0aDxSPiB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKChpKSA9PiB0YXJnZXQuaW5zZXJ0QWZ0ZXIoZm4oaSkpWzBdIGFzIE5vZGVQYXRoPFI+LCBkZWZhdWx0TmFtZUhpbnQodGFyZ2V0KSk7XG4gIH1cblxuICBpbnNlcnRCZWZvcmU8VCBleHRlbmRzIHQuTm9kZSwgUiBleHRlbmRzIHQuTm9kZT4oXG4gICAgdGFyZ2V0OiBOb2RlUGF0aDxUPixcbiAgICBmbjogKGk6IEltcG9ydGVyKSA9PiBSXG4gICk6IE5vZGVQYXRoPFI+IHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUoXG4gICAgICAoaSkgPT4gdGFyZ2V0Lmluc2VydEJlZm9yZShmbihpKSlbMF0gYXMgTm9kZVBhdGg8Uj4sXG4gICAgICBkZWZhdWx0TmFtZUhpbnQodGFyZ2V0KVxuICAgICk7XG4gIH1cblxuICAvLyBMb3ctbGV2ZWwgbWV0aG9kIGZvciB3aGVuIHlvdSBkb24ndCB3YW50IHRvIHVzZSBvdXIgaGlnaGVyLWxldmVsIG1ldGhvZHNcbiAgLy8gKHJlcGxhY2VXaXRoLCBpbnNlcnRCZWZvcmUsIGluc2VydEFmdGVyKVxuICBtdXRhdGU8UmVwbGFjZW1lbnQgZXh0ZW5kcyB0Lk5vZGU+KFxuICAgIGZuOiAoaW1wb3J0ZXI6IEltcG9ydGVyKSA9PiBOb2RlUGF0aDxSZXBsYWNlbWVudD4sXG4gICAgZGVmYXVsdE5hbWVIaW50Pzogc3RyaW5nXG4gICk6IE5vZGVQYXRoPFJlcGxhY2VtZW50PiB7XG4gICAgbGV0IHN5bWJvbHM6IE1hcDxcbiAgICAgIHQuSWRlbnRpZmllcixcbiAgICAgIHsgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmc7IGV4cG9ydGVkTmFtZTogc3RyaW5nOyBuYW1lSGludDogc3RyaW5nIHwgdW5kZWZpbmVkIH1cbiAgICA+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGltcG9ydGVyOiBJbXBvcnRlciA9IHtcbiAgICAgIGltcG9ydDogKG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLCBleHBvcnRlZE5hbWU6IHN0cmluZywgbmFtZUhpbnQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGlkZW50aWZpZXIgPSB0aGlzLnQuaWRlbnRpZmllcignX19iYWJlbF9pbXBvcnRfdXRpbF9wbGFjZWhvbGRlcl9fJyk7XG4gICAgICAgIHN5bWJvbHMuc2V0KGlkZW50aWZpZXIsIHsgbW9kdWxlU3BlY2lmaWVyLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50IH0pO1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlZmVyZW5jZSA9IChwYXRoOiBOb2RlUGF0aCkgPT4ge1xuICAgICAgaWYgKCFwYXRoLmlzSWRlbnRpZmllcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBoaXQgPSBzeW1ib2xzLmdldChwYXRoLm5vZGUpO1xuICAgICAgaWYgKGhpdCkge1xuICAgICAgICBsZXQgbmV3SWRlbnRpZmllciA9IHRoaXMudW5yZWZlcmVuY2VkSW1wb3J0KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgaGl0Lm1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBoaXQuZXhwb3J0ZWROYW1lLFxuICAgICAgICAgIGRlc2lyZWROYW1lKGhpdC5uYW1lSGludCwgaGl0LmV4cG9ydGVkTmFtZSwgZGVmYXVsdE5hbWVIaW50KVxuICAgICAgICApO1xuICAgICAgICBwYXRoLnJlcGxhY2VXaXRoKG5ld0lkZW50aWZpZXIpO1xuICAgICAgICBsZXQgYmluZGluZyA9IHBhdGguc2NvcGUuZ2V0QmluZGluZyhuZXdJZGVudGlmaWVyLm5hbWUpO1xuICAgICAgICBpZiAoIWJpbmRpbmcpIHtcbiAgICAgICAgICAvLyB3ZSBjcmVhdGUgdGhlIGJpbmRpbmcgYXQgdGhlIHBvaW50IHdoZXJlIHdlIGFkZCB0aGUgaW1wb3J0LCBzbyB0aGlzXG4gICAgICAgICAgLy8gd291bGQgaW5kaWNhdGUgYnJva2VuIGJlaGF2aW9yXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBidWc6IHRoaXMgaXMgc3VwcG9zZWQgdG8gbmV2ZXIgaGFwcGVuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYmluZGluZy5yZWZlcmVuY2UocGF0aCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCByZXN1bHQgPSBmbihpbXBvcnRlcik7XG4gICAgdXBkYXRlUmVmZXJlbmNlKHJlc3VsdCk7XG4gICAgdGhpcy5iYWJlbC50cmF2ZXJzZShcbiAgICAgIHJlc3VsdC5ub2RlLFxuICAgICAge1xuICAgICAgICBSZWZlcmVuY2VkSWRlbnRpZmllcjogKHBhdGgpID0+IHtcbiAgICAgICAgICB1cGRhdGVSZWZlcmVuY2UocGF0aCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVzdWx0LnNjb3BlLFxuICAgICAge30sXG4gICAgICByZXN1bHRcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFkZFNwZWNpZmllcihcbiAgICB0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT4sXG4gICAgZGVjbGFyYXRpb246IE5vZGVQYXRoPHQuSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgIGV4cG9ydGVkTmFtZTogc3RyaW5nLFxuICAgIHByZWZlcnJlZE5hbWU6IHN0cmluZ1xuICApOiB0LklkZW50aWZpZXIge1xuICAgIGxldCBsb2NhbCA9IHRoaXMudC5pZGVudGlmaWVyKHVudXNlZE5hbWVMaWtlKHRhcmdldCwgcHJlZmVycmVkTmFtZSkpO1xuICAgIGxldCBzcGVjaWZpZXIgPSB0aGlzLmJ1aWxkU3BlY2lmaWVyKGV4cG9ydGVkTmFtZSwgbG9jYWwpO1xuICAgIGxldCBhZGRlZDogTm9kZVBhdGg7XG4gICAgaWYgKHNwZWNpZmllci50eXBlID09PSAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicpIHtcbiAgICAgIGRlY2xhcmF0aW9uLm5vZGUuc3BlY2lmaWVycy51bnNoaWZ0KHNwZWNpZmllcik7XG4gICAgICBhZGRlZCA9IGRlY2xhcmF0aW9uLmdldChgc3BlY2lmaWVycy4wYCkgYXMgTm9kZVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY2xhcmF0aW9uLm5vZGUuc3BlY2lmaWVycy5wdXNoKHNwZWNpZmllcik7XG4gICAgICBhZGRlZCA9IGRlY2xhcmF0aW9uLmdldChgc3BlY2lmaWVycy4ke2RlY2xhcmF0aW9uLm5vZGUuc3BlY2lmaWVycy5sZW5ndGggLSAxfWApIGFzIE5vZGVQYXRoO1xuICAgIH1cbiAgICBkZWNsYXJhdGlvbi5zY29wZS5yZWdpc3RlckJpbmRpbmcoJ21vZHVsZScsIGFkZGVkKTtcbiAgICByZXR1cm4gbG9jYWw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3BlY2lmaWVyKGV4cG9ydGVkTmFtZTogc3RyaW5nLCBsb2NhbE5hbWU6IHQuSWRlbnRpZmllcikge1xuICAgIHN3aXRjaCAoZXhwb3J0ZWROYW1lKSB7XG4gICAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudC5pbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsTmFtZSk7XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudC5pbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIobG9jYWxOYW1lKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnQuaW1wb3J0U3BlY2lmaWVyKGxvY2FsTmFtZSwgdGhpcy50LmlkZW50aWZpZXIoZXhwb3J0ZWROYW1lKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kSW1wb3J0RnJvbShtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IE5vZGVQYXRoPHQuSW1wb3J0RGVjbGFyYXRpb24+IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBwYXRoIG9mIHRoaXMucHJvZ3JhbS5nZXQoJ2JvZHknKSkge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoLmlzSW1wb3J0RGVjbGFyYXRpb24oKSAmJlxuICAgICAgICBwYXRoLm5vZGUuc291cmNlLnZhbHVlID09PSBtb2R1bGVTcGVjaWZpZXIgJiZcbiAgICAgICAgcGF0aC5ub2RlLmltcG9ydEtpbmQgIT09ICd0eXBlJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRBZnRlckV4aXN0aW5nSW1wb3J0czxTIGV4dGVuZHMgdC5TdGF0ZW1lbnQ+KHN0YXRlbWVudDogUyk6IE5vZGVQYXRoPFM+IHtcbiAgICBsZXQgbGFzdEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgW2luZGV4LCBub2RlXSBvZiB0aGlzLnByb2dyYW0ubm9kZS5ib2R5LmVudHJpZXMoKSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykge1xuICAgICAgICBsYXN0SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCA9PSBudWxsKSB7XG4gICAgICAvLyB3ZSBhcmUgaW50ZW50aW9uYWxseSBub3QgdXNpbmcgYmFiZWwncyBjb250YWluZXItYXdhcmUgbWV0aG9kcywgYmVjYXVzZVxuICAgICAgLy8gd2hpbGUgaW4gdGhlb3J5IGl0J3MgbmljZSB0aGF0IHRoZXkgc2NoZWR1bGUgb3RoZXIgcGx1Z2lucyB0byBydW4gb25cbiAgICAgIC8vIG91ciBub2RlcywgaW4gcHJhY3RpY2UgdGhvc2Ugbm9kZXMgbWlnaHQgZ2V0IG11dGF0ZWQgb3IgcmVtb3ZlZCBieSBzb21lXG4gICAgICAvLyBvdGhlciBwbHVnaW4gaW4gdGhlIGludGVydmVuaW5nIHRpbWUgY2F1c2luZyBmYWlsdXJlcy5cbiAgICAgIHRoaXMucHJvZ3JhbS5ub2RlLmJvZHkudW5zaGlmdChzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3JhbS5nZXQoJ2JvZHkuMCcpIGFzIE5vZGVQYXRoPFM+O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2dyYW0ubm9kZS5ib2R5LnNwbGljZShsYXN0SW5kZXggKyAxLCAwLCBzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3JhbS5nZXQoYGJvZHkuJHtsYXN0SW5kZXggKyAxfWApIGFzIE5vZGVQYXRoPFM+O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1bnVzZWROYW1lTGlrZShwYXRoOiBOb2RlUGF0aDx0Lk5vZGU+LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY2FuZGlkYXRlID0gbmFtZTtcbiAgbGV0IGNvdW50ZXIgPSAwO1xuICB3aGlsZSAocGF0aC5zY29wZS5oYXNCaW5kaW5nKGNhbmRpZGF0ZSkpIHtcbiAgICBjYW5kaWRhdGUgPSBgJHtuYW1lfSR7Y291bnRlcisrfWA7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZTtcbn1cblxuZnVuY3Rpb24gbmFtZShub2RlOiB0LlN0cmluZ0xpdGVyYWwgfCB0LklkZW50aWZpZXIpOiBzdHJpbmcge1xuICBpZiAobm9kZS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcpIHtcbiAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZS5uYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2lyZWROYW1lKFxuICBuYW1lSGludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHBvcnRlZE5hbWU6IHN0cmluZyxcbiAgZGVmYXVsdE5hbWVIaW50OiBzdHJpbmcgfCB1bmRlZmluZWRcbikge1xuICBpZiAobmFtZUhpbnQpIHtcbiAgICAvLyBmaXJzdCB3ZSBvcHBvcnR1bmlzdGljYWxseSBkbyBjYW1lbGl6YXRpb24gd2hlbiBhbiBpbGxlZ2FsIGNoYXJhY3RlciBpc1xuICAgIC8vIGZvbGxvd2VkIGJ5IGEgbG93ZXJjYXNlIGxldHRlciwgaW4gYW4gZWZmb3J0IHRvIGFpZCByZWFkYWJpbGl0eSBvZiB0aGVcbiAgICAvLyBvdXRwdXQuXG4gICAgbGV0IGNsZWFuZWQgPSBuYW1lSGludC5yZXBsYWNlKC9bXmEtekEtWl9dKFthLXpdKS9nLCAoX20sIGxldHRlcikgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xuICAgIC8vIHRoZW4gd2UgdW5saXRlcmFsbHkgc3RyaXAgYWxsIHJlbWFpbmluZyBpbGxlZ2FsIGNoYXJhY3RlcnMuXG4gICAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvW15hLXpBLVpfXS9nLCAnJyk7XG4gICAgcmV0dXJuIGNsZWFuZWQ7XG4gIH1cbiAgaWYgKGV4cG9ydGVkTmFtZSA9PT0gJ2RlZmF1bHQnIHx8IGV4cG9ydGVkTmFtZSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lSGludCA/PyAnYSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cG9ydGVkTmFtZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0TmFtZUhpbnQodGFyZ2V0OiBOb2RlUGF0aCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0YXJnZXQ/LmlzSWRlbnRpZmllcigpKSB7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlLm5hbWU7XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldC5zY29wZS5nZW5lcmF0ZVVpZElkZW50aWZpZXJCYXNlZE9uTm9kZSh0YXJnZXQubm9kZSkubmFtZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoU3BlY2lmaWVyKHNwZWM6IE5vZGVQYXRoPGFueT4sIGV4cG9ydGVkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoZXhwb3J0ZWROYW1lKSB7XG4gICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICByZXR1cm4gc3BlYy5pc0ltcG9ydERlZmF1bHRTcGVjaWZpZXIoKTtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBzcGVjLmlzSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzcGVjLmlzSW1wb3J0U3BlY2lmaWVyKCkgJiYgbmFtZShzcGVjLm5vZGUuaW1wb3J0ZWQpID09PSBleHBvcnRlZE5hbWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hNb2R1bGUoXG4gIHBhdGg6IE5vZGVQYXRoPGFueT4sXG4gIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nXG4pOiBwYXRoIGlzIE5vZGVQYXRoPHQuSW1wb3J0RGVjbGFyYXRpb24+IHtcbiAgcmV0dXJuIHBhdGguaXNJbXBvcnREZWNsYXJhdGlvbigpICYmIHBhdGguZ2V0KCdzb3VyY2UnKS5ub2RlLnZhbHVlID09PSBtb2R1bGVTcGVjaWZpZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0ZXIge1xuICAvLyBJbXBvcnQgdGhlIGdpdmVuIHZhbHVlIChpZiBuZWVkZWQpIGFuZCByZXR1cm4gYW4gSWRlbnRpZmllciByZXByZXNlbnRpbmdcbiAgLy8gaXQuXG4gIGltcG9ydChcbiAgICAvLyB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSdyZSBpbXBvcnRpbmcgZnJvbVxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuXG4gICAgLy8gdGhlIG5hbWUgeW91J3JlIGltcG9ydGluZyBmcm9tIHRoYXQgbW9kdWxlLiBVc2UgXCJkZWZhdWx0XCIgZm9yIHRoZSBkZWZhdWx0XG4gICAgLy8gZXhwb3J0LiBVc2UgXCIqXCIgZm9yIHRoZSBuYW1lc3BhY2UuXG4gICAgZXhwb3J0ZWROYW1lOiBzdHJpbmcsXG5cbiAgICAvLyBPcHRpb25hbCBoaW50IGZvciBoZWxwaW5nIHVzIHBpY2sgYSBuYW1lIGZvciB0aGUgaW1wb3J0ZWQgYmluZGluZ1xuICAgIG5hbWVIaW50Pzogc3RyaW5nXG4gICk6IHQuSWRlbnRpZmllcjtcbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxNQUFhLFVBQVU7SUFDckIsWUFBb0IsQ0FBYSxFQUFVLE9BQTRCO1FBQW5ELE1BQUMsR0FBRCxDQUFDLENBQVk7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFxQjtJQUFHLENBQUM7SUFFM0UsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUNuRSxZQUFZLENBQUMsZUFBdUIsRUFBRSxZQUFvQjtRQUN4RCxLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxFQUFFO2dCQUMvQyxTQUFTO2FBQ1Y7WUFFRCxJQUFJLG1CQUFtQixHQUFHLFlBQVk7aUJBQ25DLEdBQUcsQ0FBQyxZQUFZLENBQUM7aUJBQ2pCLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3ZCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDN0MsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUN2QjtxQkFBTTtvQkFDTCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDOUI7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxnQkFBZ0IsQ0FBQyxlQUF1QjtRQUN0QyxLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pELElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsRUFBRTtnQkFDOUMsWUFBWSxDQUFDLE1BQU0s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QUNMLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3hFO0tBQ0Y7U0FBTTtRQUNMLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQW1CLEVBQUUsWUFBb0I7SUFDL0QsUUFBUSxZQUFZLEVBQUU7UUFDcEIsS0FBSyxTQUFTO1lBQ1osT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN6QyxLQUFLLEdBQUc7WUFDTixPQUFPLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzNDO1lBQ0UsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxZQUFZLENBQUM7S0FDaEY7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLElBQW1CLEVBQ25CLGVBQXVCO0lBRXZCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQztBQUN6RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOb2RlUGF0aCB9IGZyb20gJ0BiYWJlbC90cmF2ZXJzZSc7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSAnQGJhYmVsL3R5cGVzJztcblxudHlwZSBCYWJlbFR5cGVzID0gdHlwZW9mIHQ7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRVdGlsIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0OiBCYWJlbFR5cGVzLCBwcml2YXRlIHByb2dyYW06IE5vZGVQYXRoPHQuUHJvZ3JhbT4pIHt9XG5cbiAgLy8gcmVtb3ZlIG9uZSBpbXBvcnRlZCBiaW5kaW5nLiBJZiB0aGlzIGlzIHRoZSBsYXN0IHRoaW5nIGltcG9ydGVkIGZyb20gdGhlXG4gIC8vIGdpdmVuIG1vZHVsZVNwZWNpZmllciwgdGhlIHdob2xlIHN0YXRlbWVudCB3aWxsIGFsc28gYmUgcmVtb3ZlZC5cbiAgcmVtb3ZlSW1wb3J0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLCBleHBvcnRlZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAobGV0IHRvcExldmVsUGF0aCBvZiB0aGlzLnByb2dyYW0uZ2V0KCdib2R5JykpIHtcbiAgICAgIGlmICghbWF0Y2hNb2R1bGUodG9wTGV2ZWxQYXRoLCBtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW1wb3J0U3BlY2lmaWVyUGF0aCA9IHRvcExldmVsUGF0aFxuICAgICAgICAuZ2V0KCdzcGVjaWZpZXJzJylcbiAgICAgICAgLmZpbmQoKHNwZWNpZmllclBhdGgpID0+IG1hdGNoU3BlY2lmaWVyKHNwZWNpZmllclBhdGgsIGV4cG9ydGVkTmFtZSkpO1xuICAgICAgaWYgKGltcG9ydFNwZWNpZmllclBhdGgpIHtcbiAgICAgICAgaWYgKHRvcExldmVsUGF0aC5ub2RlLnNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdG9wTGV2ZWxQYXRoLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydFNwZWNpZmllclBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZW1vdmUgYWxsIGltcG9ydHMgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlU3BlY2lmaWVyXG4gIHJlbW92ZUFsbEltcG9ydHMobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0b3BMZXZlbFBhdGggb2YgdGhpcy5wcm9ncmFtLmdldCgnYm9keScpKSB7XG4gICAgICBpZiAobWF0Y2hNb2R1bGUodG9wTGV2ZWxQYXRoLCBtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIHRvcExldmVsUGF0aC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJbXBvcnQgdGhlIGdpdmVuIHZhbHVlIChpZiBuZWVkZWQpIGFuZCByZXR1cm4gYW4gSWRlbnRpZmllciByZXByZXNlbnRpbmdcbiAgLy8gaXQuXG4gIGltcG9ydChcbiAgICAvLyB0aGUgc3BvdCBhdCB3aGljaCB5b3Ugd2lsbCBpbnNlcnQgdGhlIElkZW50aWZpZXIgd2UgcmV0dXJuIHRvIHlvdVxuICAgIHRhcmdldDogTm9kZVBhdGg8dC5Ob2RlPixcblxuICAgIC8vIHRoZSBwYXRoIHRvIHRoZSBtb2R1bGUgeW91J3JlIGltcG9ydGluZyBmcm9tXG4gICAgbW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcsXG5cbiAgICAvLyB0aGUgbmFtZSB5b3UncmUgaW1wb3J0aW5nIGZyb20gdGhhdCBtb2R1bGUuIFVzZSBcImRlZmF1bHRcIiBmb3IgdGhlIGRlZmF1bHRcbiAgICAvLyBleHBvcnQuIFVzZSBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZS5cbiAgICBleHBvcnRlZE5hbWU6IHN0cmluZyxcblxuICAgIC8vIE9wdGlvbmFsIGhpbnQgZm9yIGhlbHBpbmcgdXMgcGljayBhIG5hbWUgZm9yIHRoZSBpbXBvcnRlZCBiaW5kaW5nXG4gICAgbmFtZUhpbnQ/OiBzdHJpbmdcbiAgKTogdC5JZGVudGlmaWVyIHtcbiAgICBsZXQgaXNOYW1lc3BhY2VJbXBvcnQgPSBleHBvcnRlZE5hbWUgPT09ICcqJztcbiAgICBsZXQgaXNEZWZhdWx0SW1wb3J0ID0gZXhwb3J0ZWROYW1lID09PSAnZGVmYXVsdCc7XG4gICAgbGV0IGlzTmFtZWRJbXBvcnQgPSAhaXNEZWZhdWx0SW1wb3J0ICYmICFpc05hbWVzcGFjZUltcG9ydDtcbiAgICBsZXQgZGVjbGFyYXRpb24gPSB0aGlzLmZpbmRJbXBvcnRGcm9tKG1vZHVsZVNwZWNpZmllcik7XG4gICAgbGV0IGhhc05hbWVzcGFjZVNwZWNpZmllciA9IGRlY2xhcmF0aW9uPy5ub2RlLnNwZWNpZmllcnMuZmluZChcbiAgICAgIChzKSA9PiBzLnR5cGUgPT09ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInXG4gICAgKTtcbiAgICBsZXQgaGFzTmFtZWRTcGVjaWZpZXJzID0gZGVjbGFyYXRpb24/Lm5vZGUuc3BlY2lmaWVycy5maW5kKChzKSA9PiBzLnR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInKTtcblxuICAgIC8qKlxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5vbi1uYW1lc3BhY2UgaW1wb3J0IGFuZCBhIHRyYW5zZm9ybSB0cmllcyB0byBhZGQgYSBuYW1lc3BhY2UgaW1wb3J0LCBzbyB0aGV5IGRvbid0IGdldCBjb21iaW5lZFxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5hbWVzcGFjZSBpbXBvcnQgYW5kIGEgdHJhbnNmb3JtIHRyaWVzIHRvIGFkZCBhIG5vbi1uYW1lc3BhY2UgaW1wb3J0LCBzbyB0aGV5IGRvbid0IGdldCBjb21iaW5lZFxuICAgICAqIHRoZSBmaWxlIGhhcyBhIHByZWV4aXN0aW5nIG5hbWVzcGFjZSBpbXBvcnQgYW5kIGEgdHJhbnNmb3JtIHRyaWVzIHRvIGFkZCBhIG5hbWVzcGFjZSBpbXBvcnQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbWJpbmVkXG4gICAgICovXG4gICAgbGV0IGNhbm5vdFVzZUV4aXN0aW5nRGVjbGFyYXRpb24gPVxuICAgICAgKGhhc05hbWVkU3BlY2lmaWVycyAmJiBpc05hbWVzcGFjZUltcG9ydCkgfHxcbiAgICAgIChoYXNOYW1lc3BhY2VTcGVjaWZpZXIgJiYgaXNOYW1lZEltcG9ydCkgfHxcbiAgICAgIChoYXNOYW1lc3BhY2VTcGVjaWZpZXIgJiYgaXNOYW1lc3BhY2VJbXBvcnQpO1xuXG4gICAgaWYgKCFjYW5ub3RVc2VFeGlzdGluZ0RlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uKSB7XG4gICAgICBsZXQgc3BlY2lmaWVyID0gZGVjbGFyYXRpb25cbiAgICAgICAgLmdldCgnc3BlY2lmaWVycycpXG4gICAgICAgIC5maW5kKChzcGVjKSA9PiBtYXRjaFNwZWNpZmllcihzcGVjLCBleHBvcnRlZE5hbWUpKTtcbiAgICAgIGlmIChzcGVjaWZpZXIgJiYgdGFyZ2V0LnNjb3BlLmdldEJpbmRpbmcoc3BlY2lmaWVyLm5vZGUubG9jYWwubmFtZSk/LmtpbmQgPT09ICdtb2R1bGUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnQuaWRlbnRpZmllcihzcGVjaWZpZXIubm9kZS5sb2NhbC5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNwZWNpZmllcih0YXJnZXQsIGRlY2xhcmF0aW9uLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRlY2xhcmF0aW9uID0gdGhpcy5pbnNlcnRBZnRlckV4aXN0aW5nSW1wb3J0cyhcbiAgICAgICAgdGhpcy50LmltcG9ydERlY2xhcmF0aW9uKFtdLCB0aGlzLnQuc3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmFkZFNwZWNpZmllcih0YXJnZXQsIGRlY2xhcmF0aW9uLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50KTtcbiAgICB9XG4gIH1cblxuICBpbXBvcnRGb3JTaWRlRWZmZWN0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGRlY2xhcmF0aW9uID0gdGhpcy5maW5kSW1wb3J0RnJvbShtb2R1bGVTcGVjaWZpZXIpO1xuICAgIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICAgIHRoaXMuaW5zZXJ0QWZ0ZXJFeGlzdGluZ0ltcG9ydHMoXG4gICAgICAgIHRoaXMudC5pbXBvcnREZWNsYXJhdGlvbihbXSwgdGhpcy50LnN0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRTcGVjaWZpZXIoXG4gICAgdGFyZ2V0OiBOb2RlUGF0aDx0Lk5vZGU+LFxuICAgIGRlY2xhcmF0aW9uOiBOb2RlUGF0aDx0LkltcG9ydERlY2xhcmF0aW9uPixcbiAgICBleHBvcnRlZE5hbWU6IHN0cmluZyxcbiAgICBuYW1lSGludDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHQuSWRlbnRpZmllciB7XG4gICAgbGV0IGxvY2FsID0gdGhpcy50LmlkZW50aWZpZXIoXG4gICAgICB1bnVzZWROYW1lTGlrZSh0YXJnZXQsIGRlc2lyZWROYW1lKG5hbWVIaW50LCBleHBvcnRlZE5hbWUsIHRhcmdldCkpXG4gICAgKTtcbiAgICBsZXQgc3BlY2lmaWVyID0gdGhpcy5idWlsZFNwZWNpZmllcihleHBvcnRlZE5hbWUsIGxvY2FsKTtcbiAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJykge1xuICAgICAgZGVjbGFyYXRpb24ubm9kZS5zcGVjaWZpZXJzLnVuc2hpZnQoc3BlY2lmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjbGFyYXRpb24ubm9kZS5zcGVjaWZpZXJzLnB1c2goc3BlY2lmaWVyKTtcbiAgICB9XG4gICAgZGVjbGFyYXRpb24uc2NvcGUucmVnaXN0ZXJCaW5kaW5nKFxuICAgICAgJ21vZHVsZScsXG4gICAgICBkZWNsYXJhdGlvbi5nZXQoYHNwZWNpZmllcnMuJHtkZWNsYXJhdGlvbi5ub2RlLnNwZWNpZmllcnMubGVuZ3RoIC0gMX1gKSBhcyBOb2RlUGF0aFxuICAgICk7XG4gICAgcmV0dXJuIGxvY2FsO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwZWNpZmllcihleHBvcnRlZE5hbWU6IHN0cmluZywgbG9jYWxOYW1lOiB0LklkZW50aWZpZXIpIHtcbiAgICBzd2l0Y2ggKGV4cG9ydGVkTmFtZSkge1xuICAgICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICAgIHJldHVybiB0aGlzLnQuaW1wb3J0RGVmYXVsdFNwZWNpZmllcihsb2NhbE5hbWUpO1xuICAgICAgY2FzZSAnKic6XG4gICAgICAgIHJldHVybiB0aGlzLnQuaW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsTmFtZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy50LmltcG9ydFNwZWNpZmllcihsb2NhbE5hbWUsIHRoaXMudC5pZGVudGlmaWVyKGV4cG9ydGVkTmFtZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZEltcG9ydEZyb20obW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpOiBOb2RlUGF0aDx0LkltcG9ydERlY2xhcmF0aW9uPiB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgcGF0aCBvZiB0aGlzLnByb2dyYW0uZ2V0KCdib2R5JykpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGF0aC5pc0ltcG9ydERlY2xhcmF0aW9uKCkgJiZcbiAgICAgICAgcGF0aC5ub2RlLnNvdXJjZS52YWx1ZSA9PT0gbW9kdWxlU3BlY2lmaWVyICYmXG4gICAgICAgIHBhdGgubm9kZS5pbXBvcnRLaW5kICE9PSAndHlwZSdcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0QWZ0ZXJFeGlzdGluZ0ltcG9ydHM8UyBleHRlbmRzIHQuU3RhdGVtZW50PihzdGF0ZW1lbnQ6IFMpOiBOb2RlUGF0aDxTPiB7XG4gICAgbGV0IGxhc3RJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IFtpbmRleCwgbm9kZV0gb2YgdGhpcy5wcm9ncmFtLm5vZGUuYm9keS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHtcbiAgICAgICAgbGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsYXN0SW5kZXggPT0gbnVsbCkge1xuICAgICAgLy8gd2UgYXJlIGludGVudGlvbmFsbHkgbm90IHVzaW5nIGJhYmVsJ3MgY29udGFpbmVyLWF3YXJlIG1ldGhvZHMsIGJlY2F1c2VcbiAgICAgIC8vIHdoaWxlIGluIHRoZW9yeSBpdCdzIG5pY2UgdGhhdCB0aGV5IHNjaGVkdWxlIG90aGVyIHBsdWdpbnMgdG8gcnVuIG9uXG4gICAgICAvLyBvdXIgbm9kZXMsIGluIHByYWN0aWNlIHRob3NlIG5vZGVzIG1pZ2h0IGdldCBtdXRhdGVkIG9yIHJlbW92ZWQgYnkgc29tZVxuICAgICAgLy8gb3RoZXIgcGx1Z2luIGluIHRoZSBpbnRlcnZlbmluZyB0aW1lIGNhdXNpbmcgZmFpbHVyZXMuXG4gICAgICB0aGlzLnByb2dyYW0ubm9kZS5ib2R5LnVuc2hpZnQoc3RhdGVtZW50KTtcbiAgICAgIHJldHVybiB0aGlzLnByb2dyYW0uZ2V0KCdib2R5LjAnKSBhcyBOb2RlUGF0aDxTPjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9ncmFtLm5vZGUuYm9keS5zcGxpY2UobGFzdEluZGV4ICsgMSwgMCwgc3RhdGVtZW50KTtcbiAgICAgIHJldHVybiB0aGlzLnByb2dyYW0uZ2V0KGBib2R5LiR7bGFzdEluZGV4ICsgMX1gKSBhcyBOb2RlUGF0aDxTPjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW51c2VkTmFtZUxpa2UocGF0aDogTm9kZVBhdGg8dC5Ob2RlPiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNhbmRpZGF0ZSA9IG5hbWU7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgd2hpbGUgKHBhdGguc2NvcGUuaGFzQmluZGluZyhjYW5kaWRhdGUpKSB7XG4gICAgY2FuZGlkYXRlID0gYCR7bmFtZX0ke2NvdW50ZXIrK31gO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGU7XG59XG5cbmZ1bmN0aW9uIG5hbWUobm9kZTogdC5TdHJpbmdMaXRlcmFsIHwgdC5JZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGUubmFtZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNpcmVkTmFtZShuYW1lSGludDogc3RyaW5nIHwgdW5kZWZpbmVkLCBleHBvcnRlZE5hbWU6IHN0cmluZywgdGFyZ2V0OiBOb2RlUGF0aDx0Lk5vZGU+KSB7XG4gIGlmIChuYW1lSGludCkge1xuICAgIC8vIGZpcnN0IHdlIG9wcG9ydHVuaXN0aWNhbGx5IGRvIGNhbWVsaXphdGlvbiB3aGVuIGFuIGlsbGVnYWwgY2hhcmFjdGVyIGlzXG4gICAgLy8gZm9sbG93ZWQgYnkgYSBsb3dlcmNhc2UgbGV0dGVyLCBpbiBhbiBlZmZvcnQgdG8gYWlkIHJlYWRhYmlsaXR5IG9mIHRoZVxuICAgIC8vIG91dHB1dC5cbiAgICBsZXQgY2xlYW5lZCA9IG5hbWVIaW50LnJlcGxhY2UoL1teYS16QS1aX10oW2Etel0pL2csIChfbSwgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG4gICAgLy8gdGhlbiB3ZSB1bmxpdGVyYWxseSBzdHJpcCBhbGwgcmVtYWluaW5nIGlsbGVnYWwgY2hhcmFjdGVycy5cbiAgICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9bXmEtekEtWl9dL2csICcnKTtcbiAgICByZXR1cm4gY2xlYW5lZDtcbiAgfVxuICBpZiAoZXhwb3J0ZWROYW1lID09PSAnZGVmYXVsdCcgfHwgZXhwb3J0ZWROYW1lID09PSAnKicpIHtcbiAgICBpZiAodGFyZ2V0LmlzSWRlbnRpZmllcigpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Lm5vZGUubmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRhcmdldC5zY29wZS5nZW5lcmF0ZVVpZElkZW50aWZpZXJCYXNlZE9uTm9kZSh0YXJnZXQubm9kZSkubmFtZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cG9ydGVkTmFtZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFNwZWNpZmllcihzcGVjOiBOb2RlUGF0aDxhbnk+LCBleHBvcnRlZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKGV4cG9ydGVkTmFtZSkge1xuICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgcmV0dXJuIHNwZWMuaXNJbXBvcnREZWZhdWx0U3BlY2lmaWVyKCk7XG4gICAgY2FzZSAnKic6XG4gICAgICByZXR1cm4gc3BlYy5pc0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3BlYy5pc0ltcG9ydFNwZWNpZmllcigpICYmIG5hbWUoc3BlYy5ub2RlLmltcG9ydGVkKSA9PT0gZXhwb3J0ZWROYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoTW9kdWxlKFxuICBwYXRoOiBOb2RlUGF0aDxhbnk+LFxuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZ1xuKTogcGF0aCBpcyBOb2RlUGF0aDx0LkltcG9ydERlY2xhcmF0aW9uPiB7XG4gIHJldHVybiBwYXRoLmlzSW1wb3J0RGVjbGFyYXRpb24oKSAmJiBwYXRoLmdldCgnc291cmNlJykubm9kZS52YWx1ZSA9PT0gbW9kdWxlU3BlY2lmaWVyO1xufVxuIl19
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