diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 22e61ea..407bdd0 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -63,7 +63,7 @@ export default withMermaid({
},
head: [
- ['link', { rel: 'icon', href: baseUrl + '/images/favicon.png' }]
+ ['link', { rel: 'icon', href: baseUrl + '/images/favicon.svg' }]
],
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
@@ -245,7 +245,11 @@ export default withMermaid({
copyright: 'OpenMCP All rights reserved'
},
+ search: {
+ provider: 'local'
+ },
+
// 左上角的 logo
- logo: '/images/openmcp.png',
+ logo: '/images/favicon.svg',
}
})
diff --git a/.vitepress/config.mts.timestamp-1749066931248-ef28b5e1119c7.mjs b/.vitepress/config.mts.timestamp-1749066931248-ef28b5e1119c7.mjs
deleted file mode 100644
index 223be63..0000000
--- a/.vitepress/config.mts.timestamp-1749066931248-ef28b5e1119c7.mjs
+++ /dev/null
@@ -1,285 +0,0 @@
-// .vitepress/config.mts
-import lightbox from "file:///C:/Users/K/project/openmcp-document/node_modules/vitepress-plugin-lightbox/dist/index.js";
-import { GitChangelog, GitChangelogMarkdownSection } from "file:///C:/Users/K/project/openmcp-document/node_modules/@nolebase/vitepress-plugin-git-changelog/dist/vite/index.mjs";
-import { InlineLinkPreviewElementTransform } from "file:///C:/Users/K/project/openmcp-document/node_modules/@nolebase/vitepress-plugin-inline-link-preview/dist/markdown-it/index.mjs";
-import { ThumbnailHashImages } from "file:///C:/Users/K/project/openmcp-document/node_modules/@nolebase/vitepress-plugin-thumbnail-hash/dist/vite/index.mjs";
-import { BiDirectionalLinks } from "file:///C:/Users/K/project/openmcp-document/node_modules/@nolebase/markdown-it-bi-directional-links/dist/index.mjs";
-import { UnlazyImages } from "file:///C:/Users/K/project/openmcp-document/node_modules/@nolebase/markdown-it-unlazy-img/dist/index.mjs";
-
-// .vitepress/contributors.ts
-var contributors = [
- {
- name: "\u9526\u6062",
- nameAliases: ["LSTM-Kirigaya", "Kirigaya"],
- mapByEmailAliases: ["1193466151@qq.com"],
- links: [{ type: "", link: "https://www.zhihu.com/people/can-meng-zhong-de-che-xian" }]
- },
- {
- name: "PeaceSheep",
- nameAliases: ["li1553770945"],
- avatar: "https://avatars.githubusercontent.com/u/55867654?v=4",
- mapByEmailAliases: ["1553770945@qq.com"],
- links: [{ type: "", link: "https://peacesheep.cn/home" }]
- },
- {
- name: "\u661F\u5F27\u68A6\u5F71",
- nameAliases: ["StarArc"],
- avatar: "https://avatars.githubusercontent.com/u/115577936?v=4",
- mapByEmailAliases: ["3951001763@qq.com"],
- links: [{ type: "", link: "https://b23.tv/bqflzuJ" }]
- }
-];
-
-// .vitepress/config.mts
-import { withMermaid } from "file:///C:/Users/K/project/openmcp-document/node_modules/vitepress-plugin-mermaid/dist/vitepress-plugin-mermaid.es.mjs";
-
-// .vitepress/theme/hook/icons.ts
-var customIcons = {
- share: {
- svg: ''
- },
- bilibili: {
- svg: ''
- },
- blog: {
- svg: ''
- }
-};
-
-// .vitepress/config.mts
-var baseUrl = "/openmcp";
-var config_default = withMermaid({
- title: "OpenMCP",
- description: "\u4E3A\u5F00\u53D1\u8005\u548C\u79D1\u7814\u4EBA\u5458\u51C6\u5907\u7684MCP\u5F00\u53D1\u73AF\u5883\u548CSDK",
- base: baseUrl,
- ignoreDeadLinks: true,
- sitemap: {
- hostname: "https://kirigaya.cn/" + baseUrl
- },
- vite: {
- plugins: [
- GitChangelog({
- // 填写在此处填写您的仓库链接
- repoURL: () => "https://gitea.3geeks.top/kirigaya/openmcp-document",
- mapAuthors: contributors
- }),
- GitChangelogMarkdownSection({
- excludes: ["preview/contributors.md", "index.md"]
- }),
- ThumbnailHashImages()
- ],
- optimizeDeps: {
- include: [
- "mermaid",
- "gsap",
- "gsap/ScrollTrigger"
- ],
- exclude: [
- "@nolebase/vitepress-plugin-inline-link-preview/client"
- ]
- },
- ssr: {
- noExternal: [
- // 如果还有别的解析失败的依赖需要添加的话,并排填写和配置到这里即可 //
- "@nolebase/vitepress-plugin-inline-link-preview",
- "@unlazy/vue"
- ]
- }
- },
- markdown: {
- config: (md) => {
- md.use(lightbox);
- md.use(InlineLinkPreviewElementTransform);
- md.use(BiDirectionalLinks());
- md.use(UnlazyImages(), {
- imgElementTag: "NolebaseUnlazyImg"
- });
- }
- },
- head: [
- ["link", { rel: "icon", href: baseUrl + "/images/favicon.png" }]
- ],
- themeConfig: {
- // https://vitepress.dev/reference/default-theme-config
- nav: [
- { text: "\u9996\u9875", link: "/" },
- {
- text: "\u6559\u7A0B",
- items: [
- {
- component: "KNavItem",
- props: {
- title: "\u7B80\u4ECB",
- description: "\u5173\u4E8E mcp \u548C openmcp\uFF0C\u9601\u4E0B\u9700\u8981\u77E5\u9053\u7684 ...",
- icon: "openmcp",
- link: "/plugin-tutorial/"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "\u5FEB\u901F\u5F00\u59CB",
- description: "\u901A\u8FC7\u4E00\u4E2A\u4F8B\u5B50\u5FEB\u901F\u4E86\u89E3 OpenMCP \u7684\u57FA\u672C\u6982\u5FF5",
- icon: "quick-fill",
- link: "/plugin-tutorial/quick-start/"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "OpenMCP \u4F7F\u7528\u624B\u518C",
- description: "OpenMCP Client \u7684\u57FA\u672C\u4F7F\u7528",
- icon: "shiyongshouce",
- link: "/plugin-tutorial/usage/connect-mcp"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "MCP \u670D\u52A1\u5668\u5F00\u53D1\u6848\u4F8B",
- description: "\u4F7F\u7528\u4E0D\u540C\u8BED\u8A00\u5F00\u53D1\u7684\u4E0D\u540C\u6A21\u5F0F\u7684 MCP \u670D\u52A1\u5668",
- icon: "yibangonggongyusuan",
- link: "/plugin-tutorial/examples/mcp-examples"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "FAQ",
- description: "\u4E3A\u60A8\u7B54\u7591\u89E3\u60D1\uFF0C\u6392\u5FE7\u89E3\u96BE",
- icon: "yijianchuli",
- link: "/plugin-tutorial/faq/help"
- }
- }
- ]
- },
- { text: "SDK", link: "/sdk-tutorial" },
- {
- text: "\u66F4\u591A",
- items: [
- {
- component: "KNavItem",
- props: {
- title: "\u66F4\u65B0\u65E5\u5FD7",
- description: "\u67E5\u770B\u9879\u76EE\u7684\u66F4\u65B0\u5386\u53F2\u8BB0\u5F55",
- icon: "a-yusuan2",
- link: "/preview/changelog"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "\u53C2\u4E0E OpenMCP",
- description: "\u4E86\u89E3\u5982\u4F55\u53C2\u4E0E OpenMCP \u9879\u76EE\u7684\u5F00\u53D1\u548C\u7EF4\u62A4",
- icon: "shujuzhongxin",
- link: "/preview/join"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "OpenMCP \u8D21\u732E\u8005\u5217\u8868",
- description: "\u5173\u4E8E\u53C2\u4E0E OpenMCP \u7684\u8D21\u732E\u8005\u4EEC",
- icon: "heike",
- link: "/preview/contributors"
- }
- },
- {
- component: "KNavItem",
- props: {
- title: "\u8D44\u6E90\u9891\u9053",
- description: "\u83B7\u53D6\u9879\u76EE\u76F8\u5173\u7684\u8D44\u6E90\u548C\u4FE1\u606F",
- icon: "xinxiang",
- link: "/preview/channel"
- }
- }
- ]
- }
- ],
- sidebar: {
- "/plugin-tutorial/": [
- {
- text: "\u7B80\u4ECB",
- items: [
- { text: "OpenMCP \u6982\u8FF0", link: "/plugin-tutorial/index" },
- { text: "\u4EC0\u4E48\u662F MCP\uFF1F", link: "/plugin-tutorial/what-is-mcp" },
- { text: "MCP \u57FA\u7840\u6982\u5FF5", link: "/plugin-tutorial/concept" }
- ]
- },
- {
- text: "\u5FEB\u901F\u5F00\u59CB",
- items: [
- { text: "\u5FEB\u901F\u5F00\u59CB", link: "/plugin-tutorial/quick-start" },
- { text: "\u5B89\u88C5 OpenMCP", link: "/plugin-tutorial/quick-start/acquire-openmcp" },
- { text: "\u4F60\u7684\u7B2C\u4E00\u4E2A MCP", link: "/plugin-tutorial/quick-start/first-mcp" },
- { text: "\u5FEB\u901F\u8C03\u8BD5 MCP", link: "/plugin-tutorial/quick-start/quick-debug" },
- { text: "\u6254\u8FDB\u5927\u6A21\u578B\u91CC\u9762\u6D4B\u6D4B\u597D\u574F\uFF01", link: "/plugin-tutorial/quick-start/put-into-llm" }
- ]
- },
- {
- text: "OpenMCP \u4F7F\u7528\u624B\u518C",
- items: [
- { text: "UI \u914D\u8272", link: "/plugin-tutorial/usage/ui-color" },
- { text: "\u8FDE\u63A5 mcp \u670D\u52A1\u5668", link: "/plugin-tutorial/usage/connect-mcp" },
- { text: "\u8C03\u8BD5 tools, resources \u548C prompts", link: "/plugin-tutorial/usage/debug" },
- { text: "\u8FDE\u63A5\u5927\u6A21\u578B", link: "/plugin-tutorial/usage/connect-llm" },
- { text: "\u7528\u5927\u6A21\u578B\u6D4B\u8BD5\u60A8\u7684 mcp", link: "/plugin-tutorial/usage/test-with-llm" },
- { text: "\u8FDE\u63A5\u591A\u4E2A MCP \u670D\u52A1\u5668", link: "/plugin-tutorial/usage/multi-server" },
- { text: "\u5206\u53D1\u60A8\u7684\u5B9E\u9A8C\u7ED3\u679C", link: "/plugin-tutorial/usage/distribute-result" },
- { text: "SSE \u5728\u7EBF\u90E8\u7F72\u7684\u9274\u6743\u5668\u5B9E\u73B0", link: "/plugin-tutorial/usage/sse-oauth2" }
- ]
- },
- {
- text: "MCP \u670D\u52A1\u5668\u5F00\u53D1\u6848\u4F8B",
- items: [
- { text: "MCP \u670D\u52A1\u5668\u5F00\u53D1\u6848\u4F8B", link: "/plugin-tutorial/examples/mcp-examples" },
- { text: "\u4F8B\u5B50 1. python \u5B9E\u73B0\u5929\u6C14\u4FE1\u606F mcp \u670D\u52A1\u5668 (STDIO)", link: "/plugin-tutorial/examples/python-simple-stdio" },
- { text: "\u4F8B\u5B50 2. go \u5B9E\u73B0 neo4j \u7684\u53EA\u8BFB mcp \u670D\u52A1\u5668 (SSE)", link: "/plugin-tutorial/examples/go-neo4j-sse" },
- { text: "\u4F8B\u5B50 3. java \u5B9E\u73B0\u6587\u6863\u6570\u636E\u5E93\u7684\u53EA\u8BFB mcp (HTTP)", link: "/plugin-tutorial/examples/java-es-http" },
- { text: "\u4F8B\u5B50 4. typescript \u5B9E\u73B0\u57FA\u4E8E crawl4ai \u7684\u8D85\u7EA7\u7F51\u9875\u722C\u866B mcp (STDIO)", link: "/plugin-tutorial/examples/typescript-crawl4ai-stdio" },
- { text: "\u4F8B\u5B50 5. python \u5B9E\u73B0\u8FDB\u884C\u901A\u7528\u8868\u5355\u586B\u5145 \u7684 mcp (STDIO)", link: "/plugin-tutorial/examples/python-form-stdio" },
- { text: "\u4F8B\u5B50 6. python \u5B9E\u73B0\u57FA\u4E8E blender \u7684 mcp (STDIO)", link: "/plugin-tutorial/examples/python-blender-stdio" },
- { text: "\u4F8B\u5B50 7. python \u5B9E\u73B0 cadence EDA \u7684 mcp (STDIO)", link: "/plugin-tutorial/examples/python-cadence-stdio" }
- ]
- },
- {
- text: "FAQ",
- items: [
- { text: "\u5E2E\u52A9", link: "/plugin-tutorial/faq/help" }
- ]
- }
- ],
- "/sdk-tutorial/": [
- {
- text: "\u7B80\u4ECB",
- items: [
- { text: "openmcp-sdk.js", link: "/sdk-tutorial/" }
- ]
- },
- {
- text: "\u57FA\u672C\u4F7F\u7528",
- items: [
- { text: "\u6700\u7B80\u5355\u7684\u5BF9\u8BDD", link: "/sdk-tutorial/usage/greet" },
- { text: "\u4EFB\u52A1\u5FAA\u73AF", link: "/sdk-tutorial/usage/task-loop" },
- { text: "\u591A\u670D\u52A1\u5668\u8FDE\u63A5", link: "/sdk-tutorial/usage/multi-server" }
- ]
- }
- ]
- },
- socialLinks: [
- { icon: "github", link: "https://github.com/LSTM-Kirigaya/openmcp-client" },
- { icon: customIcons.share, link: "https://kirigaya.cn/home" }
- ],
- footer: {
- message: "\u7F29\u77EDLLM\u5230Agent\u7684\u6700\u540E\u4E00\u516C\u91CC",
- copyright: "OpenMCP All rights reserved"
- },
- // 左上角的 logo
- logo: "/images/openmcp.png"
- }
-});
-export {
- baseUrl,
- config_default as default
-};
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLnZpdGVwcmVzcy9jb25maWcubXRzIiwgIi52aXRlcHJlc3MvY29udHJpYnV0b3JzLnRzIiwgIi52aXRlcHJlc3MvdGhlbWUvaG9vay9pY29ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXEtcXFxccHJvamVjdFxcXFxvcGVubWNwLWRvY3VtZW50XFxcXC52aXRlcHJlc3NcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXEtcXFxccHJvamVjdFxcXFxvcGVubWNwLWRvY3VtZW50XFxcXC52aXRlcHJlc3NcXFxcY29uZmlnLm10c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvSy9wcm9qZWN0L29wZW5tY3AtZG9jdW1lbnQvLnZpdGVwcmVzcy9jb25maWcubXRzXCI7aW1wb3J0IGxpZ2h0Ym94IGZyb20gXCJ2aXRlcHJlc3MtcGx1Z2luLWxpZ2h0Ym94XCI7XHJcblxyXG5pbXBvcnQgeyBHaXRDaGFuZ2Vsb2csIEdpdENoYW5nZWxvZ01hcmtkb3duU2VjdGlvbiB9IGZyb20gJ0Bub2xlYmFzZS92aXRlcHJlc3MtcGx1Z2luLWdpdC1jaGFuZ2Vsb2cvdml0ZSc7XHJcbmltcG9ydCB7IElubGluZUxpbmtQcmV2aWV3RWxlbWVudFRyYW5zZm9ybSB9IGZyb20gJ0Bub2xlYmFzZS92aXRlcHJlc3MtcGx1Z2luLWlubGluZS1saW5rLXByZXZpZXcvbWFya2Rvd24taXQnO1xyXG5pbXBvcnQgeyBUaHVtYm5haWxIYXNoSW1hZ2VzIH0gZnJvbSAnQG5vbGViYXNlL3ZpdGVwcmVzcy1wbHVnaW4tdGh1bWJuYWlsLWhhc2gvdml0ZSc7XHJcbmltcG9ydCB7IEJpRGlyZWN0aW9uYWxMaW5rcyB9IGZyb20gJ0Bub2xlYmFzZS9tYXJrZG93bi1pdC1iaS1kaXJlY3Rpb25hbC1saW5rcyc7XHJcbmltcG9ydCB7IFVubGF6eUltYWdlcyB9IGZyb20gJ0Bub2xlYmFzZS9tYXJrZG93bi1pdC11bmxhenktaW1nJztcclxuXHJcbmltcG9ydCB7IGNvbnRyaWJ1dG9ycyB9IGZyb20gJy4vY29udHJpYnV0b3JzJztcclxuaW1wb3J0IHsgd2l0aE1lcm1haWQgfSBmcm9tIFwidml0ZXByZXNzLXBsdWdpbi1tZXJtYWlkXCI7XHJcbmltcG9ydCB7IGN1c3RvbUljb25zIH0gZnJvbSAnLi90aGVtZS9ob29rL2ljb25zJztcclxuXHJcbmV4cG9ydCBjb25zdCBiYXNlVXJsID0gJy9vcGVubWNwJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdpdGhNZXJtYWlkKHtcclxuXHR0aXRsZTogXCJPcGVuTUNQXCIsXHJcblx0ZGVzY3JpcHRpb246IFwiXHU0RTNBXHU1RjAwXHU1M0QxXHU4MDA1XHU1NDhDXHU3OUQxXHU3ODE0XHU0RUJBXHU1NDU4XHU1MUM2XHU1OTA3XHU3Njg0TUNQXHU1RjAwXHU1M0QxXHU3M0FGXHU1ODgzXHU1NDhDU0RLXCIsXHJcblx0YmFzZTogYmFzZVVybCxcclxuXHRpZ25vcmVEZWFkTGlua3M6IHRydWUsXHJcblxyXG5cdHNpdGVtYXA6IHtcclxuXHRcdGhvc3RuYW1lOiAnaHR0cHM6Ly9raXJpZ2F5YS5jbi8nICsgYmFzZVVybFxyXG5cdH0sXHJcblxyXG5cdHZpdGU6IHtcclxuXHRcdHBsdWdpbnM6IFtcclxuXHRcdFx0R2l0Q2hhbmdlbG9nKHtcclxuXHRcdFx0XHQvLyBcdTU4NkJcdTUxOTlcdTU3MjhcdTZCNjRcdTU5MDRcdTU4NkJcdTUxOTlcdTYwQThcdTc2ODRcdTRFRDNcdTVFOTNcdTk0RkVcdTYzQTVcclxuXHRcdFx0XHRyZXBvVVJMOiAoKSA9PiAnaHR0cHM6Ly9naXRlYS4zZ2Vla3MudG9wL2tpcmlnYXlhL29wZW5tY3AtZG9jdW1lbnQnLFxyXG5cdFx0XHRcdG1hcEF1dGhvcnM6IGNvbnRyaWJ1dG9yc1xyXG5cdFx0XHR9KSxcclxuXHRcdFx0R2l0Q2hhbmdlbG9nTWFya2Rvd25TZWN0aW9uKHtcclxuXHRcdFx0XHRleGNsdWRlczogWydwcmV2aWV3L2NvbnRyaWJ1dG9ycy5tZCcsICdpbmRleC5tZCddXHJcblx0XHRcdH0pLFxyXG5cdFx0XHRUaHVtYm5haWxIYXNoSW1hZ2VzKCksXHJcblx0XHRdLFxyXG5cdFx0b3B0aW1pemVEZXBzOiB7XHJcblx0XHRcdGluY2x1ZGU6IFtcclxuXHRcdFx0XHQnbWVybWFpZCcsXHJcbiAgICAgICAgICAgICAgICBcImdzYXBcIixcclxuICAgICAgICAgICAgICAgIFwiZ3NhcC9TY3JvbGxUcmlnZ2VyXCJcclxuXHRcdFx0XSxcclxuXHRcdFx0ZXhjbHVkZTogW1xyXG5cdFx0XHRcdCdAbm9sZWJhc2Uvdml0ZXByZXNzLXBsdWdpbi1pbmxpbmUtbGluay1wcmV2aWV3L2NsaWVudCcsXHJcblx0XHRcdF0sXHJcblx0XHR9LFxyXG5cdFx0c3NyOiB7XHJcblx0XHRcdG5vRXh0ZXJuYWw6IFtcclxuXHRcdFx0XHQvLyBcdTU5ODJcdTY3OUNcdThGRDhcdTY3MDlcdTUyMkJcdTc2ODRcdTg5RTNcdTY3OTBcdTU5MzFcdThEMjVcdTc2ODRcdTRGOURcdThENTZcdTk3MDBcdTg5ODFcdTZERkJcdTUyQTBcdTc2ODRcdThCRERcdUZGMENcdTVFNzZcdTYzOTJcdTU4NkJcdTUxOTlcdTU0OENcdTkxNERcdTdGNkVcdTUyMzBcdThGRDlcdTkxQ0NcdTUzNzNcdTUzRUYgLy9cclxuXHRcdFx0XHQnQG5vbGViYXNlL3ZpdGVwcmVzcy1wbHVnaW4taW5saW5lLWxpbmstcHJldmlldycsXHJcblx0XHRcdFx0J0B1bmxhenkvdnVlJ1xyXG5cdFx0XHRdLFxyXG5cdFx0fSxcclxuXHR9LFxyXG5cclxuXHRtYXJrZG93bjoge1xyXG5cdFx0Y29uZmlnOiAobWQpID0+IHtcclxuXHRcdFx0bWQudXNlKGxpZ2h0Ym94KTtcclxuXHRcdFx0bWQudXNlKElubGluZUxpbmtQcmV2aWV3RWxlbWVudFRyYW5zZm9ybSk7XHJcblx0XHRcdG1kLnVzZShCaURpcmVjdGlvbmFsTGlua3MoKSk7XHJcblx0XHRcdG1kLnVzZShVbmxhenlJbWFnZXMoKSwgeyBcclxuXHRcdFx0XHRpbWdFbGVtZW50VGFnOiAnTm9sZWJhc2VVbmxhenlJbWcnLCBcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0aGVhZDogW1xyXG5cdFx0WydsaW5rJywgeyByZWw6ICdpY29uJywgaHJlZjogYmFzZVVybCArICcvaW1hZ2VzL2Zhdmljb24ucG5nJyB9XVxyXG5cdF0sXHJcblx0dGhlbWVDb25maWc6IHtcclxuXHRcdC8vIGh0dHBzOi8vdml0ZXByZXNzLmRldi9yZWZlcmVuY2UvZGVmYXVsdC10aGVtZS1jb25maWdcclxuXHRcdG5hdjogW1xyXG5cdFx0XHR7IHRleHQ6ICdcdTk5OTZcdTk4NzUnLCBsaW5rOiAnLycgfSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRleHQ6ICdcdTY1NTlcdTdBMEInLFxyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogJ0tOYXZJdGVtJyxcclxuXHRcdFx0XHRcdFx0cHJvcHM6IHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogJ1x1N0I4MFx1NEVDQicsXHJcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdcdTUxNzNcdTRFOEUgbWNwIFx1NTQ4QyBvcGVubWNwXHVGRjBDXHU5NjAxXHU0RTBCXHU5NzAwXHU4OTgxXHU3N0U1XHU5MDUzXHU3Njg0IC4uLicsXHJcblx0XHRcdFx0XHRcdFx0aWNvbjogJ29wZW5tY3AnLFxyXG5cdFx0XHRcdFx0XHRcdGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsLydcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiAnS05hdkl0ZW0nLFxyXG5cdFx0XHRcdFx0XHRwcm9wczoge1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiAnXHU1RkVCXHU5MDFGXHU1RjAwXHU1OUNCJyxcclxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ1x1OTAxQVx1OEZDN1x1NEUwMFx1NEUyQVx1NEY4Qlx1NUI1MFx1NUZFQlx1OTAxRlx1NEU4Nlx1ODlFMyBPcGVuTUNQIFx1NzY4NFx1NTdGQVx1NjcyQ1x1Njk4Mlx1NUZGNScsXHJcblx0XHRcdFx0XHRcdFx0aWNvbjogJ3F1aWNrLWZpbGwnLFxyXG5cdFx0XHRcdFx0XHRcdGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3F1aWNrLXN0YXJ0LydcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiAnS05hdkl0ZW0nLFxyXG5cdFx0XHRcdFx0XHRwcm9wczoge1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiAnT3Blbk1DUCBcdTRGN0ZcdTc1MjhcdTYyNEJcdTUxOEMnLFxyXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAnT3Blbk1DUCBDbGllbnQgXHU3Njg0XHU1N0ZBXHU2NzJDXHU0RjdGXHU3NTI4JyxcclxuXHRcdFx0XHRcdFx0XHRpY29uOiAnc2hpeW9uZ3Nob3VjZScsXHJcblx0XHRcdFx0XHRcdFx0bGluazogJy9wbHVnaW4tdHV0b3JpYWwvdXNhZ2UvY29ubmVjdC1tY3AnXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogJ0tOYXZJdGVtJyxcclxuXHRcdFx0XHRcdFx0cHJvcHM6IHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogJ01DUCBcdTY3MERcdTUyQTFcdTU2NjhcdTVGMDBcdTUzRDFcdTY4NDhcdTRGOEInLFxyXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAnXHU0RjdGXHU3NTI4XHU0RTBEXHU1NDBDXHU4QkVEXHU4QTAwXHU1RjAwXHU1M0QxXHU3Njg0XHU0RTBEXHU1NDBDXHU2QTIxXHU1RjBGXHU3Njg0IE1DUCBcdTY3MERcdTUyQTFcdTU2NjgnLFxyXG5cdFx0XHRcdFx0XHRcdGljb246ICd5aWJhbmdvbmdnb25neXVzdWFuJyxcclxuXHRcdFx0XHRcdFx0XHRsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC9leGFtcGxlcy9tY3AtZXhhbXBsZXMnXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogJ0tOYXZJdGVtJyxcclxuXHRcdFx0XHRcdFx0cHJvcHM6IHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogJ0ZBUScsXHJcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdcdTRFM0FcdTYwQThcdTdCNTRcdTc1OTFcdTg5RTNcdTYwRDFcdUZGMENcdTYzOTJcdTVGRTdcdTg5RTNcdTk2QkUnLFxyXG5cdFx0XHRcdFx0XHRcdGljb246ICd5aWppYW5jaHVsaScsXHJcblx0XHRcdFx0XHRcdFx0bGluazogJy9wbHVnaW4tdHV0b3JpYWwvZmFxL2hlbHAnXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XVxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7IHRleHQ6ICdTREsnLCBsaW5rOiAnL3Nkay10dXRvcmlhbCcgfSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRleHQ6ICdcdTY2RjRcdTU5MUEnLFxyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogJ0tOYXZJdGVtJyxcclxuXHRcdFx0XHRcdFx0cHJvcHM6IHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogJ1x1NjZGNFx1NjVCMFx1NjVFNVx1NUZENycsXHJcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdcdTY3RTVcdTc3MEJcdTk4NzlcdTc2RUVcdTc2ODRcdTY2RjRcdTY1QjBcdTUzODZcdTUzRjJcdThCQjBcdTVGNTUnLFxyXG5cdFx0XHRcdFx0XHRcdGljb246ICdhLXl1c3VhbjInLFxyXG5cdFx0XHRcdFx0XHRcdGxpbms6ICcvcHJldmlldy9jaGFuZ2Vsb2cnXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudDogJ0tOYXZJdGVtJyxcclxuXHRcdFx0XHRcdFx0cHJvcHM6IHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogJ1x1NTNDMlx1NEUwRSBPcGVuTUNQJyxcclxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ1x1NEU4Nlx1ODlFM1x1NTk4Mlx1NEY1NVx1NTNDMlx1NEUwRSBPcGVuTUNQIFx1OTg3OVx1NzZFRVx1NzY4NFx1NUYwMFx1NTNEMVx1NTQ4Q1x1N0VGNFx1NjJBNCcsXHJcblx0XHRcdFx0XHRcdFx0aWNvbjogJ3NodWp1emhvbmd4aW4nLFxyXG5cdFx0XHRcdFx0XHRcdGxpbms6ICcvcHJldmlldy9qb2luJ1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6ICdLTmF2SXRlbScsXHJcblx0XHRcdFx0XHRcdHByb3BzOiB7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6ICdPcGVuTUNQIFx1OEQyMVx1NzMyRVx1ODAwNVx1NTIxN1x1ODg2OCcsXHJcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdcdTUxNzNcdTRFOEVcdTUzQzJcdTRFMEUgT3Blbk1DUCBcdTc2ODRcdThEMjFcdTczMkVcdTgwMDVcdTRFRUMnLFxyXG5cdFx0XHRcdFx0XHRcdGljb246ICdoZWlrZScsXHJcblx0XHRcdFx0XHRcdFx0bGluazogJy9wcmV2aWV3L2NvbnRyaWJ1dG9ycydcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiAnS05hdkl0ZW0nLFxyXG5cdFx0XHRcdFx0XHRwcm9wczoge1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiAnXHU4RDQ0XHU2RTkwXHU5ODkxXHU5MDUzJyxcclxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ1x1ODNCN1x1NTNENlx1OTg3OVx1NzZFRVx1NzZGOFx1NTE3M1x1NzY4NFx1OEQ0NFx1NkU5MFx1NTQ4Q1x1NEZFMVx1NjA2RicsXHJcblx0XHRcdFx0XHRcdFx0aWNvbjogJ3hpbnhpYW5nJyxcclxuXHRcdFx0XHRcdFx0XHRsaW5rOiAnL3ByZXZpZXcvY2hhbm5lbCdcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSxcclxuXHRcdF0sXHJcblxyXG5cdFx0c2lkZWJhcjoge1xyXG5cdFx0XHQnL3BsdWdpbi10dXRvcmlhbC8nOiBbXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGV4dDogJ1x1N0I4MFx1NEVDQicsXHJcblx0XHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdPcGVuTUNQIFx1Njk4Mlx1OEZGMCcsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL2luZGV4JyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRFQzBcdTRFNDhcdTY2MkYgTUNQXHVGRjFGJywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvd2hhdC1pcy1tY3AnIH0sXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ01DUCBcdTU3RkFcdTc4NDBcdTY5ODJcdTVGRjUnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC9jb25jZXB0JyB9XHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0ZXh0OiAnXHU1RkVCXHU5MDFGXHU1RjAwXHU1OUNCJyxcclxuXHRcdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1x1NUZFQlx1OTAxRlx1NUYwMFx1NTlDQicsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3F1aWNrLXN0YXJ0JyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTVCODlcdTg4QzUgT3Blbk1DUCcsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3F1aWNrLXN0YXJ0L2FjcXVpcmUtb3Blbm1jcCcgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU0RjYwXHU3Njg0XHU3QjJDXHU0RTAwXHU0RTJBIE1DUCcsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3F1aWNrLXN0YXJ0L2ZpcnN0LW1jcCcgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU1RkVCXHU5MDFGXHU4QzAzXHU4QkQ1IE1DUCcsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3F1aWNrLXN0YXJ0L3F1aWNrLWRlYnVnJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTYyNTRcdThGREJcdTU5MjdcdTZBMjFcdTU3OEJcdTkxQ0NcdTk3NjJcdTZENEJcdTZENEJcdTU5N0RcdTU3NEZcdUZGMDEnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC9xdWljay1zdGFydC9wdXQtaW50by1sbG0nIH0sXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0ZXh0OiBcIk9wZW5NQ1AgXHU0RjdGXHU3NTI4XHU2MjRCXHU1MThDXCIsXHJcblx0XHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdVSSBcdTkxNERcdTgyNzInLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC91c2FnZS91aS1jb2xvcicgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU4RkRFXHU2M0E1IG1jcCBcdTY3MERcdTUyQTFcdTU2NjgnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC91c2FnZS9jb25uZWN0LW1jcCcgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU4QzAzXHU4QkQ1IHRvb2xzLCByZXNvdXJjZXMgXHU1NDhDIHByb21wdHMnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC91c2FnZS9kZWJ1ZycgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU4RkRFXHU2M0E1XHU1OTI3XHU2QTIxXHU1NzhCJywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvdXNhZ2UvY29ubmVjdC1sbG0nIH0sXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1x1NzUyOFx1NTkyN1x1NkEyMVx1NTc4Qlx1NkQ0Qlx1OEJENVx1NjBBOFx1NzY4NCBtY3AnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC91c2FnZS90ZXN0LXdpdGgtbGxtJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdThGREVcdTYzQTVcdTU5MUFcdTRFMkEgTUNQIFx1NjcwRFx1NTJBMVx1NTY2OCcsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL3VzYWdlL211bHRpLXNlcnZlcicgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU1MjA2XHU1M0QxXHU2MEE4XHU3Njg0XHU1QjlFXHU5QThDXHU3RUQzXHU2NzlDJywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvdXNhZ2UvZGlzdHJpYnV0ZS1yZXN1bHQnIH0sXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1NTRSBcdTU3MjhcdTdFQkZcdTkwRThcdTdGNzJcdTc2ODRcdTkyNzRcdTY3NDNcdTU2NjhcdTVCOUVcdTczQjAnLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC91c2FnZS9zc2Utb2F1dGgyJyB9LFxyXG5cdFx0XHRcdFx0XVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGV4dDogXCJNQ1AgXHU2NzBEXHU1MkExXHU1NjY4XHU1RjAwXHU1M0QxXHU2ODQ4XHU0RjhCXCIsXHJcblx0XHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdNQ1AgXHU2NzBEXHU1MkExXHU1NjY4XHU1RjAwXHU1M0QxXHU2ODQ4XHU0RjhCJywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvZXhhbXBsZXMvbWNwLWV4YW1wbGVzJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRGOEJcdTVCNTAgMS4gcHl0aG9uIFx1NUI5RVx1NzNCMFx1NTkyOVx1NkMxNFx1NEZFMVx1NjA2RiBtY3AgXHU2NzBEXHU1MkExXHU1NjY4IChTVERJTyknLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC9leGFtcGxlcy9weXRob24tc2ltcGxlLXN0ZGlvJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRGOEJcdTVCNTAgMi4gZ28gXHU1QjlFXHU3M0IwIG5lbzRqIFx1NzY4NFx1NTNFQVx1OEJGQiBtY3AgXHU2NzBEXHU1MkExXHU1NjY4IChTU0UpJywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvZXhhbXBsZXMvZ28tbmVvNGotc3NlJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRGOEJcdTVCNTAgMy4gamF2YSBcdTVCOUVcdTczQjBcdTY1ODdcdTY4NjNcdTY1NzBcdTYzNkVcdTVFOTNcdTc2ODRcdTUzRUFcdThCRkIgbWNwIChIVFRQKScsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL2V4YW1wbGVzL2phdmEtZXMtaHR0cCcgfSxcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU0RjhCXHU1QjUwIDQuIHR5cGVzY3JpcHQgXHU1QjlFXHU3M0IwXHU1N0ZBXHU0RThFIGNyYXdsNGFpIFx1NzY4NFx1OEQ4NVx1N0VBN1x1N0Y1MVx1OTg3NVx1NzIyQ1x1ODY2QiBtY3AgKFNURElPKScsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL2V4YW1wbGVzL3R5cGVzY3JpcHQtY3Jhd2w0YWktc3RkaW8nIH0sXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1x1NEY4Qlx1NUI1MCA1LiBweXRob24gXHU1QjlFXHU3M0IwXHU4RkRCXHU4ODRDXHU5MDFBXHU3NTI4XHU4ODY4XHU1MzU1XHU1ODZCXHU1MTQ1IFx1NzY4NCBtY3AgKFNURElPKScsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL2V4YW1wbGVzL3B5dGhvbi1mb3JtLXN0ZGlvJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRGOEJcdTVCNTAgNi4gcHl0aG9uIFx1NUI5RVx1NzNCMFx1NTdGQVx1NEU4RSBibGVuZGVyIFx1NzY4NCBtY3AgKFNURElPKScsIGxpbms6ICcvcGx1Z2luLXR1dG9yaWFsL2V4YW1wbGVzL3B5dGhvbi1ibGVuZGVyLXN0ZGlvJyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRGOEJcdTVCNTAgNy4gcHl0aG9uIFx1NUI5RVx1NzNCMCBjYWRlbmNlIEVEQSBcdTc2ODQgbWNwIChTVERJTyknLCBsaW5rOiAnL3BsdWdpbi10dXRvcmlhbC9leGFtcGxlcy9weXRob24tY2FkZW5jZS1zdGRpbycgfSxcclxuXHRcdFx0XHRcdF1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHRleHQ6ICdGQVEnLFxyXG5cdFx0XHRcdFx0aXRlbXM6IFtcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnXHU1RTJFXHU1MkE5JywgbGluazogJy9wbHVnaW4tdHV0b3JpYWwvZmFxL2hlbHAnIH0sXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRdLFxyXG5cclxuXHRcdFx0Jy9zZGstdHV0b3JpYWwvJzogW1xyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHRleHQ6ICdcdTdCODBcdTRFQ0InLFxyXG5cdFx0XHRcdFx0aXRlbXM6IFtcclxuXHRcdFx0XHRcdFx0eyB0ZXh0OiAnb3Blbm1jcC1zZGsuanMnLCBsaW5rOiAnL3Nkay10dXRvcmlhbC8nIH0sXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0ZXh0OiAnXHU1N0ZBXHU2NzJDXHU0RjdGXHU3NTI4JyxcclxuXHRcdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1x1NjcwMFx1N0I4MFx1NTM1NVx1NzY4NFx1NUJGOVx1OEJERCcsIGxpbms6ICcvc2RrLXR1dG9yaWFsL3VzYWdlL2dyZWV0JyB9LFxyXG5cdFx0XHRcdFx0XHR7IHRleHQ6ICdcdTRFRkJcdTUyQTFcdTVGQUFcdTczQUYnLCBsaW5rOiAnL3Nkay10dXRvcmlhbC91c2FnZS90YXNrLWxvb3AnIH0sXHJcblx0XHRcdFx0XHRcdHsgdGV4dDogJ1x1NTkxQVx1NjcwRFx1NTJBMVx1NTY2OFx1OEZERVx1NjNBNScsIGxpbms6ICcvc2RrLXR1dG9yaWFsL3VzYWdlL211bHRpLXNlcnZlcicgfSxcclxuXHRcdFx0XHRcdF1cclxuXHRcdFx0XHR9XHJcblx0XHRcdF1cclxuXHRcdH0sXHJcblxyXG5cdFx0c29jaWFsTGlua3M6IFtcclxuXHRcdFx0eyBpY29uOiAnZ2l0aHViJywgbGluazogJ2h0dHBzOi8vZ2l0aHViLmNvbS9MU1RNLUtpcmlnYXlhL29wZW5tY3AtY2xpZW50JyB9LFxyXG5cdFx0XHR7IGljb246IGN1c3RvbUljb25zLnNoYXJlLCBsaW5rOiAnaHR0cHM6Ly9raXJpZ2F5YS5jbi9ob21lJyB9LFxyXG5cdFx0XSxcclxuXHJcblx0XHRmb290ZXI6IHtcclxuXHRcdFx0bWVzc2FnZTogJ1x1N0YyOVx1NzdFRExMTVx1NTIzMEFnZW50XHU3Njg0XHU2NzAwXHU1NDBFXHU0RTAwXHU1MTZDXHU5MUNDJyxcclxuXHRcdFx0Y29weXJpZ2h0OiAnT3Blbk1DUCBBbGwgcmlnaHRzIHJlc2VydmVkJ1xyXG5cdFx0fSxcclxuXHJcblx0XHQvLyBcdTVERTZcdTRFMEFcdTg5RDJcdTc2ODQgbG9nb1xyXG5cdFx0bG9nbzogJy9pbWFnZXMvb3Blbm1jcC5wbmcnLFxyXG5cdH1cclxufSlcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxLXFxcXHByb2plY3RcXFxcb3Blbm1jcC1kb2N1bWVudFxcXFwudml0ZXByZXNzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxLXFxcXHByb2plY3RcXFxcb3Blbm1jcC1kb2N1bWVudFxcXFwudml0ZXByZXNzXFxcXGNvbnRyaWJ1dG9ycy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvSy9wcm9qZWN0L29wZW5tY3AtZG9jdW1lbnQvLnZpdGVwcmVzcy9jb250cmlidXRvcnMudHNcIjtpbnRlcmZhY2UgU29jaWFsRW50cnkge1xyXG4gICAgdHlwZTogJ2dpdGh1YicgfCAndHdpdHRlcicgfCAnZW1haWwnIHwgc3RyaW5nO1xyXG4gICAgbGluazogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ29udHJpYnV0b3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3ZlcnJpZGluZyBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbnRyaWJ1dG9yIGluIGRlZmF1bHQgbG9jYWxlXHJcbiAgICAgKi9cclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdmVycmlkaW5nIGRpc3BsYXkgbmFtZSBvZiB0aGUgY29udHJpYnV0b3IgaW4gb3RoZXIgbG9jYWxlcyBpZiBuZWVkZWRcclxuICAgICAqL1xyXG4gICAgaTE4bj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdmVycmlkaW5nIEdpdEh1YiwgR2l0TGFiLCBHaXRlYSB1c2VybmFtZSBvZiB0aGUgY29udHJpYnV0b3JcclxuICAgICAqL1xyXG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdmVycmlkaW5nIGF2YXRhciBvZiB0aGUgY29udHJpYnV0b3JcclxuICAgICAqL1xyXG4gICAgYXZhdGFyPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRvIGFkZCBhIGxpbmsgdG8gdGhlIGNvbnRyaWJ1dG9yJ3MgcHJvZmlsZVxyXG4gICAgICovXHJcbiAgICBsaW5rcz86IHN0cmluZyB8IFNvY2lhbEVudHJ5W107XHJcbiAgICAvKipcclxuICAgICAqIE1vcmUgbmFtZXMgdG8gYmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBjb250cmlidXRvci5cclxuICAgICAqXHJcbiAgICAgKiBVc2VmdWwgd2hlbiB5b3UgY2hhbmdlZCB5b3VyIG5hbWUgb3IgZW1haWwgYWRkcmVzcyBpbiB0aGUgcGFzdC5cclxuICAgICAqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYG1hcEJ5TmFtZUFsaWFzZXNgIGluc3RlYWRcclxuICAgICAqIEBzZWUgbWFwQnlOYW1lQWxpYXNlc1xyXG4gICAgICovXHJcbiAgICBuYW1lQWxpYXNlcz86IHN0cmluZ1tdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNb3JlIG5hbWVzIHRvIGJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgY29udHJpYnV0b3IuXHJcbiAgICAgKlxyXG4gICAgICogVXNlZnVsIHdoZW4geW91IGNoYW5nZWQgeW91ciBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgaW4gdGhlIHBhc3QuXHJcbiAgICAgKi9cclxuICAgIG1hcEJ5TmFtZUFsaWFzZXM/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogTW9yZSBlbWFpbHMgdG8gYmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBjb250cmlidXRvci5cclxuICAgICAqXHJcbiAgICAgKiBVc2VmdWwgd2hlbiB5b3UgY2hhbmdlZCB5b3VyIGVtYWlsIGFkZHJlc3MgaW4gdGhlIHBhc3QuXHJcbiAgICAgKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBtYXBCeUVtYWlsQWxpYXNlc2AgaW5zdGVhZFxyXG4gICAgICogQHNlZSBtYXBCeUVtYWlsQWxpYXNlc1xyXG4gICAgICovXHJcbiAgICBlbWFpbEFsaWFzZXM/OiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogTW9yZSBlbWFpbHMgdG8gYmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBjb250cmlidXRvci5cclxuICAgICAqXHJcbiAgICAgKiBVc2VmdWwgd2hlbiB5b3UgY2hhbmdlZCB5b3VyIGVtYWlsIGFkZHJlc3MgaW4gdGhlIHBhc3QuXHJcbiAgICAgKi9cclxuICAgIG1hcEJ5RW1haWxBbGlhc2VzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb250cmlidXRvcnMgPSBbXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogJ1x1OTUyNlx1NjA2MicsXHJcbiAgICAgICAgbmFtZUFsaWFzZXM6IFsnTFNUTS1LaXJpZ2F5YScsICdLaXJpZ2F5YSddLFxyXG4gICAgICAgIG1hcEJ5RW1haWxBbGlhc2VzOiBbJzExOTM0NjYxNTFAcXEuY29tJ10sXHJcbiAgICAgICAgbGlua3M6IFt7IHR5cGU6ICcnLCBsaW5rOiAnaHR0cHM6Ly93d3cuemhpaHUuY29tL3Blb3BsZS9jYW4tbWVuZy16aG9uZy1kZS1jaGUteGlhbicgfV1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogJ1BlYWNlU2hlZXAnLFxyXG4gICAgICAgIG5hbWVBbGlhc2VzOiBbJ2xpMTU1Mzc3MDk0NSddLFxyXG4gICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS81NTg2NzY1ND92PTQnLFxyXG4gICAgICAgIG1hcEJ5RW1haWxBbGlhc2VzOiBbJzE1NTM3NzA5NDVAcXEuY29tJ10sXHJcbiAgICAgICAgbGlua3M6IFt7IHR5cGU6ICcnLCBsaW5rOiAnaHR0cHM6Ly9wZWFjZXNoZWVwLmNuL2hvbWUnIH1dXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIG5hbWU6ICdcdTY2MUZcdTVGMjdcdTY4QTZcdTVGNzEnLFxyXG4gICAgICAgIG5hbWVBbGlhc2VzOiBbJ1N0YXJBcmMnXSxcclxuICAgICAgICBhdmF0YXI6ICdodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE1NTc3OTM2P3Y9NCcsXHJcbiAgICAgICAgbWFwQnlFbWFpbEFsaWFzZXM6IFsnMzk1MTAwMTc2M0BxcS5jb20nXSxcclxuICAgICAgICBsaW5rczogW3sgdHlwZTogJycsIGxpbms6ICdodHRwczovL2IyMy50di9icWZsenVKJyB9XVxyXG4gICAgfVxyXG5dIGFzIENvbnRyaWJ1dG9yW107IiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxLXFxcXHByb2plY3RcXFxcb3Blbm1jcC1kb2N1bWVudFxcXFwudml0ZXByZXNzXFxcXHRoZW1lXFxcXGhvb2tcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXEtcXFxccHJvamVjdFxcXFxvcGVubWNwLWRvY3VtZW50XFxcXC52aXRlcHJlc3NcXFxcdGhlbWVcXFxcaG9va1xcXFxpY29ucy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvSy9wcm9qZWN0L29wZW5tY3AtZG9jdW1lbnQvLnZpdGVwcmVzcy90aGVtZS9ob29rL2ljb25zLnRzXCI7ZXhwb3J0IGNvbnN0IGN1c3RvbUljb25zID0ge1xyXG5cdHNoYXJlOiB7XHJcblx0XHRzdmc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCJNMTggMTYuMDhjLS43NiAwLTEuNDQuMy0xLjk2Ljc3TDguOTEgMTIuN2MuMDUtLjIzLjA5LS40Ni4wOS0uN3MtLjA0LS40Ny0uMDktLjdsNy4wNS00LjExYy41NC41IDEuMjUuODEgMi4wNC44MSAxLjY2IDAgMy0xLjM0IDMtM3MtMS4zNC0zLTMtMy0zIDEuMzQtMyAzYzAgLjI0LjA0LjQ3LjA5LjdMOC4wNCA5LjgxQzcuNSA5LjMxIDYuNzkgOSA2IDljLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDNjLjc5IDAgMS41LS4zMSAyLjA0LS44MWw3LjEyIDQuMTZjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42MSAxLjMxIDIuOTIgMi45MiAyLjkyIDEuNjEgMCAyLjkyLTEuMzEgMi45Mi0yLjkycy0xLjMxLTIuOTItMi45Mi0yLjkyelwiLz48L3N2Zz4nXHJcblx0fSxcclxuICAgIGJpbGliaWxpOiB7XHJcbiAgICAgICAgc3ZnOiAnPHN2ZyB0PVwiMTc0ODU4NDgyNzA3MlwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiNTA0MFwiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMjAwXCI+PHBhdGggZD1cIk03NzcuNTE0NjY3IDEzMS42NjkzMzNhNTMuMzMzMzMzIDUzLjMzMzMzMyAwIDAgMSAwIDc1LjQzNDY2N0w3MjguNzQ2NjY3IDI1NS44MjkzMzNoNDkuOTJBMTYwIDE2MCAwIDAgMSA5MzguNjY2NjY3IDQxNS44NzJ2MzIwYTE2MCAxNjAgMCAwIDEtMTYwIDE2MEgyNDUuMzMzMzMzQTE2MCAxNjAgMCAwIDEgODUuMzMzMzMzIDczNS44NzJ2LTMyMGExNjAgMTYwIDAgMCAxIDE2MC0xNjBoNDkuNzQ5MzM0TDI0Ni40IDIwNy4xNDY2NjdhNTMuMzMzMzMzIDUzLjMzMzMzMyAwIDEgMSA3NS4zOTItNzUuNDM0NjY3bDExMy4xNTIgMTEzLjE1MmMzLjM3MDY2NyAzLjM3MDY2NyA2LjE4NjY2NyA3LjA0IDguNDQ4IDEwLjk2NTMzM2gxMzcuMDg4YzIuMjYxMzMzLTMuOTI1MzMzIDUuMTItNy42OCA4LjQ5MDY2Ny0xMS4wMDhsMTEzLjEwOTMzMy0xMTMuMTUyYTUzLjMzMzMzMyA1My4zMzMzMzMgMCAwIDEgNzUuNDM0NjY3IDB6IG0xLjE1MiAyMzEuMjUzMzM0SDI0NS4zMzMzMzNhNTMuMzMzMzMzIDUzLjMzMzMzMyAwIDAgMC01My4yMDUzMzMgNDkuMzY1MzMzbC0wLjEyOCA0LjAxMDY2N3YzMjBjMCAyOC4xMTczMzMgMjEuNzYgNTEuMTU3MzMzIDQ5LjM2NTMzMyA1My4xNjI2NjZsMy45NjggMC4xNzA2NjdoNTMzLjMzMzMzNGE1My4zMzMzMzMgNTMuMzMzMzMzIDAgMCAwIDUzLjIwNTMzMy00OS4zNjUzMzNsMC4xMjgtMy45Njh2LTMyMGMwLTI5LjQ0LTIzLjg5MzMzMy01My4zMzMzMzMtNTMuMzMzMzMzLTUzLjMzMzMzNHogbS00MjYuNjY2NjY3IDEwNi42NjY2NjZjMjkuNDQgMCA1My4zMzMzMzMgMjMuODkzMzMzIDUzLjMzMzMzMyA1My4zMzMzMzR2NTMuMzMzMzMzYTUzLjMzMzMzMyA1My4zMzMzMzMgMCAxIDEtMTA2LjY2NjY2NiAwdi01My4zMzMzMzNjMC0yOS40NCAyMy44OTMzMzMtNTMuMzMzMzMzIDUzLjMzMzMzMy01My4zMzMzMzR6IG0zMjAgMGMyOS40NCAwIDUzLjMzMzMzMyAyMy44OTMzMzMgNTMuMzMzMzMzIDUzLjMzMzMzNHY1My4zMzMzMzNhNTMuMzMzMzMzIDUzLjMzMzMzMyAwIDEgMS0xMDYuNjY2NjY2IDB2LTUzLjMzMzMzM2MwLTI5LjQ0IDIzLjg5MzMzMy01My4zMzMzMzMgNTMuMzMzMzMzLTUzLjMzMzMzNHpcIiBwLWlkPVwiNTA0MVwiPjwvcGF0aD48L3N2Zz4nXHJcbiAgICB9LFxyXG4gICAgYmxvZzoge1xyXG4gICAgICAgIHN2ZzogJzxzdmcgdD1cIjE3NDg1ODQ4NjAyMTFcIiBjbGFzcz1cImljb25cIiB2aWV3Qm94PVwiMCAwIDEwMjQgMTAyNFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcC1pZD1cIjg4NTBcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjIwMFwiPjxwYXRoIGQ9XCJNMzQ0LjQwNzkzNCA0NTMuNjI3MDA0Yy0yOS4xOTg2MTgtNS43OTk3MjUtNTYuMzk3MzMgMTcuNzk5MTU3LTU2LjM5NzMzIDQ3LjU5Nzc0NlY2MDIuMDE5OTc4YzAgMjAuMzk5MDM0IDE0LjE5OTMyOCAzNi43OTgyNTggMzMuMzk4NDE5IDQzLjk5NzkxNyAzNi4zOTgyNzcgMTMuNTk5MzU2IDYyLjU5NzAzNiA0OC43OTc2OSA2Mi41OTcwMzcgODkuOTk1NzM5IDAgNTIuOTk3NDkxLTQyLjk5Nzk2NCA5NS45OTU0NTUtOTUuOTk1NDU2IDk1Ljk5NTQ1NnMtOTUuOTk1NDU1LTQyLjk5Nzk2NC05NS45OTU0NTUtOTUuOTk1NDU2VjI0MC4wMzcxMTZjMC0yNi41OTg3NDEtMjEuMzk4OTg3LTQ3Ljk5NzcyOC00Ny45OTc3MjctNDcuOTk3NzI4SDQ4LjAyMTk2NmMtMjYuNTk4NzQxIDAtNDcuOTk3NzI4IDIxLjM5ODk4Ny00Ny45OTc3MjcgNDcuOTk3NzI4djQ5NS45NzY1MThjMCAxNzguOTkxNTI2IDE2NC4xOTIyMjcgMzIwLjM4NDgzMiAzNDkuOTgzNDMgMjgxLjM4NjY3OCAxMDguNzk0ODQ5LTIyLjc5ODkyMSAxOTYuNTkwNjkzLTExMC43OTQ3NTUgMjE5LjM4OTYxNC0yMTkuMzg5NjEzIDM0Ljc5ODM1My0xNjUuNzkyMTUxLTczLjk5NjQ5Ny0zMTQuMzg1MTE2LTIyNC45ODkzNDktMzQ0LjM4MzY5NXpNNDE4LjAwNDQ1IDAuMDQ4NDc4Yy0xOC4zOTkxMjktMC45OTk5NTMtMzMuOTk4MzkgMTMuNTk5MzU2LTMzLjk5ODM5IDMxLjk5ODQ4NXY2My4xOTcwMDhjMCAxNi45OTkxOTUgMTMuMTk5Mzc1IDMwLjk5ODUzMiAyOS45OTg1NzkgMzEuNzk4NDk0IDI1OC43ODc3NDggMTMuOTk5MzM3IDQ2Ni43Nzc5MDEgMjIzLjk4OTM5NiA0ODEuNzc3MTkxIDQ4Mi45NzcxMzQgMC45OTk5NTMgMTYuNzk5MjA1IDE0Ljk5OTI5IDI5Ljk5ODU4IDMxLjc5ODQ5NSAyOS45OTg1OGg2NC4xOTY5NjFjMTguMzk5MTI5IDAgMzIuOTk4NDM4LTE1LjU5OTI2MSAzMS45OTg0ODUtMzMuOTk4MzlDMTAwNi43NzY1NzUgMjc5LjYzNTI0MSA3NDQuMzg4OTk4IDE3LjI0NzY2MyA0MTguMDA0NDUgMC4wNDg0Nzh6IG0wLjU5OTk3MiAxOTEuOTkwOTFjLTE4LjU5OTExOS0xLjM5OTkzNC0zNC41OTgzNjIgMTMuMzk5MzY2LTM0LjU5ODM2MiAzMi4xOTg0NzZ2NjQuMTk2OTZjMCAxNi43OTkyMDUgMTIuOTk5Mzg1IDMwLjU5ODU1MSAyOS41OTg1OTggMzEuNzk4NDk1IDE1My41OTI3MjggMTIuNTk5NDAzIDI3NS45ODY5MzQgMTM2LjM5MzU0MyAyODkuNzg2MjgxIDI5MC4zODYyNTIgMS41OTk5MjQgMTYuNTk5MjE0IDE1LjE5OTI4IDI5LjM5ODYwOCAzMS43OTg0OTQgMjkuMzk4NjA4aDY0LjM5Njk1MmMxOC41OTkxMTkgMCAzMy41OTg0MDktMTUuOTk5MjQzIDMyLjE5ODQ3NS0zNC41OTgzNjItMTYuNzk5MjA1LTIyMC4xODk1NzUtMTkyLjk5MDg2My0zOTYuMzgxMjM0LTQxMy4xODA0MzgtNDEzLjM4MDQyOXpcIiBwLWlkPVwiODg1MVwiPjwvcGF0aD48L3N2Zz4nXHJcbiAgICB9XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFnVSxPQUFPLGNBQWM7QUFFclYsU0FBUyxjQUFjLG1DQUFtQztBQUMxRCxTQUFTLHlDQUF5QztBQUNsRCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLG9CQUFvQjs7O0FDb0R0QixJQUFNLGVBQWU7QUFBQSxFQUN4QjtBQUFBLElBQ0ksTUFBTTtBQUFBLElBQ04sYUFBYSxDQUFDLGlCQUFpQixVQUFVO0FBQUEsSUFDekMsbUJBQW1CLENBQUMsbUJBQW1CO0FBQUEsSUFDdkMsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sMERBQTBELENBQUM7QUFBQSxFQUN6RjtBQUFBLEVBQ0E7QUFBQSxJQUNJLE1BQU07QUFBQSxJQUNOLGFBQWEsQ0FBQyxjQUFjO0FBQUEsSUFDNUIsUUFBUTtBQUFBLElBQ1IsbUJBQW1CLENBQUMsbUJBQW1CO0FBQUEsSUFDdkMsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLENBQUM7QUFBQSxFQUM1RDtBQUFBLEVBQ0E7QUFBQSxJQUNJLE1BQU07QUFBQSxJQUNOLGFBQWEsQ0FBQyxTQUFTO0FBQUEsSUFDdkIsUUFBUTtBQUFBLElBQ1Is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
diff --git a/.vitepress/theme/Layout.vue b/.vitepress/theme/Layout.vue
index 565949b..3a2864b 100644
--- a/.vitepress/theme/Layout.vue
+++ b/.vitepress/theme/Layout.vue
@@ -1,5 +1,8 @@
+
+
+
@@ -14,6 +17,8 @@ import mediumZoom from "medium-zoom";
import { animateIn, animateOut } from './hook/animate';
import ScrollBar from './components/scrollbar/index.vue';
+import HeroImage from './components/home/HeroImage.vue';
+
import { gsap } from "gsap/dist/gsap";
import { ScrollTrigger } from "gsap/dist/ScrollTrigger";
@@ -168,22 +173,4 @@ body::-webkit-scrollbar {
z-index: 999;
}
-/* 淡入淡出动画 */
-.fade-in {
- opacity: 1;
-}
-
-.fade-out {
- opacity: 0;
-}
-
-.slide-in {
- transform: translateY(0);
- opacity: 1;
-}
-
-.slide-out {
- transform: translateY(100px);
- opacity: 0;
-}
\ No newline at end of file
diff --git a/.vitepress/theme/components/home/HeroImage.vue b/.vitepress/theme/components/home/HeroImage.vue
index 230946f..f3ac7bb 100644
--- a/.vitepress/theme/components/home/HeroImage.vue
+++ b/.vitepress/theme/components/home/HeroImage.vue
@@ -1,25 +1,218 @@
-
-

