jsii-release
Version:
Release jsii modules to multiple package managers
221 lines • 18.9 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.identify = exports.email = exports.username = exports.checkout = exports.push = exports.tag = exports.init = exports.commit = exports.add = exports.diffIndex = exports.detectSSH = exports.getToken = exports.detectGHE = exports.clone = void 0;
const shell = __importStar(require("./shell"));
/**
* Clones a repository from GitHub. Requires a `GITHUB_TOKEN` env variable.
*
* @param repositoryUrl the repository to clone.
* @param targetDir the clone directory.
*/
function clone(repositoryUrl, targetDir) {
const gitHubUseSsh = detectSSH();
if (gitHubUseSsh) {
const sshRepositoryUrl = repositoryUrl.replace('/', ':');
shell.run(`git clone git@${sshRepositoryUrl}.git ${targetDir}`);
}
else {
const gitHubToken = getToken(detectGHE());
if (!gitHubToken) {
throw new Error('GITHUB_TOKEN env variable is required when GITHUB_USE_SSH env variable is not used');
}
shell.run(`git clone https://${gitHubToken}@${repositoryUrl}.git ${targetDir}`);
}
}
exports.clone = clone;
/**
* Checks if the current environment is an GHE environment.
*
* This check is using GITHUB_API_URL set in GitHub Actions workflow, as well as common gh cli env variables.
* https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
* https://cli.github.com/manual/gh_help_environment
*
* @return - `true` if GH_HOST or GITHUB_API_URL env var are defined and not equal to the public github endpoint, otherwise `false`
*/
function detectGHE() {
const githubApiUrl = process.env.GITHUB_API_URL;
const ghHost = process.env.GH_HOST;
return (Boolean(ghHost) && ghHost.trim().toLowerCase() != 'github.com')
|| (Boolean(githubApiUrl) && githubApiUrl.trim().toLowerCase() != 'https://api.github.com');
}
exports.detectGHE = detectGHE;
/**
* Returns an appropriate github token from the environment.
*
* @return GH_ENTERPRISE_TOKEN or GITHUB_ENTERPRISE_TOKEN or GITHUB_TOKEN if in an GHE environment, otherwise GITHUB_TOKEN
*/
function getToken(isGHE) {
var _a, _b;
if (isGHE) {
const githubEnterpiseToken = (_b = (_a = process.env.GH_ENTERPRISE_TOKEN) !== null && _a !== void 0 ? _a : process.env.GITHUB_ENTERPRISE_TOKEN) !== null && _b !== void 0 ? _b : process.env.GITHUB_TOKEN;
return githubEnterpiseToken;
}
return process.env.GITHUB_TOKEN;
}
exports.getToken = getToken;
/**
* Checks if SSH should be used to clone repo.
* This checks the presence and values of the GIT_USE_SSH env variable and the deprecated GITHUB_USE_SSH for legacy reason. Returns true if either of these env vars are defined and not falsy.
*/
function detectSSH() {
var _a;
return Boolean((_a = process.env.GIT_USE_SSH) !== null && _a !== void 0 ? _a : process.env.GITHUB_USE_SSH);
}
exports.detectSSH = detectSSH;
/**
* Query the git index for changes.
*
* @return True if changes exist, False otherwise.
*/
function diffIndex() {
try {
shell.run('git diff-index --exit-code HEAD --');
return false;
}
catch (err) {
return true;
}
}
exports.diffIndex = diffIndex;
/**
* Add files to the index.
*
* @param p the path.
*/
function add(p) {
shell.run(`git add ${p}`);
}
exports.add = add;
/**
* Commit.
*
* @param message the commit message.
*/
function commit(message) {
shell.run(`git commit -m "${message}"`);
}
exports.commit = commit;
/**
* Initialize a repository.
*/
function init() {
shell.run('git init');
}
exports.init = init;
/**
* Cerate a tag.
*
* @param name tag name.
* @returns true if the tag was created, false if it already exists.
*/
function tag(name) {
try {
shell.run(`git tag -a ${name} -m ${name}`, { capture: true });
return true;
}
catch (e) {
if (e instanceof Error && e.message.includes('already exists')) {
return false;
}
throw e;
}
}
exports.tag = tag;
/**
* Push a ref to origin.
*
* @param ref the ref
*/
function push(ref) {
shell.run(`git push origin ${ref}`);
}
exports.push = push;
/**
* Checkout to a new branch. Creates a new one if `options.createIfMissing` is True and the branch doesn't exist.
*
* @param branch the branch.
* @param options options.
*/
function checkout(branch, options) {
if (options.createIfMissing) {
try {
shell.run(`git show-branch origin/${branch}`, { capture: true });
}
catch (e) {
if (e instanceof Error && e.message.includes('fatal: bad sha1 reference')) {
console.log('Remote branch not found, creating new branch.');
shell.run(`git checkout -B ${branch}`);
return;
}
}
}
shell.run(`git checkout ${branch}`);
}
exports.checkout = checkout;
/**
* Fetch the configured git user name for the current directory.
* Returns undefined if not configured.
*/
function username() {
try {
return shell.run('git config user.name', { capture: true });
}
catch (err) {
if (err instanceof Error) {
console.warn(err.message);
}
return undefined;
}
}
exports.username = username;
/**
* Fetch the configured git user email for the current directory.
* Returns undefined if not configured.
*/
function email() {
try {
return shell.run('git config user.email', { capture: true });
}
catch (err) {
if (err instanceof Error) {
console.warn(err.message);
}
return undefined;
}
}
exports.email = email;
/**
* Identify the committer with a username and email.
*
* @param user the username.
* @param email the email address.
*/
function identify(user, address) {
shell.run(`git config user.name "${user}"`);
shell.run(`git config user.email "${address}"`);
}
exports.identify = identify;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHAvZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQWlDO0FBRWpDOzs7OztHQUtHO0FBQ0gsU0FBZ0IsS0FBSyxDQUFDLGFBQXFCLEVBQUUsU0FBaUI7SUFDNUQsTUFBTSxZQUFZLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDakMsSUFBSSxZQUFZLEVBQUU7UUFDaEIsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RCxLQUFLLENBQUMsR0FBRyxDQUFDLGlCQUFpQixnQkFBZ0IsUUFBUSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ2pFO1NBQU07UUFDTCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztTQUN2RztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMscUJBQXFCLFdBQVcsSUFBSSxhQUFhLFFBQVEsU0FBUyxFQUFFLENBQUMsQ0FBQztLQUVqRjtBQUNILENBQUM7QUFiRCxzQkFhQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsU0FBUztJQUN2QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUVuQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxZQUFZLENBQUM7V0FDbkUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBYSxDQUFDLElBQUksRUFB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ZXMgYSByZXBvc2l0b3J5IGZyb20gR2l0SHViLiBSZXF1aXJlcyBhIGBHSVRIVUJfVE9LRU5gIGVudiB2YXJpYWJsZS5cbiAqXG4gKiBAcGFyYW0gcmVwb3NpdG9yeVVybCB0aGUgcmVwb3NpdG9yeSB0byBjbG9uZS5cbiAqIEBwYXJhbSB0YXJnZXREaXIgdGhlIGNsb25lIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKHJlcG9zaXRvcnlVcmw6IHN0cmluZywgdGFyZ2V0RGlyOiBzdHJpbmcpIHtcbiAgY29uc3QgZ2l0SHViVXNlU3NoID0gZGV0ZWN0U1NIKCk7XG4gIGlmIChnaXRIdWJVc2VTc2gpIHtcbiAgICBjb25zdCBzc2hSZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeVVybC5yZXBsYWNlKCcvJywgJzonKTtcbiAgICBzaGVsbC5ydW4oYGdpdCBjbG9uZSBnaXRAJHtzc2hSZXBvc2l0b3J5VXJsfS5naXQgJHt0YXJnZXREaXJ9YCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2l0SHViVG9rZW4gPSBnZXRUb2tlbihkZXRlY3RHSEUoKSk7XG4gICAgaWYgKCFnaXRIdWJUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHSVRIVUJfVE9LRU4gZW52IHZhcmlhYmxlIGlzIHJlcXVpcmVkIHdoZW4gR0lUSFVCX1VTRV9TU0ggZW52IHZhcmlhYmxlIGlzIG5vdCB1c2VkJyk7XG4gICAgfVxuICAgIHNoZWxsLnJ1bihgZ2l0IGNsb25lIGh0dHBzOi8vJHtnaXRIdWJUb2tlbn1AJHtyZXBvc2l0b3J5VXJsfS5naXQgJHt0YXJnZXREaXJ9YCk7XG5cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhbiBHSEUgZW52aXJvbm1lbnQuXG4gKlxuICogVGhpcyBjaGVjayBpcyB1c2luZyBHSVRIVUJfQVBJX1VSTCBzZXQgaW4gR2l0SHViIEFjdGlvbnMgd29ya2Zsb3csIGFzIHdlbGwgYXMgY29tbW9uIGdoIGNsaSBlbnYgdmFyaWFibGVzLlxuICogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9sZWFybi1naXRodWItYWN0aW9ucy92YXJpYWJsZXMjZGVmYXVsdC1lbnZpcm9ubWVudC12YXJpYWJsZXNcbiAqIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vbWFudWFsL2doX2hlbHBfZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJuIC0gYHRydWVgIGlmIEdIX0hPU1Qgb3IgR0lUSFVCX0FQSV9VUkwgZW52IHZhciBhcmUgZGVmaW5lZCBhbmQgbm90IGVxdWFsIHRvIHRoZSBwdWJsaWMgZ2l0aHViIGVuZHBvaW50LCBvdGhlcndpc2UgYGZhbHNlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0R0hFKCk6IGJvb2xlYW4ge1xuICBjb25zdCBnaXRodWJBcGlVcmwgPSBwcm9jZXNzLmVudi5HSVRIVUJfQVBJX1VSTDtcbiAgY29uc3QgZ2hIb3N0ID0gcHJvY2Vzcy5lbnYuR0hfSE9TVDtcblxuICByZXR1cm4gKEJvb2xlYW4oZ2hIb3N0KSAmJiBnaEhvc3QhLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9ICdnaXRodWIuY29tJylcbiAgICB8fCAoQm9vbGVhbihnaXRodWJBcGlVcmwpICYmIGdpdGh1YkFwaVVybCEudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGdpdGh1YiB0b2tlbiBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmV0dXJuIEdIX0VOVEVSUFJJU0VfVE9LRU4gb3IgR0lUSFVCX0VOVEVSUFJJU0VfVE9LRU4gb3IgR0lUSFVCX1RPS0VOIGlmIGluIGFuIEdIRSBlbnZpcm9ubWVudCwgb3RoZXJ3aXNlIEdJVEhVQl9UT0tFTlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbihpc0dIRTogYm9vbGVhbik6IChzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgaWYgKGlzR0hFKSB7XG4gICAgY29uc3QgZ2l0aHViRW50ZXJwaXNlVG9rZW4gPSBwcm9jZXNzLmVudi5HSF9FTlRFUlBSSVNFX1RPS0VOID8/IHByb2Nlc3MuZW52LkdJVEhVQl9FTlRFUlBSSVNFX1RPS0VOID8/IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbiAgICByZXR1cm4gZ2l0aHViRW50ZXJwaXNlVG9rZW47XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgU1NIIHNob3VsZCBiZSB1c2VkIHRvIGNsb25lIHJlcG8uXG4gKiBUaGlzIGNoZWNrcyB0aGUgcHJlc2VuY2UgYW5kIHZhbHVlcyBvZiB0aGUgR0lUX1VTRV9TU0ggZW52IHZhcmlhYmxlIGFuZCB0aGUgZGVwcmVjYXRlZCBHSVRIVUJfVVNFX1NTSCBmb3IgbGVnYWN5IHJlYXNvbi4gUmV0dXJucyB0cnVlIGlmIGVpdGhlciBvZiB0aGVzZSBlbnYgdmFycyBhcmUgZGVmaW5lZCBhbmQgbm90IGZhbHN5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTU0goKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHByb2Nlc3MuZW52LkdJVF9VU0VfU1NIID8/IHByb2Nlc3MuZW52LkdJVEhVQl9VU0VfU1NIKTtcbn1cblxuLyoqXG4gKiBRdWVyeSB0aGUgZ2l0IGluZGV4IGZvciBjaGFuZ2VzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiBjaGFuZ2VzIGV4aXN0LCBGYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSW5kZXgoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgc2hlbGwucnVuKCdnaXQgZGlmZi1pbmRleCAtLWV4aXQtY29kZSBIRUFEIC0tJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBmaWxlcyB0byB0aGUgaW5kZXguXG4gKlxuICogQHBhcmFtIHAgdGhlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQocDogc3RyaW5nKSB7XG4gIHNoZWxsLnJ1bihgZ2l0IGFkZCAke3B9YCk7XG59XG5cbi8qKlxuICogQ29tbWl0LlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgc2hlbGwucnVuKGBnaXQgY29tbWl0IC1tIFwiJHttZXNzYWdlfVwiYCk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICBzaGVsbC5ydW4oJ2dpdCBpbml0Jyk7XG59XG5cbi8qKlxuICogQ2VyYXRlIGEgdGFnLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRhZyBuYW1lLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFnIHdhcyBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBzaGVsbC5ydW4oYGdpdCB0YWcgLWEgJHtuYW1lfSAtbSAke25hbWV9YCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKipcbiAqIFB1c2ggYSByZWYgdG8gb3JpZ2luLlxuICpcbiAqIEBwYXJhbSByZWYgdGhlIHJlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaChyZWY6IHN0cmluZykge1xuICBzaGVsbC5ydW4oYGdpdCBwdXNoIG9yaWdpbiAke3JlZn1gKTtcbn1cblxuLyoqXG4gKiBDaGVja291dCB0byBhIG5ldyBicmFuY2guIENyZWF0ZXMgYSBuZXcgb25lIGlmIGBvcHRpb25zLmNyZWF0ZUlmTWlzc2luZ2AgaXMgVHJ1ZSBhbmQgdGhlIGJyYW5jaCBkb2Vzbid0IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBicmFuY2ggdGhlIGJyYW5jaC5cbiAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja291dChicmFuY2g6IHN0cmluZywgb3B0aW9uczogeyBjcmVhdGVJZk1pc3Npbmc/OiBib29sZWFuIH0gKSB7XG4gIGlmIChvcHRpb25zLmNyZWF0ZUlmTWlzc2luZykge1xuICAgIHRyeSB7XG4gICAgICBzaGVsbC5ydW4oYGdpdCBzaG93LWJyYW5jaCBvcmlnaW4vJHticmFuY2h9YCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdmYXRhbDogYmFkIHNoYTEgcmVmZXJlbmNlJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW90ZSBicmFuY2ggbm90IGZvdW5kLCBjcmVhdGluZyBuZXcgYnJhbmNoLicpO1xuICAgICAgICBzaGVsbC5ydW4oYGdpdCBjaGVja291dCAtQiAke2JyYW5jaH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzaGVsbC5ydW4oYGdpdCBjaGVja291dCAke2JyYW5jaH1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgY29uZmlndXJlZCBnaXQgdXNlciBuYW1lIGZvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lKCkge1xuICB0cnkge1xuICAgIHJldHVybiBzaGVsbC5ydW4oJ2dpdCBjb25maWcgdXNlci5uYW1lJywgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnIubWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgY29uZmlndXJlZCBnaXQgdXNlciBlbWFpbCBmb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWFpbCgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc2hlbGwucnVuKCdnaXQgY29uZmlnIHVzZXIuZW1haWwnLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIElkZW50aWZ5IHRoZSBjb21taXR0ZXIgd2l0aCBhIHVzZXJuYW1lIGFuZCBlbWFpbC5cbiAqXG4gKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUuXG4gKiBAcGFyYW0gZW1haWwgdGhlIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeSh1c2VyOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZykge1xuICBzaGVsbC5ydW4oYGdpdCBjb25maWcgdXNlci5uYW1lIFwiJHt1c2VyfVwiYCk7XG4gIHNoZWxsLnJ1bihgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiJHthZGRyZXNzfVwiYCk7XG59XG4iXX0=
;