vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
94 lines (91 loc) • 14.9 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { join } from 'node:path';
import { lstatSync, readlinkSync, unlinkSync, symlinkSync } from 'node:fs';
import { transportRoot, transportPkgDir } from './transportDir.js';
import { getNodeEnv } from '../config/getNodeEnv.js';
function vitePluginVendorAlias() {
return {
name: "vite-plugin-react-server:vendor-alias",
enforce: "pre",
config(config, _env) {
const pkg = transportPkgDir;
const explicitMode = typeof config.mode === "string" && config.mode !== "" ? config.mode : void 0;
const mode = explicitMode ?? getNodeEnv();
const isProd = mode === "production";
return {
resolve: {
alias: [
// Browser client → ESM for Rollup tree-shaking
{
find: "react-server-dom-esm/client.browser",
replacement: join(pkg, "esm", isProd ? "react-server-dom-esm-client.browser.production.js" : "react-server-dom-esm-client.browser.development.js")
}
]
}
};
},
configResolved(config) {
if (config.command === "serve" && config.server?.fs?.allow) {
if (!config.server.fs.allow.includes(transportRoot)) {
config.server.fs.allow.push(transportRoot);
}
}
ensureVendoredPackageLinked(config.root);
},
resolveId(source) {
if (!source.startsWith("react-server-dom-esm")) return;
if (source === "react-server-dom-esm/client.browser") return;
if (isServerEntry(source)) {
return { id: resolveVendored(source), external: true };
}
return resolveVendored(source);
}
};
}
function ensureVendoredPackageLinked(root) {
const pkg = transportPkgDir;
const target = join(root ?? process.cwd(), "node_modules", "react-server-dom-esm");
try {
const stat = (() => {
try {
return lstatSync(target);
} catch {
return null;
}
})();
if (stat?.isSymbolicLink()) {
if (readlinkSync(target) !== pkg) {
unlinkSync(target);
symlinkSync(pkg, target, "junction");
}
} else if (!stat) {
symlinkSync(pkg, target, "junction");
}
} catch {
}
}
function isServerEntry(source) {
return source.includes("/server") || source.includes("/static");
}
const subpathMap = {
"react-server-dom-esm": "index.js",
"react-server-dom-esm/client": "client.js",
"react-server-dom-esm/client.browser": "client.browser.js",
"react-server-dom-esm/client.node": "client.node.js",
"react-server-dom-esm/server": "server.node.js",
"react-server-dom-esm/server.node": "server.node.js",
"react-server-dom-esm/static": "static.node.js",
"react-server-dom-esm/static.node": "static.node.js"
};
function resolveVendored(source) {
const file = subpathMap[source];
if (file) return join(transportPkgDir, file);
const subpath = source.replace("react-server-dom-esm", "");
return join(transportPkgDir, subpath || "index.js");
}
export { vitePluginVendorAlias };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZG9yLWFsaWFzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vdmVuZG9yL3ZlbmRvci1hbGlhcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgbHN0YXRTeW5jLCByZWFkbGlua1N5bmMsIHN5bWxpbmtTeW5jLCB1bmxpbmtTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRyYW5zcG9ydFBrZ0RpciwgdHJhbnNwb3J0Um9vdCB9IGZyb20gXCIuL3RyYW5zcG9ydERpci5qc1wiO1xuaW1wb3J0IHsgZ2V0Tm9kZUVudiB9IGZyb20gXCIuLi9jb25maWcvZ2V0Tm9kZUVudi5qc1wiO1xuXG4vKipcbiAqIFZpdGUgcGx1Z2luIHRoYXQgYWxpYXNlcyBgcmVhY3Qtc2VydmVyLWRvbS1lc20vKmAgaW1wb3J0cyB0byB0aGUgdmVuZG9yZWRcbiAqIGNvcHkgc2hpcHBlZCB3aXRoIHRoaXMgcGx1Z2luLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIGNvbnN1bWVycyB0b1xuICogaW5zdGFsbCBgcmVhY3Qtc2VydmVyLWRvbS1lc21gIHNlcGFyYXRlbHkgb3IgdXNlIHBhdGNoLXBhY2thZ2UuXG4gKlxuICogQnJvd3NlciBjbGllbnQgZW50cmllcyB1c2UgdHJ1ZSBFU00gZmlsZXMgZm9yIFJvbGx1cCB0cmVlLXNoYWtpbmcuXG4gKiBTZXJ2ZXIvc3RhdGljIGVudHJpZXMgYXJlIENKUyBhbmQgbXVzdCBiZSBsb2FkYWJsZSB2aWEgbmF0aXZlIE5vZGUgaW1wb3J0KClcbiAqIChub3QgZXZhbCdkIGFzIEVTTSBieSBWaXRlJ3MgbW9kdWxlIHJ1bm5lciwgd2hpY2ggbGFja3MgcmVxdWlyZSgpKS5cbiAqXG4gKiBJbiBkZXYgbW9kZSwgd2UgZW5zdXJlIHRoZSB2ZW5kb3JlZCBwYWNrYWdlIGlzIHJlYWNoYWJsZSBmcm9tIG5vZGVfbW9kdWxlc1xuICogc28gVml0ZSdzIG1vZHVsZSBydW5uZXIgY2FuIGV4dGVybmFsaXplIGFuZCBuYXRpdmVseSBpbXBvcnQoKSBDSlMgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpdGVQbHVnaW5WZW5kb3JBbGlhcygpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwidml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyOnZlbmRvci1hbGlhc1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG5cbiAgICBjb25maWcoY29uZmlnLCBfZW52KSB7XG4gICAgICBjb25zdCBwa2cgPSB0cmFuc3BvcnRQa2dEaXI7XG4gICAgICAvLyBQaWNrIHRoZSBkZXYvcHJvZCB2YXJpYW50IG9mIHRoZSBicm93c2VyIGNsaWVudCBmcm9tIHRoZSBTQU1FIHVuaWZpZWRcbiAgICAgIC8vIGBtb2RlYCB0aGF0IGByZXNvbHZlVXNlckNvbmZpZ2AgdXNlcyBmb3IgdGhlIFJlYWN0IGJ1aWxkIGRlZmluZSDigJQgbmV2ZXJcbiAgICAgIC8vIGZyb20gYGVudi5tb2RlYCBhbG9uZS5cbiAgICAgIC8vXG4gICAgICAvLyBgZW52Lm1vZGVgIChjb25maWdFbnYubW9kZSkgaXMgcHJlLXBvcHVsYXRlZCB3aXRoIHRoZSBjb21tYW5kIGRlZmF1bHRcbiAgICAgIC8vIChcInByb2R1Y3Rpb25cIiBmb3IgYHZpdGUgYnVpbGRgLCBcImRldmVsb3BtZW50XCIgZm9yIHNlcnZlKSwgc28gaXQgY2Fubm90XG4gICAgICAvLyBkaXN0aW5ndWlzaCBleHBsaWNpdCB1c2VyIGludGVudC4gVW5kZXIgYE5PREVfRU5WPWRldmVsb3BtZW50IHZpdGVcbiAgICAgIC8vIGJ1aWxkYCBpdCB3b3VsZCBiZSBcInByb2R1Y3Rpb25cIiBhbmQgdGhpcyBhbGlhcyB3b3VsZCBwdWxsIHRoZVxuICAgICAgLy8gUFJPRFVDVElPTiByc2RvbSBicm93c2VyIGNsaWVudCBldmVuIHRob3VnaCBSZWFjdCBpdHNlbGYgYW5kIHRoZSBkZXZcbiAgICAgIC8vIGAucnNjYCBhcmUgZGV2ZWxvcG1lbnQg4oCUIHlpZWxkaW5nIHRoZSBydW50aW1lIGVycm9yIFwiRmFpbGVkIHRvIHJlYWQgYVxuICAgICAgLy8gUlNDIHBheWxvYWQgY3JlYXRlZCBieSBhIGRldmVsb3BtZW50IHZlcnNpb24gb2YgUmVhY3Qgb24gdGhlIHNlcnZlclxuICAgICAgLy8gd2hpbGUgdXNpbmcgYSBwcm9kdWN0aW9uIHZlcnNpb24gb24gdGhlIGNsaWVudC5cIlxuICAgICAgLy9cbiAgICAgIC8vIE1pcnJvciByZXNvbHZlVXNlckNvbmZpZydzIHJ1bGU6IGFuIGV4cGxpY2l0IGBjb25maWcubW9kZWAgKHNldCBvbmx5XG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIHBhc3NlcyBgLS1tb2RlIDxtPmAgb3IgYXV0aG9ycyBgbW9kZWAgaW4gdGhlaXIgY29uZmlnKVxuICAgICAgLy8gd2luczsgb3RoZXJ3aXNlIG1pcnJvciBOT0RFX0VOViAobm9ybWFsaXplZCBieSBnZXROb2RlRW52KS4gVGhpcyBrZWVwc1xuICAgICAgLy8gdGhlIHJzZG9tIGJyb3dzZXIgY2xpZW50J3MgZGV2L3Byb2QgY2hvaWNlIGxvY2tlZCB0byB0aGUgc2FtZSBtb2RlIHRoYXRcbiAgICAgIC8vIHNlbGVjdHMgdGhlIGRldi12cy1wcm9kIFJlYWN0IGJ1aWxkLlxuICAgICAgY29uc3QgZXhwbGljaXRNb2RlID1cbiAgICAgICAgdHlwZW9mIGNvbmZpZy5tb2RlID09PSBcInN0cmluZ1wiICYmIGNvbmZpZy5tb2RlICE9PSBcIlwiXG4gICAgICAgICAgPyBjb25maWcubW9kZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbW9kZSA9IGV4cGxpY2l0TW9kZSA/PyBnZXROb2RlRW52KCk7XG4gICAgICBjb25zdCBpc1Byb2QgPSBtb2RlID09PSBcInByb2R1Y3Rpb25cIjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgIGFsaWFzOiBbXG4gICAgICAgICAgICAvLyBCcm93c2VyIGNsaWVudCDihpIgRVNNIGZvciBSb2xsdXAgdHJlZS1zaGFraW5nXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbmQ6IFwicmVhY3Qtc2VydmVyLWRvbS1lc20vY2xpZW50LmJyb3dzZXJcIixcbiAgICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IGpvaW4ocGtnLCBcImVzbVwiLCBpc1Byb2RcbiAgICAgICAgICAgICAgICA/IFwicmVhY3Qtc2VydmVyLWRvbS1lc20tY2xpZW50LmJyb3dzZXIucHJvZHVjdGlvbi5qc1wiXG4gICAgICAgICAgICAgICAgOiBcInJlYWN0LXNlcnZlci1kb20tZXNtLWNsaWVudC5icm93c2VyLmRldmVsb3BtZW50LmpzXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25maWdSZXNvbHZlZChjb25maWcpIHtcbiAgICAgIC8vIEFsbG93IHNlcnZpbmcgdmVuZG9yZWQgZmlsZXMgd2hlbiB0aGUgcGx1Z2luIGlzIGxpbmtlZCBvciBpbiBhIG1vbm9yZXBvLlxuICAgICAgLy8gTXVzdCBiZSBkb25lIGluIGNvbmZpZ1Jlc29sdmVkIHRvIGFwcGVuZCB0byB0aGUgcmVzb2x2ZWQgYWxsb3cgbGlzdFxuICAgICAgLy8gKHNldHRpbmcgaW4gY29uZmlnIGhvb2sgY2FuIG92ZXJyaWRlIFZpdGUncyBkZWZhdWx0cykuXG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09IFwic2VydmVcIiAmJiBjb25maWcuc2VydmVyPy5mcz8uYWxsb3cpIHtcbiAgICAgICAgaWYgKCFjb25maWcuc2VydmVyLmZzLmFsbG93LmluY2x1ZGVzKHRyYW5zcG9ydFJvb3QpKSB7XG4gICAgICAgICAgY29uZmlnLnNlcnZlci5mcy5hbGxvdy5wdXNoKHRyYW5zcG9ydFJvb3QpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2ZW5kb3JlZCBwYWNrYWdlIGlzIHJlYWNoYWJsZSB2aWEgTm9kZSByZXNvbHV0aW9uIGluIEFMTCBWaXRlXG4gICAgICAvLyBjb250ZXh0cyAoZGV2IHNlcnZlciwgdml0ZXN0LCBTU1Igd29ya2VycywgY3VzdG9tIHNjcmlwdHMpLlxuICAgICAgLy8gVml0ZSdzIG1vZHVsZSBydW5uZXIgcmVzb2x2ZXMgYmFyZSBpbXBvcnRzIHZpYSBOb2RlIOKAlCBub3QgcGx1Z2luIGhvb2tzIOKAlFxuICAgICAgLy8gc28gdGhlIHBhY2thZ2UgbXVzdCBiZSBpbiBub2RlX21vZHVsZXMgZm9yIENKUyBlbnRyaWVzIHRvIHdvcmsuXG4gICAgICBlbnN1cmVWZW5kb3JlZFBhY2thZ2VMaW5rZWQoY29uZmlnLnJvb3QpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSWQoc291cmNlKSB7XG4gICAgICBpZiAoIXNvdXJjZS5zdGFydHNXaXRoKFwicmVhY3Qtc2VydmVyLWRvbS1lc21cIikpIHJldHVybjtcbiAgICAgIGlmIChzb3VyY2UgPT09IFwicmVhY3Qtc2VydmVyLWRvbS1lc20vY2xpZW50LmJyb3dzZXJcIikgcmV0dXJuO1xuXG4gICAgICAvLyBTZXJ2ZXIvc3RhdGljIGVudHJpZXM6IG1hcmsgZXh0ZXJuYWwgc28gdGhlIHJ1bm5lci9idW5kbGVyIHVzZXMgbmF0aXZlXG4gICAgICAvLyBpbXBvcnQoKSByYXRoZXIgdGhhbiBldmFsKCkuIFRoZSByZXNvbHZlZCBwYXRoIHBvaW50cyBpbnRvIHRoZSB2ZW5kb3JlZFxuICAgICAgLy8gY29weSAocmVhY2hhYmxlIHZpYSBzeW1saW5rIGluIGRldiwgZGlyZWN0bHkgaW4gYnVpbGQpLlxuICAgICAgaWYgKGlzU2VydmVyRW50cnkoc291cmNlKSkge1xuICAgICAgICByZXR1cm4geyBpZDogcmVzb2x2ZVZlbmRvcmVkKHNvdXJjZSksIGV4dGVybmFsOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlVmVuZG9yZWQoc291cmNlKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEVuc3VyZSBgbm9kZV9tb2R1bGVzL3JlYWN0LXNlcnZlci1kb20tZXNtYCBsaW5rcyB0byB0aGUgdmVuZG9yZWQgY29weS5cbiAqIE9ubHkgY3JlYXRlcyBhIHN5bWxpbmsgaWYgbm8gcmVhbCBpbnN0YWxsIGV4aXN0cy4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLlxuICovXG5mdW5jdGlvbiBlbnN1cmVWZW5kb3JlZFBhY2thZ2VMaW5rZWQocm9vdD86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBwa2cgPSB0cmFuc3BvcnRQa2dEaXI7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4ocm9vdCA/PyBwcm9jZXNzLmN3ZCgpLCBcIm5vZGVfbW9kdWxlc1wiLCBcInJlYWN0LXNlcnZlci1kb20tZXNtXCIpO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSAoKCkgPT4geyB0cnkgeyByZXR1cm4gbHN0YXRTeW5jKHRhcmdldCk7IH0gY2F0Y2ggeyByZXR1cm4gbnVsbDsgfSB9KSgpO1xuICAgIGlmIChzdGF0Py5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAvLyBVcGRhdGUgc3ltbGluayBpZiBpdCBwb2ludHMgZWxzZXdoZXJlXG4gICAgICBpZiAocmVhZGxpbmtTeW5jKHRhcmdldCkgIT09IHBrZykge1xuICAgICAgICB1bmxpbmtTeW5jKHRhcmdldCk7XG4gICAgICAgIHN5bWxpbmtTeW5jKHBrZywgdGFyZ2V0LCBcImp1bmN0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXN0YXQpIHtcbiAgICAgIC8vIE5vIGV4aXN0aW5nIGZpbGUg4oCUIGNyZWF0ZSBzeW1saW5rXG4gICAgICBzeW1saW5rU3luYyhwa2csIHRhcmdldCwgXCJqdW5jdGlvblwiKTtcbiAgICB9XG4gICAgLy8gSWYgYSByZWFsIGRpcmVjdG9yeS9maWxlIGV4aXN0cyAodXNlciBpbnN0YWxsZWQgaXQpLCBsZWF2ZSBpdCBhbG9uZVxuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tZmF0YWw6IHN5bWxpbmsgY3JlYXRpb24gY2FuIGZhaWwgb24gc29tZSBzeXN0ZW1zXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJFbnRyeShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc291cmNlLmluY2x1ZGVzKFwiL3NlcnZlclwiKSB8fCBzb3VyY2UuaW5jbHVkZXMoXCIvc3RhdGljXCIpO1xufVxuXG5jb25zdCBzdWJwYXRoTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBcInJlYWN0LXNlcnZlci1kb20tZXNtXCI6ICAgICAgICAgICAgICAgIFwiaW5kZXguanNcIixcbiAgXCJyZWFjdC1zZXJ2ZXItZG9tLWVzbS9jbGllbnRcIjogICAgICAgICBcImNsaWVudC5qc1wiLFxuICBcInJlYWN0LXNlcnZlci1kb20tZXNtL2NsaWVudC5icm93c2VyXCI6IFwiY2xpZW50LmJyb3dzZXIuanNcIixcbiAgXCJyZWFjdC1zZXJ2ZXItZG9tLWVzbS9jbGllbnQubm9kZVwiOiAgICBcImNsaWVudC5ub2RlLmpzXCIsXG4gIFwicmVhY3Qtc2VydmVyLWRvbS1lc20vc2VydmVyXCI6ICAgICAgICAgXCJzZXJ2ZXIubm9kZS5qc1wiLFxuICBcInJlYWN0LXNlcnZlci1kb20tZXNtL3NlcnZlci5ub2RlXCI6ICAgIFwic2VydmVyLm5vZGUuanNcIixcbiAgXCJyZWFjdC1zZXJ2ZXItZG9tLWVzbS9zdGF0aWNcIjogICAgICAgICBcInN0YXRpYy5ub2RlLmpzXCIsXG4gIFwicmVhY3Qtc2VydmVyLWRvbS1lc20vc3RhdGljLm5vZGVcIjogICAgXCJzdGF0aWMubm9kZS5qc1wiLFxufTtcblxuZnVuY3Rpb24gcmVzb2x2ZVZlbmRvcmVkKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZmlsZSA9IHN1YnBhdGhNYXBbc291cmNlXTtcbiAgaWYgKGZpbGUpIHJldHVybiBqb2luKHRyYW5zcG9ydFBrZ0RpciwgZmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBzb3VyY2UucmVwbGFjZShcInJlYWN0LXNlcnZlci1kb20tZXNtXCIsIFwiXCIpO1xuICByZXR1cm4gam9pbih0cmFuc3BvcnRQa2dEaXIsIHN1YnBhdGggfHwgXCJpbmRleC5qc1wiKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBa0JPLFNBQVMscUJBQWdDLEdBQUE7QUFDOUMsRUFBTyxPQUFBO0FBQUEsSUFDTCxJQUFNLEVBQUEsdUNBQUE7QUFBQSxJQUNOLE9BQVMsRUFBQSxLQUFBO0FBQUEsSUFFVCxNQUFBLENBQU8sUUFBUSxJQUFNLEVBQUE7QUFDbkIsTUFBQSxNQUFNLEdBQU0sR0FBQSxlQUFBO0FBbUJaLE1BQU0sTUFBQSxZQUFBLEdBQ0osT0FBTyxNQUFPLENBQUEsSUFBQSxLQUFTLFlBQVksTUFBTyxDQUFBLElBQUEsS0FBUyxFQUMvQyxHQUFBLE1BQUEsQ0FBTyxJQUNQLEdBQUEsTUFBQTtBQUNOLE1BQU0sTUFBQSxJQUFBLEdBQU8sZ0JBQWdCLFVBQVcsRUFBQTtBQUN4QyxNQUFBLE1BQU0sU0FBUyxJQUFTLEtBQUEsWUFBQTtBQUV4QixNQUFPLE9BQUE7QUFBQSxRQUNMLE9BQVMsRUFBQTtBQUFBLFVBQ1AsS0FBTyxFQUFBO0FBQUE7QUFBQSxZQUVMO0FBQUEsY0FDRSxJQUFNLEVBQUEscUNBQUE7QUFBQSxjQUNOLGFBQWEsSUFBSyxDQUFBLEdBQUEsRUFBSyxLQUFPLEVBQUEsTUFBQSxHQUMxQixzREFDQSxvREFBb0Q7QUFBQTtBQUMxRDtBQUNGO0FBQ0YsT0FDRjtBQUFBLEtBQ0Y7QUFBQSxJQUVBLGVBQWUsTUFBUSxFQUFBO0FBSXJCLE1BQUEsSUFBSSxPQUFPLE9BQVksS0FBQSxPQUFBLElBQVcsTUFBTyxDQUFBLE1BQUEsRUFBUSxJQUFJLEtBQU8sRUFBQTtBQUMxRCxRQUFBLElBQUksQ0FBQyxNQUFPLENBQUEsTUFBQSxDQUFPLEdBQUcsS0FBTSxDQUFBLFFBQUEsQ0FBUyxhQUFhLENBQUcsRUFBQTtBQUNuRCxVQUFB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