diff --git a/.github/workflows/auto-prettier.yaml b/.github/workflows/auto-prettier.yaml
new file mode 100644
index 000000000..c4c9ae0df
--- /dev/null
+++ b/.github/workflows/auto-prettier.yaml
@@ -0,0 +1,21 @@
+name: auto prettier
+
+on:
+ push:
+ paths:
+ - 'site-vuepress/**'
+
+jobs:
+ prettier:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.head_ref }}
+
+ - name: Prettify code
+ uses: creyD/prettier_action@v4.2
+ with:
+ prettier_options: --config ./site-vuepress/.prettierrc.json --ignore-path ./site-vuepress/.prettierignore --write ./site-vuepress
\ No newline at end of file
diff --git a/site-vuepress/.gitignore b/site-vuepress/.gitignore
new file mode 100644
index 000000000..d46af7243
--- /dev/null
+++ b/site-vuepress/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.temp
+.cache
diff --git a/site-vuepress/.prettierignore b/site-vuepress/.prettierignore
new file mode 100644
index 000000000..feba52572
--- /dev/null
+++ b/site-vuepress/.prettierignore
@@ -0,0 +1,2 @@
+.cache
+.temp
\ No newline at end of file
diff --git a/site-vuepress/.prettierrc.json b/site-vuepress/.prettierrc.json
new file mode 100644
index 000000000..75fa13412
--- /dev/null
+++ b/site-vuepress/.prettierrc.json
@@ -0,0 +1,3 @@
+{
+ "tabWidth": 2
+}
diff --git a/site-vuepress/README.md b/site-vuepress/README.md
new file mode 100644
index 000000000..b999e5662
--- /dev/null
+++ b/site-vuepress/README.md
@@ -0,0 +1,14 @@
+
Arthas 文档网站(power by vuepress)
+
+## 项目运行
+
+```shell
+# 安装依赖
+npm install
+
+# 启动项目
+npm run docs:dev
+
+# 发布项目(打包到 docs/.vuepress/dist 目录)
+npm run docs:build
+```
diff --git a/site-vuepress/docs/.vuepress/client.js b/site-vuepress/docs/.vuepress/client.js
new file mode 100644
index 000000000..56feb6261
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/client.js
@@ -0,0 +1,53 @@
+import { defineClientConfig } from "@vuepress/client";
+import { usePageData } from "@vuepress/client";
+import oldContributorsData from "./oldContributorsData.json";
+
+const addOldDocsContributors = () => {
+ const page = usePageData();
+ if (!page.value.git) return;
+ const filePath = page.value.filePathRelative;
+ const contributors = page.value.git.contributors;
+ const oldContributors = oldContributorsData[filePath];
+
+ const haveSameContributor = (contributors, oldContributor) => {
+ return contributors.find(
+ (contributor) =>
+ contributor.name === oldContributor.name &&
+ contributor.email === oldContributor.email
+ );
+ };
+
+ if (oldContributors) {
+ oldContributors.forEach((oldContributor) => {
+ if (!haveSameContributor(contributors, oldContributor)) {
+ contributors.push(oldContributor);
+ } else {
+ haveSameContributor(contributors, oldContributor).commits +=
+ oldContributor.commits;
+ }
+ });
+ }
+
+ // sort contributors by commits
+ contributors?.sort((a, b) => b.commits - a.commits);
+};
+
+export default defineClientConfig({
+ enhance({ router }) {
+ router.afterEach((to, from) => {
+ if (to.fullPath !== from.fullPath) {
+ addOldDocsContributors();
+ }
+ });
+
+ router.beforeEach((to, from, next) => {
+ if (typeof _hmt != "undefined") {
+ if (to.path && to.fullPath !== from.fullPath) {
+ _hmt.push(["_trackPageview", to.fullPath]);
+ }
+ }
+
+ next();
+ });
+ },
+});
diff --git a/site-vuepress/docs/.vuepress/config.js b/site-vuepress/docs/.vuepress/config.js
new file mode 100644
index 000000000..b56394fe4
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/config.js
@@ -0,0 +1,109 @@
+const { localTheme } = require("./theme/index");
+
+const { copyCodePlugin } = require("vuepress-plugin-copy-code2");
+const { redirectPlugin } = require("vuepress-plugin-redirect");
+const { searchPlugin } = require("@vuepress/plugin-search");
+
+module.exports = {
+ title: "arthas",
+ description: "arthas user document",
+ head: require("./configs/head"),
+ locales: {
+ "/": {
+ lang: "zh-CN",
+ title: "arthas",
+ description: "arthas 使用文档",
+ },
+ "/en/": {
+ lang: "en-US",
+ title: "arthas",
+ description: "arthas user document",
+ },
+ },
+ theme: localTheme({
+ logo: "/images/arthas_light.png",
+ logoDark: "/images/arthas_dark.png",
+ repo: "alibaba/arthas",
+ docsDir: "site-vuepress/docs",
+ docsBranch: "master",
+
+ locales: {
+ "/": {
+ selectLanguageName: "简体中文",
+ selectLanguageText: "Languages",
+ editLinkText: "在 GitHub 上编辑此页",
+ lastUpdated: "上次更新",
+ contributorsText: "贡献者",
+ backToHome: "回到首页",
+ warning: "注意",
+ tip: "提示",
+ danger: "警告",
+ // 404 page
+ notFound: [
+ "这里什么都没有",
+ "我们怎么到这来了?",
+ "这是一个 404 页面",
+ "看起来我们进入了错误的链接",
+ ],
+ backToHome: "返回首页",
+ openInNewWindow: "在新窗口打开",
+ toggleColorMode: "切换颜色模式",
+ toggleSidebar: "切换侧边栏",
+ navbar: require("./configs/navbar/zh"),
+ sidebar: require("./configs/sidebar/zh"),
+ sidebarDepth: 0,
+ },
+ "/en/": {
+ selectLanguageName: "English",
+ selectLanguageText: "Languages",
+ editLinkText: "Edit this page on GitHub",
+ navbar: require("./configs/navbar/en"),
+ sidebar: require("./configs/sidebar/en"),
+ sidebarDepth: 0,
+ },
+ },
+ }),
+ plugins: [
+ copyCodePlugin({
+ showInMobile: false,
+ pure: true,
+ locales: {
+ "/": {
+ hint: "复制代码",
+ },
+ "/en/": {
+ hint: "Copy code",
+ },
+ },
+ }),
+ searchPlugin({
+ locales: {
+ "/": {
+ placeholder: "搜索文档",
+ },
+ "/en/": {
+ placeholder: "Search Docs",
+ },
+ },
+ }),
+ redirectPlugin({
+ config: (app) => {
+ const redirects = Object.fromEntries(
+ app.pages
+ .filter((page) => page.path.startsWith("/en/doc/"))
+ .map((page) => [
+ page.path.replace(/^\/en\/doc\//, "/doc/en/"),
+ page.path,
+ ])
+ );
+
+ delete redirects["/doc/en/"];
+ redirects["/doc/en/index.html"] = "/en/doc/index.html";
+ redirects["/en-us/index.html"] = "/en/index.html";
+ redirects["/zh-cn/index.html"] = "/index.html";
+
+ return redirects;
+ },
+ }),
+ ],
+};
diff --git a/site-vuepress/docs/.vuepress/configs/head.js b/site-vuepress/docs/.vuepress/configs/head.js
new file mode 100644
index 000000000..a74f7a846
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/configs/head.js
@@ -0,0 +1,20 @@
+module.exports = [
+ ["link", { rel: "icon", href: "/images/favicon.ico" }],
+ [
+ "meta",
+ { name: "viewport", content: "width=device-width, initial-scale=1.0" },
+ ],
+ [
+ "script",
+ {},
+ `
+ var _hmt = _hmt || [];
+ (function() {
+ var hm = document.createElement("script");
+ hm.src = "https://hm.baidu.com/hm.js?d5c5e25b100f0eb51a4c35c8a86ea9b4";
+ var s = document.getElementsByTagName("script")[0];
+ s.parentNode.insertBefore(hm, s);
+ })();
+ `,
+ ],
+];
diff --git a/site-vuepress/docs/.vuepress/configs/navbar/en.js b/site-vuepress/docs/.vuepress/configs/navbar/en.js
new file mode 100644
index 000000000..8802f8e26
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/configs/navbar/en.js
@@ -0,0 +1,52 @@
+module.exports = [
+ {
+ text: "HOME",
+ link: "/en/",
+ },
+ {
+ text: "ONLINE TUTORIALS",
+ link: "/doc/arthas-tutorials.html?language=en&id=arthas-basics",
+ target: "_blank",
+ },
+ {
+ text: "DOCS",
+ link: "/en/doc",
+ },
+ {
+ text: "SOLUTIONS",
+ children: [
+ {
+ text: "Microservice solutions",
+ link: "https://cn.aliyun.com/product/aliware/mse?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "Distributed transaction solutions",
+ link: "https://www.aliyun.com/aliware/txc?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "High-availability solution",
+ link: "https://www.aliyun.com/product/ahas?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "Serverless solution for miscoservices",
+ link: "https://cn.aliyun.com/product/aliware/sae?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "PaaS solution",
+ link: "https://www.aliyun.com/product/edas?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "Service mesh solution",
+ link: "https://www.aliyun.com/product/servicemesh?spm=arthas.topbar.0.0.0",
+ },
+ ],
+ },
+ {
+ text: "DOWNLOAD",
+ link: "/en/doc/download.md",
+ },
+ {
+ text: "COMMUNITY",
+ link: "https://github.com/alibaba/arthas/issues",
+ },
+];
diff --git a/site-vuepress/docs/.vuepress/configs/navbar/zh.js b/site-vuepress/docs/.vuepress/configs/navbar/zh.js
new file mode 100644
index 000000000..ba222ec0b
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/configs/navbar/zh.js
@@ -0,0 +1,52 @@
+module.exports = [
+ {
+ text: "首页",
+ link: "/",
+ },
+ {
+ text: "在线教程",
+ link: "/doc/arthas-tutorials.html?language=cn&id=arthas-basics",
+ target: "_blank",
+ },
+ {
+ text: "文档",
+ link: "/doc/",
+ },
+ {
+ text: "解决方案",
+ children: [
+ {
+ text: "微服务解决方案",
+ link: "https://cn.aliyun.com/product/aliware/mse?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "分布式事务解决方案",
+ link: "https://www.aliyun.com/aliware/txc?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "高可用解决方案",
+ link: "https://www.aliyun.com/product/ahas?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "微服务Serverless解决方案",
+ link: "https://cn.aliyun.com/product/aliware/sae?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "PaaS解决方案",
+ link: "https://www.aliyun.com/product/edas?spm=arthas.topbar.0.0.0",
+ },
+ {
+ text: "服务网格解决方案",
+ link: "https://www.aliyun.com/product/servicemesh?spm=arthas.topbar.0.0.0",
+ },
+ ],
+ },
+ {
+ text: "下载",
+ link: "/doc/download.md",
+ },
+ {
+ text: "社区",
+ link: "https://github.com/alibaba/arthas/issues",
+ },
+];
diff --git a/site-vuepress/docs/.vuepress/configs/sidebar/en.js b/site-vuepress/docs/.vuepress/configs/sidebar/en.js
new file mode 100644
index 000000000..0565661b4
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/configs/sidebar/en.js
@@ -0,0 +1,148 @@
+module.exports = {
+ "/en/doc": [
+ {
+ text: "DOCS",
+ children: [
+ "/en/doc/README.md",
+ "/en/doc/quick-start.md",
+ "/en/doc/install-detail.md",
+ "/en/doc/download.md",
+ "/en/doc/advanced-use.md",
+ {
+ text: "Other features",
+ collapsible: true,
+ children: [
+ "/en/doc/async.md",
+ "/en/doc/save-log.md",
+ "/en/doc/batch-support.md",
+ {
+ text: "How to use ognl",
+ link: "",
+ children: [
+ {
+ text: "Basic ognl example",
+ link: "https://github.com/alibaba/arthas/issues/11",
+ },
+ {
+ text: "Ognl special uses",
+ link: "https://github.com/alibaba/arthas/issues/71",
+ },
+ ],
+ },
+ ],
+ },
+ {
+ text: "Commands",
+ collapsible: true,
+ link: "/en/doc/commands.md",
+ children: [
+ {
+ text: "jvm",
+ collapsible: false,
+ children: [
+ "/en/doc/dashboard.md",
+ "/en/doc/thread.md",
+ "/en/doc/jvm.md",
+ "/en/doc/memory.md",
+ "/en/doc/sysprop.md",
+ "/en/doc/sysenv.md",
+ "/en/doc/vmoption.md",
+ "/en/doc/perfcounter.md",
+ "/en/doc/logger.md",
+ "/en/doc/mbean.md",
+ "/en/doc/getstatic.md",
+ "/en/doc/ognl.md",
+ "/en/doc/heapdump.md",
+ "/en/doc/vmtool.md",
+ ],
+ },
+ {
+ text: "class/classloader",
+ collapsible: false,
+ children: [
+ "/en/doc/sc.md",
+ "/en/doc/sm.md",
+ "/en/doc/jad.md",
+ "/en/doc/classloader.md",
+ "/en/doc/mc.md",
+ "/en/doc/dump.md",
+ "/en/doc/retransform.md",
+ "/en/doc/redefine.md",
+ ],
+ },
+ {
+ text: "monitor/watch/trace - related",
+ collapsible: false,
+ children: [
+ "/en/doc/monitor.md",
+ "/en/doc/watch.md",
+ "/en/doc/trace.md",
+ "/en/doc/stack.md",
+ "/en/doc/tt.md",
+ ],
+ },
+ {
+ text: "other",
+ collapsible: false,
+ children: [
+ "/en/doc/profiler.md",
+ "/en/doc/cat.md",
+ "/en/doc/echo.md",
+ "/en/doc/grep.md",
+ "/en/doc/base64.md",
+ "/en/doc/tee.md",
+ "/en/doc/pwd.md",
+ "/en/doc/auth.md",
+ "/en/doc/options.md",
+ ],
+ },
+ {
+ text: "Basic",
+ collapsible: false,
+ children: [
+ "/en/doc/help.md",
+ "/en/doc/cls.md",
+ "/en/doc/session.md",
+ "/en/doc/reset.md",
+ "/en/doc/history.md",
+ "/en/doc/quit.md",
+ "/en/doc/stop.md",
+ {
+ text: "keymap",
+ link: "/en/doc/keymap.md",
+ },
+ ],
+ },
+ ],
+ },
+ "/en/doc/web-console.md",
+ "/en/doc/tunnel.md",
+ "/en/doc/http-api.md",
+ "/en/doc/docker.md",
+ "/en/doc/spring-boot-starter.md",
+ "/en/doc/idea-plugin.md",
+ "/en/doc/faq.md",
+ {
+ text: "User cases",
+ link: "https://github.com/alibaba/arthas/issues?q=label%3Auser-case",
+ },
+ {
+ text: "Start me at github",
+ link: "https://github.com/alibaba/arthas",
+ },
+ {
+ text: "Compile and debug/CONTRIBUTING",
+ link: "https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md",
+ },
+ {
+ text: "Release Notes",
+ link: "https://github.com/alibaba/arthas/releases",
+ },
+ {
+ text: "Contact us",
+ link: "/en/doc/contact-us.md",
+ },
+ ],
+ },
+ ],
+};
diff --git a/site-vuepress/docs/.vuepress/configs/sidebar/zh.js b/site-vuepress/docs/.vuepress/configs/sidebar/zh.js
new file mode 100644
index 000000000..e16f1798f
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/configs/sidebar/zh.js
@@ -0,0 +1,152 @@
+module.exports = {
+ "/doc/": [
+ {
+ text: "文档",
+ children: [
+ "/doc/README.md",
+ "/doc/quick-start.md",
+ {
+ text: "在线教程(阿里云)",
+ link: "https://start.aliyun.com/handson-lab?category=arthas",
+ },
+ "/doc/install-detail.md",
+ "/doc/download.md",
+ "/doc/advanced-use.md",
+ {
+ text: "其他特性",
+ collapsible: true,
+ children: [
+ "/doc/async.md",
+ "/doc/save-log.md",
+ "/doc/batch-support.md",
+ {
+ text: "ognl 表达式用法",
+ link: "",
+ children: [
+ {
+ text: "活用ognl表达式",
+ link: "https://github.com/alibaba/arthas/issues/11",
+ },
+ {
+ text: "一些ognl特殊用法",
+ link: "https://github.com/alibaba/arthas/issues/71",
+ },
+ ],
+ },
+ ],
+ },
+ {
+ text: "命令列表",
+ collapsible: true,
+ link: "/doc/commands.md",
+ children: [
+ {
+ text: "jvm相关",
+ collapsible: false,
+ children: [
+ "/doc/dashboard.md",
+ "/doc/thread.md",
+ "/doc/jvm.md",
+ "/doc/memory.md",
+ "/doc/sysprop.md",
+ "/doc/sysenv.md",
+ "/doc/vmoption.md",
+ "/doc/perfcounter.md",
+ "/doc/logger.md",
+ "/doc/mbean.md",
+ "/doc/getstatic.md",
+ "/doc/ognl.md",
+ "/doc/heapdump.md",
+ "/doc/vmtool.md",
+ ],
+ },
+ {
+ text: "class/classloader相关",
+ collapsible: false,
+ children: [
+ "/doc/sc.md",
+ "/doc/sm.md",
+ "/doc/jad.md",
+ "/doc/classloader.md",
+ "/doc/mc.md",
+ "/doc/dump.md",
+ "/doc/retransform.md",
+ "/doc/redefine.md",
+ ],
+ },
+ {
+ text: "monitor/watch/trace相关",
+ collapsible: false,
+ children: [
+ "/doc/monitor.md",
+ "/doc/watch.md",
+ "/doc/trace.md",
+ "/doc/stack.md",
+ "/doc/tt.md",
+ ],
+ },
+ {
+ text: "其他",
+ collapsible: false,
+ children: [
+ "/doc/profiler.md",
+ "/doc/cat.md",
+ "/doc/echo.md",
+ "/doc/grep.md",
+ "/doc/base64.md",
+ "/doc/tee.md",
+ "/doc/pwd.md",
+ "/doc/auth.md",
+ "/doc/options.md",
+ ],
+ },
+ {
+ text: "基础命令",
+ collapsible: false,
+ children: [
+ "/doc/help.md",
+ "/doc/cls.md",
+ "/doc/session.md",
+ "/doc/reset.md",
+ "/doc/history.md",
+ "/doc/quit.md",
+ "/doc/stop.md",
+ {
+ text: "keymap",
+ link: "/doc/keymap.md",
+ },
+ ],
+ },
+ ],
+ },
+ "/doc/web-console.md",
+ "/doc/tunnel.md",
+ "/doc/http-api.md",
+ "/doc/docker.md",
+ "/doc/spring-boot-starter.md",
+ "/doc/idea-plugin.md",
+ "/doc/faq.md",
+ {
+ text: "用户案列",
+ link: "https://github.com/alibaba/arthas/issues?q=label%3Auser-case",
+ },
+ {
+ text: "Start me at github",
+ link: "https://github.com/alibaba/arthas",
+ },
+ {
+ text: "编译调试/参与贡献",
+ link: "https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md",
+ },
+ {
+ text: "Release Notes",
+ link: "https://github.com/alibaba/arthas/releases",
+ },
+ {
+ text: "QQ群/钉钉群",
+ link: "/doc/contact-us.md",
+ },
+ ],
+ },
+ ],
+};
diff --git a/site-vuepress/docs/.vuepress/oldContributorsData.json b/site-vuepress/docs/.vuepress/oldContributorsData.json
new file mode 100644
index 000000000..4daee0286
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/oldContributorsData.json
@@ -0,0 +1,2274 @@
+{
+ "doc/start-arthas.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "mantuliu",
+ "email": "240951888@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/sm.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/session.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/retransform.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "doc/redefine.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 8
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/quit.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/quick-start.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 23
+ },
+ {
+ "name": "Gene",
+ "email": "geneq@hotmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Sergio Escalante",
+ "email": "sergioescala@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "northmorn",
+ "email": "northmorn@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "靳阳",
+ "email": "260893248@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/profiler.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/perfcounter.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/options.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 9
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "qianmoke",
+ "email": "zzilovey@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/ognl.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/monitor.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "mikawudi",
+ "email": "mikawudi@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/memory.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/mc.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "vic",
+ "email": "snipercy@users.noreply.github.com",
+ "commits": 1
+ }
+ ],
+ "doc/mbean.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "徐志毅",
+ "email": "xuzhiyi@youzan.com",
+ "commits": 1
+ }
+ ],
+ "doc/manual-install.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 12
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/keymap.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/jvm.md": [
+ {
+ "name": "bohr.qiu",
+ "email": "bohr.qiu@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/jad.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 8
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "penguin-wwy",
+ "email": "940375606@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/install-detail.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 29
+ }
+ ],
+ "doc/index.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 53
+ },
+ {
+ "name": "TheoneFx",
+ "email": "chenxilzx1@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "lzc-alioo",
+ "email": "33567235+lzc-alioo@users.noreply.github.com",
+ "commits": 1
+ }
+ ],
+ "doc/idea-plugin.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "zthreefires",
+ "email": "34255589+zthreefires@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/http-api.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/history.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/help.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/heapdump.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/groovy.md": [
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/grep.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/getstatic.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/faq.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 17
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 2
+ },
+ {
+ "name": "Gong Dewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/echo.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/dump.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/download.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ }
+ ],
+ "doc/docker.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ },
+ {
+ "name": "garenchan",
+ "email": "1412950785@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/dashboard.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "xuefeng0707",
+ "email": "xuefeng0707@hotmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/contact-us.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 10
+ }
+ ],
+ "doc/commands.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 23
+ },
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/cls.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/classloader.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 2
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/cat.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/batch-support.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "D-H-T",
+ "email": "dht925nerd@126.com",
+ "commits": 1
+ }
+ ],
+ "doc/base64.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/auth.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ }
+ ],
+ "doc/async.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/arthas3.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ }
+ ],
+ "doc/arthas-properties.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "doc/agent.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "doc/advice-class.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ }
+ ],
+ "doc/advanced-use.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 28
+ },
+ {
+ "name": "penguin-wwy",
+ "email": "940375606@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "徐志毅",
+ "email": "xuzhiyi@youzan.com",
+ "commits": 1
+ },
+ {
+ "name": "静宏",
+ "email": "acvrock.cn@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/README.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/stack.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/thread.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "李鼎",
+ "email": "oldratlee@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/sysenv.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/tee.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "pipetee",
+ "email": "toyangmin@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/stop.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/trace.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 14
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Jerry",
+ "email": "favoorr@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "徐志毅",
+ "email": "xuzhiyi@youzan.com",
+ "commits": 1
+ }
+ ],
+ "doc/pwd.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/release-notes.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 8
+ }
+ ],
+ "doc/reset.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/save-log.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/sc.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/spring-boot-starter.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 11
+ }
+ ],
+ "doc/tunnel.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ }
+ ],
+ "doc/vmtool.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "doc/tt.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "superheizai",
+ "email": "superheizai@aliyun.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Xiangmingzhe",
+ "email": "xiangmz0928@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "vic",
+ "email": "snipercy@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/vmoption.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/logger.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ }
+ ],
+ "doc/sysprop.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/version.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "doc/watch.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 12
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "vic",
+ "email": "snipercy@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "doc/web-console.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 14
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/sm.md": [
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/session.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/sc.md": [
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "Sergio Escalante",
+ "email": "sergioescala@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/save-log.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/retransform.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "en/doc/reset.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/release-notes.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/redefine.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/quit.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/quick-start.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 15
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "garenchan",
+ "email": "1412950785@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/pwd.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/profiler.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/perfcounter.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/options.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 8
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "alfredzouang",
+ "email": "43456743+alfredzouang@users.noreply.github.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/ognl.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/monitor.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "mikawudi",
+ "email": "mikawudi@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/memory.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/mc.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "vic",
+ "email": "snipercy@users.noreply.github.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/mbean.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "徐志毅",
+ "email": "xuzhiyi@youzan.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/manual-install.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 7
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Sergio Escalante",
+ "email": "sergioescala@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/logger.md": [
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/keymap.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/jvm.md": [
+ {
+ "name": "bohr.qiu",
+ "email": "bohr.qiu@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/jad.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/install-detail.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 18
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Sahil Jha",
+ "email": "sjha200000@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/index.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 28
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "LHearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Nithyanandan Natchimuthu",
+ "email": "anand1st@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Sahil Jha",
+ "email": "sjha200000@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/idea-plugin.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/http-api.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/history.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/help.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/heapdump.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/groovy.md": [
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/grep.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/getstatic.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/faq.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 15
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 2
+ },
+ {
+ "name": "Gong Dewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/echo.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/dump.md": [
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman@hollowman.ml",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/download.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/docker.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ },
+ {
+ "name": "garenchan",
+ "email": "1412950785@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/dashboard.md": [
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "xuefeng0707",
+ "email": "xuefeng0707@hotmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/contact-us.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Sahil Jha",
+ "email": "sjha200000@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/commands.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 21
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/cls.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/classloader.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 4
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 2
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/cat.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/batch-support.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/base64.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/auth.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 6
+ }
+ ],
+ "en/doc/async.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Sergio Escalante",
+ "email": "sergioescala@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/arthas-properties.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "en/doc/agent.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "en/doc/advice-class.md": [
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/advanced-use.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 28
+ },
+ {
+ "name": "Arteev Raina",
+ "email": "arteevraina@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "HearingSmile",
+ "email": "41669762+tianjindong@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "徐志毅",
+ "email": "xuzhiyi@youzan.com",
+ "commits": 1
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "静宏",
+ "email": "acvrock.cn@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/README.md": [
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/stack.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/start-arthas.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "mantuliu",
+ "email": "240951888@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/spring-boot-starter.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 8
+ }
+ ],
+ "en/doc/stop.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/sysenv.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/sysprop.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/tee.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "pipetee",
+ "email": "toyangmin@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/thread.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "gongdewei",
+ "email": "kylixs@qq.com",
+ "commits": 1
+ },
+ {
+ "name": "李鼎",
+ "email": "oldratlee@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/tt.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 2
+ },
+ {
+ "name": "superheizai",
+ "email": "superheizai@aliyun.com",
+ "commits": 2
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Sergio Escalante",
+ "email": "sergioescala@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/version.md": [
+ {
+ "name": "Fu",
+ "email": "dkafussss@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/watch.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 10
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 2
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "汪吉",
+ "email": "983433479@qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/tunnel.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 5
+ }
+ ],
+ "en/doc/vmtool.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ }
+ ],
+ "en/doc/trace.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 12
+ },
+ {
+ "name": "0xflotus",
+ "email": "26602940+0xflotus@users.noreply.github.com",
+ "commits": 1
+ },
+ {
+ "name": "Hearen",
+ "email": "LHearen@126.com",
+ "commits": 1
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ },
+ {
+ "name": "Jerry",
+ "email": "favoorr@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "LHearen",
+ "email": "lhearen@gmail.com",
+ "commits": 1
+ },
+ {
+ "name": "beiwei30",
+ "email": "ian.luo@gmail.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/vmoption.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 3
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ],
+ "en/doc/web-console.md": [
+ {
+ "name": "hengyunabc",
+ "email": "hengyunabc@gmail.com",
+ "commits": 15
+ },
+ {
+ "name": "Hollow Man",
+ "email": "hollowman186@vip.qq.com",
+ "commits": 1
+ }
+ ]
+}
diff --git a/site-vuepress/docs/.vuepress/public/doc/arthas-tutorials.html b/site-vuepress/docs/.vuepress/public/doc/arthas-tutorials.html
new file mode 100644
index 000000000..8df42b2b3
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/public/doc/arthas-tutorials.html
@@ -0,0 +1,1147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Arthas Tutorials
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/src/site/sphinx/_static/alibabacloud_hotreload.png b/site-vuepress/docs/.vuepress/public/images/alibabacloud_hotreload.png
similarity index 100%
rename from site/src/site/sphinx/_static/alibabacloud_hotreload.png
rename to site-vuepress/docs/.vuepress/public/images/alibabacloud_hotreload.png
diff --git a/site/src/site/sphinx/_static/arthas-output-svg.jpg b/site-vuepress/docs/.vuepress/public/images/arthas-output-svg.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/arthas-output-svg.jpg
rename to site-vuepress/docs/.vuepress/public/images/arthas-output-svg.jpg
diff --git a/site/src/site/sphinx/_static/arthas-output.jpg b/site-vuepress/docs/.vuepress/public/images/arthas-output.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/arthas-output.jpg
rename to site-vuepress/docs/.vuepress/public/images/arthas-output.jpg
diff --git a/site/src/site/sphinx/_static/arthas-tunnel-server.png b/site-vuepress/docs/.vuepress/public/images/arthas-tunnel-server.png
similarity index 100%
rename from site/src/site/sphinx/_static/arthas-tunnel-server.png
rename to site-vuepress/docs/.vuepress/public/images/arthas-tunnel-server.png
diff --git a/site/src/site/sphinx/_static/arthas-web-ui.png b/site-vuepress/docs/.vuepress/public/images/arthas-web-ui.png
similarity index 100%
rename from site/src/site/sphinx/_static/arthas-web-ui.png
rename to site-vuepress/docs/.vuepress/public/images/arthas-web-ui.png
diff --git a/site-vuepress/docs/.vuepress/public/images/arthas.png b/site-vuepress/docs/.vuepress/public/images/arthas.png
new file mode 100644
index 000000000..73317782d
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/arthas.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/arthas_dark.png b/site-vuepress/docs/.vuepress/public/images/arthas_dark.png
new file mode 100644
index 000000000..236613852
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/arthas_dark.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/arthas_light.png b/site-vuepress/docs/.vuepress/public/images/arthas_light.png
new file mode 100644
index 000000000..ff4190d7b
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/arthas_light.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/dashboard.png b/site-vuepress/docs/.vuepress/public/images/dashboard.png
new file mode 100644
index 000000000..7eddc17d6
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/dashboard.png differ
diff --git a/site/src/site/sphinx/_static/dingding2_qr.jpg b/site-vuepress/docs/.vuepress/public/images/dingding2_qr.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/dingding2_qr.jpg
rename to site-vuepress/docs/.vuepress/public/images/dingding2_qr.jpg
diff --git a/site/src/site/sphinx/_static/dingding_group_search.png b/site-vuepress/docs/.vuepress/public/images/dingding_group_search.png
similarity index 100%
rename from site/src/site/sphinx/_static/dingding_group_search.png
rename to site-vuepress/docs/.vuepress/public/images/dingding_group_search.png
diff --git a/site/src/site/sphinx/_static/dingding_qr.jpg b/site-vuepress/docs/.vuepress/public/images/dingding_qr.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/dingding_qr.jpg
rename to site-vuepress/docs/.vuepress/public/images/dingding_qr.jpg
diff --git a/site/src/site/sphinx/favicon.ico b/site-vuepress/docs/.vuepress/public/images/favicon.ico
similarity index 100%
rename from site/src/site/sphinx/favicon.ico
rename to site-vuepress/docs/.vuepress/public/images/favicon.ico
diff --git a/site/src/site/sphinx/_static/logo.png b/site-vuepress/docs/.vuepress/public/images/logo.png
similarity index 100%
rename from site/src/site/sphinx/_static/logo.png
rename to site-vuepress/docs/.vuepress/public/images/logo.png
diff --git a/site/src/site/sphinx/_static/qqgroup2_qr.jpg b/site-vuepress/docs/.vuepress/public/images/qqgroup2_qr.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/qqgroup2_qr.jpg
rename to site-vuepress/docs/.vuepress/public/images/qqgroup2_qr.jpg
diff --git a/site/src/site/sphinx/_static/qqgroup_qr.jpg b/site-vuepress/docs/.vuepress/public/images/qqgroup_qr.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/qqgroup_qr.jpg
rename to site-vuepress/docs/.vuepress/public/images/qqgroup_qr.jpg
diff --git a/site/src/site/sphinx/_static/qr-jd-2019.png b/site-vuepress/docs/.vuepress/public/images/qr-jd-2019.png
similarity index 100%
rename from site/src/site/sphinx/_static/qr-jd-2019.png
rename to site-vuepress/docs/.vuepress/public/images/qr-jd-2019.png
diff --git a/site/src/site/sphinx/_static/qrcode_gongzhonghao.jpg b/site-vuepress/docs/.vuepress/public/images/qrcode_gongzhonghao.jpg
similarity index 100%
rename from site/src/site/sphinx/_static/qrcode_gongzhonghao.jpg
rename to site-vuepress/docs/.vuepress/public/images/qrcode_gongzhonghao.jpg
diff --git a/site-vuepress/docs/.vuepress/public/images/trace.png b/site-vuepress/docs/.vuepress/public/images/trace.png
new file mode 100644
index 000000000..d7fa4692d
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/trace.png differ
diff --git a/site/src/site/sphinx/_static/tunnel-server-agents.png b/site-vuepress/docs/.vuepress/public/images/tunnel-server-agents.png
similarity index 100%
rename from site/src/site/sphinx/_static/tunnel-server-agents.png
rename to site-vuepress/docs/.vuepress/public/images/tunnel-server-agents.png
diff --git a/site/src/site/sphinx/_static/tunnel-server-apps.png b/site-vuepress/docs/.vuepress/public/images/tunnel-server-apps.png
similarity index 100%
rename from site/src/site/sphinx/_static/tunnel-server-apps.png
rename to site-vuepress/docs/.vuepress/public/images/tunnel-server-apps.png
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_alibaba.png b/site-vuepress/docs/.vuepress/public/images/users/users_alibaba.png
new file mode 100644
index 000000000..a6e4ecdee
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_alibaba.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_didi.png b/site-vuepress/docs/.vuepress/public/images/users/users_didi.png
new file mode 100644
index 000000000..df1ec282d
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_didi.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_icbc.png b/site-vuepress/docs/.vuepress/public/images/users/users_icbc.png
new file mode 100644
index 000000000..aca25a4c5
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_icbc.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_kaola.png b/site-vuepress/docs/.vuepress/public/images/users/users_kaola.png
new file mode 100644
index 000000000..be7dac8cd
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_kaola.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_qunar.png b/site-vuepress/docs/.vuepress/public/images/users/users_qunar.png
new file mode 100644
index 000000000..658287308
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_qunar.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_telecom.png b/site-vuepress/docs/.vuepress/public/images/users/users_telecom.png
new file mode 100644
index 000000000..7406587b2
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_telecom.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_weidian.png b/site-vuepress/docs/.vuepress/public/images/users/users_weidian.png
new file mode 100644
index 000000000..a166da39b
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_weidian.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/users/users_yinlian.png b/site-vuepress/docs/.vuepress/public/images/users/users_yinlian.png
new file mode 100644
index 000000000..d13e93416
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/users/users_yinlian.png differ
diff --git a/site-vuepress/docs/.vuepress/public/images/web-console-local.png b/site-vuepress/docs/.vuepress/public/images/web-console-local.png
new file mode 100644
index 000000000..56f44e4f2
Binary files /dev/null and b/site-vuepress/docs/.vuepress/public/images/web-console-local.png differ
diff --git a/site-vuepress/docs/.vuepress/styles/index.scss b/site-vuepress/docs/.vuepress/styles/index.scss
new file mode 100644
index 000000000..512a9be62
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/styles/index.scss
@@ -0,0 +1,3 @@
+.site-name.can-hide {
+ display: none;
+}
diff --git a/site-vuepress/docs/.vuepress/theme/components/AutoLink.vue b/site-vuepress/docs/.vuepress/theme/components/AutoLink.vue
new file mode 100644
index 000000000..cbf4d6d44
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/AutoLink.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/Badge.vue b/site-vuepress/docs/.vuepress/theme/components/Badge.vue
new file mode 100644
index 000000000..b5b261170
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/Badge.vue
@@ -0,0 +1,72 @@
+
+
+
+
+ {{ number }}
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/Home.vue b/site-vuepress/docs/.vuepress/theme/components/Home.vue
new file mode 100644
index 000000000..d7f0b6a0b
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/Home.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/HomeBadges.vue b/site-vuepress/docs/.vuepress/theme/components/HomeBadges.vue
new file mode 100644
index 000000000..c1792f423
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/HomeBadges.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/HomeFeatures.vue b/site-vuepress/docs/.vuepress/theme/components/HomeFeatures.vue
new file mode 100644
index 000000000..01d623ea6
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/HomeFeatures.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
{{ feature.icon }}
+
{{ feature.title }}
+
{{ feature.details }}
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/HomeHero.vue b/site-vuepress/docs/.vuepress/theme/components/HomeHero.vue
new file mode 100644
index 000000000..fb5615f33
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/HomeHero.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+ {{ heroText }}
+
+
+
+ {{ tagline }}
+
+
+
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/HomeUserBoards.vue b/site-vuepress/docs/.vuepress/theme/components/HomeUserBoards.vue
new file mode 100644
index 000000000..43cceba30
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/HomeUserBoards.vue
@@ -0,0 +1,37 @@
+
+
+
{{ pageData.users_title }}
+
+
+
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/NavbarDropdown.vue b/site-vuepress/docs/.vuepress/theme/components/NavbarDropdown.vue
new file mode 100644
index 000000000..d13ff30e2
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/NavbarDropdown.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ {{ child.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/UserBoard.vue b/site-vuepress/docs/.vuepress/theme/components/UserBoard.vue
new file mode 100644
index 000000000..8fc42574f
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/UserBoard.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/icons/Fork.vue b/site-vuepress/docs/.vuepress/theme/components/icons/Fork.vue
new file mode 100644
index 000000000..a27db01ce
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/icons/Fork.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/icons/GitHub.vue b/site-vuepress/docs/.vuepress/theme/components/icons/GitHub.vue
new file mode 100644
index 000000000..24ae4d975
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/icons/GitHub.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/icons/Star.vue b/site-vuepress/docs/.vuepress/theme/components/icons/Star.vue
new file mode 100644
index 000000000..c3e59ff79
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/icons/Star.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/components/icons/Translate.vue b/site-vuepress/docs/.vuepress/theme/components/icons/Translate.vue
new file mode 100644
index 000000000..f5f775a96
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/components/icons/Translate.vue
@@ -0,0 +1,15 @@
+
+
+
diff --git a/site-vuepress/docs/.vuepress/theme/index.js b/site-vuepress/docs/.vuepress/theme/index.js
new file mode 100644
index 000000000..e8891d327
--- /dev/null
+++ b/site-vuepress/docs/.vuepress/theme/index.js
@@ -0,0 +1,18 @@
+const { defaultTheme } = require("@vuepress/theme-default");
+const { path } = require("@vuepress/utils");
+
+exports.localTheme = (options) => {
+ return {
+ name: "vuepress-theme-arthas",
+ extends: defaultTheme(options),
+
+ alias: {
+ "@theme/Home.vue": path.resolve(__dirname, "components/Home.vue"),
+ "@theme/NavbarDropdown.vue": path.resolve(
+ __dirname,
+ "components/NavbarDropdown.vue"
+ ),
+ "@theme/AutoLink.vue": path.resolve(__dirname, "components/AutoLink.vue"),
+ },
+ };
+};
diff --git a/site-vuepress/docs/README.md b/site-vuepress/docs/README.md
new file mode 100644
index 000000000..7f8d117bf
--- /dev/null
+++ b/site-vuepress/docs/README.md
@@ -0,0 +1,53 @@
+---
+home: true
+heroImage: /images/arthas_light.png
+heroImageDark: /images/arthas_dark.png
+heroText: null
+tagline: "Java 应用诊断利器"
+actions:
+ - text: 快速入门
+ link: /doc/quick-start.html
+ type: primary
+ - text: 查看github
+ link: https://github.com/alibaba/arthas
+ type: secondary
+features:
+ - icon: 🖥
+ title: Dashboard
+ details: 实时查看系统的运行状况。
+ - icon: 🔬
+ title: 查看入参/返回值/异常
+ details: 查看函数调用的参数,返回值和异常。
+ - icon: 🔩
+ title: 在线热更新
+ details: jad/sc/redefine 一条龙热更新代码。
+ - icon: 🩺
+ title: 类冲突
+ details: 秒解类冲突问题,定位类加载路径。
+ - icon: ⚡️
+ title: 性能热点
+ details: 快速定位应用的热点,生成火焰图。
+ - icon: 📡
+ title: WebConsole
+ details: 在线诊断,点开网页诊断线上应用。
+users_title: "用户"
+users_details: "请在 Wanted: who's using arthas 上提供信息来帮助Arthas做的更好。"
+users:
+ - name: Alibaba Group
+ logo: /images/users/users_alibaba.png
+ - name: Didiglobal
+ logo: /images/users/users_didi.png
+ - name: Kaola
+ logo: /images/users/users_kaola.png
+ - name: Qunar
+ logo: /images/users/users_qunar.png
+ - name: Telecom
+ logo: /images/users/users_telecom.png
+ - name: Weidian
+ logo: /images/users/users_weidian.png
+ - name: ICBC
+ logo: /images/users/users_icbc.png
+ - name: Chinaums
+ logo: /images/users/users_yinlian.png
+footer: Apache-2.0 license | Copyright 2018-present, Alibaba Middleware Group, and contributors
+---
diff --git a/site-vuepress/docs/doc/README.md b/site-vuepress/docs/doc/README.md
new file mode 100644
index 000000000..373060be5
--- /dev/null
+++ b/site-vuepress/docs/doc/README.md
@@ -0,0 +1,24 @@
+# 简介
+
+Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
+
+## Arthas(阿尔萨斯)能为你做什么?
+
+
+
+`Arthas` 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
+
+当你遇到以下类似问题而束手无策时,`Arthas`可以帮助你解决:
+
+0. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
+1. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
+2. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
+3. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
+4. 是否有一个全局视角来查看系统的运行状况?
+5. 有什么办法可以监控到 JVM 的实时运行状态?
+6. 怎么快速定位应用的热点,生成火焰图?
+7. 怎样直接从 JVM 内查找某个类的实例?
+
+`Arthas` 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。
+
+**如果您在使用 Arthas,请让我们知道,您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111)**
diff --git a/site-vuepress/docs/doc/advanced-use.md b/site-vuepress/docs/doc/advanced-use.md
new file mode 100644
index 000000000..52a64d92e
--- /dev/null
+++ b/site-vuepress/docs/doc/advanced-use.md
@@ -0,0 +1,157 @@
+# 进阶使用
+
+## 基础命令
+
+- [help](help.md)——查看命令帮助信息
+- [cat](cat.md)——打印文件内容,和 linux 里的 cat 命令类似
+- [echo](echo.md)——打印参数,和 linux 里的 echo 命令类似
+- [grep](grep.md)——匹配查找,和 linux 里的 grep 命令类似
+- [base64](base64.md)——base64 编码转换,和 linux 里的 base64 命令类似
+- [tee](tee.md)——复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
+- [pwd](pwd.md)——返回当前的工作目录,和 linux 命令类似
+- [cls](cls.md)——清空当前屏幕区域
+- [session](session.md)——查看当前会话的信息
+- [reset](reset.md)——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
+- [version](version.md)——输出当前目标 Java 进程所加载的 Arthas 版本号
+- [history](history.md)——打印命令历史
+- [quit](quit.md)——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
+- [stop](stop.md)——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
+- [keymap](keymap.md)——Arthas 快捷键列表及自定义快捷键
+
+## jvm 相关
+
+- [dashboard](dashboard.md)——当前系统的实时数据面板
+- [thread](thread.md)——查看当前 JVM 的线程堆栈信息
+- [jvm](jvm.md)——查看当前 JVM 的信息
+- [sysprop](sysprop.md)——查看和修改 JVM 的系统属性
+- [sysenv](sysenv.md)——查看 JVM 的环境变量
+- [vmoption](vmoption.md)——查看和修改 JVM 里诊断相关的 option
+- [perfcounter](perfcounter.md)——查看当前 JVM 的 Perf Counter 信息
+- [logger](logger.md)——查看和修改 logger
+- [getstatic](getstatic.md)——查看类的静态属性
+- [ognl](ognl.md)——执行 ognl 表达式
+- [mbean](mbean.md)——查看 Mbean 的信息
+- [heapdump](heapdump.md)——dump java heap, 类似 jmap 命令的 heap dump 功能
+- [vmtool](vmtool.md)——从 jvm 里查询对象,执行 forceGc
+
+## class/classloader 相关
+
+- [sc](sc.md)——查看 JVM 已加载的类信息
+- [sm](sm.md)——查看已加载类的方法信息
+- [jad](jad.md)——反编译指定已加载类的源码
+- [mc](mc.md)——内存编译器,内存编译`.java`文件为`.class`文件
+- [retransform](retransform.md)——加载外部的`.class`文件,retransform 到 JVM 里
+- [redefine](redefine.md)——加载外部的`.class`文件,redefine 到 JVM 里
+- [dump](dump.md)——dump 已加载类的 byte code 到特定目录
+- [classloader](classloader.md)——查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
+
+## monitor/watch/trace 相关
+
+::: warning
+请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 `stop` 或将增强过的类执行 `reset` 命令。
+:::
+
+- [monitor](monitor.md)——方法执行监控
+- [watch](watch.md)——方法执行数据观测
+- [trace](trace.md)——方法内部调用路径,并输出方法路径上的每个节点上耗时
+- [stack](stack.md)——输出当前方法被调用的调用路径
+- [tt](tt.md)——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
+
+## profiler/火焰图
+
+- [profiler](profiler.md)--使用[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)对应用采样,生成火焰图
+
+## 鉴权
+
+- [auth](auth.md)——鉴权
+
+## options
+
+- [options](options.md)——查看或设置 Arthas 全局开关
+
+## 管道
+
+Arthas 支持使用管道对上述命令的结果进行进一步的处理,如`sm java.lang.String * | grep 'index'`
+
+- [grep](grep.md)——搜索满足条件的结果
+- plaintext——将命令的结果去除 ANSI 颜色
+- wc——按行统计输出结果
+
+## 后台异步任务
+
+当线上出现偶发的问题,比如需要 watch 某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了,详情请参考[这里](async.md)
+
+- 使用 `>` 将结果重写向到日志文件,使用 `&` 指定命令是后台运行,session 断开不影响任务执行(生命周期默认为 1 天)
+- jobs——列出所有 job
+- kill——强制终止任务
+- fg——将暂停的任务拉到前台执行
+- bg——将暂停的任务放到后台执行
+
+## Web Console
+
+通过 websocket 连接 Arthas。
+
+- [Web Console](web-console.md)
+
+## Arthas Properties
+
+- [Arthas Properties](arthas-properties.md)
+
+## 以 java agent 方式启动
+
+- [以 java agent 方式启动](agent.md)
+
+## as.sh 和 arthas-boot 技巧
+
+- 通过`select`功能选择 attach 的进程。
+
+正常情况下,每次执行`as.sh`/`arthas-boot.jar`需要选择,或者指定 PID。这样会比较麻烦,因为每次启动应用,它的 PID 会变化。
+
+比如,已经启动了`math-game.jar`,使用`jps`命令查看:
+
+```bash
+$ jps
+58883 math-game.jar
+58884 Jps
+```
+
+通过`select`参数可以指定进程名字,非常方便。
+
+```bash
+$ ./as.sh --select math-game
+Arthas script version: 3.3.6
+[INFO] JAVA_HOME: /tmp/java/8.0.222-zulu
+Arthas home: /Users/admin/.arthas/lib/3.3.6/arthas
+Calculating attach execution time...
+Attaching to 59161 using version /Users/admin/.arthas/lib/3.3.6/arthas...
+
+real 0m0.572s
+user 0m0.281s
+sys 0m0.039s
+Attach success.
+telnet connecting to arthas server... current timestamp is 1594280799
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+| .-. || '--'.' | | | .--. || .-. |`. `-.
+| | | || |\ \ | | | | | || | | |.-' |
+`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+
+
+wiki https://arthas.aliyun.com/doc
+tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
+version 3.3.6
+pid 58883
+```
+
+## 用户数据回报
+
+在`3.1.4`版本后,增加了用户数据回报功能,方便统一做安全或者历史数据统计。
+
+在启动时,指定`stat-url`,就会回报执行的每一行命令,比如: `./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'`
+
+在 tunnel server 里有一个示例的回报代码,用户可以自己在服务器上实现。
+
+[StatController.java](https://github.com/alibaba/arthas/blob/master/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/app/web/StatController.java)
diff --git a/site-vuepress/docs/doc/advice-class.md b/site-vuepress/docs/doc/advice-class.md
new file mode 100644
index 000000000..8fdce9634
--- /dev/null
+++ b/site-vuepress/docs/doc/advice-class.md
@@ -0,0 +1,43 @@
+# 表达式核心变量
+
+无论是匹配表达式也好、观察表达式也罢,他们核心判断变量都是围绕着一个 Arthas 中的通用通知对象 `Advice` 进行。
+
+它的简略代码结构如下
+
+```java
+public class Advice {
+
+ private final ClassLoader loader;
+ private final Class> clazz;
+ private final ArthasMethod method;
+ private final Object target;
+ private final Object[] params;
+ private final Object returnObj;
+ private final Throwable throwExp;
+ private final boolean isBefore;
+ private final boolean isThrow;
+ private final boolean isReturn;
+
+ // getter/setter
+}
+```
+
+这里列一个表格来说明不同变量的含义
+
+| 变量名 | 变量解释 |
+| --------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| loader | 本次调用类所在的 ClassLoader |
+| clazz | 本次调用类的 Class 引用 |
+| method | 本次调用方法反射引用 |
+| target | 本次调用类的实例 |
+| params | 本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组 |
+| returnObj | 本次调用返回的对象。当且仅当 `isReturn==true` 成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 `void`,则值为 null |
+| throwExp | 本次调用抛出的异常。当且仅当 `isThrow==true` 成立时有效,表明方法调用是以抛出异常的方式结束。 |
+| isBefore | 辅助判断标记,当前的通知节点有可能是在方法一开始就通知,此时 `isBefore==true` 成立,同时 `isThrow==false` 和 `isReturn==false`,因为在方法刚开始时,还无法确定方法调用将会如何结束。 |
+| isThrow | 辅助判断标记,当前的方法调用以抛异常的形式结束。 |
+| isReturn | 辅助判断标记,当前的方法调用以正常返回的形式结束。 |
+
+所有变量都可以在表达式中直接使用,如果在表达式中编写了不符合 OGNL 脚本语法或者引入了不在表格中的变量,则退出命令的执行;用户可以根据当前的异常信息修正`条件表达式`或`观察表达式`
+
+- 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
diff --git a/site-vuepress/docs/doc/agent.md b/site-vuepress/docs/doc/agent.md
new file mode 100644
index 000000000..b71d25c52
--- /dev/null
+++ b/site-vuepress/docs/doc/agent.md
@@ -0,0 +1,13 @@
+# 以 Java Agent 的方式启动
+
+通常 Arthas 是以动态 attach 的方式来诊断应用,但从`3.2.0`版本起,Arthas 支持直接以 java agent 的方式启动。
+
+比如下载全量的 arthas zip 包,解压之后以 `-javaagent` 的参数指定`arthas-agent.jar`来启动:
+
+```
+java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar
+```
+
+默认的配置项在解压目录里的`arthas.properties`文件里。参考:[Arthas Properties](arthas-properties.md)
+
+Java Agent 机制参考: https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html
diff --git a/site-vuepress/docs/doc/arthas-properties.md b/site-vuepress/docs/doc/arthas-properties.md
new file mode 100644
index 000000000..d437acce1
--- /dev/null
+++ b/site-vuepress/docs/doc/arthas-properties.md
@@ -0,0 +1,62 @@
+# Arthas Properties
+
+`arthas.properties`文件在 arthas 的目录下。
+
+- 如果是自动下载的 arthas,则目录在`~/.arthas/lib/3.x.x/arthas/`下面
+- 如果是下载的完整包,在 arthas 解压目录下
+
+## 支持的配置项
+
+::: warning
+注意配置必须是`驼峰`的,和 spring boot 的`-`风格不一样。spring boot 应用才同时支持`驼峰` 和 `-`风格的配置。
+:::
+
+```
+#arthas.config.overrideAll=true
+arthas.telnetPort=3658
+arthas.httpPort=8563
+arthas.ip=127.0.0.1
+
+# seconds
+arthas.sessionTimeout=1800
+
+#arthas.appName=demoapp
+#arthas.tunnelServer=ws://127.0.0.1:7777/ws
+#arthas.agentId=mmmmmmyiddddd
+```
+
+- 如果配置 `arthas.telnetPort`为 -1 ,则不 listen telnet 端口。`arthas.httpPort`类似。
+- 如果配置 `arthas.telnetPort`为 0 ,则随机 telnet 端口,在`~/logs/arthas/arthas.log`里可以找到具体端口日志。`arthas.httpPort`类似。
+
+:::tip
+如果是防止一个机器上启动多个 arthas 端口冲突。可以配置为随机端口,或者配置为 -1,并且通过 tunnel server 来使用 arthas。
+:::
+
+### 禁止指定命令
+
+::: tip
+since 3.5.2
+:::
+
+比如配置:
+
+```
+arthas.disabledCommands=stop,dump
+```
+
+也可以在命令行配置: `--disabled-commands stop,dump` 。
+
+::: tip
+默认情况下,arthas-spring-boot-starter 会禁掉`stop`命令。
+:::
+
+## 配置的优先级
+
+配置的优先级是:命令行参数 > System Env > System Properties > arthas.properties 。
+
+比如:
+
+- `./as.sh --telnet-port 9999` 传入的配置会覆盖掉`arthas.properties`里的默认值`arthas.telnetPort=3658`。
+- 如果应用自身设置了 system properties `arthas.telnetPort=8888`,则会覆盖掉`arthas.properties`里的默认值`arthas.telnetPort=3658`。
+
+如果想要 `arthas.properties`的优先级最高,则可以配置 `arthas.config.overrideAll=true` 。
diff --git a/site/src/site/sphinx/arthas3.md b/site-vuepress/docs/doc/arthas3.md
similarity index 62%
rename from site/src/site/sphinx/arthas3.md
rename to site-vuepress/docs/doc/arthas3.md
index f510c4bb4..1289f22fc 100644
--- a/site/src/site/sphinx/arthas3.md
+++ b/site-vuepress/docs/doc/arthas3.md
@@ -1,7 +1,8 @@
-### Arthas3.0的新特性
+### Arthas3.0 的新特性
#### 在线诊断功能
-Arthas3.0中最重要的特性,不需要登陆机器就可以对应用进行诊断,体验和本地诊断完全一致
+
+Arthas3.0 中最重要的特性,不需要登陆机器就可以对应用进行诊断,体验和本地诊断完全一致
##### 使用步骤
@@ -12,26 +13,26 @@ TODO
TODO
#### 管道支持
-Arthas 3.0开始支持管道, 率先提供了`grep`,`wc`,`plaintext`的支持。
+Arthas 3.0 开始支持管道, 率先提供了`grep`,`wc`,`plaintext`的支持。
-### 去groovy依赖
+### 去 groovy 依赖
-groovy表达式在arthas2.0中大量使用,例如watch表达式
+groovy 表达式在 arthas2.0 中大量使用,例如 watch 表达式
```bash
watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "params + ' ' + returnObj" params.size()==2
```
-其中`"params + ' ' + returnObj"`以及`params.size()==2`背后其实都使用了groovy来进行表达式求值,如果反复大量的运行这些表达式,groovy会创建大量的classloader,打满perm区从而触发FGC。
+其中`"params + ' ' + returnObj"`以及`params.size()==2`背后其实都使用了 groovy 来进行表达式求值,如果反复大量的运行这些表达式,groovy 会创建大量的 classloader,打满 perm 区从而触发 FGC。
-为了避免这个问题,Arthas 3.0中使用了ognl这个更加轻量的表达式求值库来代替groovy,彻底解决了groovy引起的FGC风险。但由于这个替换,导致原来使用groovy脚本编写的自定义脚本失效。这个问题留待后续解决。
+为了避免这个问题,Arthas 3.0 中使用了 ognl 这个更加轻量的表达式求值库来代替 groovy,彻底解决了 groovy 引起的 FGC 风险。但由于这个替换,导致原来使用 groovy 脚本编写的自定义脚本失效。这个问题留待后续解决。
-在3.0中,watch命令的表达式部分的书写有了一些改变,详见[这里](https://arthas.aliyun.com/doc/watch)
+在 3.0 中,watch 命令的表达式部分的书写有了一些改变,详见[这里](https://arthas.aliyun.com/doc/watch)
-#### 提升rt统计精度
+#### 提升 rt 统计精度
-Arthas 2.0中,统计rt都是以`ms`为单位,对于某些比较小的方法调用,耗时在毫秒以下的都会被认为是0ms,造成trace总时间和各方法的时间相加不一致等问题(虽然这里面确实会有误差,主要Arthas自身的开销)。Arthas 3.0中所有rt的单位统一改为使用`ns`来统计,精准捕获你的方法耗时,让0ms这样无意义的统计数据不再出现!
+Arthas 2.0 中,统计 rt 都是以`ms`为单位,对于某些比较小的方法调用,耗时在毫秒以下的都会被认为是 0ms,造成 trace 总时间和各方法的时间相加不一致等问题(虽然这里面确实会有误差,主要 Arthas 自身的开销)。Arthas 3.0 中所有 rt 的单位统一改为使用`ns`来统计,精准捕获你的方法耗时,让 0ms 这样无意义的统计数据不再出现!
```
$ tt -l
@@ -45,13 +46,13 @@ $ tt -l
1005 2017-02-24 10:57:39 814.657657 true false 0x3bd5e918 TestTraceServlet doGet
```
-#### watch/stack/trace命令支持按耗时过滤
+#### watch/stack/trace 命令支持按耗时过滤
-我们在trace的时候,经常会出现某个方法间隙性的rt飙高,但是我们只想知道rt高的时候,是哪里慢了,对于正常rt的方法我们并不关心,Arthas 3.0支持了按`#cost`(方法执行耗时,单位为`ms`)进行过滤,只输出符合条件的trace路径,目前,这三个命令的相关文档已经做了更新,增加了该用法的示例。
+我们在 trace 的时候,经常会出现某个方法间隙性的 rt 飙高,但是我们只想知道 rt 高的时候,是哪里慢了,对于正常 rt 的方法我们并不关心,Arthas 3.0 支持了按`#cost`(方法执行耗时,单位为`ms`)进行过滤,只输出符合条件的 trace 路径,目前,这三个命令的相关文档已经做了更新,增加了该用法的示例。
-#### sysprop命令操作SystemProperty
+#### sysprop 命令操作 SystemProperty
-sysprop命令支持查看所有的系统属性,以及针对特定属性进行查看和修改。
+sysprop 命令支持查看所有的系统属性,以及针对特定属性进行查看和修改。
```
$ sysprop
@@ -77,36 +78,32 @@ Successfully changed the system property.
production.mode=true
```
-#### thread命令支持指定采样时间
+#### thread 命令支持指定采样时间
-thread命令计算线程cpu占用的逻辑,默认是采样100ms内各个线程的cpu使用情况并计算cpu消耗占比。有时候100ms的时间间隔太短,看不出问题所在,Arthas3.0中thread命令支持设置采样间隔(以`ms`为单位),可以观察任意时间段内的cpu消耗占比情况。
+thread 命令计算线程 cpu 占用的逻辑,默认是采样 100ms 内各个线程的 cpu 使用情况并计算 cpu 消耗占比。有时候 100ms 的时间间隔太短,看不出问题所在,Arthas3.0 中 thread 命令支持设置采样间隔(以`ms`为单位),可以观察任意时间段内的 cpu 消耗占比情况。
```
-$ thread -i 1000
-Threads Total: 74, NEW: 0, RUNNABLE: 17, BLOCKED: 0, WAITING: 15, TIMED_WAITING: 42, TERMINATED: 0
-ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTED DAEMON
-78 com.taobao.config.client.timer main 5 TIMED_WAITING 22 0:0 false true
-92 Abandoned connection cleanup thread main 5 TIMED_WAITING 15 0:2 false true
-361 as-command-execute-daemon system 10 RUNNABLE 14 0:0 false true
-67 HSF-Remoting-Timer-10-thread-1 main 10 TIMED_WAITING 12 0:2 false true
-113 JamScheduleThread system 9 TIMED_WAITING 2 0:0 false true
-14 Thread-3 main 5 RUNNABLE 2 0:0 false false
-81 com.taobao.remoting.TimerThread main 5 TIMED_WAITING 2 0:0 false true
-104 http-bio-7001-AsyncTimeout main 5 TIMED_WAITING 2 0:0 false true
-123 nioEventLoopGroup-2-1 system 10 RUNNABLE 2 0:0 false false
-127 nioEventLoopGroup-3-2 system 10 RUNNABLE 2 0:0 false false
-345 nioEventLoopGroup-3-3 system 10 RUNNABLE 2 0:0 false false
-358 nioEventLoopGroup-3-4 system 10 RUNNABLE 2 0:0 false false
-27 qos-boss-1-1 main 5 RUNNABLE 2 0:0 false true
-22 EagleEye-AsyncAppender-Thread-BizLog main 5 TIMED_WAITING 1 0:0 false true
+$ thread -i 1000
+Threads Total: 74, NEW: 0, RUNNABLE: 17, BLOCKED: 0, WAITING: 15, TIMED_WAITING: 42, TERMINATED: 0
+ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTED DAEMON
+78 com.taobao.config.client.timer main 5 TIMED_WAITING 22 0:0 false true
+92 Abandoned connection cleanup thread main 5 TIMED_WAITING 15 0:2 false true
+361 as-command-execute-daemon system 10 RUNNABLE 14 0:0 false true
+67 HSF-Remoting-Timer-10-thread-1 main 10 TIMED_WAITING 12 0:2 false true
+113 JamScheduleThread system 9 TIMED_WAITING 2 0:0 false true
+14 Thread-3 main 5 RUNNABLE 2 0:0 false false
+81 com.taobao.remoting.TimerThread main 5 TIMED_WAITING 2 0:0 false true
+104 http-bio-7001-AsyncTimeout main 5 TIMED_WAITING 2 0:0 false true
+123 nioEventLoopGroup-2-1 system 10 RUNNABLE 2 0:0 false false
+127 nioEventLoopGroup-3-2 system 10 RUNNABLE 2 0:0 false false
+345 nioEventLoopGroup-3-3 system 10 RUNNABLE 2 0:0 false false
+358 nioEventLoopGroup-3-4 system 10 RUNNABLE 2 0:0 false false
+27 qos-boss-1-1 main 5 RUNNABLE 2 0:0 false true
+22 EagleEye-AsyncAppender-Thread-BizLog main 5 TIMED_WAITING 1 0:0 false true
```
+#### trace 命令自动高亮显示最耗时方法调用
-#### trace命令自动高亮显示最耗时方法调用
-
-trace命令现在会自动显示
+trace 命令现在会自动显示

-
-
-
diff --git a/site-vuepress/docs/doc/async.md b/site-vuepress/docs/doc/async.md
new file mode 100644
index 000000000..d7347303d
--- /dev/null
+++ b/site-vuepress/docs/doc/async.md
@@ -0,0 +1,80 @@
+# Arthas 后台异步任务
+
+[`后台异步任务`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=case-async-jobs)
+
+arthas 中的后台异步任务,使用了仿 linux 系统任务相关的命令。[linux 任务相关介绍](https://ehlxr.me/2017/01/18/Linux-%E4%B8%AD-fg%E3%80%81bg%E3%80%81jobs%E3%80%81-%E6%8C%87%E4%BB%A4/)。
+
+## 1. 使用&在后台执行任务
+
+比如希望执行后台执行 trace 命令,那么调用下面命令
+
+```bash
+trace Test t &
+```
+
+这时命令在后台执行,可以在 console 中继续执行其他命令。
+
+## 2. 通过 jobs 查看任务
+
+如果希望查看当前有哪些 arthas 任务在执行,可以执行 jobs 命令,执行结果如下
+
+```bash
+$ jobs
+[10]*
+ Stopped watch com.taobao.container.Test test "params[0].{? #this.name == null }" -x 2
+ execution count : 19
+ start time : Fri Sep 22 09:59:55 CST 2017
+ timeout date : Sat Sep 23 09:59:55 CST 2017
+ session : 3648e874-5e69-473f-9eed-7f89660b079b (current)
+```
+
+可以看到目前有一个后台任务在执行。
+
+- job id 是 10, `*` 表示此 job 是当前 session 创建
+- 状态是 Stopped
+- execution count 是执行次数,从启动开始已经执行了 19 次
+- timeout date 是超时的时间,到这个时间,任务将会自动超时退出
+
+## 3. 任务暂停和取消
+
+当任务正在前台执行,比如直接调用命令`trace Test t`或者调用后台执行命令`trace Test t &`后又通过`fg`命令将任务转到前台。这时 console 中无法继续执行命令,但是可以接收并处理以下事件:
+
+- ‘ctrl + z’:将任务暂停。通过`jbos`查看任务状态将会变为 Stopped,通过`bg `或者`fg `可让任务重新开始执行
+- ‘ctrl + c’:停止任务
+- ‘ctrl + d’:按照 linux 语义应当是退出终端,目前 arthas 中是空实现,不处理
+
+## 4. fg、bg 命令,将命令转到前台、后台继续执行
+
+- 任务在后台执行或者暂停状态(`ctrl + z`暂停任务)时,执行`fg `将可以把对应的任务转到前台继续执行。在前台执行时,无法在 console 中执行其他命令
+- 当任务处于暂停状态时(`ctrl + z`暂停任务),执行`bg `将可以把对应的任务在后台继续执行
+- 非当前 session 创建的 job,只能由当前 session fg 到前台执行
+
+## 5. 任务输出重定向
+
+可通过`>`或者`>>`将任务输出结果输出到指定的文件中,可以和`&`一起使用,实现 arthas 命令的后台异步任务。比如:
+
+```bash
+$ trace Test t >> test.out &
+```
+
+这时 trace 命令会在后台执行,并且把结果输出到~/logs/arthas-cache/test.out。可继续执行其他命令。并可查看文件中的命令执行结果。
+
+当连接到远程的 arthas server 时,可能无法查看远程机器的文件,arthas 同时支持了自动重定向到本地缓存路径。使用方法如下:
+
+```bash
+$ trace Test t >> &
+job id : 2
+cache location : /Users/gehui/logs/arthas-cache/28198/2
+```
+
+可以看到并没有指定重定向文件位置,arthas 自动重定向到缓存中了,执行命令后会输出 job id 和 cache location。cache location 就是重定向文件的路径,在系统 logs 目录下,路径包括 pid 和 job id,避免和其他任务冲突。命令输出结果到`/Users/gehui/logs/arthas-cache/28198/2`中,job id 为 2。
+
+## 6. 停止命令
+
+异步执行的命令,如果希望停止,可执行`kill `
+
+## 7. 其他
+
+- 最多同时支持 8 个命令使用重定向将结果写日志
+- 请勿同时开启过多的后台异步命令,以免对目标 JVM 性能造成影响
+- 如果不想停止 arthas,继续执行后台任务,可以执行 `quit` 退出 arthas 控制台(`stop` 会停止 arthas 服务)
diff --git a/site/src/site/sphinx/auth.md b/site-vuepress/docs/doc/auth.md
similarity index 57%
rename from site/src/site/sphinx/auth.md
rename to site-vuepress/docs/doc/auth.md
index 35dc3ada8..84cde7554 100644
--- a/site/src/site/sphinx/auth.md
+++ b/site-vuepress/docs/doc/auth.md
@@ -1,19 +1,20 @@
-auth
-===
+# auth
-> 验证当前会话
+::: tip
+验证当前会话
+:::
### 配置用户名和密码
-在attach时,可以在命令行指定密码。比如:
+在 attach 时,可以在命令行指定密码。比如:
```
java -jar arthas-boot.jar --password ppp
```
-* 可以通过 `--username` 选项来指定用户,默认值是`arthas`。
-* 也可以在 `arthas.properties` 里中配置 username/password。命令行的优先级大于配置文件。
-* 如果只配置`username`,没有配置`password`,则会生成随机密码,打印在`~/logs/arthas/arthas.log`中
+- 可以通过 `--username` 选项来指定用户,默认值是`arthas`。
+- 也可以在 `arthas.properties` 里中配置 username/password。命令行的优先级大于配置文件。
+- 如果只配置`username`,没有配置`password`,则会生成随机密码,打印在`~/logs/arthas/arthas.log`中
```
Using generated security password: 0vUBJpRIppkKuZ7dYzYqOKtranj4unGh
@@ -27,11 +28,11 @@ java -jar arthas-boot.jar --password ppp
arthas.localConnectionNonAuth=true
```
-当配置密码时,使用本地连接,也不需要鉴权。默认配置值是true,方便本地连接使用。只有远程连接时,才需要鉴权。
+当配置密码时,使用本地连接,也不需要鉴权。默认配置值是 true,方便本地连接使用。只有远程连接时,才需要鉴权。
-### 在telnet console里鉴权
+### 在 telnet console 里鉴权
-连接到arthas后,直接执行命令会提示需要鉴权:
+连接到 arthas 后,直接执行命令会提示需要鉴权:
```bash
[arthas@37430]$ help
@@ -45,10 +46,9 @@ Error! command not permitted, try to use 'auth' command to authenticates.
Authentication result: true
```
-* 可以通过 `--username` 选项来指定用户,默认值是`arthas`。
+- 可以通过 `--username` 选项来指定用户,默认值是`arthas`。
-
-### Web console密码验证
+### Web console 密码验证
打开浏览器,会有弹窗提示需要输入 用户名 和 密码。
@@ -56,27 +56,25 @@ Authentication result: true
### HTTP API 验证
+#### Authorization Header 方式(推荐)
-#### Authorization Header方式(推荐)
-Arthas 采用的是 HTTP 标准的 Basic Authorization,客户端请求时增加对应的header即可。
-
-* 参考:[https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)
+Arthas 采用的是 HTTP 标准的 Basic Authorization,客户端请求时增加对应的 header 即可。
+- 参考:[https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)
-例如,用户名是:`admin`,密码是 `admin`,则组合为字符串: `admin:admin`,base64结果是: `YWRtaW46YWRtaW4=`,则HTTP 请求增加`Authorization` header:
+例如,用户名是:`admin`,密码是 `admin`,则组合为字符串: `admin:admin`,base64 结果是: `YWRtaW46YWRtaW4=`,则 HTTP 请求增加`Authorization` header:
```bash
curl 'http://localhost:8563/api' \
-H 'Authorization: Basic YWRtaW46YWRtaW4=' \
- --data-raw '{"action":"exec","command":"version"}'
+ --data-raw '{"action":"exec","command":"version"}'
```
#### URL 参数传递方式
-为了方便各种特殊情况,支持了以 parameters 方式传递username和password。比如:
+为了方便各种特殊情况,支持了以 parameters 方式传递 username 和 password。比如:
```bash
curl 'http://localhost:8563/api?password=admin' \
- --data-raw '{"action":"exec","command":"version"}'
+ --data-raw '{"action":"exec","command":"version"}'
```
-
diff --git a/site/src/site/sphinx/base64.md b/site-vuepress/docs/doc/base64.md
similarity index 85%
rename from site/src/site/sphinx/base64.md
rename to site-vuepress/docs/doc/base64.md
index 1383f9dcd..045f7d130 100644
--- a/site/src/site/sphinx/base64.md
+++ b/site-vuepress/docs/doc/base64.md
@@ -1,9 +1,8 @@
-base64
-===
-
-
-> base64编码转换,和linux里的 base64 命令类似。
+# base64
+::: tip
+base64 编码转换,和 linux 里的 base64 命令类似。
+:::
### 对文件进行 base64 编码
diff --git a/site/src/site/sphinx/batch-support.md b/site-vuepress/docs/doc/batch-support.md
similarity index 53%
rename from site/src/site/sphinx/batch-support.md
rename to site-vuepress/docs/doc/batch-support.md
index 48a1ddf5e..1446cd0a4 100644
--- a/site/src/site/sphinx/batch-support.md
+++ b/site-vuepress/docs/doc/batch-support.md
@@ -1,19 +1,22 @@
-批处理功能
-===
+# 批处理功能
-> 通过批处理功能,arthas支持一次性批量运行多个命令,并取得命令执行的结果。
+::: tip
+通过批处理功能,arthas 支持一次性批量运行多个命令,并取得命令执行的结果。
+:::
### 使用方法
#### 第一步: 创建你的批处理脚本
-这里我们新建了一个`test.as`脚本,为了规范,我们采用了.as后缀名,但事实上任意的文本文件都ok。
+这里我们新建了一个`test.as`脚本,为了规范,我们采用了.as 后缀名,但事实上任意的文本文件都 ok。
-> 注意事项
-> * 目前需要每个命令占一行
-> * dashboard务必指定执行次数(`-n`),否则会导致批处理脚本无法终止
-> * watch/tt/trace/monitor/stack等命令务必指定执行次数(`-n`),否则会导致批处理脚本无法终止
-> * 可以使用异步后台任务,如 `watch c.t.X test returnObj > &`,让命令一直在后台运行,通过日志获取结果,[获取更多异步任务的信息](async.md)
+::: tip
+
+- 目前需要每个命令占一行
+- dashboard 务必指定执行次数(`-n`),否则会导致批处理脚本无法终止
+- watch/tt/trace/monitor/stack 等命令务必指定执行次数(`-n`),否则会导致批处理脚本无法终止
+- 可以使用异步后台任务,如 `watch c.t.X test returnObj > &`,让命令一直在后台运行,通过日志获取结果,[获取更多异步任务的信息](async.md)
+ :::
```
➜ arthas git:(develop) cat /var/tmp/test.as
@@ -42,4 +45,4 @@ sc -d org.apache.commons.lang.StringUtils
```bash
cat test.out
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/cat.md b/site-vuepress/docs/doc/cat.md
similarity index 61%
rename from site/src/site/sphinx/cat.md
rename to site-vuepress/docs/doc/cat.md
index 27a27f929..8ef903264 100644
--- a/site/src/site/sphinx/cat.md
+++ b/site-vuepress/docs/doc/cat.md
@@ -1,11 +1,11 @@
-cat
-===
+# cat
[`cat`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-cat)
-> 打印文件内容,和linux里的cat命令类似。
-
+::: tip
+打印文件内容,和 linux 里的 cat 命令类似。
+:::
```bash
$ cat /tmp/a.txt
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/classloader.md b/site-vuepress/docs/doc/classloader.md
similarity index 72%
rename from site/src/site/sphinx/classloader.md
rename to site-vuepress/docs/doc/classloader.md
index d5468efcf..bfac9932f 100644
--- a/site/src/site/sphinx/classloader.md
+++ b/site-vuepress/docs/doc/classloader.md
@@ -1,26 +1,26 @@
-classloader
-===
+# classloader
[`classloader`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-classloader)
-> 查看classloader的继承树,urls,类加载信息
+::: tip
+查看 classloader 的继承树,urls,类加载信息
+:::
-`classloader` 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。
-
-可以让指定的classloader去getResources,打印出所有查找到的resources的url。对于`ResourceNotFoundException`比较有用。
+`classloader` 命令将 JVM 中所有的 classloader 的信息统计出来,并可以展示继承树,urls 等。
+可以让指定的 classloader 去 getResources,打印出所有查找到的 resources 的 url。对于`ResourceNotFoundException`比较有用。
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|[l]|按类加载实例进行统计|
-|[t]|打印所有ClassLoader的继承树|
-|[a]|列出所有ClassLoader加载的类,请谨慎使用|
-|`[c:]`|ClassLoader的hashcode|
-|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name|
-|`[c: r:]`|用ClassLoader去查找resource|
-|`[c: load:]`|用ClassLoader去加载指定的类|
+| 参数名称 | 参数说明 |
+| --------------------: | :----------------------------------------- |
+| [l] | 按类加载实例进行统计 |
+| [t] | 打印所有 ClassLoader 的继承树 |
+| [a] | 列出所有 ClassLoader 加载的类,请谨慎使用 |
+| `[c:]` | ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| `[c: r:]` | 用 ClassLoader 去查找 resource |
+| `[c: load:]` | 用 ClassLoader 去加载指定的类 |
### 使用参考
@@ -49,7 +49,7 @@ $ classloader -l
Affect(row-cnt:4) cost in 2 ms.
```
-#### 查看ClassLoader的继承树
+#### 查看 ClassLoader 的继承树
```bash
$ classloader -t
@@ -60,7 +60,7 @@ $ classloader -t
Affect(row-cnt:4) cost in 3 ms.
```
-#### 查看URLClassLoader实际的urls
+#### 查看 URLClassLoader 实际的 urls
```bash
$ classloader -c 3d4eac69
@@ -70,9 +70,9 @@ file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
Affect(row-cnt:9) cost in 3 ms.
```
-*注意* hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。
+_注意_ hashcode 是变化的,需要先查看当前的 ClassLoader 信息,提取对应 ClassLoader 的 hashcode。
-对于只有唯一实例的ClassLoader可以通过class name指定,使用起来更加方便:
+对于只有唯一实例的 ClassLoader 可以通过 class name 指定,使用起来更加方便:
```bash
$ classloader --classLoaderClass sun.misc.Launcher$AppClassLoader
@@ -82,7 +82,7 @@ file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
Affect(row-cnt:9) cost in 3 ms.
```
-#### 使用ClassLoader去查找resource
+#### 使用 ClassLoader 去查找 resource
```bash
$ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
@@ -91,14 +91,14 @@ $ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
```
-也可以尝试查找类的class文件:
+也可以尝试查找类的 class 文件:
```bash
$ classloader -c 1b6d3586 -r java/lang/String.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class
```
-#### 使用ClassLoader去加载类
+#### 使用 ClassLoader 去加载类
```bash
$ classloader -c 3d4eac69 --load demo.MathGame
@@ -125,9 +125,11 @@ load class success.
classLoaderHash 3d4eac69
```
-#### 统计ClassLoader实际使用URL和未使用的URL
+#### 统计 ClassLoader 实际使用 URL 和未使用的 URL
-> 注意,基于JVM目前已加载的所有类统计,不代表`Unused URLs`可以从应用中删掉。因为可能将来需要从`Unused URLs`里加载类,或者需要加载`resources`。
+::: warning
+注意,基于 JVM 目前已加载的所有类统计,不代表`Unused URLs`可以从应用中删掉。因为可能将来需要从`Unused URLs`里加载类,或者需要加载`resources`。
+:::
```
$ classloader --url-stat
@@ -157,4 +159,4 @@ $ classloader --url-stat
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/sunpkcs11.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/jaccess.jar
file:/tmp/jdk1.8/Contents/Home/jre/lib/ext/zipfs.jar
-```
\ No newline at end of file
+```
diff --git a/site-vuepress/docs/doc/cls.md b/site-vuepress/docs/doc/cls.md
new file mode 100644
index 000000000..2fd8ce7f9
--- /dev/null
+++ b/site-vuepress/docs/doc/cls.md
@@ -0,0 +1,7 @@
+# cls
+
+清空当前屏幕区域。
+
+::: tip
+非终端模式下使用 cls 指令,会提示"Command 'cls' is only support tty session."。
+:::
diff --git a/site-vuepress/docs/doc/commands.md b/site-vuepress/docs/doc/commands.md
new file mode 100644
index 000000000..1d0cdd3e4
--- /dev/null
+++ b/site-vuepress/docs/doc/commands.md
@@ -0,0 +1,50 @@
+# 命令列表
+
+- [dashboard](dashboard.md)
+- [thread](thread.md)
+- [jvm](jvm.md)
+- [memory](memory.md)
+- [sysprop](sysprop.md)
+- [sysenv](sysenv.md)
+- [vmoption](vmoption.md)
+- [perfcounter](perfcounter.md)
+- [logger](logger.md)
+- [mbean](mbean.md)
+- [getstatic](getstatic.md)
+- [ognl](ognl.md)
+- [sc](sc.md)
+- [sm](sm.md)
+- [dump](dump.md)
+- [heapdump](heapdump.md)
+- [vmtool](vmtool.md)
+- [jad](jad.md)
+- [classloader](classloader.md)
+- [mc](mc.md)
+- [retransform](retransform.md)
+- [redefine](redefine.md)
+- [monitor](monitor.md)
+- [watch](watch.md)
+- [trace](trace.md)
+- [stack](stack.md)
+- [tt](tt.md)
+- [profiler](profiler.md)
+- [cat](cat.md)
+- [echo](echo.md)
+- [grep](grep.md)
+- [base64](base64.md)
+- [tee](tee.md)
+- [pwd](pwd.md)
+- [auth](auth.md)
+- [options](options.md)
+
+### Arthas 基础命令
+
+- [help](help.md)
+- [cls](cls.md)
+- [session](session.md)
+- [reset](reset.md)
+- [version](version.md)
+- [history](history.md)
+- [quit](quit.md)
+- [stop](stop.md)
+- [keymap](keymap.md)
diff --git a/site-vuepress/docs/doc/contact-us.md b/site-vuepress/docs/doc/contact-us.md
new file mode 100644
index 000000000..58c6ef49e
--- /dev/null
+++ b/site-vuepress/docs/doc/contact-us.md
@@ -0,0 +1,35 @@
+# 联系我们
+
+## 招聘
+
+- [期待你的加入](https://mp.weixin.qq.com/s/XQv8GnqGT3pzceVwzeiy-A)
+
+### Issues
+
+使用疑问,意见可以直接在 Issues 里提出: [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
+
+### 微信公众号
+
+欢迎关注公众号,获取 Arthas 项目的信息、源码分析、案例实践。
+
+
+
+### 钉钉群
+
+- Arthas 开源交流钉钉群: 21965291 ,搜索群号即可加入。
+
+
+
+- Arthas 开源交流钉钉群 2: 30707824 ,搜索群号即可加入。
+
+
+
+### QQ 群
+
+Arthas 开源交流 QQ 群: 916328269
+
+
+
+Arthas 开源交流 QQ 群 2: 854625984
+
+
diff --git a/site/src/site/sphinx/dashboard.md b/site-vuepress/docs/doc/dashboard.md
similarity index 61%
rename from site/src/site/sphinx/dashboard.md
rename to site-vuepress/docs/doc/dashboard.md
index fff004078..ed21e8c4f 100644
--- a/site/src/site/sphinx/dashboard.md
+++ b/site-vuepress/docs/doc/dashboard.md
@@ -1,18 +1,19 @@
-dashboard
-===
+# dashboard
[`dashboard`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-dashboard)
-> 当前系统的实时数据面板,按 ctrl+c 退出。
+::: tip
+当前系统的实时数据面板,按 ctrl+c 退出。
+:::
-当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。
+当运行在 Ali-tomcat 时,会显示当前 tomcat 的实时信息,如 HTTP 请求的 qps, rt, 错误数, 线程池信息等等。
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|[i:]|刷新实时数据的时间间隔 (ms),默认5000ms|
-|[n:]|刷新实时数据的次数|
+| 参数名称 | 参数说明 |
+| -------: | :--------------------------------------- |
+| [i:] | 刷新实时数据的时间间隔 (ms),默认 5000ms |
+| [n:] | 刷新实时数据的次数 |
### 使用参考
@@ -53,30 +54,31 @@ uptime 272s
### 数据说明
-* ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应。
-* NAME: 线程名
-* GROUP: 线程组名
-* PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
-* STATE: 线程的状态
-* CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10%
-* DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为`秒`
-* TIME: 线程运行总CPU时间,数据格式为`分:秒`
-* INTERRUPTED: 线程当前的中断位状态
-* DAEMON: 是否是daemon线程
+- ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。
+- NAME: 线程名
+- GROUP: 线程组名
+- PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
+- STATE: 线程的状态
+- CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
+- DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为`秒`
+- TIME: 线程运行总 CPU 时间,数据格式为`分:秒`
+- INTERRUPTED: 线程当前的中断位状态
+- DAEMON: 是否是 daemon 线程
-#### JVM内部线程
-Java 8之后支持获取JVM内部线程CPU时间,这些线程只有名称和CPU时间,没有ID及状态等信息(显示ID为-1)。
-通过内部线程可以观测到JVM活动,如GC、JIT编译等占用CPU情况,方便了解JVM整体运行状况。
+#### JVM 内部线程
-* 当JVM 堆(heap)/元数据(metaspace)空间不足或OOM时,可以看到GC线程的CPU占用率明显高于其他的线程。
-* 当执行`trace/watch/tt/redefine`等命令后,可以看到JIT线程活动变得更频繁。因为JVM热更新class字节码时清除了此class相关的JIT编译结果,需要重新编译。
+Java 8 之后支持获取 JVM 内部线程 CPU 时间,这些线程只有名称和 CPU 时间,没有 ID 及状态等信息(显示 ID 为-1)。
+通过内部线程可以观测到 JVM 活动,如 GC、JIT 编译等占用 CPU 情况,方便了解 JVM 整体运行状况。
-JVM内部线程包括下面几种:
-* JIT编译线程: 如 `C1 CompilerThread0`, `C2 CompilerThread0`
-* GC线程: 如`GC Thread0`, `G1 Young RemSet Sampling`
-* 其它内部线程: 如`VM Periodic Task Thread`, `VM Thread`, `Service Thread`
+- 当 JVM 堆(heap)/元数据(metaspace)空间不足或 OOM 时,可以看到 GC 线程的 CPU 占用率明显高于其他的线程。
+- 当执行`trace/watch/tt/redefine`等命令后,可以看到 JIT 线程活动变得更频繁。因为 JVM 热更新 class 字节码时清除了此 class 相关的 JIT 编译结果,需要重新编译。
+JVM 内部线程包括下面几种:
+
+- JIT 编译线程: 如 `C1 CompilerThread0`, `C2 CompilerThread0`
+- GC 线程: 如`GC Thread0`, `G1 Young RemSet Sampling`
+- 其它内部线程: 如`VM Periodic Task Thread`, `VM Thread`, `Service Thread`
### 截图展示
-
\ No newline at end of file
+
diff --git a/site-vuepress/docs/doc/docker.md b/site-vuepress/docs/doc/docker.md
new file mode 100644
index 000000000..897f39848
--- /dev/null
+++ b/site-vuepress/docs/doc/docker.md
@@ -0,0 +1,118 @@
+# Docker
+
+## 在 Docker 里使用 JDK
+
+很多时候,应用在 docker 里出现 arthas 无法工作的问题,是因为应用没有安装 JDK ,而是安装了 JRE 。如果只安装了 JRE,则会缺少很多 JAVA 的命令行工具和类库,Arthas 也没办法正常工作。下面介绍两种常见的在 Docker 里使用 JDK 的方式。
+
+### 使用公开的 JDK 镜像
+
+- https://hub.docker.com/_/openjdk/
+
+比如:
+
+```
+FROM openjdk:8-jdk
+```
+
+或者:
+
+```
+FROM openjdk:8-jdk-alpine
+```
+
+### 通过包管理软件来安装
+
+比如:
+
+```bash
+# Install OpenJDK-8
+RUN apt-get update && \
+ apt-get install -y openjdk-8-jdk && \
+ apt-get install -y ant && \
+ apt-get clean;
+
+# Fix certificate issues
+RUN apt-get update && \
+ apt-get install ca-certificates-java && \
+ apt-get clean && \
+ update-ca-certificates -f;
+
+# Setup JAVA_HOME -- useful for docker commandline
+ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
+RUN export JAVA_HOME
+```
+
+或者:
+
+```bash
+RUN yum install -y \
+ java-1.8.0-openjdk \
+ java-1.8.0-openjdk-devel
+
+ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/
+RUN export JAVA_HOME
+```
+
+## 通过 Docker 快速入门
+
+1. 删除本地已有的`math-game` docker container(非必要)
+
+ ```sh
+ $ docker stop math-game || true && docker rm math-game || true
+ ```
+
+1. 启动`math-game`
+
+ ```sh
+ $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar"
+ ```
+
+1. 启动`arthas-boot`来进行诊断
+
+ ```sh
+ $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
+ * [1]: 9 jar
+
+ [INFO] arthas home: /opt/arthas
+ [INFO] Try to attach process 9
+ [INFO] Attach process 9 success.
+ [INFO] arthas-client connect 127.0.0.1 3658
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+ | .-. || '--'.' | | | .--. || .-. |`. `-.
+ | | | || |\ \ | | | | | || | | |.-' |
+ `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+
+
+ wiki: https://arthas.aliyun.com/doc
+ version: 3.0.5
+ pid: 9
+ time: 2018-12-18 11:30:36
+ ```
+
+## 诊断 Docker 里的 Java 进程
+
+```sh
+docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"
+```
+
+## 诊断 k8s 里容器里的 Java 进程
+
+```sh
+kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"
+```
+
+## 把 Arthas 安装到基础镜像里
+
+可以很简单把 Arthas 安装到你的 Docker 镜像里。
+
+```
+FROM openjdk:8-jdk-alpine
+
+# copy arthas
+COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
+```
+
+如果想指定版本,可以查看具体的 tags:
+
+[https://hub.docker.com/r/hengyunabc/arthas/tags](https://hub.docker.com/r/hengyunabc/arthas/tags)
diff --git a/site/src/site/sphinx/download.md b/site-vuepress/docs/doc/download.md
similarity index 88%
rename from site/src/site/sphinx/download.md
rename to site-vuepress/docs/doc/download.md
index 2044664b3..a9191eb9d 100644
--- a/site/src/site/sphinx/download.md
+++ b/site-vuepress/docs/doc/download.md
@@ -1,18 +1,16 @@
-下载
-===
+# 下载
## 下载全量包
-### 从Maven仓库下载
+### 从 Maven 仓库下载
最新版本,点击下载:[](https://arthas.aliyun.com/download/latest_version?mirror=aliyun)
-
-### 从Github Releases页下载
+### 从 Github Releases 页下载
[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases)
-### 用as.sh启动
+### 用 as.sh 启动
解压后,在文件夹里有`as.sh`,直接用`./as.sh`的方式启动:
@@ -26,7 +24,7 @@
./as.sh -h
```
-### 用arthas-boot启动
+### 用 arthas-boot 启动
或者在解压后,在文件夹里有`arthas-boot.jar`,直接用`java -jar`的方式启动:
@@ -40,9 +38,6 @@ java -jar arthas-boot.jar
java -jar arthas-boot.jar -h
```
-
-
## 下载离线文档
下载文档:[](https://arthas.aliyun.com/download/doc/latest_version?mirror=aliyun)
-
diff --git a/site-vuepress/docs/doc/dump.md b/site-vuepress/docs/doc/dump.md
new file mode 100644
index 000000000..68384e63c
--- /dev/null
+++ b/site-vuepress/docs/doc/dump.md
@@ -0,0 +1,65 @@
+# dump
+
+[`dump`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-dump)
+
+::: tip
+dump 已加载类的 bytecode 到特定目录
+:::
+
+### 参数说明
+
+| 参数名称 | 参数说明 |
+| --------------------: | :----------------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| `[c:]` | 类所属 ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| `[d:]` | 设置类文件的目标目录 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+
+### 使用参考
+
+```bash
+$ dump java.lang.String
+ HASHCODE CLASSLOADER LOCATION
+ null /Users/admin/logs/arthas/classdump/java/lang/String.class
+Affect(row-cnt:1) cost in 119 ms.
+```
+
+```bash
+$ dump demo.*
+ HASHCODE CLASSLOADER LOCATION
+ 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+Affect(row-cnt:1) cost in 39 ms.
+```
+
+```bash
+$ dump -d /tmp/output java.lang.String
+ HASHCODE CLASSLOADER LOCATION
+ null /tmp/output/java/lang/String.class
+Affect(row-cnt:1) cost in 138 ms.
+```
+
+- 指定 classLoader
+
+注意 hashcode 是变化的,需要先查看当前的 ClassLoader 信息,提取对应 ClassLoader 的 hashcode。
+
+如果你使用`-c`,你需要手动输入 hashcode:`-c `
+
+```bash
+$ dump -c 3d4eac69 demo.*
+```
+
+对于只有唯一实例的 ClassLoader 可以通过`--classLoaderClass`指定 class name,使用起来更加方便:
+
+```bash
+$ dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.*
+ HASHCODE CLASSLOADER LOCATION
+ 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+Affect(row-cnt:1) cost in 39 ms.
+```
+
+- 注: 这里 classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda 目前环境是 java8。
+
+`--classLoaderClass` 的值是 ClassLoader 的类名,只有匹配到唯一的 ClassLoader 实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
diff --git a/site/src/site/sphinx/echo.md b/site-vuepress/docs/doc/echo.md
similarity index 62%
rename from site/src/site/sphinx/echo.md
rename to site-vuepress/docs/doc/echo.md
index 96f180973..5d97ed813 100644
--- a/site/src/site/sphinx/echo.md
+++ b/site-vuepress/docs/doc/echo.md
@@ -1,11 +1,11 @@
-echo
-===
+# echo
[`echo`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-echo)
-> 打印参数,和linux里的echo命令类似。
-
+::: tip
+打印参数,和 linux 里的 echo 命令类似。
+:::
```bash
$ echo 'hello'
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/faq.md b/site-vuepress/docs/doc/faq.md
similarity index 58%
rename from site/src/site/sphinx/faq.md
rename to site-vuepress/docs/doc/faq.md
index 3b185070c..e090342ae 100644
--- a/site/src/site/sphinx/faq.md
+++ b/site-vuepress/docs/doc/faq.md
@@ -1,27 +1,27 @@
+# FAQ
-## FAQ
-
-
-> 不在本列表里的问题,请到issue里搜索。 [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
-
+::: tip
+不在本列表里的问题,请到 issue 里搜索。 [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
+:::
##### 日志文件在哪里?
日志文件路径: `~/logs/arthas/arthas.log`
-##### Arthas attach之后对原进程性能有多大的影响
-[https://github.com/alibaba/arthas/issues/44](https://github.com/alibaba/arthas/issues/44)
+##### Arthas attach 之后对原进程性能有多大的影响
+[https://github.com/alibaba/arthas/issues/44](https://github.com/alibaba/arthas/issues/44)
##### target process not responding or HotSpot VM not loaded
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
-1. 检查当前用户和目标java进程是否一致。如果不一致,则切换到同一用户。JVM只能attach同样用户下的java 进程。
-2. 尝试使用 `jstack -l $pid`,如果进程没有反应,则说明进程可能假死,无法响应JVM attach信号。所以同样基于attach机制的Arthas无法工作。尝试使用`jmap` heapdump后分析。
-3. 尝试按[quick-start](quick-start.md)里的方式attach math-game。
+1. 检查当前用户和目标 java 进程是否一致。如果不一致,则切换到同一用户。JVM 只能 attach 同样用户下的 java 进程。
+2. 尝试使用 `jstack -l $pid`,如果进程没有反应,则说明进程可能假死,无法响应 JVM attach 信号。所以同样基于 attach 机制的 Arthas 无法工作。尝试使用`jmap` heapdump 后分析。
+3. 尝试按[quick-start](quick-start.md)里的方式 attach math-game。
4. 更多情况参考: [https://github.com/alibaba/arthas/issues/347](https://github.com/alibaba/arthas/issues/347)
-##### trace/watch等命令能否增强jdk里的类?
+
+##### trace/watch 等命令能否增强 jdk 里的类?
默认情况下会过滤掉`java.`开头的类和被`BootStrap ClassLoader`加载的类。可以通过参数开启。
@@ -31,7 +31,9 @@ options unsafe true
更多参考 [options](options.md)
-> 通过 java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch append到`Bootstrap ClassLoader`的jar包需要开启unsafe。
+::: tip
+通过 java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch append 到`Bootstrap ClassLoader`的 jar 包需要开启 unsafe。
+:::
##### 怎么以`json`格式查看结果
@@ -41,18 +43,15 @@ options json-format true
更多参考 [options](options.md)
-
-##### Arthas能否跟踪 native 函数
+##### Arthas 能否跟踪 native 函数
不能。
-
##### 能不能查看内存里某个变量的值
1. 可以使用[`vmtool`](vmtool.md)命令。
2. 可以用一些技巧,用[`tt`](tt.md)命令拦截到对象,或者从静态函数里取到对象。
-
##### 方法同名过滤
同名方法过滤可以通过匹配表达式,可以使用[表达式核心变量](advice-class.md)中所有变量作为已知条件,可以通过判断参数个数`params.length ==1`, 参数类型`params[0] instanceof java.lang.Integer`、返回值类型 `returnObj instanceof java.util.List` 等等一种或者多种组合进行过滤。
@@ -63,25 +62,25 @@ options json-format true
```bash
watch demo.MathGame primeFactors '{params,returnObj,throwExp}' 'params.length >0 && returnObj instanceof java.util.List' -v
-```
+```
-##### 怎么watch、trace 构造函数 ?
+##### 怎么 watch、trace 构造函数 ?
```bash
watch demo.MathGame '{params,returnObj,throwExp}' -v
```
-##### 怎样watch、trace内部类?
+##### 怎样 watch、trace 内部类?
-在JVM规范里内部类的格式是`OuterClass$InnerClass`。
+在 JVM 规范里内部类的格式是`OuterClass$InnerClass`。
```bash
watch OuterClass$InnerClass
```
-##### 输入中文/Unicode字符
+##### 输入中文/Unicode 字符
-把中文/Unicode字符转为`\u`表示方法:
+把中文/Unicode 字符转为`\u`表示方法:
```bash
ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")'
@@ -89,16 +88,15 @@ ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")'
##### java.lang.ClassFormatError: null、skywalking arthas 兼容使用
-当出现这个错误日志`java.lang.ClassFormatError: null`,通常情况下都是被其他字节码工具修改过与arthas修改字节码不兼容。
-
-比如: 使用 skywalking V8.1.0 以下版本 [无法trace、watch 被skywalking agent 增强过的类](https://github.com/alibaba/arthas/issues/1141), V8.1.0 以上版本可以兼容使用,更多参考skywalking配置 [skywalking compatible with other javaagent bytecode processing](https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md#)。
+当出现这个错误日志`java.lang.ClassFormatError: null`,通常情况下都是被其他字节码工具修改过与 arthas 修改字节码不兼容。
+比如: 使用 skywalking V8.1.0 以下版本 [无法 trace、watch 被 skywalking agent 增强过的类](https://github.com/alibaba/arthas/issues/1141), V8.1.0 以上版本可以兼容使用,更多参考 skywalking 配置 [skywalking compatible with other javaagent bytecode processing](https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md#)。
#### class redefinition failed: attempted to change the schema (add/remove fields)
参考: [https://github.com/alibaba/arthas/issues/2165](https://github.com/alibaba/arthas/issues/2165)
-##### Arthas能不能离线使用
+##### Arthas 能不能离线使用
可以。下载全量包解压即可,参考: [下载](download.md)。
@@ -106,8 +104,8 @@ ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")'
参考: [https://github.com/alibaba/arthas/issues/362#issuecomment-448185416](https://github.com/alibaba/arthas/issues/362#issuecomment-448185416)
-##### 为什么下载了新版本的Arthas,连接的却是旧版本?
+##### 为什么下载了新版本的 Arthas,连接的却是旧版本?
-比如启动的 `as.sh/arthas-boot.jar` 版本是3.5.* 的,但是连接上之后,打印的arthas版本是 3.4.* 的。
+比如启动的 `as.sh/arthas-boot.jar` 版本是 3.5._ 的,但是连接上之后,打印的 arthas 版本是 3.4._ 的。
-可能是之前使用旧版本的arthas诊断过目标进程。可以先执行`stop`停止掉旧版本的arthas,再重新使用新版本attach。
+可能是之前使用旧版本的 arthas 诊断过目标进程。可以先执行`stop`停止掉旧版本的 arthas,再重新使用新版本 attach。
diff --git a/site-vuepress/docs/doc/getstatic.md b/site-vuepress/docs/doc/getstatic.md
new file mode 100644
index 000000000..f4a9d8a69
--- /dev/null
+++ b/site-vuepress/docs/doc/getstatic.md
@@ -0,0 +1,70 @@
+# getstatic
+
+[`getstatic`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-getstatic)
+
+- 推荐直接使用[ognl](ognl.md)命令,更加灵活。
+
+通过 getstatic 命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name`
+
+```bash
+$ getstatic demo.MathGame random
+field: random
+@Random[
+ serialVersionUID=@Long[3905348978240129619],
+ seed=@AtomicLong[120955813885284],
+ multiplier=@Long[25214903917],
+ addend=@Long[11],
+ mask=@Long[281474976710655],
+ DOUBLE_UNIT=@Double[1.1102230246251565E-16],
+ BadBound=@String[bound must be positive],
+ BadRange=@String[bound must be greater than origin],
+ BadSize=@String[size must be non-negative],
+ seedUniquifier=@AtomicLong[-3282039941672302964],
+ nextNextGaussian=@Double[0.0],
+ haveNextNextGaussian=@Boolean[false],
+ serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
+ unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
+ seedOffset=@Long[24],
+]
+```
+
+- 指定 classLoader
+
+注意 hashcode 是变化的,需要先查看当前的 ClassLoader 信息,使用`sc -d `提取对应 ClassLoader 的 hashcode。
+
+如果你使用`-c`,你需要手动输入 hashcode:`-c `
+
+```bash
+$ getstatic -c 3d4eac69 demo.MathGame random
+```
+
+对于只有唯一实例的 ClassLoader 可以通过`--classLoaderClass`指定 class name,使用起来更加方便:
+
+`getstatic --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame random`
+
+- 注: 这里 classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda 目前环境是 java8。
+
+`--classLoaderClass` 的值是 ClassLoader 的类名,只有匹配到唯一的 ClassLoader 实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
+
+如果该静态属性是一个复杂对象,还可以支持在该属性上通过 ognl 表示进行遍历,过滤,访问对象的内部属性等操作。
+
+- OGNL 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官方指南:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+
+例如,假设 n 是一个 Map,Map 的 Key 是一个 Enum,我们想过滤出 Map 中 Key 为某个 Enum 的值,可以写如下命令
+
+```
+$ getstatic com.alibaba.arthas.Test n 'entrySet().iterator.{? #this.key.name()=="STOP"}'
+field: n
+@ArrayList[
+ @Node[STOP=bbb],
+]
+Affect(row-cnt:1) cost in 68 ms.
+
+
+$ getstatic com.alibaba.arthas.Test m 'entrySet().iterator.{? #this.key=="a"}'
+field: m
+@ArrayList[
+ @Node[a=aaa],
+]
+```
diff --git a/site/src/site/sphinx/grep.md b/site-vuepress/docs/doc/grep.md
similarity index 97%
rename from site/src/site/sphinx/grep.md
rename to site-vuepress/docs/doc/grep.md
index daa0ce206..b2c0ce2d8 100644
--- a/site/src/site/sphinx/grep.md
+++ b/site-vuepress/docs/doc/grep.md
@@ -1,10 +1,10 @@
-grep
-===
+# grep
[`grep`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-grep)
-> 类似传统的`grep`命令。
-
+::: tip
+类似传统的`grep`命令。
+:::
```
USAGE:
@@ -36,4 +36,4 @@ grep
-e, --regex Enable regular expression to match
--trim-end Remove whitespaces at the end of the line
Pattern
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/groovy.md b/site-vuepress/docs/doc/groovy.md
similarity index 83%
rename from site/src/site/sphinx/groovy.md
rename to site-vuepress/docs/doc/groovy.md
index b5f5cff36..516f5527a 100644
--- a/site/src/site/sphinx/groovy.md
+++ b/site-vuepress/docs/doc/groovy.md
@@ -1,7 +1,8 @@
-groovy
-===
+# groovy
-> Arthas 支持 groovy 脚本增强,允许像 BTrace 一样编写脚本来解决问题,可以在 groovy 脚本中进行if/for/switch/while 等控制语句,不受限制,但相比 BTrace 而言拥有更多的限制范围。
+::: tip
+Arthas 支持 groovy 脚本增强,允许像 BTrace 一样编写脚本来解决问题,可以在 groovy 脚本中进行 if/for/switch/while 等控制语句,不受限制,但相比 BTrace 而言拥有更多的限制范围。
+:::
### 限制内容
@@ -10,16 +11,16 @@ groovy
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|方法名表达式匹配|
-|*script-filepath*|groovy 脚本的绝对路径|
-|[S]|匹配所有的子类|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
+| 参数名称 | 参数说明 |
+| ----------------: | :----------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| _script-filepath_ | groovy 脚本的绝对路径 |
+| [S] | 匹配所有的子类 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
需要说明的是,第三个输入参数是脚本的绝对路径,比如 `/tmp/test.groovy`,不建议输入相对路径,比如 `./test.groovy`
-
+
### 五个关键函数声明
```java
diff --git a/site/src/site/sphinx/heapdump.md b/site-vuepress/docs/doc/heapdump.md
similarity index 77%
rename from site/src/site/sphinx/heapdump.md
rename to site-vuepress/docs/doc/heapdump.md
index a98e1c765..d3410f37f 100644
--- a/site/src/site/sphinx/heapdump.md
+++ b/site-vuepress/docs/doc/heapdump.md
@@ -1,14 +1,14 @@
-heapdump
-===
+# heapdump
[`heapdump`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-heapdump)
-> dump java heap, 类似jmap命令的heap dump功能。
-
+::: tip
+dump java heap, 类似 jmap 命令的 heap dump 功能。
+:::
### 使用参考
-#### dump到指定文件
+#### dump 到指定文件
```bash
[arthas@58205]$ heapdump /tmp/dump.hprof
@@ -16,7 +16,7 @@ Dumping heap to /tmp/dump.hprof...
Heap dump file created
```
-#### 只dump live对象
+#### 只 dump live 对象
```bash
[arthas@58205]$ heapdump --live /tmp/dump.hprof
@@ -24,13 +24,10 @@ Dumping heap to /tmp/dump.hprof...
Heap dump file created
```
-### dump到临时文件
+### dump 到临时文件
```bash
[arthas@58205]$ heapdump
Dumping heap to /var/folders/my/wy7c9w9j5732xbkcyt1mb4g40000gp/T/heapdump2019-09-03-16-385121018449645518991.hprof...
Heap dump file created
```
-
-
-
diff --git a/site/src/site/sphinx/help.md b/site-vuepress/docs/doc/help.md
similarity index 87%
rename from site/src/site/sphinx/help.md
rename to site-vuepress/docs/doc/help.md
index e20034a10..ae9cf92c7 100644
--- a/site/src/site/sphinx/help.md
+++ b/site-vuepress/docs/doc/help.md
@@ -1,16 +1,17 @@
-help
-===
+# help
-查看命令帮助信息,可以查看当前arthas版本支持的指令,或者查看具体指令的使用说明。
+查看命令帮助信息,可以查看当前 arthas 版本支持的指令,或者查看具体指令的使用说明。
-> [help 指令]的等同于[指令 -help],都是查看具体指令的使用说明。
+::: tip
+[help 指令]的等同于[指令 -help],都是查看具体指令的使用说明。
+:::
### 参数说明
-| 参数名称 | 参数说明 |
-| -------: | :--------------------------------------- |
-| 不接参数 | 查询当前arthas版本支持的指令以及指令描述 |
-| [name:] | 查询具体指令的使用说明 |
+| 参数名称 | 参数说明 |
+| -------: | :----------------------------------------- |
+| 不接参数 | 查询当前 arthas 版本支持的指令以及指令描述 |
+| [name:] | 查询具体指令的使用说明 |
### 使用参考
@@ -59,8 +60,8 @@ $ help
tee tee command for pipes.
profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profiler
stop Stop/Shutdown Arthas server and exit the console.
-
-
+
+
```
```
@@ -84,4 +85,3 @@ $ help
-i, --interval The interval (in ms) between two executions, default is 5000 ms.
-n, --number-of-execution The number of times this command will be executed.
```
-
diff --git a/site-vuepress/docs/doc/history.md b/site-vuepress/docs/doc/history.md
new file mode 100644
index 000000000..64b24d51e
--- /dev/null
+++ b/site-vuepress/docs/doc/history.md
@@ -0,0 +1,31 @@
+# history
+
+打印命令历史。
+
+::: tip
+历史指令会通过一个名叫 history 的文件持久化,所以 history 指令可以查看当前 arthas 服务器的所有历史命令,而不仅只是当前次会话使用过的命令。
+:::
+
+### 参数说明
+
+| 参数名称 | 参数说明 |
+| -------: | :---------------------- |
+| [c:] | 清空历史指令 |
+| [n:] | 显示最近执行的 n 条指令 |
+
+### 使用参考
+
+```
+#查看最近执行的3条指令
+$ history 3
+ 269 thread
+ 270 cls
+ 271 history 3
+```
+
+```
+ #清空指令
+ $ history -c
+ $ history 3
+ 1 history 3
+```
diff --git a/site-vuepress/docs/doc/http-api.md b/site-vuepress/docs/doc/http-api.md
new file mode 100644
index 000000000..0b16bcc45
--- /dev/null
+++ b/site-vuepress/docs/doc/http-api.md
@@ -0,0 +1,684 @@
+# Http API
+
+[`Http API`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=case-http-api)
+
+### 概览
+
+Http API
+提供类似 RESTful 的交互接口,请求和响应均为 JSON 格式的数据。相对于 Telnet/WebConsole 的输出非结构化文本数据,Http
+API 可以提供结构化的数据,支持更复杂的交互功能,比如特定应用场景的一系列诊断操作。
+
+#### 访问地址
+
+Http API 接口地址为:`http://ip:port/api`,必须使用 POST 方式提交请求参数。如 POST
+`http://127.0.0.1:8563/api` 。
+
+注意:telnet 服务的 3658 端口与 Chrome 浏览器有兼容性问题,建议使用 http 端口 8563 来访问 http 接口。
+
+#### 请求数据格式
+
+```json
+{
+ "action": "exec",
+ "requestId": "req112",
+ "sessionId": "94766d3c-8b39-42d3-8596-98aee3ccbefb",
+ "consumerId": "955dbd1325334a84972b0f3ac19de4f7_2",
+ "command": "version",
+ "execTimeout": "10000"
+}
+```
+
+请求数据格式说明:
+
+- `action` : 请求的动作/行为,可选值请参考"请求 Action"小节。
+- `requestId` : 可选请求 ID,由客户端生成。
+- `sessionId` : Arthas 会话 ID,一次性命令不需要设置会话 ID。
+- `consumerId` : Arthas 消费者 ID,用于多人共享会话。
+- `command` : Arthas command line 。
+- `execTimeout` : 命令同步执行的超时时间(ms),默认为 30000。
+
+注意: 不同的 action 使用到参数不同,根据具体的 action 来设置参数。
+
+#### 请求 Action
+
+目前支持的请求 Action 如下:
+
+- `exec` : 同步执行命令,命令正常结束或者超时后中断命令执行后返回命令的执行结果。
+- `async_exec` : 异步执行命令,立即返回命令的调度结果,命令执行结果通过`pull_results`获取。
+- `interrupt_job` : 中断会话当前的命令,类似 Telnet `Ctrl + c`的功能。
+- `pull_results` : 获取异步执行的命令的结果,以 http 长轮询(long-polling)方式重复执行
+- `init_session` : 创建会话
+- `join_session` : 加入会话,用于支持多人共享同一个 Arthas 会话
+- `close_session` : 关闭会话
+
+#### 响应状态
+
+响应中的 state 属性表示请求处理状态,取值如下:
+
+- `SCHEDULED`:异步执行命令时表示已经创建 job 并已提交到命令执行队列,命令可能还没开始执行或者执行中;
+- `SUCCEEDED`:请求处理成功(完成状态);
+- `FAILED`:请求处理失败(完成状态),通常附带 message 说明原因;
+- `REFUSED`:请求被拒绝(完成状态),通常附带 message 说明原因;
+
+### 一次性命令
+
+与执行批处理命令类似,一次性命令以同步方式执行。不需要创建会话,不需要设置`sessionId`选项。
+
+```json
+{
+ "action": "exec",
+ "command": ""
+}
+```
+
+比如获取 Arthas 版本号:
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"exec",
+ "command":"version"
+}
+'
+```
+
+响应内容如下:
+
+```json
+{
+ "state": "SUCCEEDED",
+ "sessionId": "ee3bc004-4586-43de-bac0-b69d6db7a869",
+ "body": {
+ "results": [
+ {
+ "type": "version",
+ "version": "3.3.7",
+ "jobId": 5
+ },
+ {
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
+ }
+ ],
+ "timeExpired": false,
+ "command": "version",
+ "jobStatus": "TERMINATED",
+ "jobId": 5
+ }
+}
+```
+
+响应数据解析:
+
+- `state`: 请求处理状态,参考“接口响应状态”说明
+- `sessionId `: Arthas 会话 ID,一次性命令自动创建及销毁临时会话
+- `body.jobId`: 命令的任务 ID,同一任务输出的所有 Result 都是相同的 jobId
+- `body.jobStatus`: 任务状态,同步执行正常结束为`TERMINATED `
+- `body.timeExpired`: 任务执行是否超时
+- `body/results`: 命令执行的结果列表
+
+**命令结果格式说明**
+
+```json
+[
+ {
+ "type": "version",
+ "version": "3.3.7",
+ "jobId": 5
+ },
+ {
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
+ }
+]
+```
+
+- `type` : 命令结果类型,除了`status`等特殊的几个外,其它的保持与 Arthas 命令名称一致。请参考"[特殊命令结果](#special_command_results)"小节。
+- `jobId` : 处理命令的任务 ID。
+- 其它字段为每个不同命令的数据。
+
+注意:也可以使用一次性命令的方式执行 watch/trace 等连续输出的命令,但不能中断命令执行,可能出现长时间没有结束的问题。请参考"[watch 命令输出 map 对象](#change_watch_value_to_map)"小节的示例。
+
+请尽量按照以下方式处理:
+
+- 设置合理的`execTimeout`,到达超时时间后强制中断命令执行,避免长时间挂起。
+- 通过`-n`参数指定较少的执行次数。
+- 保证命令匹配的方法可以成功命中和 condition-express 编写正确,如果 watch/trace 没有命中就算指定`-n 1`也会挂起等待到执行超时。
+
+### 会话交互
+
+由用户创建及管理 Arthas 会话,适用于复杂的交互过程。访问流程如下:
+
+- 创建会话
+- 加入会话(可选)
+- 拉取命令结果
+- 执行一系列命令
+- 中断命令执行
+- 关闭会话
+
+#### 创建会话
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"init_session"
+}
+'
+```
+
+响应结果:
+
+```json
+{
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "consumerId": "5ae4e5fbab8b4e529ac404f260d4e2d1_1",
+ "state": "SUCCEEDED"
+}
+```
+
+当前会话 ID 为: `b09f1353-202c-407b-af24-701b744f971e`, 当前消费者 ID 为:`5ae4e5fbab8b4e529ac404f260d4e2d1_1 `。
+
+#### 加入会话
+
+指定要加入的会话 ID,服务端将分配一个新的消费者 ID。多个消费者可以接收到同一个会话的命令结果。本接口用于支持多人共享同一个会话或刷新页面后重新拉取会话历史记录。
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"join_session",
+ "sessionId" : "b09f1353-202c-407b-af24-701b744f971e"
+}
+'
+```
+
+响应结果:
+
+```json
+{
+ "consumerId": "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "state": "SUCCEEDED"
+}
+```
+
+新的消费者 ID 为`8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` 。
+
+#### 拉取命令结果
+
+拉取命令结果消息的 action 为`pull_results`。请使用 Http long-polling 方式,定时循环拉取结果消息。
+消费者的超时时间为 5 分钟,超时后需要调用`join_session`分配新的消费者。每个消费者单独分配一个缓存队列,按顺序拉取命令结果,不会影响到其它消费者。
+
+请求参数需要指定会话 ID 及消费者 ID:
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"pull_results",
+ "sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
+ "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2"
+}
+'
+```
+
+用 Bash 脚本定时拉取结果消息:
+
+```bash
+while true; do curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"pull_results",
+ "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
+ "consumerId" : "8ecb9cb7c7804d5d92e258b23d5245cc_1"
+}
+' | json_pp; sleep 2; done
+```
+
+注: `json_pp` 工具将输出内容格式化为 pretty json。
+
+响应内容如下:
+
+```json
+{
+ "body": {
+ "results": [
+ {
+ "inputStatus": "DISABLED",
+ "jobId": 0,
+ "type": "input_status"
+ },
+ {
+ "type": "message",
+ "jobId": 0,
+ "message": "Welcome to arthas!"
+ },
+ {
+ "tutorials": "https://arthas.aliyun.com/doc/arthas-tutorials.html",
+ "time": "2020-08-06 15:56:43",
+ "type": "welcome",
+ "jobId": 0,
+ "pid": "7909",
+ "wiki": "https://arthas.aliyun.com/doc",
+ "version": "3.3.7"
+ },
+ {
+ "inputStatus": "ALLOW_INPUT",
+ "type": "input_status",
+ "jobId": 0
+ }
+ ]
+ },
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "consumerId": "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
+ "state": "SUCCEEDED"
+}
+```
+
+#### 异步执行命令
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '''
+{
+ "action":"async_exec",
+ "command":"watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" ",
+ "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a"
+}
+'''
+```
+
+`async_exec` 的结果:
+
+```json
+{
+ "sessionId": "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
+ "state": "SCHEDULED",
+ "body": {
+ "jobStatus": "READY",
+ "jobId": 3,
+ "command": "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
+ }
+}
+```
+
+- `state` : `SCHEDULED` 状态表示已经解析命令生成任务,但未开始执行。
+- `body.jobId` :
+ 异步执行命令的任务 ID,可以根据此任务 ID 来过滤在`pull_results`输出的命令结果。
+- `body.jobStatus` : 任务状态`READY`表示未开始执行。
+
+查看上面自动拉取结果消息脚本的 shell 输出:
+
+```json
+{
+ "body" : {
+ "results" : [
+ {
+ "type" : "command",
+ "jobId" : 3,
+ "state" : "SCHEDULED",
+ "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
+ },
+ {
+ "inputStatus" : "ALLOW_INTERRUPT",
+ "jobId" : 0,
+ "type" : "input_status"
+ },
+ {
+ "success" : true,
+ "jobId" : 3,
+ "effect" : {
+ "listenerId" : 3,
+ "cost" : 24,
+ "classCount" : 1,
+ "methodCount" : 1
+ },
+ "type" : "enhancer"
+ },
+ {
+ "sizeLimit" : 10485760,
+ "expand" : 1,
+ "jobId" : 3,
+ "type" : "watch",
+ "cost" : 0.071499,
+ "ts" : 1596703453237,
+ "value" : [
+ [
+ -170365
+ ],
+ null,
+ {
+ "stackTrace" : [
+ {
+ "className" : "demo.MathGame",
+ "classLoaderName" : "app",
+ "methodName" : "primeFactors",
+ "nativeMethod" : false,
+ "lineNumber" : 46,
+ "fileName" : "MathGame.java"
+ },
+ ...
+ ],
+ "localizedMessage" : "number is: -170365, need >= 2",
+ "@type" : "java.lang.IllegalArgumentException",
+ "message" : "number is: -170365, need >= 2"
+ }
+ ]
+ },
+ {
+ "type" : "watch",
+ "cost" : 0.033375,
+ "jobId" : 3,
+ "ts" : 1596703454241,
+ "value" : [
+ [
+ 1
+ ],
+ [
+ 2,
+ 2,
+ 2,
+ 2,
+ 13,
+ 491
+ ],
+ null
+ ],
+ "sizeLimit" : 10485760,
+ "expand" : 1
+ }
+ ]
+ },
+ "consumerId" : "8ecb9cb7c7804d5d92e258b23d5245cc_1",
+ "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
+ "state" : "SUCCEEDED"
+}
+```
+
+watch 命令结果的`value`为 watch-experss 的值,上面命令中为`{params, returnObj, throwExp}`,所以 watch 结果的 value 为一个长度为 3 的数组,每个元素分别对应相应顺序的表达式。
+请参考"[watch 命令输出 map 对象](#change_watch_value_to_map)"小节。
+
+#### 中断命令执行
+
+中断会话正在运行的前台 Job(前台任务):
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '''
+{
+ "action":"interrupt_job",
+ "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a"
+}
+'''
+```
+
+```
+{
+ "state" : "SUCCEEDED",
+ "body" : {
+ "jobStatus" : "TERMINATED",
+ "jobId" : 3
+ }
+}
+```
+
+#### 关闭会话
+
+指定会话 ID,关闭会话。
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d '''
+{
+ "action":"close_session",
+ "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a"
+}
+'''
+```
+
+```json
+{
+ "state": "SUCCEEDED"
+}
+```
+
+### 鉴权
+
+参考: [auth](auth.md)
+
+### Web UI
+
+
+
+一个基于 Http API 接口实现的 Web UI,访问地址为: [http://127.0.0.1:8563/ui](http://127.0.0.1:8563/ui) 。
+
+已实现功能:
+
+- 创建会话
+- 复制并打开 url 加入会话,多人共享会话
+- 周期性拉取会话命令结果消息
+- 刷新页面或者加入会话拉取会话历史命令消息
+- 输入命令/中断命令状态控制
+
+待开发功能:
+
+- 改进将命令结果消息可读性
+- 命令输入支持自动完成及命令模板
+- 提供命令帮助
+- 支持个人选项设置
+
+
+
+### 特殊命令结果
+
+#### status
+
+```json
+{
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
+}
+```
+
+`type`为`status`表示命令执行状态:
+
+每个命令执行结束后都有唯一一个 status 结果。`statusCode`
+为 0 表示执行成功,`statusCode` 为非 0 值表示执行失败,类似进程退出码(exit code)。
+
+命令执行失败时一般会提供错误消息,如:
+
+```json
+{
+ "jobId": 3,
+ "message": "The argument 'class-pattern' is required",
+ "statusCode": -10,
+ "type": "status"
+}
+```
+
+#### input_status
+
+```json
+{
+ "inputStatus": "ALLOW_INPUT",
+ "type": "input_status",
+ "jobId": 0
+}
+```
+
+`type`为`input_status`表示输入状态:
+
+用于 UI 交互时控制用户输入,每次执行命令前后会发送改变的消息。
+`inputStatus` 的值说明:
+
+- `ALLOW_INPUT` :
+ 允许用户输入命令,表示会话没有在执行的前台命令,可以接受新的命令。
+- `ALLOW_INTERRUPT` :
+ 允许用户中断命令执行,表示当前正在执行命令,用户可以发送`interrupt_job`中断执行。
+- `DISABLED` : 禁用状态,不能输入命令也不能中断命令。
+
+#### command
+
+```json
+{
+ "type": "command",
+ "jobId": 3,
+ "state": "SCHEDULED",
+ "command": "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
+}
+```
+
+`type` 为`command`表示输入的命令数据:
+
+用于交互 UI 回显用户输入的命令,拉取的会话命令消息历史会包含`command`类型的消息,按顺序处理即可。
+
+#### enhancer
+
+```json
+{
+ "success": true,
+ "jobId": 3,
+ "effect": {
+ "listenerId": 3,
+ "cost": 24,
+ "classCount": 1,
+ "methodCount": 1
+ },
+ "type": "enhancer"
+}
+```
+
+`type`为`enhancer`表示类增强结果:
+
+`trace/watch/jad/tt`等命令需要对类进行增强,会接收到这个`enhancer`结果。可能出现`enhancer`结果成功,但没有命中方法的情况,客户端可以根据`enhancer`结果提示用户。
+
+### 案例
+
+#### 获取 Java 应用的 Classpath
+
+通过 Http api 查询 Java 应用的 System properties,提取`java.class.path`的值。
+
+```bash
+json_data=$(curl -Ss -XPOST http://localhost:8563/api -d '
+{
+ "action":"exec",
+ "command":"sysprop"
+}')
+```
+
+- 使用`sed`提取值:
+
+```bash
+class_path=$(echo $json_data | tr -d '\n' | sed 's/.*"java.class.path":"\([^"]*\).*/\1/')
+echo "classpath: $class_path"
+```
+
+- 使用`json_pp/awk`提取值
+
+```bash
+class_path=$(echo $json_data | tr -d '\n' | json_pp | grep java.class.path | awk -F'"' '{ print $4 }')
+echo "classpath: $class_path"
+```
+
+输出内容:
+
+```
+classpath: demo-arthas-spring-boot.jar
+```
+
+注意:
+
+- `echo $json_data | tr -d '\n'` : 删除换行符(`line.separator`的值),避免影响`sed`/`json_pp`命令处理。
+- `awk -F'"' '{ print $4 }'` : 使用双引号作为分隔符号
+
+
+
+#### watch 命令输出 map 对象
+
+watch 的结果值由计算`watch-express` ognl 表达式产生,可以通过改变 ognl 表达式来生成想要的值,请参考[OGNL 文档](https://commons.apache.org/proper/commons-ognl/language-guide.html)。
+
+::: tip
+Maps can also be created using a special syntax.
+
+#{ "foo" : "foo value", "bar" : "bar value" }
+
+This creates a Map initialized with mappings for "foo" and "bar".
+:::
+
+下面的命令生成 map 格式的值:
+
+```bash
+watch *MathGame prime* '#{ "params" : params, "returnObj" : returnObj, "throwExp": throwExp}' -x 2 -n 5
+```
+
+在 Telnet shell/WebConsole 中执行上面的命令,输出的结果:
+
+```bash
+ts=2020-08-06 16:57:20; [cost=0.241735ms] result=@LinkedHashMap[
+ @String[params]:@Object[][
+ @Integer[1],
+ ],
+ @String[returnObj]:@ArrayList[
+ @Integer[2],
+ @Integer[241],
+ @Integer[379],
+ ],
+ @String[throwExp]:null,
+]
+```
+
+用 Http api 执行上面的命令,注意对 JSON 双引号转义:
+
+```bash
+curl -Ss -XPOST http://localhost:8563/api -d @- << EOF
+{
+ "action":"exec",
+ "execTimeout": 30000,
+ "command":"watch *MathGame prime* '#{ \"params\" : params, \"returnObj\" : returnObj, \"throwExp\": throwExp}' -n 3 "
+}
+EOF
+```
+
+Http api 执行结果:
+
+```json
+{
+ "body": {
+ ...
+ "results": [
+ ...
+ {
+ ...
+ "type": "watch",
+ "value": {
+ "params": [
+ 1
+ ],
+ "returnObj": [
+ 2,
+ 5,
+ 17,
+ 23,
+ 23
+ ]
+ }
+ },
+ {
+ ...
+ "type": "watch",
+ "value": {
+ "params": [
+ -98278
+ ],
+ "throwExp": {
+ "@type": "java.lang.IllegalArgumentException",
+ "localizedMessage": "number is: -98278, need >= 2",
+ "message": "number is: -98278, need >= 2",
+ "stackTrace": [
+ ...
+ ]
+ }
+ }
+ },
+ ...
+}
+```
+
+可以看到 watch 结果的 value 变成 map 对象,程序可以通过 key 读取结果。
diff --git a/site-vuepress/docs/doc/idea-plugin.md b/site-vuepress/docs/doc/idea-plugin.md
new file mode 100644
index 000000000..302304e4a
--- /dev/null
+++ b/site-vuepress/docs/doc/idea-plugin.md
@@ -0,0 +1,23 @@
+# IDEA Plugin
+
+#### Arthas-idea(部分命令可视化)
+
+::: tip
+插件由社区开发者提供。
+:::
+
+- Jetbrains 插件获取地址: [https://plugins.jetbrains.com/plugin/13581-arthas-idea](https://plugins.jetbrains.com/plugin/13581-arthas-idea)
+- 使用文档:[https://www.yuque.com/arthas-idea-plugin](https://www.yuque.com/arthas-idea-plugin)
+- 源码地址: [https://github.com/WangJi92/arthas-idea-plugin](https://github.com/WangJi92/arthas-idea-plugin)
+
+#### Alibaba Cloud Toolkit 热部署组件(一键 retransform)
+
+::: tip
+热部署组件支持一键将编辑器中修改的 Java 源码快速编译,并更新到远端应用服务中,免去手动 dump、mc 的过程。此外,也可以一键还原 retransform 的类文件。
+:::
+
+
+
+- Jetbrains 插件获取地址: [https://plugins.jetbrains.com/plugin/11386-alibaba-cloud-toolkit](https://plugins.jetbrains.com/plugin/11386-alibaba-cloud-toolkit)
+- 使用文档:[https://help.aliyun.com/document_detail/381077.html](https://help.aliyun.com/document_detail/381077.html)
+- 联系我们:请加 Alibaba Cloud Toolkit (应用观测器) 钉钉用户交流群(群号:**34965379**)
diff --git a/site/src/site/sphinx/install-detail.md b/site-vuepress/docs/doc/install-detail.md
similarity index 67%
rename from site/src/site/sphinx/install-detail.md
rename to site-vuepress/docs/doc/install-detail.md
index 88c65c09d..2b4818b3a 100644
--- a/site/src/site/sphinx/install-detail.md
+++ b/site-vuepress/docs/doc/install-detail.md
@@ -1,5 +1,4 @@
-Arthas Install
-=============
+# Arthas Install
## 快速安装
@@ -18,11 +17,11 @@ java -jar arthas-boot.jar
java -jar arthas-boot.jar -h
```
-* 如果下载速度比较慢,可以使用aliyun的镜像:
+- 如果下载速度比较慢,可以使用 aliyun 的镜像:
- ```bash
- java -jar arthas-boot.jar --repo-mirror aliyun --use-http
- ```
+ ```bash
+ java -jar arthas-boot.jar --repo-mirror aliyun --use-http
+ ```
### 使用`as.sh`
@@ -34,7 +33,7 @@ curl -L https://arthas.aliyun.com/install.sh | sh
上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。
-直接在shell下面执行`./as.sh`,就会进入交互界面。
+直接在 shell 下面执行`./as.sh`,就会进入交互界面。
也可以执行`./as.sh -h`来获取更多参数信息。
@@ -54,29 +53,27 @@ java -jar arthas-boot.jar
java -jar arthas-boot.jar -h
```
-
## 手动安装
[手动安装](manual-install.md)
+## 通过 rpm/deb 来安装
+在 releases 页面下载 rpm/deb 包: https://github.com/alibaba/arthas/releases
-## 通过rpm/deb来安装
-
-在releases页面下载rpm/deb包: https://github.com/alibaba/arthas/releases
-
-### 安装deb
+### 安装 deb
```bash
sudo dpkg -i arthas*.deb
```
-### 安装rpm
+
+### 安装 rpm
```bash
sudo rpm -i arthas*.rpm
```
-### deb/rpm安装的用法
+### deb/rpm 安装的用法
在安装后,可以直接执行:
@@ -84,9 +81,9 @@ sudo rpm -i arthas*.rpm
as.sh
```
-## 通过Cloud Toolkit插件使用Arthas
+## 通过 Cloud Toolkit 插件使用 Arthas
-* [通过Cloud Toolkit插件使用Arthas一键诊断远程服务器](https://github.com/alibaba/arthas/issues/570)
+- [通过 Cloud Toolkit 插件使用 Arthas 一键诊断远程服务器](https://github.com/alibaba/arthas/issues/570)
## 离线帮助文档
@@ -94,12 +91,13 @@ as.sh
## 卸载
-* 在 Linux/Unix/Mac 平台
+- 在 Linux/Unix/Mac 平台
+
+ 删除下面文件:
- 删除下面文件:
- ```bash
- rm -rf ~/.arthas/
- rm -rf ~/logs/arthas
- ```
+ ```bash
+ rm -rf ~/.arthas/
+ rm -rf ~/logs/arthas
+ ```
-* Windows平台直接删除user home下面的`.arthas`和`logs/arthas`目录
+- Windows 平台直接删除 user home 下面的`.arthas`和`logs/arthas`目录
diff --git a/site/src/site/sphinx/jad.md b/site-vuepress/docs/doc/jad.md
similarity index 73%
rename from site/src/site/sphinx/jad.md
rename to site-vuepress/docs/doc/jad.md
index 5cc57e213..a96800e01 100644
--- a/site/src/site/sphinx/jad.md
+++ b/site-vuepress/docs/doc/jad.md
@@ -1,23 +1,24 @@
-jad
-===
+# jad
[`jad`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-jad)
-> 反编译指定已加载类的源码
+::: tip
+反编译指定已加载类的源码
+:::
`jad` 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;
-* 在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
-* 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解
+- 在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
+- 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|`[c:]`|类所属 ClassLoader 的 hashcode|
-|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
+| 参数名称 | 参数说明 |
+| --------------------: | :----------------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| `[c:]` | 类所属 ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
### 使用参考
@@ -106,7 +107,7 @@ Location:
#### 反编译时不显示行号
-`--lineNumber` 参数默认值为true,显示指定为false则不打印行号。
+`--lineNumber` 参数默认值为 true,显示指定为 false 则不打印行号。
```java
$ jad demo.MathGame main --lineNumber false
@@ -127,9 +128,11 @@ public static void main(String[] args) throws InterruptedException {
}
```
-#### 反编译时指定ClassLoader
+#### 反编译时指定 ClassLoader
-> 当有多个 `ClassLoader` 都加载了这个类时,`jad` 命令会输出对应 `ClassLoader` 实例的 `hashcode`,然后你只需要重新执行 `jad` 命令,并使用参数 `-c ` 就可以反编译指定 ClassLoader 加载的那个类了;
+::: tip
+当有多个 `ClassLoader` 都加载了这个类时,`jad` 命令会输出对应 `ClassLoader` 实例的 `hashcode`,然后你只需要重新执行 `jad` 命令,并使用参数 `-c ` 就可以反编译指定 ClassLoader 加载的那个类了;
+:::
```java
$ jad org.apache.log4j.Logger
@@ -170,6 +173,6 @@ public class Logger extends Category
Affect(row-cnt:1) cost in 190 ms.
```
-对于只有唯一实例的ClassLoader还可以通过`--classLoaderClass`指定class name,使用起来更加方便:
+对于只有唯一实例的 ClassLoader 还可以通过`--classLoaderClass`指定 class name,使用起来更加方便:
-`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
+`--classLoaderClass` 的值是 ClassLoader 的类名,只有匹配到唯一的 ClassLoader 实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
diff --git a/site/src/site/sphinx/jvm.md b/site-vuepress/docs/doc/jvm.md
similarity index 69%
rename from site/src/site/sphinx/jvm.md
rename to site-vuepress/docs/doc/jvm.md
index f2ff854e0..a403271e9 100644
--- a/site/src/site/sphinx/jvm.md
+++ b/site-vuepress/docs/doc/jvm.md
@@ -1,9 +1,10 @@
-jvm
-===
+# jvm
[`jvm`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-jvm)
-> 查看当前JVM信息
+::: tip
+查看当前 JVM 信息
+:::
### 使用参考
@@ -46,13 +47,13 @@ RUNTIME
--------------------------------------------------------------------------------------------------------------
GARBAGE-COLLECTORS
--------------------------------------------------------------------------------------------------------------
- PS Scavenge name : PS Scavenge
- [count/time (ms)] collectionCount : 7
- collectionTime : 68
-
- PS MarkSweep name : PS MarkSweep
- [count/time (ms)] collectionCount : 1
- collectionTime : 47
+ PS Scavenge name : PS Scavenge
+ [count/time (ms)] collectionCount : 7
+ collectionTime : 68
+
+ PS MarkSweep name : PS MarkSweep
+ [count/time (ms)] collectionCount : 1
+ collectionTime : 47
--------------------------------------------------------------------------------------------------------------
MEMORY-MANAGERS
@@ -73,15 +74,15 @@ RUNTIME
--------------------------------------------------------------------------------------------------------------
MEMORY
--------------------------------------------------------------------------------------------------------------
- HEAP-MEMORY-USAGE init : 268435456(256.0 MiB)
- [memory in bytes] used : 18039504(17.2 MiB)
- committed : 181403648(173.0 MiB)
- max : 3817865216(3.6 GiB)
-
- NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
- [memory in bytes] used : 33926216(32.4 MiB)
- committed : 35176448(33.5 MiB)
- max : -1(-1 B)
+ HEAP-MEMORY-USAGE init : 268435456(256.0 MiB)
+ [memory in bytes] used : 18039504(17.2 MiB)
+ committed : 181403648(173.0 MiB)
+ max : 3817865216(3.6 GiB)
+
+ NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
+ [memory in bytes] used : 33926216(32.4 MiB)
+ committed : 35176448(33.5 MiB)
+ max : -1(-1 B)
--------------------------------------------------------------------------------------------------------------
OPERATING-SYSTEM
@@ -109,15 +110,15 @@ RUNTIME
Affect(row-cnt:0) cost in 88 ms.
```
-### THREAD相关
+### THREAD 相关
-* COUNT: JVM当前活跃的线程数
-* DAEMON-COUNT: JVM当前活跃的守护线程数
-* PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数
-* STARTED-COUNT: 从JVM启动开始总共启动过的线程次数
-* DEADLOCK-COUNT: JVM当前死锁的线程数
+- COUNT: JVM 当前活跃的线程数
+- DAEMON-COUNT: JVM 当前活跃的守护线程数
+- PEAK-COUNT: 从 JVM 启动开始曾经活着的最大线程数
+- STARTED-COUNT: 从 JVM 启动开始总共启动过的线程次数
+- DEADLOCK-COUNT: JVM 当前死锁的线程数
### 文件描述符相关
-* MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数
-* OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数
+- MAX-FILE-DESCRIPTOR-COUNT:JVM 进程最大可以打开的文件描述符数
+- OPEN-FILE-DESCRIPTOR-COUNT:JVM 当前打开的文件描述符数
diff --git a/site/src/site/sphinx/keymap.md b/site-vuepress/docs/doc/keymap.md
similarity index 56%
rename from site/src/site/sphinx/keymap.md
rename to site-vuepress/docs/doc/keymap.md
index 6d50eca41..254d1845c 100644
--- a/site/src/site/sphinx/keymap.md
+++ b/site-vuepress/docs/doc/keymap.md
@@ -1,5 +1,4 @@
-Arthas 命令行快捷键
-===
+# Arthas 命令行快捷键
[`keymap`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-keymap)
@@ -7,42 +6,36 @@ Arthas 命令行快捷键
默认的快捷键如下:
-
-
-
-
-| 快捷键 | 快捷键说明 | 命令名称 | 命令说明 |
-| ------------- | ---------------- | -------------------- | ---------------- |
-| `"\C-a"` | ctrl + a | beginning-of-line | 跳到行首 |
-| ` "\C-e"` | ctrl + e | end-of-line | 跳到行尾 |
-| `"\C-f"` | ctrl + f | forward-word | 向前移动一个单词 |
-| `"\C-b"` | ctrl + b | backward-word | 向后移动一个单词 |
-| `"\e[D"` | 键盘左方向键 | backward-char | 光标向前移动一个字符 |
-| `"\e[C"` | 键盘右方向键 | forward-char | 光标向后移动一个字符 |
-| `"\e[B"` | 键盘下方向键 | next-history | 下翻显示下一个命令 |
-| `"\e[A"` | 键盘上方向键 | previous-history | 上翻显示上一个命令 |
-| `"\C-h"` | ctrl + h | backward-delete-char | 向后删除一个字符 |
-| `"\C-?"` | ctrl + shift + / | backward-delete-char | 向后删除一个字符 |
+| 快捷键 | 快捷键说明 | 命令名称 | 命令说明 |
+| ------------- | ---------------- | -------------------- | -------------------------------- |
+| `"\C-a"` | ctrl + a | beginning-of-line | 跳到行首 |
+| ` "\C-e"` | ctrl + e | end-of-line | 跳到行尾 |
+| `"\C-f"` | ctrl + f | forward-word | 向前移动一个单词 |
+| `"\C-b"` | ctrl + b | backward-word | 向后移动一个单词 |
+| `"\e[D"` | 键盘左方向键 | backward-char | 光标向前移动一个字符 |
+| `"\e[C"` | 键盘右方向键 | forward-char | 光标向后移动一个字符 |
+| `"\e[B"` | 键盘下方向键 | next-history | 下翻显示下一个命令 |
+| `"\e[A"` | 键盘上方向键 | previous-history | 上翻显示上一个命令 |
+| `"\C-h"` | ctrl + h | backward-delete-char | 向后删除一个字符 |
+| `"\C-?"` | ctrl + shift + / | backward-delete-char | 向后删除一个字符 |
| `"\C-u"` | ctrl + u | undo | 撤销上一个命令,相当于清空当前行 |
-| `"\C-d"` | ctrl + d | delete-char | 删除当前光标所在字符 |
-| `"\C-k"` | ctrl + k | kill-line | 删除当前光标到行尾的所有字符 |
-| `"\C-i"` | ctrl + i | complete | 自动补全,相当于敲`TAB` |
-| `"\C-j"` | ctrl + j | accept-line | 结束当前行,相当于敲回车 |
-| `"\C-m"` | ctrl + m | accept-line | 结束当前行,相当于敲回车 |
-| `"\C-w"` | | backward-delete-word | |
-| `"\C-x\e[3~"` | | backward-kill-line | |
-| `"\e\C-?"` | | backward-kill-word | |
-
-
-* 任何时候 `tab` 键,会根据当前的输入给出提示
-* 命令后敲 `-` 或 `--` ,然后按 `tab` 键,可以展示出此命令具体的选项
-
+| `"\C-d"` | ctrl + d | delete-char | 删除当前光标所在字符 |
+| `"\C-k"` | ctrl + k | kill-line | 删除当前光标到行尾的所有字符 |
+| `"\C-i"` | ctrl + i | complete | 自动补全,相当于敲`TAB` |
+| `"\C-j"` | ctrl + j | accept-line | 结束当前行,相当于敲回车 |
+| `"\C-m"` | ctrl + m | accept-line | 结束当前行,相当于敲回车 |
+| `"\C-w"` | | backward-delete-word | |
+| `"\C-x\e[3~"` | | backward-kill-line | |
+| `"\e\C-?"` | | backward-kill-word | |
+
+- 任何时候 `tab` 键,会根据当前的输入给出提示
+- 命令后敲 `-` 或 `--` ,然后按 `tab` 键,可以展示出此命令具体的选项
#### 自定义快捷键
在当前用户目录下新建`$USER_HOME/.arthas/conf/inputrc`文件,加入自定义配置。
-假设我是vim的重度用户,我要把`ctrl+h`设置为光标向前一个字符,则设置如下,首先拷贝默认配置
+假设我是 vim 的重度用户,我要把`ctrl+h`设置为光标向前一个字符,则设置如下,首先拷贝默认配置
```
"\C-a": beginning-of-line
@@ -70,11 +63,7 @@ Arthas 命令行快捷键
#### 后台异步命令相关快捷键
-* ctrl + c: 终止当前命令
-* ctrl + z: 挂起当前命令,后续可以 bg/fg 重新支持此命令,或 kill 掉
-* ctrl + a: 回到行首
-* ctrl + e: 回到行尾
-
-
-
-
+- ctrl + c: 终止当前命令
+- ctrl + z: 挂起当前命令,后续可以 bg/fg 重新支持此命令,或 kill 掉
+- ctrl + a: 回到行首
+- ctrl + e: 回到行尾
diff --git a/site/src/site/sphinx/logger.md b/site-vuepress/docs/doc/logger.md
similarity index 84%
rename from site/src/site/sphinx/logger.md
rename to site-vuepress/docs/doc/logger.md
index 57b53fb42..91dfdd85e 100644
--- a/site/src/site/sphinx/logger.md
+++ b/site-vuepress/docs/doc/logger.md
@@ -1,13 +1,14 @@
-logger
-===
+# logger
[`logger`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-logger)
-> 查看logger信息,更新logger level
+::: tip
+查看 logger 信息,更新 logger level
+:::
### 使用参考
-#### 查看所有logger信息
+#### 查看所有 logger 信息
以下面的`logback.xml`为例:
@@ -46,7 +47,6 @@ logger
```
-
使用`logger`命令打印的结果是:
```bash
@@ -78,12 +78,11 @@ logger
从`appenders`的信息里,可以看到
-* `CONSOLE` logger的target是`System.out`
-* `APPLICATION` logger是`RollingFileAppender`,它的file是`app.log`
-* `ASYNC`它的`appenderRef`是`APPLICATION`,即异步输出到文件里
-
+- `CONSOLE` logger 的 target 是`System.out`
+- `APPLICATION` logger 是`RollingFileAppender`,它的 file 是`app.log`
+- `ASYNC`它的`appenderRef`是`APPLICATION`,即异步输出到文件里
-#### 查看指定名字的logger信息
+#### 查看指定名字的 logger 信息
```bash
[arthas@2062]$ logger -n org.springframework.web
@@ -97,11 +96,11 @@ logger
codeSource file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
```
-#### 查看指定classloader的logger信息
+#### 查看指定 classloader 的 logger 信息
-注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。
+注意 hashcode 是变化的,需要先查看当前的 ClassLoader 信息,提取对应 ClassLoader 的 hashcode。
-如果你使用`-c`,你需要手动输入hashcode:`-c `
+如果你使用`-c`,你需要手动输入 hashcode:`-c `
```bash
[arthas@2062]$ logger -c 2a139a55
@@ -130,35 +129,34 @@ logger
appenderRef [APPLICATION]
```
-对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便:
+对于只有唯一实例的 ClassLoader 可以通过`--classLoaderClass`指定 class name,使用起来更加方便:
`logger --classLoaderClass sun.misc.Launcher$AppClassLoader`
- * 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader。
+- 注: 这里 classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader。
-`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
+`--classLoaderClass` 的值是 ClassLoader 的类名,只有匹配到唯一的 ClassLoader 实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。
-#### 更新logger level
+#### 更新 logger level
```bash
[arthas@2062]$ logger --name ROOT --level debug
update logger level success.
```
-#### 指定classloader更新 logger level
+#### 指定 classloader 更新 logger level
-默认情况下,logger命令会在SystemClassloader下执行,如果应用是传统的`war`应用,或者spring boot fat jar启动的应用,那么需要指定classloader。
+默认情况下,logger 命令会在 SystemClassloader 下执行,如果应用是传统的`war`应用,或者 spring boot fat jar 启动的应用,那么需要指定 classloader。
-可以先用 `sc -d yourClassName` 来查看具体的 classloader hashcode,然后在更新level时指定classloader:
+可以先用 `sc -d yourClassName` 来查看具体的 classloader hashcode,然后在更新 level 时指定 classloader:
```bash
[arthas@2062]$ logger -c 2a139a55 --name ROOT --level debug
```
-#### 查看没有appender的logger的信息
-
+#### 查看没有 appender 的 logger 的信息
-默认情况下,`logger`命令只打印有appender的logger的信息。如果想查看没有`appender`的logger的信息,可以加上参数`--include-no-appender`。
+默认情况下,`logger`命令只打印有 appender 的 logger 的信息。如果想查看没有`appender`的 logger 的信息,可以加上参数`--include-no-appender`。
注意,通常输出结果会很长。
diff --git a/site-vuepress/docs/doc/manual-install.md b/site-vuepress/docs/doc/manual-install.md
new file mode 100644
index 000000000..3d133b4ce
--- /dev/null
+++ b/site-vuepress/docs/doc/manual-install.md
@@ -0,0 +1,112 @@
+# 手动安装 Arthas
+
+1. 下载最新版本
+
+ **最新版本,点击下载**:[](https://arthas.aliyun.com/download/latest_version?mirror=aliyun)
+
+2. 解压缩 arthas 的压缩包
+
+ ```
+ unzip arthas-packaging-bin.zip
+ ```
+
+3. 安装 Arthas
+
+ 安装之前最好把所有老版本的 Arthas 全都删掉
+
+ ```
+ sudo su admin
+ rm -rf /home/admin/.arthas/lib/*
+ cd arthas
+ ./install-local.sh
+ ```
+
+ ::: warning
+ 注意,这里根据你需要诊断的 Java 进程的所属用户进行切换
+ :::
+
+4. 启动 Arthas
+
+ 启动之前,请确保老版本的 Arthas 已经`stop`.
+
+ ```
+ ./as.sh
+ ```
+
+## 以脚本的方式启动 as.sh/as.bat
+
+### Linux/Unix/Mac
+
+Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可:
+
+```bash
+curl -L https://arthas.aliyun.com/install.sh | sh
+```
+
+上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。
+
+直接在 shell 下面执行`./as.sh`,就会进入交互界面。
+
+也可以执行`./as.sh -h`来获取更多参数信息。
+
+### Windows
+
+最新版本,点击下载:[](https://arthas.aliyun.com/download/latest_version?mirror=aliyun)
+
+下载解压后在 bin 目录有 `as.bat`。此脚本暂时只接受一个参数 pid,即只能诊断本机上的 Java 进程。(欢迎精通 bat 脚本的开发者改进)
+
+```
+as.bat
+```
+
+使用以下命令诊断 windows 服务模式运行的 Java 进程 (--interact 打开服务 UI 交互模式,方便诊断问题):
+
+```
+as-service.bat -port
+as-service.bat -pid
+as-service.bat -pid --interact
+```
+
+清理 arthas windows 服务执行以下命令:
+
+```
+as-service.bat -remove
+```
+
+## 手动拼接命令行启动
+
+如果启动遇到问题,可以尝试手动拼接出命令行参数来启动。
+
+1. 查找目录 jvm 的 java 文件路径。
+
+ 在 linux/mac 上执行`ps aux | grep java`,在 windows 上可以通过进程管理器来查看。假设是`/opt/jdk1.8/bin/java`。
+
+2. 拼接出命令行
+
+ ```bash
+ /opt/jdk1.8/bin/java -Xbootclasspath/a:/opt/jdk1.8/lib/tools.jar \
+ -jar /tmp/arthas-packaging/arthas-core.jar \
+ -pid 15146 \
+ -target-ip 127.0.0.1 -telnet-port 3658 -http-port 8563 \
+ -core /tmp/arthas-packaging/arthas-core.jar \
+ -agent /tmp/arthas-packaging/arthas/arthas-agent.jar
+ ```
+
+ 命令行分几部分组成:
+
+ - `-Xbootclasspath` 增加 tools.jar
+ - `-jar /tmp/arthas-packaging/arthas-core.jar` 指定 main 函数入口
+ - `-pid 15146` 指定目标 java 进程 ID
+ - `-target-ip 127.0.0.1` 指定 IP
+ - `-telnet-port 3658 -http-port 8563` 指定 telnet 和 http 端口
+ - `-core /tmp/arthas-packaging/arthas-core.jar -agent /tmp/arthas-packaging/arthas/arthas-agent.jar` 指定 core/agent jar 包
+
+ 如果是`jdk > 9`,即 9/10/11 以上的版本,不需要指定`tools.jar`,直接去掉`-Xbootclasspath` 的配置即可。
+
+ 启动目志输出在`~/logs/arthas/arthas.log`里。
+
+3. attach 成功之后,使用 telnet 连接
+
+ ```bash
+ telnet 127.0.0.1 3658
+ ```
diff --git a/site-vuepress/docs/doc/mbean.md b/site-vuepress/docs/doc/mbean.md
new file mode 100644
index 000000000..733a5d37b
--- /dev/null
+++ b/site-vuepress/docs/doc/mbean.md
@@ -0,0 +1,68 @@
+# mbean
+
+[`mbean`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-mbean)
+
+::: tip
+查看 Mbean 的信息
+:::
+
+这个命令可以便捷的查看或监控 Mbean 的属性信息。
+
+### 参数说明
+
+| 参数名称 | 参数说明 |
+| ------------------: | :--------------------------------------------------- |
+| _name-pattern_ | 名称表达式匹配 |
+| _attribute-pattern_ | 属性名表达式匹配 |
+| [m] | 查看元信息 |
+| [i:] | 刷新属性值的时间间隔 (ms) |
+| [n:] | 刷新属性值的次数 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配。仅对属性名有效 |
+
+### 使用参考
+
+列出所有 Mbean 的名称:
+
+```bash
+mbean
+```
+
+查看 Mbean 的元信息:
+
+```bash
+mbean -m java.lang:type=Threading
+```
+
+查看 mbean 属性信息:
+
+```bash
+mbean java.lang:type=Threading
+```
+
+mbean 的 name 支持通配符匹配:
+
+```bash
+mbean java.lang:type=Th*
+```
+
+::: warning
+注意:ObjectName 的匹配规则与正常的通配符存在差异,详细参见:[javax.management.ObjectName](https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html?is-external=true)
+:::
+
+通配符匹配特定的属性字段:
+
+```bash
+mbean java.lang:type=Threading *Count
+```
+
+使用`-E`命令切换为正则匹配:
+
+```bash
+mbean -E java.lang:type=Threading PeakThreadCount|ThreadCount|DaemonThreadCount
+```
+
+使用`-i`命令实时监控:
+
+```bash
+mbean -i 1000 java.lang:type=Threading *Count
+```
diff --git a/site/src/site/sphinx/mc.md b/site-vuepress/docs/doc/mc.md
similarity index 62%
rename from site/src/site/sphinx/mc.md
rename to site-vuepress/docs/doc/mc.md
index 937edb320..a8547d501 100644
--- a/site/src/site/sphinx/mc.md
+++ b/site-vuepress/docs/doc/mc.md
@@ -1,21 +1,22 @@
-mc
-===
+# mc
[`mc-retransform`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform)
-> Memory Compiler/内存编译器,编译`.java`文件生成`.class`。
+::: tip
+Memory Compiler/内存编译器,编译`.java`文件生成`.class`。
+:::
```bash
mc /tmp/Test.java
```
-可以通过`-c`参数指定classloader:
+可以通过`-c`参数指定 classloader:
```bash
mc -c 327a647b /tmp/Test.java
```
-也可以通过`--classLoaderClass`参数指定ClassLoader:
+也可以通过`--classLoaderClass`参数指定 ClassLoader:
```bash
$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
@@ -32,4 +33,6 @@ mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
编译生成`.class`文件之后,可以结合[retransform](retransform.md)命令实现热更新代码。
-> 注意,mc命令有可能失败。如果编译失败可以在本地编译好`.class`文件,再上传到服务器。具体参考[retransform](retransform.md)命令说明。
\ No newline at end of file
+::: warning
+注意,mc 命令有可能失败。如果编译失败可以在本地编译好`.class`文件,再上传到服务器。具体参考[retransform](retransform.md)命令说明。
+:::
diff --git a/site/src/site/sphinx/memory.md b/site-vuepress/docs/doc/memory.md
similarity index 96%
rename from site/src/site/sphinx/memory.md
rename to site-vuepress/docs/doc/memory.md
index 401c97d19..0102ce28a 100644
--- a/site/src/site/sphinx/memory.md
+++ b/site-vuepress/docs/doc/memory.md
@@ -1,8 +1,6 @@
-memory
-===
-
-查看JVM 内存信息。
+# memory
+查看 JVM 内存信息。
### 使用参考
@@ -22,4 +20,3 @@ codeheap_'non-profiled_nmethods' 685K 2496K 120032K 0.57%
mapped 0K 0K - 0.00%
direct 48M 48M - 100.00%
```
-
diff --git a/site/src/site/sphinx/monitor.md b/site-vuepress/docs/doc/monitor.md
similarity index 74%
rename from site/src/site/sphinx/monitor.md
rename to site-vuepress/docs/doc/monitor.md
index e86f8d816..fc1245432 100644
--- a/site/src/site/sphinx/monitor.md
+++ b/site-vuepress/docs/doc/monitor.md
@@ -1,9 +1,10 @@
-monitor
-=======
+# monitor
[`monitor`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-monitor)
-> 方法执行监控
+::: tip
+方法执行监控
+:::
对匹配 `class-pattern`/`method-pattern`/`condition-express`的类、方法的调用进行监控。
@@ -11,33 +12,33 @@ monitor
实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 `Ctrl+C` 为止。
-服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变。
+服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何 Arthas 命令不会引起原有业务逻辑的改变。
### 监控的维度说明
-|监控项|说明|
-|---:|:---|
-|timestamp|时间戳|
-|class|Java类|
-|method|方法(构造方法、普通方法)|
-|total|调用次数|
-|success|成功次数|
-|fail|失败次数|
-|rt|平均RT|
-|fail-rate|失败率|
+| 监控项 | 说明 |
+| --------: | :------------------------- |
+| timestamp | 时间戳 |
+| class | Java 类 |
+| method | 方法(构造方法、普通方法) |
+| total | 调用次数 |
+| success | 成功次数 |
+| fail | 失败次数 |
+| rt | 平均 RT |
+| fail-rate | 失败率 |
### 参数说明
方法拥有一个命名参数 `[c:]`,意思是统计周期(cycle of output),拥有一个整型的参数值
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|方法名表达式匹配|
-|*condition-express*|条件表达式|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
-|`[c:]`|统计周期,默认值为120秒|
-|[b]|在**方法调用之前**计算condition-express|
+| 参数名称 | 参数说明 |
+| ------------------: | :--------------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| _condition-express_ | 条件表达式 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| `[c:]` | 统计周期,默认值为 120 秒 |
+| [b] | 在**方法调用之前**计算 condition-express |
### 使用参考
@@ -76,52 +77,50 @@ Affect(class-cnt:1 , method-cnt:1) cost in 94 ms.
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 19 ms, listenerId: 5
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:36 demo.MathGame primeFactors 5 3 2 0.09 40.00%
+ 2020-09-02 09:42:36 demo.MathGame primeFactors 5 3 2 0.09 40.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:41 demo.MathGame primeFactors 5 2 3 0.11 60.00%
+ 2020-09-02 09:42:41 demo.MathGame primeFactors 5 2 3 0.11 60.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:46 demo.MathGame primeFactors 5 1 4 0.06 80.00%
+ 2020-09-02 09:42:46 demo.MathGame primeFactors 5 1 4 0.06 80.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:51 demo.MathGame primeFactors 5 1 4 0.12 80.00%
+ 2020-09-02 09:42:51 demo.MathGame primeFactors 5 1 4 0.12 80.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:56 demo.MathGame primeFactors 5 3 2 0.15 40.00%
+ 2020-09-02 09:42:56 demo.MathGame primeFactors 5 3 2 0.15 40.00%
```
#### 计算条件表达式过滤统计结果(方法执行完毕之前)
-
```bash
monitor -b -c 5 com.test.testes.MathGame primeFactors "params[0] <= 2"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 21 ms, listenerId: 4
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00%
+ 2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:02 demo.MathGame primeFactors 3 0 3 0.06 100.00%
+ 2020-09-02 09:42:02 demo.MathGame primeFactors 3 0 3 0.06 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:07 demo.MathGame primeFactors 2 0 2 0.06 100.00%
+ 2020-09-02 09:42:07 demo.MathGame primeFactors 2 0 2 0.06 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:12 demo.MathGame primeFactors 1 0 1 0.05 100.00%
+ 2020-09-02 09:42:12 demo.MathGame primeFactors 1 0 1 0.05 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:17 demo.MathGame primeFactors 2 0 2 0.10 100.00%
+ 2020-09-02 09:42:17 demo.MathGame primeFactors 2 0 2 0.10 100.00%
```
-
diff --git a/site/src/site/sphinx/ognl.md b/site-vuepress/docs/doc/ognl.md
similarity index 53%
rename from site/src/site/sphinx/ognl.md
rename to site-vuepress/docs/doc/ognl.md
index be7eb7eca..62457294d 100644
--- a/site/src/site/sphinx/ognl.md
+++ b/site-vuepress/docs/doc/ognl.md
@@ -1,27 +1,26 @@
-ognl
-===
+# ognl
[`ognl`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-ognl)
-> 执行ognl表达式
+::: tip
+执行 ognl 表达式
+:::
-从3.0.5版本增加
+从 3.0.5 版本增加
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*express*|执行的表达式|
-|`[c:]`|执行表达式的 ClassLoader 的 hashcode,默认值是SystemClassLoader|
-|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name|
-|[x]|结果对象的展开层次,默认值1|
-
+| 参数名称 | 参数说明 |
+| --------------------: | :--------------------------------------------------------------- |
+| _express_ | 执行的表达式 |
+| `[c:]` | 执行表达式的 ClassLoader 的 hashcode,默认值是 SystemClassLoader |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| [x] | 结果对象的展开层次,默认值 1 |
### 使用参考
-* OGNL特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
-* OGNL表达式官方指南:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
-
+- OGNL 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官方指南:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
调用静态函数:
@@ -53,15 +52,15 @@ $ ognl '@demo.MathGame@random'
]
```
-通过hashcode指定ClassLoader:
+通过 hashcode 指定 ClassLoader:
```bash
$ classloader -t
-+-BootstrapClassLoader
-+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
- +-com.taobao.arthas.agent.ArthasClassloader@472067c7
- +-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
- +-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8
++-BootstrapClassLoader
++-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
+ +-com.taobao.arthas.agent.ArthasClassloader@472067c7
+ +-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
+ +-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8
$ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
@@ -69,11 +68,12 @@ $ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
name=@String[org.springframework.boot.SpringApplication],
logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]
-$
+$
```
-注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。
-对于只有唯一实例的ClassLoader可以通过class name指定,使用起来更加方便:
+注意 hashcode 是变化的,需要先查看当前的 ClassLoader 信息,提取对应 ClassLoader 的 hashcode。
+
+对于只有唯一实例的 ClassLoader 可以通过 class name 指定,使用起来更加方便:
```bash
$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger
@@ -84,8 +84,7 @@ $ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader
]
```
-
-执行多行表达式,赋值给临时变量,返回一个List:
+执行多行表达式,赋值给临时变量,返回一个 List:
```bash
$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
@@ -93,4 +92,4 @@ $ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("j
@String[/opt/java/8.0.181-zulu/jre],
@String[OpenJDK Runtime Environment],
]
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/options.md b/site-vuepress/docs/doc/options.md
similarity index 56%
rename from site/src/site/sphinx/options.md
rename to site-vuepress/docs/doc/options.md
index 859a771b7..cf2d4da88 100644
--- a/site/src/site/sphinx/options.md
+++ b/site-vuepress/docs/doc/options.md
@@ -1,25 +1,26 @@
-options
-===
+# options
[`options`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-options)
-> 全局开关
-
-| 名称 | 默认值 | 描述 |
-| ------------------ | ----- | ---------------------------------------- |
-| unsafe | false | 是否支持对系统级别的类进行增强,打开该开关可能导致把JVM搞挂,请慎重选择! |
-| dump | false | 是否支持被增强了的类dump到外部文件中,如果打开开关,class文件会被dump到`/${application working dir}/arthas-class-dump/`目录下,具体位置详见控制台输出 |
-| batch-re-transform | true | 是否支持批量对匹配到的类执行retransform操作 |
-| json-format | false | 是否支持json化的输出 |
-| disable-sub-class | false | 是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关 |
-| support-default-method | true | 是否支持匹配到default method,默认会查找interface,匹配里面的default method。参考 [#1105](https://github.com/alibaba/arthas/issues/1105) |
-| save-result | false | 是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到`~/logs/arthas-cache/result.log`中 |
-| job-timeout | 1d | 异步后台任务的默认超时时间,超过这个时间,任务自动停止;比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒 |
-| print-parent-fields | true | 是否打印在parent class里的filed |
-| verbose | false | 是否打印更多详细信息 |
-| strict | true | 是否启用strict模式 |
-
-### 查看所有的options
+::: tip
+全局开关
+:::
+
+| 名称 | 默认值 | 描述 |
+| ---------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| unsafe | false | 是否支持对系统级别的类进行增强,打开该开关可能导致把 JVM 搞挂,请慎重选择! |
+| dump | false | 是否支持被增强了的类 dump 到外部文件中,如果打开开关,class 文件会被 dump 到`/${application working dir}/arthas-class-dump/`目录下,具体位置详见控制台输出 |
+| batch-re-transform | true | 是否支持批量对匹配到的类执行 retransform 操作 |
+| json-format | false | 是否支持 json 化的输出 |
+| disable-sub-class | false | 是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关 |
+| support-default-method | true | 是否支持匹配到 default method, 默认会查找 interface,匹配里面的 default method。参考 [#1105](https://github.com/alibaba/arthas/issues/1105) |
+| save-result | false | 是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到`~/logs/arthas-cache/result.log`中 |
+| job-timeout | 1d | 异步后台任务的默认超时时间,超过这个时间,任务自动停止; 比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒 |
+| print-parent-fields | true | 是否打印在 parent class 里的 filed |
+| verbose | false | 是否打 印更多详细信息 |
+| strict | true | 是否启用 strict 模式 |
+
+### 查看所有的 options
```bash
$ options
@@ -63,9 +64,7 @@ $ options
false`
```
-
-### 获取option的值
-
+### 获取 option 的值
```
$ options json-format
@@ -76,22 +75,24 @@ $ options json-format
ect output ted.
```
-> 默认情况下`json-format`为false,如果希望`watch`/`tt`等命令结果以json格式输出,则可以设置`json-format`为true。
+::: tip
+默认情况下`json-format`为 false,如果希望`watch`/`tt`等命令结果以 json 格式输出,则可以设置`json-format`为 true。
+:::
-### 设置指定的option
+### 设置指定的 option
例如,想打开执行结果存日志功能,输入如下命令即可:
```
-$ options save-result true
- NAME BEFORE-VALUE AFTER-VALUE
-----------------------------------------
+$ options save-result true
+ NAME BEFORE-VALUE AFTER-VALUE
+----------------------------------------
save-result false true
```
-### 打开unsafe开关,支持jdk package下的类
+### 打开 unsafe 开关,支持 jdk package 下的类
-默认情况下,`watch`/`trace`/`tt`/`trace`/`monitor`等命令不支持`java.*` package下的类。可以设置`unsafe`为true,则可以增强。
+默认情况下,`watch`/`trace`/`tt`/`trace`/`monitor`等命令不支持`java.*` package 下的类。可以设置`unsafe`为 true,则可以增强。
```bash
$ options unsafe true
@@ -106,15 +107,17 @@ Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 61 ms, listenerId: 1
```
-### 关闭strict模式,允许在ognl表达式里设置对象属性
+### 关闭 strict 模式,允许在 ognl 表达式里设置对象属性
-> since 3.6.0
+::: tip
+since 3.6.0
+:::
-对于新用户,在编写ognl表达式时,可能会出现误用。
+对于新用户,在编写 ognl 表达式时,可能会出现误用。
-比如对于`Student`,判断年龄等于18时,可能条件表达式会误写为`target.age=18`,这个表达式实际上是把当前对象的`age`设置为18了。正确的写法是`target.age==18`。
+比如对于`Student`,判断年龄等于 18 时,可能条件表达式会误写为`target.age=18`,这个表达式实际上是把当前对象的`age`设置为 18 了。正确的写法是`target.age==18`。
-为了防止出现类似上面的误用,Arthas默认启用`strict`模式,在`ognl`表达式里,禁止更新对象的Property或者调用`setter`函数。
+为了防止出现类似上面的误用,Arthas 默认启用`strict`模式,在`ognl`表达式里,禁止更新对象的 Property 或者调用`setter`函数。
以`MathGame`为例,会出现以下的错误提示。
@@ -127,4 +130,4 @@ watch failed, condition is: target.illegalArgumentCount=1, express is: target, B
用户如果确定要在`ognl`表达式里更新对象,可以执行`options strict false`,关闭`strict`模式。
-* 更多信息参考: https://github.com/alibaba/arthas/issues/2128
\ No newline at end of file
+- 更多信息参考: https://github.com/alibaba/arthas/issues/2128
diff --git a/site/src/site/sphinx/perfcounter.md b/site-vuepress/docs/doc/perfcounter.md
similarity index 93%
rename from site/src/site/sphinx/perfcounter.md
rename to site-vuepress/docs/doc/perfcounter.md
index 5176e58ee..6c4cc4835 100644
--- a/site/src/site/sphinx/perfcounter.md
+++ b/site-vuepress/docs/doc/perfcounter.md
@@ -1,9 +1,10 @@
-perfcounter
-===
+# perfcounter
[`perfcounter`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-perfcounter)
-> 查看当前JVM的 Perf Counter信息
+::: tip
+查看当前 JVM 的 Perf Counter 信息
+:::
### 使用参考
@@ -33,10 +34,10 @@ $ perfcounter -d
java.cls.unloadedClasses Monotonic Events 0
```
-### jdk9以上的应用
+### jdk9 以上的应用
如果没有打印出信息,应用在启动时,加下面的参数:
```
--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/profiler.md b/site-vuepress/docs/doc/profiler.md
similarity index 53%
rename from site/src/site/sphinx/profiler.md
rename to site-vuepress/docs/doc/profiler.md
index 388977c79..c0656a2d4 100644
--- a/site/src/site/sphinx/profiler.md
+++ b/site-vuepress/docs/doc/profiler.md
@@ -1,9 +1,10 @@
-profiler
-===
+# profiler
[`profiler`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-profiler)
-> 使用[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)生成火焰图
+::: tip
+使用[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)生成火焰图
+:::
`profiler` 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
@@ -11,44 +12,45 @@ profiler
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*action*|要执行的操作|
-|*actionArg*|属性名模式|
-|[i:]|采样间隔(单位:ns)(默认值:10'000'000,即10 ms)|
-|[f:]|将输出转储到指定路径|
-|[d:]|运行评测指定秒|
-|[e:]|要跟踪哪个事件(cpu, alloc, lock, cache-misses等),默认是cpu|
-
-### 启动profiler
+| 参数名称 | 参数说明 |
+| ----------: | :-------------------------------------------------------------- |
+| _action_ | 要执行的操作 |
+| _actionArg_ | 属性名模式 |
+| [i:] | 采样间隔(单位:ns)(默认值:10'000'000,即 10 ms) |
+| [f:] | 将输出转储到指定路径 |
+| [d:] | 运行评测指定秒 |
+| [e:] | 要跟踪哪个事件(cpu, alloc, lock, cache-misses 等),默认是 cpu |
+### 启动 profiler
```
$ profiler start
Started [cpu] profiling
```
-> 默认情况下,生成的是cpu的火焰图,即event为`cpu`。可以用`--event`参数来指定。
-
+::: tip
+默认情况下,生成的是 cpu 的火焰图,即 event 为`cpu`。可以用`--event`参数来指定。
+:::
-### 获取已采集的sample的数量
+### 获取已采集的 sample 的数量
```
$ profiler getSamples
23
```
-### 查看profiler状态
+### 查看 profiler 状态
```bash
$ profiler status
[cpu] profiling is running for 4 seconds
```
-可以查看当前profiler在采样哪种`event`和采样时间。
+可以查看当前 profiler 在采样哪种`event`和采样时间。
+
+### 停止 profiler
-### 停止profiler
-#### 生成html格式结果
+#### 生成 html 格式结果
默认情况下,结果文件是`html`格式,也可以用`--format`参数指定:
@@ -60,22 +62,23 @@ OK
或者在`--file`参数里用文件名指名格式。比如`--file /tmp/result.html` 。
+### 通过浏览器查看 arthas-output 下面的 profiler 结果
-### 通过浏览器查看arthas-output下面的profiler结果
+默认情况下,arthas 使用 3658 端口,则可以打开: [http://localhost:3658/arthas-output/](http://localhost:3658/arthas-output/) 查看到`arthas-output`目录下面的 profiler 结果:
-默认情况下,arthas使用3658端口,则可以打开: [http://localhost:3658/arthas-output/](http://localhost:3658/arthas-output/) 查看到`arthas-output`目录下面的profiler结果:
-
-
+
点击可以查看具体的结果:
-
+
-> 如果是chrome浏览器,可能需要多次刷新。
+::: tip
+如果是 chrome 浏览器,可能需要多次刷新。
+:::
-### profiler支持的events
+### profiler 支持的 events
-在不同的平台,不同的OS下面,支持的events各有不同。比如在macos下面:
+在不同的平台,不同的 OS 下面,支持的 events 各有不同。比如在 macos 下面:
```bash
$ profiler list
@@ -87,7 +90,7 @@ Basic events:
itimer
```
-在linux下面
+在 linux 下面
```bash
$ profiler list
@@ -114,7 +117,7 @@ Perf events:
trace:tracepoint
```
-如果遇到OS本身的权限/配置问题,然后缺少部分event,可以参考`async-profiler`本身文档:[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)
+如果遇到 OS 本身的权限/配置问题,然后 缺少部分 event,可以参考`async-profiler`本身文档:[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)
可以用`--event`参数指定要采样的事件,比如对`alloc`事件进入采样:
@@ -122,7 +125,6 @@ Perf events:
$ profiler start --event alloc
```
-
### 恢复采样
```bash
@@ -132,8 +134,7 @@ Started [cpu] profiling
`start`和`resume`的区别是:`start`是新开始采样,`resume`会保留上次`stop`时的数据。
-通过执行`profiler getSamples`可以查看samples的数量来验证。
-
+通过执行`profiler getSamples`可以查看 samples 的数量来验证。
### 使用`execute`来执行复杂的命令
@@ -151,14 +152,13 @@ profiler execute 'stop,file=/tmp/result.html'
具体的格式参考: [arguments.cpp](https://github.com/jvm-profiling-tools/async-profiler/blob/v2.5/src/arguments.cpp#L50)
-### 查看所有支持的action
+### 查看所有支持的 action
```bash
$ profiler actions
Supported Actions: [resume, dumpCollapsed, getSamples, start, list, execute, version, stop, load, dumpFlat, actions, dumpTraces, status]
```
-
### 查看版本
```bash
@@ -185,18 +185,17 @@ profiler start --include 'java/*' --include 'demo/*' --exclude '*Unsafe.park*'
> include/exclude 都支持设置多个值 ,但是需要配置在命令行的最后。
-
### 指定执行时间
-比如,希望profiler执行 300 秒自动结束,可以用 `-d`/`--duration` 参数指定:
+比如,希望 profiler 执行 300 秒自动结束,可以用 `-d`/`--duration` 参数指定:
```bash
profiler start --duration 300
```
-### 生成 jfr格式结果
+### 生成 jfr 格式结果
-> 注意,jfr只支持在 `start`时配置。如果是在`stop`时指定,则不会生效。
+> 注意,jfr 只支持在 `start`时配置。如果是在`stop`时指定,则不会生效。
```
profiler start --file /tmp/test.jfr
@@ -204,16 +203,14 @@ profiler start --file /tmp/test.jfr
`file`参数支持一些变量:
-* 时间戳: `--file /tmp/test-%t.jfr`
-* 进程ID: `--file /tmp/test-%p.jfr`
-
-
-生成的结果可以用支持jfr格式的工具来查看。比如:
+- 时间戳: `--file /tmp/test-%t.jfr`
+- 进程 ID: `--file /tmp/test-%p.jfr`
-* JDK Mission Control : https://github.com/openjdk/jmc
-* JProfiler : https://github.com/alibaba/arthas/issues/1416
+生成的结果可以用支持 jfr 格式的工具来查看。比如:
+- JDK Mission Control : https://github.com/openjdk/jmc
+- JProfiler : https://github.com/alibaba/arthas/issues/1416
### 生成的火焰图里的 unknown
-* https://github.com/jvm-profiling-tools/async-profiler/discussions/409
+- https://github.com/jvm-profiling-tools/async-profiler/discussions/409
diff --git a/site/src/site/sphinx/pwd.md b/site-vuepress/docs/doc/pwd.md
similarity index 60%
rename from site/src/site/sphinx/pwd.md
rename to site-vuepress/docs/doc/pwd.md
index 5d752fcfa..d2f0f9b58 100644
--- a/site/src/site/sphinx/pwd.md
+++ b/site-vuepress/docs/doc/pwd.md
@@ -1,11 +1,11 @@
-pwd
-===
+# pwd
[`pwd`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-pwd)
-> 返回当前的工作目录,和linux命令类似
-
+::: tip
+返回当前的工作目录,和 linux 命令类似
+:::
```bash
$ pwd
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/quick-start.md b/site-vuepress/docs/doc/quick-start.md
similarity index 86%
rename from site/src/site/sphinx/quick-start.md
rename to site-vuepress/docs/doc/quick-start.md
index 41f1cef66..b40bbb323 100644
--- a/site/src/site/sphinx/quick-start.md
+++ b/site-vuepress/docs/doc/quick-start.md
@@ -1,7 +1,6 @@
-快速入门
-===
+# 快速入门
-## 1. 启动math-game
+## 1. 启动 math-game
```bash
curl -O https://arthas.aliyun.com/math-game.jar
@@ -12,23 +11,21 @@ java -jar math-game.jar
`math-game`源代码:[查看](https://github.com/alibaba/arthas/blob/master/math-game/src/main/java/demo/MathGame.java)
+## 2. 启动 arthas
-## 2. 启动arthas
-
-在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):
+在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
```bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
```
-* 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot.jar` 或 `sudo -u admin -EH java -jar arthas-boot.jar`。
-* 如果attach不上目标进程,可以查看`~/logs/arthas/` 目录下的日志。
-* 如果下载速度比较慢,可以使用aliyun的镜像:`java -jar arthas-boot.jar --repo-mirror aliyun --use-http`
-* `java -jar arthas-boot.jar -h` 打印更多参数信息。
-
+- 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot.jar` 或 `sudo -u admin -EH java -jar arthas-boot.jar`。
+- 如果 attach 不上目标进程,可以查看`~/logs/arthas/` 目录下的日志。
+- 如果下载速度比较慢,可以使用 aliyun 的镜像:`java -jar arthas-boot.jar --repo-mirror aliyun --use-http`
+- `java -jar arthas-boot.jar -h` 打印更多参数信息。
-选择应用java进程:
+选择应用 java 进程:
```bash
$ $ java -jar arthas-boot.jar
@@ -36,7 +33,7 @@ $ $ java -jar arthas-boot.jar
[2]: 71560 math-game.jar
```
-`math-game`进程是第2个,则输入2,再输入`回车/enter`。Arthas会attach到目标进程上,并输出日志:
+`math-game`进程是第 2 个,则输入 2,再输入`回车/enter`。Arthas 会 attach 到目标进程上,并输出日志:
```bash
[INFO] Try to attach process 71560
@@ -57,7 +54,7 @@ time: 2018-11-28 19:16:24
$
```
-## 3. 查看dashboard
+## 3. 查看 dashboard
输入[dashboard](dashboard.md),按`回车/enter`,会展示当前进程的信息,按`ctrl+c`可以中断执行。
@@ -95,16 +92,16 @@ java.home /Library/Java/JavaVir
e/jre
```
-## 4. 通过thread命令来获取到`math-game`进程的Main Class
+## 4. 通过 thread 命令来获取到`math-game`进程的 Main Class
-`thread 1`会打印线程ID 1的栈,通常是main函数的线程。
+`thread 1`会打印线程 ID 1 的栈,通常是 main 函数的线程。
```bash
$ thread 1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)
```
-## 5. 通过jad来反编译Main Class
+## 5. 通过 jad 来反编译 Main Class
```java
$ jad demo.MathGame
@@ -226,8 +223,8 @@ ts=2018-11-28 19:22:35; [cost=29.969732ms] result=@ArrayList[
更多的功能可以查看[进阶使用](advanced-use.md)。
-## 7. 退出arthas
+## 7. 退出 arthas
-如果只是退出当前的连接,可以用`quit`或者`exit`命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
+如果只是退出当前的连接,可以用`quit`或者`exit`命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。
-如果想完全退出arthas,可以执行`stop`命令。
+如果想完全退出 arthas,可以执行`stop`命令。
diff --git a/site-vuepress/docs/doc/quit.md b/site-vuepress/docs/doc/quit.md
new file mode 100644
index 000000000..bc1cf6a16
--- /dev/null
+++ b/site-vuepress/docs/doc/quit.md
@@ -0,0 +1,7 @@
+# quit
+
+退出当前 Arthas 客户端,其他 Arthas 客户端不受影响。等同于**exit**、**logout**、**q**三个指令。
+
+::: tip
+只是退出当前 Arthas 客户端,Arthas 的服务器端并没有关闭,所做的修改也不会被重置。
+:::
diff --git a/site-vuepress/docs/doc/redefine.md b/site-vuepress/docs/doc/redefine.md
new file mode 100644
index 000000000..12cd42b69
--- /dev/null
+++ b/site-vuepress/docs/doc/redefine.md
@@ -0,0 +1,119 @@
+# redefine
+
+::: tip
+推荐使用 [retransform](retransform.md) 命令
+:::
+
+[`mc-redefine`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-redefine)
+
+::: tip
+加载外部的`.class`文件,redefine jvm 已加载的类。
+:::
+
+参考:[Instrumentation#redefineClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses-java.lang.instrument.ClassDefinition...-)
+
+### 常见问题
+
+::: tip
+推荐使用 [retransform](retransform.md) 命令
+:::
+
+- redefine 的 class 不能修改、添加、删除类的 field 和 method,包括方法参数、方法名称及返回值
+
+- 如果 mc 失败,可以在本地开发环境编译好 class 文件,上传到目标系统,使用 redefine 热加载 class
+
+- 目前 redefine 和 watch/trace/jad/tt 等命令冲突,以后重新实现 redefine 功能会解决此问题
+
+::: warning
+注意, redefine 后的原来的类不能恢复,redefine 有可能失败(比如增加了新的 field),参考 jdk 本身的文档。
+:::
+
+::: tip
+`reset`命令对`redefine`的类无效。如果想重置,需要`redefine`原始的字节码。
+:::
+
+::: tip
+`redefine`命令和`jad`/`watch`/`trace`/`monitor`/`tt`等命令会冲突。执行完`redefine`之后,如果再执行上面提到的命令,则会把`redefine`的字节码重置。
+原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
+:::
+
+### 参数说明
+
+| 参数名称 | 参数说明 |
+| --------------------: | :----------------------------------------- |
+| [c:] | ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+
+### 使用参考
+
+```bash
+ redefine /tmp/Test.class
+ redefine -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
+ redefine --classLoaderClass sun.misc.Launcher$AppClassLoader /tmp/Test.class /tmp/Test\$Inner.class
+```
+
+### 结合 jad/mc 命令使用
+
+```bash
+jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
+
+mc /tmp/UserController.java -d /tmp
+
+redefine /tmp/com/example/demo/arthas/user/UserController.class
+```
+
+- jad 命令反编译,然后可以用其它编译器,比如 vim 来修改源码
+- mc 命令来内存编译修改过的代码
+- 用 redefine 命令加载新的字节码
+
+### 上传 .class 文件到服务器的技巧
+
+使用`mc`命令来编译`jad`的反编译的代码有可能失败。可以在本地修改代码,编译好后再上传到服务器上。有的服务器不允许直接上传文件,可以使用`base64`命令来绕过。
+
+1. 在本地先转换`.class`文件为 base64,再保存为 result.txt
+
+ ```bash
+ base64 < Test.class > result.txt
+ ```
+
+2. 到服务器上,新建并编辑`result.txt`,复制本地的内容,粘贴再保存
+
+3. 把服务器上的 `result.txt`还原为`.class`
+
+ ```
+ base64 -d < result.txt > Test.class
+ ```
+
+4. 用 md5 命令计算哈希值,校验是否一致
+
+### redefine 的限制
+
+- 不允许新增加 field/method
+- 正在跑的函数,没有退出不能生效,比如下面新增加的`System.out.println`,只有`run()`函数里的会生效
+
+```java
+public class MathGame {
+ public static void main(String[] args) throws InterruptedException {
+ MathGame game = new MathGame();
+ while (true) {
+ game.run();
+ TimeUnit.SECONDS.sleep(1);
+ // 这个不生效,因为代码一直跑在 while里
+ System.out.println("in loop");
+ }
+ }
+
+ public void run() throws InterruptedException {
+ // 这个生效,因为run()函数每次都可以完整结束
+ System.out.println("call run()");
+ try {
+ int number = random.nextInt();
+ List primeFactors = primeFactors(number);
+ print(number, primeFactors);
+
+ } catch (Exception e) {
+ System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
+ }
+ }
+}
+```
diff --git a/site-vuepress/docs/doc/release-notes.md b/site-vuepress/docs/doc/release-notes.md
new file mode 100644
index 000000000..1025545e1
--- /dev/null
+++ b/site-vuepress/docs/doc/release-notes.md
@@ -0,0 +1,130 @@
+# Release Notes
+
+## v3.1.1
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.1.1](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.1.1)
+
+## v3.1.0
+
+- [https://github.com/alibaba/arthas/releases/tag/3.1.0](https://github.com/alibaba/arthas/releases/tag/3.1.0)
+
+## v3.0.5
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.5](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.5)
+
+## v3.0.4
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.4](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.4)
+
+## v2017-11-03
+
+- 增加 getstatic 方法获取静态变量
+- 修复 arthas classloader 加载到应用日志的问题
+- 增加 ognl custom classloader 便于调用静态方法
+- 优化 termd 输出大字符串的性能问题
+- classloader 命令默认按类加载器类型分类编译
+- 修复 wc 命令统计错误的问题
+- 禁止增强特定 JDK 类,如 Classloader, Method, Integer 等
+- 支持 OGNL 表达式出错直接退出命令
+- 修复管道类命令单独出错的问题
+- 优化命令重定向功能,使用异步日志输出结果
+- trace 命令增加过滤 jdk 方法调用的功能
+
+## v2017-09-22
+
+- 优化 agent server 启动时的异常信息
+- 修复异步命令的一些 bug
+
+## v2017-09-11
+
+- 支持[异步后后命令](async.md)
+- jad 命令优化,支持 JDK8 及内部类
+- 修复中文乱码问题
+
+## v2017-05-11
+
+- tt 命令默认只展开 1 层,防止对象过大造成卡顿
+- 修复中文无法展示的问题
+
+## v2017-05-12
+
+- Arthas 3.0 release
+
+## v2016-12-09
+
+- as.sh 支持-h 输出帮助
+- [#121] 修复残留的临时文件导致 arthas 启动失败的问题
+- [#123] 修复反复 attach/shutdown 造成 classloader 泄露的问题
+- 优化命令中的帮助提示信息
+- [#126] 修复 tm 命令文档链接错乱的问题
+- [#122] classloader 命令中过滤掉`sun.reflect.DelegatingClassLoader`
+- [#129] 修复 classloader 层次展示的问题
+- [#125] arthas 输出的 log 不主动换行,对于日志解析更加友好
+- [#96] sc 等命令支持 com/taobao/xxx/TestClass 这样的格式,以后复制粘贴不需要在把'/'替换成'.'啦
+- [#124] 修复某些情况下 trace 的时间为负值的问题
+- [#128] tt 命令的结果默认自动展开,不需要再增加`-x 2`来看到参数,异常的详细信息了。
+- [#130] 修复当端口冲突时,没有很好地打印错误,而是进入了一个出错的交互界面的问题
+- [#98] 修复 Arthas 启动时,如果下载更新失败,导致启动失败的问题
+- [#139] 修复某些特殊情况下 agent attach 失败的问题
+- [#156] jd-core-java 延迟初始化,避免 arthas 启动时出错
+- 修复线程名重复的问题
+- [#150] trace 命令支持按运行总耗时过滤
+- 修复 sc 查找 SystemClassloader 时可能出现的 NPE
+- [#180] 修复第一次 Attach 成功之后,删除之前 Arthas 的安装包,重新编译打包,再次 attach 失败的问题
+
+## v2016-06-07
+
+- 修复以资源方式加载 spy 类时出现 NPE 的问题
+- 支持一键找出线程中获得锁并阻塞住其他线程的线程
+- 优化 Thread 输出,按线程名排序
+- 获取 topN 忙的线程时,支持指定刷新间隔
+
+## v2016-04-08
+
+- New feature:
+
+ - dashboard 支持指定刷新频率,支持指定执行次数
+ - 命令执行结果保存到日志文件,方便后续查看
+ - 启动速度优化,第一次 attach 的速度提升一倍
+ - 支持批处理功能,支持执行脚本文件
+ - 优化启动逻辑,arthas 脚本启动时交互式选择进程
+ - 类默认启用继承关系查询,查找类时默认会查找子类,如果需要关闭,则通过全局开关 Options disable-sub-class 关闭
+ - 支持在彩色模式和文本模式中切换
+
+- UI Improvement:
+
+ - 合并 exit 和 quit 命令
+ - 命令帮助信息增加 wiki 链接
+ - 优化 watch 的逻辑,更加符合大家的直觉
+ - thread 命令增加 example 说明
+ - 自动补全的时候,忽略大小写
+
+- Bugfix:
+ - 修复 trace 命令遇到循环造成输出太长
+ - 修复 trace 命令在方法调用中抛出了异常,会让 trace 的节点错位
+ - 修正增强 BootstrapClassLoader 加载的类,找不到 Spy 的问题
+ - 修复某些配色方案下,结果显示不友好的问题
+
+## v2016-03-07
+
+- 支持一键查看当前最忙的前 N 个线程及其堆栈
+- 修复 openjdk 下启动 arthas 失败的问题(需要重新安装 as.sh)
+- 一些体验优化
+
+## v2016-01-18
+
+- 优化 jad,实时 dump 内存 byte array,并使用 jd-core-java 反编译,支持`行号显示`
+- 修复 tt 命令在监控与线程上下文相关的方法调用时,显示/重做等场景下的 bug
+
+## v2016-01-08
+
+- 修复一些 bug
+ - jad NPE
+ - watch/monitor NPE
+ - 不需要转义
+ - 数据统计问题修复
+ - sc 查看静态变量内部层次结构
+
+## v2015-12-29
+
+- Arthas 2.0 测试版本发布!
diff --git a/site/src/site/sphinx/reset.md b/site-vuepress/docs/doc/reset.md
similarity index 90%
rename from site/src/site/sphinx/reset.md
rename to site-vuepress/docs/doc/reset.md
index f8f3538cb..eea5dd621 100644
--- a/site/src/site/sphinx/reset.md
+++ b/site-vuepress/docs/doc/reset.md
@@ -1,9 +1,10 @@
-reset命令
-===
+# reset 命令
[`reset`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-reset)
-> 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端`stop`时会重置所有增强过的类
+::: tip
+重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端`stop`时会重置所有增强过的类
+:::
### 使用参考
@@ -53,4 +54,4 @@ Affect(class-cnt:1 , method-cnt:1) cost in 15 ms.
$ reset
Affect(class-cnt:1 , method-cnt:0) cost in 9 ms.
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/retransform.md b/site-vuepress/docs/doc/retransform.md
similarity index 50%
rename from site/src/site/sphinx/retransform.md
rename to site-vuepress/docs/doc/retransform.md
index e510ef46e..d858127f0 100644
--- a/site/src/site/sphinx/retransform.md
+++ b/site-vuepress/docs/doc/retransform.md
@@ -1,13 +1,13 @@
-retransform
-===
+# retransform
[`mc-retransform`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform)
-> 加载外部的`.class`文件,retransform jvm已加载的类。
+::: tip
+加载外部的`.class`文件,retransform jvm 已加载的类。
+:::
参考:[Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-)
-
### 使用参考
```bash
@@ -28,9 +28,11 @@ retransform success, size: 1, classes:
demo.MathGame
```
-加载指定的 .class 文件,然后解析出class name,再retransform jvm中已加载的对应的类。每加载一个 `.class` 文件,则会记录一个 retransform entry.
+加载指定的 .class 文件,然后解析出 class name,再 retransform jvm 中已加载的对应的类。每加载一个 `.class` 文件,则会记录一个 retransform entry.
-> 如果多次执行 retransform 加载同一个 class 文件,则会有多条 retransform entry.
+::: tip
+如果多次执行 retransform 加载同一个 class 文件,则会有多条 retransform entry.
+:::
### 查看 retransform entry
@@ -40,7 +42,7 @@ Id ClassName TransformCount LoaderHash LoaderClassName
1 demo.MathGame 1 null null
```
-* TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry对应的 .class文件的次数,但并不表明transform一定成功。
+- TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry 对应的 .class 文件的次数,但并不表明 transform 一定成功。
### 删除指定 retransform entry
@@ -64,17 +66,18 @@ retransform success, size: 1, classes:
demo.MathGame
```
-> 注意:对于同一个类,当存在多个 retransform entry时,如果显式触发 retransform ,则最后添加的entry生效(id最大的)。
+> 注意:对于同一个类,当存在多个 retransform entry 时,如果显式触发 retransform ,则最后添加的 entry 生效(id 最大的)。
### 消除 retransform 的影响
如果对某个类执行 retransform 之后,想消除影响,则需要:
-* 删除这个类对应的 retransform entry
-* 重新触发 retransform
-
-> 如果不清除掉所有的 retransform entry,并重新触发 retransform ,则arthas stop时,retransform过的类仍然生效。
+- 删除这个类对应的 retransform entry
+- 重新触发 retransform
+::: tip
+如果不清除掉所有的 retransform entry,并重新触发 retransform ,则 arthas stop 时,retransform 过的类仍然生效。
+:::
### 结合 jad/mc 命令使用
@@ -86,57 +89,58 @@ mc /tmp/UserController.java -d /tmp
retransform /tmp/com/example/demo/arthas/user/UserController.class
```
-* jad命令反编译,然后可以用其它编译器,比如vim来修改源码
-* mc命令来内存编译修改过的代码
-* 用retransform命令加载新的字节码
+- jad 命令反编译,然后可以用其它编译器,比如 vim 来修改源码
+- mc 命令来内存编译修改过的代码
+- 用 retransform 命令加载新的字节码
### 上传 .class 文件到服务器的技巧
使用`mc`命令来编译`jad`的反编译的代码有可能失败。可以在本地修改代码,编译好后再上传到服务器上。有的服务器不允许直接上传文件,可以使用`base64`命令来绕过。
-1. 在本地先转换`.class`文件为base64,再保存为result.txt
+1. 在本地先转换`.class`文件为 base64,再保存为 result.txt
- ```bash
- base64 < Test.class > result.txt
- ```
+ ```bash
+ base64 < Test.class > result.txt
+ ```
2. 到服务器上,新建并编辑`result.txt`,复制本地的内容,粘贴再保存
3. 把服务器上的 `result.txt`还原为`.class`
- ```
- base64 -d < result.txt > Test.class
- ```
+ ```
+ base64 -d < result.txt > Test.class
+ ```
-4. 用md5命令计算哈希值,校验是否一致
+4. 用 md5 命令计算哈希值,校验是否一致
-### retransform的限制
+### retransform 的限制
-* 不允许新增加field/method
-* 正在跑的函数,没有退出不能生效,比如下面新增加的`System.out.println`,只有`run()`函数里的会生效
+- 不允许新增加 field/method
+- 正在跑的函数,没有退出不能生效,比如下面新增加的`System.out.println`,只有`run()`函数里的会生效
- ```java
- public class MathGame {
- public static void main(String[] args) throws InterruptedException {
- MathGame game = new MathGame();
- while (true) {
- game.run();
- TimeUnit.SECONDS.sleep(1);
- // 这个不生效,因为代码一直跑在 while里
- System.out.println("in loop");
- }
+```java
+public class MathGame {
+ public static void main(String[] args) throws InterruptedException {
+ MathGame game = new MathGame();
+ while (true) {
+ game.run();
+ TimeUnit.SECONDS.sleep(1);
+ // 这个不生效,因为代码一直跑在 while里
+ System.out.println("in loop");
}
-
- public void run() throws InterruptedException {
- // 这个生效,因为run()函数每次都可以完整结束
- System.out.println("call run()");
- try {
- int number = random.nextInt();
- List primeFactors = primeFactors(number);
- print(number, primeFactors);
-
- } catch (Exception e) {
- System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
- }
+ }
+
+ public void run() throws InterruptedException {
+ // 这个生效,因为run()函数每次都可以完整结束
+ System.out.println("call run()");
+ try {
+ int number = random.nextInt();
+ List primeFactors = primeFactors(number);
+ print(number, primeFactors);
+
+ } catch (Exception e) {
+ System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
}
-```
\ No newline at end of file
+ }
+}
+```
diff --git a/site/src/site/sphinx/save-log.md b/site-vuepress/docs/doc/save-log.md
similarity index 55%
rename from site/src/site/sphinx/save-log.md
rename to site-vuepress/docs/doc/save-log.md
index 7d844b4ff..d4d9b93af 100644
--- a/site/src/site/sphinx/save-log.md
+++ b/site-vuepress/docs/doc/save-log.md
@@ -1,11 +1,12 @@
-执行结果存日志
-===
+# 执行结果存日志
[`执行结果存日志`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=case-save-log)
-> 将命令的结果完整保存在日志文件中,便于后续进行分析
+::: tip
+将命令的结果完整保存在日志文件中,便于后续进行分析
+:::
-* 默认情况下,该功能是关闭的,如果需要开启,请执行以下命令:
+- 默认情况下,该功能是关闭的,如果需要开启,请执行以下命令:
```bash
$ options save-result true
@@ -17,11 +18,11 @@ Affect(row-cnt:1) cost in 3 ms.
看到上面的输出,即表示成功开启该功能;
-* 日志文件路径
+- 日志文件路径
结果会异步保存在:`{user.home}/logs/arthas-cache/result.log`,请定期进行清理,以免占据磁盘空间
-### 使用新版本Arthas的异步后台任务将结果存日志文件
+### 使用新版本 Arthas 的异步后台任务将结果存日志文件
```bash
$ trace Test t >> &
@@ -31,5 +32,5 @@ cache location : /Users/admin/logs/arthas-cache/28198/2
此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/${PID}/${JobId})中;
-* 此时任务的执行不受session断开的影响;任务默认超时时间是1天,可以通过全局 `options` 命令修改默认超时时间;
-* 此命令的结果将异步输出到文件中;此时不管 `save-result` 是否为true,都不会再往~/logs/arthas-cache/result.log 中异步写结果
\ No newline at end of file
+- 此时任务的执行不受 session 断开的影响;任务默认超时时间是 1 天,可以通过全局 `options` 命令修改默认超时时间;
+- 此命令的结果将异步输出到 文件中;此时不管 `save-result` 是否为 true,都不会再往~/logs/arthas-cache/result.log 中异步写结果
diff --git a/site-vuepress/docs/doc/sc.md b/site-vuepress/docs/doc/sc.md
new file mode 100644
index 000000000..9c0f258b2
--- /dev/null
+++ b/site-vuepress/docs/doc/sc.md
@@ -0,0 +1,109 @@
+# sc
+
+[`sc`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-sc)
+
+::: tip
+查看 JVM 已加载的类信息
+:::
+
+“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 `[d]`、`[E]`、`[f]` 和 `[x:]`。
+
+## 参数说明
+
+### 参数说明
+
+| 参数名称 | 参数说明 |
+| --------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| [d] | 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。
如果一个类被多个 ClassLoader 所加载,则会出现多次 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| [f] | 输出当前类的成员变量信息(需要配合参数-d 一起使用) |
+| [x:] | 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 `toString` 输出 |
+| `[c:]` | 指定 class 的 ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| `[n:]` | 具有详细信息的匹配类的最大数量(默认为 100) |
+
+::: tip
+class-pattern 支持全限定名,如 com.taobao.test.AAA,也支持 com/taobao/test/AAA 这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把`/`替换为`.`啦。
+:::
+
+::: tip
+sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开`options disable-sub-class true`开关
+:::
+
+### 使用参考
+
+- 模糊搜索
+
+ ```bash
+ $ sc demo.*
+ demo.MathGame
+ Affect(row-cnt:1) cost in 55 ms.
+ ```
+
+- 打印类的详细信息
+
+ ```bash
+ $ sc -d demo.MathGame
+ class-info demo.MathGame
+ code-source /private/tmp/math-game.jar
+ name demo.MathGame
+ isInterface false
+ isAnnotation false
+ isEnum false
+ isAnonymousClass false
+ isArray false
+ isLocalClass false
+ isMemberClass false
+ isPrimitive false
+ isSynthetic false
+ simple-name MathGame
+ modifier public
+ annotation
+ interfaces
+ super-class +-java.lang.Object
+ class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+ classLoaderHash 3d4eac69
+
+ Affect(row-cnt:1) cost in 875 ms.
+ ```
+
+- 打印出类的 Field 信息
+
+ ```bash
+ $ sc -d -f demo.MathGame
+ class-info demo.MathGame
+ code-source /private/tmp/math-game.jar
+ name demo.MathGame
+ isInterface false
+ isAnnotation false
+ isEnum false
+ isAnonymousClass false
+ isArray false
+ isLocalClass false
+ isMemberClass false
+ isPrimitive false
+ isSynthetic false
+ simple-name MathGame
+ modifier public
+ annotation
+ interfaces
+ super-class +-java.lang.Object
+ class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+ classLoaderHash 3d4eac69
+ fields modifierprivate,static
+ type java.util.Random
+ name random
+ value java.util.Random@522b4
+ 08a
+
+ modifierprivate
+ type int
+ name illegalArgumentCount
+
+
+ Affect(row-cnt:1) cost in 19 ms.
+ ```
diff --git a/site-vuepress/docs/doc/session.md b/site-vuepress/docs/doc/session.md
new file mode 100644
index 000000000..2cdc2df4a
--- /dev/null
+++ b/site-vuepress/docs/doc/session.md
@@ -0,0 +1,20 @@
+# session
+
+查看当前会话的信息,显示当前绑定的 pid 以及会话 id。
+
+::: tip
+如果配置了 tunnel server,会追加打印 代理 id、tunnel 服务器的 url 以及连接状态。
+
+如果使用了 staturl 做统计,会追加显示 statUrl 地址。
+:::
+
+### 使用参考
+
+```
+$ session
+ Name Value
+--------------------------------------------------
+ JAVA_PID 14584
+ SESSION_ID c2073d3b-443a-4a9b-9249-0c5d24a5756c
+
+```
diff --git a/site/src/site/sphinx/sm.md b/site-vuepress/docs/doc/sm.md
similarity index 70%
rename from site/src/site/sphinx/sm.md
rename to site-vuepress/docs/doc/sm.md
index 2da567ce6..06852a854 100644
--- a/site/src/site/sphinx/sm.md
+++ b/site-vuepress/docs/doc/sm.md
@@ -1,9 +1,10 @@
-sm
-===
+# sm
[`sm`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-sm)
-> 查看已加载类的方法信息
+::: tip
+查看已加载类的方法信息
+:::
“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。
@@ -11,15 +12,15 @@ sm
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|方法名表达式匹配|
-|[d]|展示每个方法的详细信息|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
-|`[c:]`|指定class的 ClassLoader 的 hashcode|
-|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name|
-|`[n:]`|具有详细信息的匹配类的最大数量(默认为100)|
+| 参数名称 | 参数说明 |
+| --------------------: | :------------------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| [d] | 展示每个方法的详细信息 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| `[c:]` | 指定 class 的 ClassLoader 的 hashcode |
+| `[classLoaderClass:]` | 指定执行表达式的 ClassLoader 的 class name |
+| `[n:]` | 具有详细信息的匹配类的最大数量(默认为 100) |
### 使用参考
@@ -83,4 +84,4 @@ $ sm -d java.lang.String toString
exceptions
Affect(row-cnt:1) cost in 3 ms.
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/spring-boot-starter.md b/site-vuepress/docs/doc/spring-boot-starter.md
similarity index 62%
rename from site/src/site/sphinx/spring-boot-starter.md
rename to site-vuepress/docs/doc/spring-boot-starter.md
index a3c623e8b..60be5434a 100644
--- a/site/src/site/sphinx/spring-boot-starter.md
+++ b/site-vuepress/docs/doc/spring-boot-starter.md
@@ -1,11 +1,12 @@
-Arthas Spring Boot Starter
-=====
+# Arthas Spring Boot Starter
-> 只支持 spring boot 2
+::: tip
+只支持 spring boot 2
+:::
最新版本:[查看](https://search.maven.org/search?q=arthas-spring-boot-starter)
-配置maven依赖:
+配置 maven 依赖:
```xml
@@ -15,14 +16,15 @@ Arthas Spring Boot Starter
```
-应用启动后,spring会启动arthas,并且attach自身进程。
-
-> 一键创建包含 Arthas Spring Boot Starter 的工程:点击
+应用启动后,spring 会启动 arthas,并且 attach 自身进程。
+::: tip
+一键创建包含 Arthas Spring Boot Starter 的工程:点击
+:::
### 配置属性
-比如,通过配置tunnel server实现远程管理:
+比如,通过配置 tunnel server 实现远程管理:
```
arthas.agent-id=hsehdfsfghhwertyfad
@@ -31,15 +33,19 @@ arthas.tunnel-server=ws://47.75.156.201:7777/ws
全部支持的配置项:[参考](https://github.com/alibaba/arthas/blob/master/arthas-spring-boot-starter/src/main/java/com/alibaba/arthas/spring/ArthasProperties.java)
-> 默认情况下,arthas-spring-boot-starter会禁掉`stop`命令。
+::: tip
+默认情况下,arthas-spring-boot-starter 会禁掉`stop`命令。
+:::
参考:[Arthas Properties](arthas-properties.md)
-### 查看Endpoint信息
+### 查看 Endpoint 信息
-> 需要配置spring boot暴露endpoint:[参考](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints)
+::: tip
+需要配置 spring boot 暴露 endpoint:[参考](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints)
+:::
-假定endpoint端口是 8080,则通过下面url可以查看:
+假定 endpoint 端口是 8080,则通过下面 url 可以查看:
http://localhost:8080/actuator/arthas
@@ -52,9 +58,9 @@ http://localhost:8080/actuator/arthas
}
```
-### 非spring boot应用使用方式
+### 非 spring boot 应用使用方式
-非Spring Boot应用,可以通过下面的方式来使用:
+非 Spring Boot 应用,可以通过下面的方式来使用:
```xml
@@ -73,7 +79,7 @@ http://localhost:8080/actuator/arthas
import com.taobao.arthas.agent.attach.ArthasAgent;
public class ArthasAttachExample {
-
+
public static void main(String[] args) {
ArthasAgent.attach();
}
@@ -90,4 +96,6 @@ public class ArthasAttachExample {
ArthasAgent.attach(configMap);
```
-> 注意配置必须是`驼峰`的,和spring boot的`-`风格不一样。spring boot应用才同时支持`驼峰` 和 `-`风格的配置。
\ No newline at end of file
+::: warning
+注意配置必须是`驼峰`的,和 spring boot 的`-`风格不一样。spring boot 应用才同时支持`驼峰` 和 `-`风格的配置。
+:::
diff --git a/site/src/site/sphinx/stack.md b/site-vuepress/docs/doc/stack.md
similarity index 74%
rename from site/src/site/sphinx/stack.md
rename to site-vuepress/docs/doc/stack.md
index 2fd30c8b2..82c8c6ba0 100644
--- a/site/src/site/sphinx/stack.md
+++ b/site-vuepress/docs/doc/stack.md
@@ -1,31 +1,31 @@
-stack
-===
+# stack
[`stack`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-stack)
-> 输出当前方法被调用的调用路径
+::: tip
+输出当前方法被调用的调用路径
+:::
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|方法名表达式匹配|
-|*condition-express*|条件表达式|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
-|`[n:]`|执行次数限制|
+| 参数名称 | 参数说明 |
+| ------------------: | :----------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| _condition-express_ | 条件表达式 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| `[n:]` | 执行次数限制 |
这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。
观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。
-
请参考[表达式核心变量](advice-class.md)中关于该节点的描述。
-* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
-* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+- 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
### 使用例子
@@ -61,7 +61,6 @@ ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun
Command execution times exceed limit: 2, so command will exit. You can set it with -n option.
```
-
#### 据执行时间来过滤
```bash
@@ -72,4 +71,3 @@ ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```
-
diff --git a/site/src/site/sphinx/start-arthas.md b/site-vuepress/docs/doc/start-arthas.md
similarity index 76%
rename from site/src/site/sphinx/start-arthas.md
rename to site-vuepress/docs/doc/start-arthas.md
index 9a8db3492..fc79ddfad 100644
--- a/site/src/site/sphinx/start-arthas.md
+++ b/site-vuepress/docs/doc/start-arthas.md
@@ -1,5 +1,4 @@
-启动 Arthas
-=====
+# 启动 Arthas
## 交互模式启动
@@ -30,23 +29,21 @@ $
./as.sh [@IP:PORT]
```
-
-
### 参数说明
-* PID:目标 Java 进程 ID(请确保执行当前执行命令的用户必须有足够的权限操作对应的 Java 进程)
-* IP:Arthas Server 侦听的地址,默认值是 `127.00.1`。Arthas允许多个用户同时访问,并且各自的命令不会相互干扰执行
-* PORT:目标服务器 Arthas Server 的端口号,默认的端口号是 3658
+- PID:目标 Java 进程 ID(请确保执行当前执行命令的用户必须有足够的权限操作对应的 Java 进程)
+- IP:Arthas Server 侦听的地址,默认值是 `127.00.1`。Arthas 允许多个用户同时访问,并且各自的命令不会相互干扰执行
+- PORT:目标服务器 Arthas Server 的端口号,默认的端口号是 3658
### 示例
-* 如果不指定 IP 和 PORT,默认是 127.0.0.1 和 3658
+- 如果不指定 IP 和 PORT,默认是 127.0.0.1 和 3658
+
+ > ./as.sh 12345
- > ./as.sh 12345
+ 上述命令等价于:
- 上述命令等价于:
-
- > ./as.sh 12356@127.0.0.1:3658
+ > ./as.sh 12356@127.0.0.1:3658
### 远程诊断
@@ -55,7 +52,7 @@ $
```bash
telnet 192.168.1.119 3658
```
-
+
### sudo 支持
成熟的线上管理环境一般都不会直接开放 JVM 部署用户权限给你,而是通过 sudo-list 来控制和监控用户的越权操作。由于 as.sh 脚本中会对当前用户的环境变量产生感知,所以需要加上 -H 参数
@@ -64,7 +61,6 @@ telnet 192.168.1.119 3658
sudo -u admin -H ./as.sh 12345
```
-
### Windows 环境支持
目前`as.bat`脚本只支持一个参数:pid
diff --git a/site-vuepress/docs/doc/stop.md b/site-vuepress/docs/doc/stop.md
new file mode 100644
index 000000000..c4f937a2e
--- /dev/null
+++ b/site-vuepress/docs/doc/stop.md
@@ -0,0 +1,7 @@
+# Stop
+
+关闭 Arthas 服务端,所有 Arthas 客户端全部退出。
+
+::: tip
+关闭 Arthas 服务器之前,会重置掉所有做过的增强类。但是用 redefine 重加载的类内容不会被重置。
+:::
diff --git a/site/src/site/sphinx/sysenv.md b/site-vuepress/docs/doc/sysenv.md
similarity index 94%
rename from site/src/site/sphinx/sysenv.md
rename to site-vuepress/docs/doc/sysenv.md
index 4830a15c7..16beac538 100644
--- a/site/src/site/sphinx/sysenv.md
+++ b/site-vuepress/docs/doc/sysenv.md
@@ -1,9 +1,10 @@
-sysenv
-=======================
+# sysenv
[`sysenv`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-sysenv)
-> 查看当前JVM的环境属性(`System Environment Variables`)
+::: tip
+查看当前 JVM 的环境属性(`System Environment Variables`)
+:::
### 使用参考
@@ -24,11 +25,10 @@ sysenv
OPTIONS:
-h, --help this help
env name
- ```
+```
#### 查看所有环境变量
-
```
$ sysenv
KEY VALUE
@@ -67,7 +67,9 @@ $ sysenv
#### 查看单个环境变量
-> 支持通过`TAB`键自动补全
+::: tip
+支持通过`TAB`键自动补全
+:::
```
$ sysenv USER
diff --git a/site/src/site/sphinx/sysprop.md b/site-vuepress/docs/doc/sysprop.md
similarity index 98%
rename from site/src/site/sphinx/sysprop.md
rename to site-vuepress/docs/doc/sysprop.md
index f9991dd46..b097625f4 100644
--- a/site/src/site/sphinx/sysprop.md
+++ b/site-vuepress/docs/doc/sysprop.md
@@ -1,9 +1,10 @@
-sysprop
-=======================
+# sysprop
[`sysprop`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-sysprop)
-> 查看当前JVM的系统属性(`System Property`)
+::: tip
+查看当前 JVM 的系统属性(`System Property`)
+:::
### 使用参考
@@ -30,7 +31,6 @@ sysprop
#### 查看所有属性
-
```
$ sysprop
KEY VALUE
@@ -106,7 +106,9 @@ $ sysprop
#### 查看单个属性
-> 支持通过`TAB`键自动补全
+::: tip
+支持通过`TAB`键自动补全
+:::
```
$ sysprop java.version
@@ -121,4 +123,4 @@ user.country=US
$ sysprop user.country CN
Successfully changed the system property.
user.country=CN
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/tee.md b/site-vuepress/docs/doc/tee.md
similarity index 68%
rename from site/src/site/sphinx/tee.md
rename to site-vuepress/docs/doc/tee.md
index c95b269b1..2c0c866f5 100644
--- a/site/src/site/sphinx/tee.md
+++ b/site-vuepress/docs/doc/tee.md
@@ -1,12 +1,12 @@
-tee
-===
+# tee
[`tee`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-tee)
-> 类似传统的`tee`命令, 用于读取标准输入的数据,并将其内容输出成文件。
-
-> tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
+::: tip
+类似传统的`tee`命令, 用于读取标准输入的数据,并将其内容输出成文件。
+tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
+:::
```
USAGE:
@@ -26,4 +26,4 @@ tee
-a, --append Append to file
-h, --help this help
File path
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/thread.md b/site-vuepress/docs/doc/thread.md
similarity index 78%
rename from site/src/site/sphinx/thread.md
rename to site-vuepress/docs/doc/thread.md
index 20bfc68e8..548789aa5 100644
--- a/site/src/site/sphinx/thread.md
+++ b/site-vuepress/docs/doc/thread.md
@@ -1,39 +1,43 @@
-thread
-===
+# thread
[`thread`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-thread)
-> 查看当前线程信息,查看线程的堆栈
-
+::: tip
+查看当前线程信息,查看线程的堆栈
+:::
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*id*|线程id|
-|[n:]|指定最忙的前N个线程并打印堆栈|
-|[b]|找出当前阻塞其他线程的线程|
-|[i ``]|指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200|
-|[--all]|显示所有匹配的线程|
+| 参数名称 | 参数说明 |
+| ------------: | :------------------------------------------------------ |
+| _id_ | 线程 id |
+| [n:] | 指定最忙的前 N 个线程并打印堆栈 |
+| [b] | 找出当前阻塞其他线程的线程 |
+| [i ``] | 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200 |
+| [--all] | 显示所有匹配的线程 |
-### cpu使用率是如何统计出来的?
+### cpu 使用率是如何统计出来的?
-这里的cpu使用率与linux 命令`top -H -p ` 的线程`%CPU`类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。
+这里的 cpu 使用率与 linux 命令`top -H -p ` 的线程`%CPU`类似,一段采样间隔时间内,当前 JVM 里各个线程的增量 cpu 时间与采样间隔时间的比例。
#### 工作原理说明:
-* 首先第一次采样,获取所有线程的CPU时间(调用的是`java.lang.management.ThreadMXBean#getThreadCpuTime()`及`sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()`接口)
-* 然后睡眠等待一个间隔时间(默认为200ms,可以通过`-i`指定间隔时间)
-* 再次第二次采样,获取所有线程的CPU时间,对比两次采样数据,计算出每个线程的增量CPU时间
-* 线程CPU使用率 = 线程增量CPU时间 / 采样间隔时间 * 100%
+- 首先第一次采样,获取所有线程的 CPU 时间(调用的是`java.lang.management.ThreadMXBean#getThreadCpuTime()`及`sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()`接口)
+- 然后睡眠等待一个间隔时间(默认为 200ms,可以通过`-i`指定间隔时间)
+- 再次第二次采样,获取所有线程的 CPU 时间,对比两次采样数据,计算出每个线程的增量 CPU 时间
+- 线程 CPU 使用率 = 线程增量 CPU 时间 / 采样间隔时间 \* 100%
-> 注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。
+::: warning
+注意: 这个统计也会产生一定的开销(JDK 这个接口本身开销比较大),因此会看到 as 的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如 5000 毫秒。
+:::
-> 另外一种查看Java进程的线程cpu使用率方法:可以使用[`show-busy-java-threads`](https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/java.md#-show-busy-java-threads)这个脚本。
+::: tip
+另外一种查看 Java 进程的线程 cpu 使用率方法:可以使用[`show-busy-java-threads`](https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/java.md#-show-busy-java-threads)这个脚本。
+:::
### 使用参考
-#### 支持一键展示当前最忙的前N个线程并打印堆栈:
+#### 支持一键展示当前最忙的前 N 个线程并打印堆栈:
```shell
$ thread -n 3
@@ -61,17 +65,17 @@ $ thread -n 3
"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms
```
-* 没有线程ID,包含`[Internal]`表示为JVM内部线程,参考[dashboard](dashboard.md)命令的介绍。
-* `cpuUsage`为采样间隔时间内线程的CPU使用率,与[dashboard](dashboard.md)命令的数据一致。
-* `deltaTime`为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。
-* `time` 线程运行总CPU时间。
+- 没有线程 ID,包含`[Internal]`表示为 JVM 内部线程,参考[dashboard](dashboard.md)命令的介绍。
+- `cpuUsage`为采样间隔时间内线程的 CPU 使用率,与[dashboard](dashboard.md)命令的数据一致。
+- `deltaTime`为采样间隔时间内线程的增量 CPU 时间,小于 1ms 时被取整显示为 0ms。
+- `time` 线程运行总 CPU 时间。
注意:线程栈为第二采样结束时获取,不能表明采样间隔时间内该线程都是在处理相同的任务。建议间隔时间不要太长,可能间隔时间越大越不准确。
可以根据具体情况尝试指定不同的间隔时间,观察输出结果。
#### 当没有参数时,显示第一页线程的信息
-默认按照CPU增量时间降序排列,只显示第一页数据。
+默认按照 CPU 增量时间降序排列,只显示第一页数据。
```shell
$ thread
@@ -97,8 +101,7 @@ ID NAME GROUP PRIORITY STATE %CPU
#### thread --all, 显示所有匹配的线程
-显示所有匹配线程信息,有时需要获取全部JVM的线程数据进行分析。
-
+显示所有匹配线程信息,有时需要获取全部 JVM 的线程数据进行分析。
#### thread id, 显示指定线程的运行堆栈
@@ -116,7 +119,7 @@ $ thread 1
#### thread -b, 找出当前阻塞其他线程的线程
-有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了`thread -b`, 一键找出那个罪魁祸首。
+有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas 提供了`thread -b`, 一键找出那个罪魁祸首。
```bash
$ thread -b
@@ -157,15 +160,16 @@ $ thread -b
- java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e
```
-> 注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是`java.util.concurrent.Lock`, 目前还不支持。
-
+::: warning
+注意, 目前只支持找出 synchronized 关键字阻塞住的线程, 如果是`java.util.concurrent.Lock`, 目前还不支持。
+:::
#### thread -i, 指定采样时间间隔
-* `thread -i 1000` : 统计最近1000ms内的线程CPU时间。
+- `thread -i 1000` : 统计最近 1000ms 内的线程 CPU 时间。
+
+- `thread -n 3 -i 1000` : 列出 1000ms 内最忙的 3 个线程栈
-* `thread -n 3 -i 1000` : 列出1000ms内最忙的3个线程栈
-
```bash
$ thread -n 3 -i 1000
"as-command-execute-daemon" Id=4759 cpuUsage=23% RUNNABLE
diff --git a/site/src/site/sphinx/trace.md b/site-vuepress/docs/doc/trace.md
similarity index 66%
rename from site/src/site/sphinx/trace.md
rename to site-vuepress/docs/doc/trace.md
index d666452c9..7ac9ad93a 100644
--- a/site/src/site/sphinx/trace.md
+++ b/site-vuepress/docs/doc/trace.md
@@ -1,55 +1,56 @@
-trace
-===
+# trace
[`trace`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-trace)
-> 方法内部调用路径,并输出方法路径上的每个节点上耗时
+::: tip
+方法内部调用路径,并输出方法路径上的每个节点上耗时
+:::
`trace` 命令能主动搜索 `class-pattern`/`method-pattern` 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
### 参数说明
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|方法名表达式匹配|
-|*condition-express*|条件表达式|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
-|`[n:]`|命令执行次数|
-|`#cost`|方法执行耗时|
+| 参数名称 | 参数说明 |
+| ------------------: | :----------------------------------- |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 方法名表达式匹配 |
+| _condition-express_ | 条件表达式 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| `[n:]` | 命令执行次数 |
+| `#cost` | 方法执行耗时 |
这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。
观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。
-
请参考[表达式核心变量](advice-class.md)中关于该节点的描述。
-* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
-* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+- 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
-很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如`trace *StringUtils isBlank '#cost>100'`表示当执行时间超过100ms的时候,才会输出trace的结果。
+很多时候我们只想看到某个方法的 rt 大于某个时间之后的 trace 结果,现在 Arthas 可以按照方法执行的耗时来进行过滤了,例如`trace *StringUtils isBlank '#cost>100'`表示当执行时间超过 100ms 的时候,才会输出 trace 的结果。
-> watch/stack/trace这个三个命令都支持`#cost`
+::: tip
+watch/stack/trace 这个三个命令都支持`#cost`
+:::
### 注意事项
-* `trace` 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。
+- `trace` 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。
- 参考:[Trace命令的实现原理](https://github.com/alibaba/arthas/issues/597)
+ 参考:[Trace 命令的实现原理](https://github.com/alibaba/arthas/issues/597)
-* 3.3.0 版本后,可以使用动态Trace功能,不断增加新的匹配类,参考下面的示例。
+- 3.3.0 版本后,可以使用动态 Trace 功能,不断增加新的匹配类,参考下面的示例。
-* 目前不支持 `trace java.lang.Thread getName`,参考issue: [#1610](https://github.com/alibaba/arthas/issues/1610) ,考虑到不是非常必要场景,且修复有一定难度,因此当前暂不修复
+- 目前不支持 `trace java.lang.Thread getName`,参考 issue: [#1610](https://github.com/alibaba/arthas/issues/1610) ,考虑到不是非常必要场景,且修复有一定难度,因此当前暂不修复
### 使用参考
-
#### 启动 Demo
启动[快速入门](quick-start.md)里的`math-game`。
-#### trace函数
+#### trace 函数
```bash
$ trace demo.MathGame run
@@ -64,9 +65,11 @@ Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
`---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception]
```
-> 结果里的 `#24`,表示在run函数里,在源文件的第`24`行调用了`primeFactors()`函数。
+::: tip
+结果里的 `#24`,表示在 run 函数里,在源文件的第`24`行调用了`primeFactors()`函数。
+:::
-#### trace次数限制
+#### trace 次数限制
如果方法调用的次数很多,那么可以用`-n`参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令。
@@ -82,12 +85,11 @@ Affect(class-cnt:1 , method-cnt:1) cost in 20 ms.
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.
```
+#### 包含 jdk 的函数
-#### 包含jdk的函数
-
-* `--skipJDKMethod ` skip jdk method trace, default value true.
+- `--skipJDKMethod ` skip jdk method trace, default value true.
-默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置`--skipJDKMethod false`。
+默认情况下,trace 不会包含 jdk 里的函数调用,如果希望 trace jdk 里的函数,需要显式设置`--skipJDKMethod false`。
```bash
$ trace --skipJDKMethod false demo.MathGame run
@@ -131,18 +133,20 @@ Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---[0.05447ms] demo.MathGame:print()
```
-> 只会展示耗时大于10ms的调用路径,有助于在排查问题的时候,只关注异常情况
+::: tip
+只会展示耗时大于 10ms 的调用路径,有助于在排查问题的时候,只关注异常情况
+:::
- 是不是很眼熟,没错,在 JProfiler 等收费软件中你曾经见识类似的功能,这里你将可以通过命令就能打印出指定调用路径。 友情提醒下,`trace` 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准,渲染路径上调用的类、方法越多,性能偏差越大。但还是能让你看清一些事情的。
- [12.033735ms] 的含义,`12.033735` 的含义是:当前节点在当前步骤的耗时,单位为毫秒
- [0,0,0ms,11]xxx:yyy() [throws Exception],对该方法中相同的方法调用进行了合并,`0,0,0ms,11` 表示方法调用耗时,`min,max,total,count`;`throws Exception` 表明该方法调用中存在异常返回
- 这里存在一个统计不准确的问题,就是所有方法耗时加起来可能会小于该监测方法的总耗时,这个是由于 Arthas 本身的逻辑会有一定的耗时
-#### trace多个类或者多个函数
+#### trace 多个类或者多个函数
-trace命令只会trace匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。
+trace 命令只会 trace 匹配到的函数里的子调用,并不会向下 trace 多层。因为 trace 是代价比较贵的,多层 trace 可能会导致最终要 trace 的类和函数非常多。
-可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。
+可以用正则表匹配路径上的多个类和函数,一定程度上达到多层 trace 的效果。
```bash
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
@@ -156,12 +160,13 @@ trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
trace javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
```
-### 动态trace
+### 动态 trace
-> 3.3.0 版本后支持。
+::: tip
+3.3.0 版本后支持。
+:::
-
-打开终端1,trace上面demo里的`run`函数,可以看到打印出 `listenerId: 1`:
+打开终端 1,trace 上面 demo 里的`run`函数,可以看到打印出 `listenerId: 1`:
```bash
[arthas@59161]$ trace demo.MathGame run
@@ -177,7 +182,7 @@ Affect(class count: 1 , method count: 1) cost in 112 ms, listenerId: 1
`---[0.167786ms] demo.MathGame:print() #25
```
-现在想要深入子函数`primeFactors`,可以打开一个新终端2,使用`telnet localhost 3658`连接上arthas,再trace `primeFactors`时,指定`listenerId`。
+现在想要深入子函数`primeFactors`,可以打开一个新终端 2,使用`telnet localhost 3658`连接上 arthas,再 trace `primeFactors`时,指定`listenerId`。
```bash
[arthas@59161]$ trace demo.MathGame primeFactors --listenerId 1
@@ -185,9 +190,9 @@ Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 34 ms, listenerId: 1
```
-这时终端2打印的结果,说明已经增强了一个函数:`Affect(class count: 1 , method count: 1)`,但不再打印更多的结果。
+这时终端 2 打印的结果,说明已经增强了一个函数:`Affect(class count: 1 , method count: 1)`,但不再打印更多的结果。
-再查看终端1,可以发现trace的结果增加了一层,打印了`primeFactors`函数里的内容:
+再查看终端 1,可以发现 trace 的结果增加了一层,打印了`primeFactors`函数里的内容:
```bash
`---ts=2020-07-09 16:49:29;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@@ -203,12 +208,11 @@ Affect(class count: 1 , method count: 1) cost in 34 ms, listenerId: 1
`---[0.084025ms] demo.MathGame:print() #25
```
-通过指定`listenerId`的方式动态trace,可以不断深入。另外 `watch`/`tt`/`monitor`等命令也支持类似的功能。
-
+通过指定`listenerId`的方式动态 trace,可以不断深入。另外 `watch`/`tt`/`monitor`等命令也支持类似的功能。
-### trace结果时间不准确问题
+### trace 结果时间不准确问题
-比如下面的结果里:`0.705196 > (0.152743 + 0.145825)`
+比如下面的结果里:`0.705196 > (0.152743 + 0.145825)`
```bash
$ trace demo.MathGame run -n 1
@@ -222,30 +226,33 @@ Affect(class count: 1 , method count: 1) cost in 66 ms, listenerId: 1
那么其它的时间消耗在哪些地方?
-1. 没有被trace到的函数。比如`java.*` 下的函数调用默认会忽略掉。通过增加`--skipJDKMethod false`参数可以打印出来。
-
- ```bash
- $ trace demo.MathGame run --skipJDKMethod false
- Press Q or Ctrl+C to abort.
- Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 2
- `---ts=2021-02-08 11:27:48;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@232204a1
- `---[0.810591ms] demo.MathGame:run()
- +---[0.034568ms] java.util.Random:nextInt() #23
- +---[0.119367ms] demo.MathGame:primeFactors() #24 [throws Exception]
- +---[0.017407ms] java.lang.StringBuilder:() #28
- +---[0.127922ms] java.lang.String:format() #57
- +---[min=0.01419ms,max=0.020221ms,total=0.034411ms,count=2] java.lang.StringBuilder:append() #57
- +---[0.021911ms] java.lang.Exception:getMessage() #57
- +---[0.015643ms] java.lang.StringBuilder:toString() #57
- `---[0.086622ms] java.io.PrintStream:println() #57
- ```
+1. 没有被 trace 到的函数。比如`java.*` 下的函数调用默认会忽略掉。通过增加`--skipJDKMethod false`参数可以打印出来。
+
+ ```bash
+ $ trace demo.MathGame run --skipJDKMethod false
+ Press Q or Ctrl+C to abort.
+ Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 2
+ `---ts=2021-02-08 11:27:48;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@232204a1
+ `---[0.810591ms] demo.MathGame:run()
+ +---[0.034568ms] java.util.Random:nextInt() #23
+ +---[0.119367ms] demo.MathGame:primeFactors() #24 [throws Exception]
+ +---[0.017407ms] java.lang.StringBuilder:() #28
+ +---[0.127922ms] java.lang.String:format() #57
+ +---[min=0.01419ms,max=0.020221ms,total=0.034411ms,count=2] java.lang.StringBuilder:append() #57
+ +---[0.021911ms] java.lang.Exception:getMessage() #57
+ +---[0.015643ms] java.lang.StringBuilder:toString() #57
+ `---[0.086622ms] java.io.PrintStream:println() #57
+ ```
+
2. 非函数调用的指令消耗。比如 `i++`, `getfield`等指令。
-3. 在代码执行过程中,JVM可能出现停顿,比如GC,进入同步块等。
+3. 在代码执行过程中,JVM 可能出现停顿,比如 GC,进入同步块等。
#### 使用 -v 参数打印更多信息
-> watch/trace/monitor/stack/tt 命令都支持 `-v` 参数
+::: tip
+watch/trace/monitor/stack/tt 命令都支持 `-v` 参数
+:::
当命令执行之后,没有输出结果。有两种可能:
@@ -254,4 +261,4 @@ Affect(class count: 1 , method count: 1) cost in 66 ms, listenerId: 1
但用户区分不出是哪种情况。
-使用 `-v`选项,则会打印`Condition express`的具体值和执行结果,方便确认。
\ No newline at end of file
+使用 `-v`选项,则会打印`Condition express`的具体值和执行结果,方便确认。
diff --git a/site/src/site/sphinx/tt.md b/site-vuepress/docs/doc/tt.md
similarity index 72%
rename from site/src/site/sphinx/tt.md
rename to site-vuepress/docs/doc/tt.md
index bd9472ce2..b72cd29de 100644
--- a/site/src/site/sphinx/tt.md
+++ b/site-vuepress/docs/doc/tt.md
@@ -1,9 +1,10 @@
-tt
-===
+# tt
[`tt`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-tt)
-> 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
+::: tip
+方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
+:::
`watch` 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。
@@ -13,7 +14,6 @@ tt
### 使用参考
-
#### 启动 Demo
启动[快速入门](quick-start.md)里的`math-game`。
@@ -39,50 +39,51 @@ Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
- `-t`
- tt 命令有很多个主参数,`-t` 就是其中之一。这个参数的表明希望记录下类 `*Test` 的 `print` 方法的每次执行情况。
-
+ tt 命令有很多个主参数,`-t` 就是其中之一。这个参数的表明希望记录下类 `*Test` 的 `print` 方法的每次执行情况。
+
- `-n 3`
- 当你执行一个调用量不高的方法时可能你还能有足够的时间用 `CTRL+C` 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。
-
- 此时你可以通过 `-n` 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。
+ 当你执行一个调用量不高的方法时可能你还能有足够的时间用 `CTRL+C` 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。
+
+ 此时你可以通过 `-n` 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断 tt 命令的记录过程,避免人工操作无法停止的情况。
- 表格字段说明
-|表格字段|字段解释|
-|---|---|
-|INDEX|时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。|
-|TIMESTAMP|方法执行的本机时间,记录了这个时间片段所发生的本机时间|
-|COST(ms)|方法执行的耗时|
-|IS-RET|方法是否以正常返回的形式结束|
-|IS-EXP|方法是否以抛异常的形式结束|
-|OBJECT|执行对象的`hashCode()`,注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体|
-|CLASS|执行的类名|
-|METHOD|执行的方法名|
+| 表格字段 | 字段解释 |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| INDEX | 时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。 |
+| TIMESTAMP | 方法执行的本机时间,记录了这个时间片段所发生的本机时间 |
+| COST(ms) | 方法执行的耗时 |
+| IS-RET | 方法是否以正常返回的形式结束 |
+| IS-EXP | 方法是否以抛异常的形式结束 |
+| OBJECT | 执行对象的`hashCode()`,注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 |
+| CLASS | 执行的类名 |
+| METHOD | 执行的方法名 |
- 条件表达式
- 不知道大家是否有在使用过程中遇到以下困惑
- * Arthas 似乎很难区分出重载的方法
- * 我只需要观察特定参数,但是 tt 却全部都给我记录了下来
-
- 条件表达式也是用 `OGNL` 来编写,核心的判断对象依然是 `Advice` 对象。除了 `tt` 命令之外,`watch`、`trace`、`stack` 命令也都支持条件表达式。
-
+ 不知道大家是否有在使用过程中遇到以下困惑
+
+ - Arthas 似乎很难区分出重载的方法
+ - 我只需要观察特定参数,但是 tt 却全部都给我记录了下来
+
+ 条件表达式也是用 `OGNL` 来编写,核心的判断对象依然是 `Advice` 对象。除了 `tt` 命令之外,`watch`、`trace`、`stack` 命令也都支持条件表达式。
+
- 解决方法重载
- `tt -t *Test print params.length==1`
-
- 通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写
-
- `tt -t *Test print 'params[1] instanceof Integer'`
-
+ `tt -t *Test print params.length==1`
+
+ 通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写
+
+ `tt -t *Test print 'params[1] instanceof Integer'`
+
- 解决指定参数
- `tt -t *Test print params[0].mobile=="13989838402"`
+ `tt -t *Test print params[0].mobile=="13989838402"`
- 构成条件表达式的 `Advice` 对象
- 前边看到了很多条件表达式中,都使用了 `params[0]`,有关这个变量的介绍,请参考[表达式核心变量](advice-class.md)
+ 前边看到了很多条件表达式中,都使用了 `params[0]`,有关这个变量的介绍,请参考[表达式核心变量](advice-class.md)
#### 检索调用记录
@@ -150,7 +151,7 @@ Affect(row-cnt:1) cost in 11 ms.
当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。
`tt` 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 `INDEX` 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 `-p` 参数。通过 `--replay-times` 指定
-调用次数,通过 `--replay-interval` 指定多次调用间隔(单位ms, 默认1000ms)
+调用次数,通过 `--replay-interval` 指定多次调用间隔(单位 ms, 默认 1000ms)
```bash
$ tt -i 1004 -p
@@ -175,12 +176,11 @@ Affect(row-cnt:1) cost in 14 ms.
你会发现结果虽然一样,但调用的路径发生了变化,由原来的程序发起变成了 Arthas 自己的内部线程发起的调用了。
-
#### 观察表达式
`-w, --watch-express` 观察时空隧道使用`ognl` 表达式
-* 使用[表达式核心变量](advice-class.md)中所有变量作为已知条件编写表达式。
+- 使用[表达式核心变量](advice-class.md)中所有变量作为已知条件编写表达式。
```bash
[arthas@10718]$ tt -t demo.MathGame run -n 5
@@ -194,7 +194,7 @@ Affect(class count: 1 , method count: 1) cost in 56 ms, listenerId: 1
Affect(row-cnt:1) cost in 7 ms.
```
-* 获取类的静态字段、调用类的静态方法
+- 获取类的静态字段、调用类的静态方法
```bash
[arthas@10718]$ tt -t demo.MathGame run -n 5
@@ -209,18 +209,16 @@ Affect(class count: 1 , method count: 1) cost in 56 ms, listenerId: 1
注意这里使用 `com.taobao.arthas.core.advisor.Advice#getLoader`加载,使用精确`classloader` [ognl](ognl.md)更好。
-
-高级用法 [获取spring context 调用bean 方法](https://github.com/alibaba/arthas/issues/482)
-
+高级用法 [获取 spring context 调用 bean 方法](https://github.com/alibaba/arthas/issues/482)
- 需要强调的点
1. **ThreadLocal 信息丢失**
很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。
-
+
一些常见的 CASE 比如:鹰眼的 TraceId 等。
-
+
2. **引用的对象**
需要强调的是,`tt` 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 `tt` 查看的时候将无法看到当时最准确的值。这也是为什么 `watch` 命令存在的意义。
diff --git a/site-vuepress/docs/doc/tunnel.md b/site-vuepress/docs/doc/tunnel.md
new file mode 100644
index 000000000..4b249d892
--- /dev/null
+++ b/site-vuepress/docs/doc/tunnel.md
@@ -0,0 +1,160 @@
+# Arthas Tunnel
+
+通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。
+
+比如,在流式计算里,Java 进程可以是在不同的机器启动的,想要使用 Arthas 去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个 Java 进程。
+
+在这种情况下,可以使用 Arthas Tunnel Server/Client。
+
+参考:
+
+- 1: [Web Console](web-console.md)
+- 2: [Arthas Spring Boot Starter](spring-boot-starter.md)
+
+### 下载部署 arthas tunnel server
+
+[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases)
+
+- 从 Maven 仓库下载:[](https://arthas.aliyun.com/download/arthas-tunnel-server/latest_version?mirror=aliyun)
+
+- 从 Github Releases 页下载: [https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases)
+
+Arthas tunnel server 是一个 spring boot fat jar 应用,直接`java -jar`启动:
+
+```bash
+java -jar arthas-tunnel-server.jar
+```
+
+默认情况下,arthas tunnel server 的 web 端口是`8080`,arthas agent 连接的端口是`7777`。
+
+启动之后,可以访问 [http://127.0.0.1:8080/](http://127.0.0.1:8080/) ,再通过`agentId`连接到已注册的 arthas agent 上。
+
+通过 Spring Boot 的 Endpoint,可以查看到具体的连接信息: [http://127.0.0.1:8080/actuator/arthas](http://127.0.0.1:8080/actuator/arthas) ,登陆用户名是`arthas`,密码在 arthas tunnel server 的日志里可以找到,比如:
+
+```
+32851 [main] INFO o.s.b.a.s.s.UserDetailsServiceAutoConfiguration
+
+Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2
+```
+
+### 启动 arthas 时连接到 tunnel server
+
+在启动 arthas,可以传递`--tunnel-server`参数,比如:
+
+```bash
+as.sh --tunnel-server 'ws://127.0.0.1:7777/ws'
+```
+
+也可以使用下面的测试地址(不保证一直可用):
+
+```bash
+as.sh --tunnel-server 'ws://47.75.156.201:80/ws'
+```
+
+- 如果有特殊需求,可以通过`--agent-id`参数里指定 agentId。默认情况下,会生成随机 ID。
+
+attach 成功之后,会打印出 agentId,比如:
+
+```bash
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+| .-. || '--'.' | | | .--. || .-. |`. `-.
+| | | || |\ \ | | | | | || | | |.-' |
+`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+
+
+wiki https://arthas.aliyun.com/doc
+tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
+version 3.1.2
+pid 86183
+time 2019-08-30 15:40:53
+id URJZ5L48RPBR2ALI5K4V
+```
+
+如果是启动时没有连接到 tunnel server,也可以在后续自动重连成功之后,通过 session 命令来获取 agentId:
+
+```bash
+[arthas@86183]$ session
+ Name Value
+-----------------------------------------------------
+ JAVA_PID 86183
+ SESSION_ID f7273eb5-e7b0-4a00-bc5b-3fe55d741882
+ AGENT_ID URJZ5L48RPBR2ALI5K4V
+ TUNNEL_SERVER ws://47.75.156.201:80/ws
+```
+
+以上面的为例,在浏览器里访问 [http://47.75.156.201/arthas/?port=80](http://47.75.156.201/arthas/?port=80) ,输入 `agentId`,就可以连接到本机上的 arthas 了。
+
+
+
+### 最佳实践
+
+::: tip
+注意,agentId 要保持唯一,否则会在 tunnel server 上冲突,不能正常工作。
+:::
+
+如果 arthas agent 配置了 `appName`,则生成的 agentId 会带上`appName`的前缀。
+
+比如在加上启动参数:`as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp` ,则生成的 agentId 可能是`demoapp_URJZ5L48RPBR2ALI5K4V`。
+
+Tunnel server 会以`_`做分隔符,提取出`appName`,方便按应用进行管理。
+
+::: tip
+另外,也可以在解压的 arthas 目录下的 `arthas.properties`,或者在 spring boot 应用的`application.properties`里配置`appName`。
+:::
+
+### Tunnel Server 的管理页面
+
+在本地启动 tunnel-server,然后使用`as.sh` attach,并且指定应用名`--app-name test`:
+
+```
+$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test
+telnet connecting to arthas server... current timestamp is 1627539688
+Trying 127.0.0.1...
+Connected to 127.0.0.1.
+Escape character is '^]'.
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+| .-. || '--'.' | | | .--. || .-. |`. `-.
+| | | || |\ \ | | | | | || | | |.-' |
+`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+
+
+wiki https://arthas.aliyun.com/doc
+tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
+version 3.5.3
+main_class demo.MathGame
+pid 65825
+time 2021-07-29 14:21:29
+id test_PE3LZO9NA9ENJYTPGL9L
+```
+
+然后访问 tunnel-server,可以看到所有连接的应用列表:
+
+[http://localhost:8080/apps.html](http://localhost:8080/apps.html)
+
+
+
+再打开详情,则可以看到连接的所有 agent 列表:
+
+[http://localhost:8080/agents.html?app=test](http://localhost:8080/agents.html?app=test)
+
+
+
+### 权限管理
+
+目前 tunnel server 没有专门的权限管理,用户需要自行开发,对 app name 鉴权。
+
+### 集群方式管理
+
+如果希望部署多台 tunnel server,可以通过 nginx 做转发,redis 来保存 agent 信息。
+
+- nginx 需要配置 sticky session,保证用户 web socket 连接到同一个后端 tunnel server 上。简单的配置方式是用`ip_hash`。
+
+### Arthas tunnel server 的工作原理
+
+```
+browser <-> arthas tunnel server <-> arthas tunnel client <-> arthas agent
+```
+
+[tunnel-server/README.md](https://github.com/alibaba/arthas/blob/master/tunnel-server/README.md#)
diff --git a/site/src/site/sphinx/version.md b/site-vuepress/docs/doc/version.md
similarity index 88%
rename from site/src/site/sphinx/version.md
rename to site-vuepress/docs/doc/version.md
index 293fa6c6e..d4dbe2d40 100644
--- a/site/src/site/sphinx/version.md
+++ b/site-vuepress/docs/doc/version.md
@@ -1,5 +1,4 @@
-version
-===
+# version
输出当前目标 Java 进程所加载的 Arthas 版本号
@@ -9,4 +8,3 @@ version
$ version
3.5.1
```
-
diff --git a/site/src/site/sphinx/vmoption.md b/site-vuepress/docs/doc/vmoption.md
similarity index 94%
rename from site/src/site/sphinx/vmoption.md
rename to site-vuepress/docs/doc/vmoption.md
index b56665b6c..08d69bdc4 100644
--- a/site/src/site/sphinx/vmoption.md
+++ b/site-vuepress/docs/doc/vmoption.md
@@ -1,13 +1,14 @@
-vmoption
-===
+# vmoption
[`vmoption`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-vmoption)
-> 查看,更新VM诊断相关的参数
+::: tip
+查看,更新 VM 诊断相关的参数
+:::
### 使用参考
-#### 查看所有的option
+#### 查看所有的 option
```bash
[arthas@56963]$ vmoption
@@ -37,7 +38,7 @@ vmoption
PrintConcurrentLocks false DEFAULT true
```
-#### 查看指定的option
+#### 查看指定的 option
```bash
$ vmoption PrintGC
@@ -46,7 +47,7 @@ $ vmoption PrintGC
PrintGC false MANAGEMENT true
```
-#### 更新指定的option
+#### 更新指定的 option
```bash
$ vmoption PrintGC true
diff --git a/site/src/site/sphinx/vmtool.md b/site-vuepress/docs/doc/vmtool.md
similarity index 76%
rename from site/src/site/sphinx/vmtool.md
rename to site-vuepress/docs/doc/vmtool.md
index e78a0a822..77d6b749a 100644
--- a/site/src/site/sphinx/vmtool.md
+++ b/site-vuepress/docs/doc/vmtool.md
@@ -1,13 +1,14 @@
-vmtool
-===
+# vmtool
-> @since 3.5.1
+::: tip
+@since 3.5.1
+:::
[`vmtool`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-vmtool)
-`vmtool` 利用`JVMTI`接口,实现查询内存对象,强制GC等功能。
+`vmtool` 利用`JVMTI`接口,实现查询内存对象,强制 GC 等功能。
-* [JVM Tool Interface](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html)
+- [JVM Tool Interface](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html)
### 获取对象
@@ -27,7 +28,9 @@ $ vmtool --action getInstances --className java.lang.String --limit 10
]
```
-> 通过 `--limit`参数,可以限制返回值数量,避免获取超大数据时对JVM造成压力。默认值是10。
+::: tip
+通过 `--limit`参数,可以限制返回值数量,避免获取超大数据时对 JVM 造成压力。默认值是 10。
+:::
### 指定 classloader name
@@ -35,10 +38,9 @@ $ vmtool --action getInstances --className java.lang.String --limit 10
vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext
```
-
### 指定 classloader hash
-可以通过`sc`命令查找到加载class的 classloader。
+可以通过`sc`命令查找到加载 class 的 classloader。
```bash
$ sc -d org.springframework.context.ApplicationContext
@@ -60,26 +62,30 @@ vmtool --action getInstances -c 19469ea2 --className org.springframework.context
### 指定返回结果展开层数
-> `getInstances` action返回结果绑定到`instances`变量上,它是数组。
+::: tip
+`getInstances` action 返回结果绑定到`instances`变量上,它是数组。
-> 通过 `-x`/`--expand` 参数可以指定结果的展开层次,默认值是1。
+通过 `-x`/`--expand` 参数可以指定结果的展开层次,默认值是 1。
+:::
-```bash
+```bash
vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext -x 2
```
### 执行表达式
-> `getInstances` action返回结果绑定到`instances`变量上,它是数组。可以通过`--express`参数执行指定的表达式。
+::: tip
+`getInstances` action 返回结果绑定到`instances`变量上,它是数组。可以通过`--express`参数执行指定的表达式。
+:::
```bash
vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext --express 'instances[0].getBeanDefinitionNames()'
```
-### 强制GC
+### 强制 GC
```bash
vmtool --action forceGc
```
-* 可以结合 [`vmoption`](vmoption.md) 命令动态打开`PrintGC`开关。
\ No newline at end of file
+- 可以结合 [`vmoption`](vmoption.md) 命令动态打开`PrintGC`开关。
diff --git a/site/src/site/sphinx/watch.md b/site-vuepress/docs/doc/watch.md
similarity index 70%
rename from site/src/site/sphinx/watch.md
rename to site-vuepress/docs/doc/watch.md
index 62a75ef68..ba8e8d730 100644
--- a/site/src/site/sphinx/watch.md
+++ b/site-vuepress/docs/doc/watch.md
@@ -1,52 +1,56 @@
-watch
-===
+# watch
[`watch`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-watch)
-> 函数执行数据观测
+::: tip
+函数执行数据观测
+:::
-让你能方便的观察到指定函数的调用情况。能观察到的范围为:`返回值`、`抛出异常`、`入参`,通过编写 OGNL 表达式进行对应变量的查看。
+让你能方便的观察到指定函数的调用情况。能观察到的范围为:`返回值`、`抛出异常`、`入参`,通过编写 OGNL 表达式进行对应变量的查看。
### 参数说明
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
-|参数名称|参数说明|
-|---:|:---|
-|*class-pattern*|类名表达式匹配|
-|*method-pattern*|函数名表达式匹配|
-|*express*|观察表达式,默认值:`{params, target, returnObj}`|
-|*condition-express*|条件表达式|
-|[b]|在**函数调用之前**观察|
-|[e]|在**函数异常之后**观察|
-|[s]|在**函数返回之后**观察|
-|[f]|在**函数结束之后**(正常返回和异常返回)观察|
-|[E]|开启正则表达式匹配,默认为通配符匹配|
-|[x:]|指定输出结果的属性遍历深度,默认为 1,最大值是4|
-
-这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。
+| 参数名称 | 参数说明 |
+| ------------------: | :------------------------------------------------ |
+| _class-pattern_ | 类名表达式匹配 |
+| _method-pattern_ | 函数名表达式匹配 |
+| _express_ | 观察表达式,默认值:`{params, target, returnObj}` |
+| _condition-express_ | 条件表达式 |
+| [b] | 在**函数调用之前**观察 |
+| [e] | 在**函数异常之后**观察 |
+| [s] | 在**函数返回之后**观察 |
+| [f] | 在**函数结束之后**(正常返回和异常返回)观察 |
+| [E] | 开启正则表达式匹配,默认为通配符匹配 |
+| [x:] | 指定输出结果的属性遍历深度,默认为 1,最大值是 4 |
+
+这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。
观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。请参考[表达式核心变量](advice-class.md)中关于该节点的描述。
-* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
-* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+- 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
+- OGNL 表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
**特别说明**:
-* watch 命令定义了4个观察事件点,即 `-b` 函数调用前,`-e` 函数异常后,`-s` 函数返回后,`-f` 函数结束后
-* 4个观察事件点 `-b`、`-e`、`-s` 默认关闭,`-f` 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
-* 这里要注意`函数入参`和`函数出参`的区别,有可能在中间被修改导致前后不一致,除了 `-b` 事件点 `params` 代表函数入参外,其余事件都代表函数出参
-* 当使用 `-b` 时,由于观察事件点是在函数调用前,此时返回值或异常均不存在
-* 在watch命令的结果里,会打印出`location`信息。`location`有三种可能值:`AtEnter`,`AtExit`,`AtExceptionExit`。对应函数入口,函数正常return,函数抛出异常。
+- watch 命令定义了 4 个观察事件点,即 `-b` 函数调用前,`-e` 函数异常后,`-s` 函数返回后,`-f` 函数结束后
+- 4 个观察事件点 `-b`、`-e`、`-s` 默认关闭,`-f` 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
+- 这里要注意`函数入参`和`函数出参`的区别,有可能在中间被修改导致前后不一致,除了 `-b` 事件点 `params` 代表函数入参外,其余事件都代表函数出参
+- 当使用 `-b` 时,由于观察事件点是在函数调用前,此时返回值或异常均不存在
+- 在 watch 命令的结果里,会打印出`location`信息。`location`有三种可能值:`AtEnter`,`AtExit`,`AtExceptionExit`。对应函数入口,函数正常 return,函数抛出异常。
+
### 使用参考
#### 启动 Demo
启动[快速入门](quick-start.md)里的`math-game`。
-#### 观察函数调用返回时的参数、this对象和返回值
+#### 观察函数调用返回时的参数、this 对象和返回值
-> 观察表达式,默认值是`{params, target, returnObj}`
+::: tip
+观察表达式,默认值是`{params, target, returnObj}`
+:::
```bash
$ watch demo.MathGame primeFactors -x 2
@@ -80,9 +84,8 @@ ts=2021-08-31 15:22:58; [cost=1.020982ms] result=@ArrayList[
]
```
-* 上面的结果里,说明函数被执行了两次,第一次结果是`location=AtExceptionExit`,说明函数抛出异常了,因此`returnObj`是null
-* 在第二次结果里是`location=AtExit`,说明函数正常返回,因此可以看到`returnObj`结果是一个ArrayList
-
+- 上面的结果里,说明函数被执行了两次,第一次结果是`location=AtExceptionExit`,说明函数抛出异常了,因此`returnObj`是 null
+- 在第二次结果里是`location=AtExit`,说明函数正常返回,因此可以看到`returnObj`结果是一个 ArrayList
#### 观察函数调用入口的参数和返回值
@@ -98,8 +101,7 @@ ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[
]
```
-* 对比前一个例子,返回值为空(事件点为函数执行前,因此获取不到返回值)
-
+- 对比前一个例子,返回值为空(事件点为函数执行前,因此获取不到返回值)
#### 同时观察函数调用前和函数返回后
@@ -138,11 +140,11 @@ ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
]
```
-* 参数里`-n 2`,表示只执行两次
+- 参数里`-n 2`,表示只执行两次
-* 这里输出结果中,第一次输出的是函数调用前的观察表达式的结果,第二次输出的是函数返回后的表达式的结果
+- 这里输出结果中,第一次输出的是函数调用前的观察表达式的结果,第二次输出的是函数返回后的表达式的结果
-* 结果的输出顺序和事件发生的先后顺序一致,和命令中 `-s -b` 的顺序无关
+- 结果的输出顺序和事件发生的先后顺序一致,和命令中 `-s -b` 的顺序无关
#### 调整`-x`的值,观察具体的函数参数值
@@ -177,8 +179,8 @@ ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[
]
```
-* `-x`表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1。
-* `-x`最大值是4,防止展开结果占用太多内存。用户可以在`ognl`表达式里指定更具体的field。
+- `-x`表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是 1。
+- `-x`最大值是 4,防止展开结果占用太多内存。用户可以在`ognl`表达式里指定更具体的 field。
#### 条件表达式的例子
@@ -192,7 +194,7 @@ ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[
]
```
-* 只有满足条件的调用,才会有响应。
+- 只有满足条件的调用,才会有响应。
#### 观察异常信息的例子
@@ -210,8 +212,8 @@ ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
]
```
-* `-e`表示抛出异常时才触发
-* express中,表示异常信息的变量是`throwExp`
+- `-e`表示抛出异常时才触发
+- express 中,表示异常信息的变量是`throwExp`
#### 按照耗时进行过滤
@@ -230,8 +232,7 @@ ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
]
```
-* `#cost>200`(单位是`ms`)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用
-
+- `#cost>200`(单位是`ms`)表示只有当耗时大于 200ms 时才会输出,过滤掉执行时间小于 200ms 的调用
#### 观察当前对象中的属性
@@ -255,7 +256,7 @@ Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
-```
+```
#### 获取类的静态字段、调用类的静态函数的例子
@@ -272,17 +273,20 @@ ts=2021-01-05 21:35:20; [cost=0.173966ms] result=@ArrayList[
]
```
-* 注意这里使用 `Thread.currentThread().getContextClassLoader()` 加载,使用精确`classloader` [ognl](ognl.md)更好。
+- 注意这里使用 `Thread.currentThread().getContextClassLoader()` 加载,使用精确`classloader` [ognl](ognl.md)更好。
#### 排除掉指定的类
-> watch/trace/monitor/stack/tt 命令都支持 `--exclude-class-pattern` 参数
+::: tip
+watch/trace/monitor/stack/tt 命令都支持 `--exclude-class-pattern` 参数
+:::
使用 `--exclude-class-pattern` 参数可以排除掉指定的类,比如:
```bash
watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
```
+
#### 不匹配子类
默认情况下 watch/trace/monitor/stack/tt 命令都会匹配子类。如果想不匹配,可以通过全局参数关掉。
@@ -293,7 +297,9 @@ options disable-sub-class true
#### 使用 -v 参数打印更多信息
-> watch/trace/monitor/stack/tt 命令都支持 `-v` 参数
+::: tip
+watch/trace/monitor/stack/tt 命令都支持 `-v` 参数
+:::
当命令执行之后,没有输出结果。有两种可能:
@@ -327,4 +333,4 @@ ts=2020-12-02 22:38:57; [cost=0.052877ms] result=@Object[][
@Integer[4243],
],
]
-```
\ No newline at end of file
+```
diff --git a/site-vuepress/docs/doc/web-console.md b/site-vuepress/docs/doc/web-console.md
new file mode 100644
index 000000000..b0c636839
--- /dev/null
+++ b/site-vuepress/docs/doc/web-console.md
@@ -0,0 +1,36 @@
+# Web Console
+
+[`Web Console`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=case-web-console)
+
+### 通过浏览器连接 arthas
+
+Arthas 目前支持 Web Console,用户在 attach 成功之后,可以直接访问:[http://127.0.0.1:8563/](http://127.0.0.1:8563/)。
+
+可以填入 IP,远程连接其它机器上的 arthas。
+
+
+
+::: warning
+默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,则可以使用 `--target-ip`参数指定 listen 的 IP,更多参考`-h`的帮助说明。
+注意会有安全风险,考虑下面的 tunnel server 的方案。
+:::
+
+- 在 Web Console 复制粘贴快捷键参考: [https://github.com/alibaba/arthas/issues/1056](https://github.com/alibaba/arthas/issues/1056)
+
+::: tip
+3.5.4 版本后,在 Web Console 可以鼠标右键复制粘贴。
+:::
+
+### scrollback URL 参数
+
+::: tip
+3.5.5 版本后支持
+:::
+
+默认 Web Console 支持向上回滚的行数是 1000。可以在 URL 里用`scrollback`指定。比如
+
+[http://127.0.0.1:8563/?scrollback=3000](http://127.0.0.1:8563/?scrollback=3000)
+
+### 使用 arthas tunnel server 连接远程 arthas
+
+参考:[Arthas Tunnel](tunnel.md)
diff --git a/site-vuepress/docs/en/README.md b/site-vuepress/docs/en/README.md
new file mode 100644
index 000000000..e398a5ab3
--- /dev/null
+++ b/site-vuepress/docs/en/README.md
@@ -0,0 +1,55 @@
+---
+home: true
+title: Home
+heroImage: /images/arthas_light.png
+heroImageDark: /images/arthas_dark.png
+heroText: null
+tagline: Java Diagnostic Tool
+sidebar: false
+actions:
+ - text: Quick Start
+ link: /doc/quick-start.html
+ type: primary
+ - text: View on github
+ link: https://github.com/alibaba/arthas
+ type: secondary
+features:
+ - icon: 🖥
+ title: Dashboard
+ details: View the operating status of the system in real time
+ - icon: 🔬
+ title: Parameters/Return values/Exceptions
+ details: View method parameters, return values and exceptions
+ - icon: 🔩
+ title: Online hotswap
+ details: jad/sc/redefine online hotswap
+ - icon: 🩺
+ title: Class conflict
+ details: Resolve the class conflict problem in seconds, locate the class loading path
+ - icon: ⚡️
+ title: Flame Graph
+ details: Quickly locate application hotspots and generate flame graphs
+ - icon: 📡
+ title: WebConsole
+ details: Online diagnosis
+users_title: "Users"
+users_details: "Providing your info on Wanted: who's using arthas to help improving arthas better"
+users:
+ - name: Alibaba Group
+ logo: /images/users/users_alibaba.png
+ - name: Didiglobal
+ logo: /images/users/users_didi.png
+ - name: Kaola
+ logo: /images/users/users_kaola.png
+ - name: Qunar
+ logo: /images/users/users_qunar.png
+ - name: Telecom
+ logo: /images/users/users_telecom.png
+ - name: Weidian
+ logo: /images/users/users_weidian.png
+ - name: ICBC
+ logo: /images/users/users_icbc.png
+ - name: Chinaums
+ logo: /images/users/users_yinlian.png
+footer: Apache-2.0 license | Copyright 2018-present, Alibaba Middleware Group, and contributors
+---
diff --git a/site/src/site/sphinx/en/index.md b/site-vuepress/docs/en/doc/README.md
similarity index 52%
rename from site/src/site/sphinx/en/index.md
rename to site-vuepress/docs/en/doc/README.md
index 0d2cf3181..20a62da22 100644
--- a/site/src/site/sphinx/en/index.md
+++ b/site-vuepress/docs/en/doc/README.md
@@ -1,9 +1,6 @@
-Arthas Documentation
-===
+# Introduction
-**[中文文档/Chinese Documentation](https://arthas.aliyun.com/doc/)**
-
-
+
Arthas is a Java diagnostic tool open-sourced by Alibaba middleware team. It is widely adopted and popular among the developers inside Alibaba. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers.
@@ -11,7 +8,7 @@ Arthas is a Java diagnostic tool open-sourced by Alibaba middleware team. It is
Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What's even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime.
-Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted.
+Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted.
And if you're thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above.
@@ -19,43 +16,19 @@ Arthas is built to solve these issues. A developer can troubleshoot production i
### Key features
-* Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts)
-* Decompile a class to ensure the code is running as expected.
-* Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc.
-* Check the method invocation details, e.g. method parameter, returned values, exceptions and etc.
-* Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method.
-* Trace the method invocation to find slow sub-invocations.
-* Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc.
-* Monitor system metrics, thread states and CPU usage, GC statistics and etc.
-* Supports command line interactive mode, with auto-complete feature enabled.
-* Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers.
-* Supports profiler/Flame Graph
-* Support get objects in the heap that are instances of the specified class.
-* Supports JDK 6+
-* Supports Linux/Mac/Windows
-
+- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts)
+- Decompile a class to ensure the code is running as expected.
+- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc.
+- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc.
+- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method.
+- Trace the method invocation to find slow sub-invocations.
+- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc.
+- Monitor system metrics, thread states and CPU usage, GC statistics and etc.
+- Supports command line interactive mode, with auto-complete feature enabled.
+- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers.
+- Supports profiler/Flame Graph
+- Support get objects in the heap that are instances of the specified class.
+- Supports JDK 6+
+- Supports Linux/Mac/Windows
**If you are using Arthas, please let us know. Your feedback is very important to us: [View](https://github.com/alibaba/arthas/issues/111)**
-
-Contents
---------
-
-* [Home](https://arthas.aliyun.com/)
-* [Online tutorials(Recommend)](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en)
-* [Installation](install-detail.md)
-* [Download](download.md)
-* [Quick start](quick-start.md)
-* [Advanced usage](advanced-use.md)
-* [Commands](commands.md)
-* [WebConsole](web-console.md)
-* [Arthas Tunnel](tunnel.md)
-* [Http API](http-api.md)
-* [Docker](docker.md)
-* [Arthas Spring Boot Starter](spring-boot-starter.md)
-* [IDEA Plugin](idea-plugin.md)
-* [User cases](https://github.com/alibaba/arthas/issues?q=label%3Auser-case)
-* [FAQ](faq.md)
-* [Star me at GitHub](https://github.com/alibaba/arthas)
-* [Compile and debug/CONTRIBUTING](https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md#)
-* [Release Notes](https://github.com/alibaba/arthas/releases)
-* [Contact us](contact-us.md)
diff --git a/site-vuepress/docs/en/doc/advanced-use.md b/site-vuepress/docs/en/doc/advanced-use.md
new file mode 100644
index 000000000..8ad8cfd22
--- /dev/null
+++ b/site-vuepress/docs/en/doc/advanced-use.md
@@ -0,0 +1,157 @@
+# Advanced Usage
+
+## Basic
+
+- [help](help.md) - display Arthas help
+- [cls](cls.md) - clear the screen
+- [cat](cat.md) - Concatenate and print files
+- [echo](echo.md) - write arguments to the standard output
+- [grep](grep.md) - Pattern searcher
+- [base64](base64.md) - Encode and decode using Base64 representation.
+- [tee](tee.md) - Copies standard input to standard output, making a copy in zero or more files.
+- [pwd](pwd.md) - Return working directory name
+- [session](session.md) - display current session information
+- [reset](reset.md) - reset all the enhanced classes. All enhanced classes will also be reset when Arthas server is closed by `stop`
+- [version](version.md) - print the version for the Arthas attached to the current Java process
+- [history](history.md) - view command history
+- [quit/exit](quit.md) - exit the current Arthas session, without effecting other sessions
+- [stop](stop.md) - terminate the Arthas server, all Arthas sessions will be destroyed
+- [keymap](keymap.md) - keymap for Arthas keyboard shortcut
+
+## JVM
+
+- [dashboard](dashboard.md) - dashboard for the system's real-time data
+- [thread](thread.md) - show java thread information
+- [jvm](jvm.md) - show JVM information
+- [sysprop](sysprop.md) - view/modify system properties
+- [sysenv](sysenv.md) — view system environment variables
+- [vmoption](vmoption.md) - view/modify the vm diagnostic options.
+- [perfcounter](perfcounter.md) - show JVM Perf Counter information
+- [logger](logger.md) - print the logger information, update the logger level
+- [getstatic](getstatic.md) - examine class's static properties
+- [ognl](ognl.md) - execute ognl expression
+- [mbean](mbean.md) - show Mbean information
+- [heapdump](heapdump.md) - dump java heap in hprof binary format, like `jmap`
+- [vmtool](vmtool.md) - jvm tool, getInstances in jvm, forceGc
+
+## class/classloader
+
+- [sc](sc.md) - check the info for the classes loaded by JVM
+- [sm](sm.md) - check methods info for the loaded classes
+- [jad](jad.md) - decompile the specified loaded classes
+- [mc](mc.md) - Memory compiler, compiles `.java` files into `.class` files in memory
+- [retransform](retransform.md) - load external `*.class` files and retransform it into JVM
+- [redefine](redefine.md) - load external `*.class` files and re-define it into JVM
+- [dump](dump.md) - dump the loaded classes in byte code to the specified location
+- [classloader](classloader.md) - check the inheritance structure, urls, class loading info for the specified class; using classloader to get the url of the resource e.g. `java/lang/String.class`
+
+## monitor/watch/trace - related
+
+::: warning
+**Attention**: commands here are taking advantage of byte-code-injection, which means we are injecting some [aspects](https://en.wikipedia.org/wiki/Aspect-oriented_programming) into the current classes for monitoring and statistics purpose. Therefore, when using it for online troubleshooting in your production environment, you'd better **explicitly specify** classes/methods/criteria, and remember to remove the injected code by `stop` or `reset`.
+:::
+
+- [monitor](monitor.md) - monitor method execution statistics
+- [watch](watch.md) - display the input/output parameter, return object, and thrown exception of specified method invocation
+- [trace](trace.md) - trace the execution time of specified method invocation
+- [stack](stack.md) - display the stack trace for the specified class and method
+- [tt](tt.md) - time tunnel, record the arguments and returned value for the methods and replay
+
+## authentication
+
+- [auth](auth.md) - authentication
+
+## options
+
+- [options](options.md) - check/set Arthas global options
+
+## profiler/flame graph
+
+- [profiler](profiler.md) - use [async-profiler](https://github.com/jvm-profiling-tools/async-profiler) to generate flame graph
+
+## pipe
+
+Arthas provides `pipe` to process the result returned from commands further, e.g. `sm java.lang.String * | grep 'index'`. Commands supported in `pipe`:
+
+- grep - filter the result with the given keyword
+- plaintext - remove the ANSI color
+- wc - count lines
+
+## async jobs
+
+[async](async.md) can be handy when a problem is hardly to reproduce in the production environment, e.g. one `watch` condition may happen only once in one single day.
+
+- job control - use `>` to redirect result into the log file, use `&` to put the job to the background. Job keeps running even if the session is disconnected (the session lifecycle is 1 day by default)
+- jobs - list all jobs
+- kill - forcibly terminate the job
+- fg - bring the suspend job to the foreground
+- bg - put the job to run in the background
+
+## Web Console
+
+Arthas supports living inside a browser. The communication between arthas and browser is via websocket.
+
+- [Web Console](web-console.md)
+
+## Arthas Properties
+
+- [Arthas Properties](arthas-properties.md)
+
+## Start as a Java Agent
+
+- [Start as a Java Agent](agent.md)
+
+## as.sh and arthas-boot tips
+
+- Select the process to be attached via the `select` option.
+
+Normally, `as.sh`/`arthas-boot.jar` needs to a pid, bacause the pid will change.
+
+For example, with `math-game.jar` already started, use the `jps` command to see.
+
+```bash
+$ jps
+58883 math-game.jar
+58884 Jps
+```
+
+The `select` option allows you to specify a process name, which is very convenient.
+
+```bash
+$ ./as.sh --select math-game
+Arthas script version: 3.3.6
+[INFO] JAVA_HOME: /tmp/java/8.0.222-zulu
+Arthas home: /Users/admin/.arthas/lib/3.3.6/arthas
+Calculating attach execution time...
+Attaching to 59161 using version /Users/admin/.arthas/lib/3.3.6/arthas...
+
+real 0m0.572s
+user 0m0.281s
+sys 0m0.039s
+Attach success.
+telnet connecting to arthas server... current timestamp is 1594280799
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+| .-. || '--'.' | | | .--. || .-. |`. `-.
+| | | || |\ \ | | | | | || | | |.-' |
+`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+
+
+wiki https://arthas.aliyun.com/doc
+tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
+version 3.3.6
+pid 58883
+```
+
+## User data report
+
+After the `3.1.4` version, arthas support user data report.
+
+At startup, use the `stat-url` option, such as: `./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'`
+
+There is a sample data report in the tunnel server that users can implement on their own.
+
+[StatController.java](https://github.com/alibaba/arthas/blob/master/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/app/web/StatController.java)
diff --git a/site-vuepress/docs/en/doc/advice-class.md b/site-vuepress/docs/en/doc/advice-class.md
new file mode 100644
index 000000000..dabcc9cfc
--- /dev/null
+++ b/site-vuepress/docs/en/doc/advice-class.md
@@ -0,0 +1,41 @@
+# Fundamental Fields in Expressions
+
+There is a very fundamental class `Advice` for the expressions used in filtering, tracing or monitoring and other aspects in commands.
+
+```java
+public class Advice {
+
+ private final ClassLoader loader;
+ private final Class> clazz;
+ private final ArthasMethod method;
+ private final Object target;
+ private final Object[] params;
+ private final Object returnObj;
+ private final Throwable throwExp;
+ private final boolean isBefore;
+ private final boolean isThrow;
+ private final boolean isReturn;
+
+ // getter/setter
+}
+```
+
+Description for the variables in the class `Advice`:
+
+| Name | Specification |
+| --------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| loader | the class loader for the current called class |
+| clazz | the reference to the current called class |
+| method | the reference to the current called method |
+| target | the instance of the current called class |
+| params | the parameters for the current call, which is an array (when there's no parameter, it will be an empty array) |
+| returnObj | the return value from the current call - only available when the method call returns normally (`isReturn==true`), and `null` is for `void` return value |
+| throwExp | the exceptions thrown from the current call - only available when the method call throws exception (`isThrow==true`) |
+| isBefore | flag to indicate the method is about to execute. `isBefore==true` but `isThrow==false` and `isReturn==false` since it's no way to know how the method call will end |
+| isThrow | flag to indicate the method call ends with exception thrown |
+| isReturn | flag to indicate the method call ends normally without exception thrown |
+
+All variables listed above can be used directly in the [OGNL expression](https://commons.apache.org/proper/commons-ognl/language-guide.html). The command will not execute and exit if there's illegal OGNL grammar or unexpected variable in the expression.
+
+- [typical use cases](https://github.com/alibaba/arthas/issues/71);
+- [OGNL language guide](https://commons.apache.org/proper/commons-ognl/language-guide.html).
diff --git a/site/src/site/sphinx/en/agent.md b/site-vuepress/docs/en/doc/agent.md
similarity index 89%
rename from site/src/site/sphinx/en/agent.md
rename to site-vuepress/docs/en/doc/agent.md
index 00f62ef9d..c5bd53b80 100644
--- a/site/src/site/sphinx/en/agent.md
+++ b/site-vuepress/docs/en/doc/agent.md
@@ -1,14 +1,13 @@
-Start as a Java Agent
-====
+# Start as a Java Agent
Usually Arthas dynamic attach the applications on the fly, but from version `3.2.0` onwards, Arthas supports starting directly as a java agent.
For example, download the full arthas zip package, decompress it and start it by specifying `arthas-agent.jar` with the parameter `-javaagent`.
-````
+```
java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar
-````
+```
The default configuration is in the `arthas.properties` file in the decompression directory. Reference: [Arthas Properties](arthas-properties.md)
-Reference: https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html
\ No newline at end of file
+Reference: https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html
diff --git a/site/src/site/sphinx/en/arthas-properties.md b/site-vuepress/docs/en/doc/arthas-properties.md
similarity index 56%
rename from site/src/site/sphinx/en/arthas-properties.md
rename to site-vuepress/docs/en/doc/arthas-properties.md
index 9f3a5a7f7..65e2168bc 100644
--- a/site/src/site/sphinx/en/arthas-properties.md
+++ b/site-vuepress/docs/en/doc/arthas-properties.md
@@ -1,14 +1,15 @@
-Arthas Properties
-===
+# Arthas Properties
The `arthas.properties` file is in the arthas directory.
-* If it is automatically downloaded arthas, the directory is under `~/.arthas/lib/3.x.x/arthas/`
-* If it is a downloaded complete package, under the decompression directory of arthas
+- If it is automatically downloaded arthas, the directory is under `~/.arthas/lib/3.x.x/arthas/`
+- If it is a downloaded complete package, under the decompression directory of arthas
## Supported configuration items
-> Note that the configuration must be `camel case`, which is different from the `-` style of spring boot. Only the spring boot application supports both `camel case` and `-` style configuration.
+::: warning
+Note that the configuration must be `camel case`, which is different from the `-` style of spring boot. Only the spring boot application supports both `camel case` and `-` style configuration.
+:::
```
#arthas.config.overrideAll=true
@@ -24,16 +25,18 @@ arthas.sessionTimeout=1800
#arthas.agentId=mmmmmmyiddddd
```
+- If the configuration of `arthas.telnetPort` is -1, the telnet port will not be listened. `arthas.httpPort` is similar.
+- If you configure `arthas.telnetPort` to 0, then random listen telnet port, you can find the random port log in `~/logs/arthas/arthas.log`. `arthas.httpPort` is similar.
-* If the configuration of `arthas.telnetPort` is -1, the telnet port will not be listened. `arthas.httpPort` is similar.
-* If you configure `arthas.telnetPort` to 0, then random listen telnet port, you can find the random port log in `~/logs/arthas/arthas.log`. `arthas.httpPort` is similar.
-
-> If you want to prevent multiple arthas port conflicts on a machine. It can be configured as a random port, or configured as -1, and use arthas through the tunnel server.
-
+::: tip
+If you want to prevent multiple arthas port conflicts on a machine. It can be configured as a random port, or configured as -1, and use arthas through the tunnel server.
+:::
### disable specify commands
-> since 3.5.2
+::: tip
+since 3.5.2
+:::
Such as configuration:
@@ -43,8 +46,9 @@ arthas.disabledCommands=stop,dump
It can also be configured on the command line: `--disabled-commands stop,dump`.
-> By default, arthas-spring-boot-starter will disable the `stop` command.
-
+::: tip
+By default, arthas-spring-boot-starter will disable the `stop` command.
+:::
## Configured order
@@ -52,9 +56,7 @@ The order of configuration is: command line parameters > System Env > System Pro
such as:
-* `./as.sh --telnet-port 9999` command line configuration will overwrite the default value `arthas.telnetPort=3658` in `arthas.properties`.
-* If the application itself sets system properties `arthas.telnetPort=8888`, it will override the default value `arthas.telnetPort=3658` in `arthas.properties`.
+- `./as.sh --telnet-port 9999` command line configuration will overwrite the default value `arthas.telnetPort=3658` in `arthas.properties`.
+- If the application itself sets system properties `arthas.telnetPort=8888`, it will override the default value `arthas.telnetPort=3658` in `arthas.properties`.
If you want `arthas.properties` to have the highest order, you can configure `arthas.config.overrideAll=true`.
-
-
diff --git a/site/src/site/sphinx/en/async.md b/site-vuepress/docs/en/doc/async.md
similarity index 79%
rename from site/src/site/sphinx/en/async.md
rename to site-vuepress/docs/en/doc/async.md
index ca5970000..145928410 100644
--- a/site/src/site/sphinx/en/async.md
+++ b/site-vuepress/docs/en/doc/async.md
@@ -1,26 +1,23 @@
-Arthas Async Jobs
-===
+# Arthas Async Jobs
[`Async Jobs` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=case-async-jobs)
Asynchronous jobs in arthas. The idea is borrowed from [linux jobs](http://man7.org/linux/man-pages/man1/jobs.1p.html).
-
## 1. Use & to run the command in the background
For example, execute the trace command in the background:
```bash
-trace Test t &
+trace Test t &
```
-By doing this, the current command is put to the background to run, you can continue to execute other commands in the console.
+By doing this, the current command is put to the background to run, you can continue to execute other commands in the console.
## 2. List background jobs
If you want to list all background jobs, you can execute the `jobs` command and the results are as follows:
-
```bash
$ jobs
[10]*
@@ -33,24 +30,24 @@ $ jobs
You can see that there is currently a background job executing:
-* job id is 10, `*` indicates that this job is created by the current session.
-* status is `Stopped`
-* execution count is the number of executions, which have been executed 19 times since the start.
-* timeout date: timeout timestamp, when the time exceeds this timestamp, the job will be automatically timeout and exit.
+- job id is 10, `*` indicates that this job is created by the current session.
+- status is `Stopped`
+- execution count is the number of executions, which have been executed 19 times since the start.
+- timeout date: timeout timestamp, when the time exceeds this timestamp, the job will be automatically timeout and exit.
## 3. Suspend and cancel job
When the job is executing in the foreground, for example, directly executing the command `trace Test t`, or executing the background job command `trace Test t &`, then putting the job back to the foreground via `fg` command, the console cannot continue to execute other command, but can receive and process the following keyboard events:
-* ‘ctrl + z’: Suspends the job, the job status will change to `Stopped`, and the job can be restarted by `bg ` or `fg `
-* ‘ctrl + c’: Stops the job
-* ‘ctrl + d’: According to linux semantics this should lead to exit the terminal, right now Arthas has not implemented this yet, therefore simply ignore this keystroke.
+- ‘ctrl + z’: Suspends the job, the job status will change to `Stopped`, and the job can be restarted by `bg ` or `fg `
+- ‘ctrl + c’: Stops the job
+- ‘ctrl + d’: According to linux semantics this should lead to exit the terminal, right now Arthas has not implemented this yet, therefore simply ignore this keystroke.
## 4. fg/bg, switch the job from the foreground to the background, and vise verse
-* When a job is executed in the background or in suspended status (use `ctrl + z` to suspend job), `fg ` can transfer the job to the foreground to continue to run.
-* When a job is in suspended status (use `ctrl + z` to suspend job), `bg ` can put the job to the background to continue to run.
-* A job created by other session can only be put to the foreground to run by using `fg` in the current session.
+- When a job is executed in the background or in suspended status (use `ctrl + z` to suspend job), `fg ` can transfer the job to the foreground to continue to run.
+- When a job is in suspended status (use `ctrl + z` to suspend job), `bg ` can put the job to the background to continue to run.
+- A job created by other session can only be put to the foreground to run by using `fg` in the current session.
## 5. Redirect the output
@@ -78,6 +75,6 @@ If you want to stop background job, just `kill `.
## 7. Others
-* Support up to 8 commands at the same time to redirect the output to the log files.
-* Do not open too many background jobs at the same time to avoid negative performance effect to the target JVM.
-* If you do not want to stop the Arthas service and continue to perform background tasks, you can exit the Arthas console by executing `quit` command (`stop` command will stop the Arthas service)
+- Support up to 8 commands at the same time to redirect the output to the log files.
+- Do not open too many background jobs at the same time to avoid negative performance effect to the target JVM.
+- If you do not want to stop the Arthas service and continue to perform background tasks, you can exit the Arthas console by executing `quit` command (`stop` command will stop the Arthas service)
diff --git a/site/src/site/sphinx/en/auth.md b/site-vuepress/docs/en/doc/auth.md
similarity index 81%
rename from site/src/site/sphinx/en/auth.md
rename to site-vuepress/docs/en/doc/auth.md
index 5b11af66d..ceac8ee9e 100644
--- a/site/src/site/sphinx/en/auth.md
+++ b/site-vuepress/docs/en/doc/auth.md
@@ -1,7 +1,8 @@
-auth
-===
+# auth
-> Authenticates the current session
+::: tip
+Authenticates the current session
+:::
### Configure username and password
@@ -11,20 +12,22 @@ When attaching, you can specify a password on the command line. such as:
java -jar arthas-boot.jar --password ppp
```
-* The user can be specified by the `--username` option, the default value is `arthas`.
-* You can also configure username/password in `arthas.properties`. The priority of the command line is higher than that of the configuration file.
-* If only `username` is configured and no `password` is configured, a random password will be generated and printed in `~/logs/arthas/arthas.log`
+- The user can be specified by the `--username` option, the default value is `arthas`.
+- You can also configure username/password in `arthas.properties`. The priority of the command line is higher than that of the configuration file.
+- If only `username` is configured and no `password` is configured, a random password will be generated and printed in `~/logs/arthas/arthas.log`
```
Using generated security password: 0vUBJpRIppkKuZ7dYzYqOKtranj4unGh
```
### Local connection does not require authentication
+
By default, there are configurations in the `arthas.properties` file:
```
arthas.localConnectionNonAuth=true
```
+
When the password is configured, connect from localhost, the authentication is not required. The default configuration value is true, which is convenient for local connection. Authentication is only required when connecting remotely.
### Authenticate in the telnet console
@@ -43,7 +46,7 @@ Use the `auth` command to authenticate, and you can execute other commands after
Authentication result: true
```
-* The user can be specified by the `--username` option, the default value is `arthas`.
+- The user can be specified by the `--username` option, the default value is `arthas`.
### Web console Authentication
@@ -57,14 +60,14 @@ After success, you can directly connect to the web console.
Arthas uses the HTTP standard Basic Authorization.
-* Reference: [https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)
+- Reference: [https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)
For example, if the user name is: `admin` and the password is `admin`, the combination is a string: `admin:admin`, the base64 result is: `YWRtaW46YWRtaW4=`, then the HTTP request adds the `Authorization` header:
```bash
curl 'http://localhost:8563/api' \
-H 'Authorization: Basic YWRtaW46YWRtaW4=' \
- --data-raw '{"action":"exec","command":"version"}'
+ --data-raw '{"action":"exec","command":"version"}'
```
#### URL parameters
@@ -73,5 +76,5 @@ It supports passing username and password in parameters. such as:
```bash
curl 'http://localhost:8563/api?password=admin' \
- --data-raw '{"action":"exec","command":"version"}'
-```
\ No newline at end of file
+ --data-raw '{"action":"exec","command":"version"}'
+```
diff --git a/site/src/site/sphinx/en/base64.md b/site-vuepress/docs/en/doc/base64.md
similarity index 86%
rename from site/src/site/sphinx/en/base64.md
rename to site-vuepress/docs/en/doc/base64.md
index cd85bdb50..fff7d2810 100644
--- a/site/src/site/sphinx/en/base64.md
+++ b/site-vuepress/docs/en/doc/base64.md
@@ -1,9 +1,8 @@
-base64
-===
-
-
-> Encode and decode using Base64 representation.
+# base64
+::: tip
+Encode and decode using Base64 representation.
+:::
### Encode to base64
diff --git a/site/src/site/sphinx/en/batch-support.md b/site-vuepress/docs/en/doc/batch-support.md
similarity index 81%
rename from site/src/site/sphinx/en/batch-support.md
rename to site-vuepress/docs/en/doc/batch-support.md
index 0afca2df5..0a2ea7aed 100644
--- a/site/src/site/sphinx/en/batch-support.md
+++ b/site-vuepress/docs/en/doc/batch-support.md
@@ -1,5 +1,4 @@
-Batch Processing
-================
+# Batch Processing
With the help of Batch Processing, you can run multiple commands in batch and get the final result at the end.
@@ -19,10 +18,11 @@ sc -d org.apache.commons.lang.StringUtils
```
Note:
-* Each command takes one line.
-* Batch mode execution times (via `-n`) must be explicitly specified for `dashboard`, otherwise batch script cannot terminate.
-* Commands such as `watch`/`tt`/`trace`/`monitor`/`stack` should include `-n` option to ensure the script can be able to quit.
-* Also consider to use `async` (for example: `watch c.t.X test returnObj > &`) to put commands run at background and get the output from the log file, see more from [asynchronous job](async.md)
+
+- Each command takes one line.
+- Batch mode execution times (via `-n`) must be explicitly specified for `dashboard`, otherwise batch script cannot terminate.
+- Commands such as `watch`/`tt`/`trace`/`monitor`/`stack` should include `-n` option to ensure the script can be able to quit.
+- Also consider to use `async` (for example: `watch c.t.X test returnObj > &`) to put commands run at background and get the output from the log file, see more from [asynchronous job](async.md)
#### Step 2: Run the script
diff --git a/site/src/site/sphinx/en/cat.md b/site-vuepress/docs/en/doc/cat.md
similarity index 72%
rename from site/src/site/sphinx/en/cat.md
rename to site-vuepress/docs/en/doc/cat.md
index aaca771ca..12794a525 100644
--- a/site/src/site/sphinx/en/cat.md
+++ b/site-vuepress/docs/en/doc/cat.md
@@ -1,11 +1,11 @@
-cat
-===
+# cat
[`cat` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-cat)
-> Concatenate and print files
-
+::: tip
+Concatenate and print files
+:::
```bash
$ cat /tmp/a.txt
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/classloader.md b/site-vuepress/docs/en/doc/classloader.md
similarity index 76%
rename from site/src/site/sphinx/en/classloader.md
rename to site-vuepress/docs/en/doc/classloader.md
index e26770377..9aa0df93e 100644
--- a/site/src/site/sphinx/en/classloader.md
+++ b/site-vuepress/docs/en/doc/classloader.md
@@ -1,23 +1,24 @@
-classloader
-===========
+# classloader
[`classloader` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-classloader)
+::: tip
View hierarchy, urls and classes-loading info for the class-loaders.
+:::
`classloader` can search and print out the URLs for a specified resource from one particular classloader. It is quite handy when analyzing `ResourceNotFoundException`.
### Options
-|Name|Specification|
-|---:|:---|
-|[l]|list all classloader instances|
-|[t]|print classloader's hierarchy|
-|[a]|list all the classes loaded by all the classloaders (use it with great caution since the output can be huge)|
-|[c:]|print classloader's hashcode|
-|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. |
-|`[c: r:]`|using ClassLoader to search resource|
-|`[c: load:]`|using ClassLoader to load class|
+| Name | Specification |
+| --------------------: | :----------------------------------------------------------------------------------------------------------- |
+| [l] | list all classloader instances |
+| [t] | print classloader's hierarchy |
+| [a] | list all the classes loaded by all the classloaders (use it with great caution since the output can be huge) |
+| [c:] | print classloader's hashcode |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| `[c: r:]` | using ClassLoader to search resource |
+| `[c: load:]` | using ClassLoader to load class |
### Usage
@@ -124,7 +125,9 @@ load class success.
#### Statistics ClassLoader actually used URLs and unused URLs
-> Note that statistics are based on all classes currently loaded by the JVM. Does not mean that `Unused URLs` can be removed from the application. Because it may be necessary to load classes from `Unused URLs` in the future, or to load `resources`.
+::: warning
+Note that statistics are based on all classes currently loaded by the JVM. Does not mean that `Unused URLs` can be removed from the application. Because it may be necessary to load classes from `Unused URLs` in the future, or to load `resources`.
+:::
```
$ classloader --url-stat
diff --git a/site-vuepress/docs/en/doc/cls.md b/site-vuepress/docs/en/doc/cls.md
new file mode 100644
index 000000000..13aa05b56
--- /dev/null
+++ b/site-vuepress/docs/en/doc/cls.md
@@ -0,0 +1,7 @@
+# cls
+
+clear current console.
+
+::: tip
+if not in tty mode,it will warn "Command 'cls' is only support tty session.".
+:::
diff --git a/site-vuepress/docs/en/doc/commands.md b/site-vuepress/docs/en/doc/commands.md
new file mode 100644
index 000000000..7988230cd
--- /dev/null
+++ b/site-vuepress/docs/en/doc/commands.md
@@ -0,0 +1,56 @@
+# All Commands
+
+- [dashboard](dashboard.md)
+- [thread](thread.md)
+- [jvm](jvm.md)
+- [memory](memory.md)
+- [sysprop](sysprop.md)
+- [sysenv](sysenv.md)
+- [vmoption](vmoption.md)
+- [perfcounter](perfcounter.md)
+- [logger](logger.md)
+- [mbean](mbean.md)
+- [getstatic](getstatic.md)
+
+- [ognl](ognl.md)
+
+- [sc](sc.md)
+- [sm](sm.md)
+- [dump](dump.md)
+- [heapdump](heapdump.md)
+- [vmtool](vmtool.md)
+
+- [jad](jad.md)
+- [classloader](classloader.md)
+- [mc](mc.md)
+- [retransform](retransform.md)
+- [redefine](redefine.md)
+
+- [monitor](monitor.md)
+- [watch](watch.md)
+- [trace](trace.md)
+- [stack](stack.md)
+- [tt](tt.md)
+
+- [profiler](profiler.md)
+
+- [cat](cat.md)
+- [echo](echo.md)
+- [grep](grep.md)
+- [base64](base64.md)
+- [tee](tee.md)
+- [pwd](pwd.md)
+- [auth](auth.md)
+- [options](options.md)
+
+### Basic Arthas Commands
+
+- [help](help.md) - examines help information
+- [cls](cls.md) - clears out the screen
+- [session](session.md) - examines the current session
+- [reset](reset.md) - resets enhanced classes. All enhanced classes will be reset to their original states. When Arthas server closes, all these enhanced classes will be reset too
+- [version](version.md) - prints out Arthas's version
+- [history](history.md) - view command history
+- [quit](quit.md) - exit the current Arthas client without affecting other clients
+- [stop](stop.md) - terminates the Arthas server, all the Arthas clients connecting to this server will be disconnected
+- [keymap](keymap.md) - lists all Arthas keyboard shortcuts and shortcut customizations.
diff --git a/site/src/site/sphinx/en/contact-us.md b/site-vuepress/docs/en/doc/contact-us.md
similarity index 63%
rename from site/src/site/sphinx/en/contact-us.md
rename to site-vuepress/docs/en/doc/contact-us.md
index 3720bbcb0..ec6f39ecb 100644
--- a/site/src/site/sphinx/en/contact-us.md
+++ b/site-vuepress/docs/en/doc/contact-us.md
@@ -1,24 +1,18 @@
-Contact Us
-===
-
+# Contact Us
### Issues
Questions about how to use Arthas and opinions can be directly raised in issues: [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
-
### DingDing Group
-* Arthas open source discussion Group: 21965291 ,You can join by searching for group number。
-
-
-
-
-* Arthas open source discussion Group 2: 30707824 ,You can join by searching for group number。
+- Arthas open source discussion Group: 21965291 ,You can join by searching for group number。
-
+
+- Arthas open source discussion Group 2: 30707824 ,You can join by searching for group number。
+
### Instructions for Installing DingTalk
@@ -26,19 +20,14 @@ DingTalk can be downloaded from: [https://www.dingtalk.com/en](https://page.ding
After installing you can search for group number and join it.
-
-
-
-
+
### QQ Group
Arthas open source discussion QQ group:916328269
-
-
+
Arthas open source discussion QQ group2:854625984
-
-
+
diff --git a/site/src/site/sphinx/en/dashboard.md b/site-vuepress/docs/en/doc/dashboard.md
similarity index 68%
rename from site/src/site/sphinx/en/dashboard.md
rename to site-vuepress/docs/en/doc/dashboard.md
index 84589cefa..2b8fc2e2b 100644
--- a/site/src/site/sphinx/en/dashboard.md
+++ b/site-vuepress/docs/en/doc/dashboard.md
@@ -1,18 +1,19 @@
-dashboard
-=========
+# dashboard
[`dashboard` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-dashboard)
-> This is the real time statistics dashboard for the current system, press `Ctrl+C` to exit.
+::: tip
+This is the real time statistics dashboard for the current system, press `Ctrl+C` to exit.
+:::
-When running in Apache Tomcat Alibaba edition, the dashboard will also present the real time statistics of the tomcat, including [QPS](https://en.wikipedia.org/wiki/Queries_per_second), RT, error counts, and thread pool, etc.
+When running in Apache Tomcat Alibaba edition, the dashboard will also present the real time statistics of the tomcat, including [QPS](https://en.wikipedia.org/wiki/Queries_per_second), RT, error counts, and thread pool, etc.
### Options
-|Name|Specification|
-|---:|:---|
-|[i:]|The interval (in ms) between two executions, default is 5000 ms.|
-|[n:]|The number of times this command will be executed.|
+| Name | Specification |
+| ---: | :--------------------------------------------------------------- |
+| [i:] | The interval (in ms) between two executions, default is 5000 ms. |
+| [n:] | The number of times this command will be executed. |
### Usage
@@ -53,36 +54,36 @@ uptime 272s
### Notes on column headers
-* ID: JVM thread ID, pls. note this ID is different from the nativeID in jstack
-* NAME: thread name
-* GROUP: thread group name
-* PRIORITY: thread priority, ranged from 1 to 10. The greater number, the higher priority
-* STATE: thread state
-* CPU%: the ratio of CPU usage for the thread. For example, the sampling interval is 1000ms, and the incremental cpu time
- of a thread is 100ms, then the cpu usage rate=100/1000=10%
-* DELTA_TIME: incremental CPU time of thread running after the last sampling in `second` format
-* TIME: total CPU time of the thread in `minute:second` format
-* INTERRUPTED: the thread interruption state
-* DAEMON: daemon thread or not
-
+- ID: JVM thread ID, pls. note this ID is different from the nativeID in jstack
+- NAME: thread name
+- GROUP: thread group name
+- PRIORITY: thread priority, ranged from 1 to 10. The greater number, the higher priority
+- STATE: thread state
+- CPU%: the ratio of CPU usage for the thread. For example, the sampling interval is 1000ms, and the incremental cpu time
+ of a thread is 100ms, then the cpu usage rate=100/1000=10%
+- DELTA_TIME: incremental CPU time of thread running after the last sampling in `second` format
+- TIME: total CPU time of the thread in `minute:second` format
+- INTERRUPTED: the thread interruption state
+- DAEMON: daemon thread or not
#### JVM internal threads
+
After Java 8, it is supported to obtain the CPU time of JVM internal threads. These threads only have the name and CPU time,
- without ID and status information (display ID is -1).
-
+without ID and status information (display ID is -1).
+
JVM activities can be observed through internal threads, such as GC, JIT compilation, etc., to perceive the overall status of JVM.
-* When the JVM heap/metaspace space is insufficient or OOM, it can be seen that the CPU usage of the GC threads is
- significantly higher than other threads.
-* After executing commands such as `trace/watch/tt/redefine`, you can see that JIT threads activities become more frequent.
- Because the JIT compilation data related to this class is cleared when the JVM hot update the class bytecode, it needs to be recompiled.
+- When the JVM heap/metaspace space is insufficient or OOM, it can be seen that the CPU usage of the GC threads is
+ significantly higher than other threads.
+- After executing commands such as `trace/watch/tt/redefine`, you can see that JIT threads activities become more frequent.
+ Because the JIT compilation data related to this class is cleared when the JVM hot update the class bytecode, it needs to be recompiled.
JVM internal threads include the following:
-* JIT compilation thread: such as `C1 CompilerThread0`, `C2 CompilerThread0`
-* GC thread: such as `GC Thread0`, `G1 Young RemSet Sampling`
-* Other internal threads: such as`VM Periodic Task Thread`, `VM Thread`, `Service Thread`
+- JIT compilation thread: such as `C1 CompilerThread0`, `C2 CompilerThread0`
+- GC thread: such as `GC Thread0`, `G1 Young RemSet Sampling`
+- Other internal threads: such as`VM Periodic Task Thread`, `VM Thread`, `Service Thread`
### Screenshot
-
+
diff --git a/site/src/site/sphinx/en/docker.md b/site-vuepress/docs/en/doc/docker.md
similarity index 67%
rename from site/src/site/sphinx/en/docker.md
rename to site-vuepress/docs/en/doc/docker.md
index f42faecba..194918a74 100644
--- a/site/src/site/sphinx/en/docker.md
+++ b/site-vuepress/docs/en/doc/docker.md
@@ -1,6 +1,4 @@
-Docker
-===
-
+# Docker
## Use JDK in Docker
@@ -8,7 +6,7 @@ Many times, the problem that arthas can't work with the application in docker is
### Use public JDK image
-* https://hub.docker.com/_/openjdk/
+- https://hub.docker.com/_/openjdk/
such as:
@@ -55,43 +53,42 @@ ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/
RUN export JAVA_HOME
```
-
## Quick start with Docker
1. Delete the existing `math-game` docker container (not necessary)
- ```sh
- $ docker stop math-game || true && docker rm math-game || true
- ```
+ ```sh
+ $ docker stop math-game || true && docker rm math-game || true
+ ```
1. Start `math-game`
- ```sh
- $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar"
- ```
+ ```sh
+ $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar"
+ ```
1. Start `arthas-boot` for diagnosis
- ```sh
- $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
- * [1]: 9 jar
+ ```sh
+ $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
+ * [1]: 9 jar
- [INFO] arthas home: /opt/arthas
- [INFO] Try to attach process 9
- [INFO] Attach process 9 success.
- [INFO] arthas-client connect 127.0.0.1 3658
- ,---. ,------. ,--------.,--. ,--. ,---. ,---.
- / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
- | .-. || '--'.' | | | .--. || .-. |`. `-.
- | | | || |\ \ | | | | | || | | |.-' |
- `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
+ [INFO] arthas home: /opt/arthas
+ [INFO] Try to attach process 9
+ [INFO] Attach process 9 success.
+ [INFO] arthas-client connect 127.0.0.1 3658
+ ,---. ,------. ,--------.,--. ,--. ,---. ,---.
+ / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
+ | .-. || '--'.' | | | .--. || .-. |`. `-.
+ | | | || |\ \ | | | | | || | | |.-' |
+ `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
- wiki: https://arthas.aliyun.com/doc
- version: 3.0.5
- pid: 9
- time: 2018-12-18 11:30:36
- ```
+ wiki: https://arthas.aliyun.com/doc
+ version: 3.0.5
+ pid: 9
+ time: 2018-12-18 11:30:36
+ ```
## Diagnose the Java process in Docker
@@ -118,4 +115,4 @@ COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
If you want to specify a version, you can view all the tags:
-[https://hub.docker.com/r/hengyunabc/arthas/tags](https://hub.docker.com/r/hengyunabc/arthas/tags)
\ No newline at end of file
+[https://hub.docker.com/r/hengyunabc/arthas/tags](https://hub.docker.com/r/hengyunabc/arthas/tags)
diff --git a/site/src/site/sphinx/en/download.md b/site-vuepress/docs/en/doc/download.md
similarity index 98%
rename from site/src/site/sphinx/en/download.md
rename to site-vuepress/docs/en/doc/download.md
index 50d1b9a6d..7626e66cb 100644
--- a/site/src/site/sphinx/en/download.md
+++ b/site-vuepress/docs/en/doc/download.md
@@ -1,5 +1,4 @@
-Download
-===
+# Download
## Download full package
@@ -7,7 +6,6 @@ Download
Latest Version, Click To Download: [](https://arthas.aliyun.com/download/latest_version)
-
### Download from Github Releases
[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases)
@@ -43,4 +41,3 @@ java -jar arthas-boot.jar -h
## Download Offline Help Documentation
Latest Version Documentation, Click To Download:[](https://arthas.aliyun.com/download/doc/latest_version)
-
diff --git a/site/src/site/sphinx/en/dump.md b/site-vuepress/docs/en/doc/dump.md
similarity index 64%
rename from site/src/site/sphinx/en/dump.md
rename to site-vuepress/docs/en/doc/dump.md
index a4b92465f..d3c0a8791 100644
--- a/site/src/site/sphinx/en/dump.md
+++ b/site-vuepress/docs/en/doc/dump.md
@@ -1,19 +1,20 @@
-dump
-===
+# dump
[`dump` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-dump)
-> Dump the bytecode for the particular classes to the specified directory.
+::: tip
+Dump the bytecode for the particular classes to the specified directory.
+:::
### Options
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|class name pattern|
-|`[c:]`|hashcode of the [class loader](classloader.md) that loaded the target class|
-|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. |
-|`[d:]`|set the destination directory for class files|
-|`[E]`|turn on regex match, the default behavior is wild card match|
+| Name | Specification |
+| --------------------: | :-------------------------------------------------------------------------- |
+| _class-pattern_ | class name pattern |
+| `[c:]` | hashcode of the [class loader](classloader.md) that loaded the target class |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| `[d:]` | set the destination directory for class files |
+| `[E]` | turn on regex match, the default behavior is wild card match |
### Usage
@@ -39,7 +40,7 @@ $ dump -d /tmp/output java.lang.String
Affect(row-cnt:1) cost in 138 ms.
```
-* Specify classLoader
+- Specify classLoader
Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader.
@@ -59,6 +60,6 @@ $ dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.*
Affect(row-cnt:1) cost in 39 ms.
```
- * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8.
+- PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8.
The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic.
diff --git a/site/src/site/sphinx/en/echo.md b/site-vuepress/docs/en/doc/echo.md
similarity index 67%
rename from site/src/site/sphinx/en/echo.md
rename to site-vuepress/docs/en/doc/echo.md
index fe37cc077..63335bbcd 100644
--- a/site/src/site/sphinx/en/echo.md
+++ b/site-vuepress/docs/en/doc/echo.md
@@ -1,11 +1,11 @@
-echo
-===
+# echo
[`echo` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-echo)
-> write arguments to the standard output.
-
+::: tip
+write arguments to the standard output.
+:::
```bash
$ echo 'hello'
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/faq.md b/site-vuepress/docs/en/doc/faq.md
similarity index 88%
rename from site/src/site/sphinx/en/faq.md
rename to site-vuepress/docs/en/doc/faq.md
index b9e82384e..df4f9ef21 100644
--- a/site/src/site/sphinx/en/faq.md
+++ b/site-vuepress/docs/en/doc/faq.md
@@ -1,17 +1,17 @@
-## FAQ
-
-
-> For questions that are not in this list, please search in issues. [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
+# FAQ
+::: tip
+For questions that are not in this list, please search in issues. [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
+:::
##### Where is the log file?
Log file path: `~/logs/arthas/arthas.log`
+
##### How much impact does Arthas attach have on the performance of the original process?
[https://github.com/alibaba/arthas/issues/44](https://github.com/alibaba/arthas/issues/44)
-
##### target process not responding or HotSpot VM not loaded
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
@@ -19,8 +19,7 @@ com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: ta
1. Check whether the current user and the target java process are consistent. If they are inconsistent, switch to the same user. JVM can only attach java processes under the same user.
2. Try to use `jstack -l $pid`. If the process does not respond, it means that the process may freeze and fail to respond to the JVM attach signal. So Arthas based on the attach mechanism cannot work. Try to use `jmap` heapdump to analyze.
3. Try to attach math-game in [quick-start](quick-start.md).
-4. For more information: [https://github.com/alibaba/arthas/issues/347](https://github.com/alibaba/arthas/issues/347)
-
+4. For more information: [https://github.com/alibaba/arthas/issues/347](https://github.com/alibaba/arthas/issues/347)
##### Can commands such as trace/watch enhance the classes in jdk?
@@ -32,7 +31,9 @@ options unsafe true
See more at [options](options.md)
-> To support the jars appended by java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch need to enable unsafe.
+::: tip
+To support the jars appended by java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch need to enable unsafe.
+:::
##### How to view the result in `json` format
@@ -42,7 +43,6 @@ options json-format true
See more at [options](options.md)
-
##### Can arthas trace native methods
No.
@@ -52,7 +52,6 @@ No.
1. You can use [`vmtool`](vmtool.md) command.
2. You can use some tricks to intercept the object with the [`tt`](tt.md) command, or fetch it from a static method.
-
##### How to filter method with the same name?
You can used all variables in [fundamental fields in expressions](advice-class.md) for the condition express to filter method with the same name, you can use the number of parameters `params.length ==1`,parameter type `params[0] instanceof java.lang.Integer`,return value type `returnObj instanceof java.util.List` and so on in one or more combinations as condition express.
@@ -63,7 +62,7 @@ example [math-game](quick-start.md)
```bash
watch demo.MathGame primeFactors '{params,returnObj,throwExp}' 'params.length >0 && returnObj instanceof java.util.List' -v
-```
+```
##### How to watch or trace constructor?
@@ -77,7 +76,7 @@ In the JVM specification the name of inner classes is `OuterClass$InnerClass`.
```bash
watch OuterClass$InnerClass
-````
+```
##### Enter Unicode characters
@@ -85,7 +84,7 @@ Convert Unicode characters to `\u` representation:
```bash
ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")'
-````
+```
##### java.lang.ClassFormatError: null, skywalking arthas compatible use
@@ -93,12 +92,10 @@ When error log appear `java.lang.ClassFormatError: null`, it is usually modified
For example: use skywalking V8.1.0 below [cannot trace, watch classes enhanced by skywalking agent](https://github.com/alibaba/arthas/issues/1141), V8.1.0 or above is compatible, refer to skywalking configuration for more details. [skywalking compatible with other javaagent bytecode processing](https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md#).
-
#### class redefinition failed: attempted to change the schema (add/remove fields)
Reference: [https://github.com/alibaba/arthas/issues/2165](https://github.com/alibaba/arthas/issues/2165)
-
##### Can I use arthas offline?
Yes. Just download the full size package and unzip it, refer to: [Download](download.md).
@@ -107,9 +104,8 @@ Yes. Just download the full size package and unzip it, refer to: [Download](down
Reference: [https://github.com/alibaba/arthas/issues/362#issuecomment-448185416](https://github.com/alibaba/arthas/issues/362#issuecomment-448185416)
-
##### Why is the new version of Arthas downloaded, but the old version is connected?
-For example, the started version of `as.sh/arthas-boot.jar` is 3.5.*, but after connecting, the printed arthas version is 3.4.*.
+For example, the started version of `as.sh/arthas-boot.jar` is 3.5._, but after connecting, the printed arthas version is 3.4._.
-It may be that the target process has been diagnosed with the old version of arthas before. You can execute `stop` to stop the old version of arthas, and then reuse the new version to attach.
\ No newline at end of file
+It may be that the target process has been diagnosed with the old version of arthas before. You can execute `stop` to stop the old version of arthas, and then reuse the new version to attach.
diff --git a/site/src/site/sphinx/en/getstatic.md b/site-vuepress/docs/en/doc/getstatic.md
similarity index 84%
rename from site/src/site/sphinx/en/getstatic.md
rename to site-vuepress/docs/en/doc/getstatic.md
index 1e3b77710..ba49c348f 100644
--- a/site/src/site/sphinx/en/getstatic.md
+++ b/site-vuepress/docs/en/doc/getstatic.md
@@ -1,9 +1,8 @@
-getstatic
-=========
+# getstatic
[`getstatic` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-getstatic)
-* It is recommended to use the [OGNL] (ognl.md) command, which will be more flexible.
+- It is recommended to use the [OGNL] (ognl.md) command, which will be more flexible.
Check the static fields of classes conveniently, the usage is `getstatic class_name field_name`.
@@ -29,7 +28,7 @@ field: random
]
```
-* Specify classLoader
+- Specify classLoader
Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader using `sc -d `.
@@ -43,15 +42,14 @@ For classloader with only one instance, it can be specified by `--classLoaderCla
`getstatic --classLoaderClass demo.MathGame random`
- * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8.
+- PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8.
The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic.
Tip: if the static field is a complex class, you can even use [`OGNL`](https://commons.apache.org/proper/commons-ognl/language-guide.html) to traverse, filter and access the inner properties of this class.
-* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
-* [Special usages](https://github.com/alibaba/arthas/issues/71)
-
+- [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+- [Special usages](https://github.com/alibaba/arthas/issues/71)
E.g. suppose `n` is a `Map` and its key is a `Enum`, then you can achieve this if you want to pick the key with a specific `Enum` value:
diff --git a/site/src/site/sphinx/en/grep.md b/site-vuepress/docs/en/doc/grep.md
similarity index 96%
rename from site/src/site/sphinx/en/grep.md
rename to site-vuepress/docs/en/doc/grep.md
index 771a27c84..47cb2375e 100644
--- a/site/src/site/sphinx/en/grep.md
+++ b/site-vuepress/docs/en/doc/grep.md
@@ -1,10 +1,10 @@
-grep
-===
+# grep
[`grep` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-grep)
-> Similar to the traditional `grep` command.
-
+::: tip
+Similar to the traditional `grep` command.
+:::
```
USAGE:
@@ -36,4 +36,4 @@ grep
-e, --regex Enable regular expression to match
--trim-end Remove whitespaces at the end of the line
Pattern
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/groovy.md b/site-vuepress/docs/en/doc/groovy.md
similarity index 84%
rename from site/src/site/sphinx/en/groovy.md
rename to site-vuepress/docs/en/doc/groovy.md
index eb1dc16bb..627331446 100644
--- a/site/src/site/sphinx/en/groovy.md
+++ b/site-vuepress/docs/en/doc/groovy.md
@@ -1,7 +1,8 @@
-groovy
-===
+# groovy
-> Arthas support groovy scripting to allow user to use script like BTrace. It is possible to use if/for/switch/while in groovy scripting, but has more limitations compared to BTrace.
+::: tip
+Arthas support groovy scripting to allow user to use script like BTrace. It is possible to use if/for/switch/while in groovy scripting, but has more limitations compared to BTrace.
+:::
### Limitations
@@ -10,16 +11,16 @@ groovy
### Parameters
-|Parameter|Explanation|
-|---:|:---|
-|*class-pattern*|class name pattern|
-|*method-pattern*|method name pattern|
-|*script-filepath*|the absolute path of the groovy script|
-|[S]|match all sub classes|
-|[E]|enable regex match, the default is wildcard match|
+| Parameter | Explanation |
+| ----------------: | :------------------------------------------------ |
+| _class-pattern_ | class name pattern |
+| _method-pattern_ | method name pattern |
+| _script-filepath_ | the absolute path of the groovy script |
+| [S] | match all sub classes |
+| [E] | enable regex match, the default is wildcard match |
Note: the third parameter `script-filepath` must be the absolute path of the groovy script, for example `/tmp/test.groovy`. It is not recommended to use relative path, e.g. `./test.groovy`.
-
+
### Explanation on the important callbacks
```java
diff --git a/site/src/site/sphinx/en/heapdump.md b/site-vuepress/docs/en/doc/heapdump.md
similarity index 89%
rename from site/src/site/sphinx/en/heapdump.md
rename to site-vuepress/docs/en/doc/heapdump.md
index c01b2bd9a..91f7d82b1 100644
--- a/site/src/site/sphinx/en/heapdump.md
+++ b/site-vuepress/docs/en/doc/heapdump.md
@@ -1,10 +1,10 @@
-heapdump
-===
+# heapdump
[`heapdump` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-heapdump)
-> dump java heap in hprof binary format, like `jmap`.
-
+::: tip
+dump java heap in hprof binary format, like `jmap`.
+:::
### Usage
@@ -31,6 +31,3 @@ Heap dump file created
Dumping heap to /var/folders/my/wy7c9w9j5732xbkcyt1mb4g40000gp/T/heapdump2019-09-03-16-385121018449645518991.hprof...
Heap dump file created
```
-
-
-
diff --git a/site/src/site/sphinx/en/help.md b/site-vuepress/docs/en/doc/help.md
similarity index 96%
rename from site/src/site/sphinx/en/help.md
rename to site-vuepress/docs/en/doc/help.md
index bc0b48d6e..60269e3a7 100644
--- a/site/src/site/sphinx/en/help.md
+++ b/site-vuepress/docs/en/doc/help.md
@@ -1,9 +1,10 @@
-help
-===
+# help
show help message, the command can show all the commands that current Arthas server supports,or you can use the command to show the detail usage of another command.
-> [help command] equals [command -help],both is to show the detail usage of one command.
+::: tip
+[help command] equals [command -help],both is to show the detail usage of one command.
+:::
### Options
@@ -59,8 +60,8 @@ $ help
tee tee command for pipes.
profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profiler
stop Stop/Shutdown Arthas server and exit the console.
-
-
+
+
```
```bash
@@ -84,4 +85,3 @@ $ help
-i, --interval The interval (in ms) between two executions, default is 5000 ms.
-n, --number-of-execution The number of times this command will be executed.
```
-
diff --git a/site/src/site/sphinx/en/history.md b/site-vuepress/docs/en/doc/history.md
similarity index 66%
rename from site/src/site/sphinx/en/history.md
rename to site-vuepress/docs/en/doc/history.md
index 18a48eabe..084efff0d 100644
--- a/site/src/site/sphinx/en/history.md
+++ b/site-vuepress/docs/en/doc/history.md
@@ -1,9 +1,10 @@
-history
-===
+# history
view command history.
-> history of commands will persisted in a file named history, so the history command can show all the history commands of current Arthas server ,but not only history in current session.
+::: tip
+history of commands will persisted in a file named history, so the history command can show all the history commands of current Arthas server ,but not only history in current session.
+:::
### Options
@@ -28,4 +29,3 @@ $ history 3
$ history 3
1 history 3
```
-
diff --git a/site/src/site/sphinx/en/http-api.md b/site-vuepress/docs/en/doc/http-api.md
similarity index 68%
rename from site/src/site/sphinx/en/http-api.md
rename to site-vuepress/docs/en/doc/http-api.md
index af386f35c..1ff1ea905 100644
--- a/site/src/site/sphinx/en/http-api.md
+++ b/site-vuepress/docs/en/doc/http-api.md
@@ -1,5 +1,4 @@
-Http API
-========
+# Http API
[`Http API` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=case-http-api)
@@ -11,7 +10,6 @@ Telnet/WebConsole's output unstructured text data, Http API can provide
structured data and support more complex interactive functions, such as
a series of diagnostic operations in specific application scenarios.
-
#### Access address
The Http API address is: `http://ip:port/api`, the request parameters
@@ -22,7 +20,6 @@ Note: The telnet port `3658` has compatibility issues with the Chrome
browser. It is recommended to use the http port `8563` to access the
http api.
-
#### Request data format
```json
@@ -35,17 +32,18 @@ http api.
"execTimeout": "10000"
}
```
+
Request data format description:
-* `action` : The requested action/behavior, please refer to "Request
+- `action` : The requested action/behavior, please refer to "Request
Actions" for optional values.
-* `requestId` : Optional request ID, generated by the client.
-* `sessionId` : Arthas session ID, one-time command does not need to
- set the session ID.
-* `consumerId` : Arthas consumer ID, used for multi-person sharing
- sessions.
-* `command` : Arthas command line
-* `execTimeout` : Timeout for executing commands (ms), default value is 30000.
+- `requestId` : Optional request ID, generated by the client.
+- `sessionId` : Arthas session ID, one-time command does not need to
+ set the session ID.
+- `consumerId` : Arthas consumer ID, used for multi-person sharing
+ sessions.
+- `command` : Arthas command line
+- `execTimeout` : Timeout for executing commands (ms), default value is 30000.
Note: Different actions use different parameters. Set the parameters
according to the specific action.
@@ -54,33 +52,33 @@ according to the specific action.
Currently supported request actions are as follows:
-* `exec` : The command is executed synchronously, and the command
+- `exec` : The command is executed synchronously, and the command
results is returned after the command execution end or interrupted.
-* `async_exec` : The command is executed asynchronously, and the
- scheduling result of the command is returned immediately. The command
- execution result is obtained through `pull_results` action.
-* `interrupt_job` : To interrupt the foreground command of the session,
- similar to the function of Telnet `Ctrl + c`.
-* `pull_results` : Get the result of the command executed
- asynchronously, and execute it repeatedly in http long-polling mode.
-* `init_session` : Create new session.
-* `join_session` : Join the session, used to support multiple people
- sharing the same Arthas session.
-* `close_session` : Close the session.
+- `async_exec` : The command is executed asynchronously, and the
+ scheduling result of the command is returned immediately. The command
+ execution result is obtained through `pull_results` action.
+- `interrupt_job` : To interrupt the foreground command of the session,
+ similar to the function of Telnet `Ctrl + c`.
+- `pull_results` : Get the result of the command executed
+ asynchronously, and execute it repeatedly in http long-polling mode.
+- `init_session` : Create new session.
+- `join_session` : Join the session, used to support multiple people
+ sharing the same Arthas session.
+- `close_session` : Close the session.
#### Response status
The state attribute in the response indicates the request processing
state, and its value is as follows:
-* `SCHEDULED`: When the command is executed asynchronously, it means that
+- `SCHEDULED`: When the command is executed asynchronously, it means that
the job has been created, and may not be executed yet or is being
executed;
-* `SUCCEEDED`: The request is processed successfully (completed status);
-* `FAILED`: Request processing failed (completed status), usually
+- `SUCCEEDED`: The request is processed successfully (completed status);
+- `FAILED`: Request processing failed (completed status), usually
+ accompanied by a message explaining the reason;
+- `REFUSED`: The request is rejected (completed status), usually
accompanied by a message explaining the reason;
-* `REFUSED`: The request is rejected (completed status), usually
- accompanied by a message explaining the reason;
### One-time command
@@ -105,65 +103,69 @@ curl -Ss -XPOST http://localhost:8563/api -d '
}
'
```
+
The response is as follows:
```json
{
- "state" : "SUCCEEDED",
- "sessionId" : "ee3bc004-4586-43de-bac0-b69d6db7a869",
- "body" : {
- "results" : [
- {
- "type" : "version",
- "version" : "3.3.7",
- "jobId" : 5
- },
- {
- "jobId" : 5,
- "statusCode" : 0,
- "type" : "status"
- }
- ],
- "timeExpired" : false,
- "command" : "version",
- "jobStatus" : "TERMINATED",
- "jobId" : 5
- }
+ "state": "SUCCEEDED",
+ "sessionId": "ee3bc004-4586-43de-bac0-b69d6db7a869",
+ "body": {
+ "results": [
+ {
+ "type": "version",
+ "version": "3.3.7",
+ "jobId": 5
+ },
+ {
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
+ }
+ ],
+ "timeExpired": false,
+ "command": "version",
+ "jobStatus": "TERMINATED",
+ "jobId": 5
+ }
}
```
+
Response data format description:
-* `state`: Request processing status, refer to the description of
+- `state`: Request processing status, refer to the description of
"Response Status".
-* `sessionId `: Arthas session ID, one-time command to automatically
- create and destroy temporary sessions.
-* `body.jobId`: The job ID of the command, all output results of the
- same job are the same jobId.
-* `body.jobStatus`: The job status of the command.
-* `body.timeExpired`: Whether the job execution timed out.
-* `body/results`: Command execution results.
+- `sessionId `: Arthas session ID, one-time command to automatically
+ create and destroy temporary sessions.
+- `body.jobId`: The job ID of the command, all output results of the
+ same job are the same jobId.
+- `body.jobStatus`: The job status of the command.
+- `body.timeExpired`: Whether the job execution timed out.
+- `body/results`: Command execution results.
**Command result format description**
```json
- [{
- "type" : "version",
- "version" : "3.3.7",
- "jobId" : 5
- },
- {
- "jobId" : 5,
- "statusCode" : 0,
- "type" : "status"
- }]
-```
-
-* `type` : The command result type, except for the special ones such as
+[
+ {
+ "type": "version",
+ "version": "3.3.7",
+ "jobId": 5
+ },
+ {
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
+ }
+]
+```
+
+- `type` : The command result type, except for the special ones such as
`status`, the others remain the same as the Arthas command name.
Please refer to the section
"[Special command results](#special_command_results)".
-* `jobId` : The job ID of the command.
-* Other fields are the data of each different command.
+- `jobId` : The job ID of the command.
+- Other fields are the data of each different command.
Note: You can also use a one-time command to execute continuous output
commands such as watch/trace, but you can't interrupt the command
@@ -174,27 +176,25 @@ section.
Please try to deal with it in the following way:
-* Set a reasonable `execTimeout` to forcibly interrupt the command
+- Set a reasonable `execTimeout` to forcibly interrupt the command
execution after the timeout period is reached to avoid a long hang.
-* Use the `-n` parameter to specify a smaller number of executions.
-* Ensure the methods of the command matched can be successfully hit and
+- Use the `-n` parameter to specify a smaller number of executions.
+- Ensure the methods of the command matched can be successfully hit and
the `condition-express` is written correctly. If the `watch/trace` does
not hit, even if `-n 1` is specified, it will hang and wait until the
execution timeout.
-
-
### Session interaction
Users create and manage Arthas sessions, which are suitable for complex
interactive processes. The access process is as follows:
-* Create a session
-* Join the session (optional)
-* Pull command results
-* Execute a series of commands
-* Interrupt command execution
-* Close the session
+- Create a session
+- Join the session (optional)
+- Pull command results
+- Execute a series of commands
+- Interrupt command execution
+- Close the session
#### Create session
@@ -205,19 +205,20 @@ curl -Ss -XPOST http://localhost:8563/api -d '
}
'
```
+
Response result:
```json
{
- "sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
- "consumerId" : "5ae4e5fbab8b4e529ac404f260d4e2d1_1",
- "state" : "SUCCEEDED"
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "consumerId": "5ae4e5fbab8b4e529ac404f260d4e2d1_1",
+ "state": "SUCCEEDED"
}
```
+
The new session ID is: `b09f1353-202c-407b-af24-701b744f971e`, and
consumer ID is: `5ae4e5fbab8b4e529ac404f260d4e2d1_1`.
-
#### Join session
Specify the session ID to join, and the server will assign a new
@@ -234,15 +235,17 @@ curl -Ss -XPOST http://localhost:8563/api -d '
}
'
```
+
Response result:
```json
{
- "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
- "sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
- "state" : "SUCCEEDED"
+ "consumerId": "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "state": "SUCCEEDED"
}
```
+
The new consumer ID is `8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` .
#### Pull command results
@@ -255,7 +258,6 @@ you need to call `join_session` to allocate a new consumer.
Each consumer is allocated a cache queue separately, and the pull order
does not affect the content received by the consumer.
-
The request parameters require session ID and consumer ID:
```bash
@@ -286,42 +288,40 @@ The response content is as follows:
```json
{
- "body" : {
- "results" : [
- {
- "inputStatus" : "DISABLED",
- "jobId" : 0,
- "type" : "input_status"
- },
- {
- "type" : "message",
- "jobId" : 0,
- "message" : "Welcome to arthas!"
- },
- {
- "tutorials" : "https://arthas.aliyun.com/doc/arthas-tutorials.html",
- "time" : "2020-08-06 15:56:43",
- "type" : "welcome",
- "jobId" : 0,
- "pid" : "7909",
- "wiki" : "https://arthas.aliyun.com/doc",
- "version" : "3.3.7"
- },
- {
- "inputStatus" : "ALLOW_INPUT",
- "type" : "input_status",
- "jobId" : 0
- }
- ]
- },
- "sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
- "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
- "state" : "SUCCEEDED"
+ "body": {
+ "results": [
+ {
+ "inputStatus": "DISABLED",
+ "jobId": 0,
+ "type": "input_status"
+ },
+ {
+ "type": "message",
+ "jobId": 0,
+ "message": "Welcome to arthas!"
+ },
+ {
+ "tutorials": "https://arthas.aliyun.com/doc/arthas-tutorials.html",
+ "time": "2020-08-06 15:56:43",
+ "type": "welcome",
+ "jobId": 0,
+ "pid": "7909",
+ "wiki": "https://arthas.aliyun.com/doc",
+ "version": "3.3.7"
+ },
+ {
+ "inputStatus": "ALLOW_INPUT",
+ "type": "input_status",
+ "jobId": 0
+ }
+ ]
+ },
+ "sessionId": "b09f1353-202c-407b-af24-701b744f971e",
+ "consumerId": "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
+ "state": "SUCCEEDED"
}
-
```
-
#### Execute commands asynchronously
```bash
@@ -338,21 +338,21 @@ Response of `async_exec`:
```json
{
- "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
- "state" : "SCHEDULED",
- "body" : {
- "jobStatus" : "READY",
- "jobId" : 3,
- "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
- }
+ "sessionId": "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
+ "state": "SCHEDULED",
+ "body": {
+ "jobStatus": "READY",
+ "jobId": 3,
+ "command": "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
+ }
}
```
-* `state` : The status of `SCHEDULED` means that the command has been
+- `state` : The status of `SCHEDULED` means that the command has been
parsed and generated the job, but the execution has not started.
-* `body.jobId` : The job id of command execution, filter the command
+- `body.jobId` : The job id of command execution, filter the command
results output in `pull_results` according to this job ID.
-* `body.jobStatus` : The job status `READY` means that execution has not started.
+- `body.jobStatus` : The job status `READY` means that execution has not started.
The shell output of the script that continuously pulls the result message:
@@ -442,7 +442,6 @@ The shell output of the script that continuously pulls the result message:
}
```
-
The `value` of the watch command result is the value of watch-experss,
and the above command is `{params, returnObj, throwExp}`, so the value
of the watch result is an array of length 3, and each element
@@ -465,11 +464,11 @@ curl -Ss -XPOST http://localhost:8563/api -d '''
```json
{
- "state" : "SUCCEEDED",
- "body" : {
- "jobStatus" : "TERMINATED",
- "jobId" : 3
- }
+ "state": "SUCCEEDED",
+ "body": {
+ "jobStatus": "TERMINATED",
+ "jobId": 3
+ }
}
```
@@ -488,55 +487,54 @@ curl -Ss -XPOST http://localhost:8563/api -d '''
```json
{
- "state" : "SUCCEEDED"
+ "state": "SUCCEEDED"
}
```
### Authentication
-* Reference: [auth](auth.md)
+- Reference: [auth](auth.md)
### Web UI
-
+
A Web UI based on Http API, visit url :
[http://127.0.0.1:8563/ui](http://127.0.0.1:8563/ui) .
Completed functions:
-* Create a session
-* Copy and open the url to join the session, share the session with
+- Create a session
+- Copy and open the url to join the session, share the session with
multiple people
-* Continuously pull session command result messages
-* Refresh the web page or join the session to pull command messages
+- Continuously pull session command result messages
+- Refresh the web page or join the session to pull command messages
history
-* Control input or interrupt command status
-
+- Control input or interrupt command status
Pending function:
-* Improve the readability of command result messages
-* Support automatic completion of input commands and command templates
-* Provide command help
-* Support personal profile settings
+- Improve the readability of command result messages
+- Support automatic completion of input commands and command templates
+- Provide command help
+- Support personal profile settings
+
### Special command results
#### status
```json
{
- "jobId" : 5,
- "statusCode" : 0,
- "type" : "status"
+ "jobId": 5,
+ "statusCode": 0,
+ "type": "status"
}
```
`type` is `status` to indicate the command execution status:
-
After each command is executed, there is a unique status result. If the
`statusCode` is 0, it means the execution is successful, and the
`statusCode` is a non-zero value that means the execution failed,
@@ -546,51 +544,50 @@ When the command execution fails, an error message is generally provided, such a
```json
{
- "jobId":3,
- "message":"The argument 'class-pattern' is required",
- "statusCode":-10,
- "type":"status"
+ "jobId": 3,
+ "message": "The argument 'class-pattern' is required",
+ "statusCode": -10,
+ "type": "status"
}
```
#### input_status
```json
- {
- "inputStatus" : "ALLOW_INPUT",
- "type" : "input_status",
- "jobId" : 0
- }
+{
+ "inputStatus": "ALLOW_INPUT",
+ "type": "input_status",
+ "jobId": 0
+}
```
`type` is `input_status` to indicate input status:
-
It is used to control user input during UI interaction, and a change
message will be sent before and after each command is executed.
Possible values of `inputStatus`:
-* `ALLOW_INPUT` : Allow users to enter commands, which means that the
+- `ALLOW_INPUT` : Allow users to enter commands, which means that the
session has no foreground command being executed and can accept new
command.
-* `ALLOW_INTERRUPT` : Allow the user to interrupt the command execution,
+- `ALLOW_INTERRUPT` : Allow the user to interrupt the command execution,
indicating that a command is currently being executed, and the user
can send `interrupt_job` to interrupt the execution.
-* `DISABLED` : In the disabled state, commands cannot be entered or
+- `DISABLED` : In the disabled state, commands cannot be entered or
interrupted.
-
#### command
```json
- {
- "type" : "command",
- "jobId" : 3,
- "state" : "SCHEDULED",
- "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
- }
+{
+ "type": "command",
+ "jobId": 3,
+ "state": "SCHEDULED",
+ "command": "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
+}
```
+
`type` is `command` to indicate the input command data:
It is used for the interactive UI to echo the commands entered by the
@@ -600,17 +597,17 @@ of type `command`, which can be processed in order.
#### enhancer
```json
- {
- "success" : true,
- "jobId" : 3,
- "effect" : {
- "listenerId" : 3,
- "cost" : 24,
- "classCount" : 1,
- "methodCount" : 1
- },
- "type" : "enhancer"
- }
+{
+ "success": true,
+ "jobId": 3,
+ "effect": {
+ "listenerId": 3,
+ "cost": 24,
+ "classCount": 1,
+ "methodCount": 1
+ },
+ "type": "enhancer"
+}
```
`type` is `enhancer` to indicate the result of class enhancement:
@@ -635,14 +632,14 @@ json_data=$(curl -Ss -XPOST http://localhost:8563/api -d '
}')
```
-* Extract value with `sed`:
+- Extract value with `sed`:
```bash
class_path=$(echo $json_data | tr -d '\n' | sed 's/.*"java.class.path":"\([^"]*\).*/\1/')
echo "classpath: $class_path"
```
-* Extract value with `json_pp/awk`:
+- Extract value with `json_pp/awk`:
```bash
class_path=$(echo $json_data | tr -d '\n' | json_pp | grep java.class.path | awk -F'"' '{ print $4 }')
@@ -657,13 +654,13 @@ classpath: demo-arthas-spring-boot.jar
NOTE:
-* `echo $json_data | tr -d '\n'` : Delete line breaks (the value of
+- `echo $json_data | tr -d '\n'` : Delete line breaks (the value of
`line.separator`) to avoid affecting the processing of `sed`/`json_pp`
commands.
-* `awk -F'"' '{ print $4 }'` : Use double quote as delimiter
-
+- `awk -F'"' '{ print $4 }'` : Use double quote as delimiter
+
#### Make watch command output a map object
The result value of `watch` is generated by calculating the
@@ -671,11 +668,13 @@ The result value of `watch` is generated by calculating the
generate the desired value, please refer to
[OGNL document](https://commons.apache.org/proper/commons-ognl/language-guide.html).
-> Maps can also be created using a special syntax.
->
->#{ "foo" : "foo value", "bar" : "bar value" }
->
->This creates a Map initialized with mappings for "foo" and "bar".
+::: tip
+Maps can also be created using a special syntax.
+
+#{ "foo" : "foo value", "bar" : "bar value" }
+
+This creates a Map initialized with mappings for "foo" and "bar".
+:::
The following command generates values in map format:
diff --git a/site-vuepress/docs/en/doc/idea-plugin.md b/site-vuepress/docs/en/doc/idea-plugin.md
new file mode 100644
index 000000000..587aea9c8
--- /dev/null
+++ b/site-vuepress/docs/en/doc/idea-plugin.md
@@ -0,0 +1,9 @@
+# IDEA Plugin
+
+::: tip
+Plugin is provided by community developers.
+:::
+
+- Jetbrains Plugin: [https://plugins.jetbrains.com/plugin/13581-arthas-idea](https://plugins.jetbrains.com/plugin/13581-arthas-idea)
+- Plugin Doc:[https://www.yuque.com/arthas-idea-plugin](https://www.yuque.com/arthas-idea-plugin)
+- Plugin Github: [https://github.com/WangJi92/arthas-idea-plugin](https://github.com/WangJi92/arthas-idea-plugin)
diff --git a/site/src/site/sphinx/en/install-detail.md b/site-vuepress/docs/en/doc/install-detail.md
similarity index 80%
rename from site/src/site/sphinx/en/install-detail.md
rename to site-vuepress/docs/en/doc/install-detail.md
index a7b6e14c1..9dfd8e64c 100644
--- a/site/src/site/sphinx/en/install-detail.md
+++ b/site-vuepress/docs/en/doc/install-detail.md
@@ -1,9 +1,7 @@
-Install Arthas
-==============
+# Install Arthas
## Quick installation
-
### Use `arthas-boot`(Recommended)
Download`arthas-boot.jar`,Start with `java` command:
@@ -19,10 +17,9 @@ Print usage:
java -jar arthas-boot.jar -h
```
-
### Use `as.sh`
-You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press *Enter* to run:
+You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press _Enter_ to run:
```bash
curl -L https://arthas.aliyun.com/install.sh | sh
@@ -32,7 +29,6 @@ The command above will download the bootstrap script `as.sh` to the current dire
You can enter its interactive interface by executing `as.sh`, or execute `as.sh -h` for more help information.
-
## Full installation
Latest Version, Click To Download: [](https://arthas.aliyun.com/download/latest_version)
@@ -53,18 +49,18 @@ java -jar arthas-boot.jar -h
[Manual Installation](manual-install.md)
-
-## Installation via Packages
+## Installation via Packages
Arthas has packages for Debian and Fedora based systems.
you can get them from the github releases page https://github.com/alibaba/arthas/releases.
-### Instruction for Debian based systems
+### Instruction for Debian based systems
```bash
sudo dpkg -i arthas*.deb
```
-### Instruction for Fedora based systems
+
+### Instruction for Fedora based systems
```bash
sudo rpm -i arthas*.rpm
@@ -72,7 +68,7 @@ sudo rpm -i arthas*.rpm
### Usage
-After the installation of packages, execute
+After the installation of packages, execute
```bash
as.sh
@@ -82,14 +78,13 @@ as.sh
Latest Version Documentation, Click To Download:[](https://arthas.aliyun.com/download/doc/latest_version)
-
## Uninstall
-* On Linux/Unix/Mac, delete the files with the following command:
+- On Linux/Unix/Mac, delete the files with the following command:
- ```bash
- rm -rf ~/.arthas/
- rm -rf ~/logs/arthas/
- ```
+ ```bash
+ rm -rf ~/.arthas/
+ rm -rf ~/logs/arthas/
+ ```
-* On Windows, delete `.arthas` and `logs/arthas` directory under user home.
+- On Windows, delete `.arthas` and `logs/arthas` directory under user home.
diff --git a/site/src/site/sphinx/en/jad.md b/site-vuepress/docs/en/doc/jad.md
similarity index 79%
rename from site/src/site/sphinx/en/jad.md
rename to site-vuepress/docs/en/doc/jad.md
index b364c3a5b..8b5de4217 100644
--- a/site/src/site/sphinx/en/jad.md
+++ b/site-vuepress/docs/en/doc/jad.md
@@ -1,23 +1,24 @@
-jad
-===
+# jad
[`jad` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-jad)
-> Decompile the specified classes.
+::: tip
+Decompile the specified classes.
+:::
`jad` helps to decompile the byte code running in JVM to the source code to assist you to understand the logic behind better.
-* The decompiled code is syntax highlighted for better readability in Arthas console.
-* It is possible that there's grammar error in the decompiled code, but it should not affect your interpretation.
+- The decompiled code is syntax highlighted for better readability in Arthas console.
+- It is possible that there's grammar error in the decompiled code, but it should not affect your interpretation.
### Options
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for the class name|
-|`[c:]`|hashcode of the class loader that loads the class|
-|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. |
-|`[E]`|turn on regex match while the default is wildcard match|
+| Name | Specification |
+| --------------------: | :-------------------------------------------------------------- |
+| _class-pattern_ | pattern for the class name |
+| `[c:]` | hashcode of the class loader that loads the class |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| `[E]` | turn on regex match while the default is wildcard match |
### Usage
@@ -106,7 +107,7 @@ Location:
#### Do not print line numbers
-* `--lineNumber`: Output source code contins line numbers, default value true
+- `--lineNumber`: Output source code contins line numbers, default value true
```java
$ jad demo.MathGame main --lineNumber false
@@ -129,7 +130,9 @@ public static void main(String[] args) throws InterruptedException {
#### Decompile with specified classLoader
-> If the target class is loaded by multiple classloaders, `jad` outputs the `hashcode` of the corresponding classloaders, then you can re-run `jad` and specify `-c ` to decompile the target class from the specified classloader.
+::: tip
+If the target class is loaded by multiple classloaders, `jad` outputs the `hashcode` of the corresponding classloaders, then you can re-run `jad` and specify `-c ` to decompile the target class from the specified classloader.
+:::
```java
$ jad org.apache.log4j.Logger
diff --git a/site/src/site/sphinx/en/jvm.md b/site-vuepress/docs/en/doc/jvm.md
similarity index 70%
rename from site/src/site/sphinx/en/jvm.md
rename to site-vuepress/docs/en/doc/jvm.md
index a650bf9ea..55f62bf0d 100644
--- a/site/src/site/sphinx/en/jvm.md
+++ b/site-vuepress/docs/en/doc/jvm.md
@@ -1,9 +1,10 @@
-jvm
-===
+# jvm
[`jvm` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-jvm)
-> Check the current JVM's info
+::: tip
+Check the current JVM's info
+:::
### Usage
@@ -46,13 +47,13 @@ RUNTIME
--------------------------------------------------------------------------------------------------------------
GARBAGE-COLLECTORS
--------------------------------------------------------------------------------------------------------------
- PS Scavenge name : PS Scavenge
- [count/time (ms)] collectionCount : 7
- collectionTime : 68
-
- PS MarkSweep name : PS MarkSweep
- [count/time (ms)] collectionCount : 1
- collectionTime : 47
+ PS Scavenge name : PS Scavenge
+ [count/time (ms)] collectionCount : 7
+ collectionTime : 68
+
+ PS MarkSweep name : PS MarkSweep
+ [count/time (ms)] collectionCount : 1
+ collectionTime : 47
--------------------------------------------------------------------------------------------------------------
MEMORY-MANAGERS
@@ -73,15 +74,15 @@ RUNTIME
--------------------------------------------------------------------------------------------------------------
MEMORY
--------------------------------------------------------------------------------------------------------------
- HEAP-MEMORY-USAGE init : 268435456(256.0 MiB)
- [memory in bytes] used : 18039504(17.2 MiB)
- committed : 181403648(173.0 MiB)
- max : 3817865216(3.6 GiB)
-
- NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
- [memory in bytes] used : 33926216(32.4 MiB)
- committed : 35176448(33.5 MiB)
- max : -1(-1 B)
+ HEAP-MEMORY-USAGE init : 268435456(256.0 MiB)
+ [memory in bytes] used : 18039504(17.2 MiB)
+ committed : 181403648(173.0 MiB)
+ max : 3817865216(3.6 GiB)
+
+ NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
+ [memory in bytes] used : 33926216(32.4 MiB)
+ committed : 35176448(33.5 MiB)
+ max : -1(-1 B)
--------------------------------------------------------------------------------------------------------------
OPERATING-SYSTEM
@@ -111,14 +112,13 @@ Affect(row-cnt:0) cost in 88 ms.
### Thread related
-* COUNT: the count of active threads
-* DAEMON-COUNT: the count of active daemon threads
-* PEAK-COUNT: the maximum count of the live threads since JVM starts
-* STARTED-COUNT: the total count of the created threads since JVM starts
-* DEADLOCK-COUNT: the count of deadlocked threads
-
+- COUNT: the count of active threads
+- DAEMON-COUNT: the count of active daemon threads
+- PEAK-COUNT: the maximum count of the live threads since JVM starts
+- STARTED-COUNT: the total count of the created threads since JVM starts
+- DEADLOCK-COUNT: the count of deadlocked threads
### File descriptor related
-* MAX-FILE-DESCRIPTOR-COUNT:the count of max file descriptor JVM process can open
-* OPEN-FILE-DESCRIPTOR-COUNT:the current count of file descriptor JVM process open
+- MAX-FILE-DESCRIPTOR-COUNT:the count of max file descriptor JVM process can open
+- OPEN-FILE-DESCRIPTOR-COUNT:the current count of file descriptor JVM process open
diff --git a/site-vuepress/docs/en/doc/keymap.md b/site-vuepress/docs/en/doc/keymap.md
new file mode 100644
index 000000000..a1d32d95a
--- /dev/null
+++ b/site-vuepress/docs/en/doc/keymap.md
@@ -0,0 +1,69 @@
+# Arthas Console Keymap
+
+[`keymap` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-keymap)
+
+Use `keymap` command to print the current keymap:
+
+The default keymap is:
+
+| Shortcut | Shortcut Description | Command Name | Command Description |
+| ------------- | -------------------- | -------------------- | -------------------------------------------------------------------- |
+| `"\C-a"` | ctrl + a | beginning-of-line | go to the beginning of the line |
+| ` "\C-e"` | ctrl + e | end-of-line | go to the end of the line |
+| `"\C-f"` | ctrl + f | forward-word | forward a word |
+| `"\C-b"` | ctrl + b | backward-word | backward a word |
+| `"\e[D"` | left arrow | backward-char | backward a character |
+| `"\e[C"` | right arrow | forward-char | forward a character |
+| `"\e[B"` | down arrow | next-history | show next history command |
+| `"\e[A"` | up arrow | previous-history | show previous history command |
+| `"\C-h"` | ctrl + h | backward-delete-char | backward delete a character |
+| `"\C-?"` | ctrl + shift + / | backward-delete-char | backward delete a character |
+| `"\C-u"` | ctrl + u | undo | clear current line |
+| `"\C-d"` | ctrl + d | delete-char | delete the character of the current cursor |
+| `"\C-k"` | ctrl + k | kill-line | delete all characters from the current cursor to the end of the line |
+| `"\C-i"` | ctrl + i | complete | Auto completion, equivalent to `TAB` |
+| `"\C-j"` | ctrl + j | accept-line | end the current line, equivalent to `enter` |
+| `"\C-m"` | ctrl + m | accept-line | end the current line, equivalent to `enter` |
+| `"\C-w"` | | backward-delete-word | |
+| `"\C-x\e[3~"` | | backward-kill-line | |
+| `"\e\C-?"` | | backward-kill-word | |
+
+- Press `tab` to enable auto-completion prompt at any time.
+- Enter command and `-` or `--`, then press `tab` to display the concrete options for the current command.
+
+#### Custom shortcuts
+
+Specify customization in `$USER_HOME/.arthas/conf/inputrc` file in the current user home directory.
+
+Vim user may want to map `ctrl+h` to moving the cursor forward one character. To achieve this, copy the default configuration first,
+
+```
+"\C-a": beginning-of-line
+"\C-e": end-of-line
+"\C-f": forward-word
+"\C-b": backward-word
+"\e[D": backward-char
+"\e[C": forward-char
+"\e[B": next-history
+"\e[A": previous-history
+"\C-h": backward-delete-char
+"\C-?": backward-delete-char
+"\C-u": undo
+"\C-d": delete-char
+"\C-k": kill-line
+"\C-i": complete
+"\C-j": accept-line
+"\C-m": accept-line
+"\C-w": backward-delete-word
+"\C-x\e[3~": backward-kill-line
+"\e\C-?": backward-kill-word
+```
+
+then replace `"\C-h": backward-delete-char` with `"\C-h": backward-char`, then reconnect to Arthas console to take effect.
+
+#### Shortcuts for jobs
+
+- `ctrl + c`: Terminates current command
+- `ctrl + z`: Suspends the current command, you can restore this command with `bg`/`fg`, or `kill` it.
+- `ctrl + a`: Go to the beginning the line
+- `ctrl + e`: Go to the end of the line
diff --git a/site/src/site/sphinx/en/logger.md b/site-vuepress/docs/en/doc/logger.md
similarity index 95%
rename from site/src/site/sphinx/en/logger.md
rename to site-vuepress/docs/en/doc/logger.md
index b2d9d1eeb..7f4ba75a8 100644
--- a/site/src/site/sphinx/en/logger.md
+++ b/site-vuepress/docs/en/doc/logger.md
@@ -1,9 +1,10 @@
-logger
-===
+# logger
[`logger` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-logger)
-> Print the logger information, update the logger level
+::: tip
+Print the logger information, update the logger level
+:::
### Usage
@@ -46,7 +47,6 @@ Take the following `logback.xml` as an example:
```
-
The result of the `logger` command:
```bash
@@ -78,9 +78,9 @@ The result of the `logger` command:
In the `appenders` section:
-* The target of `CONSOLE` logger is `System.out`
-* `APPLICATION` logger is `RollingFileAppender`, the file is `app.log`
-* `ASYNC` its `appenderRef` is `APPLICATION`, which means asynchronous output to the file
+- The target of `CONSOLE` logger is `System.out`
+- `APPLICATION` logger is `RollingFileAppender`, the file is `app.log`
+- `ASYNC` its `appenderRef` is `APPLICATION`, which means asynchronous output to the file
#### View logger information for the special name
@@ -131,9 +131,9 @@ if you use`-c`, you have to manually type hashcode by `-c `.
For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use.
-`logger --classLoaderClass sun.misc.Launcher$AppClassLoader`
+`logger --classLoaderClass sun.misc.Launcher$AppClassLoader`
- * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader.
+- PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader.
The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic.
@@ -156,7 +156,6 @@ You can first use `sc -d yourClassName` to check specified classloader hashcode
#### View the logger information without appenders
-
By default, the `logger` command only prints information about the logger with appenders. If you want to see information about loggers without `appender`, you can use the parameter `--include-no-appender`.
Note that the output will usually be very long.
diff --git a/site-vuepress/docs/en/doc/manual-install.md b/site-vuepress/docs/en/doc/manual-install.md
new file mode 100644
index 000000000..90b1c4d99
--- /dev/null
+++ b/site-vuepress/docs/en/doc/manual-install.md
@@ -0,0 +1,109 @@
+# Manually Install Arthas
+
+1. Download the latest version
+
+ **Latest version, Click To Download**: [](https://arthas.aliyun.com/download/latest_version)
+
+2. Unzip zip file
+
+ ```bash
+ unzip arthas-packaging-bin.zip
+ ```
+
+3. Install Arthas
+
+ It is recommended to completely remove all old versions of Arthas before installation.
+
+ ```bash
+ sudo su admin
+ rm -rf /home/admin/.arthas/lib/* # remove all the leftover of the old outdated Arthas
+ cd arthas
+ ./install-local.sh # switch the user based on the owner of the target Java process.
+ ```
+
+4. Start Arthas
+
+ Make sure `stop` the old Arthas server before start.
+
+ ```bash
+ ./as.sh
+ ```
+
+## Startup with as.sh/as.bat
+
+### Linux/Unix/Mac
+
+You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press _Enter_ to run:
+
+```bash
+curl -L https://arthas.aliyun.com/install.sh | sh
+```
+
+The command above will download the bootstrap script `as.sh` to the current directory. You can move it the any other place you want, or put its location in `$PATH`.
+
+You can enter its interactive interface by executing `as.sh`, or execute `as.sh -h` for more help information.
+
+### Windows
+
+Latest Version, Click To Download: [](https://arthas.aliyun.com/download/latest_version)
+
+Download and unzip, then find `as.bat` from 'bin' directory. For now this script will only take one argument `pid`, which means you can only diagnose the local Java process. (Welcome any bat script expert to make it better :heart:)
+
+```bash
+as.bat
+```
+
+If you want to diagnose Java process run as windows service, try these commands:
+
+```bash
+as-service.bat -port
+as-service.bat -pid
+as-service.bat -pid --interact
+```
+
+Use this command to remove arthas service:
+
+```bash
+as-service.bat -remove
+```
+
+## Manual command line startup
+
+If you fail to boot Arthas with the provided batch file, you could try to assemble the bootstrap command in the following way.
+
+1. Locate java in the target JVM:
+
+ - Linux/Unix/Mac: `ps aux | grep java`
+ - Windows: open the Process Monitor to search java
+
+2. Assemble bootstrap command:
+
+ Let's suppose we are using `/opt/jdk1.8/bin/java`, then the command should be:
+
+ ```bash
+ /opt/jdk1.8/bin/java -Xbootclasspath/a:/opt/jdk1.8/lib/tools.jar \
+ -jar /tmp/arthas-packaging/arthas-core.jar \
+ -pid 15146 \
+ -target-ip 127.0.0.1 -telnet-port 3658 -http-port 8563 \
+ -core /tmp/arthas-packaging/arthas-core.jar \
+ -agent /tmp/arthas-packaging/arthas/arthas-agent.jar
+ ```
+
+ Note:
+
+ - `-Xbootclasspath` adds tools.jar
+ - `-jar /tmp/arthas-packaging/arthas-core.jar` specifies main entry
+ - `-pid 15146` specifies the target java process PID
+ - `-target-ip 127.0.0.1` specifies the IP
+ - `-telnet-port 3658 -http-port 8563` specifies telnet and HTTP ports for remote access
+ - `-core /tmp/arthas-packaging/arthas-core.jar -agent /tmp/arthas-packaging/arthas/arthas-agent.jar` specifies core/agent jar package
+
+ If you are running on JDK 1.9 or above,then it's unnecessary to add `tools.jar` in option `-Xbootclasspath`.
+
+ You can find the logs from `~/logs/arthas/arthas.log`.
+
+3. Use telnet to connect once attaching to the target JVM (in step 2) succeeds
+
+ ```bash
+ telnet 127.0.0.1 3658
+ ```
diff --git a/site-vuepress/docs/en/doc/mbean.md b/site-vuepress/docs/en/doc/mbean.md
new file mode 100644
index 000000000..7880407ea
--- /dev/null
+++ b/site-vuepress/docs/en/doc/mbean.md
@@ -0,0 +1,68 @@
+# mbean
+
+[`mbean` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-mbean)
+
+::: tip
+show Mbean information
+:::
+
+This command can show or monitor Mbean attribute information.
+
+### Parameters
+
+| Name | Specification |
+| ------------------: | :---------------------------------------------------------------------------------------------------- |
+| _name-pattern_ | pattern for the Mbean name |
+| _attribute-pattern_ | pattern for the attribute name |
+| [m] | show meta information |
+| [i:] | specify the interval to refresh attribute value (ms) |
+| [n:] | execution times |
+| [E] | turn on regex matching while the default mode is wildcard matching. Only effect on the attribute name |
+
+### Usage
+
+show all Mbean names:
+
+```bash
+mbean
+```
+
+show meta data of Mbean:
+
+```bash
+mbean -m java.lang:type=Threading
+```
+
+show attributes of Mbean:
+
+```bash
+mbean java.lang:type=Threading
+```
+
+Mbean name support wildcard matcher:
+
+```bash
+mbean java.lang:type=Th*
+```
+
+::: warning
+Notes:ObjectName matching rules differ from normal wildcards, Reference resources:[javax.management.ObjectName](https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html?is-external=true)
+:::
+
+Wildcards match specific attributes:
+
+```bash
+mbean java.lang:type=Threading *Count
+```
+
+Switch to regular matching using the `-E` command:
+
+```bash
+mbean -E java.lang:type=Threading PeakThreadCount|ThreadCount|DaemonThreadCount
+```
+
+Real-time monitoring using `-i` command:
+
+```bash
+mbean -i 1000 java.lang:type=Threading *Count
+```
diff --git a/site/src/site/sphinx/en/mc.md b/site-vuepress/docs/en/doc/mc.md
similarity index 72%
rename from site/src/site/sphinx/en/mc.md
rename to site-vuepress/docs/en/doc/mc.md
index 933e972b8..fc93c8b90 100644
--- a/site/src/site/sphinx/en/mc.md
+++ b/site-vuepress/docs/en/doc/mc.md
@@ -1,9 +1,10 @@
-mc
-===
+# mc
[`mc-retransform` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-retransform)
-> Memory compiler, compiles `.java` files into `.class` files in memory.
+::: tip
+Memory compiler, compiles `.java` files into `.class` files in memory.
+:::
```bash
mc /tmp/Test.java
@@ -32,4 +33,6 @@ mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
After compiling the `.class` file, you can use the [retransform](retransform.md) command to re-define the loaded classes in JVM.
-> Note that the mc command may fail. If the compilation fails, the `.class` file can be compiled locally and uploaded to the server. Refer to the [retransform](retransform.md) command description for details.
\ No newline at end of file
+::: warning
+Note that the mc command may fail. If the compilation fails, the `.class` file can be compiled locally and uploaded to the server. Refer to the [retransform](retransform.md) command description for details.
+:::
diff --git a/site/src/site/sphinx/en/memory.md b/site-vuepress/docs/en/doc/memory.md
similarity index 98%
rename from site/src/site/sphinx/en/memory.md
rename to site-vuepress/docs/en/doc/memory.md
index 6e11c4280..f2c66d81e 100644
--- a/site/src/site/sphinx/en/memory.md
+++ b/site-vuepress/docs/en/doc/memory.md
@@ -1,9 +1,7 @@
-memory
-===
+# memory
View the JVM memory information.
-
### Usage
```bash
@@ -22,4 +20,3 @@ codeheap_'non-profiled_nmethods' 685K 2496K 120032K 0.57%
mapped 0K 0K - 0.00%
direct 48M 48M - 100.00%
```
-
diff --git a/site/src/site/sphinx/en/monitor.md b/site-vuepress/docs/en/doc/monitor.md
similarity index 73%
rename from site/src/site/sphinx/en/monitor.md
rename to site-vuepress/docs/en/doc/monitor.md
index 40aaf1c83..8d04094b2 100644
--- a/site/src/site/sphinx/en/monitor.md
+++ b/site-vuepress/docs/en/doc/monitor.md
@@ -1,9 +1,10 @@
-monitor
-=======
+# monitor
[`monitor` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-monitor)
-> Monitor method invocation.
+::: tip
+Monitor method invocation.
+:::
Monitor invocation for the method matched with `class-pattern` and `method-pattern` and filter by `condition-expression`.
@@ -15,29 +16,29 @@ On Arthas's server side, the command is running as a background job, but the wea
### Items to monitor
-|Item|Specification|
-|---:|:---|
-|timestamp|timestamp|
-|class|Java class|
-|method|method (constructor and regular methods)|
-|total|calling times|
-|success|success count|
-|fail|failure count|
-|rt|average RT|
-|fail-rate|failure ratio|
+| Item | Specification |
+| --------: | :--------------------------------------- |
+| timestamp | timestamp |
+| class | Java class |
+| method | method (constructor and regular methods) |
+| total | calling times |
+| success | success count |
+| fail | failure count |
+| rt | average RT |
+| fail-rate | failure ratio |
### Parameters
Parameter `[c:]` stands for cycles of statistics. Its value is an integer value in seconds.
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for the class name|
-|*method-pattern*|pattern for the method name|
-|*condition-expression*|condition expression for filtering method calls|
-|`[E]`|turn on regex matching while the default is wildcard matching|
-|`[c:]`|cycle of statistics, the default value: `120`s|
-|`[b]`|evaluate the condition-expression before method invoke|
+| Name | Specification |
+| ---------------------: | :------------------------------------------------------------ |
+| _class-pattern_ | pattern for the class name |
+| _method-pattern_ | pattern for the method name |
+| _condition-expression_ | condition expression for filtering method calls |
+| `[E]` | turn on regex matching while the default is wildcard matching |
+| `[c:]` | cycle of statistics, the default value: `120`s |
+| `[b]` | evaluate the condition-expression before method invoke |
### Usage
@@ -76,25 +77,25 @@ Affect(class-cnt:1 , method-cnt:1) cost in 94 ms.
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 19 ms, listenerId: 5
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:36 demo.MathGame primeFactors 5 3 2 0.09 40.00%
+ 2020-09-02 09:42:36 demo.MathGame primeFactors 5 3 2 0.09 40.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:41 demo.MathGame primeFactors 5 2 3 0.11 60.00%
+ 2020-09-02 09:42:41 demo.MathGame primeFactors 5 2 3 0.11 60.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:46 demo.MathGame primeFactors 5 1 4 0.06 80.00%
+ 2020-09-02 09:42:46 demo.MathGame primeFactors 5 1 4 0.06 80.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:51 demo.MathGame primeFactors 5 1 4 0.12 80.00%
+ 2020-09-02 09:42:51 demo.MathGame primeFactors 5 1 4 0.12 80.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:56 demo.MathGame primeFactors 5 3 2 0.15 40.00%
+ 2020-09-02 09:42:56 demo.MathGame primeFactors 5 3 2 0.15 40.00%
```
#### Evaluate condition-express to filter method (before method call)
@@ -103,24 +104,23 @@ Affect(class count: 1 , method count: 1) cost in 19 ms, listenerId: 5
monitor -b -c 5 com.test.testes.MathGame primeFactors "params[0] <= 2"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 21 ms, listenerId: 4
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00%
+ 2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:02 demo.MathGame primeFactors 3 0 3 0.06 100.00%
+ 2020-09-02 09:42:02 demo.MathGame primeFactors 3 0 3 0.06 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:07 demo.MathGame primeFactors 2 0 2 0.06 100.00%
+ 2020-09-02 09:42:07 demo.MathGame primeFactors 2 0 2 0.06 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:12 demo.MathGame primeFactors 1 0 1 0.05 100.00%
+ 2020-09-02 09:42:12 demo.MathGame primeFactors 1 0 1 0.05 100.00%
- timestamp class method total success fail avg-rt(ms) fail-rate
+ timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
- 2020-09-02 09:42:17 demo.MathGame primeFactors 2 0 2 0.10 100.00%
+ 2020-09-02 09:42:17 demo.MathGame primeFactors 2 0 2 0.10 100.00%
```
-
diff --git a/site/src/site/sphinx/en/ognl.md b/site-vuepress/docs/en/doc/ognl.md
similarity index 71%
rename from site/src/site/sphinx/en/ognl.md
rename to site-vuepress/docs/en/doc/ognl.md
index f6095534a..d9d13ca6b 100644
--- a/site/src/site/sphinx/en/ognl.md
+++ b/site-vuepress/docs/en/doc/ognl.md
@@ -1,26 +1,26 @@
-ognl
-===
+# ognl
[`ognl` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-ognl)
-> Execute ognl expression.
+::: tip
+Execute ognl expression.
+:::
Since 3.0.5.
### Parameters
-|Name|Specification|
-|---:|:---|
-|*express*|expression to be executed|
-|`[c:]`| The hashcode of the ClassLoader that executes the expression, default ClassLoader is SystemClassLoader. |
-|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. |
-|[x]|Expand level of object (1 by default).|
-
+| Name | Specification |
+| --------------------: | :------------------------------------------------------------------------------------------------------ |
+| _express_ | expression to be executed |
+| `[c:]` | The hashcode of the ClassLoader that executes the expression, default ClassLoader is SystemClassLoader. |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| [x] | Expand level of object (1 by default). |
### Usage
-* [Special usages](https://github.com/alibaba/arthas/issues/71)
-* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+- [Special usages](https://github.com/alibaba/arthas/issues/71)
+- [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
Call static method:
@@ -52,16 +52,15 @@ $ ognl '@demo.MathGame@random'
]
```
-
-Specify ClassLoader by hashcode:
+Specify ClassLoader by hashcode:
```bash
$ classloader -t
-+-BootstrapClassLoader
-+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
- +-com.taobao.arthas.agent.ArthasClassloader@472067c7
- +-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
- +-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8
++-BootstrapClassLoader
++-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
+ +-com.taobao.arthas.agent.ArthasClassloader@472067c7
+ +-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
+ +-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8
$ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
@@ -69,8 +68,9 @@ $ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
name=@String[org.springframework.boot.SpringApplication],
logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]
-$
+$
```
+
Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader.
For ClassLoader with only unique instance, it can be specified by class name, which is more convenient to use:
@@ -92,4 +92,4 @@ $ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("j
@String[/opt/java/8.0.181-zulu/jre],
@String[OpenJDK Runtime Environment],
]
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/options.md b/site-vuepress/docs/en/doc/options.md
similarity index 62%
rename from site/src/site/sphinx/en/options.md
rename to site-vuepress/docs/en/doc/options.md
index 85eef00f3..2f985e5a2 100644
--- a/site/src/site/sphinx/en/options.md
+++ b/site-vuepress/docs/en/doc/options.md
@@ -1,25 +1,26 @@
-options
-===
+# options
[`options` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-options)
-> Global options
-
-|Name| Default Value | Description |
-| ------------------------- | ----- | ---------------------------------------- |
-| unsafe | false | whether to enhance to system-level class. Use it with caution since JVM may hang|
-| dump | false | whether to dump enhanced class to the external files. If it's on, enhanced class will be dumped into `/${application dir}/arthas-class-dump/`, the specific output path will be output in the console |
-| batch-re-transform | true | whether to re-transform matched classes in batch|
-| json-format | false | whether to output in JSON format|
-| disable-sub-class | false | whether to enable matching child classes. The default value is `true`. If exact match is desire, turn off this flag|
-| support-default-method | true | whether to enable matching default method in interface. The default value is `true`. Refer to [#1105](https://github.com/alibaba/arthas/issues/1105) |
-| save-result | false | whether to save execution result. All execution results will be saved to `~/logs/arthas-cache/result.log` when it's turned on|
-| job-timeout | 1d | default timeout for background jobs. Background job will be terminated once it's timed out (i.e. 1d, 2h, 3m, 25s)| print-parent-fields | true | This option enables print files in parent class, default value true.|
-| verbose | false | This option enables print verbose information|
-| strict | true | whether to enable strict mode |
-
+::: tip
+Global options
+:::
+
+| Name | Default Value | Description |
+| ---------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ---- | -------------------------------------------------------------------- |
+| unsafe | false | whether to enhance to system-level class. Use it with caution since JVM may hang |
+| dump | false | whether to dump enhanced class to the external files. If it's on, enhanced class will be dumped into `/${application dir}/arthas-class-dump/`, the specific output path will be output in the console |
+| batch-re-transform | true | whether to re-transform matched classes in batch |
+| json-format | false | whether to output in JSON format |
+| disable-sub-class | false | whether to enable matching child classes. The default value is `true`. If exact match is desire, turn off this flag |
+| support-default-method | true | whether to enable matching default method in interface. The default value is `true`. Refer to [#1105](https://github.com/alibaba/arthas/issues/1105) |
+| save-result | false | whether to save execution result. All execution results will be saved to `~/logs/arthas-cache/result.log` when it's turned on |
+| job-timeout | 1d | default timeout for background jobs. Background job will be terminated once it's timed out (i.e. 1d, 2h, 3m, 25s) | print-parent-fields | true | This option enables print files in parent class, default value true. |
+| verbose | false | This option enables print verbose information |
+| strict | true | whether to enable strict mode |
### View all options
+
```bash
$ options
LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION
@@ -62,10 +63,8 @@ $ options
false`
```
-
### Get special option value
-
```
$ options json-format
LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION
@@ -75,16 +74,18 @@ $ options json-format
ect output ted.
```
-> By default, `json-format` is false. When set `json-format` to true, commands like `wathc`/`tt` will print result with `json` format.
+::: tip
+By default, `json-format` is false. When set `json-format` to true, commands like `wathc`/`tt` will print result with `json` format.
+:::
### Set special option value
For example, to enable saving command execution result, input the command below:
```
-$ options save-result true
- NAME BEFORE-VALUE AFTER-VALUE
-----------------------------------------
+$ options save-result true
+ NAME BEFORE-VALUE AFTER-VALUE
+----------------------------------------
save-result false true
```
@@ -105,10 +106,11 @@ Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 61 ms, listenerId: 1
```
-
### Turn off strict mode, allow setting object properties in ognl expressions
-> since 3.6.0
+::: tip
+since 3.6.0
+:::
For new users, there may be misuses when writing ognl expressions.
@@ -127,4 +129,4 @@ watch failed, condition is: target.illegalArgumentCount=1, express is: target, B
If the user want to change the object properties in the `ognl` expression, you can execute `options strict false` to turn off the `strict` mode.
-* For more information, please refer to: https://github.com/alibaba/arthas/issues/2128
\ No newline at end of file
+- For more information, please refer to: https://github.com/alibaba/arthas/issues/2128
diff --git a/site/src/site/sphinx/en/perfcounter.md b/site-vuepress/docs/en/doc/perfcounter.md
similarity index 94%
rename from site/src/site/sphinx/en/perfcounter.md
rename to site-vuepress/docs/en/doc/perfcounter.md
index 14ef691ce..f72c77852 100644
--- a/site/src/site/sphinx/en/perfcounter.md
+++ b/site-vuepress/docs/en/doc/perfcounter.md
@@ -1,9 +1,10 @@
-perfcounter
-===
+# perfcounter
[`perfcounter` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-perfcounter)
-> Check the current JVM Perf Counter information.
+::: tip
+Check the current JVM Perf Counter information.
+:::
### Usage
@@ -39,4 +40,4 @@ If the information is not printed, when the application starts, add the followin
```
--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/profiler.md b/site-vuepress/docs/en/doc/profiler.md
similarity index 71%
rename from site/src/site/sphinx/en/profiler.md
rename to site-vuepress/docs/en/doc/profiler.md
index 94296f230..554f78398 100644
--- a/site/src/site/sphinx/en/profiler.md
+++ b/site-vuepress/docs/en/doc/profiler.md
@@ -1,9 +1,10 @@
-profiler
-===
+# profiler
[`profiler` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-profiler)
-> Generate a flame graph using [async-profiler](https://github.com/jvm-profiling-tools/async-profiler)
+::: tip
+Generate a flame graph using [async-profiler](https://github.com/jvm-profiling-tools/async-profiler)
+:::
The `profiler` command supports generate flame graph for application hotspots.
@@ -11,14 +12,14 @@ The basic usage of the `profiler` command is `profiler action [actionArg]`
### Supported Options
-|Name|Specification|
-|---:|:---|
-|*action*|Action to execute|
-|*actionArg*|Attribute name pattern|
-|[i:]|sampling interval in ns (default: 10'000'000, i.e. 10 ms)|
-|[f:]|dump output to specified directory|
-|[d:]|run profiling for specified seconds|
-|[e:]|which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu|
+| Name | Specification |
+| ----------: | :------------------------------------------------------------------------------- |
+| _action_ | Action to execute |
+| _actionArg_ | Attribute name pattern |
+| [i:] | sampling interval in ns (default: 10'000'000, i.e. 10 ms) |
+| [f:] | dump output to specified directory |
+| [d:] | run profiling for specified seconds |
+| [e:] | which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu |
### Start profiler
@@ -27,8 +28,9 @@ $ profiler start
Started [cpu] profiling
```
-> By default, the sample event is `cpu`. Can be specified with the `--event` parameter.
-
+::: tip
+By default, the sample event is `cpu`. Can be specified with the `--event` parameter.
+:::
### Get the number of samples collected
@@ -64,13 +66,15 @@ Or use the file name name format in the `--file` parameter. For example, `--file
By default, arthas uses port 3658, which can be opened: [http://localhost:3658/arthas-output/](http://localhost:3658/arthas-output/) View the `arthas-output` directory below Profiler results:
-
+
Click to view specific results:
-
+
-> If using the chrome browser, may need to be refreshed multiple times.
+::: tip
+If using the chrome browser, may need to be refreshed multiple times.
+:::
### Profiler supported events
@@ -121,7 +125,6 @@ You can use the `--event` parameter to specify the event to sample, such as samp
$ profiler start --event alloc
```
-
### Resume sampling
```bash
@@ -133,10 +136,9 @@ The difference between `start` and `resume` is: `start` is the new start samplin
You can verify the number of samples by executing `profiler getSamples`.
-
### Use `execute` action to execute complex commands
-For example, start sampling:
+For example, start sampling:
```bash
profiler execute 'start,framebuf=5000000'
@@ -157,7 +159,6 @@ $ profiler actions
Supported Actions: [resume, dumpCollapsed, getSamples, start, list, execute, version, stop, load, dumpFlat, actions, dumpTraces, status]
```
-
### View version
```bash
@@ -168,7 +169,9 @@ Copyright 2019 Andrei Pangin
### Configure framebuf option
-> If you encounter `[frame_buffer_overflow]` in the generated result, you need to increase the framebuf (the default value is 1'000'000), which can be configured explicitly, such as:
+::: tip
+you encounter `[frame_buffer_overflow]` in the generated result, you need to increase the framebuf (the default value is 1'000'000), which can be configured explicitly, such as:
+:::
```bash
profiler start --framebuf 5000000
@@ -184,7 +187,6 @@ profiler start --include'java/*' --include'demo/*' --exclude'*Unsafe.park*'
> Both include/exclude support setting multiple values, but need to be configured at the end of the command line.
-
### Specify execution time
For example, if you want the profiler to automatically end after 300 seconds, you can specify it with the `-d`/`--duration` parameter:
@@ -203,16 +205,14 @@ profiler start --file /tmp/test.jfr
The `file` parameter supports some variables:
-* Timestamp: `--file /tmp/test-%t.jfr`
-* Process ID: `--file /tmp/test-%p.jfr`
-
+- Timestamp: `--file /tmp/test-%t.jfr`
+- Process ID: `--file /tmp/test-%p.jfr`
The generated results can be viewed with tools that support the jfr format. such as:
-* JDK Mission Control: https://github.com/openjdk/jmc
-* JProfiler: https://github.com/alibaba/arthas/issues/1416
-
+- JDK Mission Control: https://github.com/openjdk/jmc
+- JProfiler: https://github.com/alibaba/arthas/issues/1416
### The 'unknown' in profiler result
-* https://github.com/jvm-profiling-tools/async-profiler/discussions/409
\ No newline at end of file
+- https://github.com/jvm-profiling-tools/async-profiler/discussions/409
diff --git a/site/src/site/sphinx/en/pwd.md b/site-vuepress/docs/en/doc/pwd.md
similarity index 69%
rename from site/src/site/sphinx/en/pwd.md
rename to site-vuepress/docs/en/doc/pwd.md
index a5ac649ad..022e56ea5 100644
--- a/site/src/site/sphinx/en/pwd.md
+++ b/site-vuepress/docs/en/doc/pwd.md
@@ -1,11 +1,11 @@
-pwd
-===
+# pwd
[`pwd` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-pwd)
-> Return working directory name
-
+::: tip
+Return working directory name
+:::
```bash
$ pwd
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/quick-start.md b/site-vuepress/docs/en/doc/quick-start.md
similarity index 97%
rename from site/src/site/sphinx/en/quick-start.md
rename to site-vuepress/docs/en/doc/quick-start.md
index cab86a0b8..f8f5ff334 100644
--- a/site/src/site/sphinx/en/quick-start.md
+++ b/site-vuepress/docs/en/doc/quick-start.md
@@ -1,5 +1,4 @@
-Quick Start
-===========
+# Quick Start
## 1. Start math-game
@@ -23,9 +22,9 @@ curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
```
-* The user to run this command *MUST* have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot.jar` or `sudo -u admin -EH java -jar arthas-boot.jar`
-* If you cannot be able to attach to the target process, please check the logs under `~/logs/arthas` for troubleshooting.
-* `java -jar arthas-boot.jar -h` print usage.
+- The user to run this command _MUST_ have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot.jar` or `sudo -u admin -EH java -jar arthas-boot.jar`
+- If you cannot be able to attach to the target process, please check the logs under `~/logs/arthas` for troubleshooting.
+- `java -jar arthas-boot.jar -h` print usage.
Select the target Java process to attach:
diff --git a/site-vuepress/docs/en/doc/quit.md b/site-vuepress/docs/en/doc/quit.md
new file mode 100644
index 000000000..8d92f91c6
--- /dev/null
+++ b/site-vuepress/docs/en/doc/quit.md
@@ -0,0 +1,7 @@
+# quit
+
+exit the current Arthas client without affecting other clients. equals **exit**、**logout**、**q** command.
+
+::: tip
+just exit Arthas client,it means Arthas server is not closed,so the changes you do will not be reseted.
+:::
diff --git a/site-vuepress/docs/en/doc/redefine.md b/site-vuepress/docs/en/doc/redefine.md
new file mode 100644
index 000000000..42c33716e
--- /dev/null
+++ b/site-vuepress/docs/en/doc/redefine.md
@@ -0,0 +1,119 @@
+# redefine
+
+::: tip
+Recommend to use the [retransform](retransform.md) command.
+:::
+
+[`mc-redefine` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-redefine)
+
+::: tip
+Load the external `*.class` files to re-define the loaded classes in JVM.
+:::
+
+Reference: [Instrumentation#redefineClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses-java.lang.instrument.ClassDefinition...-)
+
+### Frequently asked questions
+
+::: tip
+Recommend to use the [retransform](retransform.md) command.
+:::
+
+- The class of `redefine` cannot modify, add or delete the field and method of the class, including method parameters, method names and return values.
+
+- If `mc` fails, you can compile the class file in the local development environment, upload it to the target system, and use `redefine` to hot load the class.
+
+- At present, `redefine` conflicts with `watch / trace / jad / tt` commands. Reimplementing `redefine` function in the future will solve this problem.
+
+::: warning
+Notes: Re-defined classes cannot be restored. There are chances that redefining may fail due to some reasons, for example: there's new field introduced in the new version of the class, pls. refer to JDK's documentation for the limitations.
+:::
+
+::: tip
+The `reset` command is not valid for classes that have been processed by `redefine`. If you want to reset, you need `redefine` the original bytecode.
+:::
+
+::: tip
+The `redefine` command will conflict with the `jad`/`watch`/`trace`/`monitor`/`tt` commands. After executing `redefine`, if you execute the above mentioned command, the bytecode of the class will be reset.
+The reason is that in the JDK `redefine` and `retransform` are different mechanisms. When two mechanisms are both used to update the bytecode, only the last modified will take effect.
+:::
+
+### Options
+
+| Name | Specification |
+| --------------------: | :-------------------------------------------------------------- |
+| `[c:]` | hashcode of the class loader |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+
+### Usage
+
+```bash
+redefine /tmp/Test.class
+redefine -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
+redefine --classLoaderClass sun.misc.Launcher$AppClassLoader /tmp/Test.class /tmp/Test\$Inner.class
+```
+
+### Use with the jad/mc command
+
+```bash
+jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
+
+mc /tmp/UserController.java -d /tmp
+
+redefine /tmp/com/example/demo/arthas/user/UserController.class
+```
+
+- Use `jad` command to decompile bytecode, and then you can use other editors, such as vim to modify the source code.
+- `mc` command to compile the modified code
+- Load new bytecode with `redefine` command
+
+### Tips for uploading .class files to the server
+
+The `mc` command may fail. You can modify the code locally, compile it, and upload it to the server. Some servers do not allow direct uploading files, you can use the `base64` command to bypass.
+
+1. Convert the `.class` file to base64 first, then save it as result.txt
+
+ ```bash
+ Base64 < Test.class > result.txt
+ ```
+
+2. Login the server, create and edit `result.txt`, copy the local content, paste and save
+
+3. Restore `result.txt` on the server to `.class`
+
+ ```
+ Base64 -d < result.txt > Test.class
+ ```
+
+4. Use the md5 command to verify that the `.class` files are consistent.
+
+### Restrictions of the redefine command
+
+- New field/method is not allowed
+- The function that is running, no exit can not take effect, such as the new `System.out.println` added below, only the `run()` function will take effect.
+
+```java
+public class MathGame {
+ public static void main(String[] args) throws InterruptedException {
+ MathGame game = new MathGame();
+ while (true) {
+ game.run();
+ TimeUnit.SECONDS.sleep(1);
+ // This doesn't work because the code keeps running in while
+ System.out.println("in loop");
+ }
+ }
+
+ public void run() throws InterruptedException {
+ // This works because the run() function ends completely every time
+ System.out.println("call run()");
+ try {
+ int number = random.nextInt();
+ List primeFactors = primeFactors(number);
+ print(number, primeFactors);
+
+ } catch (Exception e) {
+ System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
+ }
+ }
+}
+```
diff --git a/site-vuepress/docs/en/doc/release-notes.md b/site-vuepress/docs/en/doc/release-notes.md
new file mode 100644
index 000000000..c8a77ae73
--- /dev/null
+++ b/site-vuepress/docs/en/doc/release-notes.md
@@ -0,0 +1,122 @@
+# Release Notes
+
+## v3.1.1
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.1.1](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.1.1)
+
+## v3.1.0
+
+- [https://github.com/alibaba/arthas/releases/tag/3.1.0](https://github.com/alibaba/arthas/releases/tag/3.1.0)
+
+## v3.0.5
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.5](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.5)
+
+## v3.0.4
+
+- [https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.4](https://github.com/alibaba/arthas/releases/tag/arthas-all-3.0.4)
+
+## v2017-11-03
+
+- [improvement] add [`getstatic`](getstatic.md)
+- [bug] fix Arthas class loader logs loading issues
+- [improvement] introduce [OGNL](https://en.wikipedia.org/wiki/OGNL) to customize `classloader` to invoke static methods
+- [improvement] optimise `termd` uppercase output performance
+- [improvement] `classloader` compile in class loader category by default
+- [bug] fix `wc` counting issue
+- [improvement] disable certain JDK classes e.g. `Classloader`, `Method`, `Integer` and the lik
+- [improvement] quit directly when encountering incorrect [OGNL](https://en.wikipedia.org/wiki/OGNL) expression
+- [bug] fix `pipe` issues
+- [improvement] optimize command re-direct features using asynchronous log
+- [improvement] [`trace`](trace.md) can filter JDK method calls
+
+## v2017-09-22
+
+- [improvement] improve the error message when starting agent and server fails
+- [bug] fix some asynchronous issues
+
+## v2017-09-11
+
+- [improvement] [`async`](async.md) supported
+- [improvement] optimize [`jad`](jad.md) support JDK 8 and inner class
+- [bug] fix Chinese encoding issues
+
+## v2017-05-11
+
+- [improvement] [`tt`](tt.md) investigating/recording level one to avoid too much performance overhead
+- [bug] fix Chinese characters can not be presented issue
+
+## v2017-05-12
+
+- Arthas 3.0 release :confetti_ball:
+
+## v2016-12-09
+
+- [feature] [`as.sh`](https://github.com/alibaba/arthas/blob/master/bin/as.sh) support `-h` to print help info
+- [bug] [#121] fix leftover temp files causing Arthas cannot start issue
+- [bug] [#123] fix `attach/shutdown` repeatedly causing Arthas classloader leakage issue
+- [improvement] make the help info more readable
+- [bug] [#126] fix the documents links issues
+- [bug] [#122] fix the [`classloader`](classloader.md) filtering out `sun.reflect.DelegatingClassLoader` issue
+- [bug] [#129] fix [`classloader`](classloader.md) presenting structure issues
+- [improvement] [#125] make the Arthas log output more readable
+- [improvement] [#96] [`sc`](sc.md) and more commands are supporting format as `com/taobao/xxx/TestClass`
+- [bug] [#124] fix the negative values of [`trace`](trace.md)
+- [improvement] [#128] the output of [`tt`](tt.md) will auto-expand now
+- [bug] [#130] providing more meaningful error messages when port conflicts
+- [bug] [#98] fix Arthas starting issue: when updating/downloading failed, Arthas will fail to start
+- [bug] [#139] fix agent attaching fails under some scenarios issues
+- [improvement] [#156] delay `jd-core-java` initialization to avoid Arthas starting failure
+- [bug] avoid thread names duplicate issue
+- [improvement] [#150] filtering by total time cost in [`trace`](trace.md)
+- [bug] fix [`sc`](sc.md) `NPE` issue when searching `SystemClassloader`
+- [bug] [#180] fix attach fails issues: attaching succeed at the first time, delete the Arthas installer, re-compile and package => attaching fails
+
+## v2016-06-07
+
+- [bug] fix NPE when loading `spy` as resource
+- [improvement] locating the blocking thread
+- [improvement] print out thread in name order
+- [improvement] specify the refreshing interval when checking topN busiest threads
+
+## v2016-04-08
+
+- [feature] specify refreshing interval and execution times in [`dashboard`](dashboard.md)
+- [feature] log the command execution result
+- [feature] speed up the booting and attaching while the first attaching is even quicker by 100% than before
+- [feature] batch supported; script supported
+- [feature] interactive mode used in Arthas
+- [feature] inheritance relation included in class searching; global option `disable-sub-class` can be used to turn it off
+- [feature] colorful and plain text modes both supported
+- [improvement] merge `exit` and `quit` commands
+- [improvement] help info enclosed with wiki links
+- [improvement] optimize [`watch`](watch.md) using flow for better UX
+- [improvement] add examples to [`thread`](thread.md)
+- [improvement] auto-completion ignores character case
+- [improvement] make the UI more beautiful/friendly
+- [bug] fix [`trace`](trace.md) printing too much encountering loop issues
+- [bug] fix [`trace`](trace.md) node twisting issues when method throwing exceptions
+- [bug] fix injected/enhanced `BootstrapClassLoader` cannot locate `spy` issues
+
+## v2016-03-07
+
+- [feature] checking the topN thread and related stack traces
+- [bug] fix Arthas starting failure in OpenJdk issues (requiring to reinstall [as.sh](https://github.com/alibaba/arthas/blob/master/bin/as.sh))
+- [improvement] optimize UX
+
+## v2016-01-18
+
+- [improvement] optimise [`jad`](jad.md); dump memory byte array in real time; using `jd-core-java` to decompile; line number presented;
+- [bug] fix checking/re-producing issues when [`tt`](tt.md) is watching thread-context related methods invoking
+
+## v2016-01-08
+
+- [bug] jad NPE
+- [bug] watch/monitor NPE
+- [bug] wrong escaping issues
+- [bug] wrong statistics
+- [bug] [`sc`](sc.md) checking internal structure issues
+
+## v2015-12-29
+
+- Arthas 2.0 Beta :boom:!
diff --git a/site/src/site/sphinx/en/reset.md b/site-vuepress/docs/en/doc/reset.md
similarity index 90%
rename from site/src/site/sphinx/en/reset.md
rename to site-vuepress/docs/en/doc/reset.md
index c339a5d96..c4b08c5f6 100644
--- a/site/src/site/sphinx/en/reset.md
+++ b/site-vuepress/docs/en/doc/reset.md
@@ -1,9 +1,10 @@
-reset
-===
+# reset
[`reset` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-reset)
-> Reset all classes that have been enhanced by Arthas. These enhanced classes will also be reset when Arthas server is `stop`.
+::: tip
+Reset all classes that have been enhanced by Arthas. These enhanced classes will also be reset when Arthas server is `stop`.
+:::
### Usage
diff --git a/site/src/site/sphinx/en/retransform.md b/site-vuepress/docs/en/doc/retransform.md
similarity index 58%
rename from site/src/site/sphinx/en/retransform.md
rename to site-vuepress/docs/en/doc/retransform.md
index 7af430b50..69a0bd325 100644
--- a/site/src/site/sphinx/en/retransform.md
+++ b/site-vuepress/docs/en/doc/retransform.md
@@ -1,9 +1,10 @@
-retransform
-========
+# retransform
[`mc-retransform` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-retransform)
-> Load the external `*.class` files to retransform the loaded classes in JVM.
+::: tip
+Load the external `*.class` files to retransform the loaded classes in JVM.
+:::
Reference: [Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-)
@@ -19,7 +20,7 @@ Reference: [Instrumentation#retransformClasses](https://docs.oracle.com/javase/8
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.class
```
-### retransform the specified .class file
+### retransform the specified .class file
```bash
$ retransform /tmp/MathGame.class
@@ -29,7 +30,9 @@ demo.MathGame
Load the specified .class file, then parse out the class name, and then retransform the corresponding class loaded in the jvm. Every time a `.class` file is loaded, a retransform entry is recorded.
-> If retransform is executed multiple times to load the same class file, there will be multiple retransform entries.
+::: tip
+If retransform is executed multiple times to load the same class file, there will be multiple retransform entries.
+:::
### View retransform entry
@@ -39,7 +42,8 @@ Id ClassName TransformCount LoaderHash LoaderClassName
1 demo.MathGame 1 null null
```
-* TransformCount counts the times of attempts to return the .class file corresponding to the entry in the ClassFileTransformer#transform method, but it does not mean that the transform must be successful.
+- TransformCount counts the times of attempts to return the .class file corresponding to the entry in the ClassFileTransformer#transform method, but it does not mean that the transform must be successful.
+
### Delete the specified retransform entry
Need to specify id:
@@ -62,16 +66,20 @@ retransform success, size: 1, classes:
demo.MathGame
```
-> Note: For the same class, when there are multiple retransform entries, if retransform is explicitly triggered, the entry added last will take effect (the one with the largest id).
+::: warning
+Note: For the same class, when there are multiple retransform entries, if retransform is explicitly triggered, the entry added last will take effect (the one with the largest id).
+:::
### Eliminate the influence of retransform
If you want to eliminate the impact after performing retransform on a class, you need to:
-* Delete the retransform entry corresponding to this class
-* Re-trigger retransform
+- Delete the retransform entry corresponding to this class
+- Re-trigger retransform
-> If you do not clear all retransform entries and trigger retransform again, the retransformed classes will still take effect when arthas stop.
+::: tip
+If you do not clear all retransform entries and trigger retransform again, the retransformed classes will still take effect when arthas stop.
+:::
### Use with the jad/mc command
@@ -83,9 +91,9 @@ mc /tmp/UserController.java -d /tmp
retransform /tmp/com/example/demo/arthas/user/UserController.class
```
-* Use `jad` command to decompile bytecode, and then you can use other editors, such as vim to modify the source code.
-* `mc` command to compile the modified code
-* Load new bytecode with `retransform` command
+- Use `jad` command to decompile bytecode, and then you can use other editors, such as vim to modify the source code.
+- `mc` command to compile the modified code
+- Load new bytecode with `retransform` command
### Tips for uploading .class files to the server
@@ -93,48 +101,48 @@ The `mc` command may fail. You can modify the code locally, compile it, and uplo
1. Convert the `.class` file to base64 first, then save it as result.txt
- ```bash
- Base64 < Test.class > result.txt
- ```
+ ```bash
+ Base64 < Test.class > result.txt
+ ```
2. Login the server, create and edit `result.txt`, copy the local content, paste and save
3. Restore `result.txt` on the server to `.class`
- ```
- Base64 -d < result.txt > Test.class
- ```
+ ```
+ Base64 -d < result.txt > Test.class
+ ```
4. Use the md5 command to verify that the `.class` files are consistent.
-
### Restrictions of the retransform command
-* New field/method is not allowed
-* The function that is running, no exit can not take effect, such as the new `System.out.println` added below, only the `run()` function will take effect.
-
- ```java
- public class MathGame {
- public static void main(String[] args) throws InterruptedException {
- MathGame game = new MathGame();
- while (true) {
- game.run();
- TimeUnit.SECONDS.sleep(1);
- // This doesn't work because the code keeps running in while
- System.out.println("in loop");
- }
+- New field/method is not allowed
+- The function that is running, no exit can not take effect, such as the new `System.out.println` added below, only the `run()` function will take effect.
+
+```java
+public class MathGame {
+ public static void main(String[] args) throws InterruptedException {
+ MathGame game = new MathGame();
+ while (true) {
+ game.run();
+ TimeUnit.SECONDS.sleep(1);
+ // This doesn't work because the code keeps running in while
+ System.out.println("in loop");
}
-
- public void run() throws InterruptedException {
- // This works because the run() function ends completely every time
- System.out.println("call run()");
- try {
- int number = random.nextInt();
- List primeFactors = primeFactors(number);
- print(number, primeFactors);
-
- } catch (Exception e) {
- System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
- }
+ }
+
+ public void run() throws InterruptedException {
+ // This works because the run() function ends completely every time
+ System.out.println("call run()");
+ try {
+ int number = random.nextInt();
+ List primeFactors = primeFactors(number);
+ print(number, primeFactors);
+
+ } catch (Exception e) {
+ System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
}
-```
\ No newline at end of file
+ }
+}
+```
diff --git a/site/src/site/sphinx/en/save-log.md b/site-vuepress/docs/en/doc/save-log.md
similarity index 53%
rename from site/src/site/sphinx/en/save-log.md
rename to site-vuepress/docs/en/doc/save-log.md
index e4b64de70..9373284f8 100644
--- a/site/src/site/sphinx/en/save-log.md
+++ b/site-vuepress/docs/en/doc/save-log.md
@@ -1,25 +1,26 @@
-Log command outputs
-===================
+# Log command outputs
[`Log command outputs` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=case-save-log)
-> Log command outputs for later analysis
+::: tip
+Log command outputs for later analysis
+:::
-* By default, this behavior is turned off. To enable it, execute the command below:
+- By default, this behavior is turned off. To enable it, execute the command below:
- ```bash
- $ options save-result true
- NAME BEFORE-VALUE AFTER-VALUE
- ----------------------------------------
- save-result false true
- Affect(row-cnt:1) cost in 3 ms.
- ```
+ ```bash
+ $ options save-result true
+ NAME BEFORE-VALUE AFTER-VALUE
+ ----------------------------------------
+ save-result false true
+ Affect(row-cnt:1) cost in 3 ms.
+ ```
- If the message above is output on the console, then this behavior is enabled successfully.
-
-* Log file path
+ If the message above is output on the console, then this behavior is enabled successfully.
- The command execution result will be save in `{user.home}/logs/arthas-cache/result.log`. Pls. clean it up regularly to save disk space.
+- Log file path
+
+ The command execution result will be save in `{user.home}/logs/arthas-cache/result.log`. Pls. clean it up regularly to save disk space.
### Use asynchronous job to log
@@ -31,6 +32,5 @@ cache location : /Users/zhuyong/logs/arthas-cache/28198/2
By doing this, the command will run at background asynchronously, and output the execution result into `~/logs/arthas-cache/{PID}/{JobId}`:
-* The background job will continue to run even if the current session is disconnected. The default job timeout value is 1 day, use global '[options](options.md)' command to alternate it.
-* The execution result will be output into the file asynchronously. Pls. note the behavior of this command is not controlled by `save-result` option from global [options](options.md). No matter `save-result` is set to `true` or not, this command will write into `~/logs/arthas-cache/{PID}/{JobId}` anyway, instead of into `~/logs/arthas-cache/result.log`.
-
+- The background job will continue to run even if the current session is disconnected. The default job timeout value is 1 day, use global '[options](options.md)' command to alternate it.
+- The execution result will be output into the file asynchronously. Pls. note the behavior of this command is not controlled by `save-result` option from global [options](options.md). No matter `save-result` is set to `true` or not, this command will write into `~/logs/arthas-cache/{PID}/{JobId}` anyway, instead of into `~/logs/arthas-cache/result.log`.
diff --git a/site-vuepress/docs/en/doc/sc.md b/site-vuepress/docs/en/doc/sc.md
new file mode 100644
index 000000000..431a9923e
--- /dev/null
+++ b/site-vuepress/docs/en/doc/sc.md
@@ -0,0 +1,107 @@
+# sc
+
+[`sc` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-sc)
+
+::: tip
+Search classes loaded by JVM.
+:::
+
+`sc` stands for search class. This command can search all possible classes loaded by JVM and show their information. The supported options are: `[d]`、`[E]`、`[f]` and `[x:]`.
+
+### Supported Options
+
+| Name | Specification |
+| --------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| _class-pattern_ | pattern for the class name |
+| _method-pattern_ | pattern for the method name |
+| `[d]` | print the details of the current class, including its code source, class specification, its class loader and so on.
If a class is loaded by more than one class loader, then the class details will be printed several times |
+| `[E]` | turn on regex match, the default behavior is wildcards match |
+| `[f]` | print the fields info of the current class, MUST be used with `-d` together |
+| `[x:]` | specify the depth of recursive traverse the static fields, the default value is '0' - equivalent to use `toString` to output |
+| `[c:]` | The hash code of the special class's classLoader |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| `[n:]` | Maximum number of matching classes with details (100 by default) |
+
+::: tip
+_class-patten_ supports full qualified class name, e.g. com.taobao.test.AAA and com/taobao/test/AAA. It also supports the format of 'com/taobao/test/AAA', so that it is convenient to directly copy class name from the exception stack trace without replacing '/' to '.'.
+:::
+
+::: tip
+`sc` turns on matching sub-class match by default, that is, `sc` will also search the sub classes of the target class too. If exact-match is desired, pls. use `options disable-sub-class true`.
+:::
+
+### Usage
+
+- Wildcards match search
+
+ ```bash
+ $ sc demo.*
+ demo.MathGame
+ Affect(row-cnt:1) cost in 55 ms.
+ ```
+
+- View class details
+
+ ```bash
+ $ sc -d demo.MathGame
+ class-info demo.MathGame
+ code-source /private/tmp/math-game.jar
+ name demo.MathGame
+ isInterface false
+ isAnnotation false
+ isEnum false
+ isAnonymousClass false
+ isArray false
+ isLocalClass false
+ isMemberClass false
+ isPrimitive false
+ isSynthetic false
+ simple-name MathGame
+ modifier public
+ annotation
+ interfaces
+ super-class +-java.lang.Object
+ class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+ classLoaderHash 3d4eac69
+
+ Affect(row-cnt:1) cost in 875 ms.
+ ```
+
+- View class fields
+
+ ```bash
+ $ sc -d -f demo.MathGame
+ class-info demo.MathGame
+ code-source /private/tmp/math-game.jar
+ name demo.MathGame
+ isInterface false
+ isAnnotation false
+ isEnum false
+ isAnonymousClass false
+ isArray false
+ isLocalClass false
+ isMemberClass false
+ isPrimitive false
+ isSynthetic false
+ simple-name MathGame
+ modifier public
+ annotation
+ interfaces
+ super-class +-java.lang.Object
+ class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+ +-sun.misc.Launcher$ExtClassLoader@66350f69
+ classLoaderHash 3d4eac69
+ fields modifierprivate,static
+ type java.util.Random
+ name random
+ value java.util.Random@522b4
+ 08a
+
+ modifierprivate
+ type int
+ name illegalArgumentCount
+
+
+ Affect(row-cnt:1) cost in 19 ms.
+ ```
diff --git a/site/src/site/sphinx/en/session.md b/site-vuepress/docs/en/doc/session.md
similarity index 62%
rename from site/src/site/sphinx/en/session.md
rename to site-vuepress/docs/en/doc/session.md
index 3597c76b2..c8bce31f4 100644
--- a/site/src/site/sphinx/en/session.md
+++ b/site-vuepress/docs/en/doc/session.md
@@ -1,13 +1,11 @@
-session
-===
+# session
examines the current session,show the current binded processId and the sessionId.
+::: tip
+if exits tunnel server,it will also show agentId、tunnelServerUrl、connected status.
-> if exits tunnel server,it will also show agentId、tunnelServerUrl、connected status.
->
-> if exits statUrl,it will also show statUrl.
-
-
+if exits statUrl,it will also show statUrl.
+:::
### Usage
@@ -18,4 +16,3 @@ $ session
JAVA_PID 14584
SESSION_ID c2073d3b-443a-4a9b-9249-0c5d24a5756c
```
-
diff --git a/site/src/site/sphinx/en/sm.md b/site-vuepress/docs/en/doc/sm.md
similarity index 68%
rename from site/src/site/sphinx/en/sm.md
rename to site-vuepress/docs/en/doc/sm.md
index 47852adef..2e2c40003 100644
--- a/site/src/site/sphinx/en/sm.md
+++ b/site-vuepress/docs/en/doc/sm.md
@@ -1,24 +1,24 @@
-sm
-==
+# sm
[`sm` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-sm)
-> Search method from the loaded classes.
+::: tip
+Search method from the loaded classes.
+:::
`sm` stands for search method. This command can search and show method information from all loaded classes. `sm` can only view the methods declared on the target class, that is, methods from its parent classes are invisible.
-
### Options
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for class name|
-|*method-pattern*|pattern for method name|
-|`[d]`|print the details of the method|
-|`[E]`|turn on regex matching while the default mode is wildcard matching|
-|`[c:]`|The hash code of the special class's classLoader|
-|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. |
-|`[n:]`|Maximum number of matching classes with details (100 by default)|
+| Name | Specification |
+| --------------------: | :----------------------------------------------------------------- |
+| _class-pattern_ | pattern for class name |
+| _method-pattern_ | pattern for method name |
+| `[d]` | print the details of the method |
+| `[E]` | turn on regex matching while the default mode is wildcard matching |
+| `[c:]` | The hash code of the special class's classLoader |
+| `[classLoaderClass:]` | The class name of the ClassLoader that executes the expression. |
+| `[n:]` | Maximum number of matching classes with details (100 by default) |
### Usage
@@ -73,7 +73,6 @@ java.lang.String->intern
Affect(row-cnt:44) cost in 1342 ms.
```
-
View method `java.lang.String#toString` details:
```bash
@@ -87,4 +86,4 @@ $ sm -d java.lang.String toString
exceptions
Affect(row-cnt:1) cost in 3 ms.
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/spring-boot-starter.md b/site-vuepress/docs/en/doc/spring-boot-starter.md
similarity index 79%
rename from site/src/site/sphinx/en/spring-boot-starter.md
rename to site-vuepress/docs/en/doc/spring-boot-starter.md
index d4b711f02..3b0b2da99 100644
--- a/site/src/site/sphinx/en/spring-boot-starter.md
+++ b/site-vuepress/docs/en/doc/spring-boot-starter.md
@@ -1,7 +1,8 @@
-Arthas Spring Boot Starter
-=====
+# Arthas Spring Boot Starter
-> Support spring boot 2
+::: tip
+Support spring boot 2
+:::
Latest Version: [View](https://search.maven.org/search?q=arthas-spring-boot-starter)
@@ -17,7 +18,6 @@ Add maven dependency:
When the application is started, spring will start arthas and attach its own process.
-
### Configuration properties
For example, by configuring the tunnel server for remote management.
@@ -29,13 +29,17 @@ arthas.tunnel-server=ws://47.75.156.201:7777/ws
All supported configuration: [Reference](https://github.com/alibaba/arthas/blob/master/arthas-spring-boot-starter/src/main/java/com/alibaba/arthas/spring/ArthasProperties.java)
-> By default, arthas-spring-boot-starter will disable the `stop` command.
+::: tip
+By default, arthas-spring-boot-starter will disable the `stop` command.
+:::
Reference: [Arthas Properties](arthas-properties.md)
### View Endpoint Information
-> Need to configure spring boot to expose endpoint: [Reference](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints).
+::: tip
+Need to configure spring boot to expose endpoint: [Reference](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints).
+:::
Assuming the endpoint port is 8080, it can be viewed via the following url.
@@ -71,7 +75,7 @@ Non-Spring Boot applications can be used in the following ways.
import com.taobao.arthas.agent.attach.ArthasAgent;
public class ArthasAttachExample {
-
+
public static void main(String[] args) {
ArthasAgent.attach();
}
@@ -79,7 +83,6 @@ public class ArthasAttachExample {
}
```
-
You can also configure properties:
```java
@@ -89,4 +92,6 @@ You can also configure properties:
ArthasAgent.attach(configMap);
```
-> Note that the configuration must be `camel case`, which is different from the `-` style of spring boot. Only the spring boot application supports both `camel case` and `-` style configuration.
\ No newline at end of file
+::: warning
+Note that the configuration must be `camel case`, which is different from the `-` style of spring boot. Only the spring boot application supports both `camel case` and `-` style configuration.
+:::
diff --git a/site/src/site/sphinx/en/stack.md b/site-vuepress/docs/en/doc/stack.md
similarity index 75%
rename from site/src/site/sphinx/en/stack.md
rename to site-vuepress/docs/en/doc/stack.md
index 904f2aaea..59d07369e 100644
--- a/site/src/site/sphinx/en/stack.md
+++ b/site-vuepress/docs/en/doc/stack.md
@@ -1,29 +1,31 @@
-stack
-=====
+# stack
[`stack` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-stack)
-> Print out the full call stack of the current method.
+::: tip
+Print out the full call stack of the current method.
+:::
Most often we know one method gets called, but we have no idea on which code path gets executed or when the method gets called since there are so many code paths to the target method. The command `stack` comes to rescue in this difficult situation.
### Parameters
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for the class name|
-|*method-pattern*|pattern for the method name|
-|*condition-expression*|condition expression|
-|`[E]`|turn on regex match, the default behavior is wildcard match|
-|`[n:]`|execution times|
+| Name | Specification |
+| ---------------------: | :---------------------------------------------------------- |
+| _class-pattern_ | pattern for the class name |
+| _method-pattern_ | pattern for the method name |
+| _condition-expression_ | condition expression |
+| `[E]` | turn on regex match, the default behavior is wildcard match |
+| `[n:]` | execution times |
There's one thing worthy noting here is observation expression. The observation expression supports OGNL grammar, for example, you can come up a expression like this `"{params,returnObj}"`. All OGNL expressions are supported as long as they are legal to the grammar.
Thanks for `advice`'s data structure, it is possible to observe from varieties of different angles. Inside `advice` parameter, all necessary information for notification can be found.
Pls. refer to [core parameters in expression](advice-class.md) for more details.
-* Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage
-* OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+
+- Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage
+- OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
### Usage
@@ -31,7 +33,6 @@ Pls. refer to [core parameters in expression](advice-class.md) for more details.
Start `math-game` in [Quick Start](quick-start.md).
-
#### stack
```bash
@@ -60,7 +61,6 @@ ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun
Command execution times exceed limit: 2, so command will exit. You can set it with -n option.
```
-
#### Filtering by cost
```bash
@@ -71,5 +71,3 @@ ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```
-
-
diff --git a/site/src/site/sphinx/en/start-arthas.md b/site-vuepress/docs/en/doc/start-arthas.md
similarity index 82%
rename from site/src/site/sphinx/en/start-arthas.md
rename to site-vuepress/docs/en/doc/start-arthas.md
index 482ba14a8..564fe4b34 100644
--- a/site/src/site/sphinx/en/start-arthas.md
+++ b/site-vuepress/docs/en/doc/start-arthas.md
@@ -1,5 +1,4 @@
-Start Arthas
-=====
+# Start Arthas
## Interactive Mode
@@ -32,19 +31,19 @@ Startup script is as follows:
### Parameter Description
-* *PID*: Target Java process ID (Make sure that the user executing the command has sufficient permissions to operate the target Java process.)
-* *IP*: The address that Arthas Server listens on, the default value is `127.0.0.1`. Arthas allows multiple users to access simultaneously without interfering with each other.
-* *PORT*: Arthas Server port,the default value is 3658
+- _PID_: Target Java process ID (Make sure that the user executing the command has sufficient permissions to operate the target Java process.)
+- _IP_: The address that Arthas Server listens on, the default value is `127.0.0.1`. Arthas allows multiple users to access simultaneously without interfering with each other.
+- _PORT_: Arthas Server port,the default value is 3658
### Sample
-* If IP and PORT are not specified, then the default values are 127.0.0.1 and 3658
+- If IP and PORT are not specified, then the default values are 127.0.0.1 and 3658
- > ./as.sh 12345
+ > ./as.sh 12345
- Equivalent to:
-
- > ./as.sh 12356@127.0.0.1:3658
+ Equivalent to:
+
+ > ./as.sh 12356@127.0.0.1:3658
### Remote Diagnosis
@@ -53,7 +52,7 @@ After starting Arthas Server on the target Java process, users can use `telnet`
```bash
telnet 192.168.1.119 3658
```
-
+
### sudo Support
Usually online environment will only grant users privilege as low as possible, instead, all advanced operations are through sudo-list. Since `as.sh` script takes into account the current effective user, it is possible to run the script in the other rule, by specifying `-H` option like this:
@@ -62,7 +61,6 @@ Usually online environment will only grant users privilege as low as possible, i
sudo -u admin -H ./as.sh 12345
```
-
### Windows Support
Right now `as.bat` script supports one parameter only, which is: pid
diff --git a/site/src/site/sphinx/en/stop.md b/site-vuepress/docs/en/doc/stop.md
similarity index 56%
rename from site/src/site/sphinx/en/stop.md
rename to site-vuepress/docs/en/doc/stop.md
index 84b3f71cc..86589bbec 100644
--- a/site/src/site/sphinx/en/stop.md
+++ b/site-vuepress/docs/en/doc/stop.md
@@ -1,7 +1,7 @@
-Stop
-===
+# Stop
terminates the Arthas server, all the Arthas clients connecting to this server will be disconnected.
-> the class redefined by redefine command will not be reset.
-
+::: tip
+the class redefined by redefine command will not be reset.
+:::
diff --git a/site/src/site/sphinx/en/sysenv.md b/site-vuepress/docs/en/doc/sysenv.md
similarity index 94%
rename from site/src/site/sphinx/en/sysenv.md
rename to site-vuepress/docs/en/doc/sysenv.md
index 8973a9a75..40962c1dd 100644
--- a/site/src/site/sphinx/en/sysenv.md
+++ b/site-vuepress/docs/en/doc/sysenv.md
@@ -1,9 +1,10 @@
-sysenv
-=======================
+# sysenv
[`sysenv` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-sysenv)
-> View the current JVM environment variables.
+::: tip
+View the current JVM environment variables.
+:::
### Usage
@@ -24,11 +25,10 @@ sysenv
OPTIONS:
-h, --help this help
env name
- ```
+```
#### View all environment variables
-
```
$ sysenv
KEY VALUE
@@ -67,7 +67,9 @@ $ sysenv
#### View individual environment variables
-> Use `tab` for auto-completion
+::: tip
+Use `tab` for auto-completion
+:::
```
$ sysenv USER
diff --git a/site/src/site/sphinx/en/sysprop.md b/site-vuepress/docs/en/doc/sysprop.md
similarity index 98%
rename from site/src/site/sphinx/en/sysprop.md
rename to site-vuepress/docs/en/doc/sysprop.md
index c16999d65..ae614ff99 100644
--- a/site/src/site/sphinx/en/sysprop.md
+++ b/site-vuepress/docs/en/doc/sysprop.md
@@ -1,9 +1,10 @@
-sysprop
-=======
+# sysprop
[`sysprop` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-sysprop)
-> Examine the system properties from the target JVM
+::: tip
+Examine the system properties from the target JVM
+:::
### Usage
@@ -30,7 +31,6 @@ sysprop
#### Check all properties
-
```
$ sysprop
KEY VALUE
@@ -106,7 +106,9 @@ $ sysprop
#### Check One Single Property
-> Use `tab` for auto-completion
+::: tip
+Use `tab` for auto-completion
+:::
```bash
$ sysprop java.version
diff --git a/site/src/site/sphinx/en/tee.md b/site-vuepress/docs/en/doc/tee.md
similarity index 66%
rename from site/src/site/sphinx/en/tee.md
rename to site-vuepress/docs/en/doc/tee.md
index 380eddf8f..c337240ad 100644
--- a/site/src/site/sphinx/en/tee.md
+++ b/site-vuepress/docs/en/doc/tee.md
@@ -1,12 +1,12 @@
-tee
-===
+# tee
[`tee` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-tee)
-> Similar to the traditional `tee` command, it is used to read standard input data and output its contents into a file.
-
-> `tee` will read data from standard input device, output its content to standard output device, and save it as a file.
+::: tip
+Similar to the traditional `tee` command, it is used to read standard input data and output its contents into a file.
+`tee` will read data from standard input device, output its content to standard output device, and save it as a file.
+:::
```
USAGE:
@@ -26,4 +26,4 @@ tee
-a, --append Append to file
-h, --help this help
File path
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/thread.md b/site-vuepress/docs/en/doc/thread.md
similarity index 88%
rename from site/src/site/sphinx/en/thread.md
rename to site-vuepress/docs/en/doc/thread.md
index 092a4f109..889862ed7 100644
--- a/site/src/site/sphinx/en/thread.md
+++ b/site-vuepress/docs/en/doc/thread.md
@@ -1,31 +1,33 @@
-thread
-======
+# thread
[`thread` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-thread)
-> Check the basic info and stack trace of the target thread.
+::: tip
+Check the basic info and stack trace of the target thread.
+:::
### Parameters
-|Name|Specification|
-|---:|:---|
-|*id*|thread id in JVM|
-|`[n:]`|the top n busiest threads with stack traces printed|
-|`[b]`|locate the thread blocking the others|
-|[i ``]|specify the interval to collect data to compute CPU ratios (ms)|
-|[--all]|Show all matching threads|
+| Name | Specification |
+| ------------: | :-------------------------------------------------------------- |
+| _id_ | thread id in JVM |
+| `[n:]` | the top n busiest threads with stack traces printed |
+| `[b]` | locate the thread blocking the others |
+| [i ``] | specify the interval to collect data to compute CPU ratios (ms) |
+| [--all] | Show all matching threads |
-### How the CPU ratios are calculated?
+### How the CPU ratios are calculated?
-The cpu ratios here is similar to the thread `%CPU` of the linux command `top -H -p `. During a sampling interval,
+The cpu ratios here is similar to the thread `%CPU` of the linux command `top -H -p `. During a sampling interval,
the ratio of the incremental cpu time of each thread in the current JVM to the sampling interval time.
-> Working principle description:
-* Do the first sampling, get the CPU time of all threads ( by calling `java.lang.management.ThreadMXBean#getThreadCpuTime()` and
-`sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()` )
-* Sleep and wait for an interval (the default is 200ms, the interval can be specified by `-i`)
-* Do the second sampling, get the CPU time of all threads, compare the two sampling data, and calculate the incremental CPU time of each thread
-* `Thread CPU usage ratio` = `Thread increment CPU time` / `Sampling interval time` * 100%
+#### Working principle description:
+
+- Do the first sampling, get the CPU time of all threads ( by calling `java.lang.management.ThreadMXBean#getThreadCpuTime()` and
+ `sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()` )
+- Sleep and wait for an interval (the default is 200ms, the interval can be specified by `-i`)
+- Do the second sampling, get the CPU time of all threads, compare the two sampling data, and calculate the incremental CPU time of each thread
+- `Thread CPU usage ratio` = `Thread increment CPU time` / `Sampling interval time` \* 100%
> Note: this operation consumes CPU time too (`getThreadCpuTime` is time-consuming), therefore it is possible to observe Arthas's thread appears in the list. To avoid this, try to increase sample interval, for example: 5000 ms.
@@ -61,18 +63,17 @@ $ thread -n 3
"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms
```
-* Without thread ID, including `[Internal]` means JVM internal thread, refer to the introduction of [dashboard](dashboard.md) command.
-* `cpuUsage` is the CPU usage of the thread during the sampling interval, consistent with the data of the [dashboard](dashboard.md) command.
-* `deltaTime` is the incremental CPU time of the thread during the sampling interval. If it is less than 1ms, it will be rounded and displayed as 0ms.
-* `time` The total CPU time of thread.
+- Without thread ID, including `[Internal]` means JVM internal thread, refer to the introduction of [dashboard](dashboard.md) command.
+- `cpuUsage` is the CPU usage of the thread during the sampling interval, consistent with the data of the [dashboard](dashboard.md) command.
+- `deltaTime` is the incremental CPU time of the thread during the sampling interval. If it is less than 1ms, it will be rounded and displayed as 0ms.
+- `time` The total CPU time of thread.
-**Note:** The thread stack is acquired at the end of the second sampling, which does not indicate that the thread is
-processing the same task during the sampling interval. It is recommended that the interval time should not be too long.
+**Note:** The thread stack is acquired at the end of the second sampling, which does not indicate that the thread is
+processing the same task during the sampling interval. It is recommended that the interval time should not be too long.
The larger the interval time, the more inaccurate.
You can try to specify different intervals according to the specific situation and observe the output results.
-
#### List first page threads' info when no options provided
By default, they are arranged in descending order of CPU increment time, and only the first page of data is displayed.
@@ -162,12 +163,11 @@ $ thread -b
> Note: By now Arthas only supports to locate the thread blocked by `synchronzied`, while `java.util.concurrent.Lock` is not supported yet.
-
#### thread -i, specify the sampling interval
-* `thread -i 1000`: Count the thread cpu time of the last 1000ms.
+- `thread -i 1000`: Count the thread cpu time of the last 1000ms.
-* `thread -n 3 -i 1000`: List the 3 busiest thread stacks in 1000ms
+- `thread -n 3 -i 1000`: List the 3 busiest thread stacks in 1000ms
```bash
$ thread -n 3 -i 1000
diff --git a/site/src/site/sphinx/en/trace.md b/site-vuepress/docs/en/doc/trace.md
similarity index 77%
rename from site/src/site/sphinx/en/trace.md
rename to site-vuepress/docs/en/doc/trace.md
index ed9b5d421..35c4d2a74 100644
--- a/site/src/site/sphinx/en/trace.md
+++ b/site-vuepress/docs/en/doc/trace.md
@@ -1,43 +1,46 @@
-trace
-=====
+# trace
[`trace` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-trace)
-> Trace method calling path, and output the time cost for each node in the path.
+::: tip
+Trace method calling path, and output the time cost for each node in the path.
+:::
`trace` can track the calling path specified by `class-pattern` / `method-pattern`, and calculate the time cost on the whole path.
### Parameters
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for the class name|
-|*method-pattern*|pattern for the method name|
-|*condition-express*|condition expression|
-|`[E]`|enable regex match, the default behavior is wildcards match|
-|`[n:]`|execution times|
-|#cost|time cost|
+| Name | Specification |
+| ------------------: | :---------------------------------------------------------- |
+| _class-pattern_ | pattern for the class name |
+| _method-pattern_ | pattern for the method name |
+| _condition-express_ | condition expression |
+| `[E]` | enable regex match, the default behavior is wildcards match |
+| `[n:]` | execution times |
+| #cost | time cost |
There's one thing worthy noting here is observation expression. The observation expression supports OGNL grammar, for example, you can come up a expression like this `"{params,returnObj}"`. All OGNL expressions are supported as long as they are legal to the grammar.
Thanks for `advice`'s data structure, it is possible to observe from varieties of different angles. Inside `advice` parameter, all necessary information for notification can be found.
Pls. refer to [core parameters in expression](advice-class.md) for more details.
-* Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage
-* OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
-Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: `trace *StringUtils isBlank '#cost>100'` means trace result will only be output when the executing time exceeds 100ms.
+- Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage
+- OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: `trace *StringUtils isBlank '#cost>100'` means trace result will only be output when the executing time exceeds 100ms.
-> `watch`/`stack`/`trace`, these three commands all support `#cost`.
+::: tip
+`watch`/`stack`/`trace`, these three commands all support `#cost`.
+:::
### Notice
-* `trace` is handy to help discovering and locating the performance flaws in your system, but pls. note Arthas can only trace the first level method call each time.
+- `trace` is handy to help discovering and locating the performance flaws in your system, but pls. note Arthas can only trace the first level method call each time.
-* After version 3.3.0, you can use the Dynamic Trace feature to add new matching classes/methods, see the following example.
+- After version 3.3.0, you can use the Dynamic Trace feature to add new matching classes/methods, see the following example.
-* Currently `trace java.lang.Thread getName` is not supported, please refer to issue: [#1610](https://github.com/alibaba/arthas/issues/1610), considering that it is not very necessary and it is difficult to repair , So it won’t be fixed for now
+- Currently `trace java.lang.Thread getName` is not supported, please refer to issue: [#1610](https://github.com/alibaba/arthas/issues/1610), considering that it is not very necessary and it is difficult to repair , So it won’t be fixed for now
### Usage
@@ -60,7 +63,9 @@ Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
`---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception]
```
-> The `#24` in the result indicates that in the run function, the `primeFactors()` function was called on line `24` of the source file.
+::: tip
+The `#24` in the result indicates that in the run function, the `primeFactors()` function was called on line `24` of the source file.
+:::
#### Trace times limit
@@ -80,7 +85,7 @@ Command execution times exceed limit: 1, so command will exit. You can set it wi
#### Include jdk method
-* `--skipJDKMethod ` skip jdk method trace, default value true.
+- `--skipJDKMethod ` skip jdk method trace, default value true.
```bash
$ trace --skipJDKMethod false demo.MathGame run
@@ -124,13 +129,14 @@ Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---[0.05447ms] demo.MathGame:print()
```
-> Only the call path which's time cost is higher than `10ms` will be shown. This feature is handy to focus on what's needed to focus when troubleshoot.
-
-* Here Arthas provides the similar functionality JProfile and other commercial software provide. Compared to these professional softwares, Arthas doesn't deduce the time cost `trace` itself takes, therefore it is not as accurate as these softwares offer. More classes and methods on the calling path, more inaccurate `trace` output is, but it is still helpful for diagnostics where the bottleneck is.
-* "[12.033735ms]" means the method on the node takes `12.033735` ms.
-* "[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] demo:call()" means aggregating all same method calls into one single line. The minimum time cost is `0.005428` ms, the maximum time cost is `0.094064` ms, and the total time cost for all method calls (`3` times in total) to "demo:call()" is `0.105228ms`. If "throws Exception" appears in this line, it means some exceptions have been thrown from this method calls.
-* The total time cost may not equal to the sum of the time costs each sub method call takes, this is because Arthas instrumented code takes time too.
+::: tip
+Only the call path which's time cost is higher than `10ms` will be shown. This feature is handy to focus on what's needed to focus when troubleshoot.
+:::
+- Here Arthas provides the similar functionality JProfile and other commercial software provide. Compared to these professional softwares, Arthas doesn't deduce the time cost `trace` itself takes, therefore it is not as accurate as these softwares offer. More classes and methods on the calling path, more inaccurate `trace` output is, but it is still helpful for diagnostics where the bottleneck is.
+- "[12.033735ms]" means the method on the node takes `12.033735` ms.
+- "[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] demo:call()" means aggregating all same method calls into one single line. The minimum time cost is `0.005428` ms, the maximum time cost is `0.094064` ms, and the total time cost for all method calls (`3` times in total) to "demo:call()" is `0.105228ms`. If "throws Exception" appears in this line, it means some exceptions have been thrown from this method calls.
+- The total time cost may not equal to the sum of the time costs each sub method call takes, this is because Arthas instrumented code takes time too.
#### Trace multiple classes or multiple methods
@@ -142,10 +148,11 @@ You can use the regular expression to match multiple classes and methods on the
Trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
```
-
#### Exclude the specified class
-> The watch/trace/monitor/stack/tt commands all support the `--exclude-class-pattern` parameter
+::: tip
+The watch/trace/monitor/stack/tt commands all support the `--exclude-class-pattern` parameter
+:::
Use the `--exclude-class-pattern` parameter to exclude the specified class, for example:
@@ -155,7 +162,9 @@ watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
#### Dynamic trace
-> Supported since version 3.3.0.
+::: tip
+Supported since version 3.3.0.
+:::
Open terminal 1, trace the `run` method in the above demo, and you can see the printout `listenerId: 1` .
@@ -201,7 +210,6 @@ At terminal 1, you can see that the trace result has increased by one layer:
Dynamic trace by specifying `listenerId`, you can go deeper and deeper. In addition, commands such as `watch`/`tt`/`monitor` also support similar functionality.
-
### Trace result time inaccuracy problem
For example, in the following result: `0.705196 > (0.152743 + 0.145825)`
@@ -220,28 +228,31 @@ So where is the rest of the time consumed?
1. Methods that are not traced to. For example, methods under `java.*` are ignored by default. This can be printed out by adding the `-skipJDKMethod false` parameter.
- ```bash
- $ trace demo.MathGame run --skipJDKMethod false
- Press Q or Ctrl+C to abort.
- Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 2
- `---ts=2021-02-08 11:27:48;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@232204a1
- `--[0.810591ms] demo.MathGame:run()
- +--[0.034568ms] java.util.Random:nextInt() #23
- +---[0.119367ms] demo.MathGame:timeFactors() #24 [throws Exception]
- +---[0.017407ms] java.lang.StringBuilder:() #28
- +--[0.127922ms] java.lang.String:format() #57
- +---[min=0.01419ms,max=0.020221ms,total=0.034411ms,count=2] java.lang.StringBuilder:append() #57
- +--[0.021911ms] java.lang.Exception:getMessage() #57
- +---[0.015643ms] java.lang.StringBuilder:toString() #57
- `--[0.086622ms] java.io.PrintStream:println() #57
- ```
+ ```bash
+ $ trace demo.MathGame run --skipJDKMethod false
+ Press Q or Ctrl+C to abort.
+ Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 2
+ `---ts=2021-02-08 11:27:48;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@232204a1
+ `--[0.810591ms] demo.MathGame:run()
+ +--[0.034568ms] java.util.Random:nextInt() #23
+ +---[0.119367ms] demo.MathGame:timeFactors() #24 [throws Exception]
+ +---[0.017407ms] java.lang.StringBuilder:() #28
+ +--[0.127922ms] java.lang.String:format() #57
+ +---[min=0.01419ms,max=0.020221ms,total=0.034411ms,count=2] java.lang.StringBuilder:append() #57
+ +--[0.021911ms] java.lang.Exception:getMessage() #57
+ +---[0.015643ms] java.lang.StringBuilder:toString() #57
+ `--[0.086622ms] java.io.PrintStream:println() #57
+ ```
+
2. Instruction consumption. For example, instructions such as `i++`, `getfield`, etc.
3. Possible JVM pause during code execution, such as GC, entering synchronization blocks, etc.
#### Use the -v parameter to print more information
-> The watch/trace/monitor/stack/tt commands all support the `-v` parameter.
+::: tip
+The watch/trace/monitor/stack/tt commands all support the `-v` parameter.
+:::
When the command is executed, there is no output result. There are two possibilities:
diff --git a/site/src/site/sphinx/en/tt.md b/site-vuepress/docs/en/doc/tt.md
similarity index 77%
rename from site/src/site/sphinx/en/tt.md
rename to site-vuepress/docs/en/doc/tt.md
index fb391762e..834b3d242 100644
--- a/site/src/site/sphinx/en/tt.md
+++ b/site-vuepress/docs/en/doc/tt.md
@@ -1,27 +1,23 @@
-tt
-==
+# tt
[`tt` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-tt)
Check the `parameters`, `return values` and `exceptions` of the methods at different times.
-`watch` is a powerful command but due to its feasibility and complexity, it's quite hard to locate the issue effectively.
+`watch` is a powerful command but due to its feasibility and complexity, it's quite hard to locate the issue effectively.
-In such difficulties, `tt` comes into play.
+In such difficulties, `tt` comes into play.
-With the help of `tt` (*TimeTunnel*), you can check the contexts of the methods at different times in execution history.
+With the help of `tt` (_TimeTunnel_), you can check the contexts of the methods at different times in execution history.
### Usage
-
#### Start Demo
Start `math-game` in [Quick Start](quick-start.md).
-
#### Record method calls
-
```bash
$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
@@ -35,38 +31,40 @@ Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
```
-* `-t`
+- `-t`
+
+ record the calling context of the method `demo.MathGame primeFactors`
- record the calling context of the method `demo.MathGame primeFactors`
-
-* `-n 3`
+- `-n 3`
- limit the number of the records (avoid overflow for too many records; with `-n` option, Arthas can automatically stop recording once the records reach the specified limit)
+ limit the number of the records (avoid overflow for too many records; with `-n` option, Arthas can automatically stop recording once the records reach the specified limit)
-* Property
+- Property
-|Name|Specification|
-|---|---|
-|INDEX|the index for each call based on time|
-|TIMESTAMP|time to invoke the method|
-|COST(ms)|time cost of the method call|
-|IS-RET|whether method exits with normal return|
-|IS-EXP|whether method failed with exceptions|
-|OBJECT|`hashCode()` of the object invoking the method|
-|CLASS|class name of the object invoking the method|
-|METHOD|method being invoked|
+| Name | Specification |
+| --------- | ---------------------------------------------- |
+| INDEX | the index for each call based on time |
+| TIMESTAMP | time to invoke the method |
+| COST(ms) | time cost of the method call |
+| IS-RET | whether method exits with normal return |
+| IS-EXP | whether method failed with exceptions |
+| OBJECT | `hashCode()` of the object invoking the method |
+| CLASS | class name of the object invoking the method |
+| METHOD | method being invoked |
-* Condition expression
+- Condition expression
Tips:
+
1. `tt -t *Test print params.length==1` with different amounts of parameters;
2. `tt -t *Test print 'params[1] instanceof Integer'` with different types of parameters;
3. `tt -t *Test print params[0].mobile=="13989838402"` with specified parameter.
-
+
Advanced:
-* [Critical fields in expression](advice-class.md)
-* [Special usage](https://github.com/alibaba/arthas/issues/71)
-* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+
+- [Critical fields in expression](advice-class.md)
+- [Special usage](https://github.com/alibaba/arthas/issues/71)
+- [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
#### List all records
@@ -84,7 +82,6 @@ $ tt -l
Affect(row-cnt:6) cost in 4 ms.
```
-
#### Searching for records
```bash
@@ -102,7 +99,8 @@ Affect(row-cnt:6) cost in 607 ms.
```
Advanced:
-* [Critical fields in expression](advice-class.md)
+
+- [Critical fields in expression](advice-class.md)
#### Check context of the call
@@ -129,8 +127,8 @@ Affect(row-cnt:1) cost in 11 ms.
#### Replay record
-Since Arthas stores the context of the call, you can even *replay* the method calling afterwards with extra option `-p` to replay the issue for advanced troubleshooting, option `--replay-times`
-define the replay execution times, option `--replay-interval` define the interval(unit in ms,with default value 1000) of replays
+Since Arthas stores the context of the call, you can even _replay_ the method calling afterwards with extra option `-p` to replay the issue for advanced troubleshooting, option `--replay-times`
+define the replay execution times, option `--replay-interval` define the interval(unit in ms,with default value 1000) of replays
```bash
$ tt -i 1004 -p
@@ -156,10 +154,10 @@ Affect(row-cnt:1) cost in 14 ms.
`-w, --watch-express` watch the time fragment by ognl express.
-* You can used all variables in [fundamental fields in expressions](advice-class.md) for the watch express。
+- You can used all variables in [fundamental fields in expressions](advice-class.md) for the watch express。
```bash
-[arthas@10718]$ tt -t demo.MathGame run -n 5
+[arthas@10718]$ tt -t demo.MathGame run -n 5
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 56 ms, listenerId: 1
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
@@ -170,7 +168,7 @@ Affect(class count: 1 , method count: 1) cost in 56 ms, listenerId: 1
Affect(row-cnt:1) cost in 7 ms.
```
-* Get a static field and calling a static method
+- Get a static field and calling a static method
```bash
[arthas@10718]$ tt -t demo.MathGame run -n 5
@@ -185,17 +183,14 @@ Affect(class count: 1 , method count: 1) cost in 56 ms, listenerId: 1
Note that `com.taobao.arthas.core.advisor.Advice#getLoader` is used here, and that it is better to use the exact `classloader` [ognl](ognl.md).
-
Advanced usage [get spring context to call the bean method](https://github.com/alibaba/arthas/issues/482)
-
F.Y.I
1. **Loss** of the `ThreadLocal`
- Arthas save params into an array, then invoke the method with the params again. The method execute in another thread, so the `ThreadLocal` **lost**.
+ Arthas save params into an array, then invoke the method with the params again. The method execute in another thread, so the `ThreadLocal` **lost**.
2. params may be modified
- Arthas save params into an array, they are object references. The Objects may be modified by other code.
-
+ Arthas save params into an array, they are object references. The Objects may be modified by other code.
diff --git a/site/src/site/sphinx/en/tunnel.md b/site-vuepress/docs/en/doc/tunnel.md
similarity index 89%
rename from site/src/site/sphinx/en/tunnel.md
rename to site-vuepress/docs/en/doc/tunnel.md
index 59a9d0bbd..615bbb246 100644
--- a/site/src/site/sphinx/en/tunnel.md
+++ b/site-vuepress/docs/en/doc/tunnel.md
@@ -1,6 +1,4 @@
-Arthas Tunnel
-===
-
+# Arthas Tunnel
Manage/connect multiple Agents remotely via Arthas Tunnel Server/Client.
@@ -8,9 +6,10 @@ For example, in streaming computing, Java processes can be started on different
In this case, Arthas Tunnel Server/Client can be used.
-Reference:
-* 1: [Web Console](web-console.md)
-* 2: [Arthas Spring Boot Starter](spring-boot-starter.md)
+Reference:
+
+- 1: [Web Console](web-console.md)
+- 2: [Arthas Spring Boot Starter](spring-boot-starter.md)
### Download and deploy arthas tunnel server
@@ -36,7 +35,6 @@ Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2
### Connecting to the tunnel server when starting arthas
-
When starting arthas, you can use the `--tunnel-server` parameter, for example:
```bash
@@ -49,7 +47,7 @@ You can also use the following test address (not guaranteed to be available all
as.sh --tunnel-server 'ws://47.75.156.201:80/ws'
```
-* You can specify the agentId by the `--agent-id` parameter. By default, a random ID is generated.
+- You can specify the agentId by the `--agent-id` parameter. By default, a random ID is generated.
After Arthas attach succeeds, the agentId will be printed, such as:
@@ -81,16 +79,15 @@ If the connection is not connected to the tunnel server at startup, you can also
TUNNEL_SERVER ws://47.75.156.201:80/ws
```
-
For the above example, go to [http://47.75.156.201/arthas/?port=80](http://47.75.156.201/arthas/?port=80) in the browser and input the `agentId` to connect to arthas on remote machine.
-
-
-
+
### Best practices
-> Note that the agentId must be unique, otherwise it will conflict on the tunnel server and not work properly.
+::: warning
+Note that the agentId must be unique, otherwise it will conflict on the tunnel server and not work properly.
+:::
If the arthas agent is configured with `appName`, the generated agentId will be prefixed with `appName`.
@@ -98,14 +95,14 @@ For example, if you add the startup parameter `as.sh --tunnel-server 'ws://127.0
Tunnel server will use `_` as a delimiter to extract `appName`, which is convenient to manage by application.
-> Alternatively, you can configure `appName` in `arthas.properties` in the unzipped arthas directory, or in `application.properties` of the spring boot application.
-
+::: tip
+Alternatively, you can configure `appName` in `arthas.properties` in the unzipped arthas directory, or in `application.properties` of the spring boot application.
+:::
### Tunnel Server Management Page
Start the tunnel-server locally, then use `as.sh` attach, and specify the application name `--app-name test`:
-
```
$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test
telnet connecting to arthas server... current timestamp is 1627539688
@@ -132,23 +129,24 @@ Then visit tunnel-server, you can see a list of all connected applications:
[http://localhost:8080/apps.html](http://localhost:8080/apps.html)
-
+
Then open the details, you can see a list of all connected agents:
[http://localhost:8080/agents.html?app=test](http://localhost:8080/agents.html?app=test)
-
-
+
### Authority Management
At present, the tunnel server does not have special authority management. Users need to develop their own and authenticate the app name.
+
### Cluster Management
If you want to deploy multiple tunnel servers, you can use nginx for forwarding and redis to store agent information.
Nginx needs to configure sticky session to ensure that the user's web socket is connected to the same back-end tunnel server. The simple configuration method is to use `ip_hash`.
+
### How arthas tunnel server works
```
diff --git a/site/src/site/sphinx/en/version.md b/site-vuepress/docs/en/doc/version.md
similarity index 84%
rename from site/src/site/sphinx/en/version.md
rename to site-vuepress/docs/en/doc/version.md
index 6619b897d..8b4b4c701 100644
--- a/site/src/site/sphinx/en/version.md
+++ b/site-vuepress/docs/en/doc/version.md
@@ -1,5 +1,4 @@
-version
-===
+# version
prints out Arthas's version.
@@ -9,4 +8,3 @@ prints out Arthas's version.
$ version
3.5.1
```
-
diff --git a/site/src/site/sphinx/en/vmoption.md b/site-vuepress/docs/en/doc/vmoption.md
similarity index 97%
rename from site/src/site/sphinx/en/vmoption.md
rename to site-vuepress/docs/en/doc/vmoption.md
index 64e1f548d..93c044857 100644
--- a/site/src/site/sphinx/en/vmoption.md
+++ b/site-vuepress/docs/en/doc/vmoption.md
@@ -1,9 +1,10 @@
-vmoption
-===
+# vmoption
[`vmoption` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-vmoption)
-> Display, and update the vm diagnostic options.
+::: tip
+Display, and update the vm diagnostic options.
+:::
### Usage
@@ -62,4 +63,4 @@ Successfully updated the vm option.
NAME BEFORE-VALUE AFTER-VALUE
-------------------------------------------
PrintGCDetails false true
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/vmtool.md b/site-vuepress/docs/en/doc/vmtool.md
similarity index 76%
rename from site/src/site/sphinx/en/vmtool.md
rename to site-vuepress/docs/en/doc/vmtool.md
index f44eab10b..e2f97f29c 100644
--- a/site/src/site/sphinx/en/vmtool.md
+++ b/site-vuepress/docs/en/doc/vmtool.md
@@ -1,12 +1,14 @@
-vmtool
-===
+# vmtool
+
+::: tip
+@since 3.5.1
+:::
-> @since 3.5.1
[`vmtool` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-vmtool)
`vmtool` uses the `JVMTI` to support `getInstances` in jvm and `forceGc`.
-* [JVM Tool Interface](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html)
+- [JVM Tool Interface](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html)
### getInstances
@@ -26,7 +28,9 @@ $ vmtool --action getInstances --className java.lang.String --limit 10
]
```
-> Through the `--limit` parameter, you can limit the number of return values to avoid pressure on the JVM when obtaining large data. The default value of limit is 10.
+::: tip
+Through the `--limit` parameter, you can limit the number of return values to avoid pressure on the JVM when obtaining large data. The default value of limit is 10.
+:::
### Specify classloader name
@@ -34,7 +38,6 @@ $ vmtool --action getInstances --className java.lang.String --limit 10
vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext
```
-
### Specify classloader hash
The classloader that loads the class can be found through the `sc` command.
@@ -59,9 +62,11 @@ vmtool --action getInstances -c 19469ea2 --className org.springframework.context
### Specify the number of expanded layers of returned results
-> The return result of the `getInstances` action is bound to the `instances` variable, which is an array.
+::: tip
+The return result of the `getInstances` action is bound to the `instances` variable, which is an array.
-> The expansion level of the result can be specified by the `-x`/`--expand` parameter, the default value is 1.
+The expansion level of the result can be specified by the `-x`/`--expand` parameter, the default value is 1.
+:::
```bash
vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext -x 2
@@ -69,7 +74,9 @@ vmtool --action getInstances -c 19469ea2 --className org.springframework.context
### Execute expression
-> The return result of the `getInstances` action is bound to the `instances` variable, which is an array. The specified expression can be executed through the `--express` parameter.
+::: tip
+The return result of the `getInstances` action is bound to the `instances` variable, which is an array. The specified expression can be executed through the `--express` parameter.
+:::
```bash
vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext --express'instances[0].getBeanDefinitionNames()'
@@ -81,4 +88,4 @@ vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.
vmtool --action forceGc
```
-* Use the [`vmoption`](vmoption.md) command to dynamically turn on the `PrintGC` option.
\ No newline at end of file
+- Use the [`vmoption`](vmoption.md) command to dynamically turn on the `PrintGC` option.
diff --git a/site/src/site/sphinx/en/watch.md b/site-vuepress/docs/en/doc/watch.md
similarity index 74%
rename from site/src/site/sphinx/en/watch.md
rename to site-vuepress/docs/en/doc/watch.md
index f034525bc..01697687f 100644
--- a/site/src/site/sphinx/en/watch.md
+++ b/site-vuepress/docs/en/doc/watch.md
@@ -1,5 +1,4 @@
-watch
-=====
+# watch
[`watch` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-watch)
@@ -9,33 +8,35 @@ With the help of [OGNL](https://commons.apache.org/proper/commons-ognl/index.htm
### Parameters & Options
-There are four different scenarios for `watch` command, which makes it rather complicated.
-
-|Name|Specification|
-|---:|:---|
-|*class-pattern*|pattern for the class name|
-|*method-pattern*|pattern for the method name|
-|*expression*|expression to watch, default value `{params, target, returnObj}`|
-|*condition-expression*|condition expression to filter|
-|[b]|before method being invoked|
-|[e]|when method encountering exceptions|
-|[s]|when method exits normally|
-|[f]|when method exits (either succeed or fail with exceptions)|
-|[E]|turn on regex matching while the default is wildcard matching|
-|[x:]|the depth to print the specified property with default value: 1, the max value is 4|
+There are four different scenarios for `watch` command, which makes it rather complicated.
+
+| Name | Specification |
+| ---------------------: | :---------------------------------------------------------------------------------- |
+| _class-pattern_ | pattern for the class name |
+| _method-pattern_ | pattern for the method name |
+| _expression_ | expression to watch, default value `{params, target, returnObj}` |
+| _condition-expression_ | condition expression to filter |
+| [b] | before method being invoked |
+| [e] | when method encountering exceptions |
+| [s] | when method exits normally |
+| [f] | when method exits (either succeed or fail with exceptions) |
+| [E] | turn on regex matching while the default is wildcard matching |
+| [x:] | the depth to print the specified property with default value: 1, the max value is 4 |
F.Y.I
+
1. any valid OGNL expression as `"{params,returnObj}"` supported
-2. there are four *watching* points: `-b`, `-e`, `-s` and `-f` (the first three are off in default while `-f` on);
-3. at the *watching* point, Arthas will use the *expression* to evaluate the variables and print them out;
-4. `in parameters` and `out parameters` are different since they can be modified within the invoked methods; `params` stands for `in parameters` in `-b`while `out parameters` in other *watching* points;
+2. there are four _watching_ points: `-b`, `-e`, `-s` and `-f` (the first three are off in default while `-f` on);
+3. at the _watching_ point, Arthas will use the _expression_ to evaluate the variables and print them out;
+4. `in parameters` and `out parameters` are different since they can be modified within the invoked methods; `params` stands for `in parameters` in `-b`while `out parameters` in other _watching_ points;
5. there are no `return values` and `exceptions` when using `-b`.
6. In the result of the watch command, the `location` information will be printed. There are three possible values for `location`: `AtEnter`, `AtExit`, and `AtExceptionExit`. Corresponding to the method entry, the method returns normally, and the method throws an exception.
Advanced:
-* [Critical fields in *expression*](advice-class.md)
-* [Special usages](https://github.com/alibaba/arthas/issues/71)
-* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
+
+- [Critical fields in _expression_](advice-class.md)
+- [Special usages](https://github.com/alibaba/arthas/issues/71)
+- [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
### Usage
@@ -45,7 +46,9 @@ Start `math-game` in [Quick Start](quick-start.md).
#### Check the `out parameters`, `this` and `return value`
-> The expression to watch, default value `{params, target, returnObj}`
+::: tip
+The expression to watch, default value `{params, target, returnObj}`
+:::
```bash
$ watch demo.MathGame primeFactors -x 2
@@ -79,8 +82,9 @@ ts=2021-08-31 15:22:58; [cost=1.020982ms] result=@ArrayList[
]
```
-* In the above result, the method is executed twice, the first result is `location=AtExceptionExit`, indicating that the method throws an exception, so `returnObj` is null
-* In the second result is `location=AtExit`, indicating that the method returns normally, so you can see that the result of `returnObj` is an ArrayList
+- In the above result, the method is executed twice, the first result is `location=AtExceptionExit`, indicating that the method throws an exception, so `returnObj` is null
+- In the second result is `location=AtExit`, indicating that the method returns normally, so you can see that the result of `returnObj` is an ArrayList
+
#### Check `in parameters`
```bash
@@ -95,13 +99,11 @@ ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[
]
```
-Compared to the previous *check*:
+Compared to the previous _check_:
-* `return value` is `null` since it's `-b`.
-
-
-#### Check *before* and *after* at the same time
+- `return value` is `null` since it's `-b`.
+#### Check _before_ and _after_ at the same time
```bash
$ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
@@ -140,9 +142,9 @@ ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
F.Y.I
-* `-n 2`: threshold of execution times is 2.
-* the first block of output is the *before watching* point;
-* *the order of the output determined by the *watching* order itself (nothing to do with the order of the options `-b -s`).
+- `-n 2`: threshold of execution times is 2.
+- the first block of output is the _before watching_ point;
+- *the order of the output determined by the *watching\* order itself (nothing to do with the order of the options `-b -s`).
#### Use `-x` to check more details
@@ -177,8 +179,9 @@ ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[
]
```
-* `-x`: Expand level of object (1 by default)
-* The max value of `-x` is 4, to prevent the expansion result taking up too much memory. Users can specify the field in the `ognl` expression.
+- `-x`: Expand level of object (1 by default)
+- The max value of `-x` is 4, to prevent the expansion result taking up too much memory. Users can specify the field in the `ognl` expression.
+
#### Use condition expressions to locate specific call
```bash
@@ -207,8 +210,8 @@ ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
]
```
-* `-e`: Trigger when an exception is thrown
-* `throwExp`: the exception object
+- `-e`: Trigger when an exception is thrown
+- `throwExp`: the exception object
#### Filter by time cost
@@ -227,12 +230,11 @@ ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
]
```
-* `#cost>200` (`ms`) filter out all invokings that take less than `200ms`.
-
+- `#cost>200` (`ms`) filter out all invokings that take less than `200ms`.
#### Check the field of the target object
-* `target` is the `this` object in java.
+- `target` is the `this` object in java.
```bash
$ watch demo.MathGame primeFactors 'target'
@@ -244,7 +246,7 @@ ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
]
```
-* `target.field_name`: the field of the current object.
+- `target.field_name`: the field of the current object.
```bash
$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
@@ -252,9 +254,9 @@ Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
-```
+```
-#### Get a static field and calling a static method
+#### Get a static field and calling a static method
```bash
watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -v -n 1 -x 2
@@ -269,18 +271,20 @@ ts=2021-01-05 21:35:20; [cost=0.173966ms] result=@ArrayList[
]
```
-* Note that here you use `Thread.currentThread().getContextClassLoader()` to load, and it is better to use the exact `classloader` [ognl](ognl.md).
-
+- Note that here you use `Thread.currentThread().getContextClassLoader()` to load, and it is better to use the exact `classloader` [ognl](ognl.md).
#### Exclude the specified class
-> The watch/trace/monitor/stack/tt commands all support the `--exclude-class-pattern` parameter
+::: tip
+The watch/trace/monitor/stack/tt commands all support the `--exclude-class-pattern` parameter
+:::
Use the `--exclude-class-pattern` parameter to exclude the specified class, for example:
```bash
watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
```
+
#### Does not match subclass
By default, the watch/trace/monitor/stack/tt commands will match subclass. If you don't want to match, you can turn it off.
@@ -289,7 +293,6 @@ By default, the watch/trace/monitor/stack/tt commands will match subclass. If yo
options disable-sub-class true
```
-
#### Use the -v parameter to print more information
> The watch/trace/monitor/stack/tt commands all support the `-v` parameter.
@@ -326,4 +329,4 @@ ts=2020-12-02 22:38:57; [cost=0.052877ms] result=@Object[][
@Integer[4243],
],
]
-```
\ No newline at end of file
+```
diff --git a/site/src/site/sphinx/en/web-console.md b/site-vuepress/docs/en/doc/web-console.md
similarity index 65%
rename from site/src/site/sphinx/en/web-console.md
rename to site-vuepress/docs/en/doc/web-console.md
index 91848ba18..6d8dbe28a 100644
--- a/site/src/site/sphinx/en/web-console.md
+++ b/site-vuepress/docs/en/doc/web-console.md
@@ -1,5 +1,4 @@
-Web Console
-===
+# Web Console
[`Web Console` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=case-web-console)
@@ -9,20 +8,30 @@ Arthas supports the Web Console. After attach success, the user can access: [htt
The user can fill in the IP and connect the remote arthas on other machines.
-
+
-> By default, arthas only listens to `127.0.0.1`, so if you want to connect from a remote, you can use the `--target-ip` parameter to specify the IP. See the help description for `-h` for more information.
+::: warning
+By default, arthas only listens to `127.0.0.1`, so if you want to connect from a remote, you can use the `--target-ip` parameter to specify the IP. See the help description for `-h` for more information.
+:::
If you have suggestions for the Web Console, please leave a message here: [https://github.com/alibaba/arthas/issues/15](https://github.com/alibaba/arthas/issues/15)
-* Copy and paste shortcut keys in Web Console: [https://github.com/alibaba/arthas/issues/1056](https://github.com/alibaba/arthas/issues/1056)
+- Copy and paste shortcut keys in Web Console: [https://github.com/alibaba/arthas/issues/1056](https://github.com/alibaba/arthas/issues/1056)
+
+::: tip
+Since 3.5.4, you can right-click to copy and paste in the Web Console.
+:::
-> Since 3.5.4, you can right-click to copy and paste in the Web Console.
### scrollback URL parameters
-> Since 3.5.5
+
+::: tip
+Since 3.5.5
+:::
+
By default, the number of rows that the Web Console supports to roll back upwards is 1000. It can be specified with `scrollback` in the URL. for example
[http://127.0.0.1:8563/?scrollback=3000](http://127.0.0.1:8563/?scrollback=3000)
+
### Connect remote arthas through arthas tunnel server
-Reference: [Arthas Tunnel](tunnel.md)
\ No newline at end of file
+Reference: [Arthas Tunnel](tunnel.md)
diff --git a/site-vuepress/package-lock.json b/site-vuepress/package-lock.json
new file mode 100644
index 000000000..96fb2e964
--- /dev/null
+++ b/site-vuepress/package-lock.json
@@ -0,0 +1,6530 @@
+{
+ "name": "site-vuepress",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "site-vuepress",
+ "version": "1.0.0",
+ "license": "ISC",
+ "devDependencies": {
+ "@vuepress/plugin-search": "^2.0.0-beta.48",
+ "prettier": "2.7.1",
+ "vuepress": "^2.0.0-beta.48",
+ "vuepress-plugin-copy-code2": "^2.0.0-beta.84",
+ "vuepress-plugin-redirect": "^2.0.0-beta.86"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
+ "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
+ "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+ "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-component": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.6.0.tgz",
+ "integrity": "sha512-S/Dd0eoOipbUAMdJ6A7M20dDizJxbtGAcL6T1iiJ0cEzjTrHP1kRT421+JMGPL8gcdsrIxgVSW8bI/R6laqBtA==",
+ "dev": true,
+ "dependencies": {
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-frontmatter": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-0.6.0.tgz",
+ "integrity": "sha512-cRunxy0q1gcqxUHAAiV8hMKh2qZOTDKXt8YOWfWNtf7IzaAL0v/nCOfh+O7AsHRmyc25Th8sL3H85HKWnNJtdw==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "gray-matter": "^4.0.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-headers": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-0.6.0.tgz",
+ "integrity": "sha512-pg56w9/UooYuIZIoM0iQ021hrXt450fuRG3duxcwngw3unmE80rkvG3C0lT9ZnNXHSSYC9vGWUJh6EEN4nB34A==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-sfc": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-0.6.0.tgz",
+ "integrity": "sha512-R7mwUz2MxEopVQwpcOqCcqqvKx3ibRNcZ7QC31w4VblRb3Srk1st1UuGwHJxZ6Biro8ZWdPpMfpSsSk+2G+mIg==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-title": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-0.6.0.tgz",
+ "integrity": "sha512-K2qUIrHmCp9w+/p1lWfkr808+Ge6FksM1ny/siiXHMHB0enArUd7G7SaEtro8JRb/hewd9qKq5xTOSWN2Q5jow==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/plugin-toc": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-0.6.0.tgz",
+ "integrity": "sha512-5pgKY2++3w2/9Pqpgz7mZUiXs6jDcEyFPcf14QdiqSZ2eL+4VLuupcoC4JIDF+mAFHt+TJCfhk3oeG8Y6s6TBg==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/shared": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.6.0.tgz",
+ "integrity": "sha512-RtV1P8jrEV/cl0WckOvpefiEWScw7omCQrIEtorlagG2XmnI9YbxMkLD53ETscA7lTVzqhGyzfoSrAiPi0Sjnw==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "node_modules/@mdit-vue/types": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-0.6.0.tgz",
+ "integrity": "sha512-2Gf6MkEmoHrvO/IJsz48T+Ns9lW17ReC1vdhtCUGSCv0fFCm/L613uu/hpUrHuT3jTQHP90LcbXTQB2w4L1G8w==",
+ "dev": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz",
+ "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==",
+ "dev": true,
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz",
+ "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+ "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.51",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
+ "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
+ "dev": true
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "12.2.3",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
+ "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/linkify-it": "*",
+ "@types/mdurl": "*"
+ }
+ },
+ "node_modules/@types/markdown-it-emoji": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz",
+ "integrity": "sha512-2ln8Wjbcj/0oRi/6VnuMeWEHHuK8uapFttvcLmDIe1GKCsFBLOLBX+D+xhDa9oWOQV0IpvxwrSfKKssAqqroog==",
+ "dev": true,
+ "dependencies": {
+ "@types/markdown-it": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
+ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
+ "dev": true
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.31",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
+ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
+ "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
+ "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^2.5.10",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
+ "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
+ "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
+ "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.37",
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/compiler-ssr": "3.2.37",
+ "@vue/reactivity-transform": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7",
+ "postcss": "^8.1.10",
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
+ "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
+ "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==",
+ "dev": true
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
+ "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "node_modules/@vue/reactivity-transform": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
+ "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
+ "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/reactivity": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
+ "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/runtime-core": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "csstype": "^2.6.8"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz",
+ "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-ssr": "3.2.37",
+ "@vue/shared": "3.2.37"
+ },
+ "peerDependencies": {
+ "vue": "3.2.37"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
+ "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
+ "dev": true
+ },
+ "node_modules/@vuepress/bundler-vite": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.48.tgz",
+ "integrity": "sha512-ORT1cY2ScBWVuN/oCa5z0GqkbpdDmy6Pf0oe3GdiPA/w0kUbKeUPrWGDGHINqrSyvN0h5GbmLbvw6jSeUr2gAQ==",
+ "dev": true,
+ "dependencies": {
+ "@vitejs/plugin-vue": "^2.3.3",
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "autoprefixer": "^10.4.7",
+ "connect-history-api-fallback": "^1.6.0",
+ "postcss": "^8.4.14",
+ "rollup": "^2.75.0",
+ "vite": "~2.9.9",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "node_modules/@vuepress/cli": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-beta.48.tgz",
+ "integrity": "sha512-nsLTNyQqKpwZXNrP0rJnDfvoBHm0KtdgLUIq5mfib9DTMic0ziaBUlfUvavcz18ovg3MwtLSUQbSjIsQskdaIw==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "cac": "^6.7.12",
+ "chokidar": "^3.5.3",
+ "envinfo": "^7.8.1",
+ "esbuild": "^0.14.41"
+ },
+ "bin": {
+ "vuepress-cli": "bin/vuepress.js"
+ }
+ },
+ "node_modules/@vuepress/client": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.48.tgz",
+ "integrity": "sha512-XqTmoNqgJuO5IpiEQl3xZOFVZ/oXxCk5LNg+432/4hOTz92VdzOn1KNIQFmWxZaQ6s+8v6BimqRi0ZxMCwQ+Pg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-api": "^6.1.4",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "node_modules/@vuepress/core": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-beta.48.tgz",
+ "integrity": "sha512-J9fge3oV5amAkx2g8TOPp8EpHyFgm6jy/FbCkYIGCBkKiERn91iz5aGCgoUF4O8AToLekbKpLwdZtNKF+wxAew==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "gray-matter": "^4.0.3",
+ "toml": "^3.0.0",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/markdown": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-beta.48.tgz",
+ "integrity": "sha512-gbrVAgJRsQ5hxJM7yyoNv5NbtlgxW/YVyfhFG28aac5gyQ6p3WTOJjpH//F1H431gDVqXS+q+Umhb/vH2QWalg==",
+ "dev": true,
+ "dependencies": {
+ "@types/markdown-it": "^12.2.3",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "markdown-it": "^13.0.1",
+ "markdown-it-anchor": "^8.6.4",
+ "markdown-it-emoji": "^2.0.2",
+ "mdurl": "^1.0.1"
+ }
+ },
+ "node_modules/@vuepress/plugin-active-header-links": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.48.tgz",
+ "integrity": "sha512-xNR3qTk9ECmYf5mvXhv2DpZu2VIxd6iVQ5Kvkw29zDjZc42uxo7QU9uIhAg6BOy0hNDFyn33DUxqlj7abpUf4w==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "ts-debounce": "^4.0.0",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "node_modules/@vuepress/plugin-back-to-top": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.48.tgz",
+ "integrity": "sha512-TYmtNnE+WoKbI1DnUzKGEprp5CVfvisuZCOi0coEA4g1jrSoEX6hgO4i+k8621ZBmpIdmIhI2+saoVdqN2duUw==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "ts-debounce": "^4.0.0",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/plugin-container": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.48.tgz",
+ "integrity": "sha512-EdPXZRmhjbfZdTMGCzyj5G3xbZEjh2VWuFNbNYy5K195OnF+gO/GOJmIso1fnqmRdBgkHQkwdOqz/bZ6CuJP/g==",
+ "dev": true,
+ "dependencies": {
+ "@types/markdown-it": "^12.2.3",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "markdown-it": "^13.0.1",
+ "markdown-it-container": "^3.0.0"
+ }
+ },
+ "node_modules/@vuepress/plugin-external-link-icon": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.48.tgz",
+ "integrity": "sha512-RXENrUGpE8L32bsRxrxepRclvz/RVRA6Wj1NLTBweitxpbJukRNTsCX9mD/8KwQWc3Rkf+Zv+k6NDe5rDPoLeg==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/plugin-git": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.48.tgz",
+ "integrity": "sha512-ycNGAl+O1kHErsPt7uWGsR0S/o09b7JZnssM2WxWJPA9E+MtSgm6YzQcV8uK22GF2OCrwtv2z/6cNLkGz+NDfA==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "execa": "^5.1.1"
+ }
+ },
+ "node_modules/@vuepress/plugin-medium-zoom": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.48.tgz",
+ "integrity": "sha512-CQIJo/ndHYjrOBwyzp4TP6AfwNGi1aae9BATlIyXl/xxFqX4hD7DN6JqYJ78tbgPMCU5I3H5UY1RNd6dfV4T+A==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "medium-zoom": "^1.0.6",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/plugin-nprogress": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.48.tgz",
+ "integrity": "sha512-qA6SZ/R9ufnMR6qQbTAqWGxtNOIzxrA3gopOaNuD8T+hGJVTnYeGwDFk2S30G5HuqgbECsYDQfomo6SOjyREZQ==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "node_modules/@vuepress/plugin-palette": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.48.tgz",
+ "integrity": "sha512-zqWk2NV1gInPLqlHGgu7YO7dsRMJz28pMzcL7Z/SuI+rGu/MKqCSk6IBC/Fz7xO09XA+Ke8a+zxfVINnhpdH8Q==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3"
+ }
+ },
+ "node_modules/@vuepress/plugin-prismjs": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.48.tgz",
+ "integrity": "sha512-xTdk3DEJmzuzeRcm0fZfJFLs6/oN2T/sm+KtSh7whVbHcgEKFdj0vHkiWswp3bnNWE3FHUwO1UQq9K21zEwpUw==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "prismjs": "^1.28.0"
+ }
+ },
+ "node_modules/@vuepress/plugin-search": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.48.tgz",
+ "integrity": "sha512-1ADG3Zw6CBwERiW5l3spoONrHT6pcOGzlEiOhjAEYcOv7edzaoGQTahpgGvCXiXY5b11Z9bsr13NgCgr0YMGIQ==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "node_modules/@vuepress/plugin-theme-data": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.48.tgz",
+ "integrity": "sha512-7DH/tKiPg63wA77C9xNVF5Le5r1Apmd9mvz4NEeG0dhmuSPr456oM8aApE0s1XkY+vrmIXsTUjDK8+HvF8irUQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-api": "^6.1.4",
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/shared": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-beta.48.tgz",
+ "integrity": "sha512-0i3lklFroOAtaHWfCjyvwBe8u5Jl668C/aMe9MWrsQI2qv40LiExgm82nNxc3tD2hoKKVpIxRvWaKXbJI1VXjg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "^3.2.36"
+ }
+ },
+ "node_modules/@vuepress/theme-default": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-2.0.0-beta.48.tgz",
+ "integrity": "sha512-dJfqO1XW23es7d84B/iEOzKfwNtB0+UoG1PNOhDua2rPpDreOcO1sI2DntmOClYaRR/SB7zSdiSEynzRC5Nwrw==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/plugin-active-header-links": "2.0.0-beta.48",
+ "@vuepress/plugin-back-to-top": "2.0.0-beta.48",
+ "@vuepress/plugin-container": "2.0.0-beta.48",
+ "@vuepress/plugin-external-link-icon": "2.0.0-beta.48",
+ "@vuepress/plugin-git": "2.0.0-beta.48",
+ "@vuepress/plugin-medium-zoom": "2.0.0-beta.48",
+ "@vuepress/plugin-nprogress": "2.0.0-beta.48",
+ "@vuepress/plugin-palette": "2.0.0-beta.48",
+ "@vuepress/plugin-prismjs": "2.0.0-beta.48",
+ "@vuepress/plugin-theme-data": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "@vueuse/core": "^8.5.0",
+ "sass": "^1.52.1",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ },
+ "peerDependencies": {
+ "sass-loader": "^13.0.0"
+ },
+ "peerDependenciesMeta": {
+ "sass-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vuepress/utils": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-beta.48.tgz",
+ "integrity": "sha512-Y0e3j0SHkPHMWnNlZZOcdN3G4zhdTIs63Ywy4IULFsrpKAihRIUcSe4Yry6lCJyYCCS/gebwc1fQYAmPuNkijg==",
+ "dev": true,
+ "dependencies": {
+ "@types/debug": "^4.1.7",
+ "@types/fs-extra": "^9.0.13",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "globby": "^11.0.4",
+ "hash-sum": "^2.0.0",
+ "ora": "^5.4.1",
+ "upath": "^2.0.1"
+ }
+ },
+ "node_modules/@vueuse/core": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.7.4.tgz",
+ "integrity": "sha512-dQgxjb79PDcizlaclgCkCzNoqNv12PnbXxUOFL9VacakmD/ACoSMWwTpcG3HKoDoYyl2V3kSW/8AkvXGEYEGFA==",
+ "dev": true,
+ "dependencies": {
+ "@vueuse/metadata": "8.7.4",
+ "@vueuse/shared": "8.7.4",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.1.0",
+ "vue": "^2.6.0 || ^3.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.7.4.tgz",
+ "integrity": "sha512-CwEYS6/M6JDxk9D1mUsZq3F0VnYnf39rAxOytP58vb4BrhmPKEVfiSpvxuYcJimU9ccT/xjWhwBnsdGC2H9mIQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.7.4.tgz",
+ "integrity": "sha512-QhwTEd2Gr/8ZliWVEM8sbMUkXtVVV1Mt1mOkCnIbIN33D/V28FwGKUKqEPGZZCXuJchARnun/J1TAiT/UmZd1w==",
+ "dev": true,
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.1.0",
+ "vue": "^2.6.0 || ^3.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-opt": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "@webassemblyjs/wast-printer": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/balloon-css": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/balloon-css/-/balloon-css-1.2.0.tgz",
+ "integrity": "sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.20.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
+ "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001349",
+ "electron-to-chromium": "^1.4.147",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/cac": {
+ "version": "6.7.12",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.12.tgz",
+ "integrity": "sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001356",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz",
+ "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "2.6.20",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+ "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+ "dev": true
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
+ "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.161",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
+ "integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A==",
+ "dev": true
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
+ "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz",
+ "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "esbuild-android-64": "0.14.49",
+ "esbuild-android-arm64": "0.14.49",
+ "esbuild-darwin-64": "0.14.49",
+ "esbuild-darwin-arm64": "0.14.49",
+ "esbuild-freebsd-64": "0.14.49",
+ "esbuild-freebsd-arm64": "0.14.49",
+ "esbuild-linux-32": "0.14.49",
+ "esbuild-linux-64": "0.14.49",
+ "esbuild-linux-arm": "0.14.49",
+ "esbuild-linux-arm64": "0.14.49",
+ "esbuild-linux-mips64le": "0.14.49",
+ "esbuild-linux-ppc64le": "0.14.49",
+ "esbuild-linux-riscv64": "0.14.49",
+ "esbuild-linux-s390x": "0.14.49",
+ "esbuild-netbsd-64": "0.14.49",
+ "esbuild-openbsd-64": "0.14.49",
+ "esbuild-sunos-64": "0.14.49",
+ "esbuild-windows-32": "0.14.49",
+ "esbuild-windows-64": "0.14.49",
+ "esbuild-windows-arm64": "0.14.49"
+ }
+ },
+ "node_modules/esbuild-android-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz",
+ "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz",
+ "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz",
+ "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz",
+ "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz",
+ "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz",
+ "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz",
+ "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz",
+ "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz",
+ "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz",
+ "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz",
+ "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz",
+ "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-riscv64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz",
+ "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-s390x": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz",
+ "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz",
+ "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz",
+ "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz",
+ "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz",
+ "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz",
+ "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz",
+ "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "node_modules/gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "dev": true,
+ "dependencies": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "dev": true
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
+ "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
+ "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
+ "dev": true,
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dev": true,
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
+ "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~3.0.1",
+ "linkify-it": "^4.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/markdown-it-anchor": {
+ "version": "8.6.4",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.4.tgz",
+ "integrity": "sha512-Ul4YVYZNxMJYALpKtu+ZRdrryYt/GlQ5CK+4l1bp/gWXOG2QWElt6AqF3Mih/wfUKdZbNAZVXGR73/n6U/8img==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/markdown-it-container": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz",
+ "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==",
+ "dev": true
+ },
+ "node_modules/markdown-it-emoji": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz",
+ "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==",
+ "dev": true
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true
+ },
+ "node_modules/medium-zoom": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.6.tgz",
+ "integrity": "sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg==",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
+ "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prettier": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
+ "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
+ "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.75.6",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
+ "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/sass": {
+ "version": "1.52.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz",
+ "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz",
+ "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.14.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
+ "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
+ "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.7",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.0",
+ "terser": "^5.7.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toml": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
+ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
+ "dev": true
+ },
+ "node_modules/ts-debounce": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz",
+ "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==",
+ "dev": true
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
+ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "2.9.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
+ "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.14.27",
+ "postcss": "^8.4.13",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": ">=12.2.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz",
+ "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/compiler-sfc": "3.2.37",
+ "@vue/runtime-dom": "3.2.37",
+ "@vue/server-renderer": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.1.tgz",
+ "integrity": "sha512-xmkJ56koG3ptpLnpgmIzk9/4nFf4CqduSJbUM0OdPoU87NwRuZ6x49OLhjSa/fC15fV+5CbEnrxU4oyE022svg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.2.tgz",
+ "integrity": "sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-api": "^6.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vuepress": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-beta.48.tgz",
+ "integrity": "sha512-m1CzjgMrHdrOzNr3eMoFrdqHlp3wK23TBIHZJtm9tDnwg4OF59FG6y6gGoBLo+zpfzVOwi/V8FR13ehiQwG/3A==",
+ "dev": true,
+ "dependencies": {
+ "vuepress-vite": "2.0.0-beta.48"
+ },
+ "bin": {
+ "vuepress": "bin/vuepress.js"
+ }
+ },
+ "node_modules/vuepress-plugin-copy-code2": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.84.tgz",
+ "integrity": "sha512-jSI/k4HLSTr+0RhsJ+omr3RsrUrlBAhtdgIQYGdhy8Wm2g5NjMXjQZ3d7rs+gSIvQH1RDj2wRorV26yEKARw3g==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "balloon-css": "^1.2.0",
+ "vue": "^3.2.37",
+ "vue-router": "^4.0.16",
+ "vuepress-plugin-sass-palette": "2.0.0-beta.84",
+ "vuepress-shared": "2.0.0-beta.84"
+ },
+ "peerDependencies": {
+ "sass-loader": "^13.0.0"
+ },
+ "peerDependenciesMeta": {
+ "sass-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vuepress-plugin-redirect": {
+ "version": "2.0.0-beta.86",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-redirect/-/vuepress-plugin-redirect-2.0.0-beta.86.tgz",
+ "integrity": "sha512-kxPyPAhH1U0UJdsq8qLMu4UDTaNxzPUZWalHGNYE/EZ4EYA0uSlkobjvppFr3baR9KpNyi/DlnW/SOSCw6EwQg==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/cli": "2.0.0-beta.49",
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "cac": "^6.7.12",
+ "vuepress-shared": "2.0.0-beta.86"
+ },
+ "bin": {
+ "vp-redirect": "lib/cli/index.js"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/cli": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-beta.49.tgz",
+ "integrity": "sha512-3RtuZvtLIGXEtsLgc3AnDr4jxiFeFDWfNw6MTb22YwuttBr5h5pZO/F8XMyP9+tEi73q3/l4keNQftU4msHysQ==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "cac": "^6.7.12",
+ "chokidar": "^3.5.3",
+ "envinfo": "^7.8.1",
+ "esbuild": "^0.14.49"
+ },
+ "bin": {
+ "vuepress-cli": "bin/vuepress.js"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/client": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.49.tgz",
+ "integrity": "sha512-zfGlCAF/LwDOrZXZPqADsMgWRuH/2GFOGSOCvt7ZUZHnSrYBdK2FOez/ksWL8EwGNLsRLB8ny1IachMwTew5og==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-api": "^6.2.0",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "vue": "^3.2.37",
+ "vue-router": "^4.1.2"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/core": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-beta.49.tgz",
+ "integrity": "sha512-40J74qGOPqF9yGdXdzPD1kW9mv5/jfJenmhsH1xaErPsr6qIM8jcraVRC+R7NoVTIecRk9cC9MJcDRnLmDDiAg==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.49",
+ "@vuepress/markdown": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "vue": "^3.2.37"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/markdown": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-beta.49.tgz",
+ "integrity": "sha512-aAw41NArV5leIpZOFmElxzRG29LDdEQe7oIcZtIvKPhVmEfg9/mgx4ea2OqY5DaBvEhkG42SojjKvmHiJKrwJw==",
+ "dev": true,
+ "dependencies": {
+ "@mdit-vue/plugin-component": "^0.6.0",
+ "@mdit-vue/plugin-frontmatter": "^0.6.0",
+ "@mdit-vue/plugin-headers": "^0.6.0",
+ "@mdit-vue/plugin-sfc": "^0.6.0",
+ "@mdit-vue/plugin-title": "^0.6.0",
+ "@mdit-vue/plugin-toc": "^0.6.0",
+ "@mdit-vue/shared": "^0.6.0",
+ "@mdit-vue/types": "^0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "@types/markdown-it-emoji": "^2.0.2",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "markdown-it": "^13.0.1",
+ "markdown-it-anchor": "^8.6.4",
+ "markdown-it-emoji": "^2.0.2",
+ "mdurl": "^1.0.1"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/plugin-git": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.49.tgz",
+ "integrity": "sha512-CjaBYWBAkQmlpx5v+mp2vsoRxqRTi/mSvXy8im/ftc8zX/sVT4V1LBWX1IsDQn1VpWnArlfAsFd+BrmxzPFePA==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "execa": "^5.1.1"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/shared": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-beta.49.tgz",
+ "integrity": "sha512-yoUgOtRUrIfe0O1HMTIMj0NYU3tAiUZ4rwVEtemtGa7/RK7qIZdBpAfv08Ve2CUpa3wrMb1Pux1aBsiz1EQx+g==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "^3.2.37"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/@vuepress/utils": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-beta.49.tgz",
+ "integrity": "sha512-t5i0V9FqpKLGlu2kMP/Y9+wdgEmsD2yQAMGojxpMoFhJBmqn2L9Rkk4WYzHKzPGDkm1KbBFzYQqjAhZQ7xtY1A==",
+ "dev": true,
+ "dependencies": {
+ "@types/debug": "^4.1.7",
+ "@types/fs-extra": "^9.0.13",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "globby": "^11.0.4",
+ "hash-sum": "^2.0.0",
+ "ora": "^5.4.1",
+ "upath": "^2.0.1"
+ }
+ },
+ "node_modules/vuepress-plugin-redirect/node_modules/vuepress-shared": {
+ "version": "2.0.0-beta.86",
+ "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-beta.86.tgz",
+ "integrity": "sha512-8XjUscW4dmP59WxqhPg42okoarlybMNXAyi9k5J0KeQLHTeDMySSzqrYkF/iQdv63PKE3JFIhSRhUsaK0yedMw==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.49",
+ "@vuepress/plugin-git": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "dayjs": "^1.11.3",
+ "execa": "^5.1.1",
+ "ora": "^5.4.1",
+ "vue": "^3.2.37",
+ "vue-router": "^4.1.2"
+ }
+ },
+ "node_modules/vuepress-plugin-sass-palette": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.84.tgz",
+ "integrity": "sha512-cdl/caVQk3hWvpzO9dcy+KfFa/0pHCvkSZy+xOk7lAUL7srVQnCIEs1ii7D+/ngmyve8+JENy2+Ch15exYibJA==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3",
+ "sass": "^1.52.3",
+ "vuepress-shared": "2.0.0-beta.84"
+ },
+ "peerDependencies": {
+ "sass-loader": "^13.0.0"
+ },
+ "peerDependenciesMeta": {
+ "sass-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vuepress-shared": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-beta.84.tgz",
+ "integrity": "sha512-yfN2ng7X0oFlIPLX3AJMK8PuQYrqcKrKa8Gm77sH3bGKJjhKBr7UO9jXh/io3vBIoqd4vjiKHYyOHJqB/nIWoQ==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/plugin-git": "2.0.0-beta.48",
+ "@vuepress/plugin-theme-data": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "dayjs": "^1.11.3",
+ "execa": "^5.1.1",
+ "ora": "^5.4.1",
+ "vue": "^3.2.37",
+ "vue-router": "^4.0.16"
+ }
+ },
+ "node_modules/vuepress-vite": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/vuepress-vite/-/vuepress-vite-2.0.0-beta.48.tgz",
+ "integrity": "sha512-1TKEXg26W7VlTBU9J6BcJTW/NFtzkAveM33jccVs6HieYgvK7lyTpbhs5eRu9fUWawGR8ULa+b5kdk0dSLpjew==",
+ "dev": true,
+ "dependencies": {
+ "@vuepress/bundler-vite": "2.0.0-beta.48",
+ "@vuepress/cli": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/theme-default": "2.0.0-beta.48"
+ },
+ "bin": {
+ "vuepress": "bin/vuepress.js",
+ "vuepress-vite": "bin/vuepress.js"
+ },
+ "peerDependencies": {
+ "@vuepress/client": "^2.0.0-beta.42",
+ "vue": "^3.2.36"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.73.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
+ "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^0.0.51",
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/wasm-edit": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "acorn": "^8.4.1",
+ "acorn-import-assertions": "^1.7.6",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.9.3",
+ "es-module-lexer": "^0.9.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.3",
+ "watchpack": "^2.3.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/parser": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
+ "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "dev": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
+ "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+ "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@mdit-vue/plugin-component": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.6.0.tgz",
+ "integrity": "sha512-S/Dd0eoOipbUAMdJ6A7M20dDizJxbtGAcL6T1iiJ0cEzjTrHP1kRT421+JMGPL8gcdsrIxgVSW8bI/R6laqBtA==",
+ "dev": true,
+ "requires": {
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/plugin-frontmatter": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-0.6.0.tgz",
+ "integrity": "sha512-cRunxy0q1gcqxUHAAiV8hMKh2qZOTDKXt8YOWfWNtf7IzaAL0v/nCOfh+O7AsHRmyc25Th8sL3H85HKWnNJtdw==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "gray-matter": "^4.0.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/plugin-headers": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-0.6.0.tgz",
+ "integrity": "sha512-pg56w9/UooYuIZIoM0iQ021hrXt450fuRG3duxcwngw3unmE80rkvG3C0lT9ZnNXHSSYC9vGWUJh6EEN4nB34A==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/plugin-sfc": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-0.6.0.tgz",
+ "integrity": "sha512-R7mwUz2MxEopVQwpcOqCcqqvKx3ibRNcZ7QC31w4VblRb3Srk1st1UuGwHJxZ6Biro8ZWdPpMfpSsSk+2G+mIg==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/plugin-title": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-0.6.0.tgz",
+ "integrity": "sha512-K2qUIrHmCp9w+/p1lWfkr808+Ge6FksM1ny/siiXHMHB0enArUd7G7SaEtro8JRb/hewd9qKq5xTOSWN2Q5jow==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/plugin-toc": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-0.6.0.tgz",
+ "integrity": "sha512-5pgKY2++3w2/9Pqpgz7mZUiXs6jDcEyFPcf14QdiqSZ2eL+4VLuupcoC4JIDF+mAFHt+TJCfhk3oeG8Y6s6TBg==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/shared": "0.6.0",
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/shared": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.6.0.tgz",
+ "integrity": "sha512-RtV1P8jrEV/cl0WckOvpefiEWScw7omCQrIEtorlagG2XmnI9YbxMkLD53ETscA7lTVzqhGyzfoSrAiPi0Sjnw==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/types": "0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "markdown-it": "^13.0.1"
+ }
+ },
+ "@mdit-vue/types": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-0.6.0.tgz",
+ "integrity": "sha512-2Gf6MkEmoHrvO/IJsz48T+Ns9lW17ReC1vdhtCUGSCv0fFCm/L613uu/hpUrHuT3jTQHP90LcbXTQB2w4L1G8w==",
+ "dev": true
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@types/debug": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz",
+ "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==",
+ "dev": true,
+ "requires": {
+ "@types/ms": "*"
+ }
+ },
+ "@types/eslint": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz",
+ "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/eslint-scope": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+ "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.51",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@types/linkify-it": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
+ "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
+ "dev": true
+ },
+ "@types/markdown-it": {
+ "version": "12.2.3",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
+ "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "dev": true,
+ "requires": {
+ "@types/linkify-it": "*",
+ "@types/mdurl": "*"
+ }
+ },
+ "@types/markdown-it-emoji": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz",
+ "integrity": "sha512-2ln8Wjbcj/0oRi/6VnuMeWEHHuK8uapFttvcLmDIe1GKCsFBLOLBX+D+xhDa9oWOQV0IpvxwrSfKKssAqqroog==",
+ "dev": true,
+ "requires": {
+ "@types/markdown-it": "*"
+ }
+ },
+ "@types/mdurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
+ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
+ "dev": true
+ },
+ "@types/ms": {
+ "version": "0.7.31",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
+ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
+ "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==",
+ "dev": true
+ },
+ "@vitejs/plugin-vue": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
+ "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
+ "dev": true,
+ "requires": {}
+ },
+ "@vue/compiler-core": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
+ "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
+ "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-core": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
+ "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.37",
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/compiler-ssr": "3.2.37",
+ "@vue/reactivity-transform": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7",
+ "postcss": "^8.1.10",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
+ "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "@vue/devtools-api": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
+ "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==",
+ "dev": true
+ },
+ "@vue/reactivity": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
+ "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
+ "dev": true,
+ "requires": {
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "@vue/reactivity-transform": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
+ "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "@vue/runtime-core": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
+ "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
+ "dev": true,
+ "requires": {
+ "@vue/reactivity": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "@vue/runtime-dom": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
+ "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
+ "dev": true,
+ "requires": {
+ "@vue/runtime-core": "3.2.37",
+ "@vue/shared": "3.2.37",
+ "csstype": "^2.6.8"
+ }
+ },
+ "@vue/server-renderer": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz",
+ "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-ssr": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
+ "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
+ "dev": true
+ },
+ "@vuepress/bundler-vite": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.48.tgz",
+ "integrity": "sha512-ORT1cY2ScBWVuN/oCa5z0GqkbpdDmy6Pf0oe3GdiPA/w0kUbKeUPrWGDGHINqrSyvN0h5GbmLbvw6jSeUr2gAQ==",
+ "dev": true,
+ "requires": {
+ "@vitejs/plugin-vue": "^2.3.3",
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "autoprefixer": "^10.4.7",
+ "connect-history-api-fallback": "^1.6.0",
+ "postcss": "^8.4.14",
+ "rollup": "^2.75.0",
+ "vite": "~2.9.9",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/cli": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-beta.48.tgz",
+ "integrity": "sha512-nsLTNyQqKpwZXNrP0rJnDfvoBHm0KtdgLUIq5mfib9DTMic0ziaBUlfUvavcz18ovg3MwtLSUQbSjIsQskdaIw==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "cac": "^6.7.12",
+ "chokidar": "^3.5.3",
+ "envinfo": "^7.8.1",
+ "esbuild": "^0.14.41"
+ }
+ },
+ "@vuepress/client": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.48.tgz",
+ "integrity": "sha512-XqTmoNqgJuO5IpiEQl3xZOFVZ/oXxCk5LNg+432/4hOTz92VdzOn1KNIQFmWxZaQ6s+8v6BimqRi0ZxMCwQ+Pg==",
+ "dev": true,
+ "requires": {
+ "@vue/devtools-api": "^6.1.4",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/core": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-beta.48.tgz",
+ "integrity": "sha512-J9fge3oV5amAkx2g8TOPp8EpHyFgm6jy/FbCkYIGCBkKiERn91iz5aGCgoUF4O8AToLekbKpLwdZtNKF+wxAew==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "gray-matter": "^4.0.3",
+ "toml": "^3.0.0",
+ "vue": "^3.2.36"
+ }
+ },
+ "@vuepress/markdown": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-beta.48.tgz",
+ "integrity": "sha512-gbrVAgJRsQ5hxJM7yyoNv5NbtlgxW/YVyfhFG28aac5gyQ6p3WTOJjpH//F1H431gDVqXS+q+Umhb/vH2QWalg==",
+ "dev": true,
+ "requires": {
+ "@types/markdown-it": "^12.2.3",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "markdown-it": "^13.0.1",
+ "markdown-it-anchor": "^8.6.4",
+ "markdown-it-emoji": "^2.0.2",
+ "mdurl": "^1.0.1"
+ }
+ },
+ "@vuepress/plugin-active-header-links": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.48.tgz",
+ "integrity": "sha512-xNR3qTk9ECmYf5mvXhv2DpZu2VIxd6iVQ5Kvkw29zDjZc42uxo7QU9uIhAg6BOy0hNDFyn33DUxqlj7abpUf4w==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "ts-debounce": "^4.0.0",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/plugin-back-to-top": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.48.tgz",
+ "integrity": "sha512-TYmtNnE+WoKbI1DnUzKGEprp5CVfvisuZCOi0coEA4g1jrSoEX6hgO4i+k8621ZBmpIdmIhI2+saoVdqN2duUw==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "ts-debounce": "^4.0.0",
+ "vue": "^3.2.36"
+ }
+ },
+ "@vuepress/plugin-container": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.48.tgz",
+ "integrity": "sha512-EdPXZRmhjbfZdTMGCzyj5G3xbZEjh2VWuFNbNYy5K195OnF+gO/GOJmIso1fnqmRdBgkHQkwdOqz/bZ6CuJP/g==",
+ "dev": true,
+ "requires": {
+ "@types/markdown-it": "^12.2.3",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "markdown-it": "^13.0.1",
+ "markdown-it-container": "^3.0.0"
+ }
+ },
+ "@vuepress/plugin-external-link-icon": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.48.tgz",
+ "integrity": "sha512-RXENrUGpE8L32bsRxrxepRclvz/RVRA6Wj1NLTBweitxpbJukRNTsCX9mD/8KwQWc3Rkf+Zv+k6NDe5rDPoLeg==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/markdown": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36"
+ }
+ },
+ "@vuepress/plugin-git": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.48.tgz",
+ "integrity": "sha512-ycNGAl+O1kHErsPt7uWGsR0S/o09b7JZnssM2WxWJPA9E+MtSgm6YzQcV8uK22GF2OCrwtv2z/6cNLkGz+NDfA==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "execa": "^5.1.1"
+ }
+ },
+ "@vuepress/plugin-medium-zoom": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.48.tgz",
+ "integrity": "sha512-CQIJo/ndHYjrOBwyzp4TP6AfwNGi1aae9BATlIyXl/xxFqX4hD7DN6JqYJ78tbgPMCU5I3H5UY1RNd6dfV4T+A==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "medium-zoom": "^1.0.6",
+ "vue": "^3.2.36"
+ }
+ },
+ "@vuepress/plugin-nprogress": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.48.tgz",
+ "integrity": "sha512-qA6SZ/R9ufnMR6qQbTAqWGxtNOIzxrA3gopOaNuD8T+hGJVTnYeGwDFk2S30G5HuqgbECsYDQfomo6SOjyREZQ==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/plugin-palette": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.48.tgz",
+ "integrity": "sha512-zqWk2NV1gInPLqlHGgu7YO7dsRMJz28pMzcL7Z/SuI+rGu/MKqCSk6IBC/Fz7xO09XA+Ke8a+zxfVINnhpdH8Q==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3"
+ }
+ },
+ "@vuepress/plugin-prismjs": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.48.tgz",
+ "integrity": "sha512-xTdk3DEJmzuzeRcm0fZfJFLs6/oN2T/sm+KtSh7whVbHcgEKFdj0vHkiWswp3bnNWE3FHUwO1UQq9K21zEwpUw==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.48",
+ "prismjs": "^1.28.0"
+ }
+ },
+ "@vuepress/plugin-search": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.48.tgz",
+ "integrity": "sha512-1ADG3Zw6CBwERiW5l3spoONrHT6pcOGzlEiOhjAEYcOv7edzaoGQTahpgGvCXiXY5b11Z9bsr13NgCgr0YMGIQ==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/plugin-theme-data": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.48.tgz",
+ "integrity": "sha512-7DH/tKiPg63wA77C9xNVF5Le5r1Apmd9mvz4NEeG0dhmuSPr456oM8aApE0s1XkY+vrmIXsTUjDK8+HvF8irUQ==",
+ "dev": true,
+ "requires": {
+ "@vue/devtools-api": "^6.1.4",
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "vue": "^3.2.36"
+ }
+ },
+ "@vuepress/shared": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-beta.48.tgz",
+ "integrity": "sha512-0i3lklFroOAtaHWfCjyvwBe8u5Jl668C/aMe9MWrsQI2qv40LiExgm82nNxc3tD2hoKKVpIxRvWaKXbJI1VXjg==",
+ "dev": true,
+ "requires": {
+ "@vue/shared": "^3.2.36"
+ }
+ },
+ "@vuepress/theme-default": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-2.0.0-beta.48.tgz",
+ "integrity": "sha512-dJfqO1XW23es7d84B/iEOzKfwNtB0+UoG1PNOhDua2rPpDreOcO1sI2DntmOClYaRR/SB7zSdiSEynzRC5Nwrw==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/plugin-active-header-links": "2.0.0-beta.48",
+ "@vuepress/plugin-back-to-top": "2.0.0-beta.48",
+ "@vuepress/plugin-container": "2.0.0-beta.48",
+ "@vuepress/plugin-external-link-icon": "2.0.0-beta.48",
+ "@vuepress/plugin-git": "2.0.0-beta.48",
+ "@vuepress/plugin-medium-zoom": "2.0.0-beta.48",
+ "@vuepress/plugin-nprogress": "2.0.0-beta.48",
+ "@vuepress/plugin-palette": "2.0.0-beta.48",
+ "@vuepress/plugin-prismjs": "2.0.0-beta.48",
+ "@vuepress/plugin-theme-data": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "@vueuse/core": "^8.5.0",
+ "sass": "^1.52.1",
+ "vue": "^3.2.36",
+ "vue-router": "^4.0.15"
+ }
+ },
+ "@vuepress/utils": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-beta.48.tgz",
+ "integrity": "sha512-Y0e3j0SHkPHMWnNlZZOcdN3G4zhdTIs63Ywy4IULFsrpKAihRIUcSe4Yry6lCJyYCCS/gebwc1fQYAmPuNkijg==",
+ "dev": true,
+ "requires": {
+ "@types/debug": "^4.1.7",
+ "@types/fs-extra": "^9.0.13",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "globby": "^11.0.4",
+ "hash-sum": "^2.0.0",
+ "ora": "^5.4.1",
+ "upath": "^2.0.1"
+ }
+ },
+ "@vueuse/core": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.7.4.tgz",
+ "integrity": "sha512-dQgxjb79PDcizlaclgCkCzNoqNv12PnbXxUOFL9VacakmD/ACoSMWwTpcG3HKoDoYyl2V3kSW/8AkvXGEYEGFA==",
+ "dev": true,
+ "requires": {
+ "@vueuse/metadata": "8.7.4",
+ "@vueuse/shared": "8.7.4",
+ "vue-demi": "*"
+ }
+ },
+ "@vueuse/metadata": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.7.4.tgz",
+ "integrity": "sha512-CwEYS6/M6JDxk9D1mUsZq3F0VnYnf39rAxOytP58vb4BrhmPKEVfiSpvxuYcJimU9ccT/xjWhwBnsdGC2H9mIQ==",
+ "dev": true
+ },
+ "@vueuse/shared": {
+ "version": "8.7.4",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.7.4.tgz",
+ "integrity": "sha512-QhwTEd2Gr/8ZliWVEM8sbMUkXtVVV1Mt1mOkCnIbIN33D/V28FwGKUKqEPGZZCXuJchARnun/J1TAiT/UmZd1w==",
+ "dev": true,
+ "requires": {
+ "vue-demi": "*"
+ }
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/helper-numbers": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@webassemblyjs/helper-numbers": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-opt": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "@webassemblyjs/wast-printer": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "acorn-import-assertions": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {}
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "balloon-css": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/balloon-css/-/balloon-css-1.2.0.tgz",
+ "integrity": "sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A==",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.20.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
+ "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001349",
+ "electron-to-chromium": "^1.4.147",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.5",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "cac": {
+ "version": "6.7.12",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.12.tgz",
+ "integrity": "sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001356",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz",
+ "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "dev": true
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "csstype": {
+ "version": "2.6.20",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+ "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+ "dev": true
+ },
+ "dayjs": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
+ "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.161",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
+ "integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A==",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
+ "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ }
+ },
+ "entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "dev": true
+ },
+ "envinfo": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+ "dev": true
+ },
+ "es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "esbuild": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz",
+ "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==",
+ "dev": true,
+ "requires": {
+ "esbuild-android-64": "0.14.49",
+ "esbuild-android-arm64": "0.14.49",
+ "esbuild-darwin-64": "0.14.49",
+ "esbuild-darwin-arm64": "0.14.49",
+ "esbuild-freebsd-64": "0.14.49",
+ "esbuild-freebsd-arm64": "0.14.49",
+ "esbuild-linux-32": "0.14.49",
+ "esbuild-linux-64": "0.14.49",
+ "esbuild-linux-arm": "0.14.49",
+ "esbuild-linux-arm64": "0.14.49",
+ "esbuild-linux-mips64le": "0.14.49",
+ "esbuild-linux-ppc64le": "0.14.49",
+ "esbuild-linux-riscv64": "0.14.49",
+ "esbuild-linux-s390x": "0.14.49",
+ "esbuild-netbsd-64": "0.14.49",
+ "esbuild-openbsd-64": "0.14.49",
+ "esbuild-sunos-64": "0.14.49",
+ "esbuild-windows-32": "0.14.49",
+ "esbuild-windows-64": "0.14.49",
+ "esbuild-windows-arm64": "0.14.49"
+ }
+ },
+ "esbuild-android-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz",
+ "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-android-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz",
+ "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz",
+ "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz",
+ "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz",
+ "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz",
+ "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-32": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz",
+ "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz",
+ "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz",
+ "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz",
+ "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-mips64le": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz",
+ "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-ppc64le": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz",
+ "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-riscv64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz",
+ "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-s390x": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz",
+ "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-netbsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz",
+ "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-openbsd-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz",
+ "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-sunos-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz",
+ "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-32": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz",
+ "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz",
+ "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-arm64": {
+ "version": "0.14.49",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz",
+ "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==",
+ "dev": true,
+ "optional": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "dev": true,
+ "requires": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "klona": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
+ "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "linkify-it": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
+ "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
+ "dev": true,
+ "requires": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dev": true,
+ "requires": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "markdown-it": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
+ "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1",
+ "entities": "~3.0.1",
+ "linkify-it": "^4.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ }
+ }
+ },
+ "markdown-it-anchor": {
+ "version": "8.6.4",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.4.tgz",
+ "integrity": "sha512-Ul4YVYZNxMJYALpKtu+ZRdrryYt/GlQ5CK+4l1bp/gWXOG2QWElt6AqF3Mih/wfUKdZbNAZVXGR73/n6U/8img==",
+ "dev": true,
+ "requires": {}
+ },
+ "markdown-it-container": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz",
+ "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==",
+ "dev": true
+ },
+ "markdown-it-emoji": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz",
+ "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==",
+ "dev": true
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true
+ },
+ "medium-zoom": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.6.tgz",
+ "integrity": "sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg==",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node-releases": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
+ "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "requires": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
+ "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "dev": true
+ },
+ "prismjs": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
+ "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rollup": {
+ "version": "2.75.6",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
+ "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "sass": {
+ "version": "1.52.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz",
+ "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
+ "sass-loader": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz",
+ "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ }
+ },
+ "schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "terser": {
+ "version": "5.14.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
+ "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
+ "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.7",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.0",
+ "terser": "^5.7.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toml": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
+ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
+ "dev": true
+ },
+ "ts-debounce": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz",
+ "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==",
+ "dev": true
+ },
+ "uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ },
+ "upath": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
+ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "vite": {
+ "version": "2.9.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
+ "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.14.27",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.13",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ }
+ },
+ "vue": {
+ "version": "3.2.37",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz",
+ "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-dom": "3.2.37",
+ "@vue/compiler-sfc": "3.2.37",
+ "@vue/runtime-dom": "3.2.37",
+ "@vue/server-renderer": "3.2.37",
+ "@vue/shared": "3.2.37"
+ }
+ },
+ "vue-demi": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.1.tgz",
+ "integrity": "sha512-xmkJ56koG3ptpLnpgmIzk9/4nFf4CqduSJbUM0OdPoU87NwRuZ6x49OLhjSa/fC15fV+5CbEnrxU4oyE022svg==",
+ "dev": true,
+ "requires": {}
+ },
+ "vue-router": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.2.tgz",
+ "integrity": "sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==",
+ "dev": true,
+ "requires": {
+ "@vue/devtools-api": "^6.1.4"
+ }
+ },
+ "vuepress": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-beta.48.tgz",
+ "integrity": "sha512-m1CzjgMrHdrOzNr3eMoFrdqHlp3wK23TBIHZJtm9tDnwg4OF59FG6y6gGoBLo+zpfzVOwi/V8FR13ehiQwG/3A==",
+ "dev": true,
+ "requires": {
+ "vuepress-vite": "2.0.0-beta.48"
+ }
+ },
+ "vuepress-plugin-copy-code2": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.84.tgz",
+ "integrity": "sha512-jSI/k4HLSTr+0RhsJ+omr3RsrUrlBAhtdgIQYGdhy8Wm2g5NjMXjQZ3d7rs+gSIvQH1RDj2wRorV26yEKARw3g==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "balloon-css": "^1.2.0",
+ "vue": "^3.2.37",
+ "vue-router": "^4.0.16",
+ "vuepress-plugin-sass-palette": "2.0.0-beta.84",
+ "vuepress-shared": "2.0.0-beta.84"
+ }
+ },
+ "vuepress-plugin-redirect": {
+ "version": "2.0.0-beta.86",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-redirect/-/vuepress-plugin-redirect-2.0.0-beta.86.tgz",
+ "integrity": "sha512-kxPyPAhH1U0UJdsq8qLMu4UDTaNxzPUZWalHGNYE/EZ4EYA0uSlkobjvppFr3baR9KpNyi/DlnW/SOSCw6EwQg==",
+ "dev": true,
+ "requires": {
+ "@vuepress/cli": "2.0.0-beta.49",
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "cac": "^6.7.12",
+ "vuepress-shared": "2.0.0-beta.86"
+ },
+ "dependencies": {
+ "@vuepress/cli": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-beta.49.tgz",
+ "integrity": "sha512-3RtuZvtLIGXEtsLgc3AnDr4jxiFeFDWfNw6MTb22YwuttBr5h5pZO/F8XMyP9+tEi73q3/l4keNQftU4msHysQ==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "cac": "^6.7.12",
+ "chokidar": "^3.5.3",
+ "envinfo": "^7.8.1",
+ "esbuild": "^0.14.49"
+ }
+ },
+ "@vuepress/client": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.49.tgz",
+ "integrity": "sha512-zfGlCAF/LwDOrZXZPqADsMgWRuH/2GFOGSOCvt7ZUZHnSrYBdK2FOez/ksWL8EwGNLsRLB8ny1IachMwTew5og==",
+ "dev": true,
+ "requires": {
+ "@vue/devtools-api": "^6.2.0",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "vue": "^3.2.37",
+ "vue-router": "^4.1.2"
+ }
+ },
+ "@vuepress/core": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-beta.49.tgz",
+ "integrity": "sha512-40J74qGOPqF9yGdXdzPD1kW9mv5/jfJenmhsH1xaErPsr6qIM8jcraVRC+R7NoVTIecRk9cC9MJcDRnLmDDiAg==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.49",
+ "@vuepress/markdown": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "vue": "^3.2.37"
+ }
+ },
+ "@vuepress/markdown": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-beta.49.tgz",
+ "integrity": "sha512-aAw41NArV5leIpZOFmElxzRG29LDdEQe7oIcZtIvKPhVmEfg9/mgx4ea2OqY5DaBvEhkG42SojjKvmHiJKrwJw==",
+ "dev": true,
+ "requires": {
+ "@mdit-vue/plugin-component": "^0.6.0",
+ "@mdit-vue/plugin-frontmatter": "^0.6.0",
+ "@mdit-vue/plugin-headers": "^0.6.0",
+ "@mdit-vue/plugin-sfc": "^0.6.0",
+ "@mdit-vue/plugin-title": "^0.6.0",
+ "@mdit-vue/plugin-toc": "^0.6.0",
+ "@mdit-vue/shared": "^0.6.0",
+ "@mdit-vue/types": "^0.6.0",
+ "@types/markdown-it": "^12.2.3",
+ "@types/markdown-it-emoji": "^2.0.2",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "markdown-it": "^13.0.1",
+ "markdown-it-anchor": "^8.6.4",
+ "markdown-it-emoji": "^2.0.2",
+ "mdurl": "^1.0.1"
+ }
+ },
+ "@vuepress/plugin-git": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.49.tgz",
+ "integrity": "sha512-CjaBYWBAkQmlpx5v+mp2vsoRxqRTi/mSvXy8im/ftc8zX/sVT4V1LBWX1IsDQn1VpWnArlfAsFd+BrmxzPFePA==",
+ "dev": true,
+ "requires": {
+ "@vuepress/core": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "execa": "^5.1.1"
+ }
+ },
+ "@vuepress/shared": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-beta.49.tgz",
+ "integrity": "sha512-yoUgOtRUrIfe0O1HMTIMj0NYU3tAiUZ4rwVEtemtGa7/RK7qIZdBpAfv08Ve2CUpa3wrMb1Pux1aBsiz1EQx+g==",
+ "dev": true,
+ "requires": {
+ "@vue/shared": "^3.2.37"
+ }
+ },
+ "@vuepress/utils": {
+ "version": "2.0.0-beta.49",
+ "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-beta.49.tgz",
+ "integrity": "sha512-t5i0V9FqpKLGlu2kMP/Y9+wdgEmsD2yQAMGojxpMoFhJBmqn2L9Rkk4WYzHKzPGDkm1KbBFzYQqjAhZQ7xtY1A==",
+ "dev": true,
+ "requires": {
+ "@types/debug": "^4.1.7",
+ "@types/fs-extra": "^9.0.13",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "globby": "^11.0.4",
+ "hash-sum": "^2.0.0",
+ "ora": "^5.4.1",
+ "upath": "^2.0.1"
+ }
+ },
+ "vuepress-shared": {
+ "version": "2.0.0-beta.86",
+ "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-beta.86.tgz",
+ "integrity": "sha512-8XjUscW4dmP59WxqhPg42okoarlybMNXAyi9k5J0KeQLHTeDMySSzqrYkF/iQdv63PKE3JFIhSRhUsaK0yedMw==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.49",
+ "@vuepress/plugin-git": "2.0.0-beta.49",
+ "@vuepress/shared": "2.0.0-beta.49",
+ "@vuepress/utils": "2.0.0-beta.49",
+ "dayjs": "^1.11.3",
+ "execa": "^5.1.1",
+ "ora": "^5.4.1",
+ "vue": "^3.2.37",
+ "vue-router": "^4.1.2"
+ }
+ }
+ }
+ },
+ "vuepress-plugin-sass-palette": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.84.tgz",
+ "integrity": "sha512-cdl/caVQk3hWvpzO9dcy+KfFa/0pHCvkSZy+xOk7lAUL7srVQnCIEs1ii7D+/ngmyve8+JENy2+Ch15exYibJA==",
+ "dev": true,
+ "requires": {
+ "@vuepress/utils": "2.0.0-beta.48",
+ "chokidar": "^3.5.3",
+ "sass": "^1.52.3",
+ "vuepress-shared": "2.0.0-beta.84"
+ }
+ },
+ "vuepress-shared": {
+ "version": "2.0.0-beta.84",
+ "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-beta.84.tgz",
+ "integrity": "sha512-yfN2ng7X0oFlIPLX3AJMK8PuQYrqcKrKa8Gm77sH3bGKJjhKBr7UO9jXh/io3vBIoqd4vjiKHYyOHJqB/nIWoQ==",
+ "dev": true,
+ "requires": {
+ "@vuepress/client": "2.0.0-beta.48",
+ "@vuepress/plugin-git": "2.0.0-beta.48",
+ "@vuepress/plugin-theme-data": "2.0.0-beta.48",
+ "@vuepress/shared": "2.0.0-beta.48",
+ "@vuepress/utils": "2.0.0-beta.48",
+ "dayjs": "^1.11.3",
+ "execa": "^5.1.1",
+ "ora": "^5.4.1",
+ "vue": "^3.2.37",
+ "vue-router": "^4.0.16"
+ }
+ },
+ "vuepress-vite": {
+ "version": "2.0.0-beta.48",
+ "resolved": "https://registry.npmjs.org/vuepress-vite/-/vuepress-vite-2.0.0-beta.48.tgz",
+ "integrity": "sha512-1TKEXg26W7VlTBU9J6BcJTW/NFtzkAveM33jccVs6HieYgvK7lyTpbhs5eRu9fUWawGR8ULa+b5kdk0dSLpjew==",
+ "dev": true,
+ "requires": {
+ "@vuepress/bundler-vite": "2.0.0-beta.48",
+ "@vuepress/cli": "2.0.0-beta.48",
+ "@vuepress/core": "2.0.0-beta.48",
+ "@vuepress/theme-default": "2.0.0-beta.48"
+ }
+ },
+ "watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "webpack": {
+ "version": "5.73.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
+ "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^0.0.51",
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/wasm-edit": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "acorn": "^8.4.1",
+ "acorn-import-assertions": "^1.7.6",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.9.3",
+ "es-module-lexer": "^0.9.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.3",
+ "watchpack": "^2.3.1",
+ "webpack-sources": "^3.2.3"
+ }
+ },
+ "webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+}
diff --git a/site-vuepress/package.json b/site-vuepress/package.json
new file mode 100644
index 000000000..e97cf3828
--- /dev/null
+++ b/site-vuepress/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "site-vuepress",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "docs:dev": "vuepress dev docs",
+ "docs:build": "vuepress build docs",
+ "prettier": "prettier --write ."
+ },
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@vuepress/plugin-search": "^2.0.0-beta.48",
+ "prettier": "2.7.1",
+ "vuepress": "^2.0.0-beta.48",
+ "vuepress-plugin-copy-code2": "^2.0.0-beta.84",
+ "vuepress-plugin-redirect": "^2.0.0-beta.86"
+ }
+}
diff --git a/site/src/site/sphinx/README.md b/site/src/site/sphinx/README.md
deleted file mode 100644
index 8451d95f0..000000000
--- a/site/src/site/sphinx/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率
\ No newline at end of file
diff --git a/site/src/site/sphinx/_include_html/arthas-tutorials.html b/site/src/site/sphinx/_include_html/arthas-tutorials.html
deleted file mode 100644
index 95cff06fd..000000000
--- a/site/src/site/sphinx/_include_html/arthas-tutorials.html
+++ /dev/null
@@ -1,1026 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Arthas Tutorials
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-