Files
012-kaopeilian/frontend/vite.config.ts.timestamp-1758830290264-a627566ebc111.mjs
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

199 lines
18 KiB
JavaScript

var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
}) : x)(function(x) {
if (typeof require !== "undefined") return require.apply(this, arguments);
throw Error('Dynamic require of "' + x + '" is not supported');
});
// vite.config.ts
import { defineConfig, loadEnv } from "file:///app/node_modules/vite/dist/node/index.js";
import vue from "file:///app/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import path from "path";
import { visualizer } from "file:///app/node_modules/rollup-plugin-visualizer/dist/plugin/index.js";
import { createHtmlPlugin } from "file:///app/node_modules/vite-plugin-html/dist/index.mjs";
var __vite_injected_original_dirname = "/app";
var vite_config_default = defineConfig(({ command, mode }) => {
const env = loadEnv(mode, process.cwd(), "");
const isProduction = mode === "production";
return {
plugins: [
vue(),
// HTML 模板处理
createHtmlPlugin({
minify: isProduction,
inject: {
data: {
title: env.VITE_APP_TITLE || "\u8003\u57F9\u7EC3\u7CFB\u7EDF",
description: "\u8003\u57F9\u7EC3\u7CFB\u7EDF - \u667A\u80FD\u5B66\u4E60\u5E73\u53F0"
}
}
}),
// 打包分析(仅在分析模式下)
...process.env.ANALYZE === "true" ? [visualizer({
filename: "dist/stats.html",
open: true,
gzipSize: true,
brotliSize: true
})] : []
].filter(Boolean),
resolve: {
alias: {
"@": path.resolve(__vite_injected_original_dirname, "./src")
}
},
// CSS 配置
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/style/variables.scss";`
}
},
// 生产环境压缩CSS
...isProduction && {
postcss: {
plugins: [
__require("file:///app/node_modules/autoprefixer/lib/autoprefixer.js"),
__require("file:///app/node_modules/cssnano/src/index.js")({
preset: "default"
})
]
}
}
},
// 构建配置
build: {
target: "es2015",
outDir: "dist",
assetsDir: "assets",
sourcemap: !isProduction,
minify: isProduction ? "terser" : false,
// Terser 压缩配置
terserOptions: {
compress: {
drop_console: isProduction,
drop_debugger: isProduction,
pure_funcs: isProduction ? ["console.log", "console.info"] : []
}
},
// 代码分割配置
rollupOptions: {
output: {
// 手动分割代码块
manualChunks: {
// Vue 相关
vue: ["vue", "vue-router", "pinia"],
// UI 库
"element-plus": ["element-plus", "@element-plus/icons-vue"],
// 图表库
echarts: ["echarts"],
// 工具库
utils: ["axios"]
},
// 文件命名
chunkFileNames: "assets/js/[name]-[hash].js",
entryFileNames: "assets/js/[name]-[hash].js",
assetFileNames: (assetInfo) => {
const info = assetInfo.name.split(".");
let extType = info[info.length - 1];
if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
extType = "media";
} else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/i.test(assetInfo.name)) {
extType = "img";
} else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
extType = "fonts";
}
return `assets/${extType}/[name]-[hash].[ext]`;
}
}
},
// 警告大小限制
chunkSizeWarningLimit: 1e3,
// 压缩资源
assetsInlineLimit: 4096
},
// 开发服务器配置
server: {
port: 3001,
host: true,
open: false,
cors: true,
proxy: {
"/api": {
target: env.VITE_API_BASE_URL || "http://localhost:8000",
changeOrigin: true,
rewrite: (path2) => path2,
configure: (proxy, options) => {
proxy.on("proxyRes", (proxyRes, req, res) => {
proxyRes.headers["content-type"] = "application/json; charset=utf-8";
});
}
},
"/ws": {
target: env.VITE_WS_BASE_URL || "ws://localhost:8000",
ws: true,
changeOrigin: true
}
}
},
// 预览服务器配置
preview: {
port: 4173,
host: true,
cors: true
},
// 优化配置
optimizeDeps: {
include: [
"vue",
"vue-router",
"pinia",
"element-plus",
"@element-plus/icons-vue",
"echarts"
],
exclude: ["@vitejs/plugin-vue"]
},
// 测试配置
test: {
environment: "jsdom",
globals: true,
setupFiles: ["./src/test/setup.ts"],
include: ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
exclude: ["node_modules", "dist", ".idea", ".git", ".cache"],
coverage: {
provider: "v8",
reporter: ["text", "json", "html"],
exclude: [
"node_modules/",
"src/test/",
"**/*.d.ts",
"**/*.config.*",
"**/coverage/**",
"**/dist/**",
"**/.{idea,git,cache,output,temp}/**"
],
thresholds: {
global: {
branches: 60,
functions: 60,
lines: 60,
statements: 60
}
}
}
},
// 环境变量配置
define: {
__VUE_OPTIONS_API__: true,
__VUE_PROD_DEVTOOLS__: !isProduction,
__APP_VERSION__: JSON.stringify(process.env.npm_package_version || "1.0.0")
},
// 日志级别
logLevel: isProduction ? "info" : "warn"
};
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvYXBwXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvYXBwL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9hcHAvdml0ZS5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgeyBkZWZpbmVDb25maWcsIGxvYWRFbnYgfSBmcm9tICd2aXRlJ1xuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgdmlzdWFsaXplciB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tdmlzdWFsaXplcidcbmltcG9ydCB7IGNyZWF0ZUh0bWxQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1odG1sJ1xuXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKCh7IGNvbW1hbmQsIG1vZGUgfSkgPT4ge1xuICBjb25zdCBlbnYgPSBsb2FkRW52KG1vZGUsIHByb2Nlc3MuY3dkKCksICcnKVxuICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBtb2RlID09PSAncHJvZHVjdGlvbidcblxuICByZXR1cm4ge1xuICAgIHBsdWdpbnM6IFtcbiAgICAgIHZ1ZSgpLFxuICAgICAgXG4gICAgICAvLyBIVE1MIFx1NkEyMVx1Njc3Rlx1NTkwNFx1NzQwNlxuICAgICAgY3JlYXRlSHRtbFBsdWdpbih7XG4gICAgICAgIG1pbmlmeTogaXNQcm9kdWN0aW9uLFxuICAgICAgICBpbmplY3Q6IHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0aXRsZTogZW52LlZJVEVfQVBQX1RJVExFIHx8ICdcdTgwMDNcdTU3RjlcdTdFQzNcdTdDRkJcdTdFREYnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdcdTgwMDNcdTU3RjlcdTdFQzNcdTdDRkJcdTdFREYgLSBcdTY2N0FcdTgwRkRcdTVCNjZcdTRFNjBcdTVFNzNcdTUzRjAnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gXHU2MjUzXHU1MzA1XHU1MjA2XHU2NzkwXHVGRjA4XHU0RUM1XHU1NzI4XHU1MjA2XHU2NzkwXHU2QTIxXHU1RjBGXHU0RTBCXHVGRjA5XG4gICAgICAuLi4ocHJvY2Vzcy5lbnYuQU5BTFlaRSA9PT0gJ3RydWUnID8gW3Zpc3VhbGl6ZXIoe1xuICAgICAgICBmaWxlbmFtZTogJ2Rpc3Qvc3RhdHMuaHRtbCcsXG4gICAgICAgIG9wZW46IHRydWUsXG4gICAgICAgIGd6aXBTaXplOiB0cnVlLFxuICAgICAgICBicm90bGlTaXplOiB0cnVlXG4gICAgICB9KV0gOiBbXSlcbiAgICBdLmZpbHRlcihCb29sZWFuKSxcblxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgICdAJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ1NTIFx1OTE0RFx1N0Y2RVxuICAgIGNzczoge1xuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xuICAgICAgICBzY3NzOiB7XG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IGBAaW1wb3J0IFwiQC9zdHlsZS92YXJpYWJsZXMuc2Nzc1wiO2BcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFx1NzUxRlx1NEVBN1x1NzNBRlx1NTg4M1x1NTM4Qlx1N0YyOUNTU1xuICAgICAgLi4uKGlzUHJvZHVjdGlvbiAmJiB7XG4gICAgICAgIHBvc3Rjc3M6IHtcbiAgICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgICByZXF1aXJlKCdhdXRvcHJlZml4ZXInKSxcbiAgICAgICAgICAgIHJlcXVpcmUoJ2Nzc25hbm8nKSh7XG4gICAgICAgICAgICAgIHByZXNldDogJ2RlZmF1bHQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgLy8gXHU2Nzg0XHU1RUZBXHU5MTREXHU3RjZFXG4gICAgYnVpbGQ6IHtcbiAgICAgIHRhcmdldDogJ2VzMjAxNScsXG4gICAgICBvdXREaXI6ICdkaXN0JyxcbiAgICAgIGFzc2V0c0RpcjogJ2Fzc2V0cycsXG4gICAgICBzb3VyY2VtYXA6ICFpc1Byb2R1Y3Rpb24sXG4gICAgICBtaW5pZnk6IGlzUHJvZHVjdGlvbiA/ICd0ZXJzZXInIDogZmFsc2UsXG4gICAgICBcbiAgICAgIC8vIFRlcnNlciBcdTUzOEJcdTdGMjlcdTkxNERcdTdGNkVcbiAgICAgIHRlcnNlck9wdGlvbnM6IHtcbiAgICAgICAgY29tcHJlc3M6IHtcbiAgICAgICAgICBkcm9wX2NvbnNvbGU6IGlzUHJvZHVjdGlvbixcbiAgICAgICAgICBkcm9wX2RlYnVnZ2VyOiBpc1Byb2R1Y3Rpb24sXG4gICAgICAgICAgcHVyZV9mdW5jczogaXNQcm9kdWN0aW9uID8gWydjb25zb2xlLmxvZycsICdjb25zb2xlLmluZm8nXSA6IFtdXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIFx1NEVFM1x1NzgwMVx1NTIwNlx1NTI3Mlx1OTE0RFx1N0Y2RVxuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAvLyBcdTYyNEJcdTUyQThcdTUyMDZcdTUyNzJcdTRFRTNcdTc4MDFcdTU3NTdcbiAgICAgICAgICBtYW51YWxDaHVua3M6IHtcbiAgICAgICAgICAgIC8vIFZ1ZSBcdTc2RjhcdTUxNzNcbiAgICAgICAgICAgIHZ1ZTogWyd2dWUnLCAndnVlLXJvdXRlcicsICdwaW5pYSddLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBVSSBcdTVFOTNcbiAgICAgICAgICAgICdlbGVtZW50LXBsdXMnOiBbJ2VsZW1lbnQtcGx1cycsICdAZWxlbWVudC1wbHVzL2ljb25zLXZ1ZSddLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBcdTU2RkVcdTg4NjhcdTVFOTNcbiAgICAgICAgICAgIGVjaGFydHM6IFsnZWNoYXJ0cyddLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBcdTVERTVcdTUxNzdcdTVFOTNcbiAgICAgICAgICAgIHV0aWxzOiBbJ2F4aW9zJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFx1NjU4N1x1NEVGNlx1NTQ3RFx1NTQwRFxuICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiAnYXNzZXRzL2pzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiAnYXNzZXRzL2pzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAoYXNzZXRJbmZvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmZvID0gYXNzZXRJbmZvLm5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgICAgbGV0IGV4dFR5cGUgPSBpbmZvW2luZm8ubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKC9cXC4obXA0fHdlYm18b2dnfG1wM3x3YXZ8ZmxhY3xhYWMpKFxcPy4qKT8kL2kudGVzdChhc3NldEluZm8ubmFtZSkpIHtcbiAgICAgICAgICAgICAgZXh0VHlwZSA9ICdtZWRpYSdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xcLihwbmd8anBlP2d8Z2lmfHN2ZykoXFw/LiopPyQvaS50ZXN0KGFzc2V0SW5mby5uYW1lKSkge1xuICAgICAgICAgICAgICBleHRUeXBlID0gJ2ltZydcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xcLih3b2ZmMj98ZW90fHR0ZnxvdGYpKFxcPy4qKT8kL2kudGVzdChhc3NldEluZm8ubmFtZSkpIHtcbiAgICAgICAgICAgICAgZXh0VHlwZSA9ICdmb250cydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGBhc3NldHMvJHtleHRUeXBlfS9bbmFtZV0tW2hhc2hdLltleHRdYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gXHU4QjY2XHU1NDRBXHU1OTI3XHU1QzBGXHU5NjUwXHU1MjM2XG4gICAgICBjaHVua1NpemVXYXJuaW5nTGltaXQ6IDEwMDAsXG4gICAgICBcbiAgICAgIC8vIFx1NTM4Qlx1N0YyOVx1OEQ0NFx1NkU5MFxuICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IDQwOTZcbiAgICB9LFxuXG4gICAgLy8gXHU1RjAwXHU1M0QxXHU2NzBEXHU1MkExXHU1NjY4XHU5MTREXHU3RjZFXG4gICAgc2VydmVyOiB7XG4gICAgICBwb3J0OiAzMDAxLFxuICAgICAgaG9zdDogdHJ1ZSxcbiAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgY29yczogdHJ1ZSxcbiAgICAgIHByb3h5OiB7XG4gICAgICAgICcvYXBpJzoge1xuICAgICAgICAgIHRhcmdldDogZW52LlZJVEVfQVBJX0JBU0VfVVJMIHx8ICdodHRwOi8vbG9jYWxob3N0OjgwMDAnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgICAgICBjb25maWd1cmU6IChwcm94eSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcHJveHkub24oJ3Byb3h5UmVzJywgKHByb3h5UmVzLCByZXEsIHJlcykgPT4ge1xuICAgICAgICAgICAgICAvLyBcdTc4NkVcdTRGRERcdTRFRTNcdTc0MDZcdTU0Q0RcdTVFOTRcdTZCNjNcdTc4NkVcdThCQkVcdTdGNkUgVVRGLTggXHU3RjE2XHU3ODAxXG4gICAgICAgICAgICAgIHByb3h5UmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJy93cyc6IHtcbiAgICAgICAgICB0YXJnZXQ6IGVudi5WSVRFX1dTX0JBU0VfVVJMIHx8ICd3czovL2xvY2FsaG9zdDo4MDAwJyxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBcdTk4ODRcdTg5QzhcdTY3MERcdTUyQTFcdTU2NjhcdTkxNERcdTdGNkVcbiAgICBwcmV2aWV3OiB7XG4gICAgICBwb3J0OiA0MTczLFxuICAgICAgaG9zdDogdHJ1ZSxcbiAgICAgIGNvcnM6IHRydWVcbiAgICB9LFxuXG4gICAgLy8gXHU0RjE4XHU1MzE2XHU5MTREXHU3RjZFXG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICBpbmNsdWRlOiBbXG4gICAgICAgICd2dWUnLFxuICAgICAgICAndnVlLXJvdXRlcicsXG4gICAgICAgICdwaW5pYScsXG4gICAgICAgICdlbGVtZW50LXBsdXMnLFxuICAgICAgICAnQGVsZW1lbnQtcGx1cy9pY29ucy12dWUnLFxuICAgICAgICAnZWNoYXJ0cydcbiAgICAgIF0sXG4gICAgICBleGNsdWRlOiBbJ0B2aXRlanMvcGx1Z2luLXZ1ZSddXG4gICAgfSxcblxuICAgIC8vIFx1NkQ0Qlx1OEJENVx1OTE0RFx1N0Y2RVxuICAgIHRlc3Q6IHtcbiAgICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgICAgZ2xvYmFsczogdHJ1ZSxcbiAgICAgIHNldHVwRmlsZXM6IFsnLi9zcmMvdGVzdC9zZXR1cC50cyddLFxuICAgICAgaW5jbHVkZTogWydzcmMvKiovKi57dGVzdCxzcGVjfS57anMsbWpzLGNqcyx0cyxtdHMsY3RzLGpzeCx0c3h9J10sXG4gICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcycsICdkaXN0JywgJy5pZGVhJywgJy5naXQnLCAnLmNhY2hlJ10sXG4gICAgICBjb3ZlcmFnZToge1xuICAgICAgICBwcm92aWRlcjogJ3Y4JyxcbiAgICAgICAgcmVwb3J0ZXI6IFsndGV4dCcsICdqc29uJywgJ2h0bWwnXSxcbiAgICAgICAgZXhjbHVkZTogW1xuICAgICAgICAgICdub2RlX21vZHVsZXMvJyxcbiAgICAgICAgICAnc3JjL3Rlc3QvJyxcbiAgICAgICAgICAnKiovKi5kLnRzJyxcbiAgICAgICAgICAnKiovKi5jb25maWcuKicsXG4gICAgICAgICAgJyoqL2NvdmVyYWdlLyoqJyxcbiAgICAgICAgICAnKiovZGlzdC8qKicsXG4gICAgICAgICAgJyoqLy57aWRlYSxnaXQsY2FjaGUsb3V0cHV0LHRlbXB9LyoqJ1xuICAgICAgICBdLFxuICAgICAgICB0aHJlc2hvbGRzOiB7XG4gICAgICAgICAgZ2xvYmFsOiB7XG4gICAgICAgICAgICBicmFuY2hlczogNjAsXG4gICAgICAgICAgICBmdW5jdGlvbnM6IDYwLFxuICAgICAgICAgICAgbGluZXM6IDYwLFxuICAgICAgICAgICAgc3RhdGVtZW50czogNjBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHU5MTREXHU3RjZFXG4gICAgZGVmaW5lOiB7XG4gICAgICBfX1ZVRV9PUFRJT05TX0FQSV9fOiB0cnVlLFxuICAgICAgX19WVUVfUFJPRF9ERVZUT09MU19fOiAhaXNQcm9kdWN0aW9uLFxuICAgICAgX19BUFBfVkVSU0lPTl9fOiBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudi5ucG1fcGFja2FnZV92ZXJzaW9uIHx8ICcxLjAuMCcpXG4gICAgfSxcblxuICAgIC8vIFx1NjVFNVx1NUZEN1x1N0VBN1x1NTIyQlxuICAgIGxvZ0xldmVsOiBpc1Byb2R1Y3Rpb24gPyAnaW5mbycgOiAnd2FybidcbiAgfVxufSkiXSwKICAibWFwcGluZ3MiOiAiOzs7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