vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
146 lines (143 loc) • 22.8 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { loadEnv } from 'vite';
import { DEFAULT_CONFIG } from './defaults.js';
import { getCondition } from './getCondition.js';
import { getNodeEnv } from './getNodeEnv.js';
import { getEnvKey } from '../env/getEnvKey.js';
function setNestedEnv(obj, path, value, verbose = false) {
if (!path.length) return;
const key = path[0];
if (path.length === 1) {
obj[key] = value;
return;
}
if (!obj[key] || typeof obj[key] === "string") {
obj[key] = {};
}
setNestedEnv(obj[key], path.slice(1), value, verbose);
}
function resolveEnv(mode, envDir, prefixes = DEFAULT_CONFIG.ENV_PREFIX) {
const isPrefixesArray = Array.isArray(prefixes);
if (isPrefixesArray && !prefixes.includes(DEFAULT_CONFIG.ENV_PREFIX)) {
prefixes.push(DEFAULT_CONFIG.ENV_PREFIX);
}
const env = loadEnv(mode, envDir, prefixes);
const primaryPrefix = isPrefixesArray ? prefixes[0] : prefixes;
const existingEnv = Object.entries(process.env).reduce(
(acc, [key, value]) => {
if (value && (isPrefixesArray ? prefixes.some((p) => key.startsWith(p)) : key.startsWith(prefixes))) {
acc[key] = value;
}
return acc;
},
{}
);
const mergedEnv = { ...env, ...existingEnv };
const modeKey = getEnvKey("MODE", primaryPrefix);
if (!mergedEnv[modeKey] && process.env[modeKey] == null) {
const modeIndex = process.argv.findIndex((arg) => arg === "--mode");
const isBuild = process.argv.includes("build");
const isPreview = process.argv.includes("preview");
if (modeIndex === -1) {
const inferredMode = isPreview || isBuild ? "production" : "development";
if (inferredMode === "production" && process.env["NODE_ENV"] !== "production") {
console.warn(
`NODE_ENV is not ${inferredMode} (${process.env["NODE_ENV"]}) but ${modeKey} is ${inferredMode}, NODE_ENV takes precedence`
);
mergedEnv[modeKey] = getNodeEnv();
} else if (inferredMode === "development" && process.env["NODE_ENV"] !== "development") {
if (process.env["NODE_ENV"] === "test") {
if (process.env["NODE_ENV"] !== "test") {
console.warn(
`NODE_ENV is not ${inferredMode} (${process.env["NODE_ENV"]}) but ${modeKey} is ${mode}, NODE_ENV takes precedence`
);
}
mergedEnv[modeKey] = "development";
} else {
console.warn(
`NODE_ENV is not ${inferredMode} (${process.env["NODE_ENV"]}) but ${modeKey} is ${mode}, NODE_ENV takes precedence`
);
mergedEnv[modeKey] = getNodeEnv();
}
} else {
mergedEnv[modeKey] = inferredMode;
}
} else {
const modeValue = process.argv[modeIndex + 1];
if (modeValue && !modeValue.startsWith("--")) {
mergedEnv[modeKey] = modeValue;
} else {
mergedEnv[modeKey] = getNodeEnv();
}
}
}
const baseUrlKey = getEnvKey("BASE_URL", primaryPrefix);
const ssrKey = getEnvKey("SSR", primaryPrefix);
const devKey = getEnvKey("DEV", primaryPrefix);
const prodKey = getEnvKey("PROD", primaryPrefix);
const publicOriginKey = getEnvKey("PUBLIC_ORIGIN", primaryPrefix);
if (!mergedEnv[baseUrlKey]) mergedEnv[baseUrlKey] = "/";
if (!mergedEnv[ssrKey])
mergedEnv[ssrKey] = String(
process.argv.includes("--ssr") || getCondition("") === "server"
);
if (!mergedEnv[devKey]) mergedEnv[devKey] = mergedEnv[modeKey] === "development";
if (!mergedEnv[prodKey]) mergedEnv[prodKey] = mergedEnv[modeKey] === "production";
if (!mergedEnv[publicOriginKey]) mergedEnv[publicOriginKey] = "";
if (!Object.keys(mergedEnv).length) return () => {
};
const addedEnv = {};
const exclude = isPrefixesArray ? (key) => !prefixes.some((prefix) => key.startsWith(prefix)) : (key) => !key.startsWith(prefixes);
for (const key in mergedEnv) {
if (exclude(key)) continue;
if (process.env[key] != null) {
continue;
}
process.env[key] = mergedEnv[key];
addedEnv[key] = mergedEnv[key];
}
return createCleanupEnv(addedEnv);
}
function resolveConfigDefine(resolvedConfig, verbose = false) {
const { define } = resolvedConfig;
const addedEnv = {};
const envPrefix = Array.isArray(resolvedConfig.envPrefix) ? resolvedConfig.envPrefix[0] : resolvedConfig.envPrefix;
for (const key in define) {
if (!key || !key.startsWith(`process.env.${envPrefix}`)) continue;
const withoutPrefix = key.split("process.env.")[1];
if (typeof define[key] === "string") {
const path = withoutPrefix.split(".");
setNestedEnv(addedEnv, path, define[key], verbose);
if (!process.env[path[0]]) process.env[path[0]] = {};
setNestedEnv(
process.env[path[0]],
path.slice(1),
define[key],
verbose
);
}
}
return createCleanupEnv(addedEnv);
}
function createCleanupEnv(env) {
return () => {
for (const key in env) {
delete process.env[key];
}
};
}
const getMetaEnv = (env = process.env, prefixes = DEFAULT_CONFIG.ENV_PREFIX) => Object.fromEntries(
Object.entries(env).map(([key, value]) => {
const prefix = Array.isArray(prefixes) ? prefixes.find((prefix2) => key.startsWith(prefix2)) : key.startsWith(prefixes) ? prefixes : void 0;
if (typeof prefix !== "string" || prefix === "") {
return void 0;
}
return [key.slice(prefix.length), value];
}).filter(Array.isArray)
);
export { createCleanupEnv, getMetaEnv, resolveConfigDefine, resolveEnv };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZUVudi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2NvbmZpZy9yZXNvbHZlRW52LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWRFbnYsIHR5cGUgUmVzb2x2ZWRDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZGl0aW9uIH0gZnJvbSBcIi4vZ2V0Q29uZGl0aW9uLmpzXCI7XG5pbXBvcnQgeyBnZXROb2RlRW52IH0gZnJvbSBcIi4vZ2V0Tm9kZUVudi5qc1wiO1xuaW1wb3J0IHsgZ2V0RW52S2V5IH0gZnJvbSBcIi4uL2Vudi9nZXRFbnZLZXkuanNcIjtcblxudHlwZSBOZXN0ZWRFbnYgPSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd24gfCBOZXN0ZWRFbnY7XG59O1xuXG5mdW5jdGlvbiBzZXROZXN0ZWRFbnYob2JqOiBOZXN0ZWRFbnYsIHBhdGg6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nLCB2ZXJib3NlID0gZmFsc2UpIHtcbiAgaWYgKCFwYXRoLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBrZXkgPSBwYXRoWzBdO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghb2JqW2tleV0gfHwgdHlwZW9mIG9ialtrZXldID09PSBcInN0cmluZ1wiKSB7XG4gICAgb2JqW2tleV0gPSB7fTtcbiAgfVxuICBzZXROZXN0ZWRFbnYob2JqW2tleV0gYXMgTmVzdGVkRW52LCBwYXRoLnNsaWNlKDEpLCB2YWx1ZSwgdmVyYm9zZSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgZW52IHRvIHRoZSBwcm9jZXNzLmVudiBkaXJlY3RseSwgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHJlbW92ZSBwcmV2aW91c2x5IGFkZGVkIGVudi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFbnYoXG4gIG1vZGU6IHN0cmluZyxcbiAgZW52RGlyOiBzdHJpbmcsXG4gIHByZWZpeGVzOiBzdHJpbmcgfCBzdHJpbmdbXSA9IERFRkFVTFRfQ09ORklHLkVOVl9QUkVGSVhcbikge1xuICBjb25zdCBpc1ByZWZpeGVzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByZWZpeGVzKTtcbiAgaWYgKGlzUHJlZml4ZXNBcnJheSAmJiAhcHJlZml4ZXMuaW5jbHVkZXMoREVGQVVMVF9DT05GSUcuRU5WX1BSRUZJWCkpIHtcbiAgICBwcmVmaXhlcy5wdXNoKERFRkFVTFRfQ09ORklHLkVOVl9QUkVGSVgpO1xuICB9XG4gIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj4gPSBsb2FkRW52KG1vZGUsIGVudkRpciwgcHJlZml4ZXMpO1xuXG4gIC8vIEdldCB0aGUgcHJpbWFyeSBwcmVmaXggZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzXG4gIGNvbnN0IHByaW1hcnlQcmVmaXggPSBpc1ByZWZpeGVzQXJyYXkgPyBwcmVmaXhlc1swXSA6IHByZWZpeGVzO1xuXG4gIC8vIEZpcnN0LCBjb3B5IGFueSBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBtYXRjaCBvdXIgcHJlZml4ZXNcbiAgY29uc3QgZXhpc3RpbmdFbnYgPSBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikucmVkdWNlKFxuICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAoaXNQcmVmaXhlc0FycmF5XG4gICAgICAgICAgPyBwcmVmaXhlcy5zb21lKChwKSA9PiBrZXkuc3RhcnRzV2l0aChwKSlcbiAgICAgICAgICA6IGtleS5zdGFydHNXaXRoKHByZWZpeGVzKSlcbiAgICAgICkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTtcblxuICAvLyBNZXJnZSBleGlzdGluZyBlbnYgd2l0aCBsb2FkZWQgZW52LCBwcmVmZXJyaW5nIGV4aXN0aW5nIHZhbHVlc1xuICBjb25zdCBtZXJnZWRFbnYgPSB7IC4uLmVudiwgLi4uZXhpc3RpbmdFbnYgfTtcblxuICBjb25zdCBtb2RlS2V5ID0gZ2V0RW52S2V5KFwiTU9ERVwiLCBwcmltYXJ5UHJlZml4KTtcbiAgaWYgKCFtZXJnZWRFbnZbbW9kZUtleV0gJiYgcHJvY2Vzcy5lbnZbbW9kZUtleV0gPT0gbnVsbCkge1xuICAgIGNvbnN0IG1vZGVJbmRleCA9IHByb2Nlc3MuYXJndi5maW5kSW5kZXgoKGFyZykgPT4gYXJnID09PSBcIi0tbW9kZVwiKTtcbiAgICBjb25zdCBpc0J1aWxkID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiYnVpbGRcIik7XG4gICAgY29uc3QgaXNQcmV2aWV3ID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwicHJldmlld1wiKTtcbiAgICBpZiAobW9kZUluZGV4ID09PSAtMSkge1xuICAgICAgY29uc3QgaW5mZXJyZWRNb2RlID0gaXNQcmV2aWV3IHx8IGlzQnVpbGQgPyBcInByb2R1Y3Rpb25cIiA6IFwiZGV2ZWxvcG1lbnRcIjtcbiAgICAgIGlmIChcbiAgICAgICAgaW5mZXJyZWRNb2RlID09PSBcInByb2R1Y3Rpb25cIiAmJlxuICAgICAgICBwcm9jZXNzLmVudltcIk5PREVfRU5WXCJdICE9PSBcInByb2R1Y3Rpb25cIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgTk9ERV9FTlYgaXMgbm90ICR7aW5mZXJyZWRNb2RlfSAoJHtwcm9jZXNzLmVudltcIk5PREVfRU5WXCJdfSkgYnV0ICR7bW9kZUtleX0gaXMgJHtpbmZlcnJlZE1vZGV9LCBOT0RFX0VOViB0YWtlcyBwcmVjZWRlbmNlYFxuICAgICAgICApO1xuICAgICAgICBtZXJnZWRFbnZbbW9kZUtleV0gPSBnZXROb2RlRW52KCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbmZlcnJlZE1vZGUgPT09IFwiZGV2ZWxvcG1lbnRcIiAmJlxuICAgICAgICBwcm9jZXNzLmVudltcIk5PREVfRU5WXCJdICE9PSBcImRldmVsb3BtZW50XCJcbiAgICAgICkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYE5PREVfRU5WIGlzIG5vdCAke2luZmVycmVkTW9kZX0gKCR7cHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXX0pIGJ1dCAke21vZGVLZXl9IGlzICR7bW9kZX0sIE5PREVfRU5WIHRha2VzIHByZWNlZGVuY2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXJnZWRFbnZbbW9kZUtleV0gPSBcImRldmVsb3BtZW50XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYE5PREVfRU5WIGlzIG5vdCAke2luZmVycmVkTW9kZX0gKCR7cHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXX0pIGJ1dCAke21vZGVLZXl9IGlzICR7bW9kZX0sIE5PREVfRU5WIHRha2VzIHByZWNlZGVuY2VgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtZXJnZWRFbnZbbW9kZUtleV0gPSBnZXROb2RlRW52KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZEVudlttb2RlS2V5XSA9IGluZmVycmVkTW9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vZGUgdmFsdWUgaXMgaW4gdGhlIG5leHQgYXJndW1lbnRcbiAgICAgIGNvbnN0IG1vZGVWYWx1ZSA9IHByb2Nlc3MuYXJndlttb2RlSW5kZXggKyAxXTtcbiAgICAgIGlmIChtb2RlVmFsdWUgJiYgIW1vZGVWYWx1ZS5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgbWVyZ2VkRW52W21vZGVLZXldID0gbW9kZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBtb2RlXG4gICAgICAgIG1lcmdlZEVudlttb2RlS2V5XSA9IGdldE5vZGVFbnYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAgIGNvbnN0IGJhc2VVcmxLZXkgPSBnZXRFbnZLZXkoXCJCQVNFX1VSTFwiLCBwcmltYXJ5UHJlZml4KTtcbiAgY29uc3Qgc3NyS2V5ID0gZ2V0RW52S2V5KFwiU1NSXCIsIHByaW1hcnlQcmVmaXgpO1xuICBjb25zdCBkZXZLZXkgPSBnZXRFbnZLZXkoXCJERVZcIiwgcHJpbWFyeVByZWZpeCk7XG4gIGNvbnN0IHByb2RLZXkgPSBnZXRFbnZLZXkoXCJQUk9EXCIsIHByaW1hcnlQcmVmaXgpO1xuICBjb25zdCBwdWJsaWNPcmlnaW5LZXkgPSBnZXRFbnZLZXkoXCJQVUJMSUNfT1JJR0lOXCIsIHByaW1hcnlQcmVmaXgpO1xuXG4gIGlmICghbWVyZ2VkRW52W2Jhc2VVcmxLZXldKSBtZXJnZWRFbnZbYmFzZVVybEtleV0gPSBcIi9cIjtcbiAgaWYgKCFtZXJnZWRFbnZbc3NyS2V5XSlcbiAgICBtZXJnZWRFbnZbc3NyS2V5XSA9IFN0cmluZyhcbiAgICAgIHByb2Nlc3MuYXJndi5pbmNsdWRlcyhcIi0tc3NyXCIpIHx8IGdldENvbmRpdGlvbihcIlwiKSA9PT0gXCJzZXJ2ZXJcIlxuICAgICk7XG4gIGlmICghbWVyZ2VkRW52W2RldktleV0pIG1lcmdlZEVudltkZXZLZXldID0gbWVyZ2VkRW52W21vZGVLZXldID09PSBcImRldmVsb3BtZW50XCI7XG4gIGlmICghbWVyZ2VkRW52W3Byb2RLZXldKSBtZXJnZWRFbnZbcHJvZEtleV0gPSBtZXJnZWRFbnZbbW9kZUtleV0gPT09IFwicHJvZHVjdGlvblwiO1xuICBpZiAoIW1lcmdlZEVudltwdWJsaWNPcmlnaW5LZXldKSBtZXJnZWRFbnZbcHVibGljT3JpZ2luS2V5XSA9IFwiXCI7XG5cbiAgaWYgKCFPYmplY3Qua2V5cyhtZXJnZWRFbnYpLmxlbmd0aCkgcmV0dXJuICgpID0+IHt9O1xuICBjb25zdCBhZGRlZEVudjogTmVzdGVkRW52ID0ge307XG4gIGNvbnN0IGV4Y2x1ZGUgPSBpc1ByZWZpeGVzQXJyYXlcbiAgICA/IChrZXk6IHN0cmluZykgPT4gIXByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICA6IChrZXk6IHN0cmluZykgPT4gIWtleS5zdGFydHNXaXRoKHByZWZpeGVzKTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBtZXJnZWRFbnYpIHtcbiAgICBpZiAoZXhjbHVkZShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAocHJvY2Vzcy5lbnZba2V5XSAhPSBudWxsKSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgYWxyZWFkeSBzZXQgLSBkb24ndCBvdmVycmlkZSBpdCBvciBpbmNsdWRlIGl0IGluIGNsZWFudXBcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudltrZXldID0gbWVyZ2VkRW52W2tleV0gYXMgc3RyaW5nO1xuICAgIGFkZGVkRW52W2tleV0gPSBtZXJnZWRFbnZba2V5XTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2xlYW51cEVudihhZGRlZEVudik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZmlnRGVmaW5lKFxuICByZXNvbHZlZENvbmZpZzogUGljazxSZXNvbHZlZENvbmZpZywgXCJkZWZpbmVcIiB8IFwiZW52UHJlZml4XCI+LFxuICB2ZXJib3NlID0gZmFsc2Vcbikge1xuICBjb25zdCB7IGRlZmluZSB9ID0gcmVzb2x2ZWRDb25maWc7XG4gIGNvbnN0IGFkZGVkRW52OiBOZXN0ZWRFbnYgPSB7fTtcbiAgY29uc3QgZW52UHJlZml4ID0gQXJyYXkuaXNBcnJheShyZXNvbHZlZENvbmZpZy5lbnZQcmVmaXgpXG4gICAgPyByZXNvbHZlZENvbmZpZy5lbnZQcmVmaXhbMF1cbiAgICA6IHJlc29sdmVkQ29uZmlnLmVudlByZWZpeDtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lKSB7XG4gICAgaWYgKCFrZXkgfHwgIWtleS5zdGFydHNXaXRoKGBwcm9jZXNzLmVudi4ke2VudlByZWZpeH1gKSkgY29udGludWU7XG4gICAgY29uc3Qgd2l0aG91dFByZWZpeCA9IGtleS5zcGxpdChcInByb2Nlc3MuZW52LlwiKVsxXTtcbiAgICBpZiAodHlwZW9mIGRlZmluZVtrZXldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBwYXRoID0gd2l0aG91dFByZWZpeC5zcGxpdChcIi5cIik7XG4gICAgICBzZXROZXN0ZWRFbnYoYWRkZWRFbnYsIHBhdGgsIGRlZmluZVtrZXldIGFzIHN0cmluZywgdmVyYm9zZSk7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52W3BhdGhbMF1dKSBwcm9jZXNzLmVudltwYXRoWzBdXSA9IHt9IGFzIG5ldmVyO1xuICAgICAgc2V0TmVzdGVkRW52KFxuICAgICAgICBwcm9jZXNzLmVudltwYXRoWzBdXSBhcyBuZXZlcixcbiAgICAgICAgcGF0aC5zbGljZSgxKSxcbiAgICAgICAgZGVmaW5lW2tleV0gYXMgc3RyaW5nLFxuICAgICAgICB2ZXJib3NlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3JlYXRlQ2xlYW51cEVudihhZGRlZEVudik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGVhbnVwRW52KGVudjogTmVzdGVkRW52KSB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZW52KSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnZba2V5XTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBnZXRNZXRhRW52ID0gKFxuICBlbnYgPSBwcm9jZXNzLmVudixcbiAgcHJlZml4ZXM6IHN0cmluZyB8IHN0cmluZ1tdID0gREVGQVVMVF9DT05GSUcuRU5WX1BSRUZJWFxuKSA9PlxuICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZW52KVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IEFycmF5LmlzQXJyYXkocHJlZml4ZXMpXG4gICAgICAgICAgPyBwcmVmaXhlcy5maW5kKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgICAgOiBrZXkuc3RhcnRzV2l0aChwcmVmaXhlcylcbiAgICAgICAgICA/IHByZWZpeGVzXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcHJlZml4ICE9PSBcInN0cmluZ1wiIHx8IHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCksIHZhbHVlXTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEFycmF5LmlzQXJyYXkpXG4gICk7XG4iXSwibmFtZXMiOlsicHJlZml4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVVBLFNBQVMsWUFBYSxDQUFBLEdBQUEsRUFBZ0IsSUFBZ0IsRUFBQSxLQUFBLEVBQWUsVUFBVSxLQUFPLEVBQUE7QUFDcEYsRUFBSSxJQUFBLENBQUMsS0FBSyxNQUFRLEVBQUE7QUFDbEIsRUFBTSxNQUFBLEdBQUEsR0FBTSxLQUFLLENBQUMsQ0FBQTtBQUVsQixFQUFJLElBQUEsSUFBQSxDQUFLLFdBQVcsQ0FBRyxFQUFBO0FBQ3JCLElBQUEsR0FBQSxDQUFJLEdBQUcsQ0FBSSxHQUFBLEtBQUE7QUFDWCxJQUFBO0FBQUE7QUFFRixF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