-
+
+
+
-
diff --git a/.vitepress/theme/components/scrollbar/controller.ts b/.vitepress/theme/components/scrollbar/controller.ts
index d0a0234..7b23916 100644
--- a/.vitepress/theme/components/scrollbar/controller.ts
+++ b/.vitepress/theme/components/scrollbar/controller.ts
@@ -13,7 +13,7 @@ interface ScrollbarController {
export const scrollbarController = reactive({
element: undefined,
display: true,
- height: 200,
+ height: 0,
width: 5,
top: 0,
opacity: 0,
diff --git a/.vitepress/theme/css/animation.css b/.vitepress/theme/css/animation.css
index d5557e9..70b218c 100644
--- a/.vitepress/theme/css/animation.css
+++ b/.vitepress/theme/css/animation.css
@@ -44,9 +44,41 @@
}
.VPFeatures .item:hover .box {
+ background-color: var(--vp-c-brand-1);
+}
+
+.dark .VPButton.brand {
+ background-color: var(--vp-c-brand-3) !important;
+}
+
+.VPButton.brand {
+ background-color: var(--vp-c-brand-1) !important;
+}
+
+.dark .VPFeatures .item:hover .box {
background-color: var(--vp-c-brand-3);
}
.VPFeatures .item:hover .box .details {
color: var(--vp-c-white);
+}
+
+
+/* 淡入淡出动画 */
+.fade-in {
+ opacity: 1;
+}
+
+.fade-out {
+ opacity: 0;
+}
+
+.slide-in {
+ transform: translateY(0);
+ opacity: 1;
+}
+
+.slide-out {
+ transform: translateY(100px);
+ opacity: 0;
}
\ No newline at end of file
diff --git a/.vitepress/theme/css/style.css b/.vitepress/theme/css/style.css
index e9fbfce..ded78df 100644
--- a/.vitepress/theme/css/style.css
+++ b/.vitepress/theme/css/style.css
@@ -72,6 +72,8 @@
--vp-c-danger-2: var(--vp-c-red-2);
--vp-c-danger-3: var(--vp-c-red-3);
--vp-c-danger-soft: var(--vp-c-red-soft);
+
+ --vp-bg-brand-2: rgba(194, 133, 214, 0.1);
}
/**
diff --git a/.vscode/tabs.my-browser.json b/.vscode/tabs.my-browser.json
new file mode 100644
index 0000000..a7785f7
--- /dev/null
+++ b/.vscode/tabs.my-browser.json
@@ -0,0 +1,215 @@
+{
+ "clientId": "81b3b1d6-b1d6-53b1d63c156-83b1d63c156a678-6a678e36",
+ "currentIndex": 0,
+ "tabs": [
+ {
+ "name": "交互测试",
+ "icon": "icon-robot",
+ "type": "blank",
+ "componentIndex": 3,
+ "storage": {
+ "activeNames": [
+ 0
+ ],
+ "messages": [
+ {
+ "role": "user",
+ "content": "使用 ffmpeg 把视频 (0, 65) 到 (1173, 769) 的位置截取出来,视频的格式是 mov,我希望导出为 mp4",
+ "extraInfo": {
+ "created": 1749111492698,
+ "state": "success",
+ "serverName": "deepseek"
+ }
+ },
+ {
+ "role": "assistant",
+ "content": "你可以使用 `ffmpeg` 的 `crop` 滤镜来截取视频的指定区域,并将 `.mov` 转换为 `.mp4` 格式。以下是具体的命令:\n\n### 命令解析:\n1. **输入文件**:`input.mov`(替换为你的文件名)\n2. **裁剪参数**:\n - `crop=w:h:x:y`:从坐标 `(x,y)` 开始,截取宽度 `w`、高度 `h` 的区域。\n - 你的需求是从 `(0, 65)` 到 `(1173, 769)`,因此:\n - 宽度 `w = 1173 - 0 = 1173`\n - 高度 `h = 769 - 65 = 704`\n - 起始坐标 `(x,y) = (0, 65)`\n3. **输出格式**:`mp4`(默认使用 H.264 编码)\n\n### 完整命令:\n```bash\nffmpeg -i input.mov -filter:v \"crop=1173:704:0:65\" -c:a copy output.mp4\n```\n\n### 参数说明:\n- `-i input.mov`:指定输入文件。\n- `-filter:v \"crop=1173:704:0:65\"`:视频裁剪滤镜。\n- `-c:a copy`:直接复制音频流(无需重新编码,节省时间)。\n- `output.mp4`:输出文件名。\n\n### 其他选项:\n- 如果需要控制视频质量,可以添加 `-crf` 参数(默认 23,值越小质量越高):\n ```bash\n ffmpeg -i input.mov -filter:v \"crop=1173:704:0:65\" -crf 18 -c:a copy output.mp4\n ```\n- 如果需要硬件加速(如 NVIDIA GPU),可以添加 `-hwaccel cuda` 等参数。\n\n### 注意:\n1. 确保 `ffmpeg` 已安装并添加到系统路径。\n2. 如果视频有旋转/缩放等元数据,可能需要先处理(如用 `-vf \"transpose=1\"` 旋转)。\n\n运行命令后,`output.mp4` 就是你需要的裁剪后视频。",
+ "extraInfo": {
+ "created": 1749111520497,
+ "state": "success",
+ "serverName": "deepseek",
+ "usage": {
+ "prompt_tokens": 42,
+ "completion_tokens": 487,
+ "total_tokens": 529,
+ "prompt_tokens_details": {
+ "cached_tokens": 0
+ },
+ "prompt_cache_hit_tokens": 0,
+ "prompt_cache_miss_tokens": 42
+ }
+ }
+ }
+ ],
+ "settings": {
+ "modelIndex": 0,
+ "enableTools": [
+ {
+ "name": "k_navigate",
+ "description": "Navigate to a URL",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to navigate to"
+ },
+ "launchOptions": {
+ "type": "object",
+ "description": "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }"
+ },
+ "allowDangerous": {
+ "type": "boolean",
+ "description": "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false."
+ }
+ },
+ "required": [
+ "url"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_screenshot",
+ "description": "Take a screenshot of the current page or a specific element",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name for the screenshot"
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for element to screenshot"
+ },
+ "width": {
+ "type": "number",
+ "description": "Width in pixels (default: 800)"
+ },
+ "height": {
+ "type": "number",
+ "description": "Height in pixels (default: 600)"
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_click",
+ "description": "Click an element on the page",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for element to click"
+ }
+ },
+ "required": [
+ "selector"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_fill",
+ "description": "Fill out an input field",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for input field"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value to fill"
+ }
+ },
+ "required": [
+ "selector",
+ "value"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_select",
+ "description": "Select an element on the page with Select tag",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for element to select"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value to select"
+ }
+ },
+ "required": [
+ "selector",
+ "value"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_hover",
+ "description": "Hover an element on the page",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for element to hover"
+ }
+ },
+ "required": [
+ "selector"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_evaluate",
+ "description": "Execute JavaScript in the browser console",
+ "inputSchema": {
+ "type": "object",
+ "properties": {
+ "script": {
+ "type": "string",
+ "description": "JavaScript code to execute"
+ }
+ },
+ "required": [
+ "script"
+ ]
+ },
+ "enabled": false
+ },
+ {
+ "name": "k_get_full_page_text",
+ "description": "获取页面所有文本内容",
+ "inputSchema": {
+ "type": "object",
+ "properties": {}
+ },
+ "enabled": false
+ }
+ ],
+ "enableWebSearch": false,
+ "temperature": 0.6,
+ "contextLength": 20,
+ "systemPrompt": "",
+ "parallelToolCalls": true
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/images/.DS_Store b/images/.DS_Store
new file mode 100644
index 0000000..d8d844a
Binary files /dev/null and b/images/.DS_Store differ
diff --git a/images/favicon.png b/images/favicon.png
deleted file mode 100644
index a0647be..0000000
Binary files a/images/favicon.png and /dev/null differ
diff --git a/images/favicon.svg b/images/favicon.svg
new file mode 100644
index 0000000..3267d35
--- /dev/null
+++ b/images/favicon.svg
@@ -0,0 +1,71 @@
+
+
\ No newline at end of file
diff --git a/images/icons/openmcp-edge.free b/images/icons/openmcp-edge.free
new file mode 100644
index 0000000..1893973
Binary files /dev/null and b/images/icons/openmcp-edge.free differ
diff --git a/images/icons/openmcp-edge.svg b/images/icons/openmcp-edge.svg
new file mode 100644
index 0000000..3267d35
--- /dev/null
+++ b/images/icons/openmcp-edge.svg
@@ -0,0 +1,71 @@
+
+
\ No newline at end of file
diff --git a/index.md b/index.md
index d9981ad..acaf5d3 100644
--- a/index.md
+++ b/index.md
@@ -6,9 +6,6 @@ hero:
name: "OpenMCP"
text: "面向优雅开发者的 MCP 调试器和 SDK"
tagline: 缩短从大语言模型到智能体的最后一公里
- image:
- src: /images/openmcp.png
- alt: VitePress
actions:
- theme: brand
@@ -28,7 +25,7 @@ features:
title: 集成调试环境
details: 将检查器与 MCP 客户端功能相结合,实现无缝开发和测试
- icon:
- src: /images/openmcp.png
+ src: /images/icons/openmcp-edge.svg
height: 48px
alt: 提供完整的项目级控制面板
title: 全面的项目管理
diff --git a/plugin-tutorial/usage/sse-oauth2.md b/plugin-tutorial/usage/sse-oauth2.md
index b422090..fc4373e 100644
--- a/plugin-tutorial/usage/sse-oauth2.md
+++ b/plugin-tutorial/usage/sse-oauth2.md
@@ -3,11 +3,8 @@
在使用 **SSE** 或 **Streamable HTTP** 进行连接时,为增强安全性可为接口设计鉴权机制,MCP 官方推荐采用 OAuth 协议。下面以获取 GitHub 用户信息为例,演示如何通过 openmcp-client 完成带 OAuth 认证的接口调试。
-## 部署服务器
-
-
-### 1. 获取Github OAuth认证ID和secret
+## 1. 获取Github OAuth认证ID和secret
由于我们使用了Github用户信息相关API,需要先获取Github OAuth应用的Client ID和Client secret。
@@ -19,7 +16,7 @@
注册成功后,请记录`Client ID`,然后点击`Generate a new client secret`生成一个`secret`,注意secret仅在生成的时候可见。
-### 2. 设置环境变量
+## 2. 设置环境变量
在获取`Client ID`和`secret`之后,需要将其设置为环境变量:
@@ -39,9 +36,9 @@ set MCP_GITHUB_GITHUB_CLIENT_SECRET={{secret}}
注意:cmd里面设置环境变量请不要加引号。
-### 3. 克隆源码
+## 3. 克隆源码
-首先,我们需要部署MCP服务器。可以参照[官方python例子](https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/servers/simple-auth)进行。
+接下来,我们需要部署带有OAuth认证的MCP服务器。可以参照[官方python案例](https://github.com/modelcontextprotocol/python-sdk/tree/main/examples/servers/simple-auth)进行。
需要先克隆官方python-sdk源码:
@@ -50,11 +47,11 @@ git clone https://github.com/modelcontextprotocol/python-sdk/ # 克隆源码
cd examples/servers/simple-auth # 进入对应的目录
```
-### 4. 启动MCP Server
+## 4. 启动MCP Server
-先根据需要创建虚拟环境安装依赖,然后直接运行`python main.py`即可,注意需要先设置环境变量,不然启动会报错`2 validation errors for ServerSettings`。
+先根据需要创建虚拟环境安装依赖,然后可以使用`uv`运行或者直接运行`python main.py`即可,注意需要先设置环境变量,不然启动会报错`2 validation errors for ServerSettings`。
-### 5. 启动openmcp-client
+## 5. 启动openmcp-client
接下来,你就可以使用openmcp-client连接刚刚启动的server了,不管是使用网页端还是VSCode均可。
diff --git a/sdk-tutorial/index.md b/sdk-tutorial/index.md
index a918fa8..6ff7d9a 100644
--- a/sdk-tutorial/index.md
+++ b/sdk-tutorial/index.md
@@ -1,5 +1,14 @@
+
+
+

+
+
openmcp-sdk : 适用于 openmcp 的部署框架
+
闪电般将您的 agent 从实验室部署到生产环境
+
+
+
# 介绍 & 安装
## 什么是 openmcp-sdk.js
@@ -27,35 +36,34 @@ pnpm add openmcp-sdk
```
:::
+:::warning
+目前 openmcp-sdk 只支持 esm 模式的导入
+:::
+
## 使用
-下面是一个最小例程:
-
文件名:main.ts
```typescript
import { TaskLoop } from 'openmcp-sdk/task-loop';
import { TaskLoopAdapter } from 'openmcp-sdk/service';
-
async function main() {
// 创建适配器,负责通信和 mcp 连接
const adapter = new TaskLoopAdapter();
- // 连接 mcp 服务器
- await adapter.connectMcpServer({
+ // 添加 mcp 服务器
+ adapter.addMcp({
connectionType: 'STDIO',
- command: 'node',
- args: [
- '~/projects/mcp/servers/src/puppeteer/dist/index.js'
- ]
+ commandString: 'node index.js',
+ cwd: '~/projects/openmcp-tutorial/my-browser/dist'
});
- // 获取工具列表
- const tools = await adapter.listTools();
+ // 创建事件循环驱动器, verbose 数值越高,输出的日志越详细
+ const taskLoop = new TaskLoop({ adapter, verbose: 1 });
- // 创建事件循环驱动器
- const taskLoop = new TaskLoop({ adapter });
+ // 获取所有工具
+ const tools = await taskLoop.getTools();
// 配置改次事件循环使用的大模型
taskLoop.setLlmConfig({
@@ -70,8 +78,11 @@ async function main() {
messages: [],
settings: {
temperature: 0.7,
+ // 在本次对话使用所有工具
enableTools: tools,
+ // 系统提示词
systemPrompt: 'you are a clever bot',
+ // 对话上下文的轮数
contextLength: 20
}
};
@@ -79,29 +90,64 @@ async function main() {
// 本次发出的问题
const message = 'hello world';
- // 事件循环结束的句柄
- taskLoop.registerOnDone(() => {
- console.log('taskLoop done');
- });
-
- // 事件循环每一次 epoch 开始的句柄
- taskLoop.registerOnError((error) => {
- console.log('taskLoop error', error);
- });
-
- // 事件循环出现 error 时的句柄(出现 error 不一定会停止事件循环)
- taskLoop.registerOnEpoch(() => {
- console.log('taskLoop epoch');
- });
-
// 开启事件循环
await taskLoop.start(storage, message);
// 打印上下文,最终的回答在 messages.at(-1) 中
- console.log(storage.messages);
-}
+ const content = storage.messages.at(-1).content;
+ console.log('最终回答:', content);
+}
main();
```
-star 我们的项目:https://github.com/LSTM-Kirigaya/openmcp-client
\ No newline at end of file
+以 esm 模块来运行它,先安装 typescript 的 esm 启动器:
+
+```bash
+npm install tsx --save-dev
+```
+
+运行上面的文件
+
+```bash
+npx tsx main.ts
+```
+
+
+下面是可能的输出:
+
+```
+[6/5/2025, 8:16:15 PM] 🚀 [my-browser] 0.1.0 connected
+[6/5/2025, 8:16:15 PM] task loop enters a new epoch
+[6/5/2025, 8:16:23 PM] task loop finish a epoch
+[6/5/2025, 8:16:23 PM] 🤖 llm wants to call these tools k_navigate
+[6/5/2025, 8:16:23 PM] 🔧 calling tool k_navigate
+[6/5/2025, 8:16:34 PM] × fail to call tools McpError: MCP error -32603: net::ERR_CONNECTION_RESET at https://towardsdatascience.com/tag/editors-pick/
+[6/5/2025, 8:16:34 PM] task loop enters a new epoch
+[6/5/2025, 8:16:40 PM] task loop finish a epoch
+[6/5/2025, 8:16:40 PM] 🤖 llm wants to call these tools k_navigate
+[6/5/2025, 8:16:40 PM] 🔧 calling tool k_navigate
+[6/5/2025, 8:16:44 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:16:44 PM] task loop enters a new epoch
+[6/5/2025, 8:16:57 PM] task loop finish a epoch
+[6/5/2025, 8:16:57 PM] 🤖 llm wants to call these tools k_evaluate
+[6/5/2025, 8:16:57 PM] 🔧 calling tool k_evaluate
+[6/5/2025, 8:16:57 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:16:57 PM] task loop enters a new epoch
+[6/5/2025, 8:17:06 PM] task loop finish a epoch
+[6/5/2025, 8:17:06 PM] 🤖 llm wants to call these tools k_navigate, k_navigate
+[6/5/2025, 8:17:06 PM] 🔧 calling tool k_navigate
+[6/5/2025, 8:17:09 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:17:09 PM] 🔧 calling tool k_navigate
+[6/5/2025, 8:17:12 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:17:12 PM] task loop enters a new epoch
+[6/5/2025, 8:17:19 PM] task loop finish a epoch
+[6/5/2025, 8:17:19 PM] 🤖 llm wants to call these tools k_evaluate, k_evaluate
+[6/5/2025, 8:17:19 PM] 🔧 calling tool k_evaluate
+[6/5/2025, 8:17:19 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:17:19 PM] 🔧 calling tool k_evaluate
+[6/5/2025, 8:17:19 PM] ✓ call tools okey dockey success
+[6/5/2025, 8:17:19 PM] task loop enters a new epoch
+[6/5/2025, 8:17:45 PM] task loop finish a epoch
+"以下是整理好的热门文章信息,并已翻译为简体中文:\n\n---\n\n### K1 标题 \n**《数据漂移并非真正问题:你的监控策略才是》** \n\n**简介** \n在机器学习领域,数据漂移常被视为模型性能下降的罪魁祸首,但本文作者提出了一种颠覆性的观点:数据漂移只是一个信号,真正的核心问题在于监控策略的不足。文章通过实际案例(如电商推荐系统和金融风控模型)揭示了传统统计监控的局限性,并提出了一个三层监控框架: \n1. **统计监控**:快速检测数据分布变化,但仅作为初步信号。 \n2. **上下文监控**:结合业务逻辑,判断漂移是否对关键指标产生影响。 \n3. **行为监控**:追踪模型预测的实际效果,避免“无声漂移”。 \n\n亮点在于作者强调了监控系统需要与业务目标紧密结合,而非单纯依赖技术指标。 \n\n**原文链接** \n[点击阅读原文](https://towardsdatascience.com/data-drift-is-not-the-actual-problem-your-monitoring-strategy-is/) \n\n---\n\n### K2 标题 \n**《从 Jupyter 到程序员的快速入门指南》** \n\n**简介** \n本文为数据科学家和初学者提供了一条从 Jupyter Notebook 过渡到专业编程的清晰路径。作者通过实际代码示例和工具推荐(如 VS Code、Git 和 Docker),帮助读者摆脱 Notebook 的局限性,提升代码的可维护性和可扩展性。 \n\n亮点包括: \n- 如何将 Notebook 代码模块化为可复用的 Python 脚本。 \n- 使用版本控制和容器化技术优化开发流程。 \n- 实战案例展示如何将实验性代码转化为生产级应用。 \n\n**原文链接** \n[点击阅读原文](https://towardsdatascience.com/the-journey-from-jupyter-to-programmer-a-quick-start-guide/) \n\n---\n\n如果需要进一步优化或补充其他内容,请随时告诉我!"
+```