Merge pull request #27 from apache/fix-example-download

fix(editor): fix no source code in downloaded file bug.
diff --git a/.gitignore b/.gitignore
index c8cedd0..8b72324 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,7 @@
 /public/js
 /public/css
 /public/asset
+/public/data/option
+/public/data-gl/option
+
+tmp
\ No newline at end of file
diff --git a/README.md b/README.md
index b1450b5..0fa8cd1 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
 npm run release
 ```
 
-It will copy all the build resources to incubator-echarts-website/next/examples
+It will copy all the build resources to echarts-website/next/examples
 
 ## Use local echarts build
 
@@ -29,7 +29,7 @@
 ## Update example snapshots
 
 ```shell
-node tool/build-example.js
+npm run build:example
 ```
 
 Only for default theme
@@ -38,6 +38,53 @@
 node tool/build-example.js -t default
 ```
 
+## Run e2e tests.
+
+Run all the examples to test package publishing and install, module importing, minimal bundling and DTS correctness.
+
+Before run the tests. you need to update the examples.
+
+```shell
+npm run build:example
+```
+
+Then run the tests.
+```shell
+npm run test:e2e
+```
+
+You can change the testing branch or local dir, which is available when add `--local` in `e2e/config.js`
+
+If you want to test with esbuild bundler. Which is much faster.
+```shell
+npm run test:e2e:esbuild
+```
+
+If you want use the packages in your local folder which is still in developing. Please update the `dir` path in `test/config.js` for all packages first. Then run the script directly with `--local` arg.
+
+```shell
+node e2e/main.js --bundler esbuild -m --local
+node e2e/main.js --bundler webpack -m --local
+```
+
+#### Run partial tests.
+
+> Note: This can only be used when you run the whole e2e test at least once.
+
+Skip specific stages.
+
+```shell
+node e2e/main.js --skip bundle
+```
+
+Specify matched tests.
+
+```shell
+node e2e/main.js --skip npm --tests bar3D*
+```
+
+
+
 ## Edit example
 
 All test cases are in the `public/data` folder. The comment in the header
@@ -61,7 +108,7 @@
 For example:
 ```js
 $.when(
-    $.getScript(ROOT_PATH + '/data/asset/js/myTransform.js'),
+    $.getScript(ROOT_PATH + '/data/asset/js/xxxx.js'),
     $.getScript('https://cdn.jsdelivr.net/npm/d3-contour@2.0.0/dist/d3-contour.jXs'),
 ).done(function () {
     // ...
diff --git a/build/server.js b/build/server.js
index bf4bd4f..77b0da6 100644
--- a/build/server.js
+++ b/build/server.js
@@ -12,3 +12,9 @@
 setTimeout(() => {
     open('http://127.0.0.1:3002/en/index.html');
 }, 3000);
+
+process.on('SIGINT', function() {
+    console.log('Closing');
+    // Close through ctrl + c;
+    process.exit();
+});
\ No newline at end of file
diff --git a/build/webpack.config.js b/build/webpack.config.js
index 2dcd2e2..3107a0c 100644
--- a/build/webpack.config.js
+++ b/build/webpack.config.js
@@ -9,6 +9,7 @@
     {
         entry: path.resolve(__dirname, '../src/main.js'),
         output: {
+            publicPath: './',
             filename: 'example-bundle.js',
             path: path.join(distPath, 'js'),
             library: 'echartsExample',
@@ -30,7 +31,7 @@
                 test: /\.scss$/,
                 use: [MiniCssExtractPlugin.loader, 'css-loader', 'sassjs-loader']
             }, {
-                test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svg|svgz)(\?.+)?$/,
+                test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2)(\?.+)?$/,
                 use: [{
                     loader: 'file-loader',
                     options: {
@@ -39,7 +40,15 @@
                         name: '[name].[ext]'
                     }
                 }]
-            }]
+            }, {
+                test: /\.svg$/,
+                use: [{
+                    loader: 'html-loader',
+                    options: {
+                        minimize: true
+                    }
+                }]
+              },]
         },
         externals: {
             vue: 'Vue'
@@ -58,9 +67,12 @@
         stats: 'minimal',
         module: {
             rules: [{
-                test: /\.mjs$/,
+                test: /\.m?js$/,
                 include: /node_modules/,
-                type: 'javascript/auto'
+                type: 'javascript/auto',
+                resolve: {
+                    fullySpecified: false
+                }
             }]
         },
         output: {
diff --git a/common/buildCode.js b/common/buildCode.js
new file mode 100644
index 0000000..f0f5afa
--- /dev/null
+++ b/common/buildCode.js
@@ -0,0 +1,374 @@
+const COMPONENTS_MAP = {
+    grid: 'GridComponent',
+    polar: 'PolarComponent',
+    geo: 'GeoComponent',
+    singleAxis: 'SingleAxisComponent',
+    parallel: 'ParallelComponent',
+    calendar: 'CalendarComponent',
+    graphic: 'GraphicComponent',
+    toolbox: 'ToolboxComponent',
+    tooltip: 'TooltipComponent',
+    axisPointer: 'AxisPointerComponent',
+    brush: 'BrushComponent',
+    title: 'TitleComponent',
+    timeline: 'TimelineComponent',
+    markPoint: 'MarkPointComponent',
+    markLine: 'MarkLineComponent',
+    markArea: 'MarkAreaComponent',
+    legend: 'LegendComponent',
+    dataZoom: 'DataZoomComponent',
+    visualMap: 'VisualMapComponent',
+    aria: 'AriaComponent',
+    dataset: 'DatasetComponent',
+
+    // Dependencies
+    xAxis: 'GridComponent',
+    yAxis: 'GridComponent',
+    angleAxis: 'PolarComponent',
+    radiusAxis: 'PolarComponent'
+}
+
+const CHARTS_MAP = {
+    line: 'LineChart',
+    bar: 'BarChart',
+    pie: 'PieChart',
+    scatter: 'ScatterChart',
+    radar: 'RadarChart',
+    map: 'MapChart',
+    tree: 'TreeChart',
+    treemap: 'TreemapChart',
+    graph: 'GraphChart',
+    gauge: 'GaugeChart',
+    funnel: 'FunnelChart',
+    parallel: 'ParallelChart',
+    sankey: 'SankeyChart',
+    boxplot: 'BoxplotChart',
+    candlestick: 'CandlestickChart',
+    effectScatter: 'EffectScatterChart',
+    lines: 'LinesChart',
+    heatmap: 'HeatmapChart',
+    pictorialBar: 'PictorialBarChart',
+    themeRiver: 'ThemeRiverChart',
+    sunburst: 'SunburstChart',
+    custom: 'CustomChart'
+}
+const COMPONENTS_GL_MAP = {
+
+    grid3D: 'Grid3DComponent',
+    geo3D: 'Geo3DComponent',
+    globe: 'GlobeComponent',
+    mapbox3D: 'Mapbox3DComponent',
+    maptalks3D: 'Maptalks3DComponent',
+
+    // Dependencies
+    xAxis3D: 'Grid3DComponent',
+    yAxis3D: 'Grid3DComponent',
+    zAxis3D: 'Grid3DComponent',
+}
+const CHARTS_GL_MAP = {
+    bar3D: 'Bar3DChart',
+    line3D: 'Line3DChart',
+    scatter3D: 'Scatter3DChart',
+    lines3D: 'Lines3DChart',
+    polygons3D: 'Polygons3DChart',
+    surface: 'SurfaceChart',
+    map3D: 'Map3DChart',
+
+    scatterGL: 'ScatterGLChart',
+    graphGL: 'GraphGLChart',
+    flowGL: 'FlowGLChart',
+    linesGL: 'LinesGLChart'
+}
+
+const COMPONENTS_MAP_REVERSE = {};
+const CHARTS_MAP_REVERSE = {};
+const CHARTS_GL_MAP_REVERSE = {};
+const COMPONENTS_GL_MAP_REVERSE = {};
+
+const RENDERERS_MAP_REVERSE = {
+    'SVGRenderer': 'svg',
+    'CanvasRenderer': 'canvas'
+}
+
+// Component that will be injected automatically in preprocessor
+// These should be excluded util find they were used explicitly.
+const MARKERS = ['markLine', 'markArea', 'markPoint'];
+const INJECTED_COMPONENTS = [
+    ...MARKERS, 'grid', 'axisPointer',
+    'aria'  // TODO aria
+];
+
+// Component that was dependent.
+const DEPENDENT_COMPONENTS = [
+    'xAxis', 'yAxis', 'angleAxis', 'radiusAxis',
+    'xAxis3D', 'yAxis3D', 'zAxis3D'
+];
+
+function createReverseMap(map, reverseMap) {
+    Object.keys(map).forEach(key => {
+        // Exclude dependencies.
+        if (DEPENDENT_COMPONENTS.includes(key)) {
+            return;
+        }
+        reverseMap[map[key]] = key;
+    });
+}
+
+createReverseMap(COMPONENTS_MAP, COMPONENTS_MAP_REVERSE);
+createReverseMap(CHARTS_MAP, CHARTS_MAP_REVERSE);
+createReverseMap(COMPONENTS_GL_MAP, COMPONENTS_GL_MAP_REVERSE);
+createReverseMap(CHARTS_GL_MAP, CHARTS_GL_MAP_REVERSE);
+
+module.exports.collectDeps = function collectDeps(option) {
+    let deps = [];
+    if (option.options) {
+
+        // TODO getOption() doesn't have baseOption and options.
+        option.options.forEach((opt) => {
+            deps = deps.concat(collectDeps(opt));
+        });
+
+        if (option.baseOption) {
+            deps = deps.concat(collectDeps(option.baseOption))
+        }
+
+        // Remove duplicates
+        return Array.from(new Set(deps));
+    }
+
+    Object.keys(option).forEach((key) => {
+        if (INJECTED_COMPONENTS.includes(key)) {
+            return;
+        }
+        const val = option[key];
+
+        if (Array.isArray(val) && !val.length) {
+            return;
+        }
+
+        if (COMPONENTS_MAP[key]) {
+            deps.push(COMPONENTS_MAP[key]);
+        }
+        if (COMPONENTS_GL_MAP[key]) {
+            deps.push(COMPONENTS_GL_MAP[key]);
+        }
+    });
+
+    let series = option.series;
+    if (!Array.isArray(series)) {
+        series = [series];
+    }
+
+    series.forEach((seriesOpt) => {
+        if (CHARTS_MAP[seriesOpt.type]) {
+            deps.push(CHARTS_MAP[seriesOpt.type]);
+        }
+        if (CHARTS_GL_MAP[seriesOpt.type]) {
+            deps.push(CHARTS_GL_MAP[seriesOpt.type]);
+        }
+        if (seriesOpt.type === 'map') {
+            // Needs geo component when using map
+            deps.push(COMPONENTS_MAP.geo);
+        }
+        MARKERS.forEach(markerType => {
+            if (seriesOpt[markerType]) {
+                deps.push(COMPONENTS_MAP[markerType]);
+            }
+        });
+    });
+
+    // Remove duplicates
+    return Array.from(new Set(deps));
+}
+
+function buildMinimalBundleCode(deps, includeType) {
+    const chartsImports = [];
+    const componentsImports = [];
+    const chartsGLImports = [];
+    const componentsGLImports = [];
+    const renderersImports = [];
+    deps.forEach(function (dep) {
+        if (dep.endsWith('Renderer')) {
+            renderersImports.push(dep);
+        }
+        else if (CHARTS_MAP_REVERSE[dep]) {
+            chartsImports.push(dep);
+            if (includeType) {
+                chartsImports.push(dep.replace(/Chart$/, 'SeriesOption'));
+            }
+        }
+        else if (COMPONENTS_MAP_REVERSE[dep]) {
+            componentsImports.push(dep);
+            if (includeType) {
+                componentsImports.push(dep.replace(/Component$/, 'ComponentOption'));
+            }
+        }
+        else if (CHARTS_GL_MAP_REVERSE[dep]) {
+            chartsGLImports.push(dep)
+        }
+        else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
+            componentsGLImports.push(dep);
+        }
+    });
+
+    function getImportsPartCode(imports) {
+        return `${imports.map(str => `
+    ${str}`).join(',')}`;
+    }
+
+    const allImports = [
+        ...componentsImports,
+        ...chartsImports,
+        ...componentsGLImports,
+        ...chartsGLImports,
+        ...renderersImports
+    ];
+
+    const ECOptionTypeCode = `
+type ECOption = echarts.ComposeOption<
+    ${allImports.filter(a => a.endsWith('Option')).join(' | ')}
+>`;
+    const importsCodes = [
+        [componentsImports, 'echarts/components'],
+        [chartsImports, 'echarts/charts'],
+        [renderersImports, 'echarts/renderers'],
+        [chartsGLImports, 'echarts-gl/charts'],
+        [componentsGLImports, 'echarts-gl/components']
+    ].filter(a => a[0].length > 0).map(item => `
+import {${getImportsPartCode(item[0])}
+} from '${item[1]}';
+    `.trim()).join('\n');
+
+    return `import * as echarts from 'echarts/core';
+${importsCodes}
+
+echarts.use(
+    [${allImports.filter(a => !a.endsWith('Option')).join(', ')}]
+);
+` + (includeType ? ECOptionTypeCode : '')
+}
+
+module.exports.buildMinimalBundleCode = buildMinimalBundleCode;
+
+function buildLegacyMinimalBundleCode(deps, isESM) {
+    const modules = [];
+    deps.forEach(function (dep) {
+        if (dep.endsWith('Renderer') && dep !== 'CanvasRenderer') {
+            modules.push(`zrender/lib/${RENDERERS_MAP_REVERSE[dep]}/${RENDERERS_MAP_REVERSE[dep]}`);
+        }
+        else if (CHARTS_MAP_REVERSE[dep]) {
+            modules.push(`echarts/lib/chart/${CHARTS_MAP_REVERSE[dep]}`);
+        }
+        else if (COMPONENTS_MAP_REVERSE[dep]) {
+            modules.push(`echarts/lib/component/${COMPONENTS_MAP_REVERSE[dep]}`);
+        }
+        else if (CHARTS_GL_MAP_REVERSE[dep]) {
+            modules.push(`echarts-gl/lib/chart/${CHARTS_GL_MAP_REVERSE[dep]}`);
+        }
+        else if (COMPONENTS_GL_MAP_REVERSE[dep]) {
+            modules.push(`echarts-gl/lib/component/${COMPONENTS_GL_MAP_REVERSE[dep]}`);
+        }
+    });
+
+    return isESM ? `import * as echarts from 'echarts/lib/echarts';
+${modules.map(mod => {
+    return `import '${mod}';`;
+}).join('\n')}
+` : `const echarts = require('echarts/lib/echarts');
+${modules.map(mod => {
+    return `require('${mod}');`;
+}).join('\n')}
+`
+}
+
+function hasGLInDeps(deps) {
+    return !!deps.find(dep => !!(CHARTS_GL_MAP_REVERSE[dep] || COMPONENTS_GL_MAP_REVERSE[dep]));
+}
+
+module.buildLegacyMinimalBundleCode = buildLegacyMinimalBundleCode;
+
+module.exports.buildExampleCode = function (
+    jsCode, deps, {
+        // If enable minimal import
+        minimal,
+        // If is ESM module or CommonJS module
+        // Force to be true in ts mode or minimal mode.
+        esm = true,
+        // If use legacy minimal import, like:
+        // import 'echarts/lib/chart/bar';
+        // Only available when minimal is true.
+        legacy,
+        // If is ts code
+        ts,
+        // Theme
+        theme,
+        ROOT_PATH,
+        // Other imports code code string
+        // For example
+        // `import 'echarts-liquidfill'`
+        extraImports
+    }
+) {
+    // if (minimal && !legacy) {
+    //     // ESM must be used when use the new minimal import
+    //     esm = true;
+    // }
+
+    if (ts) {
+        esm = true;
+    }
+
+    if (minimal && !esm) {
+        // Only legacy mode can be used when use require in mimimal bundle.
+        legacy = true;
+    }
+
+
+    const hasECStat = jsCode.indexOf('ecStat') >= 0;
+    const usedRootPath = jsCode.indexOf('ROOT_PATH') >= 0;
+    const usedApp = jsCode.indexOf('app') >= 0;
+
+    const DEP_CODE = `
+${hasECStat ?
+    esm ? `import ecStat from 'echarts-stat';`
+        : `var ecStat = require('echarts-stat');`
+    : ''
+}
+`;
+    const IMPORT_CODE = [
+        !minimal
+            ? esm
+                ? `import * as echarts from 'echarts';${hasGLInDeps(deps) ? `\nimport 'echarts-gl';` : ''}`
+                : `var echarts = require('echarts');${hasGLInDeps(deps) ? `\nrequire('echarts-gl');` : ''}`
+            : legacy
+                ? buildLegacyMinimalBundleCode(deps, esm)
+                : buildMinimalBundleCode(deps, ts),
+        (theme && theme !== 'dark')
+            ? esm
+                ? `import 'echarts/theme/${theme}'`
+                : `require('echarts/theme/${theme}')`
+            : '',
+        extraImports
+    ].filter(a => !!a).join('\n');
+
+    const ENV_CODE = [
+        usedRootPath ? `var ROOT_PATH = '${ROOT_PATH}';` : '',
+        usedApp ? `var app${ts ? ': any' : ''} = {};` : '',
+        ts && !minimal ? 'type ECOption = echarts.EChartsOption' : ''
+    ].filter(a => !!a).join('\n');
+
+    const PREPARE_CODE = [
+        IMPORT_CODE.trim(), DEP_CODE.trim(), ENV_CODE.trim()
+    ].filter(a => !!a).join('\n\n');
+
+    return `${PREPARE_CODE}
+
+var chartDom = document.getElementById('main')${ts ? '!' : ''};
+var myChart = echarts.init(chartDom${theme ? `, '${theme}'` : ''});
+var option${ts ? ': ECOption' : ''};
+
+${jsCode.trim()}
+
+option && myChart.setOption(option);
+`;
+}
\ No newline at end of file
diff --git a/common/compareImage.js b/common/compareImage.js
new file mode 100644
index 0000000..e0d3a93
--- /dev/null
+++ b/common/compareImage.js
@@ -0,0 +1,47 @@
+const fs = require('fs');
+const PNG = require('pngjs').PNG;
+const pixelmatch = require('pixelmatch');
+
+function readPNG(path) {
+    return new Promise(resolve => {
+        fs.createReadStream(path)
+            .pipe(new PNG())
+            .on('parsed', function () {
+                resolve({
+                    data: this.data,
+                    width: this.width,
+                    height: this.height
+                });
+            });
+    });
+}
+
+module.exports.compareImage = function (targetPath, sourcePath, threshold = 0.1) {
+    if (!fs.existsSync(targetPath)) {
+        return true;
+    }
+
+    return Promise.all([
+        readPNG(targetPath),
+        readPNG(sourcePath)
+    ]).then(([expectedImg, actualImg]) => {
+        let width = expectedImg.width;
+        let height = expectedImg.height;
+        if (
+            (width !== actualImg.width)
+          || (height !== actualImg.height)
+        ) {
+            return {diffRatio: 1}
+        }
+        const diffPNG = new PNG({width, height});
+        let diffPixelsCount = pixelmatch(expectedImg.data, actualImg.data, diffPNG.data, width, height, {
+            threshold
+        });
+        let totalPixelsCount = width * height;
+
+        return {
+            diffRatio: diffPixelsCount / totalPixelsCount,
+            diffPNG
+        };
+    });
+}
\ No newline at end of file
diff --git a/common/task.js b/common/task.js
new file mode 100644
index 0000000..f2e5f1c
--- /dev/null
+++ b/common/task.js
@@ -0,0 +1,51 @@
+function runTasks(
+    taskParamsLists, createTask, concurrency
+) {
+    concurrency = Math.min(taskParamsLists.length, concurrency);
+    return new Promise((resolve, reject) => {
+        let runningTaskCount = 0;
+        let cursor = 0;
+        let rets = [];
+
+        function finishTask(res, idx) {
+            rets[idx] = res;
+            processNext();
+        }
+
+        function failTask(e) {
+            console.error(e);
+            processNext();
+        }
+
+        function processNext() {
+            runningTaskCount--;
+            addTask();
+
+            if (runningTaskCount === 0) {
+                resolve(rets);
+            }
+        }
+
+        function addTask() {
+            const param = taskParamsLists[cursor];
+            if (param) {
+                const currentTaskIdx = cursor;
+                runningTaskCount++;
+                createTask(param)
+                    .then((res) => finishTask(res, currentTaskIdx))
+                    .catch(failTask);
+                cursor++;
+            }
+        }
+
+        for (let i = 0; i < concurrency; i++) {
+            addTask();
+        }
+
+        if (!runningTaskCount) {
+            resolve(rets);
+        }
+    });
+}
+
+module.exports.runTasks = runTasks;
\ No newline at end of file
diff --git a/config/env.asf.js b/config/env.asf.js
index 63926ea..8c08547 100644
--- a/config/env.asf.js
+++ b/config/env.asf.js
@@ -2,7 +2,7 @@
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../incubator-echarts-website/next/examples')
+    releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
 });
 
 module.exports = config;
diff --git a/config/env.dev.js b/config/env.dev.js
index 63926ea..8c08547 100644
--- a/config/env.dev.js
+++ b/config/env.dev.js
@@ -2,7 +2,7 @@
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../incubator-echarts-website/next/examples')
+    releaseDestDir: path.resolve(__dirname, '../../echarts-website/examples')
 });
 
 module.exports = config;
diff --git a/config/env.localsite.js b/config/env.localsite.js
index 63926ea..84106f2 100644
--- a/config/env.localsite.js
+++ b/config/env.localsite.js
@@ -2,7 +2,7 @@
 const config = require('./common');
 
 Object.assign(config, {
-    releaseDestDir: path.resolve(__dirname, '../../incubator-echarts-website/next/examples')
+    releaseDestDir: path.resolve(__dirname, '../../echarts-website/next/examples')
 });
 
 module.exports = config;
diff --git a/e2e/cases/README.md b/e2e/cases/README.md
new file mode 100644
index 0000000..7d12477
--- /dev/null
+++ b/e2e/cases/README.md
@@ -0,0 +1,3 @@
+# Handwritten Cases
+
+Mostly for testing extensions.
\ No newline at end of file
diff --git a/e2e/cases/liquidfill.js b/e2e/cases/liquidfill.js
new file mode 100644
index 0000000..c219859
--- /dev/null
+++ b/e2e/cases/liquidfill.js
@@ -0,0 +1,10 @@
+/*
+extension: echarts-liquidfill
+*/
+option = {
+    series: [{
+        type: 'liquidFill',
+        data: [0.6],
+        radius: '70%'
+    }]
+};
\ No newline at end of file
diff --git a/e2e/cases/wordcloud.js b/e2e/cases/wordcloud.js
new file mode 100644
index 0000000..ee14f29
--- /dev/null
+++ b/e2e/cases/wordcloud.js
@@ -0,0 +1,121 @@
+/*
+extension: echarts-wordcloud
+*/
+option = {
+    tooltip: {},
+    series: [ {
+        type: 'wordCloud',
+        gridSize: 2,
+        sizeRange: [12, 50],
+        rotationRange: [-90, 90],
+        shape: 'pentagon',
+        width: 600,
+        height: 400,
+        drawOutOfBound: true,
+        textStyle: {
+            color: function () {
+                return 'rgb(' + [
+                    Math.round(Math.random() * 160),
+                    Math.round(Math.random() * 160),
+                    Math.round(Math.random() * 160)
+                ].join(',') + ')';
+            }
+        },
+        emphasis: {
+            textStyle: {
+                shadowBlur: 10,
+                shadowColor: '#333'
+            }
+        },
+        data: [
+            {
+                name: 'Sam S Club',
+                value: 10000,
+                textStyle: {
+                    color: 'black'
+                },
+                emphasis: {
+                    textStyle: {
+                        color: 'red'
+                    }
+                }
+            },
+            {
+                name: 'Macys',
+                value: 6181
+            },
+            {
+                name: 'Amy Schumer',
+                value: 4386
+            },
+            {
+                name: 'Jurassic World',
+                value: 4055
+            },
+            {
+                name: 'Charter Communications',
+                value: 2467
+            },
+            {
+                name: 'Chick Fil A',
+                value: 2244
+            },
+            {
+                name: 'Planet Fitness',
+                value: 1898
+            },
+            {
+                name: 'Pitch Perfect',
+                value: 1484
+            },
+            {
+                name: 'Express',
+                value: 1112
+            },
+            {
+                name: 'Home',
+                value: 965
+            },
+            {
+                name: 'Johnny Depp',
+                value: 847
+            },
+            {
+                name: 'Lena Dunham',
+                value: 582
+            },
+            {
+                name: 'Lewis Hamilton',
+                value: 555
+            },
+            {
+                name: 'KXAN',
+                value: 550
+            },
+            {
+                name: 'Mary Ellen Mark',
+                value: 462
+            },
+            {
+                name: 'Farrah Abraham',
+                value: 366
+            },
+            {
+                name: 'Rita Ora',
+                value: 360
+            },
+            {
+                name: 'Serena Williams',
+                value: 282
+            },
+            {
+                name: 'NCAA baseball tournament',
+                value: 273
+            },
+            {
+                name: 'Point Break',
+                value: 265
+            }
+        ]
+    } ]
+};
diff --git a/e2e/config.js b/e2e/config.js
new file mode 100644
index 0000000..48935f3
--- /dev/null
+++ b/e2e/config.js
@@ -0,0 +1,32 @@
+const nodePath = require('path');
+
+module.exports = {
+    packages: [
+        // Handwritten topological sort by the rule of dependency.
+        {
+            name: 'zrender',    // package name
+            dir: nodePath.resolve(__dirname, '../../zrender'),
+            git: 'ecomfe/zrender#master'
+        },
+        {
+            name: 'echarts',
+            dir: nodePath.resolve(__dirname, '../../echarts'),
+            git: 'apache/echarts#master'
+        },
+        {
+            name: 'echarts-gl',
+            dir: nodePath.resolve(__dirname, '../../echarts-gl'),
+            git: 'ecomfe/echarts-gl#master'
+        },
+        {
+            name: 'echarts-wordcloud',
+            dir: nodePath.resolve(__dirname, '../../echarts-wordcloud'),
+            git: 'ecomfe/echarts-wordcloud#master'
+        },
+        {
+            name: 'echarts-liquidfill',
+            dir: nodePath.resolve(__dirname, '../../echarts-liquidfill'),
+            git: 'ecomfe/echarts-liquidfill#master'
+        }
+    ]
+}
\ No newline at end of file
diff --git a/e2e/main.js b/e2e/main.js
new file mode 100644
index 0000000..575488c
--- /dev/null
+++ b/e2e/main.js
@@ -0,0 +1,757 @@
+// TODO Specify echarts path
+
+const fs = require('fs');
+const globby = require('globby');
+const {buildExampleCode, collectDeps} = require('../common/buildCode');
+const nodePath = require('path');
+const { runTasks } = require('../common/task');
+const fse = require('fs-extra');
+const prettier = require('prettier');
+const ts = require('typescript');
+const chalk = require('chalk');
+const nStatic = require('node-static');
+const webpack = require('webpack');
+const {RawSource} = require('webpack-sources');
+const argparse = require('argparse');
+const esbuild = require('esbuild');
+const puppeteer = require('puppeteer');
+const config = require('./config');
+const {compareImage} = require('../common/compareImage');
+const shell = require('shelljs');
+const downloadGit = require('download-git-repo');
+const {promisify} = require('util');
+const matter = require('gray-matter');
+const minimatch = require('minimatch');
+
+const parser = new argparse.ArgumentParser({
+    addHelp: true
+});
+parser.addArgument(['--bundler'], {
+    help: 'Bundler, can be webpack or esbuild'
+});
+parser.addArgument(['-m', '--minify'], {
+    action: 'storeTrue',
+    help: 'If minify'
+});
+parser.addArgument(['--local'], {
+    action: 'storeTrue',
+    help: `If use local repos. If so, don't forget to update the location of local repo in config.js.`
+});
+parser.addArgument(['--skip'], {
+    help: 'If skip some stages to speed up the test. Can be npm,bundle,render,compare'
+});
+parser.addArgument(['-t', '--tests'], {
+    help: 'If use pattern to specify which tests to run'
+});
+const args = parser.parseArgs();
+
+const EXAMPLE_DIR =  `${__dirname}/../public/`;
+const TMP_DIR = `${__dirname}/tmp`;
+const RUN_CODE_DIR = `${TMP_DIR}/tests`;
+const BUNDLE_DIR = `${TMP_DIR}/bundles`;
+const SCREENSHOTS_DIR = `${TMP_DIR}/screenshots`;
+const REPO_DIR = `${TMP_DIR}/repos`;
+const PACKAGE_DIR = `${TMP_DIR}/packages`;
+
+const MINIMAL_POSTFIX = 'minimal';
+const MINIMAL_LEGACY_POSTFIX = 'minimal.legacy';
+
+const MINIFY_BUNDLE = args.minify;
+// const TEST_THEME = 'dark-blue';
+const TEST_THEME = '';
+const USE_WEBPACK = !(args.bundler === 'esbuild');
+
+let testsPattern = args.tests;
+if (testsPattern) {
+    testsPattern = testsPattern.split(',');
+}
+
+// Create a server
+const port = 3322;
+const baseUrl = `http://localhost:${port}`;
+
+const TEMPLATE_CODE = `
+// @ts-ignore
+echarts.registerPreprocessor(function (option) {
+    option.animation = false;
+    if (option.series) {
+        if (!(option.series instanceof Array)) {
+            option.series = [option.series];
+        }
+        // @ts-ignore
+        option.series.forEach(function (seriesOpt) {
+            if (seriesOpt.type === 'graph') {
+                seriesOpt.force = seriesOpt.force || {};
+                seriesOpt.force.layoutAnimation = false;
+            }
+            seriesOpt.progressive = 1e5;
+            seriesOpt.animation = false;
+        });
+    }
+});
+`
+
+function buildPrepareCode(isESM, lang) {
+    return `
+// @ts-ignore
+${isESM
+    ? `import _seedrandom from 'seedrandom';`
+    : `const _seedrandom = require('seedrandom');`
+}
+
+// Check if i18n will break the minimal imports.
+${lang
+    ? isESM
+        ? `import 'echarts/i18n/${lang}';`
+        : `require('echarts/i18n/${lang}');`
+    : ''
+}
+// @ts-ignore
+const _myrng = _seedrandom('echarts');
+// @ts-ignore
+Math.random = function () {
+    // @ts-ignore
+    return _myrng();
+};
+${TEMPLATE_CODE}
+`;
+}
+
+async function prepare() {
+    fse.removeSync(TMP_DIR);
+    fse.removeSync(RUN_CODE_DIR);
+    fse.removeSync(BUNDLE_DIR);
+    fse.removeSync(SCREENSHOTS_DIR);
+
+    fse.removeSync(REPO_DIR);
+    fse.removeSync(PACKAGE_DIR);
+
+    fse.ensureDirSync(TMP_DIR);
+    fse.ensureDirSync(RUN_CODE_DIR);
+    fse.ensureDirSync(BUNDLE_DIR);
+    fse.ensureDirSync(SCREENSHOTS_DIR);
+
+    fse.ensureDirSync(REPO_DIR);
+    fse.ensureDirSync(PACKAGE_DIR);
+}
+
+async function downloadPackages(config) {
+    for (let pkg of config.packages) {
+        const pkgDownloadPath = nodePath.join(REPO_DIR, pkg.name);
+        console.log(chalk.gray(`Downloading ${pkg.git}`))
+        await promisify(downloadGit)(pkg.git, pkgDownloadPath);
+        // Override the path
+        pkg.dir = pkgDownloadPath;
+    }
+}
+
+async function installPackages(config) {
+
+    const publishedPackages = {};
+
+    function checkFolder(pkg) {
+        const dir = pkg.dir;
+        if (!fs.existsSync(dir)) {
+            console.warn(chalk.yellow(`${dir} not exists. Please update it in e2e/config.js.`));
+            return false;
+        }
+        if (!nodePath.isAbsolute(dir)) {
+            console.warn(chalk.yellow(`${dir} is not an absolute path. Please update it in e2e/config.js.`));
+            return false;
+        }
+        return true;
+    }
+
+    function publishPackage(pkg) {
+        console.log(chalk.gray(`Publishing ${pkg.dir}`))
+
+        shell.cd(pkg.dir);
+
+        const packageJson = JSON.parse(fs.readFileSync(nodePath.join(pkg.dir, 'package.json')));
+        const tgzFileName = `${packageJson.name}-${packageJson.version}.tgz`;
+        const targetTgzFilePath = nodePath.join(PACKAGE_DIR, tgzFileName);
+
+        if (packageJson.dependencies) {
+            for (let depPkgName in packageJson.dependencies) {
+                if (!publishedPackages[depPkgName]) {
+                    const depPkg = config.packages.find(a => a.name === depPkgName);
+                    if (depPkg) {
+                        publishPackage(depPkg);
+                        // Come back.
+                        shell.cd(pkg.dir);
+                    }
+                }
+
+                shell.exec(`npm install`);
+                shell.exec(`npm install ${publishedPackages[depPkgName]} --no-save`);
+            }
+        }
+
+        shell.exec(`npm pack`);
+        fs.renameSync(nodePath.join(pkg.dir, tgzFileName), targetTgzFilePath);
+        publishedPackages[packageJson.name] = targetTgzFilePath;
+    }
+
+    for (let pkg of config.packages) {
+        if (!checkFolder(pkg)) {
+            return;
+        }
+
+        publishPackage(pkg);
+    };
+
+    shell.cd(__dirname);
+    for (let pkg of config.packages) {
+        console.log(chalk.gray(`Installing ${pkg.name}`))
+        shell.exec(`npm install ${publishedPackages[pkg.name]}`);
+    }
+
+    // Come back.
+    shell.cd(process.cwd());
+}
+
+async function buildRunCode() {
+    const files = await globby([
+        `${EXAMPLE_DIR}/data/option/*.json`,
+        `${EXAMPLE_DIR}/data-gl/option/*.json`
+    ]);
+
+    if (!files.length) {
+        throw new Error('You need to run `node tool/build-example.js` before run this test.');
+    }
+
+    async function addTestCase(testName, testCode, deps, checkTs, extraImports, extraRequire) {
+        const ROOT_PATH = `${baseUrl}/public`;
+
+        const fullCode = buildExampleCode(buildPrepareCode(true) + testCode, deps, {
+            minimal: false,
+            ts: checkTs,
+            // Check if theme will break the minimal imports.
+            theme: TEST_THEME,
+            ROOT_PATH,
+            extraImports
+        });
+        const minimalCode = buildExampleCode(buildPrepareCode(true) + testCode, deps, {
+            minimal: true,
+            ts: checkTs,
+            theme: TEST_THEME,
+            ROOT_PATH,
+            extraImports
+        });
+        const legacyCode = buildExampleCode(buildPrepareCode(false) + testCode, deps, {
+            minimal: true,
+            esm: false,
+            ts: false,
+            theme: TEST_THEME,
+            ROOT_PATH,
+            extraImports: extraRequire
+        });
+
+        await fse.writeFile(
+            nodePath.join(RUN_CODE_DIR, testName + (checkTs ? '.ts' : '.js')),
+            prettier.format(fullCode, {
+                singleQuote: true,
+                parser: checkTs ? 'typescript' : 'babel'
+            }), 'utf-8'
+        );
+        await fse.writeFile(
+            nodePath.join(RUN_CODE_DIR, testName + `.${MINIMAL_POSTFIX}.${checkTs ? 'ts' : 'js'}`),
+            prettier.format(minimalCode, {
+                singleQuote: true,
+                parser: checkTs ? 'typescript' : 'babel'
+            }), 'utf-8'
+        );
+        await fse.writeFile(
+            nodePath.join(RUN_CODE_DIR, testName + `.${MINIMAL_LEGACY_POSTFIX}.js`),
+            prettier.format(legacyCode, {
+                singleQuote: true,
+                parser: 'babel'
+            }), 'utf-8'
+        );
+        console.log(
+            chalk.green('Generated: ', testName)
+        );
+    }
+
+    const builtinTestCases = await runTasks(files, async (fileName) => {
+        const isGL = fileName.startsWith(`${EXAMPLE_DIR}/data-gl`);
+        const testName = nodePath.basename(fileName, '.json');
+
+        if (testsPattern && !testsPattern.some(pattern => minimatch(testName, pattern))) {
+            return;
+        }
+
+        const optionCode = await fse.readFile(fileName, 'utf-8');
+        const option = JSON.parse(optionCode);
+        const testCode = await fse.readFile(nodePath.join(
+            EXAMPLE_DIR, isGL ? 'data-gl' : 'data', testName + '.js'
+        ), 'utf-8');
+
+        // TODO Ignore case with extension.
+
+        const deps = collectDeps(option).concat([
+            // TODO SVG
+            'CanvasRenderer'
+        ]);
+
+        if (
+            !(testName === 'map-HK' || testName === 'map-usa')  // Only test these two map examples
+            && (deps.includes('MapChart')
+                || deps.includes('GeoComponent')
+                || option.bmap)
+        ) {
+            console.warn(chalk.yellow(`Ignored map tests ${testName}`));
+            return;
+        }
+
+        // TODO: Don't support TypeScript in GL
+        await addTestCase(testName, testCode, deps, !isGL);
+
+        return testName;
+    }, 20);
+    const extensionTestCases = await runTasks(await globby(__dirname + '/cases/*.js'), async (fileName) => {
+        const testName = nodePath.basename(fileName, '.js');
+        if (testsPattern && !testsPattern.some(pattern => minimatch(testName, pattern))) {
+            return;
+        }
+
+        const testCode = await fse.readFile(fileName, 'utf-8');
+        let importsCode = '';
+        let requireCode = '';
+        try {
+            const fmResult = matter(testCode, {
+                delimiters: ['/*', '*/']
+            });
+            const extension = fmResult.data.extension;
+            if (extension) {
+                importsCode = `import '${extension}';`;
+                requireCode = `require('${extension}');`;
+            }
+        }
+        catch (e)  {
+        }
+        await addTestCase(testName, testCode, [], false, importsCode, requireCode);
+
+        return testName;
+    }, 20);
+
+    return builtinTestCases.concat(extensionTestCases).filter(a => !!a);
+}
+
+async function compileTs(tsTestFiles, result) {
+    const config = JSON.parse(fs.readFileSync(nodePath.join(__dirname, 'tsconfig.json'), 'utf-8'));
+
+    const compilerOptions = {
+        ...config.compilerOptions
+    };
+
+    const {options, errors} = ts.convertCompilerOptionsFromJson(compilerOptions, nodePath.resolve(__dirname));
+
+    if (errors.length) {
+        let errMsg = 'tsconfig parse failed: '
+            + errors.map(error => error.messageText).join('. ')
+            + '\n compilerOptions: \n' + JSON.stringify(config.compilerOptions, null, 4);
+        assert(false, errMsg);
+    }
+
+    // Generate this config file for checking the source code in vscode.
+    fs.writeFileSync(nodePath.join(RUN_CODE_DIR, 'tsconfig.json'), JSON.stringify({
+        compilerOptions
+    }, null, 2), 'utf-8');
+
+    // See: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API
+    let program = ts.createProgram(tsTestFiles, options);
+    let emitResult = program.emit();
+
+    let allDiagnostics = ts
+        .getPreEmitDiagnostics(program)
+        .concat(emitResult.diagnostics);
+
+    allDiagnostics.forEach(diagnostic => {
+        if (diagnostic.file) {
+            let {line, character} = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
+            let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
+
+            const compilerError = {
+                location: [line + 1, character + 1],
+                message
+            };
+            if (diagnostic.file.fileName.endsWith(`${MINIMAL_POSTFIX}.ts`)) {
+                const basename = nodePath.basename(diagnostic.file.fileName, `.${MINIMAL_POSTFIX}.ts`);
+                result[basename].compileErrors.minimal.push(compilerError);
+            }
+            else {
+                const basename = nodePath.basename(diagnostic.file.fileName,  `.ts`);
+                result[basename].compileErrors.full.push(compilerError);
+            }
+            // console.log(chalk.red(`${diagnostic.file.fileName} (${line + 1},${character + 1})`));
+            // console.log(chalk.gray(message));
+        }
+        else {
+            console.log(chalk.red(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')));
+        }
+    });
+    // assert(!emitResult.emitSkipped, 'ts compile failed.');
+}
+
+async function webpackBundle(esbuildService, entry, result) {
+    return new Promise((resolve) => {
+        webpack({
+            entry,
+            output: {
+                path: BUNDLE_DIR,
+                filename: '[name].js'
+            },
+            // Use esbuild as minify, terser is tooooooo slow for so much tests.
+            optimization: {
+                minimizer: MINIFY_BUNDLE ? [{
+                    apply(compiler) {
+                        compiler.hooks.compilation.tap(
+                            'ESBuild Minify',
+                            (compilation) => {
+                                compilation.hooks.optimizeChunkAssets.tapPromise(
+                                    'ESBuild Minify',
+                                    async (chunks) => {
+                                        for (const chunk of chunks) {
+                                            for (const file of chunk.files) {
+                                                const asset = compilation.assets[file];
+                                                const { source } = asset.sourceAndMap();
+                                                const result = await esbuildService.transform(source, {
+                                                    minify: true,
+                                                    sourcemap: false
+                                                });
+                                                compilation.updateAsset(file, () => {
+                                                    return new RawSource(result.code || '');
+                                                });
+                                            }
+                                        }
+                                    }
+                                );
+                            },
+                          );
+
+                    }
+                }] : []
+            }
+        }, (err, stats) => {
+            if (err || stats.hasErrors()) {
+                if (err) {
+                    console.error(err.stack || err);
+                    if (err.details) {
+                        console.error(err.details);
+                    }
+                    resolve();
+                    return;
+                }
+
+                const info = stats.toJson();
+
+                if (stats.hasErrors()) {
+                    console.error(info.errors);
+                }
+
+                if (stats.hasWarnings()) {
+                    console.warn(info.warnings);
+                }
+            }
+            else {
+                console.log(chalk.green(`${Object.values(entry).map(a => `Bundled ${a}`).join('\n')}`));
+            }
+
+            resolve();
+        });
+    })
+}
+
+function esbuildBundle(entry, result, minify) {
+    return esbuild.build({
+        entryPoints: entry,
+        bundle: true,
+        minify: minify,
+        define: {
+            'process.env.NODE_ENV': JSON.stringify(minify ? 'production' : 'development')
+        },
+        outdir: BUNDLE_DIR
+    });
+}
+
+async function bundle(entryFiles, result) {
+    if (USE_WEBPACK) {
+        // Split to multiple buckets to seepup bundle
+        // TODO Multiple entry may have effects on the final bundle.
+        const BUCKET_SIZE = 1;
+        const buckets = [];
+        const esbuildService = await esbuild.startService();
+        let count = 0;
+        outer: while (true) {
+            const bucket = {};
+            for (let i = 0; i < BUCKET_SIZE; i++) {
+                const filePath = entryFiles[count++];
+                if (!filePath) {
+                    break outer;
+                }
+                const basename = nodePath.basename(filePath, '.js');
+                bucket[basename] = filePath;
+            }
+            buckets.push(bucket);
+        }
+
+        // TODO Multiple thread.
+        for (let bucket of buckets) {
+            await webpackBundle(esbuildService, bucket, result);
+        }
+
+        esbuildService.stop();
+    }
+    else {
+        for (let file of entryFiles) {
+            await esbuildBundle([file], result, MINIFY_BUNDLE);
+            console.log(chalk.green(`Bundled ${file}`));
+        }
+    }
+}
+
+function waitTime(time) {
+    return new Promise((resolve) => setTimeout(resolve, time));
+}
+async function runExamples(jsFiles, result) {
+    const fileServer = new nStatic.Server(__dirname + '/../');
+    const server = require('http').createServer(function (request, response) {
+        request.addListener('end', function () {
+            fileServer.serve(request, response);
+        }).resume();
+    })
+    server.listen(port);
+
+    try {
+        const IGNORE_LOG = [
+            'A cookie associated with a cross-site resource at',
+            'A parser-blocking, cross site',
+            // For ECharts GL
+            'RENDER WARNING',
+            'GL ERROR',
+            'GL_INVALID_OPERATION'
+        ];
+
+        const browser = await puppeteer.launch({
+            headless: false,
+            args: [
+                '--headless',
+                '--hide-scrollbars',
+                // https://github.com/puppeteer/puppeteer/issues/4913
+                '--use-gl=egl',
+                '--mute-audio'
+            ]
+        });
+
+        await runTasks(jsFiles, async (file) => {
+            const page = await browser.newPage();
+            const basename = nodePath.basename(file, '.js');
+            await page.setViewport({ width: 800, height: 600 });
+
+            page.on('pageerror', function (err) {
+                // TODO Record pageerror
+                console.error(chalk.red(`[PAGE ERROR] [${basename}]`));
+                console.error(chalk.red(err.toString()));
+            });
+            page.on('console', msg => {
+                const text = msg.text();
+                if (!IGNORE_LOG.find(a => text.indexOf(a) >= 0)) {
+                    console.log(chalk.gray(`[PAGE LOG] [${basename}]: ${text}`));
+                }
+            });
+
+            await page.goto(`${baseUrl}/e2e/template.html`, {
+                waitUntil: 'networkidle0',
+                timeout: 10000
+            });
+            await page.addScriptTag({
+                url: `${baseUrl}/e2e/tmp/bundles/${basename}.js`
+            });
+            await waitTime(200);
+
+            await page.screenshot({
+                type: 'png',
+                path: nodePath.resolve(SCREENSHOTS_DIR, basename + '.png')
+            });
+
+            await page.close();
+
+            console.log(chalk.green(`Rendered ${file}`));
+        }, 8);
+    }
+    catch (e) {
+        server.close();
+        throw e;
+    }
+}
+
+
+async function compareExamples(testNames, result) {
+
+    function writePNG(png, diffPath) {
+        return new Promise(resolve => {
+            const writer = fs.createWriteStream(diffPath);
+            png.pack().pipe(writer);
+            writer.on('finish', () => { resolve(); });
+        });
+    }
+
+    for (let testName of testNames) {
+        const diffMinimal = await compareImage(
+            nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
+            nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_POSTFIX}.png`)
+        );
+        const diffMinimalLegacy = await compareImage(
+            nodePath.resolve(SCREENSHOTS_DIR, testName + '.png'),
+            nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.png`)
+        );
+
+        const diffMinimalPNGPath = nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_POSTFIX}.diff.png`);
+        const diffMinimalLegacyPNGPath = nodePath.resolve(SCREENSHOTS_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.diff.png`);
+
+        writePNG(diffMinimal.diffPNG, diffMinimalPNGPath);
+        writePNG(diffMinimalLegacy.diffPNG, diffMinimalLegacyPNGPath);
+
+        result[testName].screenshotDiff = {
+            minimal: {
+                ratio: diffMinimal.diffRatio,
+                png: nodePath.basename(diffMinimalPNGPath)
+            },
+            minimalLegacy: {
+                ratio: diffMinimalLegacy.diffRatio,
+                png: nodePath.basename(diffMinimalLegacyPNGPath)
+            }
+        }
+
+        if (diffMinimal.diffRatio > 0 || diffMinimalLegacy.diffRatio > 0) {
+            console.log(chalk.red(`Failed ${testName}`));
+        }
+        else {
+            console.log(chalk.green(`Passed ${testName}`));
+        }
+    }
+}
+
+
+async function main() {
+    let result;
+
+    if (!args.skip && !args.tests) {
+        // Don't clean up if skipping some of the stages.
+        await prepare();
+        result = {};
+    }
+    else {
+        // Read result.
+        try {
+            result = JSON.parse(fs.readFileSync(__dirname + '/tmp/result.json', 'utf-8'));
+        }
+        catch (e) {
+            console.error(e);
+            throw 'Must run full e2e test without --skip and --tests at least once.';
+        }
+    }
+
+    function isNotSkipped(stage) {
+        return !((args.skip || '').indexOf(stage) >= 0);
+    }
+
+    // We don't have to test the npm if bundle is also skipped.
+    if (isNotSkipped('npm') && isNotSkipped('bundle')) {
+        if (!args.local) {
+            console.log(chalk.gray('Downloading packages'));
+            await downloadPackages(config);
+        }
+
+        console.log(chalk.gray('Installing packages'));
+        await installPackages(config);
+    }
+    else {
+        console.log(chalk.yellow('Skipped NPM.'));
+    }
+
+
+    console.log(chalk.gray('Generating codes'));
+    // Always build code.
+    const testNames = await buildRunCode();
+
+    for (let key of testNames) {
+        result[key] = result[key] || {};
+    }
+
+    Object.keys(result).forEach(key => {
+        // Always do TS check on all tests. So reset all compile errors.
+        result[key].compileErrors = {
+            full: [],
+            minimal: [],
+            minimalLegacy: []
+        };
+    });
+
+    console.log('Compiling TypeScript');
+    // Always run typescript check to generate the js code.
+    await compileTs(
+        (await globby(nodePath.join(RUN_CODE_DIR, '*.ts')))
+            // No need to check types of the minimal legacy imports
+            .filter(a => !a.endsWith(`${MINIMAL_LEGACY_POSTFIX}.ts`)),
+        result
+    );
+
+    if (isNotSkipped('bundle')) {
+        console.log(`Bundling with ${USE_WEBPACK ? 'webpack' : 'esbuild'}`);
+        const jsFiles = [];
+        for (let testName of testNames) {
+            jsFiles.push(
+                nodePath.join(RUN_CODE_DIR, `${testName}.js`),
+                nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
+                nodePath.join(RUN_CODE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
+            );
+        }
+        await bundle(jsFiles, result);
+    }
+    else {
+        console.log(chalk.yellow('Skipped Bundle.'));
+    }
+
+    if (isNotSkipped('render')) {
+        console.log('Running examples');
+        const bundleFiles = [];
+        for (let testName of testNames) {
+            bundleFiles.push(
+                nodePath.join(BUNDLE_DIR, `${testName}.js`),
+                nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_POSTFIX}.js`),
+                nodePath.join(BUNDLE_DIR, `${testName}.${MINIMAL_LEGACY_POSTFIX}.js`)
+            );
+        }
+        await runExamples(bundleFiles, result);
+    }
+    else {
+        console.log(chalk.yellow('Skipped Render.'));
+    }
+
+    if (isNotSkipped('compare')) {
+        console.log('Comparing Results');
+        await compareExamples(testNames, result);
+    }
+    else {
+        console.log(chalk.yellow('Skipped Compare.'));
+    }
+
+    fs.writeFileSync(__dirname + '/tmp/result.json', JSON.stringify(
+        result, null, 2
+    ), 'utf-8');
+}
+
+main().catch(e => {
+    console.error(e);
+    process.exit();
+}).then(() => {
+    process.exit();
+});
+
+process.on('SIGINT', function() {
+    console.log('Closing');
+    // Close through ctrl + c;
+    process.exit();
+});
\ No newline at end of file
diff --git a/e2e/package-lock.json b/e2e/package-lock.json
new file mode 100644
index 0000000..ff08361
--- /dev/null
+++ b/e2e/package-lock.json
@@ -0,0 +1,6131 @@
+{
+  "name": "echarts-examples-e2e",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@sindresorhus/is": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
+      "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
+      "dev": true
+    },
+    "archive-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
+      "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
+      "dev": true,
+      "requires": {
+        "file-type": "^4.2.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
+          "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
+          "dev": true
+        }
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "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
+    },
+    "bl": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
+      "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.3.5",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "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-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc-unsafe": "^1.1.0",
+        "buffer-fill": "^1.0.0"
+      }
+    },
+    "buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+      "dev": true
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
+    "buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "dev": true
+    },
+    "cacheable-request": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
+      "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
+      "dev": true,
+      "requires": {
+        "clone-response": "1.0.2",
+        "get-stream": "3.0.0",
+        "http-cache-semantics": "3.8.1",
+        "keyv": "3.0.0",
+        "lowercase-keys": "1.0.0",
+        "normalize-url": "2.0.1",
+        "responselike": "1.0.2"
+      },
+      "dependencies": {
+        "lowercase-keys": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+          "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+          "dev": true
+        }
+      }
+    },
+    "caw": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
+      "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
+      "dev": true,
+      "requires": {
+        "get-proxy": "^2.0.0",
+        "isurl": "^1.0.0-alpha5",
+        "tunnel-agent": "^0.6.0",
+        "url-to-options": "^1.0.1"
+      }
+    },
+    "claygl": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/claygl/-/claygl-1.3.0.tgz",
+      "integrity": "sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ=="
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "dev": true,
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "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
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "config-chain": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
+      "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
+      "dev": true,
+      "requires": {
+        "ini": "^1.3.4",
+        "proto-list": "~1.2.1"
+      }
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "decompress": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
+      "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.0.0",
+        "decompress-tarbz2": "^4.0.0",
+        "decompress-targz": "^4.0.0",
+        "decompress-unzip": "^4.0.1",
+        "graceful-fs": "^4.1.10",
+        "make-dir": "^1.0.0",
+        "pify": "^2.3.0",
+        "strip-dirs": "^2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "dev": true,
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "decompress-tar": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
+      "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+      "dev": true,
+      "requires": {
+        "file-type": "^5.2.0",
+        "is-stream": "^1.1.0",
+        "tar-stream": "^1.5.2"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-tarbz2": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
+      "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.1.0",
+        "file-type": "^6.1.0",
+        "is-stream": "^1.1.0",
+        "seek-bzip": "^1.0.5",
+        "unbzip2-stream": "^1.0.9"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
+          "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
+          "dev": true
+        }
+      }
+    },
+    "decompress-targz": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
+      "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.1.1",
+        "file-type": "^5.2.0",
+        "is-stream": "^1.1.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-unzip": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
+      "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
+      "dev": true,
+      "requires": {
+        "file-type": "^3.8.0",
+        "get-stream": "^2.2.0",
+        "pify": "^2.3.0",
+        "yauzl": "^2.4.2"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "3.9.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+          "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+          "dev": true
+        },
+        "get-stream": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+          "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "download": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
+      "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
+      "dev": true,
+      "requires": {
+        "archive-type": "^4.0.0",
+        "caw": "^2.0.1",
+        "content-disposition": "^0.5.2",
+        "decompress": "^4.2.0",
+        "ext-name": "^5.0.0",
+        "file-type": "^8.1.0",
+        "filenamify": "^2.0.0",
+        "get-stream": "^3.0.0",
+        "got": "^8.3.1",
+        "make-dir": "^1.2.0",
+        "p-event": "^2.1.0",
+        "pify": "^3.0.0"
+      }
+    },
+    "download-git-repo": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-3.0.2.tgz",
+      "integrity": "sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==",
+      "dev": true,
+      "requires": {
+        "download": "^7.1.0",
+        "git-clone": "^0.1.0",
+        "rimraf": "^3.0.0"
+      }
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "dev": true
+    },
+    "echarts": {
+      "version": "file:../../echarts",
+      "requires": {
+        "tslib": "2.0.3",
+        "zrender": "5.0.1"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/core": {
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz",
+          "integrity": "sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.3.4",
+            "@babel/helpers": "^7.2.0",
+            "@babel/parser": "^7.3.4",
+            "@babel/template": "^7.2.2",
+            "@babel/traverse": "^7.3.4",
+            "@babel/types": "^7.3.4",
+            "convert-source-map": "^1.1.0",
+            "debug": "^4.1.0",
+            "json5": "^2.1.0",
+            "lodash": "^4.17.11",
+            "resolve": "^1.3.2",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.11.6",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz",
+          "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==",
+          "requires": {
+            "jsesc": "^2.5.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+          "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.10.4",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+          "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-member-expression-to-functions": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+          "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ=="
+        },
+        "@babel/helper-module-imports": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
+          "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA=="
+        },
+        "@babel/helper-module-transforms": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+          "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+          "requires": {
+            "@babel/helper-module-imports": "^7.12.1",
+            "@babel/helper-replace-supers": "^7.12.1",
+            "@babel/helper-simple-access": "^7.12.1",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "@babel/template": "^7.10.4",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/helper-optimise-call-expression": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+          "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+        },
+        "@babel/helper-replace-supers": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
+          "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+          "requires": {
+            "@babel/helper-member-expression-to-functions": "^7.12.1",
+            "@babel/helper-optimise-call-expression": "^7.10.4"
+          }
+        },
+        "@babel/helper-simple-access": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+          "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA=="
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg=="
+        },
+        "@babel/helper-validator-identifier": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+        },
+        "@babel/helpers": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+          "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+          "requires": {
+            "@babel/template": "^7.10.4",
+            "@babel/traverse": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+          "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q=="
+        },
+        "@babel/plugin-syntax-async-generators": {
+          "version": "7.8.4",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+          "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-bigint": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+          "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-class-properties": {
+          "version": "7.12.1",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
+          "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4"
+          }
+        },
+        "@babel/plugin-syntax-import-meta": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+          "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4"
+          }
+        },
+        "@babel/plugin-syntax-json-strings": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+          "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-logical-assignment-operators": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+          "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4"
+          }
+        },
+        "@babel/plugin-syntax-nullish-coalescing-operator": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+          "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-numeric-separator": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+          "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4"
+          }
+        },
+        "@babel/plugin-syntax-object-rest-spread": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+          "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-optional-catch-binding": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+          "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/plugin-syntax-optional-chaining": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+          "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.8.0"
+          }
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz",
+          "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.11.5",
+            "@babel/helper-function-name": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/parser": "^7.11.5",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.19"
+          }
+        },
+        "@babel/types": {
+          "version": "7.10.5",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz",
+          "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "lodash": "^4.17.19",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "@bcoe/v8-coverage": {
+          "version": "0.2.3",
+          "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+          "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+        },
+        "@cnakazawa/watch": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+          "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+          "requires": {
+            "exec-sh": "^0.3.2",
+            "minimist": "^1.2.0"
+          }
+        },
+        "@definitelytyped/header-parser": {
+          "version": "0.0.59",
+          "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.59.tgz",
+          "integrity": "sha512-Y0Hoi+I0tD1xRNYUlt9dpZ2sykPoNAsS/nVtyaGJDYhVg0Q3U4U8afAOFlK3Fro2MfdM+1Kxc7DeaabaUeFmYw==",
+          "requires": {
+            "@types/parsimmon": "^1.10.1",
+            "parsimmon": "^1.13.0"
+          }
+        },
+        "@definitelytyped/typescript-versions": {
+          "version": "0.0.64",
+          "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.64.tgz",
+          "integrity": "sha512-h+RvQPzvC/yVtZ/FqttXoIac/X1htXrmuNbvmQP+RiVonGunKq7S8ona5tm7ckiheur6VvtKQGe+zQIDF3sErQ=="
+        },
+        "@definitelytyped/utils": {
+          "version": "0.0.64",
+          "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.64.tgz",
+          "integrity": "sha512-ahxruUzplmVwWnJavaRcj8JN4B6znkYjmSTGyWSzgc+aL596nVZGyVRDlOL5mKSnJk1MzT4Uj4Gx0bg3l6CPHw==",
+          "requires": {
+            "@definitelytyped/typescript-versions": "^0.0.64",
+            "charm": "^1.0.2",
+            "fstream": "^1.0.12",
+            "npm-registry-client": "^8.6.0",
+            "tar-stream": "^2.1.4"
+          }
+        },
+        "@eslint/eslintrc": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
+          "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
+          "requires": {
+            "ajv": "^6.12.4",
+            "debug": "^4.1.1",
+            "espree": "^7.3.0",
+            "import-fresh": "^3.2.1",
+            "js-yaml": "^3.13.1",
+            "lodash": "^4.17.19",
+            "minimatch": "^3.0.4"
+          }
+        },
+        "@istanbuljs/load-nyc-config": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+          "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+          "requires": {
+            "camelcase": "^5.3.1",
+            "find-up": "^4.1.0",
+            "get-package-type": "^0.1.0",
+            "js-yaml": "^3.13.1"
+          }
+        },
+        "@istanbuljs/schema": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+          "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw=="
+        },
+        "@jest/console": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz",
+          "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "jest-message-util": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "slash": "^3.0.0"
+          }
+        },
+        "@jest/core": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz",
+          "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==",
+          "requires": {
+            "@jest/console": "^26.6.1",
+            "@jest/reporters": "^26.6.1",
+            "@jest/test-result": "^26.6.1",
+            "@jest/transform": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "jest-changed-files": "^26.6.1",
+            "jest-config": "^26.6.1",
+            "jest-haste-map": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-regex-util": "^26.0.0",
+            "jest-resolve": "^26.6.1",
+            "jest-resolve-dependencies": "^26.6.1",
+            "jest-runner": "^26.6.1",
+            "jest-runtime": "^26.6.1",
+            "jest-snapshot": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "jest-validate": "^26.6.1",
+            "jest-watcher": "^26.6.1",
+            "micromatch": "^4.0.2",
+            "p-each-series": "^2.1.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "@jest/create-cache-key-function": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.5.0.tgz",
+          "integrity": "sha512-DJ+pEBUIqarrbv1W/C39f9YH0rJ4wsXZ/VC6JafJPlHW2HOucKceeaqTOQj9MEDQZjySxMLkOq5mfXZXNZcmWw=="
+        },
+        "@jest/environment": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz",
+          "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==",
+          "requires": {
+            "@jest/fake-timers": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "jest-mock": "^26.6.1"
+          }
+        },
+        "@jest/fake-timers": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz",
+          "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "@sinonjs/fake-timers": "^6.0.1",
+            "@types/node": "*",
+            "jest-message-util": "^26.6.1",
+            "jest-mock": "^26.6.1",
+            "jest-util": "^26.6.1"
+          }
+        },
+        "@jest/globals": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz",
+          "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==",
+          "requires": {
+            "@jest/environment": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "expect": "^26.6.1"
+          }
+        },
+        "@jest/reporters": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz",
+          "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==",
+          "requires": {
+            "@bcoe/v8-coverage": "^0.2.3",
+            "@jest/console": "^26.6.1",
+            "@jest/test-result": "^26.6.1",
+            "@jest/transform": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "collect-v8-coverage": "^1.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "istanbul-lib-coverage": "^3.0.0",
+            "istanbul-lib-instrument": "^4.0.3",
+            "istanbul-lib-report": "^3.0.0",
+            "istanbul-lib-source-maps": "^4.0.0",
+            "istanbul-reports": "^3.0.2",
+            "jest-haste-map": "^26.6.1",
+            "jest-resolve": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "jest-worker": "^26.6.1",
+            "node-notifier": "^8.0.0",
+            "slash": "^3.0.0",
+            "string-length": "^4.0.1",
+            "terminal-link": "^2.0.0",
+            "v8-to-istanbul": "^6.0.1"
+          }
+        },
+        "@jest/source-map": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz",
+          "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==",
+          "requires": {
+            "callsites": "^3.0.0",
+            "graceful-fs": "^4.2.4"
+          }
+        },
+        "@jest/test-result": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz",
+          "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==",
+          "requires": {
+            "@jest/console": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "collect-v8-coverage": "^1.0.0"
+          }
+        },
+        "@jest/test-sequencer": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz",
+          "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==",
+          "requires": {
+            "@jest/test-result": "^26.6.1",
+            "graceful-fs": "^4.2.4",
+            "jest-haste-map": "^26.6.1",
+            "jest-runner": "^26.6.1",
+            "jest-runtime": "^26.6.1"
+          }
+        },
+        "@jest/transform": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz",
+          "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==",
+          "requires": {
+            "@babel/core": "^7.1.0",
+            "@jest/types": "^26.6.1",
+            "babel-plugin-istanbul": "^6.0.0",
+            "convert-source-map": "^1.4.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "graceful-fs": "^4.2.4",
+            "jest-haste-map": "^26.6.1",
+            "jest-regex-util": "^26.0.0",
+            "jest-util": "^26.6.1",
+            "micromatch": "^4.0.2",
+            "pirates": "^4.0.1",
+            "slash": "^3.0.0",
+            "write-file-atomic": "^3.0.0"
+          }
+        },
+        "@jest/types": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz",
+          "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==",
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0"
+          }
+        },
+        "@lang/rollup-plugin-dts": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/@lang/rollup-plugin-dts/-/rollup-plugin-dts-2.0.2.tgz",
+          "integrity": "sha512-2tVwALesC1o6MpnM9GYHrasV5d0sa5ICaJPhJQXvsnAr7N11W7f8vgSpS8/blOW26Mxdxv90kIUv92j3HP7Ziw==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "magic-string": "^0.25.7"
+          }
+        },
+        "@microsoft/api-extractor": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.7.2.tgz",
+          "integrity": "sha512-W75kcjWlONyB9kQKYAfSMiG3v2JMGlgUihny8PucZqdRatcYADeQiEcX5qE5sWdNRHD/J+5INiwlooZDd82sDQ==",
+          "requires": {
+            "@microsoft/api-extractor-model": "7.7.2",
+            "@microsoft/node-core-library": "3.18.2",
+            "@microsoft/ts-command-line": "4.3.7",
+            "@microsoft/tsdoc": "0.12.14",
+            "colors": "~1.2.1",
+            "lodash": "~4.17.15"
+          }
+        },
+        "@microsoft/api-extractor-model": {
+          "version": "7.7.2",
+          "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.7.2.tgz",
+          "integrity": "sha512-USwWUPV3YLS8ZOS11vFh3nzEWXC2d8OZJ6CGp0nRnCXtbqmKqAq4Jg9J5gs1PCemo7JQEbzbHGGwycC0DbRJqw==",
+          "requires": {
+            "@microsoft/node-core-library": "3.18.2",
+            "@microsoft/tsdoc": "0.12.14"
+          }
+        },
+        "@microsoft/node-core-library": {
+          "version": "3.18.2",
+          "resolved": "https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.18.2.tgz",
+          "integrity": "sha512-IRoRmLwNvrR0rTNavYlfNObz9pr4Epo8Hd//0SNptt7adOySd735ur7YBO7SzafeijHsD3/dC4PXLLwhIsMU7Q==",
+          "requires": {
+            "@types/node": "8.10.54",
+            "colors": "~1.2.1",
+            "jju": "~1.4.0",
+            "timsort": "~0.3.0",
+            "z-schema": "~3.18.3"
+          }
+        },
+        "@microsoft/ts-command-line": {
+          "version": "4.3.7",
+          "resolved": "https://registry.npmjs.org/@microsoft/ts-command-line/-/ts-command-line-4.3.7.tgz",
+          "integrity": "sha512-dl7j5E4Ly4vin0dFRNyDEmslpqLTeFkSvWi1Ux2OhTXbORpaRm2qivTQzUgbPSh8Mtc1LSZGekqEMNl0e0OMNw==",
+          "requires": {
+            "@types/argparse": "1.0.33",
+            "argparse": "~1.0.9",
+            "colors": "~1.2.1"
+          }
+        },
+        "@microsoft/tsdoc": {
+          "version": "0.12.14",
+          "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz",
+          "integrity": "sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q=="
+        },
+        "@nodelib/fs.scandir": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+          "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+          "requires": {
+            "@nodelib/fs.stat": "2.0.3",
+            "run-parallel": "^1.1.9"
+          }
+        },
+        "@nodelib/fs.stat": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+          "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
+        },
+        "@nodelib/fs.walk": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+          "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+          "requires": {
+            "@nodelib/fs.scandir": "2.1.3",
+            "fastq": "^1.6.0"
+          }
+        },
+        "@rollup/plugin-commonjs": {
+          "version": "17.0.0",
+          "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.0.0.tgz",
+          "integrity": "sha512-/omBIJG1nHQc+bgkYDuLpb/V08QyutP9amOrJRUSlYJZP+b/68gM//D8sxJe3Yry2QnYIr3QjR3x4AlxJEN3GA==",
+          "requires": {
+            "@rollup/pluginutils": "^3.1.0",
+            "commondir": "^1.0.1",
+            "is-reference": "^1.2.1",
+            "magic-string": "^0.25.7",
+            "resolve": "^1.17.0"
+          }
+        },
+        "@rollup/plugin-node-resolve": {
+          "version": "11.0.1",
+          "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.0.1.tgz",
+          "integrity": "sha512-ltlsj/4Bhwwhb+Nb5xCz/6vieuEj2/BAkkqVIKmZwC7pIdl8srmgmglE4S0jFlZa32K4qvdQ6NHdmpRKD/LwoQ==",
+          "requires": {
+            "@rollup/pluginutils": "^3.1.0",
+            "@types/resolve": "1.17.1",
+            "deepmerge": "^4.2.2",
+            "is-module": "^1.0.0"
+          }
+        },
+        "@rollup/plugin-replace": {
+          "version": "2.3.4",
+          "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.4.tgz",
+          "integrity": "sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ==",
+          "requires": {
+            "@rollup/pluginutils": "^3.1.0",
+            "magic-string": "^0.25.7"
+          }
+        },
+        "@rollup/pluginutils": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+          "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+          "requires": {
+            "@types/estree": "0.0.39",
+            "picomatch": "^2.2.2"
+          }
+        },
+        "@sinonjs/commons": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
+          "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
+          "requires": {
+            "type-detect": "4.0.8"
+          }
+        },
+        "@sinonjs/fake-timers": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
+          "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+          "requires": {
+            "@sinonjs/commons": "^1.7.0"
+          }
+        },
+        "@types/argparse": {
+          "version": "1.0.33",
+          "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz",
+          "integrity": "sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ=="
+        },
+        "@types/babel__core": {
+          "version": "7.1.10",
+          "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz",
+          "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==",
+          "requires": {
+            "@babel/parser": "^7.1.0",
+            "@babel/types": "^7.0.0",
+            "@types/babel__generator": "*",
+            "@types/babel__template": "*",
+            "@types/babel__traverse": "*"
+          }
+        },
+        "@types/babel__generator": {
+          "version": "7.6.2",
+          "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
+          "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@types/babel__template": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz",
+          "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==",
+          "requires": {
+            "@babel/parser": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@types/babel__traverse": {
+          "version": "7.0.15",
+          "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz",
+          "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==",
+          "requires": {
+            "@babel/types": "^7.3.0"
+          }
+        },
+        "@types/estree": {
+          "version": "0.0.39",
+          "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+          "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+        },
+        "@types/graceful-fs": {
+          "version": "4.1.4",
+          "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",
+          "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==",
+          "requires": {
+            "@types/node": "*"
+          }
+        },
+        "@types/istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+        },
+        "@types/istanbul-lib-report": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+          "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+          "requires": {
+            "@types/istanbul-lib-coverage": "*"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "@types/jest": {
+          "version": "26.0.15",
+          "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz",
+          "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==",
+          "requires": {
+            "jest-diff": "^26.0.0",
+            "pretty-format": "^26.0.0"
+          }
+        },
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw=="
+        },
+        "@types/node": {
+          "version": "8.10.54",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz",
+          "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg=="
+        },
+        "@types/normalize-package-data": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+          "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+        },
+        "@types/parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+        },
+        "@types/parsimmon": {
+          "version": "1.10.4",
+          "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.4.tgz",
+          "integrity": "sha512-M56NfQHfaWuaj6daSgCVs7jh8fXLI3LmxjRoQxmOvYesgIkI+9HPsDLO0vd7wX7cwA0D0ZWFEJdp0VPwLdS+bQ=="
+        },
+        "@types/prettier": {
+          "version": "2.1.5",
+          "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz",
+          "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ=="
+        },
+        "@types/resolve": {
+          "version": "1.17.1",
+          "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+          "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+          "requires": {
+            "@types/node": "*"
+          }
+        },
+        "@types/stack-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
+          "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw=="
+        },
+        "@types/yargs": {
+          "version": "15.0.9",
+          "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz",
+          "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==",
+          "requires": {
+            "@types/yargs-parser": "*"
+          }
+        },
+        "@types/yargs-parser": {
+          "version": "15.0.0",
+          "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
+          "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
+        },
+        "@typescript-eslint/eslint-plugin": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz",
+          "integrity": "sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw==",
+          "requires": {
+            "@typescript-eslint/experimental-utils": "4.11.1",
+            "@typescript-eslint/scope-manager": "4.11.1",
+            "debug": "^4.1.1",
+            "functional-red-black-tree": "^1.0.1",
+            "regexpp": "^3.0.0",
+            "tsutils": "^3.17.1"
+          }
+        },
+        "@typescript-eslint/experimental-utils": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz",
+          "integrity": "sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g==",
+          "requires": {
+            "@types/json-schema": "^7.0.3",
+            "@typescript-eslint/scope-manager": "4.11.1",
+            "@typescript-eslint/types": "4.11.1",
+            "@typescript-eslint/typescript-estree": "4.11.1",
+            "eslint-scope": "^5.0.0",
+            "eslint-utils": "^2.0.0"
+          }
+        },
+        "@typescript-eslint/parser": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.11.1.tgz",
+          "integrity": "sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw==",
+          "requires": {
+            "@typescript-eslint/scope-manager": "4.11.1",
+            "@typescript-eslint/types": "4.11.1",
+            "@typescript-eslint/typescript-estree": "4.11.1",
+            "debug": "^4.1.1"
+          }
+        },
+        "@typescript-eslint/scope-manager": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz",
+          "integrity": "sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ==",
+          "requires": {
+            "@typescript-eslint/types": "4.11.1",
+            "@typescript-eslint/visitor-keys": "4.11.1"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.11.1.tgz",
+          "integrity": "sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA=="
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz",
+          "integrity": "sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw==",
+          "requires": {
+            "@typescript-eslint/types": "4.11.1",
+            "@typescript-eslint/visitor-keys": "4.11.1",
+            "debug": "^4.1.1",
+            "is-glob": "^4.0.1",
+            "lodash": "^4.17.15",
+            "tsutils": "^3.17.1"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "4.11.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz",
+          "integrity": "sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg==",
+          "requires": {
+            "@typescript-eslint/types": "4.11.1",
+            "eslint-visitor-keys": "^2.0.0"
+          }
+        },
+        "abab": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+          "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
+        },
+        "abbrev": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+          "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+        },
+        "accepts": {
+          "version": "1.3.7",
+          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+          "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+          "requires": {
+            "mime-types": "~2.1.24",
+            "negotiator": "0.6.2"
+          }
+        },
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+        },
+        "acorn-globals": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+          "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+          "requires": {
+            "acorn": "^7.1.1",
+            "acorn-walk": "^7.1.1"
+          }
+        },
+        "acorn-jsx": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+          "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
+        },
+        "acorn-walk": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+          "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+        },
+        "after": {
+          "version": "0.8.2",
+          "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+          "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
+        },
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "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"
+          }
+        },
+        "ansi-colors": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+          "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+          "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+        },
+        "are-we-there-yet": {
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+          "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "arr-flatten": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+          "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+        },
+        "arr-union": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+          "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+        },
+        "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=="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "arraybuffer.slice": {
+          "version": "0.0.7",
+          "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+          "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+        },
+        "asn1": {
+          "version": "0.2.4",
+          "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+          "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+          "requires": {
+            "safer-buffer": "~2.1.0"
+          }
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+        },
+        "assign-symbols": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+          "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+        },
+        "astral-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+        },
+        "async-limiter": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+          "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+          "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+        },
+        "atob": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+          "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+        },
+        "aws4": {
+          "version": "1.10.1",
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+          "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA=="
+        },
+        "babel-code-frame": {
+          "version": "6.26.0",
+          "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+          "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "babel-jest": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz",
+          "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==",
+          "requires": {
+            "@jest/transform": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/babel__core": "^7.1.7",
+            "babel-plugin-istanbul": "^6.0.0",
+            "babel-preset-jest": "^26.5.0",
+            "graceful-fs": "^4.2.4",
+            "slash": "^3.0.0"
+          }
+        },
+        "babel-plugin-istanbul": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+          "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.0.0",
+            "@istanbuljs/load-nyc-config": "^1.0.0",
+            "@istanbuljs/schema": "^0.1.2",
+            "istanbul-lib-instrument": "^4.0.0",
+            "test-exclude": "^6.0.0"
+          }
+        },
+        "babel-plugin-jest-hoist": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz",
+          "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==",
+          "requires": {
+            "@babel/template": "^7.3.3",
+            "@babel/types": "^7.3.3",
+            "@types/babel__core": "^7.0.0",
+            "@types/babel__traverse": "^7.0.6"
+          }
+        },
+        "babel-preset-current-node-syntax": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz",
+          "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==",
+          "requires": {
+            "@babel/plugin-syntax-async-generators": "^7.8.4",
+            "@babel/plugin-syntax-bigint": "^7.8.3",
+            "@babel/plugin-syntax-class-properties": "^7.8.3",
+            "@babel/plugin-syntax-import-meta": "^7.8.3",
+            "@babel/plugin-syntax-json-strings": "^7.8.3",
+            "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+            "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+            "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+            "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+            "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+            "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+          }
+        },
+        "babel-preset-jest": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz",
+          "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==",
+          "requires": {
+            "babel-plugin-jest-hoist": "^26.5.0",
+            "babel-preset-current-node-syntax": "^0.1.3"
+          }
+        },
+        "backo2": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+          "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+          "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+        },
+        "base": {
+          "version": "0.11.2",
+          "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+          "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+          "requires": {
+            "cache-base": "^1.0.1",
+            "class-utils": "^0.3.5",
+            "component-emitter": "^1.2.1",
+            "isobject": "^3.0.1",
+            "mixin-deep": "^1.2.0",
+            "pascalcase": "^0.1.1"
+          }
+        },
+        "base64-arraybuffer": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+          "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
+        },
+        "base64-js": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+          "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+        },
+        "base64id": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+          "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+          "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+          "requires": {
+            "tweetnacl": "^0.14.3"
+          }
+        },
+        "better-assert": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+          "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+          "requires": {
+            "callsite": "1.0.0"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+          "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
+        },
+        "bl": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
+          "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+          "requires": {
+            "buffer": "^5.5.0",
+            "inherits": "^2.0.4"
+          }
+        },
+        "blob": {
+          "version": "0.0.5",
+          "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+          "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
+        },
+        "block-stream": {
+          "version": "0.0.9",
+          "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+          "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+          "requires": {
+            "inherits": "~2.0.0"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "browser-process-hrtime": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+          "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+        },
+        "bs-logger": {
+          "version": "0.2.6",
+          "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+          "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+          "requires": {
+            "fast-json-stable-stringify": "2.x"
+          }
+        },
+        "bser": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+          "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+          "requires": {
+            "node-int64": "^0.4.0"
+          }
+        },
+        "buffer": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+          "requires": {
+            "base64-js": "^1.3.1",
+            "ieee754": "^1.1.13"
+          }
+        },
+        "buffer-from": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+          "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+        },
+        "builtin-modules": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+          "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+        },
+        "builtins": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+          "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+        },
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+        },
+        "cache-base": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+          "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+          "requires": {
+            "collection-visit": "^1.0.0",
+            "component-emitter": "^1.2.1",
+            "get-value": "^2.0.6",
+            "has-value": "^1.0.0",
+            "isobject": "^3.0.1",
+            "set-value": "^2.0.0",
+            "to-object-path": "^0.3.0",
+            "union-value": "^1.0.0",
+            "unset-value": "^1.0.0"
+          }
+        },
+        "callsite": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+          "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
+        },
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "canvas": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz",
+          "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==",
+          "requires": {
+            "nan": "^2.14.0",
+            "node-pre-gyp": "^0.11.0",
+            "simple-get": "^3.0.3"
+          }
+        },
+        "capture-exit": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+          "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+          "requires": {
+            "rsvp": "^4.8.4"
+          }
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+          "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="
+        },
+        "char-regex": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+          "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
+        },
+        "charm": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz",
+          "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=",
+          "requires": {
+            "inherits": "^2.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.4.3",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+          "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.5.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+        },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+        },
+        "cjs-module-lexer": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz",
+          "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ=="
+        },
+        "class-utils": {
+          "version": "0.3.6",
+          "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+          "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+          "requires": {
+            "arr-union": "^3.1.0",
+            "isobject": "^3.0.0",
+            "static-extend": "^0.1.1"
+          }
+        },
+        "cli": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
+          "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
+          "requires": {
+            "exit": "0.1.2"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "requires": {
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "co": {
+          "version": "4.6.0",
+          "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+          "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+        },
+        "collect-v8-coverage": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+          "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+        },
+        "collection-visit": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+          "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+          "requires": {
+            "map-visit": "^1.0.0",
+            "object-visit": "^1.0.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        },
+        "colors": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz",
+          "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg=="
+        },
+        "combined-stream": {
+          "version": "1.0.8",
+          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+          "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+          "requires": {
+            "delayed-stream": "~1.0.0"
+          }
+        },
+        "command-exists": {
+          "version": "1.2.9",
+          "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+          "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="
+        },
+        "commander": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+          "optional": true
+        },
+        "commondir": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+          "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+        },
+        "compare-versions": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+          "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+        },
+        "component-bind": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+          "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
+        },
+        "component-emitter": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+          "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+        },
+        "component-inherit": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+          "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+          "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+        },
+        "concat-stream": {
+          "version": "1.6.2",
+          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+          "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "inherits": "^2.0.3",
+            "readable-stream": "^2.2.2",
+            "typedarray": "^0.0.6"
+          }
+        },
+        "console-browserify": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+          "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+          "requires": {
+            "date-now": "^0.1.4"
+          }
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+        },
+        "content-disposition": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+          "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+        },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
+        "cookie": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+          "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+        },
+        "copy-descriptor": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+          "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+        },
+        "cosmiconfig": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+          "requires": {
+            "@types/parse-json": "^4.0.0",
+            "import-fresh": "^3.2.1",
+            "parse-json": "^5.0.0",
+            "path-type": "^4.0.0",
+            "yaml": "^1.10.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "cssfontparser": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz",
+          "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M="
+        },
+        "cssom": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+          "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+        },
+        "cssstyle": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+          "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+          "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+          "requires": {
+            "assert-plus": "^1.0.0"
+          }
+        },
+        "data-urls": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+          "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+          "requires": {
+            "abab": "^2.0.3",
+            "whatwg-mimetype": "^2.3.0",
+            "whatwg-url": "^8.0.0"
+          }
+        },
+        "date-now": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+          "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+        },
+        "debug": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+        },
+        "decimal.js": {
+          "version": "10.2.1",
+          "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
+          "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw=="
+        },
+        "decode-uri-component": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+          "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+        },
+        "decompress-response": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+          "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+          "requires": {
+            "mimic-response": "^2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+          "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+        },
+        "deep-is": {
+          "version": "0.1.3",
+          "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+          "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+        },
+        "deepmerge": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+          "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+        },
+        "define-property": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+          "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+          "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+          "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
+        },
+        "detect-newline": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+          "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
+        },
+        "diff": {
+          "version": "3.5.0",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+          "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+        },
+        "diff-sequences": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz",
+          "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q=="
+        },
+        "dir-glob": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+          "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+          "requires": {
+            "path-type": "^4.0.0"
+          }
+        },
+        "doctrine": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+          "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "domexception": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+          "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg=="
+        },
+        "domhandler": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+          "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
+          "requires": {
+            "domelementtype": "1"
+          }
+        },
+        "domutils": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+          "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "dts-critic": {
+          "version": "3.3.3",
+          "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.3.tgz",
+          "integrity": "sha512-Pd27sNICo8mUqZ7XBdefy/+eWG8uG02GaYgOv5DBpxiF+8hduojztVm4935dqocyDv/STdF1uh6a8WnAhBK7tQ==",
+          "requires": {
+            "command-exists": "^1.2.8",
+            "semver": "^6.2.0",
+            "yargs": "^15.3.1"
+          }
+        },
+        "dtslint": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.0.5.tgz",
+          "integrity": "sha512-gEf7tEQgdMQh38h29B2aVyJBGMb8l/5koVArmc4t3XyeCe0rbElpB0HjOZ6SgUOzvsI05hTOenY66aM9ji3afA==",
+          "requires": {
+            "json-stable-stringify": "^1.0.1",
+            "strip-json-comments": "^2.0.1",
+            "tslint": "5.14.0",
+            "yargs": "^15.1.0"
+          }
+        },
+        "ecc-jsbn": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+          "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+          "requires": {
+            "jsbn": "~0.1.0",
+            "safer-buffer": "^2.1.0"
+          }
+        },
+        "emittery": {
+          "version": "0.7.2",
+          "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz",
+          "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "end-of-stream": {
+          "version": "1.4.4",
+          "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+          "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+          "requires": {
+            "once": "^1.4.0"
+          }
+        },
+        "engine.io": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz",
+          "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==",
+          "requires": {
+            "accepts": "~1.3.4",
+            "base64id": "1.0.0",
+            "cookie": "0.3.1",
+            "engine.io-parser": "~2.1.0"
+          }
+        },
+        "engine.io-client": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz",
+          "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==",
+          "requires": {
+            "component-inherit": "0.0.3",
+            "engine.io-parser": "~2.1.1",
+            "has-cors": "1.1.0",
+            "indexof": "0.0.1",
+            "parseqs": "0.0.5",
+            "parseuri": "0.0.5",
+            "xmlhttprequest-ssl": "~1.5.4",
+            "yeast": "0.1.2"
+          }
+        },
+        "engine.io-parser": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
+          "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==",
+          "requires": {
+            "after": "0.8.2",
+            "arraybuffer.slice": "~0.0.7",
+            "base64-arraybuffer": "0.1.5",
+            "blob": "0.0.5",
+            "has-binary2": "~1.0.2"
+          }
+        },
+        "enquirer": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+          "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+          "requires": {
+            "ansi-colors": "^4.1.1"
+          }
+        },
+        "entities": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+          "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
+        },
+        "error-ex": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+          "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+          "requires": {
+            "is-arrayish": "^0.2.1"
+          }
+        },
+        "esbuild": {
+          "version": "0.8.29",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.29.tgz",
+          "integrity": "sha512-UDsEoeXuctVgG2hEts1Hwq2jYDGqV7nksEHEZaiCy2v+lXF5ButX4ErPAJAFi5ZNKKW+6Pom93pArV7hki6HnQ=="
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+        },
+        "escodegen": {
+          "version": "1.14.3",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+          "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+          "requires": {
+            "esprima": "^4.0.1",
+            "estraverse": "^4.2.0",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1"
+          }
+        },
+        "eslint": {
+          "version": "7.17.0",
+          "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz",
+          "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@eslint/eslintrc": "^0.2.2",
+            "ajv": "^6.10.0",
+            "debug": "^4.0.1",
+            "doctrine": "^3.0.0",
+            "enquirer": "^2.3.5",
+            "eslint-scope": "^5.1.1",
+            "eslint-utils": "^2.1.0",
+            "eslint-visitor-keys": "^2.0.0",
+            "espree": "^7.3.1",
+            "esquery": "^1.2.0",
+            "esutils": "^2.0.2",
+            "file-entry-cache": "^6.0.0",
+            "functional-red-black-tree": "^1.0.1",
+            "glob-parent": "^5.0.0",
+            "import-fresh": "^3.0.0",
+            "imurmurhash": "^0.1.4",
+            "is-glob": "^4.0.0",
+            "js-yaml": "^3.13.1",
+            "json-stable-stringify-without-jsonify": "^1.0.1",
+            "lodash": "^4.17.19",
+            "minimatch": "^3.0.4",
+            "natural-compare": "^1.4.0",
+            "progress": "^2.0.0",
+            "regexpp": "^3.1.0",
+            "table": "^6.0.4",
+            "text-table": "^0.2.0",
+            "v8-compile-cache": "^2.0.3"
+          }
+        },
+        "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==",
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg=="
+        },
+        "eslint-visitor-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+          "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
+        },
+        "espree": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+          "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+          "requires": {
+            "acorn": "^7.4.0",
+            "acorn-jsx": "^5.3.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=="
+        },
+        "esquery": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+          "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ=="
+        },
+        "esrecurse": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+          "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="
+        },
+        "estraverse": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+        },
+        "esutils": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+          "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+        },
+        "exec-sh": {
+          "version": "0.3.4",
+          "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
+          "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A=="
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "exit": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+          "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "requires": {
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "expect": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz",
+          "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "jest-matcher-utils": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-regex-util": "^26.0.0"
+          }
+        },
+        "extend": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+        },
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0"
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "requires": {
+            "array-unique": "^0.3.2",
+            "expand-brackets": "^2.1.4",
+            "fragment-cache": "^0.2.1",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "extsprintf": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+          "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+        },
+        "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=="
+        },
+        "fast-glob": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+          "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.0",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.2",
+            "picomatch": "^2.2.1"
+          }
+        },
+        "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=="
+        },
+        "fast-levenshtein": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+        },
+        "fast-url-parser": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
+          "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0="
+        },
+        "fastq": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+          "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+          "requires": {
+            "reusify": "^1.0.4"
+          }
+        },
+        "fb-watchman": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+          "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+          "requires": {
+            "bser": "2.1.1"
+          }
+        },
+        "file-entry-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+          "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+          "requires": {
+            "flat-cache": "^3.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==",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "find-versions": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+          "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+          "requires": {
+            "semver-regex": "^2.0.0"
+          }
+        },
+        "flat-cache": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+          "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+          "requires": {
+            "flatted": "^3.1.0"
+          }
+        },
+        "flatted": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+          "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA=="
+        },
+        "for-in": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+          "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+          "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "fragment-cache": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+          "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+          "requires": {
+            "map-cache": "^0.2.2"
+          }
+        },
+        "fs-constants": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+          "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+        },
+        "fs-extra": {
+          "version": "0.26.7",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
+          "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "klaw": "^1.0.0",
+            "path-is-absolute": "^1.0.0",
+            "rimraf": "^2.2.8"
+          }
+        },
+        "fs-minipass": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "requires": {
+            "minipass": "^2.6.0"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "optional": true
+        },
+        "fstream": {
+          "version": "1.0.12",
+          "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+          "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "inherits": "~2.0.0",
+            "mkdirp": ">=0.5 0",
+            "rimraf": "2"
+          }
+        },
+        "function-bind": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+          "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+        },
+        "functional-red-black-tree": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+          "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+          "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "gensync": {
+          "version": "1.0.0-beta.1",
+          "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+          "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+        },
+        "get-package-type": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+          "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "get-value": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+          "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+          "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+          "requires": {
+            "assert-plus": "^1.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz",
+          "integrity": "sha1-OyCjV//89GuzhK7W+K6aZH/basQ=",
+          "requires": {
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "globals": {
+          "version": "11.12.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+        },
+        "globby": {
+          "version": "11.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
+          "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.1.1",
+            "ignore": "^5.1.4",
+            "merge2": "^1.3.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+        },
+        "growly": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+          "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+          "optional": true
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+        },
+        "har-validator": {
+          "version": "5.1.5",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+          "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+          "requires": {
+            "ajv": "^6.12.3",
+            "har-schema": "^2.0.0"
+          }
+        },
+        "has": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+          "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+          "requires": {
+            "function-bind": "^1.1.1"
+          }
+        },
+        "has-ansi": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+          "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "has-binary2": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+          "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw=="
+        },
+        "has-cors": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+          "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+        },
+        "has-value": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+          "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+          "requires": {
+            "get-value": "^2.0.6",
+            "has-values": "^1.0.0",
+            "isobject": "^3.0.0"
+          }
+        },
+        "has-values": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+          "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8="
+        },
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+        },
+        "html-encoding-sniffer": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+          "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+          "requires": {
+            "whatwg-encoding": "^1.0.5"
+          }
+        },
+        "html-escaper": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+          "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+        },
+        "htmlparser2": {
+          "version": "3.8.3",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+          "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
+          "requires": {
+            "domelementtype": "1",
+            "domhandler": "2.3",
+            "domutils": "1.5",
+            "entities": "1.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+        },
+        "husky": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
+          "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
+          "requires": {
+            "ci-info": "^2.0.0",
+            "compare-versions": "^3.6.0",
+            "cosmiconfig": "^7.0.0",
+            "find-versions": "^3.2.0",
+            "opencollective-postinstall": "^2.0.2",
+            "pkg-dir": "^4.2.0",
+            "please-upgrade-node": "^3.2.0",
+            "slash": "^3.0.0",
+            "which-pm-runs": "^1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ieee754": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+          "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+        },
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+        },
+        "ignore-walk": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
+          "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "import-fresh": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "import-local": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+          "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+          "requires": {
+            "pkg-dir": "^4.2.0",
+            "resolve-cwd": "^3.0.0"
+          }
+        },
+        "imurmurhash": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+          "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+        },
+        "indexof": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+          "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+          "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+        },
+        "ini": {
+          "version": "1.3.5",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+          "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+        },
+        "ip-regex": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+          "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="
+        },
+        "is-arrayish": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+        },
+        "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==",
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-buffer": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+          "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "is-core-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
+          "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
+          "requires": {
+            "has": "^1.0.3"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4"
+          }
+        },
+        "is-docker": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+          "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw=="
+        },
+        "is-extendable": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "is-generator-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+          "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-module": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+          "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        },
+        "is-potential-custom-element-name": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+          "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c="
+        },
+        "is-reference": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+          "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+          "requires": {
+            "@types/estree": "*"
+          }
+        },
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+        },
+        "is-windows": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+          "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+        },
+        "is-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        },
+        "isexe": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+          "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+        },
+        "istanbul-lib-coverage": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+          "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg=="
+        },
+        "istanbul-lib-instrument": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+          "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+          "requires": {
+            "@istanbuljs/schema": "^0.1.2",
+            "istanbul-lib-coverage": "^3.0.0",
+            "semver": "^6.3.0"
+          }
+        },
+        "istanbul-lib-report": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+          "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+          "requires": {
+            "istanbul-lib-coverage": "^3.0.0",
+            "make-dir": "^3.0.0"
+          }
+        },
+        "istanbul-lib-source-maps": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+          "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+          "requires": {
+            "debug": "^4.1.1",
+            "istanbul-lib-coverage": "^3.0.0"
+          }
+        },
+        "istanbul-reports": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+          "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+          "requires": {
+            "html-escaper": "^2.0.0",
+            "istanbul-lib-report": "^3.0.0"
+          }
+        },
+        "jest": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz",
+          "integrity": "sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA==",
+          "requires": {
+            "@jest/core": "^26.6.1",
+            "import-local": "^3.0.2"
+          }
+        },
+        "jest-canvas-mock": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.0.tgz",
+          "integrity": "sha512-3TMyR66VG2MzAW8Negzec03bbcIjVJMfGNvKzrEnbws1CYKqMNkvIJ8LbkoGYfp42tKqDmhIpQq3v+MNLW2A2w==",
+          "requires": {
+            "cssfontparser": "^1.2.1",
+            "moo-color": "^1.0.2"
+          }
+        },
+        "jest-changed-files": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz",
+          "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "throat": "^5.0.0"
+          }
+        },
+        "jest-config": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz",
+          "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==",
+          "requires": {
+            "@babel/core": "^7.1.0",
+            "@jest/test-sequencer": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "babel-jest": "^26.6.1",
+            "deepmerge": "^4.2.2",
+            "graceful-fs": "^4.2.4",
+            "jest-environment-jsdom": "^26.6.1",
+            "jest-environment-node": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "jest-jasmine2": "^26.6.1",
+            "jest-regex-util": "^26.0.0",
+            "jest-resolve": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "jest-validate": "^26.6.1",
+            "micromatch": "^4.0.2",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-diff": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz",
+          "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==",
+          "requires": {
+            "diff-sequences": "^26.5.0",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-docblock": {
+          "version": "26.0.0",
+          "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
+          "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
+          "requires": {
+            "detect-newline": "^3.0.0"
+          }
+        },
+        "jest-each": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz",
+          "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "jest-util": "^26.6.1",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-environment-jsdom": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz",
+          "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==",
+          "requires": {
+            "@jest/environment": "^26.6.1",
+            "@jest/fake-timers": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "jest-mock": "^26.6.1",
+            "jest-util": "^26.6.1"
+          }
+        },
+        "jest-environment-node": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz",
+          "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==",
+          "requires": {
+            "@jest/environment": "^26.6.1",
+            "@jest/fake-timers": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "jest-mock": "^26.6.1",
+            "jest-util": "^26.6.1"
+          }
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig=="
+        },
+        "jest-haste-map": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz",
+          "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "@types/graceful-fs": "^4.1.2",
+            "@types/node": "*",
+            "anymatch": "^3.0.3",
+            "fb-watchman": "^2.0.0",
+            "fsevents": "^2.1.2",
+            "graceful-fs": "^4.2.4",
+            "jest-regex-util": "^26.0.0",
+            "jest-serializer": "^26.5.0",
+            "jest-util": "^26.6.1",
+            "jest-worker": "^26.6.1",
+            "micromatch": "^4.0.2",
+            "sane": "^4.0.3",
+            "walker": "^1.0.7"
+          }
+        },
+        "jest-jasmine2": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz",
+          "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==",
+          "requires": {
+            "@babel/traverse": "^7.1.0",
+            "@jest/environment": "^26.6.1",
+            "@jest/source-map": "^26.5.0",
+            "@jest/test-result": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "co": "^4.6.0",
+            "expect": "^26.6.1",
+            "is-generator-fn": "^2.0.0",
+            "jest-each": "^26.6.1",
+            "jest-matcher-utils": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-runtime": "^26.6.1",
+            "jest-snapshot": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "pretty-format": "^26.6.1",
+            "throat": "^5.0.0"
+          }
+        },
+        "jest-leak-detector": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz",
+          "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==",
+          "requires": {
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-matcher-utils": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz",
+          "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==",
+          "requires": {
+            "jest-diff": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-message-util": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz",
+          "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@jest/types": "^26.6.1",
+            "@types/stack-utils": "^2.0.0",
+            "graceful-fs": "^4.2.4",
+            "micromatch": "^4.0.2",
+            "slash": "^3.0.0",
+            "stack-utils": "^2.0.2"
+          }
+        },
+        "jest-mock": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz",
+          "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "@types/node": "*"
+          }
+        },
+        "jest-pnp-resolver": {
+          "version": "1.2.2",
+          "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+          "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w=="
+        },
+        "jest-regex-util": {
+          "version": "26.0.0",
+          "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
+          "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A=="
+        },
+        "jest-resolve": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz",
+          "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "graceful-fs": "^4.2.4",
+            "jest-pnp-resolver": "^1.2.2",
+            "jest-util": "^26.6.1",
+            "read-pkg-up": "^7.0.1",
+            "slash": "^3.0.0"
+          }
+        },
+        "jest-resolve-dependencies": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz",
+          "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "jest-regex-util": "^26.0.0",
+            "jest-snapshot": "^26.6.1"
+          }
+        },
+        "jest-runner": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz",
+          "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==",
+          "requires": {
+            "@jest/console": "^26.6.1",
+            "@jest/environment": "^26.6.1",
+            "@jest/test-result": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "emittery": "^0.7.1",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "jest-config": "^26.6.1",
+            "jest-docblock": "^26.0.0",
+            "jest-haste-map": "^26.6.1",
+            "jest-leak-detector": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-resolve": "^26.6.1",
+            "jest-runtime": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "jest-worker": "^26.6.1",
+            "source-map-support": "^0.5.6",
+            "throat": "^5.0.0"
+          }
+        },
+        "jest-runtime": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz",
+          "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==",
+          "requires": {
+            "@jest/console": "^26.6.1",
+            "@jest/environment": "^26.6.1",
+            "@jest/fake-timers": "^26.6.1",
+            "@jest/globals": "^26.6.1",
+            "@jest/source-map": "^26.5.0",
+            "@jest/test-result": "^26.6.1",
+            "@jest/transform": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/yargs": "^15.0.0",
+            "cjs-module-lexer": "^0.4.2",
+            "collect-v8-coverage": "^1.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "jest-config": "^26.6.1",
+            "jest-haste-map": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-mock": "^26.6.1",
+            "jest-regex-util": "^26.0.0",
+            "jest-resolve": "^26.6.1",
+            "jest-snapshot": "^26.6.1",
+            "jest-util": "^26.6.1",
+            "jest-validate": "^26.6.1",
+            "slash": "^3.0.0",
+            "strip-bom": "^4.0.0",
+            "yargs": "^15.4.1"
+          }
+        },
+        "jest-serializer": {
+          "version": "26.5.0",
+          "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz",
+          "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==",
+          "requires": {
+            "@types/node": "*",
+            "graceful-fs": "^4.2.4"
+          }
+        },
+        "jest-snapshot": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz",
+          "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==",
+          "requires": {
+            "@babel/types": "^7.0.0",
+            "@jest/types": "^26.6.1",
+            "@types/babel__traverse": "^7.0.4",
+            "@types/prettier": "^2.0.0",
+            "expect": "^26.6.1",
+            "graceful-fs": "^4.2.4",
+            "jest-diff": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "jest-haste-map": "^26.6.1",
+            "jest-matcher-utils": "^26.6.1",
+            "jest-message-util": "^26.6.1",
+            "jest-resolve": "^26.6.1",
+            "natural-compare": "^1.4.0",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-util": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz",
+          "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "graceful-fs": "^4.2.4",
+            "is-ci": "^2.0.0",
+            "micromatch": "^4.0.2"
+          }
+        },
+        "jest-validate": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz",
+          "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "jest-get-type": "^26.3.0",
+            "leven": "^3.1.0",
+            "pretty-format": "^26.6.1"
+          }
+        },
+        "jest-watcher": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz",
+          "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==",
+          "requires": {
+            "@jest/test-result": "^26.6.1",
+            "@jest/types": "^26.6.1",
+            "@types/node": "*",
+            "jest-util": "^26.6.1",
+            "string-length": "^4.0.1"
+          }
+        },
+        "jest-worker": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz",
+          "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==",
+          "requires": {
+            "@types/node": "*",
+            "merge-stream": "^2.0.0"
+          }
+        },
+        "jju": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+          "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo="
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+        },
+        "js-yaml": {
+          "version": "3.14.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+          "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+          "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+        },
+        "jshint": {
+          "version": "2.10.2",
+          "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz",
+          "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==",
+          "requires": {
+            "cli": "~1.0.0",
+            "console-browserify": "1.1.x",
+            "exit": "0.1.x",
+            "htmlparser2": "3.8.x",
+            "lodash": "~4.17.11",
+            "minimatch": "~3.0.2",
+            "shelljs": "0.3.x"
+          }
+        },
+        "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=="
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+          "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+        },
+        "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=="
+        },
+        "json-stable-stringify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+          "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+          "requires": {
+            "jsonify": "~0.0.0"
+          }
+        },
+        "json-stable-stringify-without-jsonify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+          "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+        },
+        "json5": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "jsonfile": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+          "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+          "requires": {
+            "graceful-fs": "^4.1.6"
+          }
+        },
+        "jsonify": {
+          "version": "0.0.0",
+          "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+          "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+        },
+        "jsprim": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+          "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.3.0",
+            "json-schema": "0.2.3",
+            "verror": "1.10.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=="
+        },
+        "klaw": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+          "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+          "requires": {
+            "graceful-fs": "^4.1.9"
+          }
+        },
+        "kleur": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+          "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+        },
+        "leven": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+          "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+        },
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
+        },
+        "lines-and-columns": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+          "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.20",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+        },
+        "lodash.debounce": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+          "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+        },
+        "lodash.get": {
+          "version": "4.4.2",
+          "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+          "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+        },
+        "lodash.isequal": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+          "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+        },
+        "lodash.memoize": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+          "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+        },
+        "lodash.sortby": {
+          "version": "4.7.0",
+          "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+          "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="
+        },
+        "magic-string": {
+          "version": "0.25.7",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+          "requires": {
+            "sourcemap-codec": "^1.4.4"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "make-error": {
+          "version": "1.3.6",
+          "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+          "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+        },
+        "makeerror": {
+          "version": "1.0.11",
+          "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+          "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+          "requires": {
+            "tmpl": "1.0.x"
+          }
+        },
+        "map-cache": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+          "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+        },
+        "map-visit": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+          "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+          "requires": {
+            "object-visit": "^1.0.0"
+          }
+        },
+        "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=="
+        },
+        "merge2": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+          "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "mime-db": {
+          "version": "1.44.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+          "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+        },
+        "mime-types": {
+          "version": "2.1.27",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+          "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+          "requires": {
+            "mime-db": "1.44.0"
+          }
+        },
+        "mimic-response": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+          "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+          "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+          "requires": {
+            "minipass": "^2.9.0"
+          }
+        },
+        "mixin-deep": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+          "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+          "requires": {
+            "for-in": "^1.0.2"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "moo-color": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz",
+          "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg=="
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "nan": {
+          "version": "2.14.2",
+          "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+          "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
+        },
+        "nanomatch": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+          "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "fragment-cache": "^0.2.1",
+            "is-windows": "^1.0.2",
+            "kind-of": "^6.0.2",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "natural-compare": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+          "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+        },
+        "needle": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz",
+          "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==",
+          "requires": {
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "negotiator": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+          "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+        },
+        "nice-try": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+          "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+        },
+        "node-int64": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+          "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+        },
+        "node-modules-regexp": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+          "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
+        },
+        "node-notifier": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz",
+          "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==",
+          "optional": true,
+          "requires": {
+            "growly": "^1.3.0",
+            "shellwords": "^0.1.1",
+            "uuid": "^8.3.0"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
+          "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+          "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+        },
+        "npm-bundled": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
+          "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
+          "requires": {
+            "npm-normalize-package-bin": "^1.0.1"
+          }
+        },
+        "npm-normalize-package-bin": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+          "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+        },
+        "npm-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "npm-packlist": {
+          "version": "1.4.8",
+          "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
+          "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1",
+            "npm-normalize-package-bin": "^1.0.1"
+          }
+        },
+        "npm-registry-client": {
+          "version": "8.6.0",
+          "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz",
+          "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==",
+          "requires": {
+            "concat-stream": "^1.5.2",
+            "graceful-fs": "^4.1.6",
+            "normalize-package-data": "~1.0.1 || ^2.0.0",
+            "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
+            "npmlog": "2 || ^3.1.0 || ^4.0.0",
+            "once": "^1.3.3",
+            "request": "^2.74.0",
+            "retry": "^0.10.0",
+            "safe-buffer": "^5.1.1",
+            "slide": "^1.1.3",
+            "ssri": "^5.2.4"
+          }
+        },
+        "npm-run-path": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+          "requires": {
+            "path-key": "^2.0.0"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+          "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+        },
+        "nwsapi": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+          "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+        },
+        "object-component": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+          "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
+        },
+        "object-copy": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+          "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+          "requires": {
+            "copy-descriptor": "^0.1.0"
+          }
+        },
+        "object-visit": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+          "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+          "requires": {
+            "isobject": "^3.0.0"
+          }
+        },
+        "object.pick": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+          "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        },
+        "once": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+          "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "open": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+          "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+          "requires": {
+            "is-wsl": "^1.1.0"
+          }
+        },
+        "opencollective-postinstall": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+          "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+        },
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+          "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "p-each-series": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz",
+          "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ=="
+        },
+        "p-finally": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+          "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+        },
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+        },
+        "parent-module": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+          "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+          "requires": {
+            "callsites": "^3.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-even-better-errors": "^2.3.0",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "parse5": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+          "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
+        },
+        "parseqs": {
+          "version": "0.0.5",
+          "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+          "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+          "requires": {
+            "better-assert": "~1.0.0"
+          }
+        },
+        "parseuri": {
+          "version": "0.0.5",
+          "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+          "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+          "requires": {
+            "better-assert": "~1.0.0"
+          }
+        },
+        "parsimmon": {
+          "version": "1.16.0",
+          "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.16.0.tgz",
+          "integrity": "sha512-tekGDz2Lny27SQ/5DzJdIK0lqsWwZ667SCLFIDCxaZM7VNgQjyKLbaL7FYPKpbjdxNAXFV/mSxkq5D2fnkW4pA=="
+        },
+        "pascalcase": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+          "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+          "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+        },
+        "path-is-inside": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+          "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+        },
+        "path-parse": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+          "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+        },
+        "path-to-regexp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
+          "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+        },
+        "picomatch": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+          "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+        },
+        "pirates": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+          "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+          "requires": {
+            "node-modules-regexp": "^1.0.0"
+          }
+        },
+        "pixelmatch": {
+          "version": "5.0.2",
+          "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.0.2.tgz",
+          "integrity": "sha512-b65UpTI40rGFY8QwN6IYuCbpmwAOL6M8d6voX4F3zR99UmDqh7r2QWLxoeHOazBRgEmDUdqNVESDREqFxQS7rQ==",
+          "requires": {
+            "pngjs": "^3.4.0"
+          }
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "please-upgrade-node": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+          "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+          "requires": {
+            "semver-compare": "^1.0.0"
+          }
+        },
+        "pngjs": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+          "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
+        },
+        "posix-character-classes": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+          "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+        },
+        "pretty-format": {
+          "version": "26.6.1",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz",
+          "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==",
+          "requires": {
+            "@jest/types": "^26.6.1",
+            "react-is": "^17.0.1"
+          }
+        },
+        "process-nextick-args": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+        },
+        "progress": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+          "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+        },
+        "prompts": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz",
+          "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
+          "requires": {
+            "kleur": "^3.0.3",
+            "sisteransi": "^1.0.5"
+          }
+        },
+        "psl": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+          "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "punycode": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+        },
+        "randombytes": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+          "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+          "requires": {
+            "safe-buffer": "^5.1.0"
+          }
+        },
+        "range-parser": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+          "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+        },
+        "rc": {
+          "version": "1.2.8",
+          "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+          "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+          "requires": {
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          }
+        },
+        "react-is": {
+          "version": "17.0.1",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz",
+          "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "readdirp": {
+          "version": "3.5.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+          "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "regex-not": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+          "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+          "requires": {
+            "extend-shallow": "^3.0.2",
+            "safe-regex": "^1.1.0"
+          }
+        },
+        "regexpp": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+          "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+        },
+        "remove-trailing-separator": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+          "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+        },
+        "repeat-element": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+          "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+        },
+        "repeat-string": {
+          "version": "1.6.1",
+          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+          "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+        },
+        "request": {
+          "version": "2.88.2",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+          "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.3",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tunnel-agent": "^0.6.0"
+          }
+        },
+        "request-promise-core": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+          "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+          "requires": {
+            "lodash": "^4.17.19"
+          }
+        },
+        "request-promise-native": {
+          "version": "1.0.9",
+          "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+          "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+          "requires": {
+            "request-promise-core": "1.1.4",
+            "stealthy-require": "^1.1.1"
+          }
+        },
+        "require-directory": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+          "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+        },
+        "require-from-string": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+          "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        },
+        "resolve-cwd": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+          "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+        },
+        "resolve-url": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+          "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+        },
+        "ret": {
+          "version": "0.1.15",
+          "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+          "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+        },
+        "retry": {
+          "version": "0.10.1",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
+        },
+        "reusify": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+          "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+        },
+        "rollup": {
+          "version": "2.34.2",
+          "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.34.2.tgz",
+          "integrity": "sha512-mvtQLqu3cNeoctS+kZ09iOPxrc1P1/Bt1z15enuQ5feyKOdM3MJAVFjjsygurDpSWn530xB4AlA83TWIzRstXA==",
+          "requires": {
+            "fsevents": "~2.1.2"
+          }
+        },
+        "rollup-plugin-terser": {
+          "version": "7.0.2",
+          "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+          "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "jest-worker": "^26.2.1",
+            "serialize-javascript": "^4.0.0",
+            "terser": "^5.0.0"
+          }
+        },
+        "rsvp": {
+          "version": "4.8.5",
+          "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+          "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
+        },
+        "run-parallel": {
+          "version": "1.1.9",
+          "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+          "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "safe-regex": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+          "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+          "requires": {
+            "ret": "~0.1.10"
+          }
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+          "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "sane": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+          "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+          "requires": {
+            "@cnakazawa/watch": "^1.0.3",
+            "capture-exit": "^2.0.0",
+            "exec-sh": "^0.3.2",
+            "execa": "^1.0.0",
+            "fb-watchman": "^2.0.0",
+            "minimist": "^1.1.1",
+            "walker": "~1.0.5"
+          }
+        },
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
+        "seedrandom": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.3.tgz",
+          "integrity": "sha512-PJLhhxIMjlMJaiIRtqiVW061EZn3cS+waZkbFe7eCa2R3g88HbNdWmw4NTFG1w5unxd0GeNaUUxZJP7gPAzSDQ=="
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        },
+        "semver-compare": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+          "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+        },
+        "semver-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+          "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+        },
+        "serialize-javascript": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
+        "serve-handler": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.1.tgz",
+          "integrity": "sha512-LQPvxGia2TYqyMkHKH4jW9jx6jlQUMcWz6gJavZ3+4vsnB+SaWbYTncb9YsK5YBR6SlvyumREZJAzLw8VaFAUQ==",
+          "requires": {
+            "bytes": "3.0.0",
+            "content-disposition": "0.5.2",
+            "fast-url-parser": "1.1.3",
+            "minimatch": "3.0.4",
+            "path-is-inside": "1.0.2",
+            "path-to-regexp": "2.2.1",
+            "range-parser": "1.2.0"
+          }
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+        },
+        "set-value": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+          "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+          "requires": {
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.3",
+            "split-string": "^3.0.1"
+          }
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+        },
+        "shelljs": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
+          "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E="
+        },
+        "shellwords": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+          "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+          "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+        },
+        "simple-concat": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+          "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+        },
+        "simple-get": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
+          "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
+          "requires": {
+            "decompress-response": "^4.2.0",
+            "once": "^1.3.1",
+            "simple-concat": "^1.0.0"
+          }
+        },
+        "sisteransi": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+          "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+        },
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "requires": {
+            "astral-regex": "^2.0.0"
+          }
+        },
+        "slide": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+          "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
+        },
+        "slugify": {
+          "version": "1.3.4",
+          "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.4.tgz",
+          "integrity": "sha512-KP0ZYk5hJNBS8/eIjGkFDCzGQIoZ1mnfQRYS5WM3273z+fxGWXeN0fkwf2ebEweydv9tioZIHGZKoF21U07/nw=="
+        },
+        "snapdragon": {
+          "version": "0.8.2",
+          "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+          "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+          "requires": {
+            "base": "^0.11.1",
+            "map-cache": "^0.2.2",
+            "source-map": "^0.5.6",
+            "source-map-resolve": "^0.5.0",
+            "use": "^3.1.0"
+          }
+        },
+        "snapdragon-node": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+          "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+          "requires": {
+            "isobject": "^3.0.0",
+            "snapdragon-util": "^3.0.1"
+          }
+        },
+        "snapdragon-util": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+          "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="
+        },
+        "socket.io": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz",
+          "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==",
+          "requires": {
+            "engine.io": "~3.3.1",
+            "has-binary2": "~1.0.2",
+            "socket.io-adapter": "~1.1.0",
+            "socket.io-client": "2.2.0",
+            "socket.io-parser": "~3.3.0"
+          }
+        },
+        "socket.io-adapter": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
+          "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
+        },
+        "socket.io-client": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz",
+          "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==",
+          "requires": {
+            "backo2": "1.0.2",
+            "base64-arraybuffer": "0.1.5",
+            "component-bind": "1.0.0",
+            "engine.io-client": "~3.3.1",
+            "has-binary2": "~1.0.2",
+            "has-cors": "1.1.0",
+            "indexof": "0.0.1",
+            "object-component": "0.0.3",
+            "parseqs": "0.0.5",
+            "parseuri": "0.0.5",
+            "socket.io-parser": "~3.3.0",
+            "to-array": "0.1.4"
+          }
+        },
+        "socket.io-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz",
+          "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==",
+          "requires": {
+            "component-emitter": "~1.3.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        },
+        "source-map-resolve": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+          "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+          "requires": {
+            "atob": "^2.1.2",
+            "decode-uri-component": "^0.2.0",
+            "resolve-url": "^0.2.1",
+            "source-map-url": "^0.4.0",
+            "urix": "^0.1.0"
+          }
+        },
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "requires": {
+            "buffer-from": "^1.0.0"
+          }
+        },
+        "source-map-url": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+          "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+        },
+        "sourcemap-codec": {
+          "version": "1.4.8",
+          "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+          "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+        },
+        "spdx-correct": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+          "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+          "requires": {
+            "spdx-expression-parse": "^3.0.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-exceptions": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+          "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+        },
+        "spdx-expression-parse": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+          "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+          "requires": {
+            "spdx-exceptions": "^2.1.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-license-ids": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
+          "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
+        },
+        "split-string": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+          "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+          "requires": {
+            "extend-shallow": "^3.0.0"
+          }
+        },
+        "sprintf-js": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+        },
+        "sshpk": {
+          "version": "1.16.1",
+          "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+          "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+          "requires": {
+            "asn1": "~0.2.3",
+            "assert-plus": "^1.0.0",
+            "bcrypt-pbkdf": "^1.0.0",
+            "dashdash": "^1.12.0",
+            "ecc-jsbn": "~0.1.1",
+            "getpass": "^0.1.1",
+            "jsbn": "~0.1.0",
+            "safer-buffer": "^2.0.2",
+            "tweetnacl": "~0.14.0"
+          }
+        },
+        "ssri": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+          "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+          "requires": {
+            "safe-buffer": "^5.1.1"
+          }
+        },
+        "stack-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz",
+          "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg=="
+        },
+        "static-extend": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+          "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+          "requires": {
+            "object-copy": "^0.1.0"
+          }
+        },
+        "stealthy-require": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+          "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
+        },
+        "string-length": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
+          "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
+          "requires": {
+            "char-regex": "^1.0.2"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+        },
+        "strip-eof": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+          "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+        },
+        "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=="
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "supports-hyperlinks": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
+          "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA=="
+        },
+        "symbol-tree": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+          "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+        },
+        "table": {
+          "version": "6.0.7",
+          "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+          "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
+          "requires": {
+            "lodash": "^4.17.20",
+            "slice-ansi": "^4.0.0"
+          }
+        },
+        "tar": {
+          "version": "4.4.13",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+          "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.8.6",
+            "minizlib": "^1.2.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.3"
+          }
+        },
+        "tar-stream": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+          "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+          "requires": {
+            "bl": "^4.0.3",
+            "end-of-stream": "^1.4.1",
+            "fs-constants": "^1.0.0",
+            "inherits": "^2.0.3"
+          }
+        },
+        "terminal-link": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+          "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+          "requires": {
+            "supports-hyperlinks": "^2.0.0"
+          }
+        },
+        "terser": {
+          "version": "5.3.8",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz",
+          "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==",
+          "requires": {
+            "source-map-support": "~0.5.19"
+          }
+        },
+        "test-exclude": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+          "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+          "requires": {
+            "@istanbuljs/schema": "^0.1.2",
+            "minimatch": "^3.0.4"
+          }
+        },
+        "text-table": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+          "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+        },
+        "throat": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+          "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
+        },
+        "timsort": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+          "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+        },
+        "tmpl": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+          "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+        },
+        "to-array": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+          "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+        },
+        "to-object-path": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+          "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68="
+        },
+        "to-regex": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+          "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+          "requires": {
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "regex-not": "^1.0.2",
+            "safe-regex": "^1.1.0"
+          }
+        },
+        "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==",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "tough-cookie": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+          "requires": {
+            "ip-regex": "^2.1.0",
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "tr46": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+          "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+          "requires": {
+            "punycode": "^2.1.1"
+          }
+        },
+        "ts-jest": {
+          "version": "26.4.3",
+          "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.3.tgz",
+          "integrity": "sha512-pFDkOKFGY+nL9v5pkhm+BIFpoAuno96ff7GMnIYr/3L6slFOS365SI0fGEVYx2RKGji5M2elxhWjDMPVcOCdSw==",
+          "requires": {
+            "@jest/create-cache-key-function": "^26.5.0",
+            "@types/jest": "26.x",
+            "bs-logger": "0.x",
+            "buffer-from": "1.x",
+            "fast-json-stable-stringify": "2.x",
+            "jest-util": "^26.1.0",
+            "json5": "2.x",
+            "lodash.memoize": "4.x",
+            "make-error": "1.x"
+          }
+        },
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        },
+        "tslint": {
+          "version": "5.14.0",
+          "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz",
+          "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==",
+          "requires": {
+            "babel-code-frame": "^6.22.0",
+            "builtin-modules": "^1.1.1",
+            "diff": "^3.2.0",
+            "js-yaml": "^3.7.0",
+            "minimatch": "^3.0.4",
+            "mkdirp": "^0.5.1",
+            "resolve": "^1.3.2"
+          }
+        },
+        "tsutils": {
+          "version": "3.18.0",
+          "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.18.0.tgz",
+          "integrity": "sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA=="
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+          "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+          "requires": {
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+          "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        },
+        "type-detect": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+        },
+        "typedarray": {
+          "version": "0.0.6",
+          "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+          "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+        },
+        "typedarray-to-buffer": {
+          "version": "3.1.5",
+          "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+          "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+          "requires": {
+            "is-typedarray": "^1.0.0"
+          }
+        },
+        "typescript": {
+          "version": "4.1.3",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
+          "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg=="
+        },
+        "union-value": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+          "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+          "requires": {
+            "arr-union": "^3.1.0",
+            "get-value": "^2.0.6",
+            "is-extendable": "^0.1.1",
+            "set-value": "^2.0.1"
+          }
+        },
+        "universalify": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+          "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+        },
+        "unset-value": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+          "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+          "requires": {
+            "isobject": "^3.0.0"
+          }
+        },
+        "uri-js": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+          "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+          "requires": {
+            "punycode": "^2.1.0"
+          }
+        },
+        "urix": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+          "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+        },
+        "use": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+          "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+          "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+        },
+        "uuid": {
+          "version": "8.3.1",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz",
+          "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==",
+          "optional": true
+        },
+        "v8-compile-cache": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+          "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q=="
+        },
+        "v8-to-istanbul": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz",
+          "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==",
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.1",
+            "convert-source-map": "^1.6.0"
+          }
+        },
+        "validate-npm-package-license": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+          "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+          "requires": {
+            "spdx-correct": "^3.0.0",
+            "spdx-expression-parse": "^3.0.0"
+          }
+        },
+        "validate-npm-package-name": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+          "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+          "requires": {
+            "builtins": "^1.0.3"
+          }
+        },
+        "validator": {
+          "version": "8.2.0",
+          "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz",
+          "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA=="
+        },
+        "verror": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+          "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "core-util-is": "1.0.2",
+            "extsprintf": "^1.2.0"
+          }
+        },
+        "w3c-hr-time": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+          "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+          "requires": {
+            "browser-process-hrtime": "^1.0.0"
+          }
+        },
+        "walker": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+          "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+          "requires": {
+            "makeerror": "1.0.x"
+          }
+        },
+        "webidl-conversions": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+          "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
+        },
+        "whatwg-encoding": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+          "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+          "requires": {
+            "iconv-lite": "0.4.24"
+          }
+        },
+        "whatwg-mimetype": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+          "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+        },
+        "whatwg-url": {
+          "version": "8.4.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz",
+          "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==",
+          "requires": {
+            "lodash.sortby": "^4.7.0",
+            "tr46": "^2.0.2",
+            "webidl-conversions": "^6.1.0"
+          }
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+        },
+        "which-pm-runs": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+          "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+        },
+        "wide-align": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+          "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+          "requires": {
+            "string-width": "^1.0.2 || 2"
+          }
+        },
+        "word-wrap": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+          "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+          "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        },
+        "ws": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+          "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
+        },
+        "xml-name-validator": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+          "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+        },
+        "xmlchars": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+          "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+        },
+        "xmlhttprequest-ssl": {
+          "version": "1.5.5",
+          "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+          "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
+        },
+        "y18n": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        },
+        "yaml": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+          "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        },
+        "yeast": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+          "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
+        },
+        "z-schema": {
+          "version": "3.18.4",
+          "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz",
+          "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==",
+          "requires": {
+            "commander": "^2.7.1",
+            "lodash.get": "^4.0.0",
+            "lodash.isequal": "^4.0.0",
+            "validator": "^8.0.0"
+          }
+        },
+        "zrender": {
+          "version": "5.0.1",
+          "resolved": "/Users/lang/Develop/echarts-examples/e2e/tmp/zrender-5.0.1.tgz",
+          "integrity": "sha512-eh7cWh4JAnM75FgAx5jLqB61H6+il4QzJ2jVu37eMFdRwvhE1W2/K1a5WK8AA2tiI2aavKE/IyceK71YrMmQKA==",
+          "requires": {
+            "tslib": "2.0.3"
+          }
+        }
+      }
+    },
+    "echarts-gl": {
+      "version": "file:tmp/echarts-gl-2.0.0-rc.3.tgz",
+      "integrity": "sha512-YfkOPG56xoIN3Qmqa5/rX/BPumLXdSVfvoJ1DJ6DrPIsHIXDbTQnHc9/ygDXmYi+w8WAY6i7ncZIQ6qaizO41Q==",
+      "requires": {
+        "claygl": "^1.2.1",
+        "zrender": "^5.0.1"
+      }
+    },
+    "echarts-liquidfill": {
+      "version": "file:tmp/echarts-liquidfill-3.0.0.tgz",
+      "integrity": "sha512-rJR+pUH+hwaTHBO9jPG1O9iQwpVuIS61XOtw7ePv7vQpCbowHJ0irQjPZY4M5D9CNadqPTpI8hxUbUxoK8pRtg=="
+    },
+    "echarts-wordcloud": {
+      "version": "file:tmp/echarts-wordcloud-2.0.0.tgz",
+      "integrity": "sha512-UxUXt6vBHDMlX4QoFN1YM7wZkA8Xnu0KB0nmdWp1XHXd4dP/iSXLOf9PVZCpUF4Esmx3J1r+qggEyn+doCHZ6A=="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "ext-list": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+      "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+      "dev": true,
+      "requires": {
+        "mime-db": "^1.28.0"
+      }
+    },
+    "ext-name": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
+      "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
+      "dev": true,
+      "requires": {
+        "ext-list": "^2.0.0",
+        "sort-keys-length": "^1.0.0"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "dev": true,
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
+    "file-type": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
+      "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==",
+      "dev": true
+    },
+    "filename-reserved-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
+      "dev": true
+    },
+    "filenamify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
+      "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
+      "dev": true,
+      "requires": {
+        "filename-reserved-regex": "^2.0.0",
+        "strip-outer": "^1.0.0",
+        "trim-repeated": "^1.0.0"
+      }
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "get-proxy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
+      "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
+      "dev": true,
+      "requires": {
+        "npm-conf": "^1.1.0"
+      }
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "git-clone": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz",
+      "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=",
+      "dev": true
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "got": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
+      "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
+      "dev": true,
+      "requires": {
+        "@sindresorhus/is": "^0.7.0",
+        "cacheable-request": "^2.1.1",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^3.0.0",
+        "into-stream": "^3.1.0",
+        "is-retry-allowed": "^1.1.0",
+        "isurl": "^1.0.0-alpha5",
+        "lowercase-keys": "^1.0.0",
+        "mimic-response": "^1.0.0",
+        "p-cancelable": "^0.4.0",
+        "p-timeout": "^2.0.1",
+        "pify": "^3.0.0",
+        "safe-buffer": "^5.1.1",
+        "timed-out": "^4.0.1",
+        "url-parse-lax": "^3.0.0",
+        "url-to-options": "^1.0.1"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+      "dev": true
+    },
+    "has-symbol-support-x": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+      "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
+      "dev": true
+    },
+    "has-to-string-tag-x": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+      "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+      "dev": true,
+      "requires": {
+        "has-symbol-support-x": "^1.4.1"
+      }
+    },
+    "http-cache-semantics": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+      "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
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "dev": true
+    },
+    "into-stream": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+      "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
+      "dev": true,
+      "requires": {
+        "from2": "^2.1.1",
+        "p-is-promise": "^1.1.0"
+      }
+    },
+    "is-natural-number": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
+      "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
+      "dev": true
+    },
+    "is-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+      "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
+      "dev": true
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-retry-allowed": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+      "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isurl": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+      "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+      "dev": true,
+      "requires": {
+        "has-to-string-tag-x": "^1.2.0",
+        "is-object": "^1.0.1"
+      }
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "dev": true
+    },
+    "keyv": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
+      "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+      "dev": true,
+      "requires": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true
+    },
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "mime-db": {
+      "version": "1.45.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
+      "dev": true
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "normalize-url": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+      "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+      "dev": true,
+      "requires": {
+        "prepend-http": "^2.0.0",
+        "query-string": "^5.0.1",
+        "sort-keys": "^2.0.0"
+      },
+      "dependencies": {
+        "sort-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+          "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
+          "dev": true,
+          "requires": {
+            "is-plain-obj": "^1.0.0"
+          }
+        }
+      }
+    },
+    "npm-conf": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
+      "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
+      "dev": true,
+      "requires": {
+        "config-chain": "^1.1.11",
+        "pify": "^3.0.0"
+      }
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "p-cancelable": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+      "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+      "dev": true
+    },
+    "p-event": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
+      "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
+      "dev": true,
+      "requires": {
+        "p-timeout": "^2.0.1"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
+      "dev": true
+    },
+    "p-timeout": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+      "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+      "dev": true,
+      "requires": {
+        "p-finally": "^1.0.0"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "proto-list": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+      "dev": true
+    },
+    "query-string": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+      "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+      "dev": true,
+      "requires": {
+        "decode-uri-component": "^0.2.0",
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "dev": true,
+      "requires": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "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
+    },
+    "seek-bzip": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
+      "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.8.1"
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      }
+    },
+    "sort-keys-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+      "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+      "dev": true,
+      "requires": {
+        "sort-keys": "^1.0.0"
+      }
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "strip-dirs": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
+      "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+      "dev": true,
+      "requires": {
+        "is-natural-number": "^4.0.1"
+      }
+    },
+    "strip-outer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.2"
+      }
+    },
+    "tar-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
+      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+      "dev": true,
+      "requires": {
+        "bl": "^1.0.0",
+        "buffer-alloc": "^1.2.0",
+        "end-of-stream": "^1.0.0",
+        "fs-constants": "^1.0.0",
+        "readable-stream": "^2.3.0",
+        "to-buffer": "^1.1.1",
+        "xtend": "^4.0.0"
+      }
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "timed-out": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+      "dev": true
+    },
+    "to-buffer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+      "dev": true
+    },
+    "trim-repeated": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.2"
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "unbzip2-stream": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+      "dev": true,
+      "requires": {
+        "buffer": "^5.2.1",
+        "through": "^2.3.8"
+      }
+    },
+    "url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "dev": true,
+      "requires": {
+        "prepend-http": "^2.0.0"
+      }
+    },
+    "url-to-options": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+      "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
+      "dev": true
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "dev": true,
+      "requires": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    },
+    "zrender": {
+      "version": "file:tmp/zrender-5.0.1.tgz",
+      "integrity": "sha512-eh7cWh4JAnM75FgAx5jLqB61H6+il4QzJ2jVu37eMFdRwvhE1W2/K1a5WK8AA2tiI2aavKE/IyceK71YrMmQKA==",
+      "requires": {
+        "tslib": "2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
+      }
+    }
+  }
+}
diff --git a/e2e/package.json b/e2e/package.json
new file mode 100644
index 0000000..fd0973e
--- /dev/null
+++ b/e2e/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "echarts-examples-e2e",
+  "version": "1.0.0",
+  "description": "Using the example data to E2E test echarts and it's extensions.",
+  "main": "main.js",
+  "scripts": {
+    "test:e2e": "node main.js --bundler webpack -m --fetch",
+    "test:e2e:esbuild": "node main.js --bundler esbuild -m --fetch"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "echarts": "file:../../echarts",
+    "echarts-gl": "file:tmp/echarts-gl-2.0.0-rc.3.tgz",
+    "echarts-liquidfill": "file:tmp/echarts-liquidfill-3.0.0.tgz",
+    "echarts-wordcloud": "file:tmp/echarts-wordcloud-2.0.0.tgz",
+    "zrender": "file:tmp/zrender-5.0.1.tgz"
+  }
+}
diff --git a/e2e/preview.html b/e2e/preview.html
new file mode 100644
index 0000000..fb94486
--- /dev/null
+++ b/e2e/preview.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
+    <title>Test Container</title>
+</head>
+<body>
+    <style>
+        html, body {
+            margin: 0;
+            overflow: hidden;
+        }
+        #main {
+            position: absolute;
+            left: 0px;
+            top: 0px;
+            right: 0px;
+            bottom: 0px;
+        }
+    </style>
+    <div id="main"></div>
+    <script src="tmp/bundles/graph-grid.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/e2e/report.html b/e2e/report.html
new file mode 100644
index 0000000..d4c44f2
--- /dev/null
+++ b/e2e/report.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Test Report</title>
+    <link href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css" rel="stylesheet" type="text/css">
+
+    <style>
+        #app {
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+        }
+
+        .import-type-title {
+            padding: 10px;
+        }
+
+        .import-type-title div {
+            font-size: 14px;
+            font-family:'Courier New', Courier, monospace;
+        }
+
+        .type-error-log {
+            padding: 10px;
+            color: red;
+            font-family:'Courier New', Courier, monospace;
+        }
+        .type-error-log pre {
+            margin: 5px 0;
+            padding: 0;
+            /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */
+            white-space: pre-wrap;
+        }
+        .type-passed {
+            font-size: 14px;
+            color: green;
+            font-family:'Courier New', Courier, monospace;
+            padding: 10px;
+        }
+    </style>
+
+</head>
+<body>
+    <div id="app">
+        <el-tabs v-model="tab" type="border-card">
+            <el-tab-pane label="Type Checking" name="typechecking">
+                <div v-for="item in typeCheckingResult">
+                    <h3>{{ item.testName }}({{item.compileErrorsCount}})</h3>
+                    <el-row :gutter="30">
+                        <el-col :span="12">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <div class="import-type-title">
+                                    <div>全量引入</div>
+                                    <div>Full Import</div>
+                                </div>
+                                <div class="type-error-log" v-if="item.compileErrors.full.length">
+                                    <div v-for="compileError in item.compileErrors.full">
+                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
+                                    </div>
+                                </div>
+                                <div class="type-passed" v-else>
+                                    No Error
+                                </div>
+                            </el-card>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <div class="import-type-title">
+                                    <div>按需引入</div>
+                                    <div>Minimal Import </div>
+                                </div>
+                                <div class="type-error-log" v-if="item.compileErrors.minimal.length">
+                                    <div v-for="compileError in item.compileErrors.minimal">
+                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
+                                    </div>
+                                </div>
+                                <div class="type-passed" v-else>
+                                    No Error
+                                </div>
+                            </el-card>
+                        </el-col>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane label="Screenshots Compare" name="screenshots">
+                <div v-for="item in screenshotsCompareResult">
+                    <h3>{{ item.testName }}({{item.screenshotDiffRatio}})</h3>
+                    <el-row :gutter="10">
+                        <el-col :span="4">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.png'"></el-image>
+                                <div class="import-type-title">
+                                    <div>全量引入</div>
+                                    <div>Full Import</div>
+                                </div>
+                            </el-card>
+                        </el-col>
+                        <el-col :span="4">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.png'"></el-image>
+                                <div class="import-type-title">
+                                    <div>按需引入</div>
+                                    <div>Minimal Import </div>
+                                </div>
+                            </el-card>
+                        </el-col>
+                        <el-col :span="4">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.png'"></el-image>
+                                <div class="import-type-title">
+                                    <div>自注册方式按需引入</div>
+                                    <div>Minimal Import with Self Registion</div>
+                                </div>
+                            </el-card>
+                        </el-col>
+                        <el-col :span="4">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.diff.png'"></el-image>
+                                <div class="import-type-title">
+                                    <div>按需引入差异</div>
+                                    <div>Diff of Minimal Import </div>
+                                </div>
+                            </el-card>
+                        </el-col>
+                        <el-col :span="4">
+                            <el-card :body-style="{ padding: '0px' }">
+                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.diff.png'"></el-image>
+                                <div class="import-type-title">
+                                    <div>自注册方式按需引入差异</div>
+                                    <div>Diff of Minimal Import with Self Registion</div>
+                                </div>
+                            </el-card>
+                        </el-col>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+        </el-tabs>
+    </div>
+    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.js"></script>
+
+    <script>
+        const app = new Vue({
+            el: '#app',
+            data() {
+                return {
+                    typeCheckingResult: [],
+                    screenshotsCompareResult: [],
+
+                    SCREENSHOT_ROOT: './tmp/screenshots/',
+
+                    tab: 'screenshots',
+                    splitterModel: 10
+                };
+            }
+        });
+
+        fetch('./tmp/result.json')
+            .then(response => response.json())
+            .then(json => {
+                const result = [];
+                function getCompilerErrorsCount({ full, minimal, minimalLegacy }) {
+                    return full.length + minimal.length + minimalLegacy.length;
+                }
+                function getScreenshotDiffRatio({ minimal, minimalLegacy }) {
+                    return minimal.ratio + minimalLegacy.ratio;
+                }
+
+                Object.keys(json).forEach(key => {
+                    result.push({
+                        ...json[key],
+                        compileErrorsCount: getCompilerErrorsCount(json[key].compileErrors),
+                        screenshotDiffRatio: getScreenshotDiffRatio(json[key].screenshotDiff),
+                        testName: key
+                    });
+                });
+                app.typeCheckingResult = result.slice().sort((a, b) => {
+                    return b.compileErrorsCount - a.compileErrorsCount;
+                });
+                app.screenshotsCompareResult = result.slice().sort((a, b) => {
+                    return b.screenshotDiffRatio - a.screenshotDiffRatio;
+                });
+            });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/e2e/template.html b/e2e/template.html
new file mode 100644
index 0000000..71c3b5b
--- /dev/null
+++ b/e2e/template.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
+    <title>Test Container</title>
+</head>
+<body>
+    <style>
+        html, body {
+            margin: 0;
+            overflow: hidden;
+        }
+        #main {
+            position: absolute;
+            left: 0px;
+            top: 0px;
+            right: 0px;
+            bottom: 0px;
+        }
+    </style>
+    <div id="main"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
new file mode 100644
index 0000000..ad6231a
--- /dev/null
+++ b/e2e/tsconfig.json
@@ -0,0 +1,13 @@
+{
+    "compilerOptions": {
+        "target": "ES6",
+
+        "strict": true,
+
+        "moduleResolution": "node",
+        "pretty": true,
+        "outDir": "tmp/tests",
+
+        "baseUrl": "./"
+    }
+}
\ No newline at end of file
diff --git a/e2e/webpack.config.js b/e2e/webpack.config.js
new file mode 100644
index 0000000..9d8c056
--- /dev/null
+++ b/e2e/webpack.config.js
@@ -0,0 +1,20 @@
+const path = require('path');
+const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
+const config = require('./config');
+
+module.exports = {
+    entry: path.resolve(__dirname, 'tmp/tests/area-basic.minimal.js'),
+    plugins: [
+        new BundleAnalyzerPlugin()
+    ],
+    resolve: {
+        alias: {
+            echarts: config.echartsDir,
+            zrender: config.zrenderDir
+        }
+    },
+    output: {
+        path: path.resolve(__dirname, 'tmp/bundles/'),
+        filename: 'area-basic.minimal.js'
+    }
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index c127383..e6b08a4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1135,6 +1135,17 @@
         }
       }
     },
+    "@discoveryjs/json-ext": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
+      "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
+      "dev": true
+    },
+    "@lang/object-visualizer": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@lang/object-visualizer/-/object-visualizer-3.1.1.tgz",
+      "integrity": "sha512-1RF04RA8Y7AloIGwKau+ilIoZl0DBf8c1v8V+uG7bUpWobBdQyPTbYTFXtZoBsDVObTHXJIWA/pdURGj/N+usg=="
+    },
     "@nodelib/fs.scandir": {
       "version": "2.1.3",
       "resolved": "https://registry.npm.taobao.org/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.3.tgz",
@@ -1161,6 +1172,12 @@
         "fastq": "^1.6.0"
       }
     },
+    "@polka/url": {
+      "version": "1.0.0-next.11",
+      "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz",
+      "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==",
+      "dev": true
+    },
     "@sindresorhus/is": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
@@ -1173,6 +1190,32 @@
       "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=",
       "dev": true
     },
+    "@types/eslint": {
+      "version": "7.2.6",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
+      "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "@types/eslint-scope": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+      "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+      "dev": true,
+      "requires": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "@types/estree": {
+      "version": "0.0.45",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
+      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
+      "dev": true
+    },
     "@types/events": {
       "version": "3.0.0",
       "resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz",
@@ -1208,6 +1251,93 @@
       "integrity": "sha1-bRGowtWEBbPbk4irdAEGy/pkw8k=",
       "dev": true
     },
+    "@typescript-eslint/types": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz",
+      "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz",
+      "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "4.12.0",
+        "@typescript-eslint/visitor-keys": "4.12.0",
+        "debug": "^4.1.1",
+        "globby": "^11.0.1",
+        "is-glob": "^4.0.1",
+        "lodash": "^4.17.15",
+        "semver": "^7.3.2",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "globby": {
+          "version": "11.0.1",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+          "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+          "dev": true,
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.1.1",
+            "ignore": "^5.1.4",
+            "merge2": "^1.3.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "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
+        },
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz",
+      "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "4.12.0",
+        "eslint-visitor-keys": "^2.0.0"
+      }
+    },
     "@vue/component-compiler-utils": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
@@ -1223,183 +1353,207 @@
         "prettier": "^1.18.2",
         "source-map": "~0.6.1",
         "vue-template-es2015-compiler": "^1.9.0"
+      },
+      "dependencies": {
+        "prettier": {
+          "version": "1.19.1",
+          "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+          "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+          "dev": true,
+          "optional": true
+        }
       }
     },
     "@webassemblyjs/ast": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
-      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz",
+      "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0"
+        "@webassemblyjs/helper-module-context": "1.9.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+        "@webassemblyjs/wast-parser": "1.9.1"
       }
     },
     "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
-      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz",
+      "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg==",
       "dev": true
     },
     "@webassemblyjs/helper-api-error": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
-      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz",
+      "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA==",
       "dev": true
     },
     "@webassemblyjs/helper-buffer": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
-      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz",
+      "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w==",
       "dev": true
     },
     "@webassemblyjs/helper-code-frame": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
-      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz",
+      "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/wast-printer": "1.9.0"
+        "@webassemblyjs/wast-printer": "1.9.1"
       }
     },
     "@webassemblyjs/helper-fsm": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
-      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz",
+      "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw==",
       "dev": true
     },
     "@webassemblyjs/helper-module-context": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
-      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz",
+      "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1"
       }
     },
     "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
-      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz",
+      "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ==",
       "dev": true
     },
     "@webassemblyjs/helper-wasm-section": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
-      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz",
+      "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-buffer": "1.9.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+        "@webassemblyjs/wasm-gen": "1.9.1"
       }
     },
     "@webassemblyjs/ieee754": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
-      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz",
+      "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==",
       "dev": true,
       "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "@webassemblyjs/leb128": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
-      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz",
+      "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==",
       "dev": true,
       "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/utf8": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
-      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz",
+      "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg==",
       "dev": true
     },
     "@webassemblyjs/wasm-edit": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
-      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz",
+      "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/helper-wasm-section": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-opt": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "@webassemblyjs/wast-printer": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-buffer": "1.9.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+        "@webassemblyjs/helper-wasm-section": "1.9.1",
+        "@webassemblyjs/wasm-gen": "1.9.1",
+        "@webassemblyjs/wasm-opt": "1.9.1",
+        "@webassemblyjs/wasm-parser": "1.9.1",
+        "@webassemblyjs/wast-printer": "1.9.1"
       }
     },
     "@webassemblyjs/wasm-gen": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
-      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz",
+      "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+        "@webassemblyjs/ieee754": "1.9.1",
+        "@webassemblyjs/leb128": "1.9.1",
+        "@webassemblyjs/utf8": "1.9.1"
       }
     },
     "@webassemblyjs/wasm-opt": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
-      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz",
+      "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-buffer": "1.9.0",
-        "@webassemblyjs/wasm-gen": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-buffer": "1.9.1",
+        "@webassemblyjs/wasm-gen": "1.9.1",
+        "@webassemblyjs/wasm-parser": "1.9.1"
       }
     },
     "@webassemblyjs/wasm-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
-      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz",
+      "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
-        "@webassemblyjs/ieee754": "1.9.0",
-        "@webassemblyjs/leb128": "1.9.0",
-        "@webassemblyjs/utf8": "1.9.0"
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-api-error": "1.9.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+        "@webassemblyjs/ieee754": "1.9.1",
+        "@webassemblyjs/leb128": "1.9.1",
+        "@webassemblyjs/utf8": "1.9.1"
       }
     },
     "@webassemblyjs/wast-parser": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
-      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz",
+      "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
-        "@webassemblyjs/helper-api-error": "1.9.0",
-        "@webassemblyjs/helper-code-frame": "1.9.0",
-        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.1",
+        "@webassemblyjs/helper-api-error": "1.9.1",
+        "@webassemblyjs/helper-code-frame": "1.9.1",
+        "@webassemblyjs/helper-fsm": "1.9.1",
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/wast-printer": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
-      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz",
+      "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/wast-parser": "1.9.0",
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/wast-parser": "1.9.1",
         "@xtuc/long": "4.2.2"
       }
     },
+    "@webpack-cli/info": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz",
+      "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==",
+      "dev": true,
+      "requires": {
+        "envinfo": "^7.7.3"
+      }
+    },
+    "@webpack-cli/serve": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz",
+      "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==",
+      "dev": true
+    },
     "@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -1412,30 +1566,42 @@
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
       "dev": true
     },
+    "acorn": {
+      "version": "8.0.4",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
+      "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
+      "dev": true
+    },
+    "acorn-walk": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.1.tgz",
+      "integrity": "sha512-zn/7dYtoTVkG4EoMU55QlQU4F+m+T7Kren6Vj3C2DapWPnakG/DL9Ns5aPAPW5Ixd3uxXrV/BoMKKVFIazPcdg==",
+      "dev": true
+    },
     "ajv": {
-      "version": "6.10.2",
-      "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.10.2.tgz",
-      "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "requires": {
-        "fast-deep-equal": "^2.0.1",
+        "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-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
-      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true
-    },
     "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
     },
+    "ansi-colors": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+      "dev": true
+    },
     "ansi-regex": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -1456,17 +1622,6 @@
       "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
       "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
     },
-    "anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz",
@@ -1515,24 +1670,6 @@
         "sprintf-js": "~1.0.2"
       }
     },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
     "array-find-index": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
@@ -1545,77 +1682,6 @@
       "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=",
       "dev": true
     },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "assert": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
-      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true,
-      "optional": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
     "babel-loader": {
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
@@ -1666,67 +1732,6 @@
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "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
-        }
-      }
-    },
     "base64-js": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -1978,23 +1983,6 @@
         }
       }
     },
-    "binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true,
-      "optional": true
-    },
-    "bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
     "bl": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
@@ -2011,12 +1999,6 @@
       "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
       "dev": true
     },
-    "bn.js": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
-      "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==",
-      "dev": true
-    },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2035,112 +2017,6 @@
         "fill-range": "^7.0.1"
       }
     },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
-      "dev": true
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dev": true,
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dev": true,
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
-    "browserify-sign": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
-      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^5.1.1",
-        "browserify-rsa": "^4.0.1",
-        "create-hash": "^1.2.0",
-        "create-hmac": "^1.1.7",
-        "elliptic": "^6.5.3",
-        "inherits": "^2.0.4",
-        "parse-asn1": "^5.1.5",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "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"
-          }
-        },
-        "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
-        }
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dev": true,
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
     "browserslist": {
       "version": "4.14.0",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz",
@@ -2197,81 +2073,6 @@
       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
       "dev": true
     },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
-      "dev": true
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
-      "dev": true
-    },
-    "cacache": {
-      "version": "12.0.4",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.5.5",
-        "chownr": "^1.1.1",
-        "figgy-pudding": "^3.5.1",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.1.15",
-        "infer-owner": "^1.0.3",
-        "lru-cache": "^5.1.1",
-        "mississippi": "^3.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.3",
-        "ssri": "^6.0.1",
-        "unique-filename": "^1.1.1",
-        "y18n": "^4.0.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
-          "requires": {
-            "yallist": "^3.0.2"
-          }
-        },
-        "y18n": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
-        }
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
     "cacheable-request": {
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
@@ -2301,6 +2102,24 @@
         }
       }
     },
+    "camel-case": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+      "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+      "dev": true,
+      "requires": {
+        "pascal-case": "^3.1.2",
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
+      }
+    },
     "camelcase": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
@@ -2395,23 +2214,6 @@
         }
       }
     },
-    "chokidar": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
-      "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.4.0"
-      }
-    },
     "chownr": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
@@ -2427,37 +2229,13 @@
         "tslib": "^1.9.0"
       }
     },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+    "clean-css": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
+        "source-map": "~0.6.0"
       }
     },
     "cliui": {
@@ -2486,16 +2264,6 @@
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true
     },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
     "color": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
@@ -2531,6 +2299,12 @@
         "simple-swizzle": "^0.2.2"
       }
     },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+      "dev": true
+    },
     "colors": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
@@ -2549,29 +2323,11 @@
       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
     "concurrently": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz",
@@ -2811,12 +2567,6 @@
         "proto-list": "~1.2.1"
       }
     },
-    "console-browserify": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
-      "dev": true
-    },
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -2838,12 +2588,6 @@
         "bluebird": "^3.1.1"
       }
     },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
-      "dev": true
-    },
     "content-disposition": {
       "version": "0.5.3",
       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
@@ -2862,26 +2606,6 @@
         "safe-buffer": "~5.1.1"
       }
     },
-    "copy-concurrently": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
-      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
     "core-js-compat": {
       "version": "3.6.5",
       "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
@@ -2906,70 +2630,49 @@
       "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
       "dev": true
     },
-    "create-ecdh": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
-      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+    "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": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.5.3"
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
       },
       "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+        "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
+        },
+        "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
+        },
+        "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"
+          }
         }
       }
     },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dev": true,
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
     "css-loader": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
@@ -3079,12 +2782,6 @@
         "logalot": "^2.1.0"
       }
     },
-    "cyclist": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
-      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
-      "dev": true
-    },
     "date-fns": {
       "version": "2.15.0",
       "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz",
@@ -3097,15 +2794,6 @@
       "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
       "dev": true
     },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
     "decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
@@ -3256,100 +2944,18 @@
         "object-keys": "^1.0.12"
       }
     },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "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
-        }
-      }
-    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
       "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
       "dev": true
     },
-    "des.js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
-      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
     "detect-libc": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
       "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
       "dev": true
     },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
     "dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz",
@@ -3367,12 +2973,83 @@
         }
       }
     },
-    "domain-browser": {
+    "dom-serializer": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz",
+      "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+          "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.1.0"
+          }
+        }
+      }
+    },
+    "domelementtype": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
       "dev": true
     },
+    "domhandler": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
+      "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1"
+      }
+    },
+    "domutils": {
+      "version": "2.4.4",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz",
+      "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+          "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.1.0"
+          }
+        }
+      }
+    },
+    "dot-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+      "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
+      }
+    },
     "download": {
       "version": "6.2.5",
       "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz",
@@ -3421,53 +3098,48 @@
         }
       }
     },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "dev": true
+    },
     "duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
       "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
       "dev": true
     },
-    "duplexify": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
-      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+    "echarts": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.0.0.tgz",
+      "integrity": "sha512-6SDcJbLVOcfQyjPg+spNU1+JVrkU1B9fzUa5tpbP/mMNUPyigCOJwcEIQAJSbp9jt5UP3EXvQR0vtYXIo9AjyA==",
       "dev": true,
       "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
+        "tslib": "1.10.0",
+        "zrender": "5.0.1"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+          "dev": true
+        }
       }
     },
+    "echarts-stat": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/echarts-stat/-/echarts-stat-1.2.0.tgz",
+      "integrity": "sha512-zLd7Kgs+tuTSeaK0VQEMNmnMivEkhvHIk1gpBtLzpRerfcIQ+Bd5XudOMmtwpaTc1WDZbA7d1V//iiBccR46Qg==",
+      "dev": true
+    },
     "electron-to-chromium": {
       "version": "1.3.528",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.528.tgz",
       "integrity": "sha512-PEwLXeD679xF6+hYL32QBMzpyEr/H2v/K2v8N0ANkVvSrw2kblSgM7xmLYvzQTUy9d6V5SeV89lbwFqpatNqmw==",
       "dev": true
     },
-    "elliptic": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
-      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
     "emojis-list": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
@@ -3484,37 +3156,44 @@
       }
     },
     "enhanced-resolve": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
-      "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz",
+      "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==",
       "dev": true,
       "requires": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.5.0",
-        "tapable": "^1.0.0"
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
       },
       "dependencies": {
-        "memory-fs": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
-          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
-          "dev": true,
-          "requires": {
-            "errno": "^0.1.3",
-            "readable-stream": "^2.0.1"
-          }
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+          "dev": true
         }
       }
     },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+    "enquirer": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
       "dev": true,
       "requires": {
-        "prr": "~1.0.1"
+        "ansi-colors": "^4.1.1"
       }
     },
+    "entities": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+      "dev": true
+    },
+    "envinfo": {
+      "version": "7.7.3",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
+      "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
+      "dev": true
+    },
     "error-ex": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -3524,6 +3203,12 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "esbuild": {
+      "version": "0.8.29",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.29.tgz",
+      "integrity": "sha512-UDsEoeXuctVgG2hEts1Hwq2jYDGqV7nksEHEZaiCy2v+lXF5ButX4ErPAJAFi5ZNKKW+6Pom93pArV7hki6HnQ==",
+      "dev": true
+    },
     "escalade": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
@@ -3537,15 +3222,21 @@
       "dev": true
     },
     "eslint-scope": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
-      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "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,
       "requires": {
-        "esrecurse": "^4.1.0",
+        "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
       }
     },
+    "eslint-visitor-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+      "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+      "dev": true
+    },
     "esprima": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -3553,12 +3244,20 @@
       "dev": true
     },
     "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "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,
       "requires": {
-        "estraverse": "^4.1.0"
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
       }
     },
     "estraverse": {
@@ -3579,16 +3278,6 @@
       "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
       "dev": true
     },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dev": true,
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
     "execa": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
@@ -3632,56 +3321,12 @@
         "pify": "^2.2.0"
       }
     },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
     "expand-template": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
       "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
       "dev": true
     },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
     "ext-list": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
@@ -3701,102 +3346,10 @@
         "sort-keys-length": "^1.0.0"
       }
     },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "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
-        }
-      }
-    },
     "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "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
     },
     "fast-glob": {
@@ -3818,6 +3371,12 @@
       "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
       "dev": true
     },
+    "fastest-levenshtein": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+      "dev": true
+    },
     "fastq": {
       "version": "1.6.0",
       "resolved": "https://registry.npm.taobao.org/fastq/download/fastq-1.6.0.tgz",
@@ -3836,12 +3395,6 @@
         "pend": "~1.2.0"
       }
     },
-    "figgy-pudding": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
-      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
-      "dev": true
-    },
     "figures": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
@@ -3862,13 +3415,6 @@
         "schema-utils": "^2.5.0"
       }
     },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true,
-      "optional": true
-    },
     "filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -3925,154 +3471,6 @@
         "semver-regex": "^2.0.0"
       }
     },
-    "findup-sync": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
-      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "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
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        }
-      }
-    },
-    "flush-write-stream": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
-      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.3.6"
-      }
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
     "from2": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
@@ -4100,30 +3498,11 @@
         "universalify": "^0.1.0"
       }
     },
-    "fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
-      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -4183,12 +3562,6 @@
         "pinkie-promise": "^2.0.0"
       }
     },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
     "github-from-package": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -4217,46 +3590,11 @@
         "is-glob": "^4.0.1"
       }
     },
-    "global-modules": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^3.0.0"
-      },
-      "dependencies": {
-        "global-prefix": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
-          "dev": true,
-          "requires": {
-            "ini": "^1.3.5",
-            "kind-of": "^6.0.2",
-            "which": "^1.3.1"
-          }
-        },
-        "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
-        }
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
+    "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
     },
     "globals": {
       "version": "11.12.0",
@@ -4336,6 +3674,15 @@
         }
       }
     },
+    "gzip-size": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.2"
+      }
+    },
     "has-ansi": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@@ -4378,146 +3725,145 @@
       "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
       "dev": true
     },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hash-base": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
-      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "safe-buffer": "^5.2.0"
-      },
-      "dependencies": {
-        "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"
-          }
-        },
-        "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
-        }
-      }
-    },
     "hash-sum": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
       "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
       "dev": true
     },
-    "hash.js": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
-      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
     "he": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
       "dev": true
     },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "dev": true,
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
     "hosted-git-info": {
       "version": "2.8.5",
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
       "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
       "dev": true
     },
+    "html-loader": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz",
+      "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==",
+      "dev": true,
+      "requires": {
+        "html-minifier-terser": "^5.1.1",
+        "htmlparser2": "^4.1.0",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "dependencies": {
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+          "dev": true
+        },
+        "json5": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+          "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.6",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
+    "html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+      "dev": true,
+      "requires": {
+        "camel-case": "^4.1.1",
+        "clean-css": "^4.2.3",
+        "commander": "^4.1.1",
+        "he": "^1.2.0",
+        "param-case": "^3.0.3",
+        "relateurl": "^0.2.7",
+        "terser": "^4.6.3"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+          "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+          "dev": true
+        },
+        "terser": {
+          "version": "4.8.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+          "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+          "dev": true,
+          "requires": {
+            "commander": "^2.20.0",
+            "source-map": "~0.6.1",
+            "source-map-support": "~0.5.12"
+          },
+          "dependencies": {
+            "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
+            }
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+      "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.0.0",
+        "domutils": "^2.0.0",
+        "entities": "^2.0.0"
+      }
+    },
     "http-cache-semantics": {
       "version": "3.8.1",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
       "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
       "dev": true
     },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+    "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
     },
     "icss-utils": {
@@ -4535,12 +3881,6 @@
       "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
       "dev": true
     },
-    "iferr": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
-      "dev": true
-    },
     "ignore": {
       "version": "5.1.4",
       "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.4.tgz",
@@ -4554,21 +3894,60 @@
       "dev": true
     },
     "import-local": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
       "dev": true,
       "requires": {
-        "pkg-dir": "^3.0.0",
-        "resolve-cwd": "^2.0.0"
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        }
       }
     },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
     "indent-string": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
@@ -4584,12 +3963,6 @@
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
       "dev": true
     },
-    "infer-owner": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
-    },
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -4611,9 +3984,9 @@
       "dev": true
     },
     "interpret": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
-      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
       "dev": true
     },
     "into-stream": {
@@ -4641,65 +4014,12 @@
       "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
       "dev": true
     },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
-    },
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
       "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
       "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,
-      "optional": true,
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
     "is-docker": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
@@ -4769,15 +4089,6 @@
       "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
       "dev": true
     },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
     "is-retry-allowed": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
@@ -4796,18 +4107,6 @@
       "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
       "dev": true
     },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-      "dev": true
-    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592125418&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz",
@@ -4820,12 +4119,6 @@
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
       "dev": true
     },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
     "isurl": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
@@ -4836,6 +4129,34 @@
         "is-object": "^1.0.1"
       }
     },
+    "jest-worker": {
+      "version": "26.6.2",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4903,15 +4224,6 @@
         "json-buffer": "3.0.0"
       }
     },
-    "kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "requires": {
-        "is-buffer": "^1.1.5"
-      }
-    },
     "lcid": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
@@ -4955,9 +4267,9 @@
       }
     },
     "loader-runner": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
-      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
+      "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
       "dev": true
     },
     "loader-utils": {
@@ -4971,6 +4283,15 @@
         "json5": "^1.0.1"
       }
     },
+    "locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^5.0.0"
+      }
+    },
     "lodash": {
       "version": "4.17.19",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
@@ -5011,6 +4332,23 @@
         "signal-exit": "^3.0.0"
       }
     },
+    "lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+      "dev": true,
+      "requires": {
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
+      }
+    },
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -5057,54 +4395,18 @@
         }
       }
     },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
     "map-obj": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
       "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
       "dev": true
     },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
     "marked": {
       "version": "0.3.19",
       "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
       "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
       "dev": true
     },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
     "meow": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
@@ -5132,6 +4434,12 @@
         "source-map": "^0.6.1"
       }
     },
+    "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.3.0",
       "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.3.0.tgz",
@@ -5148,24 +4456,6 @@
         "picomatch": "^2.0.5"
       }
     },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
     "mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -5178,6 +4468,29 @@
       "integrity": "sha1-PiUpB7THrbkGWXtLZWNics+ee6w=",
       "dev": true
     },
+    "mime-types": {
+      "version": "2.1.28",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+      "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.45.0"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.45.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+          "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
+          "dev": true
+        }
+      }
+    },
+    "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
+    },
     "mimic-response": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
@@ -5185,64 +4498,61 @@
       "dev": true
     },
     "mini-css-extract-plugin": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
-      "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz",
+      "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==",
       "dev": true,
       "requires": {
-        "loader-utils": "^1.1.0",
-        "normalize-url": "1.9.1",
-        "schema-utils": "^1.0.0",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0",
         "webpack-sources": "^1.1.0"
       },
       "dependencies": {
-        "normalize-url": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-          "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+          "dev": true
+        },
+        "json5": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
           "dev": true,
           "requires": {
-            "object-assign": "^4.0.1",
-            "prepend-http": "^1.0.0",
-            "query-string": "^4.1.0",
-            "sort-keys": "^1.0.0"
+            "minimist": "^1.2.5"
           }
         },
-        "query-string": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
-          "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
           "dev": true,
           "requires": {
-            "object-assign": "^4.1.0",
-            "strict-uri-encode": "^1.0.0"
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
           }
         },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
         "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+          "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
           "dev": true,
           "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
+            "@types/json-schema": "^7.0.6",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         }
       }
     },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
-      "dev": true
-    },
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -5257,88 +4567,12 @@
       "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
       "dev": true
     },
-    "mississippi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
-      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^3.0.0",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "dev": true,
-      "requires": {
-        "minimist": "0.0.8"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        }
-      }
-    },
     "mkdirp-classic": {
       "version": "0.5.3",
       "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
       "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
       "dev": true
     },
-    "move-concurrently": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
-      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
     "mz": {
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -5349,40 +4583,6 @@
         "thenify-all": "^1.0.0"
       }
     },
-    "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz",
-      "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=",
-      "dev": true,
-      "optional": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "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
-        }
-      }
-    },
     "napi-build-utils": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
@@ -5401,6 +4601,24 @@
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
+    "no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+      "dev": true,
+      "requires": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
+      }
+    },
     "node-abi": {
       "version": "2.19.1",
       "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz",
@@ -5416,56 +4634,6 @@
       "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==",
       "dev": true
     },
-    "node-libs-browser": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
-      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
-      "dev": true,
-      "requires": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^3.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.1",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.11.0",
-        "vm-browserify": "^1.0.1"
-      },
-      "dependencies": {
-        "buffer": {
-          "version": "4.9.2",
-          "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
-          "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
-          "dev": true,
-          "requires": {
-            "base64-js": "^1.0.2",
-            "ieee754": "^1.1.4",
-            "isarray": "^1.0.0"
-          }
-        },
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
     "node-modules-regexp": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
@@ -5590,43 +4758,12 @@
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true
     },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
     "object.assign": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
@@ -5639,15 +4776,6 @@
         "object-keys": "^1.0.11"
       }
     },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -5656,6 +4784,15 @@
         "wrappy": "1"
       }
     },
+    "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"
+      }
+    },
     "open": {
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz",
@@ -5677,6 +4814,12 @@
         }
       }
     },
+    "opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+      "dev": true
+    },
     "optimist": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@@ -5695,12 +4838,6 @@
         }
       }
     },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
-      "dev": true
-    },
     "os-filter-obj": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz",
@@ -5755,6 +4892,26 @@
         "p-try": "^2.0.0"
       }
     },
+    "p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^3.0.2"
+      },
+      "dependencies": {
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "dev": true,
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        }
+      }
+    },
     "p-map-series": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz",
@@ -5785,35 +4942,22 @@
       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true
     },
-    "pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
-      "dev": true
-    },
-    "parallel-transform": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
-      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+    "param-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
       "dev": true,
       "requires": {
-        "cyclist": "^1.0.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
-      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
-      "dev": true,
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
       }
     },
     "parse-json": {
@@ -5825,30 +4969,23 @@
         "error-ex": "^1.2.0"
       }
     },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+    "pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
       "dev": true,
-      "optional": true
+      "requires": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+          "dev": true
+        }
+      }
     },
     "path-exists": {
       "version": "2.1.0",
@@ -5887,19 +5024,6 @@
         "pinkie-promise": "^2.0.0"
       }
     },
-    "pbkdf2": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
-      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
-      "dev": true,
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
     "pend": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -5941,6 +5065,23 @@
         "node-modules-regexp": "^1.0.0"
       }
     },
+    "pixelmatch": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz",
+      "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==",
+      "dev": true,
+      "requires": {
+        "pngjs": "^4.0.1"
+      },
+      "dependencies": {
+        "pngjs": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz",
+          "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==",
+          "dev": true
+        }
+      }
+    },
     "pkg-dir": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
@@ -5986,10 +5127,10 @@
         }
       }
     },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+    "pngjs": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz",
+      "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==",
       "dev": true
     },
     "postcss": {
@@ -6202,16 +5343,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
-      "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
-      "dev": true,
-      "optional": true
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
       "dev": true
     },
     "process-nextick-args": {
@@ -6220,52 +5354,18 @@
       "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=",
       "dev": true
     },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
-    },
     "proto-list": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
       "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
       "dev": true
     },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
-    },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
       "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
       "dev": true
     },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
-          "dev": true
-        }
-      }
-    },
     "pump": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -6276,29 +5376,6 @@
         "once": "^1.3.1"
       }
     },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      },
-      "dependencies": {
-        "pump": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        }
-      }
-    },
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
@@ -6322,18 +5399,6 @@
         "strict-uri-encode": "^1.0.0"
       }
     },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "dev": true
-    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -6343,16 +5408,6 @@
         "safe-buffer": "^5.1.0"
       }
     },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
     "rc": {
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -6401,23 +5456,13 @@
         "util-deprecate": "~1.0.1"
       }
     },
-    "readdirp": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
-      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+    "rechoir": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+      "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "picomatch": "^2.2.1"
-      },
-      "dependencies": {
-        "picomatch": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-          "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-          "dev": true,
-          "optional": true
-        }
+        "resolve": "^1.9.0"
       }
     },
     "redent": {
@@ -6460,16 +5505,6 @@
         "@babel/runtime": "^7.8.4"
       }
     },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
     "regexpu-core": {
       "version": "4.7.0",
       "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
@@ -6507,23 +5542,10 @@
         }
       }
     },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true,
-      "optional": true
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
       "dev": true
     },
     "repeating": {
@@ -6562,47 +5584,18 @@
       }
     },
     "resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
       "dev": true,
       "requires": {
-        "resolve-from": "^3.0.0"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "dependencies": {
-        "global-modules": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-          "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-          "dev": true,
-          "requires": {
-            "global-prefix": "^1.0.1",
-            "is-windows": "^1.0.1",
-            "resolve-dir": "^1.0.0"
-          }
-        }
+        "resolve-from": "^5.0.0"
       }
     },
     "resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-      "dev": true
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "dev": true
     },
     "responselike": {
@@ -6614,52 +5607,18 @@
         "lowercase-keys": "^1.0.0"
       }
     },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
     "reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz",
       "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=",
       "dev": true
     },
-    "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz",
-      "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
     "run-parallel": {
       "version": "1.1.9",
       "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz",
       "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=",
       "dev": true
     },
-    "run-queue": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
-      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1"
-      }
-    },
     "rxjs": {
       "version": "6.6.2",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
@@ -6675,15 +5634,6 @@
       "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
       "dev": true
     },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
     "sass.js": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/sass.js/-/sass.js-0.11.1.tgz",
@@ -6763,6 +5713,12 @@
         }
       }
     },
+    "seedrandom": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
+      "dev": true
+    },
     "seek-bzip": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
@@ -6794,9 +5750,9 @@
       }
     },
     "serialize-javascript": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
-      "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
       "dev": true,
       "requires": {
         "randombytes": "^2.1.0"
@@ -6808,45 +5764,6 @@
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
       "dev": true
     },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
-      "dev": true
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
     "sharp": {
       "version": "0.26.2",
       "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.26.2.tgz",
@@ -6944,120 +5861,31 @@
         }
       }
     },
+    "sirv": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.10.tgz",
+      "integrity": "sha512-H5EZCoZaggEUQy8ocKsF7WAToGuZhjJlLvM3XOef46CbdIgbNeQ1p32N1PCuCjkVYwrAVOSMacN6CXXgIzuspg==",
+      "dev": true,
+      "requires": {
+        "@polka/url": "^1.0.0-next.9",
+        "mime": "^2.3.1",
+        "totalist": "^1.0.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.7",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz",
+          "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==",
+          "dev": true
+        }
+      }
+    },
     "slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz",
       "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=",
       "dev": true
     },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        },
-        "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
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      }
-    },
     "sort-keys": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
@@ -7088,19 +5916,6 @@
       "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
       "dev": true
     },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
     "source-map-support": {
       "version": "0.5.19",
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
@@ -7111,12 +5926,6 @@
         "source-map": "^0.6.0"
       }
     },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
     "spawn-command": {
       "version": "0.0.2-1",
       "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -7155,15 +5964,6 @@
       "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
       "dev": true
     },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -7208,75 +6008,6 @@
         }
       }
     },
-    "ssri": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
-      "dev": true,
-      "requires": {
-        "figgy-pudding": "^3.5.1"
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "stream-browserify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
-      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-each": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
-      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "stream-http": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
-      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
-      "dev": true,
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "stream-shift": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
-      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
-      "dev": true
-    },
     "strict-uri-encode": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
@@ -7342,6 +6073,12 @@
       "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
       "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
+    },
     "strip-indent": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
@@ -7367,15 +6104,39 @@
       }
     },
     "style-loader": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz",
-      "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
+      "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
       "dev": true,
       "requires": {
         "loader-utils": "^2.0.0",
-        "schema-utils": "^2.6.6"
+        "schema-utils": "^3.0.0"
       },
       "dependencies": {
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+          "dev": true
+        },
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "dev": 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"
+          }
+        },
+        "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
+        },
         "json5": {
           "version": "2.1.3",
           "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
@@ -7401,13 +6162,24 @@
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
           "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
           "dev": true
+        },
+        "schema-utils": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+          "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.6",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
         }
       }
     },
     "sucrase": {
-      "version": "3.15.0",
-      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.15.0.tgz",
-      "integrity": "sha512-05TJOUfMgckH7wKqfk/1p4G6q16nIeW/GHQwD44vkT0mQMqqzgfHCwkX3whNmwyOo7nVF0jDLwVu/qOBTtsscw==",
+      "version": "3.17.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.17.0.tgz",
+      "integrity": "sha512-wtiqaokYRjFSSrv8fQu7pThKTIZSLwiffW+PHQG52hlI8eJO47v1tXbKt6fYb8Z1kCyuCkNH9etpTUebb7g+pA==",
       "requires": {
         "commander": "^4.0.0",
         "glob": "7.1.6",
@@ -7434,9 +6206,9 @@
       }
     },
     "tapable": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
-      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
+      "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
       "dev": true
     },
     "tar-fs": {
@@ -7520,42 +6292,80 @@
       }
     },
     "terser": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
-      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz",
+      "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
-        "source-map": "~0.6.1",
-        "source-map-support": "~0.5.12"
+        "source-map": "~0.7.2",
+        "source-map-support": "~0.5.19"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        }
       }
     },
     "terser-webpack-plugin": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
-      "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
+      "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
       "dev": true,
       "requires": {
-        "cacache": "^12.0.2",
-        "find-cache-dir": "^2.1.0",
-        "is-wsl": "^1.1.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^3.1.0",
+        "jest-worker": "^26.6.1",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^3.0.0",
+        "serialize-javascript": "^5.0.1",
         "source-map": "^0.6.1",
-        "terser": "^4.1.2",
-        "webpack-sources": "^1.4.0",
-        "worker-farm": "^1.7.0"
+        "terser": "^5.3.8"
       },
       "dependencies": {
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+          "dev": true
+        },
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "dev": true,
           "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "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
+        },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "dev": true,
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "schema-utils": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+          "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.6",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         }
       }
@@ -7582,37 +6392,12 @@
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
     "timed-out": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
       "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
       "dev": true
     },
-    "timers-browserify": {
-      "version": "2.0.11",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
-      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
-      "dev": true,
-      "requires": {
-        "setimmediate": "^1.0.4"
-      }
-    },
-    "to-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
-      "dev": true
-    },
     "to-buffer": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
@@ -7625,27 +6410,6 @@
       "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
       "dev": true
     },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
     "to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
@@ -7655,6 +6419,12 @@
         "is-number": "^7.0.0"
       }
     },
+    "totalist": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
+      "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
+      "dev": true
+    },
     "tree-kill": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -7687,11 +6457,14 @@
       "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
       "dev": true
     },
-    "tty-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
-      "dev": true
+    "tsutils": {
+      "version": "3.18.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.18.0.tgz",
+      "integrity": "sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
     },
     "tunnel-agent": {
       "version": "0.6.0",
@@ -7702,10 +6475,10 @@
         "safe-buffer": "^5.0.1"
       }
     },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+    "typescript": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
+      "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
       "dev": true
     },
     "unbzip2-stream": {
@@ -7746,95 +6519,18 @@
       "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
       "dev": true
     },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
-      }
-    },
     "uniq": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
       "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
       "dev": true
     },
-    "unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-      "dev": true,
-      "requires": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "unique-slug": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
     "universalify": {
       "version": "0.1.2",
       "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz",
       "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=",
       "dev": true
     },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true,
-      "optional": true
-    },
     "uri-js": {
       "version": "4.2.2",
       "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz",
@@ -7844,30 +6540,6 @@
         "punycode": "^2.1.0"
       }
     },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        }
-      }
-    },
     "url-parse-lax": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
@@ -7883,29 +6555,6 @@
       "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
       "dev": true
     },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "util": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
-      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
-        }
-      }
-    },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -7919,9 +6568,9 @@
       "dev": true
     },
     "v8-compile-cache": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+      "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
       "dev": true
     },
     "validate-npm-package-license": {
@@ -7939,12 +6588,6 @@
       "resolved": "https://registry.npmjs.org/vanilla-lazyload/-/vanilla-lazyload-12.5.1.tgz",
       "integrity": "sha512-gB986dXslHqkbYMDnwfIlKHl++lLADAEZhI6FNZy7gtVddR+1N69xkOI2vRAJssr6QzmKPCfZu4btEHWjG0pNA=="
     },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
-      "dev": true
-    },
     "vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
@@ -7957,9 +6600,9 @@
       "integrity": "sha512-ZiAOoeR4d/JtKpbjipx3I80ey7cYG1ki5gQ7HwzWm4YFio9brA15BEYHjalEoBaEfzF5OBEZP+Y2MvAaWnyXXg=="
     },
     "vue-loader": {
-      "version": "15.9.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz",
-      "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==",
+      "version": "15.9.6",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz",
+      "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==",
       "dev": true,
       "requires": {
         "@vue/component-compiler-utils": "^3.1.0",
@@ -8004,645 +6647,330 @@
       "dev": true
     },
     "watchpack": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
-      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz",
+      "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==",
       "dev": true,
       "requires": {
-        "chokidar": "^3.4.1",
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0",
-        "watchpack-chokidar2": "^2.0.0"
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
       }
     },
-    "watchpack-chokidar2": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
-      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+    "webpack": {
+      "version": "5.11.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz",
+      "integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "chokidar": "^2.1.8"
+        "@types/eslint-scope": "^3.7.0",
+        "@types/estree": "^0.0.45",
+        "@webassemblyjs/ast": "1.9.1",
+        "@webassemblyjs/helper-module-context": "1.9.1",
+        "@webassemblyjs/wasm-edit": "1.9.1",
+        "@webassemblyjs/wasm-parser": "1.9.1",
+        "acorn": "^8.0.4",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.3.1",
+        "eslint-scope": "^5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.4",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^4.1.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "pkg-dir": "^5.0.0",
+        "schema-utils": "^3.0.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.0.3",
+        "watchpack": "^2.0.0",
+        "webpack-sources": "^2.1.1"
       },
       "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+        "@types/json-schema": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+          "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+          "dev": true
+        },
+        "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,
           "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+        "browserslist": {
+          "version": "4.16.1",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz",
+          "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==",
           "dev": true,
-          "optional": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "optional": true,
           "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
+            "caniuse-lite": "^1.0.30001173",
+            "colorette": "^1.2.1",
+            "electron-to-chromium": "^1.3.634",
+            "escalade": "^3.1.1",
+            "node-releases": "^1.1.69"
           }
         },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+        "caniuse-lite": {
+          "version": "1.0.30001173",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001173.tgz",
+          "integrity": "sha512-R3aqmjrICdGCTAnSXtNyvWYMK3YtV5jwudbq0T7nN9k4kmE4CBuwPqyJ+KBzepSTh0huivV2gLbSMEzTTmfeYw==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.634",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.634.tgz",
+          "integrity": "sha512-QPrWNYeE/A0xRvl/QP3E0nkaEvYUvH3gM04ZWYtIa6QlSpEetRlRI1xvQ7hiMIySHHEV+mwDSX8Kj4YZY6ZQAw==",
+          "dev": true
+        },
+        "escalade": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+          "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+          "dev": true
+        },
+        "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
+        },
+        "find-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
           }
         },
-        "fill-range": {
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.69",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz",
+          "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==",
+          "dev": true
+        },
+        "path-exists": {
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+          "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
+            "find-up": "^5.0.0"
           }
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-number": {
+        "schema-utils": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+          "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
+            "@types/json-schema": "^7.0.6",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
         },
-        "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==",
+        "webpack-sources": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+          "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
           "dev": true,
-          "optional": true
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "optional": true,
           "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
+            "source-list-map": "^2.0.1",
+            "source-map": "^0.6.1"
           }
         }
       }
     },
-    "webpack": {
-      "version": "4.44.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
-      "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
+    "webpack-bundle-analyzer": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz",
+      "integrity": "sha512-J3TPm54bPARx6QG8z4cKBszahnUglcv70+N+8gUqv2I5KOFHJbzBiLx+pAp606so0X004fxM7hqRu10MLjJifA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.9.0",
-        "@webassemblyjs/helper-module-context": "1.9.0",
-        "@webassemblyjs/wasm-edit": "1.9.0",
-        "@webassemblyjs/wasm-parser": "1.9.0",
-        "acorn": "^6.4.1",
-        "ajv": "^6.10.2",
-        "ajv-keywords": "^3.4.1",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.3.0",
-        "eslint-scope": "^4.0.3",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^2.4.0",
-        "loader-utils": "^1.2.3",
-        "memory-fs": "^0.4.1",
-        "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.3",
-        "neo-async": "^2.6.1",
-        "node-libs-browser": "^2.2.1",
-        "schema-utils": "^1.0.0",
-        "tapable": "^1.1.3",
-        "terser-webpack-plugin": "^1.4.3",
-        "watchpack": "^1.7.4",
-        "webpack-sources": "^1.4.1"
+        "acorn": "^8.0.4",
+        "acorn-walk": "^8.0.0",
+        "chalk": "^4.1.0",
+        "commander": "^6.2.0",
+        "gzip-size": "^6.0.0",
+        "lodash": "^4.17.20",
+        "opener": "^1.5.2",
+        "sirv": "^1.0.7",
+        "ws": "^7.3.1"
       },
       "dependencies": {
-        "acorn": {
-          "version": "6.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
-          "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
-          "dev": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+        "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": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
+            "color-convert": "^2.0.1"
           }
         },
-        "fill-range": {
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "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": "6.2.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+          "dev": true
+        },
+        "has-flag": {
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "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==",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        },
-        "minimist": {
-          "version": "1.2.5",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+        "lodash": {
+          "version": "4.17.20",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
           "dev": true
         },
-        "mkdirp": {
-          "version": "0.5.5",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+        "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": {
-            "minimist": "^1.2.5"
-          }
-        },
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
+            "has-flag": "^4.0.0"
           }
         }
       }
     },
     "webpack-cli": {
-      "version": "3.3.12",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz",
-      "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz",
+      "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2",
-        "cross-spawn": "^6.0.5",
-        "enhanced-resolve": "^4.1.1",
-        "findup-sync": "^3.0.0",
-        "global-modules": "^2.0.0",
-        "import-local": "^2.0.0",
-        "interpret": "^1.4.0",
-        "loader-utils": "^1.4.0",
-        "supports-color": "^6.1.0",
-        "v8-compile-cache": "^2.1.1",
-        "yargs": "^13.3.2"
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/info": "^1.2.1",
+        "@webpack-cli/serve": "^1.2.1",
+        "colorette": "^1.2.1",
+        "commander": "^6.2.0",
+        "enquirer": "^2.3.6",
+        "execa": "^5.0.0",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "v8-compile-cache": "^2.2.0",
+        "webpack-merge": "^4.2.2"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+        "commander": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
           "dev": true
         },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "5.5.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-              "dev": true,
-              "requires": {
-                "has-flag": "^3.0.0"
-              }
-            }
-          }
-        },
-        "cliui": {
+        "execa": {
           "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+          "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
           "dev": true,
           "requires": {
-            "string-width": "^3.1.0",
-            "strip-ansi": "^5.2.0",
-            "wrap-ansi": "^5.1.0"
+            "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"
           }
         },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+        "get-stream": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+          "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
           "dev": true
         },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
+        "is-stream": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
           "dev": true
         },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+        "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": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
+            "path-key": "^3.0.0"
           }
         },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+        "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
         },
-        "require-main-filename": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+        "signal-exit": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+          "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
           "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        },
-        "which-module": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-          "dev": true
-        },
-        "wrap-ansi": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.0",
-            "string-width": "^3.0.0",
-            "strip-ansi": "^5.0.0"
-          }
-        },
-        "y18n": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-          "dev": true
-        },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
         }
       }
     },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
     "webpack-sources": {
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
@@ -8689,15 +7017,6 @@
       "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
       "dev": true
     },
-    "worker-farm": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
-      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
-      "dev": true,
-      "requires": {
-        "errno": "~0.1.7"
-      }
-    },
     "wrap-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
@@ -8713,6 +7032,12 @@
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
+    "ws": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
+      "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==",
+      "dev": true
+    },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -8770,6 +7095,29 @@
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
       }
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
+    },
+    "zrender": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.0.1.tgz",
+      "integrity": "sha512-i8FNCKAKfF0EfZFJ6w2p30umBrCyy481/PePFQqPdtNgCl5Hp5z7/dovqb7soEoFkhNvhjJ/J4W9zFALeae6yA==",
+      "dev": true,
+      "requires": {
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+          "dev": true
+        }
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index bd67a94..0b15f2e 100644
--- a/package.json
+++ b/package.json
@@ -4,45 +4,61 @@
   "private": true,
   "scripts": {
     "build": "npx webpack --config build/webpack.config.js --mode production",
-    "watch": "npx webpack --config build/webpack.config.js --mode development --devtool sourcemap --watch",
+    "watch": "npx webpack --config build/webpack.config.js --mode development --devtool source-map --watch",
     "localsite": "npm run build && node build/copyResource.js --env localsite",
     "release": "npm run build && node build/copyResource.js --env asf",
     "dev": "npx concurrently --kill-others \"npm:watch\" \"npm:server\"",
-    "build:example": "node tool/build-example.js",
+    "build:example": "node tool/build-example.js && node tool/build-example.js --source data-gl",
+    "test:e2e": "node e2e/main.js --bundler webpack -m",
+    "test:e2e:esbuild": "node e2e/main.js --bundler esbuild -m",
     "server": "node build/server.js"
   },
   "devDependencies": {
     "@babel/core": "^7.10.2",
     "@babel/preset-env": "^7.10.2",
+    "@typescript-eslint/typescript-estree": "^4.10.0",
     "argparse": "^1.0.9",
     "babel-loader": "^8.1.0",
     "chalk": "^3.0.0",
     "concurrently": "^5.3.0",
     "css-loader": "^3.5.3",
     "cwebp-bin": "^6.1.1",
+    "download-git-repo": "^3.0.2",
+    "echarts": "^5.0.0",
+    "echarts-stat": "^1.2.0",
+    "esbuild": "^0.8.34",
     "file-loader": "^4.3.0",
     "fs-extra": "^8.1.0",
     "globby": "^10.0.1",
     "gray-matter": "^4.0.2",
+    "html-loader": "^1.3.2",
     "marked": "^0.3.12",
-    "mini-css-extract-plugin": "^0.8.2",
+    "mini-css-extract-plugin": "^1.3.3",
     "node-static": "^0.7.11",
     "open": "^7.1.0",
+    "pixelmatch": "^5.2.1",
+    "pngjs": "^6.0.0",
+    "prettier": "^2.2.1",
     "sass.js": "^0.11.1",
     "sassjs-loader": "^2.0.0",
+    "seedrandom": "^3.0.5",
     "sharp": "^0.26.2",
-    "style-loader": "^1.2.1",
-    "vue-loader": "^15.9.2",
+    "shelljs": "^0.8.4",
+    "style-loader": "^2.0.0",
+    "typescript": "^4.1.3",
+    "vue-loader": "^15.9.6",
     "vue-template-compiler": "^2.6.11",
-    "webpack": "^4.43.0",
-    "webpack-cli": "^3.3.11",
+    "webpack": "^5.11.1",
+    "webpack-bundle-analyzer": "^4.3.0",
+    "webpack-cli": "^4.3.1",
     "yargs": "^6.6.0"
   },
   "dependencies": {
+    "@lang/object-visualizer": "^3.1.1",
     "lodash": "^4.17.19",
     "resize-detector": "^0.2.2",
     "scroll-into-view": "^1.14.2",
-    "sucrase": "^3.15.0",
+    "sucrase": "^3.17.0",
     "vanilla-lazyload": "^12.5.1",
     "vue-i18n": "^8.18.2",
     "vue-scrollactive": "^0.9.3"
diff --git a/public/data-gl/bar3d-dataset.js b/public/data-gl/bar3d-dataset.js
index c975213..e37a4a3 100644
--- a/public/data-gl/bar3d-dataset.js
+++ b/public/data-gl/bar3d-dataset.js
@@ -2,7 +2,6 @@
 title: 3D Bar with Dataset
 category: bar3D
 titleCN: 使用 dataset 为三维柱状图设置数据
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
diff --git a/public/data-gl/bar3d-music-visualization.js b/public/data-gl/bar3d-music-visualization.js
index 711c70c..17c1548 100644
--- a/public/data-gl/bar3d-music-visualization.js
+++ b/public/data-gl/bar3d-music-visualization.js
@@ -2,7 +2,6 @@
 title: Music Visualization
 category: bar3D
 titleCN: Music Visualization
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 var UPDATE_DURATION = 100;
diff --git a/public/data-gl/bar3d-myth.js b/public/data-gl/bar3d-myth.js
index 315930f..5b62671 100644
--- a/public/data-gl/bar3d-myth.js
+++ b/public/data-gl/bar3d-myth.js
@@ -81,6 +81,7 @@
             shading: 'lambert',
             barSize: 0.8,
             silent: true,
+            dimensions: ['x', 'y', 'z'],
             itemStyle: {
                 color: function (params) {
                     var i = params.dataIndex;
diff --git a/public/data-gl/bar3d-noise-modified-from-marpi-demo.js b/public/data-gl/bar3d-noise-modified-from-marpi-demo.js
index 3ba36d7..be0a4d5 100644
--- a/public/data-gl/bar3d-noise-modified-from-marpi-demo.js
+++ b/public/data-gl/bar3d-noise-modified-from-marpi-demo.js
@@ -15,7 +15,7 @@
 
 function initVisualizer() {
 
-    config = {
+    var config = {
         numWaves: 2,
         randomize: randomize,
         color1: '#000',
diff --git a/public/data-gl/bar3d-punch-card.js b/public/data-gl/bar3d-punch-card.js
index 0a30c91..c9b37af 100644
--- a/public/data-gl/bar3d-punch-card.js
+++ b/public/data-gl/bar3d-punch-card.js
@@ -2,7 +2,6 @@
 title: Bar3D - Punch Card
 category: bar3D
 titleCN: Bar3D - Punch Card
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
@@ -59,18 +58,14 @@
         shading: 'lambert',
 
         label: {
-            textStyle: {
-                fontSize: 16,
-                borderWidth: 1
-            }
+            fontSize: 16,
+            borderWidth: 1
         },
 
         emphasis: {
             label: {
-                textStyle: {
-                    fontSize: 20,
-                    color: '#900'
-                }
+                fontSize: 20,
+                color: '#900'
             },
             itemStyle: {
                 color: '#900'
diff --git a/public/data-gl/bar3d-voxelize-image.js b/public/data-gl/bar3d-voxelize-image.js
index 2517924..611425d 100644
--- a/public/data-gl/bar3d-voxelize-image.js
+++ b/public/data-gl/bar3d-voxelize-image.js
@@ -2,11 +2,10 @@
 title: Voxelize image
 category: bar3D
 titleCN: Voxelize image
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
-var canvas = document.createElement("canvas");
-var ctx = canvas.getContext("2d");
+var canvas = document.createElement('canvas');
+var ctx = canvas.getContext('2d');
 
 var imgData;
 var currentImg;
@@ -16,7 +15,7 @@
     scale: 0.3,
     roughness: 0,
     metalness: 1,
-    projection: "orthographic",
+    projection: 'orthographic',
     depthOfField: 4,
     lockY: false,
     move: true,
@@ -37,22 +36,22 @@
 
 option = {
     tooltip: {},
-    backgroundColor: "#000",
+    backgroundColor: '#000',
     xAxis3D: {
-        type: "value"
+        type: 'value'
     },
     yAxis3D: {
-        type: "value"
+        type: 'value'
     },
     zAxis3D: {
-        type: "value",
+        type: 'value',
         min: 0,
         max: 100
     },
     grid3D: {
         show: false,
         viewControl: {
-            projection: "perspective",
+            projection: 'perspective',
             alpha: 45,
             beta: -45,
             panSensitivity: config.move ? 1 : 0,
@@ -69,7 +68,7 @@
                 enable: true,
                 intensity: 1.5,
                 radius: 5,
-                quality: "high"
+                quality: 'high'
             },
             screenSpaceReflection: {
                 enable: true
@@ -83,7 +82,7 @@
         },
         boxDepth: 100,
         boxHeight: 20,
-        environment: "none",
+        environment: 'none',
         light: {
             main: {
                 shadow: true,
@@ -100,7 +99,7 @@
 };
 
 function updateData(pixelData, width, height) {
-    console.time("update");
+    console.time('update');
     var data = new Float32Array(pixelData.length / 4 * 3);
     var off = 0;
     for (var i = 0; i < pixelData.length / 4; i++) {
@@ -121,8 +120,8 @@
         },
         series: [{
             animation: false,
-            type: "bar3D",
-            shading: "realistic",
+            type: 'bar3D',
+            shading: 'realistic',
             realisticMaterial: {
                 roughness: config.roughness,
                 metalness: config.metalness
@@ -130,8 +129,9 @@
             barSize: config.barSize,
             bevelSize: config.barBevel,
             silent: true,
+            dimensions: ['x', 'y', 'z'],
             itemStyle: {
-                color: config.sameColor ? config.color : function(params) {
+                color: config.sameColor ? config.color : function (params) {
                     var i = params.dataIndex;
                     var r = pixelData[i * 4] / 255;
                     var g = pixelData[i * 4 + 1] / 255;
@@ -147,7 +147,7 @@
         }]
     });
 
-    console.timeEnd("update");
+    console.timeEnd('update');
 }
 
 function loadImage(img) {
diff --git a/public/data-gl/global-population-bar3d-on-globe.js b/public/data-gl/global-population-bar3d-on-globe.js
index 4ffb812..305a94f 100644
--- a/public/data-gl/global-population-bar3d-on-globe.js
+++ b/public/data-gl/global-population-bar3d-on-globe.js
@@ -2,7 +2,6 @@
 title: Global Population - Bar3D on Globe
 category: bar3D
 titleCN: Global Population - Bar3D on Globe
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 $.getJSON(ROOT_PATH + "/data-gl/asset/data/population.json", function (data) {
diff --git a/public/data-gl/globe-atmosphere.js b/public/data-gl/globe-atmosphere.js
new file mode 100644
index 0000000..e3499f5
--- /dev/null
+++ b/public/data-gl/globe-atmosphere.js
@@ -0,0 +1,30 @@
+/*
+title: Globe with Atmosphere
+category: globe
+titleCN: 大气层显示
+*/
+
+option = {
+    backgroundColor: '#000',
+    globe: {
+        baseTexture: ROOT_PATH + '/data-gl/asset/earth.jpg',
+
+        shading: 'lambert',
+
+        environment: ROOT_PATH + '/data-gl/asset/starfield.jpg',
+
+        atmosphere: {
+            show: true
+        },
+
+        light: {
+            ambient: {
+                intensity: 0.1
+            },
+            main: {
+                intensity: 1.5
+            }
+        }
+    },
+    series: []
+};
\ No newline at end of file
diff --git a/public/data-gl/globe-country-carousel.js b/public/data-gl/globe-country-carousel.js
index 5e75922..1c94c78 100644
--- a/public/data-gl/globe-country-carousel.js
+++ b/public/data-gl/globe-country-carousel.js
@@ -22,17 +22,11 @@
         boundingCoords: [[-180, 90], [180, -90]],
         silent: true,
         itemStyle: {
-            normal: {
-                borderColor: '#000'
-            }
+            borderColor: '#000'
         },
         label: {
-            normal: {
-                textStyle: {
-                    color: '#fff',
-                    fontSize: 40
-                }
-            }
+            color: '#fff',
+            fontSize: 40
         }
     }
 });
diff --git a/public/data-gl/globe-displacement.js b/public/data-gl/globe-displacement.js
index bacb9e8..06b2125 100644
--- a/public/data-gl/globe-displacement.js
+++ b/public/data-gl/globe-displacement.js
@@ -2,7 +2,6 @@
 title: Globe Displacement
 category: globe
 titleCN: Globe Displacement
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/globe-layers.js b/public/data-gl/globe-layers.js
index 4850ee6..6ec140d 100644
--- a/public/data-gl/globe-layers.js
+++ b/public/data-gl/globe-layers.js
@@ -2,7 +2,6 @@
 title: Globe Layers
 category: globe
 titleCN: Globe Layers
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/globe-moon.js b/public/data-gl/globe-moon.js
index b1ac8c9..5fa9158 100644
--- a/public/data-gl/globe-moon.js
+++ b/public/data-gl/globe-moon.js
@@ -2,7 +2,6 @@
 title: Moon
 category: globe
 titleCN: Moon
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/graphgl-gpu-layout.js b/public/data-gl/graphgl-gpu-layout.js
index 94c4e29..fdb5390 100644
--- a/public/data-gl/graphgl-gpu-layout.js
+++ b/public/data-gl/graphgl-gpu-layout.js
@@ -3,7 +3,8 @@
 category: graphGL
 theme: dark
 titleCN: GraphGL GPU Layout
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
+shotDelay: 5000
+shotWidth: 1280
 */
 
 
diff --git a/public/data-gl/graphgl-large-internet.js b/public/data-gl/graphgl-large-internet.js
index e307630..b880d51 100644
--- a/public/data-gl/graphgl-large-internet.js
+++ b/public/data-gl/graphgl-large-internet.js
@@ -3,7 +3,8 @@
 category: graphGL
 theme: dark
 titleCN: GraphGL - Large Internet
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
+shotDelay: 10000
+shotWidth: 1920
 */
 
 
diff --git a/public/data-gl/graphgl-npm-dep.js b/public/data-gl/graphgl-npm-dep.js
index 5b8ac35..a9c32ce 100644
--- a/public/data-gl/graphgl-npm-dep.js
+++ b/public/data-gl/graphgl-npm-dep.js
@@ -3,92 +3,102 @@
 category: graphGL

 theme: dark

 titleCN: 1w 节点 2w7 边的NPM 依赖图

+shotDelay: 5000

+shotWidth: 1920

 */

 

-$.when(

-    $.getJSON(ROOT_PATH + "/data-gl/asset/data/npmdep.json"),

-    $.getScript(ROOT_PATH + "/vendors/echarts/extension/graph-modularity.js")

-).done(function (res) {

-    var data = res[0];

-    var nodes = data.nodes.map(function (nodeName, idx) {

-        return {

-            name: nodeName,

-            value: data.dependentsCount[idx]

-        }

-    });

-    var edges = [];

-    for (var i = 0; i < data.edges.length;) {

-        var s = data.edges[i++];

-        var t = data.edges[i++];

-        edges.push({

-            source: s,

-            target: t

-        });

-    }

+function loadScript(scriptUrl, cb) {

+    var scriptTag = document.createElement('script');

+    scriptTag.onload = cb;

+    scriptTag.src = scriptUrl;

+    document.body.appendChild(scriptTag);

+}

 

-    nodes.forEach(function (node) {

-        // if (node.value > 100) {

-            node.emphasis = {

-                label: {

+loadScript('https://cdn.jsdelivr.net/npm/echarts-graph-modularity@2.0.0/dist/echarts-graph-modularity.min.js', function () {

+    // Reinit chart again

+    // TODO: visual encoding registerion must been done before echarts.init.

+    var dom = myChart.getDom();

+    myChart.dispose();

+    myChart = echarts.init(dom);

+    $.getJSON(ROOT_PATH + '/data-gl/asset/data/npmdep.json', function (data) {

+        var nodes = data.nodes.map(function (nodeName, idx) {

+            return {

+                name: nodeName,

+                value: data.dependentsCount[idx]

+            }

+        });

+        var edges = [];

+        for (var i = 0; i < data.edges.length;) {

+            var s = data.edges[i++];

+            var t = data.edges[i++];

+            edges.push({

+                source: s,

+                target: t

+            });

+        }

+

+        nodes.forEach(function (node) {

+            // if (node.value > 100) {

+                node.emphasis = {

+                    label: {

+                        show: true

+                    }

+                }

+            // }

+            if (node.value > 5000) {

+                node.label = {

                     show: true

                 }

             }

-        // }

-        if (node.value > 5000) {

-            node.label = {

-                show: true

-            }

-        }

-    });

+        });

 

-    myChart.setOption({

-        backgroundColor: '#000',

-        series: [{

-            color: ["rgb(203,239,15)", "rgb(73,15,239)","rgb(15,217,239)","rgb(30,15,239)","rgb(15,174,239)","rgb(116,239,15)","rgb(239,15,58)","rgb(15,239,174)","rgb(239,102,15)","rgb(239,15,15)","rgb(15,44,239)","rgb(239,145,15)","rgb(30,239,15)","rgb(239,188,15)","rgb(159,239,15)","rgb(159,15,239)","rgb(15,239,44)","rgb(15,239,87)","rgb(15,239,217)","rgb(203,15,239)","rgb(239,15,188)","rgb(239,15,102)","rgb(239,58,15)","rgb(239,15,145)","rgb(116,15,239)","rgb(15,131,239)","rgb(73,239,15)","rgb(15,239,131)","rgb(15,87,239)","rgb(239,15,231)"],

-            type: 'graphGL',

-            nodes: nodes,

-            edges: edges,

-            modularity: {

-                resolution: 2,

-                sort: true

-            },

-            lineStyle: {

-                color: 'rgba(255,255,255,1)',

-                opacity: 0.05

-            },

-            itemStyle: {

-                opacity: 1,

-                // borderColor: '#fff',

-                // borderWidth: 1

-            },

-            focusNodeAdjacency: false,

-            focusNodeAdjacencyOn: 'click',

-            symbolSize: function (value) {

-                return Math.sqrt(value / 10);

-            },

-            label: {

-                textStyle: {

-                    color: '#fff'

-                }

-            },

-            emphasis: {

-                label: {

-                    show: false

+        myChart.setOption({

+            backgroundColor: '#000',

+            series: [{

+                color: ['rgb(203,239,15)', 'rgb(73,15,239)','rgb(15,217,239)','rgb(30,15,239)','rgb(15,174,239)','rgb(116,239,15)','rgb(239,15,58)','rgb(15,239,174)','rgb(239,102,15)','rgb(239,15,15)','rgb(15,44,239)','rgb(239,145,15)','rgb(30,239,15)','rgb(239,188,15)','rgb(159,239,15)','rgb(159,15,239)','rgb(15,239,44)','rgb(15,239,87)','rgb(15,239,217)','rgb(203,15,239)','rgb(239,15,188)','rgb(239,15,102)','rgb(239,58,15)','rgb(239,15,145)','rgb(116,15,239)','rgb(15,131,239)','rgb(73,239,15)','rgb(15,239,131)','rgb(15,87,239)','rgb(239,15,231)'],

+                type: 'graphGL',

+                nodes: nodes,

+                edges: edges,

+                modularity: {

+                    resolution: 2,

+                    sort: true

                 },

                 lineStyle: {

-                    opacity: 0.5,

-                    width: 4

+                    color: 'rgba(255,255,255,1)',

+                    opacity: 0.05

+                },

+                itemStyle: {

+                    opacity: 1

+                    // borderColor: '#fff',

+                    // borderWidth: 1

+                },

+                focusNodeAdjacency: false,

+                focusNodeAdjacencyOn: 'click',

+                symbolSize: function (value) {

+                    return Math.sqrt(value / 10);

+                },

+                label: {

+                    color: '#fff'

+                },

+                emphasis: {

+                    label: {

+                        show: false

+                    },

+                    lineStyle: {

+                        opacity: 0.5,

+                        width: 4

+                    }

+                },

+                forceAtlas2: {

+                    steps: 5,

+                    stopThreshold: 20,

+                    jitterTolerence: 10,

+                    edgeWeight: [0.2, 1],

+                    gravity: 5,

+                    edgeWeightInfluence: 0

+                    // preventOverlap: true

                 }

-            },

-            forceAtlas2: {

-                steps: 5,

-                stopThreshold: 20,

-                jitterTolerence: 10,

-                edgeWeight: [0.2, 1],

-                gravity: 5,

-                edgeWeightInfluence: 0,

-                // preventOverlap: true

-            }

-        }]

+            }]

+        });

     });

 });

diff --git a/public/data-gl/image-surface-sushuang.js b/public/data-gl/image-surface-sushuang.js
index 2af81d9..4faf6ad 100644
--- a/public/data-gl/image-surface-sushuang.js
+++ b/public/data-gl/image-surface-sushuang.js
@@ -2,7 +2,6 @@
 title: Image Surface Sushuang
 category: surface
 titleCN: Image Surface Sushuang
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 var img = new Image();
diff --git a/public/data-gl/image-to-bar3d.js b/public/data-gl/image-to-bar3d.js
index 86e38f7..8db304e 100644
--- a/public/data-gl/image-to-bar3d.js
+++ b/public/data-gl/image-to-bar3d.js
@@ -2,7 +2,6 @@
 title: Image to Bar3D
 category: bar3D
 titleCN: Image to Bar3D
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 var img = new Image();
@@ -43,8 +42,8 @@
         },
         grid3D: {
             viewControl: {
-                alpha: 70,
-                beta: 0
+                alpha: 20,
+                beta: -30
             },
             postEffect: {
                 enable: true,
diff --git a/public/data-gl/iron-globe.js b/public/data-gl/iron-globe.js
index c6bcf84..9764e57 100644
--- a/public/data-gl/iron-globe.js
+++ b/public/data-gl/iron-globe.js
@@ -2,7 +2,6 @@
 title: Iron globe
 category: globe
 titleCN: Iron globe
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/line3d-orthographic.js b/public/data-gl/line3d-orthographic.js
index d14ba0b..b70b68b 100644
--- a/public/data-gl/line3d-orthographic.js
+++ b/public/data-gl/line3d-orthographic.js
@@ -2,7 +2,6 @@
 title: 三维折线图正交投影
 category: line3D
 titleCN: 三维折线图正交投影
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 var data = [];
diff --git a/public/data-gl/lines3d-airline-on-globe.js b/public/data-gl/lines3d-airline-on-globe.js
index f4b923c..ef04a53 100644
--- a/public/data-gl/lines3d-airline-on-globe.js
+++ b/public/data-gl/lines3d-airline-on-globe.js
@@ -2,7 +2,6 @@
 title: Airline on Globe
 category: lines3D
 titleCN: Airline on Globe
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 $.getJSON(ROOT_PATH + '/data-gl/asset/data/flights.json', function(data) {
diff --git a/public/data-gl/lines3d-flights-gl.js b/public/data-gl/lines3d-flights-gl.js
index dbb8389..f9a419f 100644
--- a/public/data-gl/lines3d-flights-gl.js
+++ b/public/data-gl/lines3d-flights-gl.js
@@ -56,7 +56,7 @@
             },
 
             itemStyle: {
-                areaColor: '#000'
+                color: '#000'
             },
 
             regionHeight: 0.5
diff --git a/public/data-gl/lines3d-flights-on-geo3d.js b/public/data-gl/lines3d-flights-on-geo3d.js
index 560e1f8..c29cf30 100644
--- a/public/data-gl/lines3d-flights-on-geo3d.js
+++ b/public/data-gl/lines3d-flights-on-geo3d.js
@@ -40,7 +40,7 @@
             },
 
             itemStyle: {
-                areaColor: '#111'
+                color: '#111'
             },
 
             boxHeight: 0.5
diff --git a/public/data-gl/lines3d-flights.js b/public/data-gl/lines3d-flights.js
index 3afbbf2..e6eb33f 100644
--- a/public/data-gl/lines3d-flights.js
+++ b/public/data-gl/lines3d-flights.js
@@ -2,7 +2,6 @@
 title: Flights
 category: lines3D
 titleCN: Flights
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/map3d-buildings.js b/public/data-gl/map3d-buildings.js
index eb22ed8..54b74dd 100644
--- a/public/data-gl/map3d-buildings.js
+++ b/public/data-gl/map3d-buildings.js
@@ -2,7 +2,6 @@
 title: Buildings
 category: map3D
 titleCN: Buildings
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
@@ -94,9 +93,7 @@
             },
 
             label: {
-                textStyle: {
-                    color: 'white'
-                }
+                color: 'white'
             },
 
             silent: true,
diff --git a/public/data-gl/map3d-wood-city.js b/public/data-gl/map3d-wood-city.js
index 0b39249..6b89e7f 100644
--- a/public/data-gl/map3d-wood-city.js
+++ b/public/data-gl/map3d-wood-city.js
@@ -2,7 +2,6 @@
 title: Wood City
 category: map3D
 titleCN: Wood City
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
@@ -78,9 +77,7 @@
             },
 
             label: {
-                textStyle: {
-                    color: 'white'
-                }
+                color: 'white'
             },
 
             silent: true,
diff --git a/public/data-gl/metal-surface.js b/public/data-gl/metal-surface.js
index c163741..6ebcd9c 100644
--- a/public/data-gl/metal-surface.js
+++ b/public/data-gl/metal-surface.js
@@ -2,7 +2,6 @@
 title: Metal Surface
 category: surface
 titleCN: Metal Surface
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/parametric-surface-rose.js b/public/data-gl/parametric-surface-rose.js
index af775f5..8b71738 100644
--- a/public/data-gl/parametric-surface-rose.js
+++ b/public/data-gl/parametric-surface-rose.js
@@ -2,7 +2,6 @@
 title: Parametric Surface Rose
 category: surface
 titleCN: Parametric Surface Rose
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/scatter3D-dataset.js b/public/data-gl/scatter3D-dataset.js
index bda618c..d15364e 100644
--- a/public/data-gl/scatter3D-dataset.js
+++ b/public/data-gl/scatter3D-dataset.js
@@ -2,7 +2,6 @@
 title: 3D Scatter with Dataset
 category: scatter3D
 titleCN: 使用 dataset 为三维散点图设置数据
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
diff --git a/public/data-gl/scatter3d-globe-population.js b/public/data-gl/scatter3d-globe-population.js
index 03b71b9..189d244 100644
--- a/public/data-gl/scatter3d-globe-population.js
+++ b/public/data-gl/scatter3d-globe-population.js
@@ -2,7 +2,6 @@
 title: Scatter3D - Globe Population
 category: scatter3D
 titleCN: Scatter3D - Globe Population
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/scatter3d-scatter.js b/public/data-gl/scatter3d-scatter.js
index b16be1c..b1ee000 100644
--- a/public/data-gl/scatter3d-scatter.js
+++ b/public/data-gl/scatter3d-scatter.js
@@ -2,7 +2,6 @@
 title: 3D Scatter with Scatter Matrix
 category: scatter3D
 titleCN: 三维散点图和散点矩阵结合使用
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json', function (data) {
diff --git a/public/data-gl/scatter3d.js b/public/data-gl/scatter3d.js
index e138cdc..a3235f8 100644
--- a/public/data-gl/scatter3d.js
+++ b/public/data-gl/scatter3d.js
@@ -3,7 +3,6 @@
 category: scatter3D
 theme: dark
 titleCN: Scatter3D
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/scatterGL-gps.js b/public/data-gl/scatterGL-gps.js
index fc7ddc7..18d8a19 100644
--- a/public/data-gl/scatterGL-gps.js
+++ b/public/data-gl/scatterGL-gps.js
@@ -41,7 +41,7 @@
     backgroundColor: '#000',
     title: {
         text: '10000000 GPS Points',
-            left: 'center',
+        left: 'center',
         textStyle: {
             color: '#fff'
         }
diff --git a/public/data-gl/simple-surface.js b/public/data-gl/simple-surface.js
index c262665..4b16ebd 100644
--- a/public/data-gl/simple-surface.js
+++ b/public/data-gl/simple-surface.js
@@ -2,7 +2,6 @@
 title: Simple Surface
 category: surface
 titleCN: Simple Surface
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/sphere-parametric-surface.js b/public/data-gl/sphere-parametric-surface.js
index ab25a2b..507a4bf 100644
--- a/public/data-gl/sphere-parametric-surface.js
+++ b/public/data-gl/sphere-parametric-surface.js
@@ -2,7 +2,6 @@
 title: Sphere Parametric Surface
 category: surface
 titleCN: Sphere Parametric Surface
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/surface-golden-rose.js b/public/data-gl/surface-golden-rose.js
index 7fcdec8..eb61325 100644
--- a/public/data-gl/surface-golden-rose.js
+++ b/public/data-gl/surface-golden-rose.js
@@ -2,7 +2,6 @@
 title: Golden Rose
 category: surface
 titleCN: Golden Rose
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/surface-leather.js b/public/data-gl/surface-leather.js
index 903f428..10b0a68 100644
--- a/public/data-gl/surface-leather.js
+++ b/public/data-gl/surface-leather.js
@@ -2,13 +2,13 @@
 title: 皮革材质
 category: surface
 titleCN: 皮革材质
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 var TILING = [4, 2];
 
 var heightImg = new Image();
 heightImg.onload = update;
+heightImg.crossOrigin = 'anonymous';
 heightImg.src = ROOT_PATH + '/data-gl/asset/leather/leather_height.jpg';
 
 function update() {
diff --git a/public/data-gl/surface-mollusc-shell.js b/public/data-gl/surface-mollusc-shell.js
index 18e4967..7745288 100644
--- a/public/data-gl/surface-mollusc-shell.js
+++ b/public/data-gl/surface-mollusc-shell.js
@@ -2,7 +2,6 @@
 title: Mollusc Shell
 category: surface
 titleCN: Mollusc Shell
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/surface-theme-roses.js b/public/data-gl/surface-theme-roses.js
index c6e9d5f..376b7cf 100644
--- a/public/data-gl/surface-theme-roses.js
+++ b/public/data-gl/surface-theme-roses.js
@@ -2,7 +2,6 @@
 title: Theme Roses
 category: surface
 titleCN: Theme Roses
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
diff --git a/public/data-gl/surface-wave.js b/public/data-gl/surface-wave.js
index edf57a8..23c7b24 100644
--- a/public/data-gl/surface-wave.js
+++ b/public/data-gl/surface-wave.js
@@ -2,7 +2,6 @@
 title: Surface Wave
 category: surface
 titleCN: Surface Wave
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 option = {
diff --git a/public/data-gl/thumb-dark/animating-contour-on-globe.png b/public/data-gl/thumb-dark/animating-contour-on-globe.png
new file mode 100644
index 0000000..53f1326
--- /dev/null
+++ b/public/data-gl/thumb-dark/animating-contour-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/animating-contour-on-globe.webp b/public/data-gl/thumb-dark/animating-contour-on-globe.webp
new file mode 100644
index 0000000..8e4037f
--- /dev/null
+++ b/public/data-gl/thumb-dark/animating-contour-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-dataset.png b/public/data-gl/thumb-dark/bar3d-dataset.png
new file mode 100644
index 0000000..2ee32b2
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-dataset.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-dataset.webp b/public/data-gl/thumb-dark/bar3d-dataset.webp
new file mode 100644
index 0000000..638d5bd
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-dataset.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-global-population.png b/public/data-gl/thumb-dark/bar3d-global-population.png
new file mode 100644
index 0000000..1b9bb2e
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-global-population.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-global-population.webp b/public/data-gl/thumb-dark/bar3d-global-population.webp
new file mode 100644
index 0000000..a45fc03
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-global-population.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-music-visualization.png b/public/data-gl/thumb-dark/bar3d-music-visualization.png
new file mode 100644
index 0000000..e57a68a
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-music-visualization.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-music-visualization.webp b/public/data-gl/thumb-dark/bar3d-music-visualization.webp
new file mode 100644
index 0000000..5cc75ac
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-music-visualization.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-myth.png b/public/data-gl/thumb-dark/bar3d-myth.png
new file mode 100644
index 0000000..097e50b
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-myth.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-myth.webp b/public/data-gl/thumb-dark/bar3d-myth.webp
new file mode 100644
index 0000000..ef25417
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-myth.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.png b/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.png
new file mode 100644
index 0000000..0777f1b
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.webp b/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.webp
new file mode 100644
index 0000000..105fe57
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-noise-modified-from-marpi-demo.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-punch-card.png b/public/data-gl/thumb-dark/bar3d-punch-card.png
new file mode 100644
index 0000000..6778a23
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-punch-card.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-punch-card.webp b/public/data-gl/thumb-dark/bar3d-punch-card.webp
new file mode 100644
index 0000000..169b3f6
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-punch-card.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-simplex-noise.png b/public/data-gl/thumb-dark/bar3d-simplex-noise.png
new file mode 100644
index 0000000..a098946
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-simplex-noise.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-simplex-noise.webp b/public/data-gl/thumb-dark/bar3d-simplex-noise.webp
new file mode 100644
index 0000000..bc42b82
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-simplex-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-voxelize-image.png b/public/data-gl/thumb-dark/bar3d-voxelize-image.png
new file mode 100644
index 0000000..6ebb536
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-voxelize-image.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/bar3d-voxelize-image.webp b/public/data-gl/thumb-dark/bar3d-voxelize-image.webp
new file mode 100644
index 0000000..c43d186
--- /dev/null
+++ b/public/data-gl/thumb-dark/bar3d-voxelize-image.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/flowGL-noise.png b/public/data-gl/thumb-dark/flowGL-noise.png
new file mode 100644
index 0000000..e6f0511
--- /dev/null
+++ b/public/data-gl/thumb-dark/flowGL-noise.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/flowGL-noise.webp b/public/data-gl/thumb-dark/flowGL-noise.webp
new file mode 100644
index 0000000..1c01dac
--- /dev/null
+++ b/public/data-gl/thumb-dark/flowGL-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/geo3d-with-different-height.png b/public/data-gl/thumb-dark/geo3d-with-different-height.png
new file mode 100644
index 0000000..6580f60
--- /dev/null
+++ b/public/data-gl/thumb-dark/geo3d-with-different-height.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/geo3d-with-different-height.webp b/public/data-gl/thumb-dark/geo3d-with-different-height.webp
new file mode 100644
index 0000000..427ce2c
--- /dev/null
+++ b/public/data-gl/thumb-dark/geo3d-with-different-height.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/geo3d.png b/public/data-gl/thumb-dark/geo3d.png
new file mode 100644
index 0000000..d786a0d
--- /dev/null
+++ b/public/data-gl/thumb-dark/geo3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/geo3d.webp b/public/data-gl/thumb-dark/geo3d.webp
new file mode 100644
index 0000000..2eb2f1c
--- /dev/null
+++ b/public/data-gl/thumb-dark/geo3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-population-bar3d-on-globe.png b/public/data-gl/thumb-dark/global-population-bar3d-on-globe.png
new file mode 100644
index 0000000..9539050
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-population-bar3d-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-population-bar3d-on-globe.webp b/public/data-gl/thumb-dark/global-population-bar3d-on-globe.webp
new file mode 100644
index 0000000..919b7f3
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-population-bar3d-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-wind-visualization-2.png b/public/data-gl/thumb-dark/global-wind-visualization-2.png
new file mode 100644
index 0000000..7a18af4
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-wind-visualization-2.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-wind-visualization-2.webp b/public/data-gl/thumb-dark/global-wind-visualization-2.webp
new file mode 100644
index 0000000..c10d48e
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-wind-visualization-2.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-wind-visualization.png b/public/data-gl/thumb-dark/global-wind-visualization.png
new file mode 100644
index 0000000..37ef175
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-wind-visualization.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/global-wind-visualization.webp b/public/data-gl/thumb-dark/global-wind-visualization.webp
new file mode 100644
index 0000000..aa3787f
--- /dev/null
+++ b/public/data-gl/thumb-dark/global-wind-visualization.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-atmosphere.png b/public/data-gl/thumb-dark/globe-atmosphere.png
new file mode 100644
index 0000000..571e425
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-atmosphere.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-atmosphere.webp b/public/data-gl/thumb-dark/globe-atmosphere.webp
new file mode 100644
index 0000000..cb24db5
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-atmosphere.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-contour-paint.png b/public/data-gl/thumb-dark/globe-contour-paint.png
new file mode 100644
index 0000000..2b33bb5
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-contour-paint.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-contour-paint.webp b/public/data-gl/thumb-dark/globe-contour-paint.webp
new file mode 100644
index 0000000..d05787e
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-contour-paint.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-country-carousel.png b/public/data-gl/thumb-dark/globe-country-carousel.png
new file mode 100644
index 0000000..f52a7d8
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-country-carousel.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-country-carousel.webp b/public/data-gl/thumb-dark/globe-country-carousel.webp
new file mode 100644
index 0000000..6a4565a
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-country-carousel.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-displacement.png b/public/data-gl/thumb-dark/globe-displacement.png
new file mode 100644
index 0000000..77d8ac1
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-displacement.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-displacement.webp b/public/data-gl/thumb-dark/globe-displacement.webp
new file mode 100644
index 0000000..140caae
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-displacement.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.png b/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.png
new file mode 100644
index 0000000..c811146
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.webp b/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.webp
new file mode 100644
index 0000000..96b614d
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-echarts-gl-hello-world.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-layers.png b/public/data-gl/thumb-dark/globe-layers.png
new file mode 100644
index 0000000..3ba3c0e
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-layers.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-layers.webp b/public/data-gl/thumb-dark/globe-layers.webp
new file mode 100644
index 0000000..502969d
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-layers.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-moon.png b/public/data-gl/thumb-dark/globe-moon.png
new file mode 100644
index 0000000..67a0bc7
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-moon.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-moon.webp b/public/data-gl/thumb-dark/globe-moon.webp
new file mode 100644
index 0000000..6fd6265
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-moon.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-with-echarts-surface.png b/public/data-gl/thumb-dark/globe-with-echarts-surface.png
new file mode 100644
index 0000000..f9a3615
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-with-echarts-surface.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/globe-with-echarts-surface.webp b/public/data-gl/thumb-dark/globe-with-echarts-surface.webp
new file mode 100644
index 0000000..ac5cf42
--- /dev/null
+++ b/public/data-gl/thumb-dark/globe-with-echarts-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-gpu-layout.png b/public/data-gl/thumb-dark/graphgl-gpu-layout.png
new file mode 100644
index 0000000..6dec51f
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-gpu-layout.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-gpu-layout.webp b/public/data-gl/thumb-dark/graphgl-gpu-layout.webp
new file mode 100644
index 0000000..c5ac8b5
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-gpu-layout.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-large-internet.png b/public/data-gl/thumb-dark/graphgl-large-internet.png
new file mode 100644
index 0000000..5a2320a
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-large-internet.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-large-internet.webp b/public/data-gl/thumb-dark/graphgl-large-internet.webp
new file mode 100644
index 0000000..0384821
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-large-internet.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-npm-dep.png b/public/data-gl/thumb-dark/graphgl-npm-dep.png
new file mode 100644
index 0000000..25bbbf3
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-npm-dep.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/graphgl-npm-dep.webp b/public/data-gl/thumb-dark/graphgl-npm-dep.webp
new file mode 100644
index 0000000..3a95db1
--- /dev/null
+++ b/public/data-gl/thumb-dark/graphgl-npm-dep.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/image-surface-sushuang.png b/public/data-gl/thumb-dark/image-surface-sushuang.png
new file mode 100644
index 0000000..5f2a352
--- /dev/null
+++ b/public/data-gl/thumb-dark/image-surface-sushuang.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/image-surface-sushuang.webp b/public/data-gl/thumb-dark/image-surface-sushuang.webp
new file mode 100644
index 0000000..509ab0f
--- /dev/null
+++ b/public/data-gl/thumb-dark/image-surface-sushuang.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/image-to-bar3d.png b/public/data-gl/thumb-dark/image-to-bar3d.png
new file mode 100644
index 0000000..80095fc
--- /dev/null
+++ b/public/data-gl/thumb-dark/image-to-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/image-to-bar3d.webp b/public/data-gl/thumb-dark/image-to-bar3d.webp
new file mode 100644
index 0000000..a0613cf
--- /dev/null
+++ b/public/data-gl/thumb-dark/image-to-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/iron-globe.png b/public/data-gl/thumb-dark/iron-globe.png
new file mode 100644
index 0000000..985ccdf
--- /dev/null
+++ b/public/data-gl/thumb-dark/iron-globe.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/iron-globe.webp b/public/data-gl/thumb-dark/iron-globe.webp
new file mode 100644
index 0000000..d37eb8a
--- /dev/null
+++ b/public/data-gl/thumb-dark/iron-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/line3d-orthographic.png b/public/data-gl/thumb-dark/line3d-orthographic.png
new file mode 100644
index 0000000..3829fc7
--- /dev/null
+++ b/public/data-gl/thumb-dark/line3d-orthographic.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/line3d-orthographic.webp b/public/data-gl/thumb-dark/line3d-orthographic.webp
new file mode 100644
index 0000000..fcfabc6
--- /dev/null
+++ b/public/data-gl/thumb-dark/line3d-orthographic.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-airline-on-globe.png b/public/data-gl/thumb-dark/lines3d-airline-on-globe.png
new file mode 100644
index 0000000..5151815
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-airline-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-airline-on-globe.webp b/public/data-gl/thumb-dark/lines3d-airline-on-globe.webp
new file mode 100644
index 0000000..72482eb
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-airline-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights-gl.png b/public/data-gl/thumb-dark/lines3d-flights-gl.png
new file mode 100644
index 0000000..1a75259
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights-gl.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights-gl.webp b/public/data-gl/thumb-dark/lines3d-flights-gl.webp
new file mode 100644
index 0000000..d239c74
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights-gl.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.png b/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.png
new file mode 100644
index 0000000..8259818
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.webp b/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.webp
new file mode 100644
index 0000000..ee21d24
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights-on-geo3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights.png b/public/data-gl/thumb-dark/lines3d-flights.png
new file mode 100644
index 0000000..fcc0c89
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/lines3d-flights.webp b/public/data-gl/thumb-dark/lines3d-flights.webp
new file mode 100644
index 0000000..513e52f
--- /dev/null
+++ b/public/data-gl/thumb-dark/lines3d-flights.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/linesGL-ny.png b/public/data-gl/thumb-dark/linesGL-ny.png
new file mode 100644
index 0000000..a7fb1b6
--- /dev/null
+++ b/public/data-gl/thumb-dark/linesGL-ny.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/linesGL-ny.webp b/public/data-gl/thumb-dark/linesGL-ny.webp
new file mode 100644
index 0000000..478fbfa
--- /dev/null
+++ b/public/data-gl/thumb-dark/linesGL-ny.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-alcohol-consumption.png b/public/data-gl/thumb-dark/map3d-alcohol-consumption.png
new file mode 100644
index 0000000..b7e1185
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-alcohol-consumption.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-alcohol-consumption.webp b/public/data-gl/thumb-dark/map3d-alcohol-consumption.webp
new file mode 100644
index 0000000..3d3849d
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-alcohol-consumption.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-buildings.png b/public/data-gl/thumb-dark/map3d-buildings.png
new file mode 100644
index 0000000..ad115f0
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-buildings.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-buildings.webp b/public/data-gl/thumb-dark/map3d-buildings.webp
new file mode 100644
index 0000000..bb1955a
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-buildings.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-wood-city.png b/public/data-gl/thumb-dark/map3d-wood-city.png
new file mode 100644
index 0000000..c54f216
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-wood-city.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-wood-city.webp b/public/data-gl/thumb-dark/map3d-wood-city.webp
new file mode 100644
index 0000000..ccaa419
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-wood-city.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-wood-map.png b/public/data-gl/thumb-dark/map3d-wood-map.png
new file mode 100644
index 0000000..bc2058c
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-wood-map.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/map3d-wood-map.webp b/public/data-gl/thumb-dark/map3d-wood-map.webp
new file mode 100644
index 0000000..24af576
--- /dev/null
+++ b/public/data-gl/thumb-dark/map3d-wood-map.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/metal-bar3d.png b/public/data-gl/thumb-dark/metal-bar3d.png
new file mode 100644
index 0000000..40b0cc4
--- /dev/null
+++ b/public/data-gl/thumb-dark/metal-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/metal-bar3d.webp b/public/data-gl/thumb-dark/metal-bar3d.webp
new file mode 100644
index 0000000..683d1e5
--- /dev/null
+++ b/public/data-gl/thumb-dark/metal-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/metal-surface.png b/public/data-gl/thumb-dark/metal-surface.png
new file mode 100644
index 0000000..51611a4
--- /dev/null
+++ b/public/data-gl/thumb-dark/metal-surface.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/metal-surface.webp b/public/data-gl/thumb-dark/metal-surface.webp
new file mode 100644
index 0000000..a47f1cc
--- /dev/null
+++ b/public/data-gl/thumb-dark/metal-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/parametric-surface-rose.png b/public/data-gl/thumb-dark/parametric-surface-rose.png
new file mode 100644
index 0000000..b095168
--- /dev/null
+++ b/public/data-gl/thumb-dark/parametric-surface-rose.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/parametric-surface-rose.webp b/public/data-gl/thumb-dark/parametric-surface-rose.webp
new file mode 100644
index 0000000..828b055
--- /dev/null
+++ b/public/data-gl/thumb-dark/parametric-surface-rose.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3D-dataset.png b/public/data-gl/thumb-dark/scatter3D-dataset.png
new file mode 100644
index 0000000..f49cb70
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3D-dataset.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3D-dataset.webp b/public/data-gl/thumb-dark/scatter3D-dataset.webp
new file mode 100644
index 0000000..f3d4dbb
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3D-dataset.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-globe-population.png b/public/data-gl/thumb-dark/scatter3d-globe-population.png
new file mode 100644
index 0000000..c8e740a
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-globe-population.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-globe-population.webp b/public/data-gl/thumb-dark/scatter3d-globe-population.webp
new file mode 100644
index 0000000..1c8d372
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-globe-population.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-orthographic.png b/public/data-gl/thumb-dark/scatter3d-orthographic.png
new file mode 100644
index 0000000..d59ffd6
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-orthographic.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-orthographic.webp b/public/data-gl/thumb-dark/scatter3d-orthographic.webp
new file mode 100644
index 0000000..5010be7
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-orthographic.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-scatter.png b/public/data-gl/thumb-dark/scatter3d-scatter.png
new file mode 100644
index 0000000..e524c7b
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-scatter.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-scatter.webp b/public/data-gl/thumb-dark/scatter3d-scatter.webp
new file mode 100644
index 0000000..4099cf9
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-scatter.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-simplex-noise.png b/public/data-gl/thumb-dark/scatter3d-simplex-noise.png
new file mode 100644
index 0000000..ccc1818
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-simplex-noise.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d-simplex-noise.webp b/public/data-gl/thumb-dark/scatter3d-simplex-noise.webp
new file mode 100644
index 0000000..cba67fe
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d-simplex-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d.png b/public/data-gl/thumb-dark/scatter3d.png
new file mode 100644
index 0000000..14a42a3
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatter3d.webp b/public/data-gl/thumb-dark/scatter3d.webp
new file mode 100644
index 0000000..9f39695
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatter3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatterGL-gps.png b/public/data-gl/thumb-dark/scatterGL-gps.png
new file mode 100644
index 0000000..cba24ab
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatterGL-gps.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scatterGL-gps.webp b/public/data-gl/thumb-dark/scatterGL-gps.webp
new file mode 100644
index 0000000..8effd66
--- /dev/null
+++ b/public/data-gl/thumb-dark/scatterGL-gps.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/scattergl-weibo.png b/public/data-gl/thumb-dark/scattergl-weibo.png
new file mode 100644
index 0000000..ac5b8fd
--- /dev/null
+++ b/public/data-gl/thumb-dark/scattergl-weibo.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/scattergl-weibo.webp b/public/data-gl/thumb-dark/scattergl-weibo.webp
new file mode 100644
index 0000000..72832ee
--- /dev/null
+++ b/public/data-gl/thumb-dark/scattergl-weibo.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/simple-surface.png b/public/data-gl/thumb-dark/simple-surface.png
new file mode 100644
index 0000000..ccb62bf
--- /dev/null
+++ b/public/data-gl/thumb-dark/simple-surface.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/simple-surface.webp b/public/data-gl/thumb-dark/simple-surface.webp
new file mode 100644
index 0000000..4b3a62d
--- /dev/null
+++ b/public/data-gl/thumb-dark/simple-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/sphere-parametric-surface.png b/public/data-gl/thumb-dark/sphere-parametric-surface.png
new file mode 100644
index 0000000..eb18906
--- /dev/null
+++ b/public/data-gl/thumb-dark/sphere-parametric-surface.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/sphere-parametric-surface.webp b/public/data-gl/thumb-dark/sphere-parametric-surface.webp
new file mode 100644
index 0000000..d78f786
--- /dev/null
+++ b/public/data-gl/thumb-dark/sphere-parametric-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/stacked-bar3d.png b/public/data-gl/thumb-dark/stacked-bar3d.png
new file mode 100644
index 0000000..3d195bc
--- /dev/null
+++ b/public/data-gl/thumb-dark/stacked-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/stacked-bar3d.webp b/public/data-gl/thumb-dark/stacked-bar3d.webp
new file mode 100644
index 0000000..29b5b58
--- /dev/null
+++ b/public/data-gl/thumb-dark/stacked-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-breather.png b/public/data-gl/thumb-dark/surface-breather.png
new file mode 100644
index 0000000..fcfa210
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-breather.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-breather.webp b/public/data-gl/thumb-dark/surface-breather.webp
new file mode 100644
index 0000000..57886fe
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-breather.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-golden-rose.png b/public/data-gl/thumb-dark/surface-golden-rose.png
new file mode 100644
index 0000000..cf8c9c8
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-golden-rose.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-golden-rose.webp b/public/data-gl/thumb-dark/surface-golden-rose.webp
new file mode 100644
index 0000000..006fe93
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-golden-rose.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-leather.png b/public/data-gl/thumb-dark/surface-leather.png
new file mode 100644
index 0000000..ed457de
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-leather.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-leather.webp b/public/data-gl/thumb-dark/surface-leather.webp
new file mode 100644
index 0000000..a5856df
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-leather.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-mollusc-shell.png b/public/data-gl/thumb-dark/surface-mollusc-shell.png
new file mode 100644
index 0000000..38c5e50
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-mollusc-shell.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-mollusc-shell.webp b/public/data-gl/thumb-dark/surface-mollusc-shell.webp
new file mode 100644
index 0000000..00c2924
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-mollusc-shell.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-theme-roses.png b/public/data-gl/thumb-dark/surface-theme-roses.png
new file mode 100644
index 0000000..240434d
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-theme-roses.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-theme-roses.webp b/public/data-gl/thumb-dark/surface-theme-roses.webp
new file mode 100644
index 0000000..d0df285
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-theme-roses.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-wave.png b/public/data-gl/thumb-dark/surface-wave.png
new file mode 100644
index 0000000..2b06cc7
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-wave.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/surface-wave.webp b/public/data-gl/thumb-dark/surface-wave.webp
new file mode 100644
index 0000000..ce85793
--- /dev/null
+++ b/public/data-gl/thumb-dark/surface-wave.webp
Binary files differ
diff --git a/public/data-gl/thumb-dark/transparent-bar3d.png b/public/data-gl/thumb-dark/transparent-bar3d.png
new file mode 100644
index 0000000..a9ed593
--- /dev/null
+++ b/public/data-gl/thumb-dark/transparent-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb-dark/transparent-bar3d.webp b/public/data-gl/thumb-dark/transparent-bar3d.webp
new file mode 100644
index 0000000..7fa2477
--- /dev/null
+++ b/public/data-gl/thumb-dark/transparent-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/animating-contour-on-globe.jpg b/public/data-gl/thumb/animating-contour-on-globe.jpg
deleted file mode 100644
index afa80b8..0000000
--- a/public/data-gl/thumb/animating-contour-on-globe.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/animating-contour-on-globe.png b/public/data-gl/thumb/animating-contour-on-globe.png
new file mode 100644
index 0000000..3f3772f
--- /dev/null
+++ b/public/data-gl/thumb/animating-contour-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb/animating-contour-on-globe.webp b/public/data-gl/thumb/animating-contour-on-globe.webp
new file mode 100644
index 0000000..acfb85a
--- /dev/null
+++ b/public/data-gl/thumb/animating-contour-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-dataset.jpg b/public/data-gl/thumb/bar3d-dataset.jpg
deleted file mode 100644
index d21d7ac..0000000
--- a/public/data-gl/thumb/bar3d-dataset.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-dataset.png b/public/data-gl/thumb/bar3d-dataset.png
new file mode 100644
index 0000000..7c5215a
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-dataset.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-dataset.webp b/public/data-gl/thumb/bar3d-dataset.webp
new file mode 100644
index 0000000..6893215
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-dataset.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-global-population.jpg b/public/data-gl/thumb/bar3d-global-population.jpg
deleted file mode 100644
index a3f743e..0000000
--- a/public/data-gl/thumb/bar3d-global-population.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-global-population.png b/public/data-gl/thumb/bar3d-global-population.png
new file mode 100644
index 0000000..a88df0f
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-global-population.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-global-population.webp b/public/data-gl/thumb/bar3d-global-population.webp
new file mode 100644
index 0000000..77aec54
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-global-population.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-mapbox-view-change.jpg b/public/data-gl/thumb/bar3d-mapbox-view-change.jpg
deleted file mode 100644
index 98d3b42..0000000
--- a/public/data-gl/thumb/bar3d-mapbox-view-change.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-music-visualization.jpg b/public/data-gl/thumb/bar3d-music-visualization.jpg
deleted file mode 100644
index 74ff26c..0000000
--- a/public/data-gl/thumb/bar3d-music-visualization.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-music-visualization.png b/public/data-gl/thumb/bar3d-music-visualization.png
new file mode 100644
index 0000000..75ac6b4
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-music-visualization.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-music-visualization.webp b/public/data-gl/thumb/bar3d-music-visualization.webp
new file mode 100644
index 0000000..1eb4399
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-music-visualization.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-myth.jpg b/public/data-gl/thumb/bar3d-myth.jpg
deleted file mode 100644
index 0ebf010..0000000
--- a/public/data-gl/thumb/bar3d-myth.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-myth.png b/public/data-gl/thumb/bar3d-myth.png
new file mode 100644
index 0000000..097e50b
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-myth.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-myth.webp b/public/data-gl/thumb/bar3d-myth.webp
new file mode 100644
index 0000000..ef25417
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-myth.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.jpg b/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.jpg
deleted file mode 100644
index 9920d07..0000000
--- a/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.png b/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.png
new file mode 100644
index 0000000..0777f1b
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.webp b/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.webp
new file mode 100644
index 0000000..105fe57
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-noise-modified-from-marpi-demo.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-on-mapbox.jpg b/public/data-gl/thumb/bar3d-on-mapbox.jpg
deleted file mode 100644
index ad0565e..0000000
--- a/public/data-gl/thumb/bar3d-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-punch-card.jpg b/public/data-gl/thumb/bar3d-punch-card.jpg
deleted file mode 100644
index a3dc3a0..0000000
--- a/public/data-gl/thumb/bar3d-punch-card.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-punch-card.png b/public/data-gl/thumb/bar3d-punch-card.png
new file mode 100644
index 0000000..98535cd
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-punch-card.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-punch-card.webp b/public/data-gl/thumb/bar3d-punch-card.webp
new file mode 100644
index 0000000..0bb8301
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-punch-card.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-shanghai.jpg b/public/data-gl/thumb/bar3d-shanghai.jpg
deleted file mode 100644
index 3018c14..0000000
--- a/public/data-gl/thumb/bar3d-shanghai.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-simplex-noise.jpg b/public/data-gl/thumb/bar3d-simplex-noise.jpg
deleted file mode 100644
index a4b0ade..0000000
--- a/public/data-gl/thumb/bar3d-simplex-noise.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-simplex-noise.png b/public/data-gl/thumb/bar3d-simplex-noise.png
new file mode 100644
index 0000000..201a97c
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-simplex-noise.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-simplex-noise.webp b/public/data-gl/thumb/bar3d-simplex-noise.webp
new file mode 100644
index 0000000..4a316ac
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-simplex-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-voxelize-image.jpg b/public/data-gl/thumb/bar3d-voxelize-image.jpg
deleted file mode 100644
index 6373591..0000000
--- a/public/data-gl/thumb/bar3d-voxelize-image.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-voxelize-image.png b/public/data-gl/thumb/bar3d-voxelize-image.png
new file mode 100644
index 0000000..6ebb536
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-voxelize-image.png
Binary files differ
diff --git a/public/data-gl/thumb/bar3d-voxelize-image.webp b/public/data-gl/thumb/bar3d-voxelize-image.webp
new file mode 100644
index 0000000..c43d186
--- /dev/null
+++ b/public/data-gl/thumb/bar3d-voxelize-image.webp
Binary files differ
diff --git a/public/data-gl/thumb/flowGL-noise.jpg b/public/data-gl/thumb/flowGL-noise.jpg
deleted file mode 100644
index a05f9a7..0000000
--- a/public/data-gl/thumb/flowGL-noise.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/flowGL-noise.png b/public/data-gl/thumb/flowGL-noise.png
new file mode 100644
index 0000000..929b2f7
--- /dev/null
+++ b/public/data-gl/thumb/flowGL-noise.png
Binary files differ
diff --git a/public/data-gl/thumb/flowGL-noise.webp b/public/data-gl/thumb/flowGL-noise.webp
new file mode 100644
index 0000000..70b4a9b
--- /dev/null
+++ b/public/data-gl/thumb/flowGL-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb/geo3d-with-different-height.jpg b/public/data-gl/thumb/geo3d-with-different-height.jpg
deleted file mode 100644
index 0807e02..0000000
--- a/public/data-gl/thumb/geo3d-with-different-height.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/geo3d-with-different-height.png b/public/data-gl/thumb/geo3d-with-different-height.png
new file mode 100644
index 0000000..fe47cf8
--- /dev/null
+++ b/public/data-gl/thumb/geo3d-with-different-height.png
Binary files differ
diff --git a/public/data-gl/thumb/geo3d-with-different-height.webp b/public/data-gl/thumb/geo3d-with-different-height.webp
new file mode 100644
index 0000000..a7c04d2
--- /dev/null
+++ b/public/data-gl/thumb/geo3d-with-different-height.webp
Binary files differ
diff --git a/public/data-gl/thumb/geo3d.jpg b/public/data-gl/thumb/geo3d.jpg
deleted file mode 100644
index 91bcb89..0000000
--- a/public/data-gl/thumb/geo3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/geo3d.png b/public/data-gl/thumb/geo3d.png
new file mode 100644
index 0000000..d786a0d
--- /dev/null
+++ b/public/data-gl/thumb/geo3d.png
Binary files differ
diff --git a/public/data-gl/thumb/geo3d.webp b/public/data-gl/thumb/geo3d.webp
new file mode 100644
index 0000000..2eb2f1c
--- /dev/null
+++ b/public/data-gl/thumb/geo3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/global-population-bar3d-on-globe.jpg b/public/data-gl/thumb/global-population-bar3d-on-globe.jpg
deleted file mode 100644
index 238eb31..0000000
--- a/public/data-gl/thumb/global-population-bar3d-on-globe.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/global-population-bar3d-on-globe.png b/public/data-gl/thumb/global-population-bar3d-on-globe.png
new file mode 100644
index 0000000..ea8a55d
--- /dev/null
+++ b/public/data-gl/thumb/global-population-bar3d-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb/global-population-bar3d-on-globe.webp b/public/data-gl/thumb/global-population-bar3d-on-globe.webp
new file mode 100644
index 0000000..f19a510
--- /dev/null
+++ b/public/data-gl/thumb/global-population-bar3d-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization-2.jpg b/public/data-gl/thumb/global-wind-visualization-2.jpg
deleted file mode 100644
index de0fcbe..0000000
--- a/public/data-gl/thumb/global-wind-visualization-2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization-2.png b/public/data-gl/thumb/global-wind-visualization-2.png
new file mode 100644
index 0000000..5811985
--- /dev/null
+++ b/public/data-gl/thumb/global-wind-visualization-2.png
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization-2.webp b/public/data-gl/thumb/global-wind-visualization-2.webp
new file mode 100644
index 0000000..5d06ac7
--- /dev/null
+++ b/public/data-gl/thumb/global-wind-visualization-2.webp
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization.jpg b/public/data-gl/thumb/global-wind-visualization.jpg
deleted file mode 100644
index 30d8d06..0000000
--- a/public/data-gl/thumb/global-wind-visualization.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization.png b/public/data-gl/thumb/global-wind-visualization.png
new file mode 100644
index 0000000..306bde8
--- /dev/null
+++ b/public/data-gl/thumb/global-wind-visualization.png
Binary files differ
diff --git a/public/data-gl/thumb/global-wind-visualization.webp b/public/data-gl/thumb/global-wind-visualization.webp
new file mode 100644
index 0000000..92aa7ee
--- /dev/null
+++ b/public/data-gl/thumb/global-wind-visualization.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-atmosphere.png b/public/data-gl/thumb/globe-atmosphere.png
new file mode 100644
index 0000000..e28c6e3
--- /dev/null
+++ b/public/data-gl/thumb/globe-atmosphere.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-atmosphere.webp b/public/data-gl/thumb/globe-atmosphere.webp
new file mode 100644
index 0000000..6d294ee
--- /dev/null
+++ b/public/data-gl/thumb/globe-atmosphere.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-contour-paint.jpg b/public/data-gl/thumb/globe-contour-paint.jpg
deleted file mode 100644
index fcf51fe..0000000
--- a/public/data-gl/thumb/globe-contour-paint.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-contour-paint.png b/public/data-gl/thumb/globe-contour-paint.png
new file mode 100644
index 0000000..c4bc3fb
--- /dev/null
+++ b/public/data-gl/thumb/globe-contour-paint.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-contour-paint.webp b/public/data-gl/thumb/globe-contour-paint.webp
new file mode 100644
index 0000000..670b569
--- /dev/null
+++ b/public/data-gl/thumb/globe-contour-paint.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-country-carousel.jpg b/public/data-gl/thumb/globe-country-carousel.jpg
deleted file mode 100644
index 641debb..0000000
--- a/public/data-gl/thumb/globe-country-carousel.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-country-carousel.png b/public/data-gl/thumb/globe-country-carousel.png
new file mode 100644
index 0000000..7673d5c
--- /dev/null
+++ b/public/data-gl/thumb/globe-country-carousel.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-country-carousel.webp b/public/data-gl/thumb/globe-country-carousel.webp
new file mode 100644
index 0000000..19a745f
--- /dev/null
+++ b/public/data-gl/thumb/globe-country-carousel.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-displacement.jpg b/public/data-gl/thumb/globe-displacement.jpg
deleted file mode 100644
index 2ca2f8f..0000000
--- a/public/data-gl/thumb/globe-displacement.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-displacement.png b/public/data-gl/thumb/globe-displacement.png
new file mode 100644
index 0000000..494f8a0
--- /dev/null
+++ b/public/data-gl/thumb/globe-displacement.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-displacement.webp b/public/data-gl/thumb/globe-displacement.webp
new file mode 100644
index 0000000..ab82eb9
--- /dev/null
+++ b/public/data-gl/thumb/globe-displacement.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-echarts-gl-hello-world.jpg b/public/data-gl/thumb/globe-echarts-gl-hello-world.jpg
deleted file mode 100644
index 53e57ce..0000000
--- a/public/data-gl/thumb/globe-echarts-gl-hello-world.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-echarts-gl-hello-world.png b/public/data-gl/thumb/globe-echarts-gl-hello-world.png
new file mode 100644
index 0000000..28740db
--- /dev/null
+++ b/public/data-gl/thumb/globe-echarts-gl-hello-world.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-echarts-gl-hello-world.webp b/public/data-gl/thumb/globe-echarts-gl-hello-world.webp
new file mode 100644
index 0000000..12c680f
--- /dev/null
+++ b/public/data-gl/thumb/globe-echarts-gl-hello-world.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-layers.jpg b/public/data-gl/thumb/globe-layers.jpg
deleted file mode 100644
index 3cf624d..0000000
--- a/public/data-gl/thumb/globe-layers.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-layers.png b/public/data-gl/thumb/globe-layers.png
new file mode 100644
index 0000000..bb88287
--- /dev/null
+++ b/public/data-gl/thumb/globe-layers.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-layers.webp b/public/data-gl/thumb/globe-layers.webp
new file mode 100644
index 0000000..30fa381
--- /dev/null
+++ b/public/data-gl/thumb/globe-layers.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-moon.jpg b/public/data-gl/thumb/globe-moon.jpg
deleted file mode 100644
index c17786e..0000000
--- a/public/data-gl/thumb/globe-moon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-moon.png b/public/data-gl/thumb/globe-moon.png
new file mode 100644
index 0000000..d38e7db
--- /dev/null
+++ b/public/data-gl/thumb/globe-moon.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-moon.webp b/public/data-gl/thumb/globe-moon.webp
new file mode 100644
index 0000000..df4e76f
--- /dev/null
+++ b/public/data-gl/thumb/globe-moon.webp
Binary files differ
diff --git a/public/data-gl/thumb/globe-with-echarts-surface.jpg b/public/data-gl/thumb/globe-with-echarts-surface.jpg
deleted file mode 100644
index 86914be..0000000
--- a/public/data-gl/thumb/globe-with-echarts-surface.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/globe-with-echarts-surface.png b/public/data-gl/thumb/globe-with-echarts-surface.png
new file mode 100644
index 0000000..c3c8208
--- /dev/null
+++ b/public/data-gl/thumb/globe-with-echarts-surface.png
Binary files differ
diff --git a/public/data-gl/thumb/globe-with-echarts-surface.webp b/public/data-gl/thumb/globe-with-echarts-surface.webp
new file mode 100644
index 0000000..594b714
--- /dev/null
+++ b/public/data-gl/thumb/globe-with-echarts-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-gpu-layout.jpg b/public/data-gl/thumb/graphgl-gpu-layout.jpg
deleted file mode 100644
index 50c2c18..0000000
--- a/public/data-gl/thumb/graphgl-gpu-layout.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-gpu-layout.png b/public/data-gl/thumb/graphgl-gpu-layout.png
new file mode 100644
index 0000000..83a4b9b
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-gpu-layout.png
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-gpu-layout.webp b/public/data-gl/thumb/graphgl-gpu-layout.webp
new file mode 100644
index 0000000..62ac60c
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-gpu-layout.webp
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-large-internet.jpg b/public/data-gl/thumb/graphgl-large-internet.jpg
deleted file mode 100644
index b1e8073..0000000
--- a/public/data-gl/thumb/graphgl-large-internet.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-large-internet.png b/public/data-gl/thumb/graphgl-large-internet.png
new file mode 100644
index 0000000..b3c2129
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-large-internet.png
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-large-internet.webp b/public/data-gl/thumb/graphgl-large-internet.webp
new file mode 100644
index 0000000..b1218a1
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-large-internet.webp
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-npm-dep.jpg b/public/data-gl/thumb/graphgl-npm-dep.jpg
deleted file mode 100644
index 731ceef..0000000
--- a/public/data-gl/thumb/graphgl-npm-dep.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-npm-dep.png b/public/data-gl/thumb/graphgl-npm-dep.png
new file mode 100644
index 0000000..5de4fbe
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-npm-dep.png
Binary files differ
diff --git a/public/data-gl/thumb/graphgl-npm-dep.webp b/public/data-gl/thumb/graphgl-npm-dep.webp
new file mode 100644
index 0000000..fd998fa
--- /dev/null
+++ b/public/data-gl/thumb/graphgl-npm-dep.webp
Binary files differ
diff --git a/public/data-gl/thumb/image-surface-sushuang.jpg b/public/data-gl/thumb/image-surface-sushuang.jpg
deleted file mode 100644
index aeb24fd..0000000
--- a/public/data-gl/thumb/image-surface-sushuang.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/image-surface-sushuang.png b/public/data-gl/thumb/image-surface-sushuang.png
new file mode 100644
index 0000000..271ab6d
--- /dev/null
+++ b/public/data-gl/thumb/image-surface-sushuang.png
Binary files differ
diff --git a/public/data-gl/thumb/image-surface-sushuang.webp b/public/data-gl/thumb/image-surface-sushuang.webp
new file mode 100644
index 0000000..78bd596
--- /dev/null
+++ b/public/data-gl/thumb/image-surface-sushuang.webp
Binary files differ
diff --git a/public/data-gl/thumb/image-to-bar3d.jpg b/public/data-gl/thumb/image-to-bar3d.jpg
deleted file mode 100644
index 706376d..0000000
--- a/public/data-gl/thumb/image-to-bar3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/image-to-bar3d.png b/public/data-gl/thumb/image-to-bar3d.png
new file mode 100644
index 0000000..80095fc
--- /dev/null
+++ b/public/data-gl/thumb/image-to-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb/image-to-bar3d.webp b/public/data-gl/thumb/image-to-bar3d.webp
new file mode 100644
index 0000000..a0613cf
--- /dev/null
+++ b/public/data-gl/thumb/image-to-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/iron-globe.jpg b/public/data-gl/thumb/iron-globe.jpg
deleted file mode 100644
index 989f926..0000000
--- a/public/data-gl/thumb/iron-globe.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/iron-globe.png b/public/data-gl/thumb/iron-globe.png
new file mode 100644
index 0000000..6bdc7a9
--- /dev/null
+++ b/public/data-gl/thumb/iron-globe.png
Binary files differ
diff --git a/public/data-gl/thumb/iron-globe.webp b/public/data-gl/thumb/iron-globe.webp
new file mode 100644
index 0000000..c96c6ff
--- /dev/null
+++ b/public/data-gl/thumb/iron-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb/line3d-orthographic.jpg b/public/data-gl/thumb/line3d-orthographic.jpg
deleted file mode 100644
index 48cd775..0000000
--- a/public/data-gl/thumb/line3d-orthographic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/line3d-orthographic.png b/public/data-gl/thumb/line3d-orthographic.png
new file mode 100644
index 0000000..3829fc7
--- /dev/null
+++ b/public/data-gl/thumb/line3d-orthographic.png
Binary files differ
diff --git a/public/data-gl/thumb/line3d-orthographic.webp b/public/data-gl/thumb/line3d-orthographic.webp
new file mode 100644
index 0000000..fcfabc6
--- /dev/null
+++ b/public/data-gl/thumb/line3d-orthographic.webp
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-airline-on-globe.jpg b/public/data-gl/thumb/lines3d-airline-on-globe.jpg
deleted file mode 100644
index 9320876..0000000
--- a/public/data-gl/thumb/lines3d-airline-on-globe.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-airline-on-globe.png b/public/data-gl/thumb/lines3d-airline-on-globe.png
new file mode 100644
index 0000000..dd1a6cc
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-airline-on-globe.png
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-airline-on-globe.webp b/public/data-gl/thumb/lines3d-airline-on-globe.webp
new file mode 100644
index 0000000..0d82d93
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-airline-on-globe.webp
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flight-path-on-mapbox.jpg b/public/data-gl/thumb/lines3d-flight-path-on-mapbox.jpg
deleted file mode 100644
index 73d1636..0000000
--- a/public/data-gl/thumb/lines3d-flight-path-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-gl.jpg b/public/data-gl/thumb/lines3d-flights-gl.jpg
deleted file mode 100644
index e6d4885..0000000
--- a/public/data-gl/thumb/lines3d-flights-gl.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-gl.png b/public/data-gl/thumb/lines3d-flights-gl.png
new file mode 100644
index 0000000..8dc7639
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights-gl.png
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-gl.webp b/public/data-gl/thumb/lines3d-flights-gl.webp
new file mode 100644
index 0000000..1dce4b0
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights-gl.webp
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-on-geo3d.jpg b/public/data-gl/thumb/lines3d-flights-on-geo3d.jpg
deleted file mode 100644
index 945a7a1..0000000
--- a/public/data-gl/thumb/lines3d-flights-on-geo3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-on-geo3d.png b/public/data-gl/thumb/lines3d-flights-on-geo3d.png
new file mode 100644
index 0000000..b827c05
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights-on-geo3d.png
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights-on-geo3d.webp b/public/data-gl/thumb/lines3d-flights-on-geo3d.webp
new file mode 100644
index 0000000..5d88783
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights-on-geo3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights.jpg b/public/data-gl/thumb/lines3d-flights.jpg
deleted file mode 100644
index 2067e0e..0000000
--- a/public/data-gl/thumb/lines3d-flights.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights.png b/public/data-gl/thumb/lines3d-flights.png
new file mode 100644
index 0000000..0debb96
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights.png
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-flights.webp b/public/data-gl/thumb/lines3d-flights.webp
new file mode 100644
index 0000000..6609bdd
--- /dev/null
+++ b/public/data-gl/thumb/lines3d-flights.webp
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-taxi-chengdu.jpg b/public/data-gl/thumb/lines3d-taxi-chengdu.jpg
deleted file mode 100644
index 317563e..0000000
--- a/public/data-gl/thumb/lines3d-taxi-chengdu.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/lines3d-taxi-routes-of-cape-town.jpg b/public/data-gl/thumb/lines3d-taxi-routes-of-cape-town.jpg
deleted file mode 100644
index aa8b310..0000000
--- a/public/data-gl/thumb/lines3d-taxi-routes-of-cape-town.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/linesGL-ny.jpg b/public/data-gl/thumb/linesGL-ny.jpg
deleted file mode 100644
index e3d5b46..0000000
--- a/public/data-gl/thumb/linesGL-ny.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/linesGL-ny.png b/public/data-gl/thumb/linesGL-ny.png
new file mode 100644
index 0000000..a7fb1b6
--- /dev/null
+++ b/public/data-gl/thumb/linesGL-ny.png
Binary files differ
diff --git a/public/data-gl/thumb/linesGL-ny.webp b/public/data-gl/thumb/linesGL-ny.webp
new file mode 100644
index 0000000..478fbfa
--- /dev/null
+++ b/public/data-gl/thumb/linesGL-ny.webp
Binary files differ
diff --git a/public/data-gl/thumb/map3d-alcohol-consumption.jpg b/public/data-gl/thumb/map3d-alcohol-consumption.jpg
deleted file mode 100644
index 49a1b1a..0000000
--- a/public/data-gl/thumb/map3d-alcohol-consumption.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-alcohol-consumption.png b/public/data-gl/thumb/map3d-alcohol-consumption.png
new file mode 100644
index 0000000..e805fc4
--- /dev/null
+++ b/public/data-gl/thumb/map3d-alcohol-consumption.png
Binary files differ
diff --git a/public/data-gl/thumb/map3d-alcohol-consumption.webp b/public/data-gl/thumb/map3d-alcohol-consumption.webp
new file mode 100644
index 0000000..b394476
--- /dev/null
+++ b/public/data-gl/thumb/map3d-alcohol-consumption.webp
Binary files differ
diff --git a/public/data-gl/thumb/map3d-buildings-on-mapbox.jpg b/public/data-gl/thumb/map3d-buildings-on-mapbox.jpg
deleted file mode 100644
index b64014a..0000000
--- a/public/data-gl/thumb/map3d-buildings-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-buildings.jpg b/public/data-gl/thumb/map3d-buildings.jpg
deleted file mode 100644
index 60e69ba..0000000
--- a/public/data-gl/thumb/map3d-buildings.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-buildings.png b/public/data-gl/thumb/map3d-buildings.png
new file mode 100644
index 0000000..b8b825c
--- /dev/null
+++ b/public/data-gl/thumb/map3d-buildings.png
Binary files differ
diff --git a/public/data-gl/thumb/map3d-buildings.webp b/public/data-gl/thumb/map3d-buildings.webp
new file mode 100644
index 0000000..bb1955a
--- /dev/null
+++ b/public/data-gl/thumb/map3d-buildings.webp
Binary files differ
diff --git a/public/data-gl/thumb/map3d-colorful-cities.jpg b/public/data-gl/thumb/map3d-colorful-cities.jpg
deleted file mode 100644
index 8a3cbc0..0000000
--- a/public/data-gl/thumb/map3d-colorful-cities.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-plastic-material-style-buildings-on-mapbox.jpg b/public/data-gl/thumb/map3d-plastic-material-style-buildings-on-mapbox.jpg
deleted file mode 100644
index d47bb40..0000000
--- a/public/data-gl/thumb/map3d-plastic-material-style-buildings-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-city.jpg b/public/data-gl/thumb/map3d-wood-city.jpg
deleted file mode 100644
index 649eb1b..0000000
--- a/public/data-gl/thumb/map3d-wood-city.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-city.png b/public/data-gl/thumb/map3d-wood-city.png
new file mode 100644
index 0000000..c54f216
--- /dev/null
+++ b/public/data-gl/thumb/map3d-wood-city.png
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-city.webp b/public/data-gl/thumb/map3d-wood-city.webp
new file mode 100644
index 0000000..ccaa419
--- /dev/null
+++ b/public/data-gl/thumb/map3d-wood-city.webp
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-map-on-mapbox.jpg b/public/data-gl/thumb/map3d-wood-map-on-mapbox.jpg
deleted file mode 100644
index dce1948..0000000
--- a/public/data-gl/thumb/map3d-wood-map-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-map.jpg b/public/data-gl/thumb/map3d-wood-map.jpg
deleted file mode 100644
index 5339b94..0000000
--- a/public/data-gl/thumb/map3d-wood-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-map.png b/public/data-gl/thumb/map3d-wood-map.png
new file mode 100644
index 0000000..c864648
--- /dev/null
+++ b/public/data-gl/thumb/map3d-wood-map.png
Binary files differ
diff --git a/public/data-gl/thumb/map3d-wood-map.webp b/public/data-gl/thumb/map3d-wood-map.webp
new file mode 100644
index 0000000..21bc2e5
--- /dev/null
+++ b/public/data-gl/thumb/map3d-wood-map.webp
Binary files differ
diff --git a/public/data-gl/thumb/metal-bar3d.jpg b/public/data-gl/thumb/metal-bar3d.jpg
deleted file mode 100644
index 18e116c..0000000
--- a/public/data-gl/thumb/metal-bar3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/metal-bar3d.png b/public/data-gl/thumb/metal-bar3d.png
new file mode 100644
index 0000000..40b0cc4
--- /dev/null
+++ b/public/data-gl/thumb/metal-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb/metal-bar3d.webp b/public/data-gl/thumb/metal-bar3d.webp
new file mode 100644
index 0000000..683d1e5
--- /dev/null
+++ b/public/data-gl/thumb/metal-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/metal-surface.jpg b/public/data-gl/thumb/metal-surface.jpg
deleted file mode 100644
index ba718c9..0000000
--- a/public/data-gl/thumb/metal-surface.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/metal-surface.png b/public/data-gl/thumb/metal-surface.png
new file mode 100644
index 0000000..e7a26f4
--- /dev/null
+++ b/public/data-gl/thumb/metal-surface.png
Binary files differ
diff --git a/public/data-gl/thumb/metal-surface.webp b/public/data-gl/thumb/metal-surface.webp
new file mode 100644
index 0000000..b847652
--- /dev/null
+++ b/public/data-gl/thumb/metal-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb/parametric-surface-rose.jpg b/public/data-gl/thumb/parametric-surface-rose.jpg
deleted file mode 100644
index 85487a3..0000000
--- a/public/data-gl/thumb/parametric-surface-rose.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/parametric-surface-rose.png b/public/data-gl/thumb/parametric-surface-rose.png
new file mode 100644
index 0000000..d71d39b
--- /dev/null
+++ b/public/data-gl/thumb/parametric-surface-rose.png
Binary files differ
diff --git a/public/data-gl/thumb/parametric-surface-rose.webp b/public/data-gl/thumb/parametric-surface-rose.webp
new file mode 100644
index 0000000..b0bbfbf
--- /dev/null
+++ b/public/data-gl/thumb/parametric-surface-rose.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3D-dataset.jpg b/public/data-gl/thumb/scatter3D-dataset.jpg
deleted file mode 100644
index f89716a..0000000
--- a/public/data-gl/thumb/scatter3D-dataset.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3D-dataset.png b/public/data-gl/thumb/scatter3D-dataset.png
new file mode 100644
index 0000000..a270c88
--- /dev/null
+++ b/public/data-gl/thumb/scatter3D-dataset.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3D-dataset.webp b/public/data-gl/thumb/scatter3D-dataset.webp
new file mode 100644
index 0000000..d4e3c0d
--- /dev/null
+++ b/public/data-gl/thumb/scatter3D-dataset.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-globe-population.jpg b/public/data-gl/thumb/scatter3d-globe-population.jpg
deleted file mode 100644
index 8eac2a7..0000000
--- a/public/data-gl/thumb/scatter3d-globe-population.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-globe-population.png b/public/data-gl/thumb/scatter3d-globe-population.png
new file mode 100644
index 0000000..3b71af8
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-globe-population.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-globe-population.webp b/public/data-gl/thumb/scatter3d-globe-population.webp
new file mode 100644
index 0000000..c223515
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-globe-population.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-orthographic.jpg b/public/data-gl/thumb/scatter3d-orthographic.jpg
deleted file mode 100644
index e376323..0000000
--- a/public/data-gl/thumb/scatter3d-orthographic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-orthographic.png b/public/data-gl/thumb/scatter3d-orthographic.png
new file mode 100644
index 0000000..308eae3
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-orthographic.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-orthographic.webp b/public/data-gl/thumb/scatter3d-orthographic.webp
new file mode 100644
index 0000000..a807620
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-orthographic.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-scatter.jpg b/public/data-gl/thumb/scatter3d-scatter.jpg
deleted file mode 100644
index 94a1400..0000000
--- a/public/data-gl/thumb/scatter3d-scatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-scatter.png b/public/data-gl/thumb/scatter3d-scatter.png
new file mode 100644
index 0000000..ce9600c
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-scatter.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-scatter.webp b/public/data-gl/thumb/scatter3d-scatter.webp
new file mode 100644
index 0000000..24b9561
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-scatter.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-shanghai.jpg b/public/data-gl/thumb/scatter3d-shanghai.jpg
deleted file mode 100644
index a8e8660..0000000
--- a/public/data-gl/thumb/scatter3d-shanghai.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-simplex-noise.jpg b/public/data-gl/thumb/scatter3d-simplex-noise.jpg
deleted file mode 100644
index 593e375..0000000
--- a/public/data-gl/thumb/scatter3d-simplex-noise.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-simplex-noise.png b/public/data-gl/thumb/scatter3d-simplex-noise.png
new file mode 100644
index 0000000..1f1a2f4
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-simplex-noise.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-simplex-noise.webp b/public/data-gl/thumb/scatter3d-simplex-noise.webp
new file mode 100644
index 0000000..84c8bcf
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d-simplex-noise.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d-weibo-checkin-on-mapbox.jpg b/public/data-gl/thumb/scatter3d-weibo-checkin-on-mapbox.jpg
deleted file mode 100644
index 2f72c2b..0000000
--- a/public/data-gl/thumb/scatter3d-weibo-checkin-on-mapbox.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d.jpg b/public/data-gl/thumb/scatter3d.jpg
deleted file mode 100644
index e3cfba5..0000000
--- a/public/data-gl/thumb/scatter3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d.png b/public/data-gl/thumb/scatter3d.png
new file mode 100644
index 0000000..1a0de97
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d.png
Binary files differ
diff --git a/public/data-gl/thumb/scatter3d.webp b/public/data-gl/thumb/scatter3d.webp
new file mode 100644
index 0000000..2065dbc
--- /dev/null
+++ b/public/data-gl/thumb/scatter3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/scatterGL-gps.jpg b/public/data-gl/thumb/scatterGL-gps.jpg
deleted file mode 100644
index 2c7e806..0000000
--- a/public/data-gl/thumb/scatterGL-gps.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scatterGL-gps.png b/public/data-gl/thumb/scatterGL-gps.png
new file mode 100644
index 0000000..cba24ab
--- /dev/null
+++ b/public/data-gl/thumb/scatterGL-gps.png
Binary files differ
diff --git a/public/data-gl/thumb/scatterGL-gps.webp b/public/data-gl/thumb/scatterGL-gps.webp
new file mode 100644
index 0000000..8effd66
--- /dev/null
+++ b/public/data-gl/thumb/scatterGL-gps.webp
Binary files differ
diff --git a/public/data-gl/thumb/scattergl-weibo.jpg b/public/data-gl/thumb/scattergl-weibo.jpg
deleted file mode 100644
index a63fe61..0000000
--- a/public/data-gl/thumb/scattergl-weibo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/scattergl-weibo.png b/public/data-gl/thumb/scattergl-weibo.png
new file mode 100644
index 0000000..8fde26e
--- /dev/null
+++ b/public/data-gl/thumb/scattergl-weibo.png
Binary files differ
diff --git a/public/data-gl/thumb/scattergl-weibo.webp b/public/data-gl/thumb/scattergl-weibo.webp
new file mode 100644
index 0000000..2cc6212
--- /dev/null
+++ b/public/data-gl/thumb/scattergl-weibo.webp
Binary files differ
diff --git a/public/data-gl/thumb/simple-surface.jpg b/public/data-gl/thumb/simple-surface.jpg
deleted file mode 100644
index 988b75c..0000000
--- a/public/data-gl/thumb/simple-surface.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/simple-surface.png b/public/data-gl/thumb/simple-surface.png
new file mode 100644
index 0000000..ccb62bf
--- /dev/null
+++ b/public/data-gl/thumb/simple-surface.png
Binary files differ
diff --git a/public/data-gl/thumb/simple-surface.webp b/public/data-gl/thumb/simple-surface.webp
new file mode 100644
index 0000000..4b3a62d
--- /dev/null
+++ b/public/data-gl/thumb/simple-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb/sphere-parametric-surface.jpg b/public/data-gl/thumb/sphere-parametric-surface.jpg
deleted file mode 100644
index 4454bac..0000000
--- a/public/data-gl/thumb/sphere-parametric-surface.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/sphere-parametric-surface.png b/public/data-gl/thumb/sphere-parametric-surface.png
new file mode 100644
index 0000000..922e351
--- /dev/null
+++ b/public/data-gl/thumb/sphere-parametric-surface.png
Binary files differ
diff --git a/public/data-gl/thumb/sphere-parametric-surface.webp b/public/data-gl/thumb/sphere-parametric-surface.webp
new file mode 100644
index 0000000..0de47ec
--- /dev/null
+++ b/public/data-gl/thumb/sphere-parametric-surface.webp
Binary files differ
diff --git a/public/data-gl/thumb/stacked-bar3d.jpg b/public/data-gl/thumb/stacked-bar3d.jpg
deleted file mode 100644
index 8f32e9f..0000000
--- a/public/data-gl/thumb/stacked-bar3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/stacked-bar3d.png b/public/data-gl/thumb/stacked-bar3d.png
new file mode 100644
index 0000000..3d8d7f8
--- /dev/null
+++ b/public/data-gl/thumb/stacked-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb/stacked-bar3d.webp b/public/data-gl/thumb/stacked-bar3d.webp
new file mode 100644
index 0000000..7ce9528
--- /dev/null
+++ b/public/data-gl/thumb/stacked-bar3d.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-breather.jpg b/public/data-gl/thumb/surface-breather.jpg
deleted file mode 100644
index bfe3369..0000000
--- a/public/data-gl/thumb/surface-breather.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-breather.png b/public/data-gl/thumb/surface-breather.png
new file mode 100644
index 0000000..7ce335f
--- /dev/null
+++ b/public/data-gl/thumb/surface-breather.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-breather.webp b/public/data-gl/thumb/surface-breather.webp
new file mode 100644
index 0000000..2930470
--- /dev/null
+++ b/public/data-gl/thumb/surface-breather.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-golden-rose.jpg b/public/data-gl/thumb/surface-golden-rose.jpg
deleted file mode 100644
index bca8f00..0000000
--- a/public/data-gl/thumb/surface-golden-rose.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-golden-rose.png b/public/data-gl/thumb/surface-golden-rose.png
new file mode 100644
index 0000000..fa6d743
--- /dev/null
+++ b/public/data-gl/thumb/surface-golden-rose.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-golden-rose.webp b/public/data-gl/thumb/surface-golden-rose.webp
new file mode 100644
index 0000000..b632182
--- /dev/null
+++ b/public/data-gl/thumb/surface-golden-rose.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-leather.jpg b/public/data-gl/thumb/surface-leather.jpg
deleted file mode 100644
index 043ff90..0000000
--- a/public/data-gl/thumb/surface-leather.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-leather.png b/public/data-gl/thumb/surface-leather.png
new file mode 100644
index 0000000..e3a7182
--- /dev/null
+++ b/public/data-gl/thumb/surface-leather.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-leather.webp b/public/data-gl/thumb/surface-leather.webp
new file mode 100644
index 0000000..4388991
--- /dev/null
+++ b/public/data-gl/thumb/surface-leather.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-mollusc-shell.jpg b/public/data-gl/thumb/surface-mollusc-shell.jpg
deleted file mode 100644
index 76d5fda..0000000
--- a/public/data-gl/thumb/surface-mollusc-shell.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-mollusc-shell.png b/public/data-gl/thumb/surface-mollusc-shell.png
new file mode 100644
index 0000000..21ecd49
--- /dev/null
+++ b/public/data-gl/thumb/surface-mollusc-shell.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-mollusc-shell.webp b/public/data-gl/thumb/surface-mollusc-shell.webp
new file mode 100644
index 0000000..b48ed3d
--- /dev/null
+++ b/public/data-gl/thumb/surface-mollusc-shell.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-theme-roses.jpg b/public/data-gl/thumb/surface-theme-roses.jpg
deleted file mode 100644
index 9adc40a..0000000
--- a/public/data-gl/thumb/surface-theme-roses.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-theme-roses.png b/public/data-gl/thumb/surface-theme-roses.png
new file mode 100644
index 0000000..87e5ad1
--- /dev/null
+++ b/public/data-gl/thumb/surface-theme-roses.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-theme-roses.webp b/public/data-gl/thumb/surface-theme-roses.webp
new file mode 100644
index 0000000..abb667e
--- /dev/null
+++ b/public/data-gl/thumb/surface-theme-roses.webp
Binary files differ
diff --git a/public/data-gl/thumb/surface-wave.jpg b/public/data-gl/thumb/surface-wave.jpg
deleted file mode 100644
index 4a1e9cc..0000000
--- a/public/data-gl/thumb/surface-wave.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/surface-wave.png b/public/data-gl/thumb/surface-wave.png
new file mode 100644
index 0000000..2b06cc7
--- /dev/null
+++ b/public/data-gl/thumb/surface-wave.png
Binary files differ
diff --git a/public/data-gl/thumb/surface-wave.webp b/public/data-gl/thumb/surface-wave.webp
new file mode 100644
index 0000000..ce85793
--- /dev/null
+++ b/public/data-gl/thumb/surface-wave.webp
Binary files differ
diff --git a/public/data-gl/thumb/transparent-bar3d.jpg b/public/data-gl/thumb/transparent-bar3d.jpg
deleted file mode 100644
index 20833f5..0000000
--- a/public/data-gl/thumb/transparent-bar3d.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data-gl/thumb/transparent-bar3d.png b/public/data-gl/thumb/transparent-bar3d.png
new file mode 100644
index 0000000..2103037
--- /dev/null
+++ b/public/data-gl/thumb/transparent-bar3d.png
Binary files differ
diff --git a/public/data-gl/thumb/transparent-bar3d.webp b/public/data-gl/thumb/transparent-bar3d.webp
new file mode 100644
index 0000000..f266299
--- /dev/null
+++ b/public/data-gl/thumb/transparent-bar3d.webp
Binary files differ
diff --git a/public/data-gl/transparent-bar3d.js b/public/data-gl/transparent-bar3d.js
index 888a181..c001eb5 100644
--- a/public/data-gl/transparent-bar3d.js
+++ b/public/data-gl/transparent-bar3d.js
@@ -2,7 +2,6 @@
 title: Transparent Bar3D
 category: bar3D
 titleCN: Transparent Bar3D
-scripts: 'http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js'
 */
 
 
@@ -56,22 +55,18 @@
 
         label: {
             show: false,
-            textStyle: {
-                fontSize: 16,
-                borderWidth: 1
-            }
+            fontSize: 16,
+            borderWidth: 1
         },
-        
+
         itemStyle: {
             opacity: 0.4
         },
 
         emphasis: {
             label: {
-                textStyle: {
-                    fontSize: 20,
-                    color: '#900'
-                }
+                fontSize: 20,
+                color: '#900'
             },
             itemStyle: {
                 color: '#900'
diff --git a/public/data/archive/custom-combine-separate-morph.js b/public/data/archive/custom-combine-separate-morph.js
new file mode 100644
index 0000000..0e3a2f3
--- /dev/null
+++ b/public/data/archive/custom-combine-separate-morph.js
@@ -0,0 +1,508 @@
+/*
+title: Combine-Separate Morphing
+category: custom
+titleCN: 聚合分割形变
+difficulty: 11
+*/
+
+
+var PIE_COLORS = [
+    '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF'
+];
+var CLUSTER_COLORS = [
+    '#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'
+];
+var Z_TAG_COLORS = [
+    '#5470c6',
+    '#91cc75',
+    '#fac858',
+    '#ee6666',
+    '#73c0de',
+    '#3ba272',
+    '#fc8452',
+    '#9a60b4',
+    '#ea7ccc'
+];
+var Z_TAG_COLORS_2 = [
+    '#51689b', '#ce5c5c', '#fbc357', '#8fbf8f', '#659d84', '#fb8e6a', '#c77288', '#786090',
+    '#91c4c5', '#6890ba'
+];
+var SYMBOL_PATHS = [
+    'path://m67.25,28.9c27.42,-69.1 134.84,0 0,88.85c-134.84,-88.85 -27.42,-157.96 0,-88.85z',
+    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM22 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM10 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM16 28c-5.215 0-9.544-4.371-10-9.947 2.93 1.691 6.377 2.658 10 2.658s7.070-0.963 10-2.654c-0.455 5.576-4.785 9.942-10 9.942z',
+    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16c8.837 0 16-7.163 16-16s-7.163-16-16-16zM22 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.192-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.050 0.301-0.311 0.522-0.616 0.522-0 0 0 0-0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM10 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.193-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.051 0.301-0.311 0.522-0.616 0.522 0 0 0 0 0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM6 18h6v7.745c-3.44-0.894-6-4.035-6-7.745zM14 26v-8h4v8h-4zM20 25.745v-7.745h6c0 3.71-2.559 6.851-6 7.745z',
+    'path://M23.6 2c4.637 0 8.4 3.764 8.4 8.401 0 9.132-9.87 11.964-15.999 21.232-6.485-9.326-16.001-11.799-16.001-21.232 0-4.637 3.763-8.401 8.4-8.401 1.886 0 3.625 0.86 5.025 2.12l-2.425 3.88 7 4-4 10 11-12-7-4 1.934-2.901c1.107-0.68 2.35-1.099 3.665-1.099z',
+    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z',
+    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z'
+];
+var CONTENT_COLOR = '#37A2DA';
+var ANIMATION_DURATION_UPDATE = 1500;
+
+
+var RAW_DATA = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];
+
+var RAW_DATA_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID'];
+var M_TAG_SUM_DIMENSIONS = ['ATA', 'STE', 'CTZ', 'M_TAG'];
+var RAW_CLUSTER_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];
+var RAW_CLUSTER_CENTERS_DIMENSIONS = ['COUNT', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];
+
+function getFromPalette(value, palette) {
+    if (!palette.__colorMap) {
+        palette.__colorMap = {};
+    }
+    if (palette.__colorIdx == null) {
+        palette.__colorIdx = 0;
+    }
+    if (!palette.__colorMap[value]) {
+        palette.__colorMap[value] = palette[palette.__colorIdx];
+        palette.__colorIdx++;
+        if (palette.__colorIdx >= palette.length) {
+            palette.__colorIdx = 0;
+        }
+    }
+    return palette.__colorMap[value];
+}
+
+
+
+
+
+var baseOption = {
+    dataset: [{
+        id: 'raw',
+        dimensions: RAW_DATA_DIMENSIONS,
+        source: RAW_DATA
+    }, {
+        id: 'mTagSum',
+        fromDatasetId: 'raw',
+        transform: {
+            type: 'ecSimpleTransform:aggregate',
+            config: {
+                resultDimensions: [
+                    { from: 'ATA', method: 'sum' },
+                    { from: 'STE', method: 'sum' },
+                    { from: 'CTZ', method: 'sum' },
+                    { from: 'M_TAG' }
+                ],
+                groupBy: 'M_TAG'
+            }
+        }
+    }, {
+        id: 'rawClusters',
+        fromDatasetId: 'raw',
+        transform: {
+            type: 'ecStat:clustering',
+            // print: true,
+            config: {
+                clusterCount: 4,
+                dimensions: ['ATA', 'STE'],
+                outputClusterIndexDimension: {
+                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_IDX'),
+                    name: 'CLUSTER_IDX'
+                },
+                outputCentroidDimensions: [{
+                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_ATA'),
+                    name: 'CLUSTER_CENTER_ATA'
+                }, {
+                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_STE'),
+                    name: 'CLUSTER_CENTER_STE'
+                }]
+            }
+        }
+    }, {
+        id: 'rawClusterCenters',
+        fromDatasetId: 'rawClusters',
+        transform: {
+            type: 'ecSimpleTransform:aggregate',
+            // print: true,
+            config: {
+                resultDimensions: [
+                    { name: 'COUNT', from: 'ATA', method: 'count' },
+                    { from: 'CLUSTER_CENTER_ATA' },
+                    { from: 'CLUSTER_CENTER_STE' },
+                    { from: 'CLUSTER_IDX' }
+                ],
+                groupBy: 'CLUSTER_IDX'
+            }
+        }
+    }],
+    tooltip: {}
+};
+
+
+function makeScatterOptionCreator(renderItem) {
+    return function () {
+        var datasetId = 'rawClusters';
+        return {
+            datasetId: datasetId,
+            option: {
+                grid: {
+                    containLabel: true
+                },
+                xAxis: {
+                    name: 'STE'
+                },
+                yAxis: {
+                    name: 'ATA'
+                },
+                series: {
+                    type: 'custom',
+                    coordinateSystem: 'cartesian2d',
+                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+                    datasetId: datasetId,
+                    encode: {
+                        itemName: 'ID',
+                        x: 'STE',
+                        y: 'ATA',
+                        tooltip: ['STE', 'ATA']
+                    },
+                    renderItem: renderItem
+                }
+            }
+        }
+    };
+}
+
+
+
+
+var optionCreators = {
+
+    'Scatter': makeScatterOptionCreator(
+        function (params, api) {
+            var pos = api.coord([
+                api.value('STE'),
+                api.value('ATA')
+            ]);
+            var zTagVal = api.value('Z_TAG');
+            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
+            return {
+                type: 'circle',
+                morph: true,
+                shape: {
+                    cx: pos[0],
+                    cy: pos[1],
+                    r: 10
+                },
+                style: {
+                    fill: color
+                },
+                transition: ['shape', 'style']
+            };
+        }
+    ),
+
+    'Glyph': makeScatterOptionCreator(
+        function (params, api) {
+            var pos = api.coord([
+                api.value('STE'),
+                api.value('ATA')
+            ]);
+            var zTagVal = api.value('Z_TAG');
+            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
+            var symbolPath = getFromPalette(zTagVal, SYMBOL_PATHS);
+            return {
+                type: 'path',
+                morph: true,
+                x: pos[0],
+                y: pos[1],
+                shape: {
+                    pathData: symbolPath,
+                    width: 40,
+                    height: 40
+                },
+                style: {
+                    fill: color
+                },
+                transition: ['style']
+            };
+        }
+    ),
+
+    'House': makeScatterOptionCreator(
+        function (params, api) {
+            var pos = api.coord([
+                api.value('STE'),
+                api.value('ATA')
+            ]);
+            var zTagVal = api.value('Z_TAG');
+            var color1 = getFromPalette(zTagVal, Z_TAG_COLORS);
+            var color2 = '#aaa';
+            return {
+                type: 'group',
+                x: pos[0],
+                y: pos[1],
+                children: [{
+                    type: 'polygon',
+                    morph: true,
+                    shape: {
+                        points: [
+                            [-25, -1],
+                            [25, -1],
+                            [0, -20]
+                        ]
+                    },
+                    style: {
+                        fill: color1
+                    },
+                    transition: ['shape', 'style']
+                }, {
+                    type: 'rect',
+                    morph: true,
+                    shape: {
+                        x: -15,
+                        y: 0,
+                        width: 30,
+                        height: 20
+                    },
+                    style: {
+                        fill: color2,
+                        stroke: '#fff',
+                        lineWidth: 1
+                    },
+                    transition: ['shape', 'style']
+                }]
+            };
+        }
+    ),
+
+    'Bar_Sum': function () {
+        var datasetId = 'mTagSum'
+        return {
+            datasetId: datasetId,
+            option: {
+                grid: {
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category'
+                },
+                yAxis: {
+                },
+                series: {
+                    type: 'custom',
+                    coordinateSystem: 'cartesian2d',
+                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+                    datasetId: datasetId,
+                    encode: {
+                        x: 'M_TAG',
+                        y: 'ATA',
+                        tooltip: ['M_TAG', 'ATA']
+                    },
+                    renderItem: function (params, api) {
+                        var mTagVal = api.value('M_TAG');
+                        var ataVal = api.value('ATA');
+                        var tarPos = api.coord([mTagVal, ataVal]);
+                        var zeroPos = api.coord([mTagVal, 0]);
+                        var size = api.size([mTagVal, ataVal]);
+                        var width = size[0] * 0.4;
+                        return {
+                            type: 'rect',
+                            morph: true,
+                            shape: {
+                                x: tarPos[0] - width / 2,
+                                y: tarPos[1],
+                                height: zeroPos[1] - tarPos[1],
+                                width: width,
+                            },
+                            style: {
+                                fill: CONTENT_COLOR
+                            },
+                            transition: ['shape', 'style']
+                        };
+                    }
+                }
+            }
+        };
+    },
+
+    'Pie_Sum': function () {
+        var datasetId = 'mTagSum';
+        return {
+            datasetId: datasetId,
+            option: {
+                series: {
+                    type: 'custom',
+                    coordinateSystem: 'none',
+                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+                    datasetId: datasetId,
+                    encode: {
+                        itemName: 'M_TAG',
+                        value: 'ATA',
+                        tooltip: 'ATA'
+                    },
+                    renderItem: function (params, api) {
+                        var context = params.context;
+                        if (!context.layout) {
+                            context.layout = true;
+                            var totalValue = 0;
+                            for (var i = 0; i < params.dataInsideLength; i++) {
+                                totalValue += api.value('ATA', i);
+                            }
+                            var angles = [];
+                            var colors = [];
+                            var currentAngle = -Math.PI / 2;
+                            for (var i = 0; i < params.dataInsideLength; i++) {
+                                colors.push(PIE_COLORS[i]);
+                                var angle = api.value('ATA', i) / totalValue * Math.PI * 2;
+                                angles.push([currentAngle, angle + currentAngle - 0.01]);
+                                currentAngle += angle;
+                            }
+                            context.angles = angles;
+                            context.colors = colors;
+                        }
+
+                        var width = myChart.getWidth();
+                        var height = myChart.getHeight();
+                        return {
+                            type: 'sector',
+                            morph: true,
+                            shape: {
+                                cx: width / 2,
+                                cy: height / 2,
+                                r: Math.min(width, height) / 3,
+                                r0: Math.min(width, height) / 5,
+                                startAngle: context.angles[params.dataIndex][0],
+                                endAngle: context.angles[params.dataIndex][1],
+                                clockwise: true
+                            },
+                            style: {
+                                // fill: CONTENT_COLOR,
+                                fill: context.colors[params.dataIndex]
+                            },
+                            transition: ['shape', 'style']
+                        };
+                    }
+                }
+            }
+        };
+    },
+
+    'Clustered': function () {
+        var datasetId = 'rawClusterCenters';
+        return {
+            datasetId: datasetId,
+            option: {
+                grid: {
+                    containLabel: true
+                },
+                xAxis: {
+                    name: 'STE'
+                },
+                yAxis: {
+                    name: 'ATA'
+                },
+                series: {
+                    type: 'custom',
+                    coordinateSystem: 'cartesian2d',
+                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+                    datasetId: datasetId,
+                    encode: {
+                        x: 'CLUSTER_CENTER_STE',
+                        y: 'CLUSTER_CENTER_ATA',
+                        tooltip: ['CLUSTER_CENTER_STE', 'CLUSTER_CENTER_ATA']
+                    },
+                    renderItem: function (params, api) {
+                        var context = params.context;
+                        if (!context.layout) {
+                            context.layout = true;
+                            context.totalCount = 0;
+                            for (var i = 0; i < params.dataInsideLength; i++) {
+                                context.totalCount += api.value('COUNT', i);
+                            }
+                        }
+
+                        var pos = api.coord([
+                            api.value('CLUSTER_CENTER_STE'),
+                            api.value('CLUSTER_CENTER_ATA')
+                        ]);
+                        var count = api.value('COUNT');
+                        var radius = count / context.totalCount * 100 + 10;
+                        return {
+                            type: 'circle',
+                            morph: true,
+                            shape: {
+                                cx: pos[0],
+                                cy: pos[1],
+                                r: radius,
+                            },
+                            style: {
+                                // fill: CONTENT_COLOR,
+                                fill: CLUSTER_COLORS[params.dataIndex]
+                            },
+                            transition: ['shape', 'style']
+                        };
+                    }
+                }
+            }
+        };
+    }
+};
+
+
+
+var _player;
+var _optionList = [];
+app.config = {};
+echarts.util.each(optionCreators, function (creator, key) {
+    var optionWrap = creator();
+    _optionList.push({
+        key: key,
+        dataMetaKey: optionWrap.datasetId,
+        option: optionWrap.option
+    });
+    app.config[key] = function () {
+        _player.go(key);
+    }
+});
+console.log(app.config);
+
+
+
+$.when(
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform/dist/ecSimpleTransform.min.js'),
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-option-player/dist/ecSimpleOptionPlayer.min.js'),
+).done(function () {
+    run();
+});
+
+
+function run() {
+
+    echarts.registerTransform(ecSimpleTransform.aggregate);
+    echarts.registerTransform(ecStat.transform.clustering);
+
+    _player = ecSimpleOptionPlayer.create({
+        chart: function () {
+            return myChart;
+        },
+        seriesIndex: 0,
+        replaceMerge: ['xAxis', 'yAxis'],
+        dataMeta: {
+            raw: {
+                dimensions: RAW_DATA_DIMENSIONS,
+                uniqueDimension: 'ID'
+            },
+            mTagSum: {
+                dimensions: M_TAG_SUM_DIMENSIONS,
+                uniqueDimension: 'M_TAG'
+            },
+            rawClusters: {
+                dimensions: RAW_CLUSTER_DIMENSIONS,
+                uniqueDimension: 'ID',
+                dividingMethod: 'duplicate'
+            },
+            rawClusterCenters: {
+                dimensions: RAW_CLUSTER_CENTERS_DIMENSIONS,
+                uniqueDimension: 'CLUSTER_IDX'
+            }
+        },
+        optionList: _optionList
+    });
+
+    myChart.setOption(baseOption, { lazyUpdate: true });
+
+    _player.go('Glyph');
+
+}
+
diff --git a/public/data/asset/js/myTransform.js b/public/data/asset/js/myTransform.js
deleted file mode 100644
index a2f97b5..0000000
--- a/public/data/asset/js/myTransform.js
+++ /dev/null
@@ -1,476 +0,0 @@
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.myTransform = {}));
-})(this, function (exports) {
-  'use strict';
-
-  var transform = {
-    type: 'myTransform:id',
-    transform: function (params) {
-      var upstream = params.upstream;
-      var config = params.config;
-      var dimensionIndex = config.dimensionIndex;
-      var dimensionName = config.dimensionName;
-      var dimsDef = upstream.cloneAllDimensionInfo();
-      dimsDef[dimensionIndex] = dimensionName;
-      var data = upstream.cloneRawData();
-
-      for (var i = 0, len = data.length; i < len; i++) {
-        var line = data[i];
-        line[dimensionIndex] = i;
-      }
-
-      return {
-        dimensions: dimsDef,
-        data: data
-      };
-    }
-  };
-  var arrayProto = Array.prototype;
-  var nativeForEach = arrayProto.forEach;
-  var nativeSlice = arrayProto.slice;
-  var nativeMap = arrayProto.map;
-
-  var ctorFunction = function () {}.constructor;
-
-  var protoFunction = ctorFunction ? ctorFunction.prototype : null;
-
-  function each(arr, cb, context) {
-    if (!(arr && cb)) {
-      return;
-    }
-
-    if (arr.forEach && arr.forEach === nativeForEach) {
-      arr.forEach(cb, context);
-    } else if (arr.length === +arr.length) {
-      for (var i = 0, len = arr.length; i < len; i++) {
-        cb.call(context, arr[i], i, arr);
-      }
-    } else {
-      for (var key in arr) {
-        if (arr.hasOwnProperty(key)) {
-          cb.call(context, arr[key], key, arr);
-        }
-      }
-    }
-  }
-
-  function map(arr, cb, context) {
-    if (!arr) {
-      return [];
-    }
-
-    if (!cb) {
-      return slice(arr);
-    }
-
-    if (arr.map && arr.map === nativeMap) {
-      return arr.map(cb, context);
-    } else {
-      var result = [];
-
-      for (var i = 0, len = arr.length; i < len; i++) {
-        result.push(cb.call(context, arr[i], i, arr));
-      }
-
-      return result;
-    }
-  }
-
-  function bindPolyfill(func, context) {
-    var args = [];
-
-    for (var _i = 2; _i < arguments.length; _i++) {
-      args[_i - 2] = arguments[_i];
-    }
-
-    return function () {
-      return func.apply(context, args.concat(nativeSlice.call(arguments)));
-    };
-  }
-
-  var bind = protoFunction && isFunction(protoFunction.bind) ? protoFunction.call.bind(protoFunction.bind) : bindPolyfill;
-
-  function isFunction(value) {
-    return typeof value === 'function';
-  }
-
-  function slice(arr) {
-    var args = [];
-
-    for (var _i = 1; _i < arguments.length; _i++) {
-      args[_i - 1] = arguments[_i];
-    }
-
-    return nativeSlice.apply(arr, args);
-  }
-
-  function assert(condition, message) {
-    if (!condition) {
-      throw new Error(message);
-    }
-  }
-
-  function hasOwn(own, prop) {
-    return own.hasOwnProperty(prop);
-  }
-
-  function quantile(ascArr, p) {
-    var H = (ascArr.length - 1) * p + 1;
-    var h = Math.floor(H);
-    var v = +ascArr[h - 1];
-    var e = H - h;
-    return e ? v + e * (ascArr[h] - v) : v;
-  }
-
-  var METHOD_INTERNAL = {
-    'SUM': true,
-    'COUNT': true,
-    'FIRST': true,
-    'AVERAGE': true,
-    'Q1': true,
-    'Q2': true,
-    'Q3': true,
-    'MIN': true,
-    'MAX': true
-  };
-  var METHOD_NEEDS_COLLECT = {
-    AVERAGE: ['COUNT']
-  };
-  var METHOD_NEEDS_GATHER_VALUES = {
-    Q1: true,
-    Q2: true,
-    Q3: true
-  };
-  var METHOD_ALIAS = {
-    MEDIAN: 'Q2'
-  };
-
-  var ResultDimInfoInternal = function () {
-    function ResultDimInfoInternal(index, indexInUpstream, method, name, needGatherValues) {
-      this.collectionInfoList = [];
-      this.gatheredValuesByGroup = {};
-      this.gatheredValuesNoGroup = [];
-      this.needGatherValues = false;
-      this._collectionInfoMap = {};
-      this.method = method;
-      this.name = name;
-      this.index = index;
-      this.indexInUpstream = indexInUpstream;
-      this.needGatherValues = needGatherValues;
-    }
-
-    ResultDimInfoInternal.prototype.addCollectionInfo = function (item) {
-      this._collectionInfoMap[item.method] = this.collectionInfoList.length;
-      this.collectionInfoList.push(item);
-    };
-
-    ResultDimInfoInternal.prototype.getCollectionInfo = function (method) {
-      return this.collectionInfoList[this._collectionInfoMap[method]];
-    };
-
-    ResultDimInfoInternal.prototype.gatherValue = function (groupByDimInfo, groupVal, value) {
-      value = +value;
-
-      if (groupByDimInfo) {
-        if (groupVal != null) {
-          var groupValStr = groupVal + '';
-          var values = this.gatheredValuesByGroup[groupValStr] || (this.gatheredValuesByGroup[groupValStr] = []);
-          values.push(value);
-        }
-      } else {
-        this.gatheredValuesNoGroup.push(value);
-      }
-    };
-
-    return ResultDimInfoInternal;
-  }();
-
-  var transform$1 = {
-    type: 'myTransform:aggregate',
-    transform: function (params) {
-      var upstream = params.upstream;
-      var config = params.config;
-      var groupByDimInfo = prepareGroupByDimInfo(config, upstream);
-
-      var _a = prepareDimensions(config, upstream, groupByDimInfo),
-          finalResultDimInfoList = _a.finalResultDimInfoList,
-          collectionDimInfoList = _a.collectionDimInfoList;
-
-      var collectionResult;
-
-      if (collectionDimInfoList.length) {
-        collectionResult = travel(groupByDimInfo, upstream, collectionDimInfoList, createCollectionResultLine, updateCollectionResultLine);
-      }
-
-      each(collectionDimInfoList, function (dimInfo) {
-        dimInfo.__collectionResult = collectionResult;
-        asc(dimInfo.gatheredValuesNoGroup);
-        each(dimInfo.gatheredValuesByGroup, function (values) {
-          asc(values);
-        });
-      });
-      var finalResult = travel(groupByDimInfo, upstream, finalResultDimInfoList, createFinalResultLine, updateFinalResultLine);
-      return {
-        dimensions: map(finalResultDimInfoList, function (item) {
-          return item.name;
-        }),
-        data: finalResult.outList
-      };
-    }
-  };
-
-  function prepareDimensions(config, upstream, groupByDimInfo) {
-    var resultDimensionsConfig = config.resultDimensions;
-    var finalResultDimInfoList = [];
-    var collectionDimInfoList = [];
-    var gIndexInLine = 0;
-
-    for (var i = 0; i < resultDimensionsConfig.length; i++) {
-      var resultDimInfoConfig = resultDimensionsConfig[i];
-      var dimInfoInUpstream = upstream.getDimensionInfo(resultDimInfoConfig.from);
-      assert(dimInfoInUpstream, 'Can not find dimension by `from`: ' + resultDimInfoConfig.from);
-      var rawMethod = resultDimInfoConfig.method;
-      assert(groupByDimInfo.index !== dimInfoInUpstream.index || rawMethod == null, "Dimension " + dimInfoInUpstream.name + " is the \"groupBy\" dimension, must not have any \"method\".");
-      var method = normalizeMethod(rawMethod);
-      assert(method, 'method is required');
-      var name_1 = resultDimInfoConfig.name != null ? resultDimInfoConfig.name : dimInfoInUpstream.name;
-      var finalResultDimInfo = new ResultDimInfoInternal(finalResultDimInfoList.length, dimInfoInUpstream.index, method, name_1, hasOwn(METHOD_NEEDS_GATHER_VALUES, method));
-      finalResultDimInfoList.push(finalResultDimInfo);
-      var needCollect = false;
-
-      if (hasOwn(METHOD_NEEDS_COLLECT, method)) {
-        needCollect = true;
-        var collectionTargetMethods = METHOD_NEEDS_COLLECT[method];
-
-        for (var j = 0; j < collectionTargetMethods.length; j++) {
-          finalResultDimInfo.addCollectionInfo({
-            method: collectionTargetMethods[j],
-            indexInLine: gIndexInLine++
-          });
-        }
-      }
-
-      if (hasOwn(METHOD_NEEDS_GATHER_VALUES, method)) {
-        needCollect = true;
-      }
-
-      if (needCollect) {
-        collectionDimInfoList.push(finalResultDimInfo);
-      }
-    }
-
-    return {
-      collectionDimInfoList: collectionDimInfoList,
-      finalResultDimInfoList: finalResultDimInfoList
-    };
-  }
-
-  function prepareGroupByDimInfo(config, upstream) {
-    var groupByConfig = config.groupBy;
-    var groupByDimInfo;
-
-    if (groupByConfig != null) {
-      groupByDimInfo = upstream.getDimensionInfo(groupByConfig);
-      assert(groupByDimInfo, 'Can not find dimension by `groupBy`: ' + groupByConfig);
-    }
-
-    return groupByDimInfo;
-  }
-
-  function travel(groupByDimInfo, upstream, resultDimInfoList, doCreate, doUpdate) {
-    var outList = [];
-    var mapByGroup;
-
-    if (groupByDimInfo) {
-      mapByGroup = {};
-
-      for (var dataIndex = 0, len = upstream.count(); dataIndex < len; dataIndex++) {
-        var groupByVal = upstream.retrieveValue(dataIndex, groupByDimInfo.index);
-
-        if (groupByVal == null) {
-          continue;
-        }
-
-        var groupByValStr = groupByVal + '';
-
-        if (!hasOwn(mapByGroup, groupByValStr)) {
-          var newLine = doCreate(upstream, dataIndex, resultDimInfoList, groupByDimInfo, groupByVal);
-          outList.push(newLine);
-          mapByGroup[groupByValStr] = newLine;
-        } else {
-          var targetLine = mapByGroup[groupByValStr];
-          doUpdate(upstream, dataIndex, targetLine, resultDimInfoList, groupByDimInfo, groupByVal);
-        }
-      }
-    } else {
-      var targetLine = doCreate(upstream, 0, resultDimInfoList);
-      outList.push(targetLine);
-
-      for (var dataIndex = 1, len = upstream.count(); dataIndex < len; dataIndex++) {
-        doUpdate(upstream, dataIndex, targetLine, resultDimInfoList);
-      }
-    }
-
-    return {
-      mapByGroup: mapByGroup,
-      outList: outList
-    };
-  }
-
-  function normalizeMethod(method) {
-    if (method == null) {
-      return 'FIRST';
-    }
-
-    var methodInternal = method.toUpperCase();
-    methodInternal = hasOwn(METHOD_ALIAS, methodInternal) ? METHOD_ALIAS[methodInternal] : methodInternal;
-    assert(hasOwn(METHOD_INTERNAL, methodInternal), "Illegal method " + method + ".");
-    return methodInternal;
-  }
-
-  var createCollectionResultLine = function (upstream, dataIndex, collectionDimInfoList, groupByDimInfo, groupByVal) {
-    var newLine = [];
-
-    for (var i = 0; i < collectionDimInfoList.length; i++) {
-      var dimInfo = collectionDimInfoList[i];
-      var collectionInfoList = dimInfo.collectionInfoList;
-
-      for (var j = 0; j < collectionInfoList.length; j++) {
-        var collectionInfo = collectionInfoList[j];
-        newLine[collectionInfo.indexInLine] = +lineCreator[collectionInfo.method](upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal);
-      }
-
-      if (dimInfo.needGatherValues) {
-        var val = upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-        dimInfo.gatherValue(groupByDimInfo, groupByVal, val);
-      }
-    }
-
-    return newLine;
-  };
-
-  var updateCollectionResultLine = function (upstream, dataIndex, targetLine, collectionDimInfoList, groupByDimInfo, groupByVal) {
-    for (var i = 0; i < collectionDimInfoList.length; i++) {
-      var dimInfo = collectionDimInfoList[i];
-      var collectionInfoList = dimInfo.collectionInfoList;
-
-      for (var j = 0; j < collectionInfoList.length; j++) {
-        var collectionInfo = collectionInfoList[j];
-        var indexInLine = collectionInfo.indexInLine;
-        targetLine[indexInLine] = +lineUpdater[collectionInfo.method](targetLine[indexInLine], upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal);
-      }
-
-      if (dimInfo.needGatherValues) {
-        var val = upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-        dimInfo.gatherValue(groupByDimInfo, groupByVal, val);
-      }
-    }
-  };
-
-  var createFinalResultLine = function (upstream, dataIndex, finalResultDimInfoList, groupByDimInfo, groupByVal) {
-    var newLine = [];
-
-    for (var i = 0; i < finalResultDimInfoList.length; i++) {
-      var dimInfo = finalResultDimInfoList[i];
-      var method = dimInfo.method;
-      newLine[i] = isGroupByDimension(groupByDimInfo, dimInfo) ? groupByVal : lineCreator[method](upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal);
-    }
-
-    return newLine;
-  };
-
-  var updateFinalResultLine = function (upstream, dataIndex, targetLine, finalResultDimInfoList, groupByDimInfo, groupByVal) {
-    for (var i = 0; i < finalResultDimInfoList.length; i++) {
-      var dimInfo = finalResultDimInfoList[i];
-
-      if (isGroupByDimension(groupByDimInfo, dimInfo)) {
-        continue;
-      }
-
-      var method = dimInfo.method;
-      targetLine[i] = lineUpdater[method](targetLine[i], upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal);
-    }
-  };
-
-  function isGroupByDimension(groupByDimInfo, targetDimInfo) {
-    return groupByDimInfo && targetDimInfo.indexInUpstream === groupByDimInfo.index;
-  }
-
-  function asc(list) {
-    list.sort(function (a, b) {
-      return a - b;
-    });
-  }
-
-  var lineCreator = {
-    'SUM': function () {
-      return 0;
-    },
-    'COUNT': function () {
-      return 1;
-    },
-    'FIRST': function (upstream, dataIndex, dimInfo) {
-      return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-    },
-    'MIN': function (upstream, dataIndex, dimInfo) {
-      return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-    },
-    'MAX': function (upstream, dataIndex, dimInfo) {
-      return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-    },
-    'AVERAGE': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) {
-      var collectLine = groupByDimInfo ? dimInfo.__collectionResult.mapByGroup[groupByVal + ''] : dimInfo.__collectionResult.outList[0];
-      return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream) / collectLine[dimInfo.getCollectionInfo('COUNT').indexInLine];
-    },
-    'Q1': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) {
-      return lineCreatorForQ(0.25, dimInfo, groupByDimInfo, groupByVal);
-    },
-    'Q2': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) {
-      return lineCreatorForQ(0.5, dimInfo, groupByDimInfo, groupByVal);
-    },
-    'Q3': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) {
-      return lineCreatorForQ(0.75, dimInfo, groupByDimInfo, groupByVal);
-    }
-  };
-  var lineUpdater = {
-    'SUM': function (val, upstream, dataIndex, dimInfo) {
-      return val + upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream);
-    },
-    'COUNT': function (val) {
-      return val + 1;
-    },
-    'FIRST': function (val) {
-      return val;
-    },
-    'MIN': function (val, upstream, dataIndex, dimInfo) {
-      return Math.min(val, upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream));
-    },
-    'MAX': function (val, upstream, dataIndex, dimInfo) {
-      return Math.max(val, upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream));
-    },
-    'AVERAGE': function (val, upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) {
-      var collectLine = groupByDimInfo ? dimInfo.__collectionResult.mapByGroup[groupByVal + ''] : dimInfo.__collectionResult.outList[0];
-      return val + upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream) / collectLine[dimInfo.getCollectionInfo('COUNT').indexInLine];
-    },
-    'Q1': function (val, upstream, dataIndex, dimInfo) {
-      return val;
-    },
-    'Q2': function (val, upstream, dataIndex, dimInfo) {
-      return val;
-    },
-    'Q3': function (val, upstream, dataIndex, dimInfo) {
-      return val;
-    }
-  };
-
-  function lineCreatorForQ(percent, dimInfo, groupByDimInfo, groupByVal) {
-    var gatheredValues = groupByDimInfo ? dimInfo.gatheredValuesByGroup[groupByVal + ''] : dimInfo.gatheredValuesNoGroup;
-    return quantile(gatheredValues, percent);
-  }
-
-  exports.aggregate = transform$1;
-  exports.id = transform;
-  Object.defineProperty(exports, '__esModule', {
-    value: true
-  });
-});
\ No newline at end of file
diff --git a/public/data/asset/js/transitionPlayer.js b/public/data/asset/js/transitionPlayer.js
deleted file mode 100644
index 6355e99..0000000
--- a/public/data/asset/js/transitionPlayer.js
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-(function (exports) {
-
-    var transitionPlayer = {};
-
-    /**
-     * @usage
-     * ```js
-     * // Initialize with an array of echarts option info:
-     * var player = transitionPlayer.create({
-     *
-     *     // The echarts instance or chart instance getter.
-     *     chart: function () {
-     *         return myChart;
-     *     },
-     *     seriesIndex: 0,
-     *     replaceMerge: ['xAxis', 'yAxis']
-     *
-     *     // The data meta info used to determine how to
-     *     // make transition mapping.
-     *     // The strategy: If `uniqueDimension` provided and is a common
-     *     // dimension, use `uniqueDimension`.
-     *     dataMeta: {
-     *         aaa: {
-     *             dimensions: ['qqq', 'www', 'eee', 'rrr']
-     *         },
-     *         bbb: {
-     *             dimensions: ['ccc', 'www', 'eee'],
-     *             uniqueDimension: 'www',
-     *             dividingMethod: 'duplicate'
-     *         },
-     *         ...
-     *     },
-     *
-     *     // echarts option collection:
-     *     optionList: [
-     *         // dataMetaKey is the key of 'dataMeta'.
-     *         { key: 'Time_Income_Bar', option: option0, dataMetaKey: 'aaa' },
-     *         { key: 'Population_Income_Scatter', option: option1, dataMetaKey: 'bbb' },
-     *         { key: 'Time_Income_Pie', option: option2, dataMetaKey: 'aaa' },
-     *         ...
-     *     ]
-     * });
-     *
-     * // Then start to play:
-     * player.next(); // Display next option (from the first option).
-     * player.previous(); // Display previous optoin.
-     * player.go('Time_Income_Pie'); // Display the specified option.
-     * player.getOptionKeys(); // return `['Time_Income_Bar', 'Population_Income_Scatter', 'Time_Income_Pie']`
-     * ```
-     *
-     * @parma opt See the constructor of `TransitionPlayer`.
-     */
-    transitionPlayer.create = function (opt) {
-        return new TransitionPlayer(opt);
-    };
-
-    /**
-     * @param opt
-     * @param opt.chart
-     *        (EChartsInstance | () => EChartsInstance)
-     *        echarts instance or echarts instance getter.
-     * @param opt.dataMeta
-     *        {
-     *            [dataMetaKey in string]: {
-     *                dimensions: string[];
-     *                uniqueDimension?: string;
-     *                dividingMethod?: 'split' | 'duplicate'
-     *            }
-     *        }
-     * @param opt.optionList
-     *        {
-     *            key: string;
-     *            option: EChartsOption;
-     *            dataMetaKey: string;
-     *        }[]
-     * @param opt.seriesIndex number
-     *        Target series index to be transitioned.
-     * @param opt.replaceMerge? string[]
-     */
-    function TransitionPlayer(opt) {
-        assert(
-            opt.chart
-            && isObject(opt.dataMeta)
-            && isArray(opt.optionList)
-            && opt.seriesIndex != null
-            && opt.optionList.length
-        );
-
-        this._chart = opt.chart;
-        this._dataMeta = opt.dataMeta;
-        var optionList = this._optionList = opt.optionList;
-        var optionMap = this._optionMap = {};
-        this._replaceMerge = opt.replaceMerge;
-        this._seriesIndex = opt.seriesIndex;
-        this._currOptionIdx = null;
-
-        for (var i = 0; i < optionList.length; i++) {
-            var optionWrap = optionList[i];
-            var optionKey = optionWrap.key;
-            if (optionKey != null) {
-                assert(!hasOwn(optionMap, optionKey), 'option key duplicat: ' + optionKey);
-                optionMap[optionKey] = i;
-            }
-        }
-    }
-
-    var proto = TransitionPlayer.prototype;
-
-    proto.next = function () {
-        var optionList = this._optionList;
-        var newOptionIdx = this._currOptionIdx == null
-            ? 0
-            : Math.min(optionList.length - 1, this._currOptionIdx + 1);
-
-        this._doChangeOption(newOptionIdx);
-    };
-
-    proto.previous = function () {
-        var optionList = this._optionList;
-        var newOptionIdx = this._currOptionIdx == null
-            ? optionList.length - 1
-            : Math.max(0, this._currOptionIdx - 1);
-
-        this._doChangeOption(newOptionIdx);
-    };
-
-    /**
-     * @param optionKey string
-     */
-    proto.go = function (optionKey) {
-        var newOptionIdx = getMapValue(this._optionMap, optionKey);
-        assert(newOptionIdx != null, 'Can not find option by option key: ' + optionKey);
-
-        this._doChangeOption(newOptionIdx);
-    };
-
-    proto._doChangeOption = function (newOptionIdx) {
-        var optionList = this._optionList;
-        var oldOptionWrap = this._currOptionIdx != null ? optionList[this._currOptionIdx] : null;
-        var newOptionWrap = optionList[newOptionIdx];
-        var dataMeta = this._dataMeta;
-        var targetSeriesIndex = this._seriesIndex;
-
-        var transitionOpt = {
-            // If can not find mapped dimensions, do not make transition animation
-            // by default, becuase this transition probably bring about misleading.
-            to: { seriesIndex: targetSeriesIndex }
-        };
-
-        if (oldOptionWrap) {
-            var commonDimension =
-                findCommonDimension(oldOptionWrap, newOptionWrap)
-                || findCommonDimension(newOptionWrap, oldOptionWrap);
-            if (commonDimension != null) {
-                transitionOpt = {
-                    from: {
-                        seriesIndex: targetSeriesIndex,
-                        dimension: commonDimension
-                    },
-                    to: {
-                        seriesIndex: targetSeriesIndex,
-                        dimension: commonDimension,
-                    },
-                    dividingMethod: dataMeta.dividingMethod
-                };
-            }
-        }
-
-        this._currOptionIdx = newOptionIdx;
-
-        this._getChart().setOption(newOptionWrap.option, {
-            replaceMerge: this._replaceMerge,
-            transition: transitionOpt
-        });
-
-        function findCommonDimension(optionWrapA, optionWrapB) {
-            var metaA = getMapValue(dataMeta, optionWrapA.dataMetaKey);
-            var metaB = getMapValue(dataMeta, optionWrapB.dataMetaKey);
-            var uniqueDimensionB = metaB.uniqueDimension;
-            if (uniqueDimensionB != null && metaA.dimensions.indexOf(uniqueDimensionB) >= 0) {
-                return uniqueDimensionB;
-            }
-        }
-
-    };
-
-    proto._getChart = function () {
-        return isFunction(this._chart) ? this._chart() : this._chart;
-    };
-
-    /**
-     * @return string[]
-     */
-    proto.getOptionKeys = function () {
-        var optionKeys = [];
-        var optionList = this._optionList;
-        for (var i = 0; i < optionList.length; i++) {
-            optionKeys.push(optionList[i].key);
-        }
-        return optionKeys;
-    };
-
-
-    function assert(cond, msg) {
-        if (!cond) {
-            throw new Error(msg || 'transition player error');
-        }
-    }
-
-    function isObject(value) {
-        const type = typeof value;
-        return type === 'function' || (!!value && type === 'object');
-    }
-
-    function isArray(value) {
-        if (Array.isArray) {
-            return Array.isArray(value);
-        }
-        return Object.prototype.toString.call(value) === '[object Array]';
-    }
-
-    function isFunction(value) {
-        return typeof value === 'function';
-    }
-
-    function hasOwn(obj, key) {
-        return obj.hasOwnProperty(key);
-    }
-
-    function getMapValue(map, key) {
-        return (key != null && hasOwn(map, key)) ? map[key] : null;
-    }
-
-
-    exports.transitionPlayer = transitionPlayer;
-
-})(this);
diff --git a/public/data/bar-histogram.js b/public/data/bar-histogram.js
index 64687d2..9a5d405 100644
--- a/public/data/bar-histogram.js
+++ b/public/data/bar-histogram.js
@@ -50,7 +50,7 @@
     }, {
         transform: {
             type: 'ecStat:histogram',
-            print: true,
+            // print: true,
             config: { dimensions: [1] }
         }
     }],
diff --git a/public/data/bar-race-country.js b/public/data/bar-race-country.js
new file mode 100644
index 0000000..d748300
--- /dev/null
+++ b/public/data/bar-race-country.js
@@ -0,0 +1,140 @@
+/*
+title: Bar Race
+titleCN: 动态排序柱状图 - 人均收入
+category: bar
+difficulty: 6
+*/
+
+
+var updateFrequency = 2000;
+var dimension = 0;
+
+var countryColors = {"Australia":"#00008b","Canada":"#f00","China":"#ffde00","Cuba":"#002a8f","Finland":"#003580","France":"#ed2939","Germany":"#000","Iceland":"#003897","India":"#f93","Japan":"#bc002d","North Korea":"#024fa2","South Korea":"#000","New Zealand":"#00247d","Norway":"#ef2b2d","Poland":"#dc143c","Russia":"#d52b1e","Turkey":"#e30a17","United Kingdom":"#00247d","United States":"#b22234"};
+
+$.when(
+    $.getJSON('https://cdn.jsdelivr.net/npm/emoji-flags@1.3.0/data.json'),
+    $.getJSON(ROOT_PATH + '/data/asset/data/life-expectancy-table.json')
+).done(function (res0, res1) {
+    var flags = res0[0];
+    var data = res1[0];
+    var years = [];
+    for (var i = 0; i < data.length; ++i) {
+        if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
+            years.push(data[i][4]);
+        }
+    }
+
+    function getFlag(countryName) {
+        if (!countryName) {
+            return '';
+        }
+        return (flags.find(function (item) {
+            return item.name === countryName;
+        }) || {}).emoji;
+    }
+    var startIndex = 10;
+    var startYear = years[startIndex];
+
+    var option = {
+        grid: {
+            top: 10,
+            bottom: 30,
+            left: 150,
+            right: 80
+        },
+        xAxis: {
+            max: 'dataMax',
+            label: {
+                formatter: function (n) {
+                    return Math.round(n);
+                }
+            }
+        },
+        dataset: {
+            source: data.slice(1).filter(function (d) {
+                return d[4] === startYear;
+            })
+        },
+        yAxis: {
+            type: 'category',
+            inverse: true,
+            max: 10,
+            axisLabel: {
+                show: true,
+                textStyle: {
+                    fontSize: 14
+                },
+                formatter: function (value) {
+                    return value + '{flag|' + getFlag(value) + '}';
+                },
+                rich: {
+                    flag: {
+                        fontSize: 25,
+                        padding: 5
+                    }
+                }
+            },
+            animationDuration: 300,
+            animationDurationUpdate: 300
+        },
+        series: [{
+            realtimeSort: true,
+            seriesLayoutBy: 'column',
+            type: 'bar',
+            itemStyle: {
+                color: function (param) {
+                    return countryColors[param.value[3]] || '#5470c6';
+                }
+            },
+            encode: {
+                x: dimension,
+                y: 3
+            },
+            label: {
+                show: true,
+                precision: 1,
+                position: 'right',
+                valueAnimation: true,
+                fontFamily: 'monospace'
+            }
+        }],
+        // Disable init animation.
+        animationDuration: 0,
+        animationDurationUpdate: updateFrequency,
+        animationEasing: 'linear',
+        animationEasingUpdate: 'linear',
+        graphic: {
+            elements: [{
+                type: 'text',
+                right: 160,
+                bottom: 60,
+                style: {
+                    text: startYear,
+                    font: 'bolder 80px monospace',
+                    fill: 'rgba(100, 100, 100, 0.25)'
+                },
+                z: 100
+            }]
+        }
+    };
+
+    // console.log(option);
+    myChart.setOption(option);
+
+    for (var i = startIndex; i < years.length - 1; ++i) {
+        (function (i) {
+            setTimeout(function () {
+                updateYear(years[i + 1]);
+            }, (i - startIndex) * updateFrequency);
+        })(i);
+    }
+
+    function updateYear(year) {
+        var source = data.slice(1).filter(function (d) {
+            return d[4] === year;
+        });
+        option.series[0].data = source;
+        option.graphic.elements[0].style.text = year;
+        myChart.setOption(option);
+    }
+})
\ No newline at end of file
diff --git a/public/data/custom-aggregate-scatter-bar.js b/public/data/custom-aggregate-scatter-bar.js
new file mode 100644
index 0000000..840a7c2
--- /dev/null
+++ b/public/data/custom-aggregate-scatter-bar.js
@@ -0,0 +1,209 @@
+/*
+title: Aggregate Morphing Between Scatter and Bar
+category: custom
+titleCN: 聚合分割形变(散点图 - 柱状图)
+difficulty: 9
+*/
+
+
+var SCATTER_COLORS = [
+    '#5470c6',
+    '#91cc75',
+    '#fac858',
+    '#ee6666',
+    '#73c0de',
+    '#3ba272',
+    '#fc8452',
+    '#9a60b4',
+    '#ea7ccc'
+];
+var BAR_COLOR = '#37A2DA';
+var ANIMATION_DURATION_UPDATE = 1500;
+
+var RAW_DATA = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];
+
+
+
+$.when(
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform@1.0.0/dist/ecSimpleTransform.min.js')
+).done(function () {
+
+    init();
+
+    var currentIsBar = false;
+    setScatterOption();
+
+    setInterval(function () {
+        if (currentIsBar) {
+            currentIsBar = false;
+            setScatterOption();
+        }
+        else {
+            currentIsBar = true;
+            setBarOption();
+        }
+    }, 3000);
+
+});
+
+
+
+function init() {
+
+    echarts.registerTransform(ecSimpleTransform.aggregate);
+
+    var baseOption = {
+        dataset: [{
+            id: 'raw_dataset',
+            dimensions: ['DATE', 'COUNT', 'PRICE', 'WEIGHT', 'M_TAG', 'Z_TAG', 'ID'],
+            source: RAW_DATA
+        }, {
+            id: 'mTagSum_dataset',
+            fromDatasetId: 'raw_dataset',
+            transform: {
+                type: 'ecSimpleTransform:aggregate',
+                config: {
+                    resultDimensions: [
+                        { from: 'COUNT', method: 'sum' },
+                        { from: 'PRICE', method: 'sum' },
+                        { from: 'WEIGHT', method: 'sum' },
+                        { from: 'M_TAG' }
+                    ],
+                    groupBy: 'M_TAG'
+                }
+            }
+        }],
+        tooltip: {}
+    };
+
+    myChart.setOption(baseOption, { lazyUpdate: true });
+}
+
+function setScatterOption() {
+    var option = {
+        grid: {
+            containLabel: true
+        },
+        xAxis: {
+            name: 'PRICE'
+        },
+        yAxis: {
+            name: 'COUNT'
+        },
+        series: {
+            type: 'custom',
+            coordinateSystem: 'cartesian2d',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'raw_dataset',
+            encode: {
+                itemName: 'ID',
+                x: 'PRICE',
+                y: 'COUNT',
+                tooltip: ['PRICE', 'COUNT', 'WEIGHT']
+            },
+            renderItem: function (params, api) {
+                var pos = api.coord([
+                    api.value('PRICE'),
+                    api.value('COUNT')
+                ]);
+                var color = getFromPalette(
+                    api.value('Z_TAG'),
+                    SCATTER_COLORS
+                );
+                return {
+                    type: 'circle',
+                    morph: true,
+                    shape: {
+                        cx: pos[0],
+                        cy: pos[1],
+                        r: 10
+                    },
+                    style: {
+                        fill: color
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'M_TAG' },
+            to: { seriesIndex: 0, dimension: 'M_TAG' }
+        }
+    });
+}
+
+function setBarOption() {
+    var option = {
+        grid: {
+            containLabel: true
+        },
+        xAxis: {
+            type: 'category'
+        },
+        yAxis: {
+        },
+        series: {
+            type: 'custom',
+            coordinateSystem: 'cartesian2d',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'mTagSum_dataset',
+            encode: {
+                x: 'M_TAG',
+                y: 'COUNT',
+                tooltip: ['M_TAG', 'COUNT', 'WEIGHT']
+            },
+            renderItem: function (params, api) {
+                var mTagVal = api.value('M_TAG');
+                var ataVal = api.value('COUNT');
+                var tarPos = api.coord([mTagVal, ataVal]);
+                var zeroPos = api.coord([mTagVal, 0]);
+                var size = api.size([mTagVal, ataVal]);
+                var width = size[0] * 0.4;
+                return {
+                    type: 'rect',
+                    morph: true,
+                    shape: {
+                        x: tarPos[0] - width / 2,
+                        y: tarPos[1],
+                        height: zeroPos[1] - tarPos[1],
+                        width: width,
+                    },
+                    style: {
+                        fill: BAR_COLOR
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis', 'viusalMap'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'M_TAG' },
+            to: { seriesIndex: 0, dimension: 'M_TAG' }
+        }
+    });
+}
+
+
+function getFromPalette(value, palette) {
+    if (!palette.__colorMap) {
+        palette.__colorMap = {};
+    }
+    if (palette.__colorIdx == null) {
+        palette.__colorIdx = 0;
+    }
+    if (!palette.__colorMap[value]) {
+        palette.__colorMap[value] = palette[palette.__colorIdx];
+        palette.__colorIdx++;
+        if (palette.__colorIdx >= palette.length) {
+            palette.__colorIdx = 0;
+        }
+    }
+    return palette.__colorMap[value];
+}
diff --git a/public/data/custom-aggregate-scatter-cluster.js b/public/data/custom-aggregate-scatter-cluster.js
new file mode 100644
index 0000000..b44e6a0
--- /dev/null
+++ b/public/data/custom-aggregate-scatter-cluster.js
@@ -0,0 +1,214 @@
+/*
+title: Aggregate Morphing Between Scatter Clustering
+category: custom
+titleCN: 聚合分割形变(散点图聚类)
+difficulty: 10
+*/
+
+
+var CLUSTER_COLORS = [
+    '#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'
+];
+var ANIMATION_DURATION_UPDATE = 1500;
+
+var RAW_DATA = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];
+var RAW_DATA_DIMENSIONS = ['DATE', 'COUNT', 'PRICE', 'WEIGHT', 'M_TAG', 'Z_TAG', 'ID'];
+
+
+
+$.when(
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-stat@1.2.0/dist/ecStat.min.js'),
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform@1.0.0/dist/ecSimpleTransform.min.js')
+).done(function () {
+
+    init();
+
+    var currentIsClustered = false;
+    setRawScatterOption();
+
+    setInterval(function () {
+        if (currentIsClustered) {
+            currentIsClustered = false;
+            setRawScatterOption();
+        }
+        else {
+            currentIsClustered = true;
+            setClusteredScatterOption();
+        }
+    }, 3000);
+
+});
+
+
+
+function init() {
+
+    echarts.registerTransform(ecSimpleTransform.aggregate);
+    echarts.registerTransform(ecStat.transform.clustering);
+
+    var baseOption = {
+        dataset: [{
+            id: 'raw_dataset',
+            dimensions: RAW_DATA_DIMENSIONS,
+            source: RAW_DATA
+        }, {
+            id: 'raw_clustered_dataset',
+            fromDatasetId: 'raw_dataset',
+            transform: {
+                type: 'ecStat:clustering',
+                print: true,
+                config: {
+                    clusterCount: 4,
+                    dimensions: ['COUNT', 'PRICE'],
+                    outputClusterIndexDimension: {
+                        index: RAW_DATA_DIMENSIONS.length,
+                        name: 'CLUSTER_IDX'
+                    },
+                    outputCentroidDimensions: [{
+                        index: RAW_DATA_DIMENSIONS.length + 1,
+                        name: 'CLUSTER_CENTER_COUNT'
+                    }, {
+                        index: RAW_DATA_DIMENSIONS.length + 2,
+                        name: 'CLUSTER_CENTER_PRICE'
+                    }]
+                }
+            }
+        }, {
+            id: 'raw_cluster_centers_dataset',
+            fromDatasetId: 'raw_clustered_dataset',
+            transform: {
+                type: 'ecSimpleTransform:aggregate',
+                print: true,
+                config: {
+                    resultDimensions: [
+                        { from: 'COUNT', method: 'count' },
+                        { from: 'CLUSTER_CENTER_COUNT', method: 'first' },
+                        { from: 'CLUSTER_CENTER_PRICE', method: 'first' },
+                        { from: 'CLUSTER_IDX' }
+                    ],
+                    groupBy: 'CLUSTER_IDX'
+                }
+            }
+        }],
+        tooltip: {}
+    };
+
+    myChart.setOption(baseOption, { lazyUpdate: true });
+}
+
+function setRawScatterOption() {
+    var option = {
+        grid: {
+            containLabel: true
+        },
+        xAxis: {
+            name: 'PRICE'
+        },
+        yAxis: {
+            name: 'COUNT'
+        },
+        series: {
+            type: 'custom',
+            coordinateSystem: 'cartesian2d',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'raw_clustered_dataset',
+            encode: {
+                itemName: 'ID',
+                x: 'PRICE',
+                y: 'COUNT',
+                tooltip: ['PRICE', 'COUNT', 'WEIGHT']
+            },
+            renderItem: function (params, api) {
+                var pos = api.coord([
+                    api.value('PRICE'),
+                    api.value('COUNT')
+                ]);
+                return {
+                    type: 'circle',
+                    morph: true,
+                    shape: {
+                        cx: pos[0],
+                        cy: pos[1],
+                        r: 10
+                    },
+                    style: {
+                        fill: '#5470c6'
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'CLUSTER_IDX' },
+            to: { seriesIndex: 0, dimension: 'CLUSTER_IDX' }
+        }
+    });
+}
+
+function setClusteredScatterOption() {
+    var option = {
+        grid: {
+            containLabel: true
+        },
+        xAxis: {
+            name: 'PRICE'
+        },
+        yAxis: {
+            name: 'COUNT'
+        },
+        series: {
+            type: 'custom',
+            coordinateSystem: 'cartesian2d',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'raw_cluster_centers_dataset',
+            encode: {
+                x: 'CLUSTER_CENTER_PRICE',
+                y: 'CLUSTER_CENTER_COUNT',
+                tooltip: ['CLUSTER_CENTER_PRICE', 'CLUSTER_CENTER_COUNT']
+            },
+            renderItem: function (params, api) {
+                var context = params.context;
+                if (!context.layout) {
+                    context.layout = true;
+                    context.totalCount = 0;
+                    for (var i = 0; i < params.dataInsideLength; i++) {
+                        context.totalCount += api.value('COUNT', i);
+                    }
+                }
+
+                var pos = api.coord([
+                    api.value('CLUSTER_CENTER_PRICE'),
+                    api.value('CLUSTER_CENTER_COUNT')
+                ]);
+                var count = api.value('COUNT');
+                var radius = count / context.totalCount * 100 + 10;
+                return {
+                    type: 'circle',
+                    morph: true,
+                    shape: {
+                        cx: pos[0],
+                        cy: pos[1],
+                        r: radius,
+                    },
+                    style: {
+                        // fill: CONTENT_COLOR,
+                        fill: CLUSTER_COLORS[params.dataIndex]
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'CLUSTER_IDX' },
+            to: { seriesIndex: 0, dimension: 'CLUSTER_IDX' }
+        }
+    });
+}
diff --git a/public/data/custom-aggregate-scatter-pie.js b/public/data/custom-aggregate-scatter-pie.js
new file mode 100644
index 0000000..6c7a155
--- /dev/null
+++ b/public/data/custom-aggregate-scatter-pie.js
@@ -0,0 +1,189 @@
+/*
+title: Aggregate Morphing Between Scatter and Pie
+category: custom
+titleCN: 聚合分割形变(散点图 - 饼图)
+difficulty: 9
+*/
+
+
+var PIE_COLORS = [
+    '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF'
+];
+var ANIMATION_DURATION_UPDATE = 1500;
+
+var RAW_DATA = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];
+
+
+
+$.when(
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform@1.0.0/dist/ecSimpleTransform.min.js')
+).done(function () {
+
+    init();
+
+    var currentIsPie = false;
+    setScatterOption();
+
+    setInterval(function () {
+        if (currentIsPie) {
+            currentIsPie = false;
+            setScatterOption();
+        }
+        else {
+            currentIsPie = true;
+            setPieOption();
+        }
+    }, 3000);
+
+});
+
+
+
+function init() {
+
+    echarts.registerTransform(ecSimpleTransform.aggregate);
+
+    var baseOption = {
+        dataset: [{
+            id: 'raw_dataset',
+            dimensions: ['DATE', 'COUNT', 'PRICE', 'WEIGHT', 'M_TAG', 'Z_TAG', 'ID'],
+            source: RAW_DATA
+        }, {
+            id: 'mTagSum_dataset',
+            fromDatasetId: 'raw_dataset',
+            transform: {
+                type: 'ecSimpleTransform:aggregate',
+                config: {
+                    resultDimensions: [
+                        { from: 'COUNT', method: 'sum' },
+                        { from: 'PRICE', method: 'sum' },
+                        { from: 'WEIGHT', method: 'sum' },
+                        { from: 'M_TAG' }
+                    ],
+                    groupBy: 'M_TAG'
+                }
+            }
+        }],
+        tooltip: {}
+    };
+
+    myChart.setOption(baseOption, { lazyUpdate: true });
+}
+
+function setScatterOption() {
+    var option = {
+        grid: {
+            containLabel: true
+        },
+        xAxis: {
+            name: 'PRICE'
+        },
+        yAxis: {
+            name: 'COUNT'
+        },
+        series: {
+            type: 'custom',
+            coordinateSystem: 'cartesian2d',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'raw_dataset',
+            encode: {
+                itemName: 'ID',
+                x: 'PRICE',
+                y: 'COUNT',
+                tooltip: ['PRICE', 'COUNT', 'WEIGHT']
+            },
+            renderItem: function (params, api) {
+                var pos = api.coord([
+                    api.value('PRICE'),
+                    api.value('COUNT')
+                ]);
+                return {
+                    type: 'circle',
+                    morph: true,
+                    shape: {
+                        cx: pos[0],
+                        cy: pos[1],
+                        r: 10
+                    },
+                    style: {
+                        fill: '#5470c6'
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'M_TAG' },
+            to: { seriesIndex: 0, dimension: 'M_TAG' }
+        }
+    });
+}
+
+function setPieOption() {
+    var option = {
+        series: {
+            type: 'custom',
+            coordinateSystem: 'none',
+            animationDurationUpdate: ANIMATION_DURATION_UPDATE,
+            datasetId: 'mTagSum_dataset',
+            encode: {
+                itemName: 'ID',
+                value: 'COUNT',
+                tooltip: ['PRICE', 'COUNT', 'WEIGHT']
+            },
+            renderItem: function (params, api) {
+                var context = params.context;
+                if (!context.layout) {
+                    context.layout = true;
+                    var totalValue = 0;
+                    for (var i = 0; i < params.dataInsideLength; i++) {
+                        totalValue += api.value('COUNT', i);
+                    }
+                    var angles = [];
+                    var colors = [];
+                    var currentAngle = -Math.PI / 2;
+                    for (var i = 0; i < params.dataInsideLength; i++) {
+                        colors.push(PIE_COLORS[i]);
+                        var angle = api.value('COUNT', i) / totalValue * Math.PI * 2;
+                        angles.push([currentAngle, angle + currentAngle - 0.01]);
+                        currentAngle += angle;
+                    }
+                    context.angles = angles;
+                    context.colors = colors;
+                }
+
+                var width = myChart.getWidth();
+                var height = myChart.getHeight();
+                return {
+                    type: 'sector',
+                    morph: true,
+                    shape: {
+                        cx: width / 2,
+                        cy: height / 2,
+                        r: Math.min(width, height) / 3,
+                        r0: Math.min(width, height) / 5,
+                        startAngle: context.angles[params.dataIndex][0],
+                        endAngle: context.angles[params.dataIndex][1],
+                        clockwise: true
+                    },
+                    style: {
+                        fill: context.colors[params.dataIndex]
+                    },
+                    transition: ['shape', 'style']
+                };
+            }
+        }
+    };
+
+    myChart.setOption(option, {
+        replaceMerge: ['xAxis', 'yAxis', 'viusalMap'],
+        transition: {
+            from: { seriesIndex: 0, dimension: 'M_TAG' },
+            to: { seriesIndex: 0, dimension: 'M_TAG' }
+        }
+    });
+}
diff --git a/public/data/custom-cartesian-polygon.js b/public/data/custom-cartesian-polygon.js
index 63324ed..a018eda 100644
--- a/public/data/custom-cartesian-polygon.js
+++ b/public/data/custom-cartesian-polygon.js
@@ -30,6 +30,7 @@
 
     return {
         type: 'polygon',
+        transition: ['shape'],
         shape: {
             points: points
         },
diff --git a/public/data/custom-combine-separate-morph.js b/public/data/custom-combine-separate-morph.js
deleted file mode 100644
index af6e2ac..0000000
--- a/public/data/custom-combine-separate-morph.js
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
-title: Combine-Separate Morphing
-category: custom
-titleCN: 聚合分割形变
-difficulty: 11
-*/
-
-
-var PIE_COLORS = [
-    '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF'
-];
-var CLUSTER_COLORS = [
-    '#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'
-];
-var Z_TAG_COLORS = [
-    '#5470c6',
-    '#91cc75',
-    '#fac858',
-    '#ee6666',
-    '#73c0de',
-    '#3ba272',
-    '#fc8452',
-    '#9a60b4',
-    '#ea7ccc'
-];
-var Z_TAG_COLORS_2 = [
-    '#51689b', '#ce5c5c', '#fbc357', '#8fbf8f', '#659d84', '#fb8e6a', '#c77288', '#786090',
-    '#91c4c5', '#6890ba'
-];
-var SYMBOL_PATHS = [
-    'path://m67.25,28.9c27.42,-69.1 134.84,0 0,88.85c-134.84,-88.85 -27.42,-157.96 0,-88.85z',
-    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM22 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM10 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM16 28c-5.215 0-9.544-4.371-10-9.947 2.93 1.691 6.377 2.658 10 2.658s7.070-0.963 10-2.654c-0.455 5.576-4.785 9.942-10 9.942z',
-    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16c8.837 0 16-7.163 16-16s-7.163-16-16-16zM22 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.192-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.050 0.301-0.311 0.522-0.616 0.522-0 0 0 0-0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM10 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.193-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.051 0.301-0.311 0.522-0.616 0.522 0 0 0 0 0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM6 18h6v7.745c-3.44-0.894-6-4.035-6-7.745zM14 26v-8h4v8h-4zM20 25.745v-7.745h6c0 3.71-2.559 6.851-6 7.745z',
-    'path://M23.6 2c4.637 0 8.4 3.764 8.4 8.401 0 9.132-9.87 11.964-15.999 21.232-6.485-9.326-16.001-11.799-16.001-21.232 0-4.637 3.763-8.401 8.4-8.401 1.886 0 3.625 0.86 5.025 2.12l-2.425 3.88 7 4-4 10 11-12-7-4 1.934-2.901c1.107-0.68 2.35-1.099 3.665-1.099z',
-    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z',
-    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z'
-];
-var CONTENT_COLOR = '#37A2DA';
-var ANIMATION_DURATION_UPDATE = 1500;
-
-
-var RAW_DATA = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];
-
-var RAW_DATA_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID'];
-var M_TAG_SUM_DIMENSIONS = ['ATA', 'STE', 'CTZ', 'M_TAG'];
-var RAW_CLUSTER_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];
-var RAW_CLUSTER_CENTERS_DIMENSIONS = ['COUNT', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];
-
-function getFromPalette(value, palette) {
-    if (!palette.__colorMap) {
-        palette.__colorMap = {};
-    }
-    if (palette.__colorIdx == null) {
-        palette.__colorIdx = 0;
-    }
-    if (!palette.__colorMap[value]) {
-        palette.__colorMap[value] = palette[palette.__colorIdx];
-        palette.__colorIdx++;
-        if (palette.__colorIdx >= palette.length) {
-            palette.__colorIdx = 0;
-        }
-    }
-    return palette.__colorMap[value];
-}
-
-
-
-
-
-var baseOption = {
-    dataset: [{
-        id: 'raw',
-        dimensions: RAW_DATA_DIMENSIONS,
-        source: RAW_DATA
-    }, {
-        id: 'mTagSum',
-        fromDatasetId: 'raw',
-        transform: {
-            type: 'myTransform:aggregate',
-            config: {
-                resultDimensions: [
-                    { from: 'ATA', method: 'sum' },
-                    { from: 'STE', method: 'sum' },
-                    { from: 'CTZ', method: 'sum' },
-                    { from: 'M_TAG' }
-                ],
-                groupBy: 'M_TAG'
-            }
-        }
-    }, {
-        id: 'rawClusters',
-        fromDatasetId: 'raw',
-        transform: {
-            type: 'ecStat:clustering',
-            print: true,
-            config: {
-                clusterCount: 4,
-                dimensions: ['ATA', 'STE'],
-                outputClusterIndexDimension: {
-                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_IDX'),
-                    name: 'CLUSTER_IDX'
-                },
-                outputCentroidDimensions: [{
-                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_ATA'),
-                    name: 'CLUSTER_CENTER_ATA'
-                }, {
-                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_STE'),
-                    name: 'CLUSTER_CENTER_STE'
-                }]
-            }
-        }
-    }, {
-        id: 'rawClusterCenters',
-        fromDatasetId: 'rawClusters',
-        transform: {
-            type: 'myTransform:aggregate',
-            print: true,
-            config: {
-                resultDimensions: [
-                    { name: 'COUNT', from: 'ATA', method: 'count' },
-                    { from: 'CLUSTER_CENTER_ATA' },
-                    { from: 'CLUSTER_CENTER_STE' },
-                    { from: 'CLUSTER_IDX' }
-                ],
-                groupBy: 'CLUSTER_IDX'
-            }
-        }
-    }],
-    tooltip: {}
-};
-
-
-function makeScatterOptionCreator(renderItem) {
-    return function () {
-        var datasetId = 'rawClusters';
-        return {
-            datasetId: datasetId,
-            option: {
-                grid: {
-                    containLabel: true
-                },
-                xAxis: {
-                    name: 'STE'
-                },
-                yAxis: {
-                    name: 'ATA'
-                },
-                series: {
-                    type: 'custom',
-                    coordinateSystem: 'cartesian2d',
-                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
-                    datasetId: datasetId,
-                    encode: {
-                        itemName: 'ID',
-                        x: 'STE',
-                        y: 'ATA',
-                        tooltip: ['STE', 'ATA']
-                    },
-                    renderItem: renderItem
-                }
-            }
-        }
-    };
-}
-
-
-
-
-var optionCreators = {
-
-    'Scatter': makeScatterOptionCreator(
-        function (params, api) {
-            var pos = api.coord([
-                api.value('STE'),
-                api.value('ATA')
-            ]);
-            var zTagVal = api.value('Z_TAG');
-            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
-            return {
-                type: 'circle',
-                morph: true,
-                shape: {
-                    cx: pos[0],
-                    cy: pos[1],
-                    r: 10
-                },
-                style: {
-                    fill: color
-                },
-                transition: ['shape', 'style']
-            };
-        }
-    ),
-
-    'Glyph': makeScatterOptionCreator(
-        function (params, api) {
-            var pos = api.coord([
-                api.value('STE'),
-                api.value('ATA')
-            ]);
-            var zTagVal = api.value('Z_TAG');
-            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
-            var symbolPath = getFromPalette(zTagVal, SYMBOL_PATHS);
-            return {
-                type: 'path',
-                morph: true,
-                x: pos[0],
-                y: pos[1],
-                shape: {
-                    pathData: symbolPath,
-                    width: 40,
-                    height: 40
-                },
-                style: {
-                    fill: color
-                },
-                transition: ['style']
-            };
-        }
-    ),
-
-    'House': makeScatterOptionCreator(
-        function (params, api) {
-            var pos = api.coord([
-                api.value('STE'),
-                api.value('ATA')
-            ]);
-            var zTagVal = api.value('Z_TAG');
-            var color1 = getFromPalette(zTagVal, Z_TAG_COLORS);
-            var color2 = '#aaa';
-            return {
-                type: 'group',
-                x: pos[0],
-                y: pos[1],
-                children: [{
-                    type: 'polygon',
-                    morph: true,
-                    shape: {
-                        points: [
-                            [-25, -1],
-                            [25, -1],
-                            [0, -20]
-                        ]
-                    },
-                    style: {
-                        fill: color1
-                    },
-                    transition: ['shape', 'style']
-                }, {
-                    type: 'rect',
-                    morph: true,
-                    shape: {
-                        x: -15,
-                        y: 0,
-                        width: 30,
-                        height: 20
-                    },
-                    style: {
-                        fill: color2,
-                        stroke: '#fff',
-                        lineWidth: 1
-                    },
-                    transition: ['shape', 'style']
-                }]
-            };
-        }
-    ),
-
-    'Bar_Sum': function () {
-        var datasetId = 'mTagSum'
-        return {
-            datasetId: datasetId,
-            option: {
-                grid: {
-                    containLabel: true
-                },
-                xAxis: {
-                    type: 'category'
-                },
-                yAxis: {
-                },
-                series: {
-                    type: 'custom',
-                    coordinateSystem: 'cartesian2d',
-                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
-                    datasetId: datasetId,
-                    encode: {
-                        x: 'M_TAG',
-                        y: 'ATA',
-                        tooltip: ['M_TAG', 'ATA']
-                    },
-                    renderItem: function (params, api) {
-                        var mTagVal = api.value('M_TAG');
-                        var ataVal = api.value('ATA');
-                        var tarPos = api.coord([mTagVal, ataVal]);
-                        var zeroPos = api.coord([mTagVal, 0]);
-                        var size = api.size([mTagVal, ataVal]);
-                        var width = size[0] * 0.4;
-                        return {
-                            type: 'rect',
-                            morph: true,
-                            shape: {
-                                x: tarPos[0] - width / 2,
-                                y: tarPos[1],
-                                height: zeroPos[1] - tarPos[1],
-                                width: width,
-                            },
-                            style: {
-                                fill: CONTENT_COLOR
-                            },
-                            transition: ['shape', 'style']
-                        };
-                    }
-                }
-            }
-        };
-    },
-
-    'Pie_Sum': function () {
-        var datasetId = 'mTagSum';
-        return {
-            datasetId: datasetId,
-            option: {
-                series: {
-                    type: 'custom',
-                    coordinateSystem: 'none',
-                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
-                    datasetId: datasetId,
-                    encode: {
-                        itemName: 'M_TAG',
-                        value: 'ATA',
-                        tooltip: 'ATA'
-                    },
-                    renderItem: function (params, api) {
-                        var context = params.context;
-                        if (!context.layout) {
-                            context.layout = true;
-                            var totalValue = 0;
-                            for (var i = 0; i < params.dataInsideLength; i++) {
-                                totalValue += api.value('ATA', i);
-                            }
-                            var angles = [];
-                            var colors = [];
-                            var currentAngle = -Math.PI / 2;
-                            for (var i = 0; i < params.dataInsideLength; i++) {
-                                colors.push(PIE_COLORS[i]);
-                                var angle = api.value('ATA', i) / totalValue * Math.PI * 2;
-                                angles.push([currentAngle, angle + currentAngle - 0.01]);
-                                currentAngle += angle;
-                            }
-                            context.angles = angles;
-                            context.colors = colors;
-                        }
-
-                        var width = myChart.getWidth();
-                        var height = myChart.getHeight();
-                        return {
-                            type: 'sector',
-                            morph: true,
-                            shape: {
-                                cx: width / 2,
-                                cy: height / 2,
-                                r: Math.min(width, height) / 3,
-                                r0: Math.min(width, height) / 5,
-                                startAngle: context.angles[params.dataIndex][0],
-                                endAngle: context.angles[params.dataIndex][1],
-                                clockwise: true
-                            },
-                            style: {
-                                // fill: CONTENT_COLOR,
-                                fill: context.colors[params.dataIndex]
-                            },
-                            transition: ['shape', 'style']
-                        };
-                    }
-                }
-            }
-        };
-    },
-
-    'Clustered': function () {
-        var datasetId = 'rawClusterCenters';
-        return {
-            datasetId: datasetId,
-            option: {
-                grid: {
-                    containLabel: true
-                },
-                xAxis: {
-                    name: 'STE'
-                },
-                yAxis: {
-                    name: 'ATA'
-                },
-                series: {
-                    type: 'custom',
-                    coordinateSystem: 'cartesian2d',
-                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
-                    datasetId: datasetId,
-                    encode: {
-                        x: 'CLUSTER_CENTER_STE',
-                        y: 'CLUSTER_CENTER_ATA',
-                        tooltip: ['CLUSTER_CENTER_STE', 'CLUSTER_CENTER_ATA']
-                    },
-                    renderItem: function (params, api) {
-                        var context = params.context;
-                        if (!context.layout) {
-                            context.layout = true;
-                            context.totalCount = 0;
-                            for (var i = 0; i < params.dataInsideLength; i++) {
-                                context.totalCount += api.value('COUNT', i);
-                            }
-                        }
-
-                        var pos = api.coord([
-                            api.value('CLUSTER_CENTER_STE'),
-                            api.value('CLUSTER_CENTER_ATA')
-                        ]);
-                        var count = api.value('COUNT');
-                        var radius = count / context.totalCount * 100 + 10;
-                        return {
-                            type: 'circle',
-                            morph: true,
-                            shape: {
-                                cx: pos[0],
-                                cy: pos[1],
-                                r: radius,
-                            },
-                            style: {
-                                // fill: CONTENT_COLOR,
-                                fill: CLUSTER_COLORS[params.dataIndex]
-                            },
-                            transition: ['shape', 'style']
-                        };
-                    }
-                }
-            }
-        };
-    }
-};
-
-
-
-var _player;
-var _optionList = [];
-app.config = {};
-echarts.util.each(optionCreators, function (creator, key) {
-    var optionWrap = creator();
-    _optionList.push({
-        key: key,
-        dataMetaKey: optionWrap.datasetId,
-        option: optionWrap.option
-    });
-    app.config[key] = function () {
-        _player.go(key);
-    }
-});
-console.log(app.config);
-
-
-
-var _global = window;
-
-$.when(
-    $.getScript(ROOT_PATH + '/data/asset/js/myTransform.js'),
-    $.getScript(ROOT_PATH + '/data/asset/js/transitionPlayer.js'),
-).done(function () {
-    run();
-});
-
-
-function run() {
-
-    echarts.registerTransform(_global.myTransform.aggregate);
-    echarts.registerTransform(ecStat.transform.clustering);
-
-    _player = _global.transitionPlayer.create({
-        chart: function () {
-            return myChart;
-        },
-        seriesIndex: 0,
-        replaceMerge: ['xAxis', 'yAxis'],
-        dataMeta: {
-            raw: {
-                dimensions: RAW_DATA_DIMENSIONS,
-                uniqueDimension: 'ID'
-            },
-            mTagSum: {
-                dimensions: M_TAG_SUM_DIMENSIONS,
-                uniqueDimension: 'M_TAG'
-            },
-            rawClusters: {
-                dimensions: RAW_CLUSTER_DIMENSIONS,
-                uniqueDimension: 'ID',
-                dividingMethod: 'duplicate'
-            },
-            rawClusterCenters: {
-                dimensions: RAW_CLUSTER_CENTERS_DIMENSIONS,
-                uniqueDimension: 'CLUSTER_IDX'
-            }
-        },
-        optionList: _optionList
-    });
-
-    myChart.setOption(baseOption, { lazyUpdate: true });
-
-    _player.go('Glyph');
-
-}
-
diff --git a/public/data/custom-error-bar.js b/public/data/custom-error-bar.js
index 429d9b2..e0d20ee 100644
--- a/public/data/custom-error-bar.js
+++ b/public/data/custom-error-bar.js
@@ -35,6 +35,7 @@
         type: 'group',
         children: [{
             type: 'line',
+            transition: ['shape'],
             shape: {
                 x1: highPoint[0] - halfWidth, y1: highPoint[1],
                 x2: highPoint[0] + halfWidth, y2: highPoint[1]
@@ -42,6 +43,7 @@
             style: style
         }, {
             type: 'line',
+            transition: ['shape'],
             shape: {
                 x1: highPoint[0], y1: highPoint[1],
                 x2: lowPoint[0], y2: lowPoint[1]
@@ -49,6 +51,7 @@
             style: style
         }, {
             type: 'line',
+            transition: ['shape'],
             shape: {
                 x1: lowPoint[0] - halfWidth, y1: lowPoint[1],
                 x2: lowPoint[0] + halfWidth, y2: lowPoint[1]
diff --git a/public/data/custom-error-scatter.js b/public/data/custom-error-scatter.js
index df10d2e..4b06d1d 100644
--- a/public/data/custom-error-scatter.js
+++ b/public/data/custom-error-scatter.js
@@ -53,6 +53,7 @@
 
         children.push({
             type: 'line',
+            transition: ['shape'],
             shape: makeShape(
                 baseDimIdx,
                 highPoint[baseDimIdx] - halfWidth, highPoint[otherDimIdx],
@@ -61,6 +62,7 @@
             style: style
         }, {
             type: 'line',
+            transition: ['shape'],
             shape: makeShape(
                 baseDimIdx,
                 highPoint[baseDimIdx], highPoint[otherDimIdx],
@@ -69,6 +71,7 @@
             style: style
         }, {
             type: 'line',
+            transition: ['shape'],
             shape: makeShape(
                 baseDimIdx,
                 lowPoint[baseDimIdx] - halfWidth, lowPoint[otherDimIdx],
diff --git a/public/data/custom-profile.js b/public/data/custom-profile.js
index d7b4876..5cdab64 100644
--- a/public/data/custom-profile.js
+++ b/public/data/custom-profile.js
@@ -63,6 +63,7 @@
 
     return rectShape && {
         type: 'rect',
+        transition: ['shape'],
         shape: rectShape,
         style: api.style()
     };
diff --git a/public/data/custom-story-transition.js b/public/data/custom-story-transition.js
index 5ea5b1e..c164a88 100644
--- a/public/data/custom-story-transition.js
+++ b/public/data/custom-story-transition.js
@@ -5,11 +5,9 @@
 difficulty: 11
 */
 
-const _global = window;
-
 $.when(
     $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json'),
-    $.getScript(ROOT_PATH + '/data/asset/js/myTransform.js')
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform/dist/ecSimpleTransform.min.js')
 ).done(function (res) {
     run(res[0]);
 });
@@ -17,8 +15,8 @@
 let _optionList;
 
 function run(_rawData) {
-    echarts.registerTransform(_global.myTransform.aggregate);
-    echarts.registerTransform(_global.myTransform.id);
+    echarts.registerTransform(ecSimpleTransform.aggregate);
+    echarts.registerTransform(ecSimpleTransform.id);
 
 
     const COUNTRY_A = 'Germany';
@@ -56,7 +54,7 @@
                     dimension: 'Year', gte: 1950
                 }
             }, {
-                type: 'myTransform:id',
+                type: 'ecSimpleTransform:id',
                 config: {
                     dimensionIndex: 5,
                     dimensionName: 'Id'
@@ -79,7 +77,7 @@
             id: 'DatasetCountryABSumIncome',
             fromDatasetId: 'DatasetCountryAB',
             transform: {
-                type: 'myTransform:aggregate',
+                type: 'ecSimpleTransform:aggregate',
                 config: {
                     resultDimensions: [
                         { from: 'Income', method: 'sum' },
diff --git a/public/data/cycle-plot.js b/public/data/cycle-plot.js
index d922582..6115ba7 100644
--- a/public/data/cycle-plot.js
+++ b/public/data/cycle-plot.js
@@ -54,6 +54,7 @@
 
     return {
         type: 'polyline',
+        transition: ['shape'],
         shape: {
             points: points
         },
@@ -71,6 +72,7 @@
 
     return {
         type: 'line',
+        transition: ['shape'],
         shape: {
             x1: point[0] - bandWidth / 2,
             x2: point[0] + bandWidth / 2,
@@ -105,7 +107,7 @@
     }],
     grid: {
         bottom: 70,
-        top: 120,
+        top: 120
     },
     xAxis: {
         data: months
diff --git a/public/data/data-transform-aggregate.js b/public/data/data-transform-aggregate.js
index b6c7764..f22ec12 100644
--- a/public/data/data-transform-aggregate.js
+++ b/public/data/data-transform-aggregate.js
@@ -7,14 +7,14 @@
 
 $.when(
     $.get(ROOT_PATH + '/data/asset/data/life-expectancy-table.json'),
-    $.getScript(ROOT_PATH + '/data/asset/js/myTransform.js')
+    $.getScript('https://cdn.jsdelivr.net/npm/echarts-simple-transform/dist/ecSimpleTransform.min.js')
 ).done(function (res) {
     run(res[0]);
 });
 
 function run(_rawData) {
 
-    echarts.registerTransform(window.myTransform.aggregate);
+    echarts.registerTransform(window.ecSimpleTransform.aggregate);
 
     option = {
         dataset: [{
@@ -33,7 +33,7 @@
             id: 'income_aggregate',
             fromDatasetId: 'since_year',
             transform: [{
-                type: 'myTransform:aggregate',
+                type: 'ecSimpleTransform:aggregate',
                 config: {
                     resultDimensions: [
                         { name: 'min', from: 'Income', method: 'min' },
@@ -85,6 +85,9 @@
             name: 'boxplot',
             type: 'boxplot',
             datasetId: 'income_aggregate',
+            itemStyle: {
+                color: '#b8c5f2'
+            },
             encode: {
                 x: ['min', 'Q1', 'median', 'Q3', 'max'],
                 y: 'Country',
diff --git a/public/data/doc-example/aria-decal-newspaper.js b/public/data/doc-example/aria-decal-newspaper.js
new file mode 100644
index 0000000..2262c1b
--- /dev/null
+++ b/public/data/doc-example/aria-decal-newspaper.js
@@ -0,0 +1,94 @@
+option = {
+    series: [{
+        type: 'bar',
+        name: 'Apples',
+        data: [108, 26, 39, 24],
+        itemStyle: {
+            borderColor: 'black',
+            borderWidth: 2
+        }
+    }, {
+        type: 'bar',
+        name: 'Oranges',
+        data: [23, 40, 60, 70],
+        itemStyle: {
+            borderColor: 'black',
+            borderWidth: 2
+        }
+    }, {
+        type: 'bar',
+        name: 'Bananas',
+        data: [129, 40, 40, 50],
+        itemStyle: {
+            borderColor: 'black',
+            borderWidth: 2
+        }
+    }, {
+        type: 'bar',
+        name: 'Pears',
+        data: [40, 60, 50, 89],
+        itemStyle: {
+            borderColor: 'black',
+            borderWidth: 2
+        }
+    }],
+
+    xAxis: {
+        data: ['Q1', 'Q2', 'Q3', 'Q4'],
+        axisLine: {
+            color: 'black'
+        },
+        axisTick: {
+            color: 'black'
+        },
+        axisLabel: {
+            color: 'black'
+        }
+    },
+    yAxis: {
+        axisLine: {
+            color: 'black'
+        },
+        axisTick: {
+            color: 'black'
+        },
+        axisLabel: {
+            color: 'black'
+        },
+        splitLine: {
+            lineStyle: {
+                color: 'black',
+                type: 'dashed'
+            }
+        }
+    },
+
+    aria: {
+        decal: {
+            show: true,
+            decals: [{
+                dashArrayX: 0,
+                dashArrayY: 0,
+                color: 'black'
+            }, {
+                dashArrayX: 0,
+                dashArrayY: 0,
+                color: 'black'
+            }, {
+                dashArrayX: [1, 0],
+                dashArrayY: [2, 5],
+                symbolSize: 1,
+                rotation: Math.PI / 6,
+                color: 'black'
+            }, {
+                symbol: 'circle',
+                dashArrayX: [[8, 8], [0, 8, 8, 0]],
+                dashArrayY: [6, 0],
+                symbolSize: 0.8,
+                color: 'black'
+            }]
+        }
+    },
+
+    color: ['white', 'black', 'white', 'white']
+};
diff --git a/public/data/doc-example/aria-decal-simple.js b/public/data/doc-example/aria-decal-simple.js
new file mode 100644
index 0000000..2b3eb73
--- /dev/null
+++ b/public/data/doc-example/aria-decal-simple.js
@@ -0,0 +1,25 @@
+option = {
+    xAxis: {
+        type: 'category',
+        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+    },
+    yAxis: {
+        type: 'value'
+    },
+    series: [{
+        data: [120, 200, 150, 80, 70, 110, 130],
+        type: 'bar'
+    }, {
+        data: [20, 40, 90, 40, 30, 70, 120],
+        type: 'bar'
+    }, {
+        data: [140, 230, 120, 50, 30, 150, 120],
+        type: 'bar'
+    }],
+    aria: {
+        enabled: true,
+        decal: {
+            show: true
+        }
+    }
+};
diff --git a/public/data/doc-example/aria-decal.js b/public/data/doc-example/aria-decal.js
new file mode 100644
index 0000000..a400ce5
--- /dev/null
+++ b/public/data/doc-example/aria-decal.js
@@ -0,0 +1,125 @@
+var decalColor = 'rgba(0, 0, 0, 0.8)';
+
+var svg = 'M136.71078,90.7149424 C135.038663,90.084817 133.319214,89.8204828 131.637995,89.8987366 C131.93792,88.5693311 132.022117,87.2371959 131.901965,85.9319035 C131.475516,81.1970909 128.414369,76.8944942 123.681104,75.0882862 C118.812669,73.2488659 113.532803,74.556888 110.072058,78.0014222 C111.44425,78.0132512 112.836467,78.2716709 114.184082,78.7876003 C120.385569,81.1311211 123.498145,88.0593162 121.156545,94.2582038 C120.289538,96.5421242 118.80038,98.4052027 116.960324,99.7405227 C113.796773,102.011704 109.591905,102.714169 105.683776,101.228711 C99.4827445,98.8915594 96.3669821,91.9606345 98.7113134,85.7581072 C99.0176102,84.9537305 99.4044636,84.2007647 99.8609505,83.4869258 L99.8545788,83.4869258 C99.8545788,83.4869258 99.8545788,83.4869258 99.8545788,83.4932953 C101.850742,80.3754255 103.561544,76.9968612 104.927364,73.3990041 C115.528966,45.4164295 101.427934,14.127175 73.4261234,3.52605368 C45.4215819,-7.07142797 14.1333382,7.02472855 3.52900521,35.0104878 C0.629425582,42.6470623 -0.42099504,50.523403 0.149272308,58.1686218 C0.16110547,58.4206719 0.185226914,58.6786366 0.209348358,58.9366014 C2.47266801,84.9182432 19.2184117,108.595036 45.2413538,118.442737 C71.7121355,128.45559 100.448968,121.413198 119.352898,102.762395 C122.585626,99.6263266 127.465895,98.4657129 131.950208,100.160455 C137.34704,102.203699 140.39954,107.712861 139.559386,113.191995 C141.579216,111.769777 143.215378,109.750646 144.163851,107.256987 C146.676122,100.628613 143.33553,93.2204304 136.71078,90.7149424 ZZ';
+var base64 = 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ8AAAClCAYAAABC+i8rAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAn6ADAAQAAAABAAAApQAAAACQfA6rAAAc5klEQVR4Ae1dC3xcRb2eObtJNiUJ0EKBgtAUUFDE9u6m5WkLWqAlm/em5aLcSkGrCApeHipqfHERQbCUIvSCD1Dp5p3UalFsoUBvmgQBxYtUkhZKqy2l2FceuzvjN9vs9uwme/ac3bOPszvn90t2zpz//Oc/33xnXmcelOTQtXbO1WUH/PvOJZTORLLKKeFTOSEncM6nUkLh5mWUUkY4CRCKv+AvH4XsDkLodsrJdk75dkqUt7mNvupZMOt12tTEcgiirEoKzSprDBrT5qo9x098C0Cc8wjhM0GmcpDNvDRRsg+k7QV5NyuU9tgU+/N1m9v3GDRTisdAwLyMihGBmd7rLvv0Ufvee/+TINhC/C0gnH/ATP3xdFFK/OD2s/htU1hBe31/2854YeTz2AhYgnwts6tcjPHrkYyrUAqVxk5O+p4AOI4ydhPndHWpvexnC3t+uS99sedGTFlLPu88Twk9OHwNyHY950S04bL2QjtyP0rhxwuI/cHa/o43s9bQLDMs68jX7XRPGqL8BpQot6FwOS7L8IpjDmWU8jVUsd3r2dy5MY5w3j/OGvKtn7fEsevAns8jR25HKXKC1XMG7cIuu1JwKzoob1g9LamyPyvI11xRVccZW45OxMmpSmhm9FIfhntWksLi7zRuan4vMzZkb6wZJZ/3fM/JfHR4BarXmuyFyBTL9hJFuX1Rb9cqU7TliJKMkA+dCNrsql7GKbsbfcayHMEyfjIo7abFjqWNG5t3xxfOfYm0k2/NRf957MHhfU+CdAtzH94JUkjpP21Eubahr3PtBE/zyiut5PNW1OArRKANJV95XqE8QWLRIVlxfInr5ks2NGHgOj+vtJFvtbPqvzAM8TCIV5yfUI9PNT7dPV1iL/Pk6wB1WsjndVXdwzm7dTz80gcE/HOholxZ09v5dr6hkVLyiY5FS0X1SsbZsnwD1kh6QcCdNkIq6/u7XzISzuqyKSOf1+OxkcHhn4KAn7Y6SGmxX8ygsdkvbezp6E9LfFkQiZIKG/qcny0A8bySeAbQFUNOgcC6lgr3RwyEsrRoSsg3QHY+CuLVWRqZDBgPzKYwzv/gPb/qjAxEn/YoTScferXfwIzhJWlPSY5EiBk8J5JR/kxHRXVa5ypmAj5TyYdvtFcTwr6TiYTkUpx4eU8dZYH2tQtuLMqldEWnxTTytVZUfZwz/nh0BPI+MQQwycK5f9dWfPfO3cuU3m7b7NopvoD/VUwQmJa7UGUmZZioel1jX/djmYk9tbGaUvL5mf9RSbwUZRTnD3nn1DhTpD2japMmX3NF5WdkzzZ1eYjqt4j4A09i3LQwdbFkRnNS5Gt31pzOGV2eGdPzJ1Z0QM7igyNfy7UUJ0W+URJYBWBKcg2UbEwP5fyr3jnVH85G2xK1KWHytTjdmH3ML0k0YhnOGAJ4yQt5gInBe1M6icZiT410QuQTn8+w58Q9qTFJao2JAOcXtsx2L4n53GIPEiLfIN15AxrCZ1osrTlhLmP0m8Fv5zmQGsPkw6Kfyfj++M0cSLtFk8Cnv0l2LLWo8RFmGyYf9Q3dCA3HRmiRN2lFAFPwv54Ln94MkU+MNTFCxcJueWUQAUw+OOXgrq2fzaAJpkRtiHx8YOSqXNhNwBTkMqwE+wh+2eo9X0Pkw76KX84w5jL6MQRQ+s1om13zCSsDopt83gr33GzfLcrKGZGI7YwxsW2cZS/d5MNmsp+xbCpz1HAMd9VgVy+L7eR1JDN0kW/9vCY72hjuI8GkKxsQEF89hgi/JhtsScQGXeR792CfqHInJxKBDJNaBDilll0ro4t8hCu1qYVQak8UAXzoPU/sf5No+EyGi0s+0Z3HbgO5voVZJvMgqbiRP7ah4QOXJ6UkQ4Hjkq+5orYCDdsc27QxQ2inKFpGGI6DsN4Vl3yE+y+yXrLyy2LK6RWihrJaquOTj9CcXD9gtYzSshe93qltsxvKtWSy8Vl88lEiyZeNORdlEyO+mVFeWX+rSb7OC6tK8S33g1mfCmkgwZrpj1kNBk3y+UfJLHQ2LNeWsFommGIvxdlzFrs0yRcgZJbF0pO/5nKSWyUfZfyU/M1Ny6X8VPEZ1EpWa5Z8jPKpVkpMPtsqmke7D75mqUkGmuTDdq2SfBZitKKMWCq/NMkH3C1/BpqFuJO0qSxgrfzSJh+Oh08aEakgbQhgYZGl8kubfIRacrZE2nI7yyLCzOasOAhbLyza5KMEoy3ysgoCVFGYVWwVdmqTj3CflRKT97ZybqnCQpN8nFBJPisx2mI1lSb5gPuolbDPd1spz6FqF6dky5LPQozmNDBiIXO123wYNT9kpcTku62U2nZYCQPtapeTd6yUmHy3lRO23UoYaJIP2/Bvs1Ji8tlWzHvj5DSHpQqLeOTbms8ZaqW0Y/3ursbmZkt1EDXJh9mxsuSzCANR8lnusGhN8mHEXJZ8liEfxwlQ1ro0ycdZ4WvBtoS10pSX1nKq9Fgt4Zrka+xv/hdWcAxaLVH5aa+y2Wrp1iTfWGJeslqi8s1eTPo9RKYX/Nlq6Y5LPkoVSb6sz1Xej56upSYVCEjjko8w3p/12Oe9gXS9FSGIS76yKce8gGLdUuNHVsyIZGxW7LQ1mfCZChuXfJc//cRBdDo2ZcpAGW88BOibDT1dlhtmEamKSz4hhA36/iB+5ZWFCFBuyVJPIKmLfCjWJfmykHfCJBu3tWWpaXHN0kW+wKmOXgw2746rTQqkFQFM/Bis7+uw3PheCCRd2yuIbnyzq6oV2+MuCwWUv5lHAPMtHwQB8RP/aplTdS73k/k4qvYstKOmoROJucJkLyYkbKEKf25G4KSNrv5H0zp5WBf5RNKwM/NTMFaSL34+p0UCpNtfYit7TCsycTSqOKEStdYtAT87MywLumJDycO3OGZALDuC3N7VFe67So+b/uDC3z6YlhnRuqpdYaXnSudGdD0sNVM2DHYuOjh/fGHPL/fFSlr7eTXTB+iO5/H8YdDsCPFiBRAniTL+w/27tr7urahcFFvMvCe6yUebmhjK6WbzopaaEkeAMptStDxWeO/s6lqfL/AnFGqzY8nE9ufTOSNPeV3u78WWMeeJbvKJ6BSFrjInWqklKQQoaa/vbR2IpePoY8qeJoW0QqG0RqHKT9C+2xVLNpY/Nhj/utfp/nas52b4ozlg7PK6KtfjjZpnLJSUNg8B6iuw2c+p29z+hl6dOB2+mPuGl6FrcofYPFxvuKAcJV9c1LfmIUNhdAobKvmEToXQFTp1S7FUIEDJQ0aIJ0xo3NQ8tKiv+357kf2jaLevN2IWjln4Hsg72UgYvbKGyTelxNmJ4tJSC1X0gpHtcujh7ikssSVcFda92L6LznDMh54n9KYVJeUx1Dd8p155I3KGyXfJhiY/plnFbOwaiVzKGkMARPhW7YaO942FipQWY7Yz+ElLjZSAaGbd0OqsOylSU/J3hsknoiybfPRDKP3kF4/k8detAaXV36aWuB7RHUBDUAwmFxTZF6Mj8i8NsfAjkL4wQPymn7+XEPnGZrr8MGyddKQcAYzVfVvUOmZFJKpgrhD9wymUXWpW3CE9CZFPBD568rErE+nChyKWv/oRAM6vN1Y6V+sPoU9y6lFTVogvJfqk6dn65PRLJUw+UfrhqLm79UclJRNFgCu0RQzyJxo+VrhLNvxsGON5XbGeq/1R8pq+033C5BOGnc5PEm/O39RGSrf5COAD/O/N13pYo6Iov9WlmxObLjkDQkmRTzRcMXB5k4H4pGgCCARY0SsJBNMVhDL6dz2C6GC+q0fOiExS5BMRefq7n4Zh7UYilbJGEKDM0+fdZySEEVlKbG/pkqfkbXEQpJnn+qJET/6yFRXeHBjxXY4u+aTktUkNEQhQPoqmDZpcqbkCNp9Dz7bvIN384WG+z+uqYph0sA1jf89gvHfdDH5CZ6LzAJMu+QQk9S+2bcN8v9tSA0+ea+XE0e10m97YD6GqMHpMyK3vlysgYjlmBF6H/ceb3yQ732h2uq/zejyG24SmkE8Y3djbvRJvaMoaxvqAyU2pUTs5I1UpC3BybnK6+XTMjl5FBof+0HZBraFJC6aRL1g1FDg+g4TsTS4xMnQ0Av4AvSLaz7x7Nt8MXWKmk3/E91KL032WXn2mkU9EiNkT72D+2Bf0Ri7l9CGApaspmVnsdXqOxkqOBfqsiC+FhunJOKn0N96LPcfHl9a5dFKPopCMp6/rKSRITrsKAWLCLzpyZzW73NUmqIpQwenQ11BimTpdCvpmkEPDT0VEFOPG1JIvFMcMPu0WDL9sDN3L3+QRQKbei0Z9YfKaDmsQazzQh/6SWfrUevCyXNricter/SZyp4R8outdZFc8IKCc9zcR6gn4IUPPoINDDycQdFyQtQtuLPL5A4+imiwa99AkD8bJ3fHGBFNCPmF/dU/XPwm11+Gj+CGT0pP3apCh1za7Kr+VDBBiSv2BXVu7xLhdMnrihRUvS/Mc93laciicUnu1uKoXMhLoRLVhyoB2aq21hnYsDHrSwcnn3P3dhl7s4HR43xAW/5N5E6UUbfXtnNPfQf8WyOzHakU7ZjOcBv+ZWOZ7MQhlrNqn9AFM3795oriEX8rJJyJprqi6mjP2BIr5tMQn4sz1C0BipwHl23x60VPxNoYU1eyB3YM3YeX/10CgiEFlEMuPfPmVQskvGq50rY81e0Z8Whsd5kuwfvZWwvkHdOFL6XMg39xYsmkjw2qnGxMQ+I9jGSL9E0WAvomvb7/FoX/PKXb7poBiO2SnfjtODC1mo/7zCWHzUZotAOnGTYPH2OygwpWrGvo7dW8mLjo9dGD4+9D3lXiFCcj1TmP/mlNipSxt5BMGYL+X2xhnP4hljPRPHwJYheg9yl52vdauB1rWtFRUuhmjLZpVMSXDWHZZHEtPyjocE0WIMcB7KFG+AMbjpZFXphAA8e5t6OtanCjxhN0NvWu6FYU3oPSMuRc0ll1qzsZJK/mE0Y39XQ9zRblGy2ghJ6/UIIAvULdjGtytwc+hSUYhCIiCJHZNRrU/taadfCK9i3q7noTR9XIYJsncNxA8+LJTZamofQwEiytazk9qQjcy1u4Jm7UUZIR8wiBPX3cnUWwXgoBvaRkonyWPADB+Hy+7e1Ff1+PJa4vUcHgunxKr9NOc5ZQx8okkNPZ2vIwtHCoAzvORSZJ3piFAyV8KiM2Fl13fWo0EIqblRajJ6AF1UJS0Q8WcaMaZUfIJY8X6UTLD8QlslGnKgmg1APnuFj3aYyYfe15tf8ebqcQC44yj2O30j+o4QMbHMQiuue4jK746BI0nZBn2lVtHGFuFTz9T1AmRbmMIiFIH4/m3oX2XttlFGFfswSBGlbAU8e8ptJHvxrM64yWf2sDGzZ3tRUX0XBiv2VZQh5HuSARQ4vTYFfvMxjQSL2gBp2OTSCi+yCnLgt/2I00bd5dV5BPWVb/QtcPT23U53p8vRbcjxlkvPVQIUB8y8xtowlxodAs1lZKEnSgwDopPddhA9JrGvs4WPYqyotqNNhQJEYPQy/E9sWVkhPwI1fCiaBl5fwQB4PUMsSk3eXo6/0oydFIeetOTMKjsweB1xxHLtF0Ik/1Xc0XlJzijK/ApR/f6gOxPVfIWIvO2YXLBLagp2pLXlpyG9fOa7EY3MrIE+QQsYlv/QWXn9ZxxzMwgJycHlbVDoznyPhr4P6KFRfeKXUetmhrLkC8E8Pp5Sxy7D773OcLZHZhzdmLIPx9+BemwL/H9hDl+HDwF3uKJthz5QniLGbnYrvVzmN37RXTxTw/55+IvSLcLJd0KSoqW5wLpQnlkWfKFEiDWCbRW1CwIkMAN6KZg3lruTFgF6Z7HNnQrabmjdWwsNJTsnPi1PPnUudDurDndRwLXYbS9EVXyDPUzy7gp/Se+TLTgnXqksb/zz5axOwFDc4p86vS3zK5yMUZAQu5BtTxd/Szb3KJahU2tNkKb69z/8WysqezZZney9uQs+dTAeCtqZhLmvxQ18qXY0OhiTGUtUz9PuxszfDEm9iIaCH8kCr6Jnla8Od46jLTbmIYI84J8ahzFbkrKwKgLY4YXgYgfQ6n4USys+bDmdHC1AoNuDAAHUPq+AaK9gnhethO6eXLp5E1iS1qDqnJOPO/IN1EOigHSPQf7P8S4cjYl7BSUjCeDLCej8zIN7hNA0GKcS+tAh8YBN1Yt0gL8DqG6PAiZQwDxEORxrAB/B35vg2zbsVzgbW5XBo4vPuY1SbSJUJd+EgGJgERAIiARkAhIBCQCEgGJgERAIiARkAhIBCQCEgGJgERAIiARkAhIBCQCEgGJgERAIiARkAhIBCQCEgGJgERAIiARkAhIBCQCEgGJgERAIiARkAhIBCQC6UCArnZWYg2MeRcW02zBqTMfjNa4ds7VZQcC+26E/3wsypmJ1WJHR8voucf+bzdgQTW2omNLQ/JYIbbO09t9R+hezy9ORHoIO7FdEJLlXHlgUX/Xz0P3sX4RbhUWCl0X/Rw2PNbY1z3OPyTnPb/qDD7KtoTujfyKFXA4cmoAuxf0U2r/gdjLOjq81+leCUw/H+2fzD2lymXYZHLcRp3Nrpp5nPhvRj5i9R85NZFdIpCm15CJ5l7YIPCX0RpbXFWzDvj/9Ves6voe/uYmSjyRCbYCO1bzs2nYkWCm6m96dJzx7vGSnKEKP5NSNjVeGLFTFog34TmySFfd4efxtBh/Dt02ZPCZyOzFWH/8EgqMu4xrMRYC+Owm5UUR+yyLZaerXZU/Z9y/HthVwabTEiGesASnpz9lOvl4gRJBvo6K6g8wwn8PI83Y1uyPwQ3EjeFomvSgbSd2TCXHxlB47NjzGI/N8R7L7K82OyvvNEdjLC20JXohOx3Aeb+cXBMrhBF/ai9abSr5sGa1p3FT19/VRoxwdj/eXFM2+MZ6WV3Hp6vjN9PNAnyxlr54z7XCGn0GEt7ZOqcu5qF6RvWNk1fIarVfcPsRQq5X+yXupi819LRusdupclHiSiJDBhS+Q+3jrfCcyNlwrdoPxfk2FLo/4Qrdo/bX4y5VSnXt9atHl1EZsSUbGR2uRpMhHBTNgEG8WOUhD7x81UJuog0bS1jprgN0X8w2YUjHRL/ATGxfPJdxflXoOawoYn6fOKb+VuFHbcqveSDwauh59C+OND0B28k1qf3RprsRTRi/2k+4cd4ub7jSuZH0docfYVPOW8I3QQdlCuU/g85e7I6KTcANXJQFN0Cy1/d1vWAgmCFRGxk9x0/4kdIVe5QUUtvFNb2dbxtSlAXCdHSkEs2HErUpNkqXYC+MDWNVIWjJS6hv9ErIjHtJxg7Ze0wd3qD7EZwyPoTMvjYUDmffzg25PZs7N8It/ia8WubUn0n8I00RD8uLHl0kztCY6Oo7QjzxGMSfGSGm0LvQyftGhJ/BmyPEMBhQjzgjLKLXizf4VSsST6QV+7pEVLmiiVHf2/UcHj0fiQULl06R/snfMfTqI7RwMjniPpU3lIRLeBENDvT9XbLRpZZ8nBRFGigOJ7HeJYaJUKotVFuOXn2w/UmVyHaokBOncqtlzXLjhItZUbreirpP2S0KjogmlZ+wyJIwgZhFWyJlF7rTwTMNUhbBEcVHe53VHz1yG9/FKTtK1XzTDHAwcKAGstgkKHRRVlhEveIuOPQz6l+Otp8t+BRyIyO8Bu4ngvca/3hTk9L+u1c+xLlfe8wzQG0Y6JsHGyLaXWib/VVDvbmPuIiLz1ApvcvrrGI2hffhdPOYbT4lwBgrKNqGdvB7qrBBp93rquyM9kzmHvvO7cV5rkuEDuzshILgSAM9Gb1aYZHxVxASwJ/ei/og+bJeaU5YZJVL+XPVL3QHSwIx9IOxr/XQ9cmQPiRayMckX9sFtVN9I/5vedf0fQqE0rFX4HgMURKJsfb/DcWZ8l9KVyHGynA8sBu4rPQL2o3vs4TFAsI1OkTAM+zcRe/j5Y6VoS1+7WKwMCxpggMwpQ+QBO1Fxj2NTC8Yn6XjFbbNrp3iZ7756icAMVjlhvzEPQgXJh/euvno9U6e6G1vqXB/xD/qE+0lsRVbwhe+djyxaIIvHQkrjBMQXzq6vC73s3jR58YRnfAxeHYKMLqfDgwvRrNkPk6a2m96m0+htohB5gktybAnhnkiyKNlToD5GwBcuHkijniyKfaI3uwkR2kbBjtEaTp28QL0LBtCd6Ff0XYMMNIpMiLkl9AvJWtpebFJY24GLOCOary4/QZCjBMFAeegWdIqHphKPmTM9obe9mfHxZhNHhjucRQS3U2NsSpUlQL6e5xttkflQSqf/9VeZEpETxTjYhFVtZDfH9j3RdSWp6vDGnEjji2KQq4F8apCVZeR8MnKimMYji897iKFKP8NW95JVB9Kz/nNTvdl4Tc6rIiSX8D9j/C9AQflSh8GXsOVSdo6HCgJCpSCm/WYShU+Wv1Cx358iI8rjuph2vAw/zgIo5Lls1D9vKTyCDqRGRtQoqmvua3OupPq+9t2hj05/1TYDQeq67fwwt6Ev7+H/BVup37i70IGlYf88Pv/DocyR1RVQb9e1ZM0O8d2Wb0P0d4nmiSMBU5FryNmIWZjATECXQFs7kaaSkPmoit6/Tjy2Tn9cX1/9zhwQ4GM/Karw4FM3J+KkxZHRonYyT4CWIB4Ivzwp77ou5OKS797aHj/MgBcfPgJV/zEh/BkubgXkw4G6I4zIwhK6XU4E3f8rJEK972Qe+iwnuD/s0eGxf7R0WOKKokMOMdqgIhaIIYZvSjpxOSIIBZBGeyDDWDF+aiqSyGHhwxUXok68UlnJDJsKGMifbP2jh35nKVpIyWtouoFKX+jlkOJFq56B2w7TwGhIl72ghJlwjKM2x0/xQsljkdQX3eob6zmxlS4V6Jsnibe6kG1J7rO56vvk3FjLGCLOjyYfy6qu1PVftnq9s52l4vGsR778L4GOzA4vCWiI4NS8PzWC+pOC+qw0XEvteJjwZGI6DiC34apqpQICvCFba7ac6JlrXLvZ+wKta3gwoAdb+df8EaGG8Fou3zf66y0U5utV2E8slRUh47hxicg7untfFE8tnH7XwJkVNQ0UIvr8EDtRhDw4UQmFggVNkr+FECXMdUXxisXg3zqaA4iGT9Xewg3JdzXUDnzOdLXQViBYy3Og9uvbtv4R3yi9PtBdLh49+hBrzw0tP8O2FAiZAWGAeK/Hc5Pxwtr9nMxj49sHVmaiF7OGN5JOhvt/yVqNDEp4WU7/j0W4KQ6pHgssfdhhgRJJIvBMkG8C4U+0djGzF/0LIMj/sEooF+UfP+DL9XBe8P/bLaIN8hweJ0Bonur+JrQ5enrvmHC4P1rgt6ixGp2uTuRsnDHAu9iQuQT1TiwewSKvxKKE9gtRkl6Z/2LbdtCfun4PX73UQW72JCwJbELxY86t8ERvJ+2B5T6zd1rcNOemNbxodDbjRjnKyywiV4o2kNmXPTdKZNmPWOGJi0dbefVng24zlXLgES/Vt/HcqOpEVX1kpleV9WHYslr+dNCx/1o+4VnnYg2Iwaow2TUCpvNz9ARXSHOlcMLjaGR0uJr8IsSKtmL+hyMBL95hjTV/l/HVqw7uALV+z9Cfgn/omFv9DTrROLy+/zhjsJY+L1sevE6PbpmkBOfhlzEy4aDZaL16VFFUJK+gy8ZES8zcmtpt9N9nC4FWSiETsaqxt6uLwnTgsMIjRuaD+Co9Fq08+pQP2MiF90qikajtiPMOnd/97vR4Rr7OjZPcpR9GG/xd6D/BTSU9kXL6LkPNezF6T7Q1RP6Q9jwOJkePUIGtr4eCi9+8Z30yHgciezl4sVs0zuo6+p/1Cfk1XagNEyIfEIHxifuga0jsHFU/MHLjuOOTF0opLbVbLfgEfAYBOIdsP9iT/+az+I+yK1/Awz+VK7/QH61AAAAAElFTkSuQmCC';
+
+var decals = [{
+    color: decalColor,
+    dashArrayX: [1, 0],
+    dashArrayY: [2, 5],
+    symbolSize: 1,
+    rotation: Math.PI / 6
+}, {
+    color: decalColor,
+    symbol: 'circle',
+    dashArrayX: [[8, 8], [0, 8, 8, 0]],
+    dashArrayY: [6, 0],
+    symbolSize: 0.8
+}, {
+    color: decalColor,
+    dashArrayX: [1, 0],
+    dashArrayY: [4, 3],
+    rotation: -Math.PI / 4
+}, {
+    color: decalColor,
+    dashArrayX: [[6, 6], [0, 6, 6, 0]],
+    dashArrayY: [6, 0]
+}, {
+    color: decalColor,
+    dashArrayX: [[1, 0], [1, 6]],
+    dashArrayY: [1, 0, 6, 0],
+    rotation: Math.PI / 4
+}, {
+    color: decalColor,
+    symbol: 'triangle',
+    dashArrayX: [[9, 9], [0, 9, 9, 0]],
+    dashArrayY: [7, 2],
+    symbolSize: 0.75
+}, {
+    color: decalColor,
+    dashArrayX: [1, 0],
+    dashArrayY: 10,
+    rotation: 0
+}, {
+    color: decalColor,
+    dashArrayX: [10, 10],
+    dashArrayY: [1, 0],
+    rotation: 0
+}, {
+    color: decalColor,
+    dashArrayX: [10, 5, 20, 5],
+    dashArrayY: 10,
+    rotation: 0
+}, {
+    color: decalColor,
+    dashArrayX: [[10, 5, 20, 5], [20, 5]],
+    dashArrayY: [10, 5],
+    rotation: 0
+}, {
+    symbol: 'rect',
+    dashArrayX: [[8, 8], [0, 8, 8, 0]],
+    dashArrayY: [8, 0],
+    symbolSize: 0.8,
+    rotation: Math.PI / 4,
+    color: 'black'
+}, {
+    color: decalColor,
+    dashArrayX: [[30, 30], [0, 30, 30, 0]],
+    dashArrayY: [15, 0],
+    symbol: 'path://' + svg
+// }, {
+//     color: decalColor,
+//     dashArrayX: [[30, 30], [0, 30, 30, 0]],
+//     dashArrayY: [30, 0],
+//     symbol: base64,
+//     symbolSize: 0.8
+}];
+
+var columns = 6;
+var rows = Math.floor(decals.length / columns) + 1;
+
+function renderItem(params, api) {
+    var paletteColor = api.visual('color');
+    var paletteDecal = api.visual('decal');
+    return {
+        type: 'group',
+        x: (api.value(0) % columns) * 120 + 50,
+        y: Math.floor(api.value(0) / columns) * 120 + 50,
+        children: [{
+            type: 'rect',
+            shape: { x: 0, y: 0, width: 100, height: 100 },
+            style: { fill: paletteColor, decal: paletteDecal },
+        }]
+    }
+}
+
+option = {
+    xAxis: {
+        type: 'value',
+        max: 1,
+        show: false
+    },
+    yAxis: {
+        type: 'value',
+        show: false
+    },
+    series: (function () {
+        var series = [];
+        for (var i = 0; i < decals.length; ++i) {
+            series.push({
+                type: 'custom',
+                data: [[i]],
+                renderItem: renderItem
+            });
+        }
+        return series;
+    })(),
+    aria: {
+        enabled: true,
+        decal: {
+            show: true,
+            decals: decals
+        }
+    },
+    color: ['#ddd']
+};
diff --git a/public/data/doc-example/aria-pie.js b/public/data/doc-example/aria-pie.js
index cd3868f..a7268f6 100644
--- a/public/data/doc-example/aria-pie.js
+++ b/public/data/doc-example/aria-pie.js
@@ -1,6 +1,6 @@
 option = {
     aria: {
-        show: true
+        enabled: true
     },
     title: {
         text: '某站点用户访问来源',
diff --git a/public/data/doc-example/custom-transition-simple.js b/public/data/doc-example/custom-transition-simple.js
new file mode 100644
index 0000000..f1cc858
--- /dev/null
+++ b/public/data/doc-example/custom-transition-simple.js
@@ -0,0 +1,93 @@
+option = {
+    animationDurationUpdate: 1500,
+    xAxis: {
+        min: 0,
+        max: 1
+    },
+    yAxis: {
+        min: 0,
+        max: 1
+    },
+    series: {
+        type: 'custom',
+        renderItem: function renderItem1(params, api) {
+            var pos = api.coord([api.value(0), api.value(1)]);
+            var width = 50 + Math.random() * 150;
+            var height = 50 + Math.random() * 150;
+            var r = Math.random() * 40;
+            var fill = echarts.color.random();
+            var stroke = '#000';
+            var lineWidth = 2 + Math.round(Math.random() * 20);
+
+            return {
+                type: 'group',
+                children: [{
+                    type: 'rect',
+                    x: pos[0] / 2,
+                    y: pos[1],
+                    shape: {
+                        x: -width / 2,
+                        y: -height / 2,
+                        width: width,
+                        height: height,
+                        r: r
+                    },
+                    style: {
+                        fill: fill,
+                        stroke: stroke,
+                        lineWidth: lineWidth
+                    },
+                    textContent: {
+                        style: {
+                            text: 'Has transition',
+                            fontSize: 20
+                        }
+                    },
+                    textConfig: {
+                        position: 'bottom'
+                    },
+                    silent: true,
+                    // Has transition
+                    transition: ['shape', 'style', 'x', 'y']
+                }, {
+                    type: 'rect',
+                    x: pos[0] / 2 + params.coordSys.width / 2,
+                    y: pos[1],
+                    shape: {
+                        x: -width / 2,
+                        y: -height / 2,
+                        width: width,
+                        height: height,
+                        r: r
+                    },
+                    style: {
+                        fill: fill,
+                        stroke: stroke,
+                        lineWidth: lineWidth
+                    },
+                    textContent: {
+                        style: {
+                            text: 'No transition',
+                            fontSize: 20
+                        }
+                    },
+                    textConfig: {
+                        position: 'bottom'
+                    },
+                    silent: true,
+                    // No transition
+                    transition: []
+                }]
+            };
+        },
+        data: [[Math.random(), Math.random()]]
+    }
+};
+
+setInterval(function () {
+    myChart.setOption({
+        series: {
+            data: [[Math.random(), Math.random()]]
+        }
+    });
+}, 2000);
diff --git a/public/data/doc-example/timeline-dynamic-series.js b/public/data/doc-example/timeline-dynamic-series.js
new file mode 100644
index 0000000..34496c3
--- /dev/null
+++ b/public/data/doc-example/timeline-dynamic-series.js
@@ -0,0 +1,72 @@
+
+var option = {
+    baseOption: {
+        timeline: {
+            axisType: 'category',
+            // realtime: false,
+            // loop: false,
+            autoPlay: false,
+            // currentIndex: 2,
+            playInterval: 1000,
+            controlStyle: {
+                stopIcon: 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAGpJREFUWAntlkEKwDAIBKP+/znt82xrD6FIpSSHXDpCQBeXDXOyNQoCBQEz21T1eL7QivUuj/qkO1MTwUm6R3cvPbEw6tO3kJUaH4AABCAAAQhAAAIQgEBJQET2fJxe2udZPuvLWcz/IXACuUMWMJDzUAgAAAAASUVORK5CYII=',
+                playIcon: 'path://M41.365908,29.4271388 L41.3664843,29.4265626 L26.3794329,19.1497136 L26.3747509,19.1541315 C26.0642269,18.8592621 25.6429678,18.677793 25.1786824,18.677793 C24.2236284,18.677793 23.4494433,19.4443188 23.4494433,20.3905371 C23.4494433,20.910214 23.4270417,21.9276946 23.4494433,21.9056292 L23.4494433,30.6673861 L23.4494433,39.8901629 C23.4494433,39.8977982 23.4494433,40.4825908 23.4494433,40.9444991 C23.4494433,41.8901412 24.2236284,42.656691 25.1786824,42.656691 C25.6447205,42.656691 26.0677564,42.4740454 26.3782564,42.1764869 L26.3794329,42.1770872 L41.3664843,31.9005503 L41.3659081,31.8996379 C41.6917266,31.5882735 41.894997,31.1514078 41.894997,30.6670739 C41.894997,30.6658974 41.894997,30.6650091 41.894997,30.6635444 C41.894997,30.6623679 41.894997,30.6609273 41.894997,30.6600389 C41.894997,30.175657 41.6917265,29.7384792 41.365908,29.4271388 Z'
+            },
+            replaceMerge: 'series',
+            data: [
+                '2 series', '3 series', '1 series'
+            ],
+        },
+        tooltip: {
+            trigger:'axis',
+            axisPointer: {
+                type: 'shadow'
+            }
+        },
+        legend: {},
+        calculable: true,
+        grid: {
+            top:80, bottom: 100
+        },
+        toolbox: {
+            left: 'center',
+            top: 30,
+            feature: {
+                dataZoom: {}
+            }
+        },
+        xAxis: {
+            type: 'category',
+            data: ['CityB', 'CityT', 'CityH', 'CityS'],
+            splitLine: {show: false}
+        },
+        yAxis: [
+            {
+                type: 'value',
+                name: 'GDP'
+            }
+        ],
+        series: [
+        ]
+    },
+    options: [
+        {
+            series: [
+                {name: 'a', type: 'bar', data: [12, 33, 44, 55]},
+                {name: 'b', type: 'bar', data: [55, 66, 77, 88]},
+            ]
+        },
+        {
+            series : [
+                {name: 'a', type: 'bar', data: [22, 33, 44, 55]},
+                {name: 'b', type: 'bar', data: [55, 66, 77, 88]},
+                {name: 'c', type: 'bar', data: [55, 66, 77, 88]}
+            ]
+        },
+        {
+            series : [
+                {name: 'b', type: 'bar', data: [55, 66, 77, 88]}
+            ]
+        }
+    ]
+};
diff --git a/public/data/doc-example/value-animation-simple.js b/public/data/doc-example/value-animation-simple.js
new file mode 100644
index 0000000..fe79dcb
--- /dev/null
+++ b/public/data/doc-example/value-animation-simple.js
@@ -0,0 +1,60 @@
+var Y_MAX = 1000;
+var UPDATE_DURATION = 3000;
+var initVal = makeRandomValue();
+
+option = {
+    xAxis: {
+        data: ['a'],
+        axisLabel: { show: false }
+    },
+    yAxis: {
+        max: Y_MAX
+    },
+    legend: {
+        bottom: 10
+    },
+    series: [{
+        name: 'valueAnimation: true',
+        type: 'bar',
+        data: [initVal],
+        label: {
+            show: true,
+            valueAnimation: true,
+            position: 'top',
+            fontSize: 40
+        },
+        barWidth: 20,
+        barGap: '1000%',
+        barCategoryGap: 200,
+        animationDurationUpdate: UPDATE_DURATION * 0.7,
+        animationEasingUpdate: 'linear'
+    }, {
+        name: 'valueAnimation: false',
+        type: 'bar',
+        data: [initVal],
+        label: {
+            show: true,
+            valueAnimation: false,
+            position: 'top',
+            fontSize: 40
+        },
+        barWidth: 20,
+        animationDurationUpdate: UPDATE_DURATION * 0.7,
+        animationEasingUpdate: 'linear'
+    }],
+};
+
+setInterval(function () {
+    var newVal = makeRandomValue();
+    myChart.setOption({
+        series: [{
+            data: [newVal]
+        }, {
+            data: [newVal]
+        }]
+    });
+}, UPDATE_DURATION);
+
+function makeRandomValue() {
+    return Math.round(Math.random() * Y_MAX);
+}
\ No newline at end of file
diff --git a/public/data/gauge-progress.js b/public/data/gauge-progress.js
index 307ac09..a4add90 100644
--- a/public/data/gauge-progress.js
+++ b/public/data/gauge-progress.js
@@ -66,7 +66,7 @@
             borderWidth: 2,
             width: '60%',
             lineHeight: 40,
-            height: '15%',
+            height: 40,
             borderRadius: 8,
             offsetCenter: [0, '35%'],
             valueAnimation: true,
diff --git a/public/data/gauge-simple.js b/public/data/gauge-simple.js
index 80b2a86..0921e43 100644
--- a/public/data/gauge-simple.js
+++ b/public/data/gauge-simple.js
@@ -12,6 +12,9 @@
     series: [{
         name: 'Pressure',
         type: 'gauge',
+        progress: {
+            show: true
+        },
         detail: {
             valueAnimation: true,
             formatter: '{value}'
diff --git a/public/data/heatmap-cartesian.js b/public/data/heatmap-cartesian.js
index 0d5bc23..2edf810 100644
--- a/public/data/heatmap-cartesian.js
+++ b/public/data/heatmap-cartesian.js
@@ -22,7 +22,6 @@
     tooltip: {
         position: 'top'
     },
-    animation: false,
     grid: {
         height: '50%',
         top: '10%'
diff --git a/public/data/line-gradient.js b/public/data/line-gradient.js
index 73e83f1..b5122ef 100644
--- a/public/data/line-gradient.js
+++ b/public/data/line-gradient.js
@@ -6,7 +6,7 @@
 */
 
 
-data = [["2000-06-05",116],["2000-06-06",129],["2000-06-07",135],["2000-06-08",86],["2000-06-09",73],["2000-06-10",85],["2000-06-11",73],["2000-06-12",68],["2000-06-13",92],["2000-06-14",130],["2000-06-15",245],["2000-06-16",139],["2000-06-17",115],["2000-06-18",111],["2000-06-19",309],["2000-06-20",206],["2000-06-21",137],["2000-06-22",128],["2000-06-23",85],["2000-06-24",94],["2000-06-25",71],["2000-06-26",106],["2000-06-27",84],["2000-06-28",93],["2000-06-29",85],["2000-06-30",73],["2000-07-01",83],["2000-07-02",125],["2000-07-03",107],["2000-07-04",82],["2000-07-05",44],["2000-07-06",72],["2000-07-07",106],["2000-07-08",107],["2000-07-09",66],["2000-07-10",91],["2000-07-11",92],["2000-07-12",113],["2000-07-13",107],["2000-07-14",131],["2000-07-15",111],["2000-07-16",64],["2000-07-17",69],["2000-07-18",88],["2000-07-19",77],["2000-07-20",83],["2000-07-21",111],["2000-07-22",57],["2000-07-23",55],["2000-07-24",60]];
+var data = [["2000-06-05",116],["2000-06-06",129],["2000-06-07",135],["2000-06-08",86],["2000-06-09",73],["2000-06-10",85],["2000-06-11",73],["2000-06-12",68],["2000-06-13",92],["2000-06-14",130],["2000-06-15",245],["2000-06-16",139],["2000-06-17",115],["2000-06-18",111],["2000-06-19",309],["2000-06-20",206],["2000-06-21",137],["2000-06-22",128],["2000-06-23",85],["2000-06-24",94],["2000-06-25",71],["2000-06-26",106],["2000-06-27",84],["2000-06-28",93],["2000-06-29",85],["2000-06-30",73],["2000-07-01",83],["2000-07-02",125],["2000-07-03",107],["2000-07-04",82],["2000-07-05",44],["2000-07-06",72],["2000-07-07",106],["2000-07-08",107],["2000-07-09",66],["2000-07-10",91],["2000-07-11",92],["2000-07-12",113],["2000-07-13",107],["2000-07-14",131],["2000-07-15",111],["2000-07-16",64],["2000-07-17",69],["2000-07-18",88],["2000-07-19",77],["2000-07-20",83],["2000-07-21",111],["2000-07-22",57],["2000-07-23",55],["2000-07-24",60]];
 
 var dateList = data.map(function (item) {
     return item[0];
diff --git a/public/data/line-race.js b/public/data/line-race.js
index d9948e6..196ad4f 100644
--- a/public/data/line-race.js
+++ b/public/data/line-race.js
@@ -34,6 +34,7 @@
             type: 'line',
             datasetId: datasetId,
             showSymbol: false,
+            name: country,
             endLabel: {
                 show: true,
                 formatter: function (params) {
@@ -43,6 +44,9 @@
             labelLayout: {
                 moveOverlap: 'shiftY'
             },
+            emphasis: {
+                focus: 'series'
+            },
             encode: {
                 x: 'Year',
                 y: 'Income',
@@ -63,6 +67,7 @@
             text: 'Income of Germany and France since 1950'
         },
         tooltip: {
+            order: 'valueDesc',
             trigger: 'axis'
         },
         xAxis: {
diff --git a/public/data/pie-borderRadius.js b/public/data/pie-borderRadius.js
index f16a25c..b656b48 100644
--- a/public/data/pie-borderRadius.js
+++ b/public/data/pie-borderRadius.js
@@ -7,8 +7,7 @@
 
 option = {
     tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b}: {c} ({d}%)'
+        trigger: 'item'
     },
     legend: {
         top: '5%',
diff --git a/public/data/pie-custom.js b/public/data/pie-custom.js
index 0efe9e1..f0fb03f 100644
--- a/public/data/pie-custom.js
+++ b/public/data/pie-custom.js
@@ -6,18 +6,19 @@
 */
 
 option = {
+    backgroundColor: '#2c343c',
+
     title: {
-        text: '喜欢的电影类型',
+        text: 'Customized Pie',
         left: 'center',
         top: 20,
         textStyle: {
-            fontSize: 24
+            color: '#ccc'
         }
-
     },
+
     tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b} : {c} ({d}%)'
+        trigger: 'item'
     },
 
     visualMap: {
@@ -30,32 +31,35 @@
     },
     series: [
         {
+            name: '访问来源',
             type: 'pie',
             radius: '55%',
             center: ['50%', '50%'],
             data: [
-                {value: 460, name: '浪漫'},
-                {value: 380, name: '动作'},
-                {value: 324, name: '文艺'},
-                {value: 265, name: '喜剧'},
-                {value: 230, name: '其他'}
-            ].sort(function (a, b) {
-                return a.value - b.value;
-            }),
+                {value: 335, name: '直接访问'},
+                {value: 310, name: '邮件营销'},
+                {value: 274, name: '联盟广告'},
+                {value: 235, name: '视频广告'},
+                {value: 400, name: '搜索引擎'}
+            ].sort(function (a, b) { return a.value - b.value; }),
             roseType: 'radius',
             label: {
-                fontSize: 14
+                color: 'rgba(255, 255, 255, 0.3)'
             },
             labelLine: {
+                lineStyle: {
+                    color: 'rgba(255, 255, 255, 0.3)'
+                },
                 smooth: 0.2,
-                length: 20,
-                length2: 100
+                length: 10,
+                length2: 20
             },
             itemStyle: {
                 color: '#c23531',
-                shadowBlur: 20,
-                shadowColor: 'rgba(91, 12, 10, 0.5)'
+                shadowBlur: 200,
+                shadowColor: 'rgba(0, 0, 0, 0.5)'
             },
+
             animationType: 'scale',
             animationEasing: 'elasticOut',
             animationDelay: function (idx) {
diff --git a/public/data/pie-doughnut.js b/public/data/pie-doughnut.js
index e4e0efe..7b8d821 100644
--- a/public/data/pie-doughnut.js
+++ b/public/data/pie-doughnut.js
@@ -7,12 +7,11 @@
 
 option = {
     tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b}: {c} ({d}%)'
+        trigger: 'item'
     },
     legend: {
         top: '5%',
-        left: 'center',
+        left: 'center'
     },
     series: [
         {
diff --git a/public/data/pie-labelLine-adjust.js b/public/data/pie-labelLine-adjust.js
index 4fc81e0..df8b9ce 100644
--- a/public/data/pie-labelLine-adjust.js
+++ b/public/data/pie-labelLine-adjust.js
@@ -37,7 +37,6 @@
 ];
 
 option = {
-    // color: ['#1B2550', '#2A3566', '#2B3C87', '#4853A7', '#858ED8', '#858ED8', '#A3ABEE'],
     title: {
         text: '阅读书籍分布',
         left: 'center',
diff --git a/public/data/pie-simple.js b/public/data/pie-simple.js
index 88a9c2d..38974fb 100644
--- a/public/data/pie-simple.js
+++ b/public/data/pie-simple.js
@@ -12,8 +12,7 @@
         left: 'center'
     },
     tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b} : {c} ({d}%)'
+        trigger: 'item'
     },
     legend: {
         orient: 'vertical',
diff --git a/public/data/sankey-vertical.js b/public/data/sankey-vertical.js
index eb76f8e..9abcad7 100644
--- a/public/data/sankey-vertical.js
+++ b/public/data/sankey-vertical.js
@@ -6,9 +6,6 @@
 */
 
 option = {
-    color: [
-        '#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'
-    ],
     tooltip: {
         trigger: 'item',
         triggerOn: 'mousemove'
diff --git a/public/data/scatter-clustering.js b/public/data/scatter-clustering.js
index 3a6715c..e31ede1 100644
--- a/public/data/scatter-clustering.js
+++ b/public/data/scatter-clustering.js
@@ -91,7 +91,7 @@
     }, {
         transform: {
             type: 'ecStat:clustering',
-            print: true,
+            // print: true,
             config: {
                 clusterCount: CLUSTER_COUNT,
                 outputType: 'single',
diff --git a/public/data/scatter-polar-punchCard.js b/public/data/scatter-polar-punchCard.js
index 9b7741e..61d7a25 100644
--- a/public/data/scatter-polar-punchCard.js
+++ b/public/data/scatter-polar-punchCard.js
@@ -17,8 +17,7 @@
 
 option = {
     title: {
-        text: 'Punch Card of Github',
-        link: 'https://github.com/pissang/echarts-next/graphs/punch-card'
+        text: 'Punch Card of Github'
     },
     legend: {
         data: ['Punch Card'],
diff --git a/public/data/scatter-punchCard.js b/public/data/scatter-punchCard.js
index 66faea8..72d1365 100644
--- a/public/data/scatter-punchCard.js
+++ b/public/data/scatter-punchCard.js
@@ -20,8 +20,7 @@
 
 option = {
     title: {
-        text: 'Punch Card of Github',
-        link: 'https://github.com/pissang/echarts-next/graphs/punch-card'
+        text: 'Punch Card of Github'
     },
     legend: {
         data: ['Punch Card'],
diff --git a/public/data/thumb-dark/area-basic.jpg b/public/data/thumb-dark/area-basic.jpg
deleted file mode 100644
index c9720c9..0000000
--- a/public/data/thumb-dark/area-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/area-basic.png b/public/data/thumb-dark/area-basic.png
index cd75e2b..6fdbacb 100644
--- a/public/data/thumb-dark/area-basic.png
+++ b/public/data/thumb-dark/area-basic.png
Binary files differ
diff --git a/public/data/thumb-dark/area-basic.webp b/public/data/thumb-dark/area-basic.webp
index e886ee9..d211d42 100644
--- a/public/data/thumb-dark/area-basic.webp
+++ b/public/data/thumb-dark/area-basic.webp
Binary files differ
diff --git a/public/data/thumb-dark/area-pieces.jpg b/public/data/thumb-dark/area-pieces.jpg
deleted file mode 100644
index cd585e4..0000000
--- a/public/data/thumb-dark/area-pieces.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/area-rainfall.jpg b/public/data/thumb-dark/area-rainfall.jpg
deleted file mode 100644
index 489b44e..0000000
--- a/public/data/thumb-dark/area-rainfall.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/area-simple.jpg b/public/data/thumb-dark/area-simple.jpg
deleted file mode 100644
index aadb898..0000000
--- a/public/data/thumb-dark/area-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/area-stack.jpg b/public/data/thumb-dark/area-stack.jpg
deleted file mode 100644
index 3f6e060..0000000
--- a/public/data/thumb-dark/area-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/area-stack.png b/public/data/thumb-dark/area-stack.png
index 55f0171..f9f05f4 100644
--- a/public/data/thumb-dark/area-stack.png
+++ b/public/data/thumb-dark/area-stack.png
Binary files differ
diff --git a/public/data/thumb-dark/area-stack.webp b/public/data/thumb-dark/area-stack.webp
index 678579b..9528e44 100644
--- a/public/data/thumb-dark/area-stack.webp
+++ b/public/data/thumb-dark/area-stack.webp
Binary files differ
diff --git a/public/data/thumb-dark/bar-animation-delay.jpg b/public/data/thumb-dark/bar-animation-delay.jpg
deleted file mode 100644
index 39dbd92..0000000
--- a/public/data/thumb-dark/bar-animation-delay.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-background.jpg b/public/data/thumb-dark/bar-background.jpg
deleted file mode 100644
index 861d8c9..0000000
--- a/public/data/thumb-dark/bar-background.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-brush.jpg b/public/data/thumb-dark/bar-brush.jpg
deleted file mode 100644
index 5e3ec10..0000000
--- a/public/data/thumb-dark/bar-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-gradient.jpg b/public/data/thumb-dark/bar-gradient.jpg
deleted file mode 100644
index d19026b..0000000
--- a/public/data/thumb-dark/bar-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-histogram.jpg b/public/data/thumb-dark/bar-histogram.jpg
deleted file mode 100644
index 3a3edf5..0000000
--- a/public/data/thumb-dark/bar-histogram.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-label-rotation.jpg b/public/data/thumb-dark/bar-label-rotation.jpg
deleted file mode 100644
index f688269..0000000
--- a/public/data/thumb-dark/bar-label-rotation.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-large.jpg b/public/data/thumb-dark/bar-large.jpg
deleted file mode 100644
index ce9fde5..0000000
--- a/public/data/thumb-dark/bar-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-negative.jpg b/public/data/thumb-dark/bar-negative.jpg
deleted file mode 100644
index 9878c23..0000000
--- a/public/data/thumb-dark/bar-negative.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-negative2.jpg b/public/data/thumb-dark/bar-negative2.jpg
deleted file mode 100644
index f127d7e..0000000
--- a/public/data/thumb-dark/bar-negative2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-polar-real-estate.jpg b/public/data/thumb-dark/bar-polar-real-estate.jpg
deleted file mode 100644
index 499407b..0000000
--- a/public/data/thumb-dark/bar-polar-real-estate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-polar-stack-radial.jpg b/public/data/thumb-dark/bar-polar-stack-radial.jpg
deleted file mode 100644
index c639590..0000000
--- a/public/data/thumb-dark/bar-polar-stack-radial.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-polar-stack.jpg b/public/data/thumb-dark/bar-polar-stack.jpg
deleted file mode 100644
index aca16a1..0000000
--- a/public/data/thumb-dark/bar-polar-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-race-country.png b/public/data/thumb-dark/bar-race-country.png
new file mode 100644
index 0000000..0fab93c
--- /dev/null
+++ b/public/data/thumb-dark/bar-race-country.png
Binary files differ
diff --git a/public/data/thumb-dark/bar-race-country.webp b/public/data/thumb-dark/bar-race-country.webp
new file mode 100644
index 0000000..2e0883a
--- /dev/null
+++ b/public/data/thumb-dark/bar-race-country.webp
Binary files differ
diff --git a/public/data/thumb-dark/bar-race.png b/public/data/thumb-dark/bar-race.png
index cc6599d..26d77a1 100644
--- a/public/data/thumb-dark/bar-race.png
+++ b/public/data/thumb-dark/bar-race.png
Binary files differ
diff --git a/public/data/thumb-dark/bar-race.webp b/public/data/thumb-dark/bar-race.webp
index 2c96054..2e7aac2 100644
--- a/public/data/thumb-dark/bar-race.webp
+++ b/public/data/thumb-dark/bar-race.webp
Binary files differ
diff --git a/public/data/thumb-dark/bar-rich-text.jpg b/public/data/thumb-dark/bar-rich-text.jpg
deleted file mode 100644
index c7253c5..0000000
--- a/public/data/thumb-dark/bar-rich-text.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-rich-text.png b/public/data/thumb-dark/bar-rich-text.png
index 21f5335..0741f4a 100644
--- a/public/data/thumb-dark/bar-rich-text.png
+++ b/public/data/thumb-dark/bar-rich-text.png
Binary files differ
diff --git a/public/data/thumb-dark/bar-rich-text.webp b/public/data/thumb-dark/bar-rich-text.webp
index 9230113..636be58 100644
--- a/public/data/thumb-dark/bar-rich-text.webp
+++ b/public/data/thumb-dark/bar-rich-text.webp
Binary files differ
diff --git a/public/data/thumb-dark/bar-simple.jpg b/public/data/thumb-dark/bar-simple.jpg
deleted file mode 100644
index 9e1bb20..0000000
--- a/public/data/thumb-dark/bar-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-stack.jpg b/public/data/thumb-dark/bar-stack.jpg
deleted file mode 100644
index 1c087d6..0000000
--- a/public/data/thumb-dark/bar-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-tick-align.jpg b/public/data/thumb-dark/bar-tick-align.jpg
deleted file mode 100644
index 5d3eaed..0000000
--- a/public/data/thumb-dark/bar-tick-align.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-waterfall.jpg b/public/data/thumb-dark/bar-waterfall.jpg
deleted file mode 100644
index ce12562..0000000
--- a/public/data/thumb-dark/bar-waterfall.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-waterfall2.jpg b/public/data/thumb-dark/bar-waterfall2.jpg
deleted file mode 100644
index cab895c..0000000
--- a/public/data/thumb-dark/bar-waterfall2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-y-category-stack.jpg b/public/data/thumb-dark/bar-y-category-stack.jpg
deleted file mode 100644
index 27cb5e7..0000000
--- a/public/data/thumb-dark/bar-y-category-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar-y-category.jpg b/public/data/thumb-dark/bar-y-category.jpg
deleted file mode 100644
index 97ab870..0000000
--- a/public/data/thumb-dark/bar-y-category.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bar1.jpg b/public/data/thumb-dark/bar1.jpg
deleted file mode 100644
index 42d184f..0000000
--- a/public/data/thumb-dark/bar1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/boxplot-light-velocity.jpg b/public/data/thumb-dark/boxplot-light-velocity.jpg
deleted file mode 100644
index 062729a..0000000
--- a/public/data/thumb-dark/boxplot-light-velocity.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/boxplot-light-velocity2.jpg b/public/data/thumb-dark/boxplot-light-velocity2.jpg
deleted file mode 100644
index e5dfc4c..0000000
--- a/public/data/thumb-dark/boxplot-light-velocity2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/boxplot-multi.jpg b/public/data/thumb-dark/boxplot-multi.jpg
deleted file mode 100644
index 4c3b2a9..0000000
--- a/public/data/thumb-dark/boxplot-multi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bubble-gradient.jpg b/public/data/thumb-dark/bubble-gradient.jpg
deleted file mode 100644
index 7b4fa05..0000000
--- a/public/data/thumb-dark/bubble-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/bubble-gradient.png b/public/data/thumb-dark/bubble-gradient.png
index a799c09..0a8130c 100644
--- a/public/data/thumb-dark/bubble-gradient.png
+++ b/public/data/thumb-dark/bubble-gradient.png
Binary files differ
diff --git a/public/data/thumb-dark/bubble-gradient.webp b/public/data/thumb-dark/bubble-gradient.webp
index 224a8a7..6449bca 100644
--- a/public/data/thumb-dark/bubble-gradient.webp
+++ b/public/data/thumb-dark/bubble-gradient.webp
Binary files differ
diff --git a/public/data/thumb-dark/calendar-charts.jpg b/public/data/thumb-dark/calendar-charts.jpg
deleted file mode 100644
index 65dae14..0000000
--- a/public/data/thumb-dark/calendar-charts.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-charts.png b/public/data/thumb-dark/calendar-charts.png
index fe58dd9..6179f7d 100644
--- a/public/data/thumb-dark/calendar-charts.png
+++ b/public/data/thumb-dark/calendar-charts.png
Binary files differ
diff --git a/public/data/thumb-dark/calendar-charts.webp b/public/data/thumb-dark/calendar-charts.webp
index 41be08b..fe574bf 100644
--- a/public/data/thumb-dark/calendar-charts.webp
+++ b/public/data/thumb-dark/calendar-charts.webp
Binary files differ
diff --git a/public/data/thumb-dark/calendar-effectscatter.jpg b/public/data/thumb-dark/calendar-effectscatter.jpg
deleted file mode 100644
index b25031b..0000000
--- a/public/data/thumb-dark/calendar-effectscatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-effectscatter.png b/public/data/thumb-dark/calendar-effectscatter.png
index 26a1e83..a7e738b 100644
--- a/public/data/thumb-dark/calendar-effectscatter.png
+++ b/public/data/thumb-dark/calendar-effectscatter.png
Binary files differ
diff --git a/public/data/thumb-dark/calendar-effectscatter.webp b/public/data/thumb-dark/calendar-effectscatter.webp
index d852e05..532b72e 100644
--- a/public/data/thumb-dark/calendar-effectscatter.webp
+++ b/public/data/thumb-dark/calendar-effectscatter.webp
Binary files differ
diff --git a/public/data/thumb-dark/calendar-graph.jpg b/public/data/thumb-dark/calendar-graph.jpg
deleted file mode 100644
index 43e7a3e..0000000
--- a/public/data/thumb-dark/calendar-graph.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-graph.png b/public/data/thumb-dark/calendar-graph.png
index 6b66120..9ba7e84 100644
--- a/public/data/thumb-dark/calendar-graph.png
+++ b/public/data/thumb-dark/calendar-graph.png
Binary files differ
diff --git a/public/data/thumb-dark/calendar-graph.webp b/public/data/thumb-dark/calendar-graph.webp
index b5ce519..49f685d 100644
--- a/public/data/thumb-dark/calendar-graph.webp
+++ b/public/data/thumb-dark/calendar-graph.webp
Binary files differ
diff --git a/public/data/thumb-dark/calendar-heatmap.jpg b/public/data/thumb-dark/calendar-heatmap.jpg
deleted file mode 100644
index 891ff57..0000000
--- a/public/data/thumb-dark/calendar-heatmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-horizontal.jpg b/public/data/thumb-dark/calendar-horizontal.jpg
deleted file mode 100644
index a840d91..0000000
--- a/public/data/thumb-dark/calendar-horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-lunar.jpg b/public/data/thumb-dark/calendar-lunar.jpg
deleted file mode 100644
index d150c90..0000000
--- a/public/data/thumb-dark/calendar-lunar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-pie.jpg b/public/data/thumb-dark/calendar-pie.jpg
deleted file mode 100644
index 3732cd8..0000000
--- a/public/data/thumb-dark/calendar-pie.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-simple.jpg b/public/data/thumb-dark/calendar-simple.jpg
deleted file mode 100644
index 34bbd95..0000000
--- a/public/data/thumb-dark/calendar-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/calendar-vertical.jpg b/public/data/thumb-dark/calendar-vertical.jpg
deleted file mode 100644
index c348a51..0000000
--- a/public/data/thumb-dark/calendar-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-brush.jpg b/public/data/thumb-dark/candlestick-brush.jpg
deleted file mode 100644
index f44f0cd..0000000
--- a/public/data/thumb-dark/candlestick-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-large.jpg b/public/data/thumb-dark/candlestick-large.jpg
deleted file mode 100644
index 8167c28..0000000
--- a/public/data/thumb-dark/candlestick-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-sh-2015.jpg b/public/data/thumb-dark/candlestick-sh-2015.jpg
deleted file mode 100644
index a6fb1ef..0000000
--- a/public/data/thumb-dark/candlestick-sh-2015.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-sh.jpg b/public/data/thumb-dark/candlestick-sh.jpg
deleted file mode 100644
index 8638b92..0000000
--- a/public/data/thumb-dark/candlestick-sh.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-simple.jpg b/public/data/thumb-dark/candlestick-simple.jpg
deleted file mode 100644
index 78edb7f..0000000
--- a/public/data/thumb-dark/candlestick-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-touch.jpg b/public/data/thumb-dark/candlestick-touch.jpg
deleted file mode 100644
index 41cac32..0000000
--- a/public/data/thumb-dark/candlestick-touch.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-touch.png b/public/data/thumb-dark/candlestick-touch.png
index 870b5f4..eb17263 100644
--- a/public/data/thumb-dark/candlestick-touch.png
+++ b/public/data/thumb-dark/candlestick-touch.png
Binary files differ
diff --git a/public/data/thumb-dark/candlestick-touch.webp b/public/data/thumb-dark/candlestick-touch.webp
index 522b1f4..97e4862 100644
--- a/public/data/thumb-dark/candlestick-touch.webp
+++ b/public/data/thumb-dark/candlestick-touch.webp
Binary files differ
diff --git a/public/data/thumb-dark/circle-packing-with-d3.png b/public/data/thumb-dark/circle-packing-with-d3.png
new file mode 100644
index 0000000..248f709
--- /dev/null
+++ b/public/data/thumb-dark/circle-packing-with-d3.png
Binary files differ
diff --git a/public/data/thumb-dark/circle-packing-with-d3.webp b/public/data/thumb-dark/circle-packing-with-d3.webp
new file mode 100644
index 0000000..d08bb51
--- /dev/null
+++ b/public/data/thumb-dark/circle-packing-with-d3.webp
Binary files differ
diff --git a/public/data/thumb-dark/confidence-band.jpg b/public/data/thumb-dark/confidence-band.jpg
deleted file mode 100644
index 18ee4f4..0000000
--- a/public/data/thumb-dark/confidence-band.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/covid-america.png b/public/data/thumb-dark/covid-america.png
new file mode 100644
index 0000000..f62ba86
--- /dev/null
+++ b/public/data/thumb-dark/covid-america.png
Binary files differ
diff --git a/public/data/thumb-dark/covid-america.webp b/public/data/thumb-dark/covid-america.webp
new file mode 100644
index 0000000..0d8aabd
--- /dev/null
+++ b/public/data/thumb-dark/covid-america.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-bar.png b/public/data/thumb-dark/custom-aggregate-scatter-bar.png
new file mode 100644
index 0000000..72f19ec
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-bar.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-bar.webp b/public/data/thumb-dark/custom-aggregate-scatter-bar.webp
new file mode 100644
index 0000000..0ae651f
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-bar.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-cluster.png b/public/data/thumb-dark/custom-aggregate-scatter-cluster.png
new file mode 100644
index 0000000..1b64974
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-cluster.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-cluster.webp b/public/data/thumb-dark/custom-aggregate-scatter-cluster.webp
new file mode 100644
index 0000000..78c42b9
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-cluster.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-pie.png b/public/data/thumb-dark/custom-aggregate-scatter-pie.png
new file mode 100644
index 0000000..cdd2c24
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-pie.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-aggregate-scatter-pie.webp b/public/data/thumb-dark/custom-aggregate-scatter-pie.webp
new file mode 100644
index 0000000..e9b515a
--- /dev/null
+++ b/public/data/thumb-dark/custom-aggregate-scatter-pie.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-bar-trend.jpg b/public/data/thumb-dark/custom-bar-trend.jpg
deleted file mode 100644
index db830fc..0000000
--- a/public/data/thumb-dark/custom-bar-trend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-calendar-icon.jpg b/public/data/thumb-dark/custom-calendar-icon.jpg
deleted file mode 100644
index 4b959d8..0000000
--- a/public/data/thumb-dark/custom-calendar-icon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-cartesian-polygon.jpg b/public/data/thumb-dark/custom-cartesian-polygon.jpg
deleted file mode 100644
index a429b7a..0000000
--- a/public/data/thumb-dark/custom-cartesian-polygon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-combine-separate-morph.png b/public/data/thumb-dark/custom-combine-separate-morph.png
index 473b2e6..48e7a0e 100644
--- a/public/data/thumb-dark/custom-combine-separate-morph.png
+++ b/public/data/thumb-dark/custom-combine-separate-morph.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-combine-separate-morph.webp b/public/data/thumb-dark/custom-combine-separate-morph.webp
index d573a02..9a920fb 100644
--- a/public/data/thumb-dark/custom-combine-separate-morph.webp
+++ b/public/data/thumb-dark/custom-combine-separate-morph.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-error-bar.jpg b/public/data/thumb-dark/custom-error-bar.jpg
deleted file mode 100644
index bc57bb8..0000000
--- a/public/data/thumb-dark/custom-error-bar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-error-scatter.jpg b/public/data/thumb-dark/custom-error-scatter.jpg
deleted file mode 100644
index c932432..0000000
--- a/public/data/thumb-dark/custom-error-scatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-gantt-flight.jpg b/public/data/thumb-dark/custom-gantt-flight.jpg
deleted file mode 100644
index d25e9ba..0000000
--- a/public/data/thumb-dark/custom-gantt-flight.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-gauge.png b/public/data/thumb-dark/custom-gauge.png
index 6106627..8bfc878 100644
--- a/public/data/thumb-dark/custom-gauge.png
+++ b/public/data/thumb-dark/custom-gauge.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-gauge.webp b/public/data/thumb-dark/custom-gauge.webp
index df68040..fd1462e 100644
--- a/public/data/thumb-dark/custom-gauge.webp
+++ b/public/data/thumb-dark/custom-gauge.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-hexbin.jpg b/public/data/thumb-dark/custom-hexbin.jpg
deleted file mode 100644
index 6cdb0bc..0000000
--- a/public/data/thumb-dark/custom-hexbin.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-ohlc.jpg b/public/data/thumb-dark/custom-ohlc.jpg
deleted file mode 100644
index ac9a094..0000000
--- a/public/data/thumb-dark/custom-ohlc.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-one-to-one-morph.png b/public/data/thumb-dark/custom-one-to-one-morph.png
index 002d364..d818eab 100644
--- a/public/data/thumb-dark/custom-one-to-one-morph.png
+++ b/public/data/thumb-dark/custom-one-to-one-morph.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-one-to-one-morph.webp b/public/data/thumb-dark/custom-one-to-one-morph.webp
index 41a6b59..763beba 100644
--- a/public/data/thumb-dark/custom-one-to-one-morph.webp
+++ b/public/data/thumb-dark/custom-one-to-one-morph.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-polar-heatmap.jpg b/public/data/thumb-dark/custom-polar-heatmap.jpg
deleted file mode 100644
index 0491b2a..0000000
--- a/public/data/thumb-dark/custom-polar-heatmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-profile.jpg b/public/data/thumb-dark/custom-profile.jpg
deleted file mode 100644
index b30d277..0000000
--- a/public/data/thumb-dark/custom-profile.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-profile.png b/public/data/thumb-dark/custom-profile.png
index fd83bc9..c08d85d 100644
--- a/public/data/thumb-dark/custom-profile.png
+++ b/public/data/thumb-dark/custom-profile.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-profile.webp b/public/data/thumb-dark/custom-profile.webp
index eaef189..e528e53 100644
--- a/public/data/thumb-dark/custom-profile.webp
+++ b/public/data/thumb-dark/custom-profile.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-profit.jpg b/public/data/thumb-dark/custom-profit.jpg
deleted file mode 100644
index 36aa717..0000000
--- a/public/data/thumb-dark/custom-profit.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/custom-spiral-race.png b/public/data/thumb-dark/custom-spiral-race.png
index 0d16309..bbce0f1 100644
--- a/public/data/thumb-dark/custom-spiral-race.png
+++ b/public/data/thumb-dark/custom-spiral-race.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-spiral-race.webp b/public/data/thumb-dark/custom-spiral-race.webp
index 799774a..3f5af2a 100644
--- a/public/data/thumb-dark/custom-spiral-race.webp
+++ b/public/data/thumb-dark/custom-spiral-race.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-story-transition.png b/public/data/thumb-dark/custom-story-transition.png
index 99f0bb9..7ec6c71 100644
--- a/public/data/thumb-dark/custom-story-transition.png
+++ b/public/data/thumb-dark/custom-story-transition.png
Binary files differ
diff --git a/public/data/thumb-dark/custom-story-transition.webp b/public/data/thumb-dark/custom-story-transition.webp
index 156a80a..d73e3a0 100644
--- a/public/data/thumb-dark/custom-story-transition.webp
+++ b/public/data/thumb-dark/custom-story-transition.webp
Binary files differ
diff --git a/public/data/thumb-dark/custom-wind.jpg b/public/data/thumb-dark/custom-wind.jpg
deleted file mode 100644
index effc271..0000000
--- a/public/data/thumb-dark/custom-wind.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/cycle-plot.jpg b/public/data/thumb-dark/cycle-plot.jpg
deleted file mode 100644
index 7ddf273..0000000
--- a/public/data/thumb-dark/cycle-plot.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/data-transform-aggregate.png b/public/data/thumb-dark/data-transform-aggregate.png
new file mode 100644
index 0000000..bf880f7
--- /dev/null
+++ b/public/data/thumb-dark/data-transform-aggregate.png
Binary files differ
diff --git a/public/data/thumb-dark/data-transform-aggregate.webp b/public/data/thumb-dark/data-transform-aggregate.webp
new file mode 100644
index 0000000..98150ef
--- /dev/null
+++ b/public/data/thumb-dark/data-transform-aggregate.webp
Binary files differ
diff --git a/public/data/thumb-dark/dataset-default.jpg b/public/data/thumb-dark/dataset-default.jpg
deleted file mode 100644
index d747dec..0000000
--- a/public/data/thumb-dark/dataset-default.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-encode0.jpg b/public/data/thumb-dark/dataset-encode0.jpg
deleted file mode 100644
index 1a678d5..0000000
--- a/public/data/thumb-dark/dataset-encode0.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-encode1.jpg b/public/data/thumb-dark/dataset-encode1.jpg
deleted file mode 100644
index 64889d4..0000000
--- a/public/data/thumb-dark/dataset-encode1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-link.jpg b/public/data/thumb-dark/dataset-link.jpg
deleted file mode 100644
index d8daf1b..0000000
--- a/public/data/thumb-dark/dataset-link.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-series-layout-by.jpg b/public/data/thumb-dark/dataset-series-layout-by.jpg
deleted file mode 100644
index e7b4701..0000000
--- a/public/data/thumb-dark/dataset-series-layout-by.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-simple0.jpg b/public/data/thumb-dark/dataset-simple0.jpg
deleted file mode 100644
index f92dd00..0000000
--- a/public/data/thumb-dark/dataset-simple0.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dataset-simple1.jpg b/public/data/thumb-dark/dataset-simple1.jpg
deleted file mode 100644
index f92dd00..0000000
--- a/public/data/thumb-dark/dataset-simple1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data.jpg b/public/data/thumb-dark/dynamic-data.jpg
deleted file mode 100644
index da05a42..0000000
--- a/public/data/thumb-dark/dynamic-data.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data.png b/public/data/thumb-dark/dynamic-data.png
index e58866c..a98d07e 100644
--- a/public/data/thumb-dark/dynamic-data.png
+++ b/public/data/thumb-dark/dynamic-data.png
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data.webp b/public/data/thumb-dark/dynamic-data.webp
index c2908b5..2ad4884 100644
--- a/public/data/thumb-dark/dynamic-data.webp
+++ b/public/data/thumb-dark/dynamic-data.webp
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data2.jpg b/public/data/thumb-dark/dynamic-data2.jpg
deleted file mode 100644
index b83cc26..0000000
--- a/public/data/thumb-dark/dynamic-data2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data2.png b/public/data/thumb-dark/dynamic-data2.png
index 9cdbcde..084e41f 100644
--- a/public/data/thumb-dark/dynamic-data2.png
+++ b/public/data/thumb-dark/dynamic-data2.png
Binary files differ
diff --git a/public/data/thumb-dark/dynamic-data2.webp b/public/data/thumb-dark/dynamic-data2.webp
index 364d2b6..f092d3c 100644
--- a/public/data/thumb-dark/dynamic-data2.webp
+++ b/public/data/thumb-dark/dynamic-data2.webp
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-bmap.jpg b/public/data/thumb-dark/effectScatter-bmap.jpg
deleted file mode 100644
index ae8df14..0000000
--- a/public/data/thumb-dark/effectScatter-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-bmap.png b/public/data/thumb-dark/effectScatter-bmap.png
index 9cdbeba..efade5d 100644
--- a/public/data/thumb-dark/effectScatter-bmap.png
+++ b/public/data/thumb-dark/effectScatter-bmap.png
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-bmap.webp b/public/data/thumb-dark/effectScatter-bmap.webp
index db3b24c..3f5c6e7 100644
--- a/public/data/thumb-dark/effectScatter-bmap.webp
+++ b/public/data/thumb-dark/effectScatter-bmap.webp
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-map.jpg b/public/data/thumb-dark/effectScatter-map.jpg
deleted file mode 100644
index ecbc29c..0000000
--- a/public/data/thumb-dark/effectScatter-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-map.png b/public/data/thumb-dark/effectScatter-map.png
index 77cad70..e858dc9 100644
--- a/public/data/thumb-dark/effectScatter-map.png
+++ b/public/data/thumb-dark/effectScatter-map.png
Binary files differ
diff --git a/public/data/thumb-dark/effectScatter-map.webp b/public/data/thumb-dark/effectScatter-map.webp
index 574bd75..4613f62 100644
--- a/public/data/thumb-dark/effectScatter-map.webp
+++ b/public/data/thumb-dark/effectScatter-map.webp
Binary files differ
diff --git a/public/data/thumb-dark/funnel-align.jpg b/public/data/thumb-dark/funnel-align.jpg
deleted file mode 100644
index 3c29cff..0000000
--- a/public/data/thumb-dark/funnel-align.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/funnel-customize.jpg b/public/data/thumb-dark/funnel-customize.jpg
deleted file mode 100644
index 3e8e2fd..0000000
--- a/public/data/thumb-dark/funnel-customize.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/funnel-mutiple.jpg b/public/data/thumb-dark/funnel-mutiple.jpg
deleted file mode 100644
index 094311b..0000000
--- a/public/data/thumb-dark/funnel-mutiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/funnel.jpg b/public/data/thumb-dark/funnel.jpg
deleted file mode 100644
index baef611..0000000
--- a/public/data/thumb-dark/funnel.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/gauge-barometer.png b/public/data/thumb-dark/gauge-barometer.png
index eabdd42..6a279eb 100644
--- a/public/data/thumb-dark/gauge-barometer.png
+++ b/public/data/thumb-dark/gauge-barometer.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-barometer.webp b/public/data/thumb-dark/gauge-barometer.webp
index 6bcc9e3..d42cac1 100644
--- a/public/data/thumb-dark/gauge-barometer.webp
+++ b/public/data/thumb-dark/gauge-barometer.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-car-dark.jpg b/public/data/thumb-dark/gauge-car-dark.jpg
deleted file mode 100644
index 172fa67..0000000
--- a/public/data/thumb-dark/gauge-car-dark.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/gauge-car.jpg b/public/data/thumb-dark/gauge-car.jpg
deleted file mode 100644
index 481d875..0000000
--- a/public/data/thumb-dark/gauge-car.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/gauge-car.png b/public/data/thumb-dark/gauge-car.png
index 1abface..91b3b7c 100644
--- a/public/data/thumb-dark/gauge-car.png
+++ b/public/data/thumb-dark/gauge-car.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-car.webp b/public/data/thumb-dark/gauge-car.webp
index 2a3e709..21bd20e 100644
--- a/public/data/thumb-dark/gauge-car.webp
+++ b/public/data/thumb-dark/gauge-car.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-clock.png b/public/data/thumb-dark/gauge-clock.png
index ab0e4b0..e2fde27 100644
--- a/public/data/thumb-dark/gauge-clock.png
+++ b/public/data/thumb-dark/gauge-clock.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-clock.webp b/public/data/thumb-dark/gauge-clock.webp
index 93fb652..0e746c0 100644
--- a/public/data/thumb-dark/gauge-clock.webp
+++ b/public/data/thumb-dark/gauge-clock.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-multi-title.png b/public/data/thumb-dark/gauge-multi-title.png
index 762c366..1988b88 100644
--- a/public/data/thumb-dark/gauge-multi-title.png
+++ b/public/data/thumb-dark/gauge-multi-title.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-multi-title.webp b/public/data/thumb-dark/gauge-multi-title.webp
index 2110218..5b359cd 100644
--- a/public/data/thumb-dark/gauge-multi-title.webp
+++ b/public/data/thumb-dark/gauge-multi-title.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-progress.png b/public/data/thumb-dark/gauge-progress.png
index 2a07593..671e0f6 100644
--- a/public/data/thumb-dark/gauge-progress.png
+++ b/public/data/thumb-dark/gauge-progress.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-progress.webp b/public/data/thumb-dark/gauge-progress.webp
index 271c0aa..9c3048c 100644
--- a/public/data/thumb-dark/gauge-progress.webp
+++ b/public/data/thumb-dark/gauge-progress.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-ring.png b/public/data/thumb-dark/gauge-ring.png
index 82c53af..788d316 100644
--- a/public/data/thumb-dark/gauge-ring.png
+++ b/public/data/thumb-dark/gauge-ring.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-ring.webp b/public/data/thumb-dark/gauge-ring.webp
index 75e5d84..f17a5fc 100644
--- a/public/data/thumb-dark/gauge-ring.webp
+++ b/public/data/thumb-dark/gauge-ring.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-stage.png b/public/data/thumb-dark/gauge-stage.png
index 87b8c06..dd93537 100644
--- a/public/data/thumb-dark/gauge-stage.png
+++ b/public/data/thumb-dark/gauge-stage.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-stage.webp b/public/data/thumb-dark/gauge-stage.webp
index d918cec..9842c59 100644
--- a/public/data/thumb-dark/gauge-stage.webp
+++ b/public/data/thumb-dark/gauge-stage.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge-temperature.png b/public/data/thumb-dark/gauge-temperature.png
index 6831e7f..9e3459a 100644
--- a/public/data/thumb-dark/gauge-temperature.png
+++ b/public/data/thumb-dark/gauge-temperature.png
Binary files differ
diff --git a/public/data/thumb-dark/gauge-temperature.webp b/public/data/thumb-dark/gauge-temperature.webp
index f4b6fc5..9057c3b 100644
--- a/public/data/thumb-dark/gauge-temperature.webp
+++ b/public/data/thumb-dark/gauge-temperature.webp
Binary files differ
diff --git a/public/data/thumb-dark/gauge.jpg b/public/data/thumb-dark/gauge.jpg
deleted file mode 100644
index a84bfe3..0000000
--- a/public/data/thumb-dark/gauge.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/geo-lines.jpg b/public/data/thumb-dark/geo-lines.jpg
deleted file mode 100644
index 058e7e6..0000000
--- a/public/data/thumb-dark/geo-lines.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/geo-lines.png b/public/data/thumb-dark/geo-lines.png
index b8a022a..71ebfe8 100644
--- a/public/data/thumb-dark/geo-lines.png
+++ b/public/data/thumb-dark/geo-lines.png
Binary files differ
diff --git a/public/data/thumb-dark/geo-lines.webp b/public/data/thumb-dark/geo-lines.webp
index 07bd245..c7a4153 100644
--- a/public/data/thumb-dark/geo-lines.webp
+++ b/public/data/thumb-dark/geo-lines.webp
Binary files differ
diff --git a/public/data/thumb-dark/geo-map-scatter.jpg b/public/data/thumb-dark/geo-map-scatter.jpg
deleted file mode 100644
index 532aed6..0000000
--- a/public/data/thumb-dark/geo-map-scatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-circular-layout.jpg b/public/data/thumb-dark/graph-circular-layout.jpg
deleted file mode 100644
index 4a9b2ec..0000000
--- a/public/data/thumb-dark/graph-circular-layout.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-force-dynamic.jpg b/public/data/thumb-dark/graph-force-dynamic.jpg
deleted file mode 100644
index 4421a3b..0000000
--- a/public/data/thumb-dark/graph-force-dynamic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-force-dynamic.png b/public/data/thumb-dark/graph-force-dynamic.png
index 702afda..41babfb 100644
--- a/public/data/thumb-dark/graph-force-dynamic.png
+++ b/public/data/thumb-dark/graph-force-dynamic.png
Binary files differ
diff --git a/public/data/thumb-dark/graph-force-dynamic.webp b/public/data/thumb-dark/graph-force-dynamic.webp
index 59cb246..4c4ebad 100644
--- a/public/data/thumb-dark/graph-force-dynamic.webp
+++ b/public/data/thumb-dark/graph-force-dynamic.webp
Binary files differ
diff --git a/public/data/thumb-dark/graph-force.jpg b/public/data/thumb-dark/graph-force.jpg
deleted file mode 100644
index f939464..0000000
--- a/public/data/thumb-dark/graph-force.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-force2.jpg b/public/data/thumb-dark/graph-force2.jpg
deleted file mode 100644
index b174217..0000000
--- a/public/data/thumb-dark/graph-force2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-force2.png b/public/data/thumb-dark/graph-force2.png
index a8ab901..7bff071 100644
--- a/public/data/thumb-dark/graph-force2.png
+++ b/public/data/thumb-dark/graph-force2.png
Binary files differ
diff --git a/public/data/thumb-dark/graph-force2.webp b/public/data/thumb-dark/graph-force2.webp
index efe5630..abdd403 100644
--- a/public/data/thumb-dark/graph-force2.webp
+++ b/public/data/thumb-dark/graph-force2.webp
Binary files differ
diff --git a/public/data/thumb-dark/graph-grid.jpg b/public/data/thumb-dark/graph-grid.jpg
deleted file mode 100644
index 590aa20..0000000
--- a/public/data/thumb-dark/graph-grid.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-life-expectancy.jpg b/public/data/thumb-dark/graph-life-expectancy.jpg
deleted file mode 100644
index ecfd7c8..0000000
--- a/public/data/thumb-dark/graph-life-expectancy.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-npm.jpg b/public/data/thumb-dark/graph-npm.jpg
deleted file mode 100644
index d447c9c..0000000
--- a/public/data/thumb-dark/graph-npm.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-simple.jpg b/public/data/thumb-dark/graph-simple.jpg
deleted file mode 100644
index 2aa9185..0000000
--- a/public/data/thumb-dark/graph-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph-webkit-dep.jpg b/public/data/thumb-dark/graph-webkit-dep.jpg
deleted file mode 100644
index 68795d4..0000000
--- a/public/data/thumb-dark/graph-webkit-dep.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/graph.jpg b/public/data/thumb-dark/graph.jpg
deleted file mode 100644
index e812c6b..0000000
--- a/public/data/thumb-dark/graph.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/grid-multiple.jpg b/public/data/thumb-dark/grid-multiple.jpg
deleted file mode 100644
index 40aab9c..0000000
--- a/public/data/thumb-dark/grid-multiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-bmap.jpg b/public/data/thumb-dark/heatmap-bmap.jpg
deleted file mode 100644
index 7bbfde7..0000000
--- a/public/data/thumb-dark/heatmap-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-bmap.png b/public/data/thumb-dark/heatmap-bmap.png
index 6fd86d0..7662ecd 100644
--- a/public/data/thumb-dark/heatmap-bmap.png
+++ b/public/data/thumb-dark/heatmap-bmap.png
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-bmap.webp b/public/data/thumb-dark/heatmap-bmap.webp
index cdcb77e..e555af6 100644
--- a/public/data/thumb-dark/heatmap-bmap.webp
+++ b/public/data/thumb-dark/heatmap-bmap.webp
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-cartesian.jpg b/public/data/thumb-dark/heatmap-cartesian.jpg
deleted file mode 100644
index 93cd6da..0000000
--- a/public/data/thumb-dark/heatmap-cartesian.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-large-piecewise.jpg b/public/data/thumb-dark/heatmap-large-piecewise.jpg
deleted file mode 100644
index bb4b588..0000000
--- a/public/data/thumb-dark/heatmap-large-piecewise.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-large.jpg b/public/data/thumb-dark/heatmap-large.jpg
deleted file mode 100644
index b914f19..0000000
--- a/public/data/thumb-dark/heatmap-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/heatmap-map.jpg b/public/data/thumb-dark/heatmap-map.jpg
deleted file mode 100644
index 99d1ed8..0000000
--- a/public/data/thumb-dark/heatmap-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-aqi.jpg b/public/data/thumb-dark/line-aqi.jpg
deleted file mode 100644
index 47ede8a..0000000
--- a/public/data/thumb-dark/line-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-draggable.jpg b/public/data/thumb-dark/line-draggable.jpg
deleted file mode 100644
index ed44860..0000000
--- a/public/data/thumb-dark/line-draggable.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-easing.jpg b/public/data/thumb-dark/line-easing.jpg
deleted file mode 100644
index 6f66a33..0000000
--- a/public/data/thumb-dark/line-easing.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-function.jpg b/public/data/thumb-dark/line-function.jpg
deleted file mode 100644
index 794b1fb..0000000
--- a/public/data/thumb-dark/line-function.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-gradient.jpg b/public/data/thumb-dark/line-gradient.jpg
deleted file mode 100644
index acaa6b3..0000000
--- a/public/data/thumb-dark/line-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-graphic.jpg b/public/data/thumb-dark/line-graphic.jpg
deleted file mode 100644
index 25086a4..0000000
--- a/public/data/thumb-dark/line-graphic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-graphic.png b/public/data/thumb-dark/line-graphic.png
index 4cdc0ce..55cd785 100644
--- a/public/data/thumb-dark/line-graphic.png
+++ b/public/data/thumb-dark/line-graphic.png
Binary files differ
diff --git a/public/data/thumb-dark/line-graphic.webp b/public/data/thumb-dark/line-graphic.webp
index cacc60a..96a604b 100644
--- a/public/data/thumb-dark/line-graphic.webp
+++ b/public/data/thumb-dark/line-graphic.webp
Binary files differ
diff --git a/public/data/thumb-dark/line-in-cartesian-coordinate-system.jpg b/public/data/thumb-dark/line-in-cartesian-coordinate-system.jpg
deleted file mode 100644
index c552472..0000000
--- a/public/data/thumb-dark/line-in-cartesian-coordinate-system.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-log.jpg b/public/data/thumb-dark/line-log.jpg
deleted file mode 100644
index afc3c26..0000000
--- a/public/data/thumb-dark/line-log.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-marker.jpg b/public/data/thumb-dark/line-marker.jpg
deleted file mode 100644
index 071037b..0000000
--- a/public/data/thumb-dark/line-marker.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-markline.jpg b/public/data/thumb-dark/line-markline.jpg
deleted file mode 100644
index 5e0dbf7..0000000
--- a/public/data/thumb-dark/line-markline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-pen.jpg b/public/data/thumb-dark/line-pen.jpg
deleted file mode 100644
index 622e794..0000000
--- a/public/data/thumb-dark/line-pen.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-polar.jpg b/public/data/thumb-dark/line-polar.jpg
deleted file mode 100644
index b371516..0000000
--- a/public/data/thumb-dark/line-polar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-polar2.jpg b/public/data/thumb-dark/line-polar2.jpg
deleted file mode 100644
index 7e5ab60..0000000
--- a/public/data/thumb-dark/line-polar2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-race.png b/public/data/thumb-dark/line-race.png
new file mode 100644
index 0000000..b9c0033
--- /dev/null
+++ b/public/data/thumb-dark/line-race.png
Binary files differ
diff --git a/public/data/thumb-dark/line-race.webp b/public/data/thumb-dark/line-race.webp
new file mode 100644
index 0000000..797eacf
--- /dev/null
+++ b/public/data/thumb-dark/line-race.webp
Binary files differ
diff --git a/public/data/thumb-dark/line-sections.jpg b/public/data/thumb-dark/line-sections.jpg
deleted file mode 100644
index 4f8bd79..0000000
--- a/public/data/thumb-dark/line-sections.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-simple.jpg b/public/data/thumb-dark/line-simple.jpg
deleted file mode 100644
index bf5ad88..0000000
--- a/public/data/thumb-dark/line-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-smooth.jpg b/public/data/thumb-dark/line-smooth.jpg
deleted file mode 100644
index 4edbe8f..0000000
--- a/public/data/thumb-dark/line-smooth.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-stack.jpg b/public/data/thumb-dark/line-stack.jpg
deleted file mode 100644
index 8f0f18d..0000000
--- a/public/data/thumb-dark/line-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-step.jpg b/public/data/thumb-dark/line-step.jpg
deleted file mode 100644
index a0a82f9..0000000
--- a/public/data/thumb-dark/line-step.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-step.png b/public/data/thumb-dark/line-step.png
index 22ae298..9f11df5 100644
--- a/public/data/thumb-dark/line-step.png
+++ b/public/data/thumb-dark/line-step.png
Binary files differ
diff --git a/public/data/thumb-dark/line-step.webp b/public/data/thumb-dark/line-step.webp
index 8912d06..0bfe3ee 100644
--- a/public/data/thumb-dark/line-step.webp
+++ b/public/data/thumb-dark/line-step.webp
Binary files differ
diff --git a/public/data/thumb-dark/line-style.jpg b/public/data/thumb-dark/line-style.jpg
deleted file mode 100644
index 8b3307c..0000000
--- a/public/data/thumb-dark/line-style.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-tooltip-touch.jpg b/public/data/thumb-dark/line-tooltip-touch.jpg
deleted file mode 100644
index ca1c87a..0000000
--- a/public/data/thumb-dark/line-tooltip-touch.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-tooltip-touch.png b/public/data/thumb-dark/line-tooltip-touch.png
index 5b622ce..df6abd5 100644
--- a/public/data/thumb-dark/line-tooltip-touch.png
+++ b/public/data/thumb-dark/line-tooltip-touch.png
Binary files differ
diff --git a/public/data/thumb-dark/line-tooltip-touch.webp b/public/data/thumb-dark/line-tooltip-touch.webp
index 0306011..ee30bb5 100644
--- a/public/data/thumb-dark/line-tooltip-touch.webp
+++ b/public/data/thumb-dark/line-tooltip-touch.webp
Binary files differ
diff --git a/public/data/thumb-dark/line-y-category.jpg b/public/data/thumb-dark/line-y-category.jpg
deleted file mode 100644
index a93f55c..0000000
--- a/public/data/thumb-dark/line-y-category.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/line-y-category.png b/public/data/thumb-dark/line-y-category.png
index 87f7df9..f371d6c 100644
--- a/public/data/thumb-dark/line-y-category.png
+++ b/public/data/thumb-dark/line-y-category.png
Binary files differ
diff --git a/public/data/thumb-dark/line-y-category.webp b/public/data/thumb-dark/line-y-category.webp
index 8ce5a37..f87c63c 100644
--- a/public/data/thumb-dark/line-y-category.webp
+++ b/public/data/thumb-dark/line-y-category.webp
Binary files differ
diff --git a/public/data/thumb-dark/lines-airline.jpg b/public/data/thumb-dark/lines-airline.jpg
deleted file mode 100644
index 27cf99c..0000000
--- a/public/data/thumb-dark/lines-airline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/lines-bmap-bus.jpg b/public/data/thumb-dark/lines-bmap-bus.jpg
deleted file mode 100644
index 60eca0f..0000000
--- a/public/data/thumb-dark/lines-bmap-bus.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/lines-bmap-effect.jpg b/public/data/thumb-dark/lines-bmap-effect.jpg
deleted file mode 100644
index f247c77..0000000
--- a/public/data/thumb-dark/lines-bmap-effect.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/lines-bmap-effect.png b/public/data/thumb-dark/lines-bmap-effect.png
index 7ad6922..5cf7835 100644
--- a/public/data/thumb-dark/lines-bmap-effect.png
+++ b/public/data/thumb-dark/lines-bmap-effect.png
Binary files differ
diff --git a/public/data/thumb-dark/lines-bmap-effect.webp b/public/data/thumb-dark/lines-bmap-effect.webp
index 8696693..9cf077b 100644
--- a/public/data/thumb-dark/lines-bmap-effect.webp
+++ b/public/data/thumb-dark/lines-bmap-effect.webp
Binary files differ
diff --git a/public/data/thumb-dark/lines-bmap.jpg b/public/data/thumb-dark/lines-bmap.jpg
deleted file mode 100644
index bcadd6c..0000000
--- a/public/data/thumb-dark/lines-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/lines-ny.jpg b/public/data/thumb-dark/lines-ny.jpg
deleted file mode 100644
index c8d7a02..0000000
--- a/public/data/thumb-dark/lines-ny.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/lines-ny.png b/public/data/thumb-dark/lines-ny.png
index c2dc8f5..a8ac450 100644
--- a/public/data/thumb-dark/lines-ny.png
+++ b/public/data/thumb-dark/lines-ny.png
Binary files differ
diff --git a/public/data/thumb-dark/lines-ny.webp b/public/data/thumb-dark/lines-ny.webp
index d11bccc..eea4ff0 100644
--- a/public/data/thumb-dark/lines-ny.webp
+++ b/public/data/thumb-dark/lines-ny.webp
Binary files differ
diff --git a/public/data/thumb-dark/map-HK.jpg b/public/data/thumb-dark/map-HK.jpg
deleted file mode 100644
index 66ed961..0000000
--- a/public/data/thumb-dark/map-HK.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-bin.jpg b/public/data/thumb-dark/map-bin.jpg
deleted file mode 100644
index 1863104..0000000
--- a/public/data/thumb-dark/map-bin.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-china-dataRange.jpg b/public/data/thumb-dark/map-china-dataRange.jpg
deleted file mode 100644
index ace34ce..0000000
--- a/public/data/thumb-dark/map-china-dataRange.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-china.jpg b/public/data/thumb-dark/map-china.jpg
deleted file mode 100644
index d5266eb..0000000
--- a/public/data/thumb-dark/map-china.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-labels.jpg b/public/data/thumb-dark/map-labels.jpg
deleted file mode 100644
index fd9b30d..0000000
--- a/public/data/thumb-dark/map-labels.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-locate.jpg b/public/data/thumb-dark/map-locate.jpg
deleted file mode 100644
index 9ce2fd8..0000000
--- a/public/data/thumb-dark/map-locate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-parallel-prices.jpg b/public/data/thumb-dark/map-parallel-prices.jpg
deleted file mode 100644
index f100015..0000000
--- a/public/data/thumb-dark/map-parallel-prices.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-polygon.jpg b/public/data/thumb-dark/map-polygon.jpg
deleted file mode 100644
index e884168..0000000
--- a/public/data/thumb-dark/map-polygon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-polygon.png b/public/data/thumb-dark/map-polygon.png
index 765c557..34dbb38 100644
--- a/public/data/thumb-dark/map-polygon.png
+++ b/public/data/thumb-dark/map-polygon.png
Binary files differ
diff --git a/public/data/thumb-dark/map-polygon.webp b/public/data/thumb-dark/map-polygon.webp
index bd8a58e..03b76d9 100644
--- a/public/data/thumb-dark/map-polygon.webp
+++ b/public/data/thumb-dark/map-polygon.webp
Binary files differ
diff --git a/public/data/thumb-dark/map-province.jpg b/public/data/thumb-dark/map-province.jpg
deleted file mode 100644
index d40a0c8..0000000
--- a/public/data/thumb-dark/map-province.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-usa.jpg b/public/data/thumb-dark/map-usa.jpg
deleted file mode 100644
index cfc3dd7..0000000
--- a/public/data/thumb-dark/map-usa.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-world-dataRange.jpg b/public/data/thumb-dark/map-world-dataRange.jpg
deleted file mode 100644
index 9bf3b6a..0000000
--- a/public/data/thumb-dark/map-world-dataRange.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/map-world.jpg b/public/data/thumb-dark/map-world.jpg
deleted file mode 100644
index 5dacd45..0000000
--- a/public/data/thumb-dark/map-world.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/mix-line-bar.jpg b/public/data/thumb-dark/mix-line-bar.jpg
deleted file mode 100644
index cbb73ac..0000000
--- a/public/data/thumb-dark/mix-line-bar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/mix-timeline-finance.jpg b/public/data/thumb-dark/mix-timeline-finance.jpg
deleted file mode 100644
index 4800605..0000000
--- a/public/data/thumb-dark/mix-timeline-finance.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/mix-timeline-finance.png b/public/data/thumb-dark/mix-timeline-finance.png
index d6eca30..c0770a8 100644
--- a/public/data/thumb-dark/mix-timeline-finance.png
+++ b/public/data/thumb-dark/mix-timeline-finance.png
Binary files differ
diff --git a/public/data/thumb-dark/mix-timeline-finance.webp b/public/data/thumb-dark/mix-timeline-finance.webp
index 53e4a17..87a2d9a 100644
--- a/public/data/thumb-dark/mix-timeline-finance.webp
+++ b/public/data/thumb-dark/mix-timeline-finance.webp
Binary files differ
diff --git a/public/data/thumb-dark/mix-zoom-on-value.jpg b/public/data/thumb-dark/mix-zoom-on-value.jpg
deleted file mode 100644
index d6f29d5..0000000
--- a/public/data/thumb-dark/mix-zoom-on-value.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/multiple-x-axis.jpg b/public/data/thumb-dark/multiple-x-axis.jpg
deleted file mode 100644
index b85567e..0000000
--- a/public/data/thumb-dark/multiple-x-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/multiple-y-axis.jpg b/public/data/thumb-dark/multiple-y-axis.jpg
deleted file mode 100644
index 8a55900..0000000
--- a/public/data/thumb-dark/multiple-y-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/parallel-aqi.jpg b/public/data/thumb-dark/parallel-aqi.jpg
deleted file mode 100644
index 5215c9a..0000000
--- a/public/data/thumb-dark/parallel-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/parallel-nutrients.jpg b/public/data/thumb-dark/parallel-nutrients.jpg
deleted file mode 100644
index 336728c..0000000
--- a/public/data/thumb-dark/parallel-nutrients.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/parallel-simple.jpg b/public/data/thumb-dark/parallel-simple.jpg
deleted file mode 100644
index 52b5c23..0000000
--- a/public/data/thumb-dark/parallel-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-body-fill.jpg b/public/data/thumb-dark/pictorialBar-body-fill.jpg
deleted file mode 100644
index 1bb4b0a..0000000
--- a/public/data/thumb-dark/pictorialBar-body-fill.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-dotted.jpg b/public/data/thumb-dark/pictorialBar-dotted.jpg
deleted file mode 100644
index 0477bbf..0000000
--- a/public/data/thumb-dark/pictorialBar-dotted.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-dotted.png b/public/data/thumb-dark/pictorialBar-dotted.png
index 1908046..882dfce 100644
--- a/public/data/thumb-dark/pictorialBar-dotted.png
+++ b/public/data/thumb-dark/pictorialBar-dotted.png
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-dotted.webp b/public/data/thumb-dark/pictorialBar-dotted.webp
index 346c204..2046cf1 100644
--- a/public/data/thumb-dark/pictorialBar-dotted.webp
+++ b/public/data/thumb-dark/pictorialBar-dotted.webp
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-forest.jpg b/public/data/thumb-dark/pictorialBar-forest.jpg
deleted file mode 100644
index 4a1da73..0000000
--- a/public/data/thumb-dark/pictorialBar-forest.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-hill.jpg b/public/data/thumb-dark/pictorialBar-hill.jpg
deleted file mode 100644
index 87b697d..0000000
--- a/public/data/thumb-dark/pictorialBar-hill.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-hill.png b/public/data/thumb-dark/pictorialBar-hill.png
index 4c99c19..0e03f51 100644
--- a/public/data/thumb-dark/pictorialBar-hill.png
+++ b/public/data/thumb-dark/pictorialBar-hill.png
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-hill.webp b/public/data/thumb-dark/pictorialBar-hill.webp
index 7e49edc..c20fe13 100644
--- a/public/data/thumb-dark/pictorialBar-hill.webp
+++ b/public/data/thumb-dark/pictorialBar-hill.webp
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-spirit.jpg b/public/data/thumb-dark/pictorialBar-spirit.jpg
deleted file mode 100644
index f1b67b0..0000000
--- a/public/data/thumb-dark/pictorialBar-spirit.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-vehicle.jpg b/public/data/thumb-dark/pictorialBar-vehicle.jpg
deleted file mode 100644
index 6de6177..0000000
--- a/public/data/thumb-dark/pictorialBar-vehicle.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pictorialBar-velocity.jpg b/public/data/thumb-dark/pictorialBar-velocity.jpg
deleted file mode 100644
index dc0f724..0000000
--- a/public/data/thumb-dark/pictorialBar-velocity.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-alignTo.jpg b/public/data/thumb-dark/pie-alignTo.jpg
deleted file mode 100644
index e6685e8..0000000
--- a/public/data/thumb-dark/pie-alignTo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-custom.jpg b/public/data/thumb-dark/pie-custom.jpg
deleted file mode 100644
index f55d2d0..0000000
--- a/public/data/thumb-dark/pie-custom.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-custom.png b/public/data/thumb-dark/pie-custom.png
index 05a9b96..b53443c 100644
--- a/public/data/thumb-dark/pie-custom.png
+++ b/public/data/thumb-dark/pie-custom.png
Binary files differ
diff --git a/public/data/thumb-dark/pie-custom.webp b/public/data/thumb-dark/pie-custom.webp
index 34a6aad..4b772b9 100644
--- a/public/data/thumb-dark/pie-custom.webp
+++ b/public/data/thumb-dark/pie-custom.webp
Binary files differ
diff --git a/public/data/thumb-dark/pie-doughnut.jpg b/public/data/thumb-dark/pie-doughnut.jpg
deleted file mode 100644
index f686bd8..0000000
--- a/public/data/thumb-dark/pie-doughnut.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-legend.jpg b/public/data/thumb-dark/pie-legend.jpg
deleted file mode 100644
index bd5a51a..0000000
--- a/public/data/thumb-dark/pie-legend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-nest.jpg b/public/data/thumb-dark/pie-nest.jpg
deleted file mode 100644
index bca7724..0000000
--- a/public/data/thumb-dark/pie-nest.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-pattern.jpg b/public/data/thumb-dark/pie-pattern.jpg
deleted file mode 100644
index 29f3ef9..0000000
--- a/public/data/thumb-dark/pie-pattern.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-rich-text.jpg b/public/data/thumb-dark/pie-rich-text.jpg
deleted file mode 100644
index 2e82201..0000000
--- a/public/data/thumb-dark/pie-rich-text.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-roseType.jpg b/public/data/thumb-dark/pie-roseType.jpg
deleted file mode 100644
index 52f3b0a..0000000
--- a/public/data/thumb-dark/pie-roseType.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/pie-simple.jpg b/public/data/thumb-dark/pie-simple.jpg
deleted file mode 100644
index 8247699..0000000
--- a/public/data/thumb-dark/pie-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/polar-roundCap.jpg b/public/data/thumb-dark/polar-roundCap.jpg
deleted file mode 100644
index b975483..0000000
--- a/public/data/thumb-dark/polar-roundCap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/radar-aqi.jpg b/public/data/thumb-dark/radar-aqi.jpg
deleted file mode 100644
index 8244fd7..0000000
--- a/public/data/thumb-dark/radar-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/radar-custom.jpg b/public/data/thumb-dark/radar-custom.jpg
deleted file mode 100644
index b7b74b5..0000000
--- a/public/data/thumb-dark/radar-custom.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/radar-custom.png b/public/data/thumb-dark/radar-custom.png
index 1e8fe6c..e501aa5 100644
--- a/public/data/thumb-dark/radar-custom.png
+++ b/public/data/thumb-dark/radar-custom.png
Binary files differ
diff --git a/public/data/thumb-dark/radar-custom.webp b/public/data/thumb-dark/radar-custom.webp
index 867692a..b0d4235 100644
--- a/public/data/thumb-dark/radar-custom.webp
+++ b/public/data/thumb-dark/radar-custom.webp
Binary files differ
diff --git a/public/data/thumb-dark/radar-multiple.jpg b/public/data/thumb-dark/radar-multiple.jpg
deleted file mode 100644
index f89ec25..0000000
--- a/public/data/thumb-dark/radar-multiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/radar.jpg b/public/data/thumb-dark/radar.jpg
deleted file mode 100644
index 4df2aee..0000000
--- a/public/data/thumb-dark/radar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/radar2.jpg b/public/data/thumb-dark/radar2.jpg
deleted file mode 100644
index 068ebd6..0000000
--- a/public/data/thumb-dark/radar2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-energy.jpg b/public/data/thumb-dark/sankey-energy.jpg
deleted file mode 100644
index 6965def..0000000
--- a/public/data/thumb-dark/sankey-energy.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-itemstyle.jpg b/public/data/thumb-dark/sankey-itemstyle.jpg
deleted file mode 100644
index 63ddac8..0000000
--- a/public/data/thumb-dark/sankey-itemstyle.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-levels.jpg b/public/data/thumb-dark/sankey-levels.jpg
deleted file mode 100644
index 2ee0d3f..0000000
--- a/public/data/thumb-dark/sankey-levels.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-nodeAlign-left.jpg b/public/data/thumb-dark/sankey-nodeAlign-left.jpg
deleted file mode 100644
index 1aa5da9..0000000
--- a/public/data/thumb-dark/sankey-nodeAlign-left.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-nodeAlign-right.jpg b/public/data/thumb-dark/sankey-nodeAlign-right.jpg
deleted file mode 100644
index f2e446a..0000000
--- a/public/data/thumb-dark/sankey-nodeAlign-right.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-simple.jpg b/public/data/thumb-dark/sankey-simple.jpg
deleted file mode 100644
index 94b3f7b..0000000
--- a/public/data/thumb-dark/sankey-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sankey-vertical.jpg b/public/data/thumb-dark/sankey-vertical.jpg
deleted file mode 100644
index f72fb50..0000000
--- a/public/data/thumb-dark/sankey-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-anscombe-quartet.jpg b/public/data/thumb-dark/scatter-anscombe-quartet.jpg
deleted file mode 100644
index 7831a7e..0000000
--- a/public/data/thumb-dark/scatter-anscombe-quartet.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-aqi-color.jpg b/public/data/thumb-dark/scatter-aqi-color.jpg
deleted file mode 100644
index 4200e2f..0000000
--- a/public/data/thumb-dark/scatter-aqi-color.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-aqi-color.png b/public/data/thumb-dark/scatter-aqi-color.png
index 6d52c3b..7a121bc 100644
--- a/public/data/thumb-dark/scatter-aqi-color.png
+++ b/public/data/thumb-dark/scatter-aqi-color.png
Binary files differ
diff --git a/public/data/thumb-dark/scatter-aqi-color.webp b/public/data/thumb-dark/scatter-aqi-color.webp
index bdd11f0..c4d8852 100644
--- a/public/data/thumb-dark/scatter-aqi-color.webp
+++ b/public/data/thumb-dark/scatter-aqi-color.webp
Binary files differ
diff --git a/public/data/thumb-dark/scatter-clustering-process.jpg b/public/data/thumb-dark/scatter-clustering-process.jpg
deleted file mode 100644
index 1b0202f..0000000
--- a/public/data/thumb-dark/scatter-clustering-process.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-clustering-process.png b/public/data/thumb-dark/scatter-clustering-process.png
index ef5e4d2..c630f41 100644
--- a/public/data/thumb-dark/scatter-clustering-process.png
+++ b/public/data/thumb-dark/scatter-clustering-process.png
Binary files differ
diff --git a/public/data/thumb-dark/scatter-clustering-process.webp b/public/data/thumb-dark/scatter-clustering-process.webp
index 570d013..f72cb5f 100644
--- a/public/data/thumb-dark/scatter-clustering-process.webp
+++ b/public/data/thumb-dark/scatter-clustering-process.webp
Binary files differ
diff --git a/public/data/thumb-dark/scatter-effect.jpg b/public/data/thumb-dark/scatter-effect.jpg
deleted file mode 100644
index 9a26876..0000000
--- a/public/data/thumb-dark/scatter-effect.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-effect.png b/public/data/thumb-dark/scatter-effect.png
index 1c35e30..d296d77 100644
--- a/public/data/thumb-dark/scatter-effect.png
+++ b/public/data/thumb-dark/scatter-effect.png
Binary files differ
diff --git a/public/data/thumb-dark/scatter-effect.webp b/public/data/thumb-dark/scatter-effect.webp
index edb9712..360e196 100644
--- a/public/data/thumb-dark/scatter-effect.webp
+++ b/public/data/thumb-dark/scatter-effect.webp
Binary files differ
diff --git a/public/data/thumb-dark/scatter-exponential-regression.jpg b/public/data/thumb-dark/scatter-exponential-regression.jpg
deleted file mode 100644
index d99380f..0000000
--- a/public/data/thumb-dark/scatter-exponential-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-large.jpg b/public/data/thumb-dark/scatter-large.jpg
deleted file mode 100644
index 776a246..0000000
--- a/public/data/thumb-dark/scatter-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-life-expectancy-timeline.jpg b/public/data/thumb-dark/scatter-life-expectancy-timeline.jpg
deleted file mode 100644
index 846906e..0000000
--- a/public/data/thumb-dark/scatter-life-expectancy-timeline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-life-expectancy-timeline.png b/public/data/thumb-dark/scatter-life-expectancy-timeline.png
index 46f657e..847632c 100644
--- a/public/data/thumb-dark/scatter-life-expectancy-timeline.png
+++ b/public/data/thumb-dark/scatter-life-expectancy-timeline.png
Binary files differ
diff --git a/public/data/thumb-dark/scatter-life-expectancy-timeline.webp b/public/data/thumb-dark/scatter-life-expectancy-timeline.webp
index 362700b..0dce31c 100644
--- a/public/data/thumb-dark/scatter-life-expectancy-timeline.webp
+++ b/public/data/thumb-dark/scatter-life-expectancy-timeline.webp
Binary files differ
diff --git a/public/data/thumb-dark/scatter-linear-regression.jpg b/public/data/thumb-dark/scatter-linear-regression.jpg
deleted file mode 100644
index 5454297..0000000
--- a/public/data/thumb-dark/scatter-linear-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-logarithmic-regression.jpg b/public/data/thumb-dark/scatter-logarithmic-regression.jpg
deleted file mode 100644
index 28bd663..0000000
--- a/public/data/thumb-dark/scatter-logarithmic-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-map-brush.jpg b/public/data/thumb-dark/scatter-map-brush.jpg
deleted file mode 100644
index ebb94af..0000000
--- a/public/data/thumb-dark/scatter-map-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-map-brush.png b/public/data/thumb-dark/scatter-map-brush.png
index 6e53a7d..26e41d2 100644
--- a/public/data/thumb-dark/scatter-map-brush.png
+++ b/public/data/thumb-dark/scatter-map-brush.png
Binary files differ
diff --git a/public/data/thumb-dark/scatter-map-brush.webp b/public/data/thumb-dark/scatter-map-brush.webp
index 3174673..0ad036a 100644
--- a/public/data/thumb-dark/scatter-map-brush.webp
+++ b/public/data/thumb-dark/scatter-map-brush.webp
Binary files differ
diff --git a/public/data/thumb-dark/scatter-map.jpg b/public/data/thumb-dark/scatter-map.jpg
deleted file mode 100644
index 7572c29..0000000
--- a/public/data/thumb-dark/scatter-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-matrix.jpg b/public/data/thumb-dark/scatter-matrix.jpg
deleted file mode 100644
index 89ce42c..0000000
--- a/public/data/thumb-dark/scatter-matrix.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-nebula.jpg b/public/data/thumb-dark/scatter-nebula.jpg
deleted file mode 100644
index dbe01ef..0000000
--- a/public/data/thumb-dark/scatter-nebula.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-nutrients-matrix.jpg b/public/data/thumb-dark/scatter-nutrients-matrix.jpg
deleted file mode 100644
index de90af0..0000000
--- a/public/data/thumb-dark/scatter-nutrients-matrix.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-nutrients.jpg b/public/data/thumb-dark/scatter-nutrients.jpg
deleted file mode 100644
index 0495f7c..0000000
--- a/public/data/thumb-dark/scatter-nutrients.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-painter-choice.jpg b/public/data/thumb-dark/scatter-painter-choice.jpg
deleted file mode 100644
index 080a9da..0000000
--- a/public/data/thumb-dark/scatter-painter-choice.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-polar-punchCard.jpg b/public/data/thumb-dark/scatter-polar-punchCard.jpg
deleted file mode 100644
index 2957408..0000000
--- a/public/data/thumb-dark/scatter-polar-punchCard.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-polynomial-regression.jpg b/public/data/thumb-dark/scatter-polynomial-regression.jpg
deleted file mode 100644
index 7984d46..0000000
--- a/public/data/thumb-dark/scatter-polynomial-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-punchCard.jpg b/public/data/thumb-dark/scatter-punchCard.jpg
deleted file mode 100644
index fd77f30..0000000
--- a/public/data/thumb-dark/scatter-punchCard.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-simple.jpg b/public/data/thumb-dark/scatter-simple.jpg
deleted file mode 100644
index 9b4ace5..0000000
--- a/public/data/thumb-dark/scatter-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-single-axis.jpg b/public/data/thumb-dark/scatter-single-axis.jpg
deleted file mode 100644
index 4fcce41..0000000
--- a/public/data/thumb-dark/scatter-single-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-stream-visual.jpg b/public/data/thumb-dark/scatter-stream-visual.jpg
deleted file mode 100644
index f97363c..0000000
--- a/public/data/thumb-dark/scatter-stream-visual.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-weibo.jpg b/public/data/thumb-dark/scatter-weibo.jpg
deleted file mode 100644
index 144403d..0000000
--- a/public/data/thumb-dark/scatter-weibo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-weight.jpg b/public/data/thumb-dark/scatter-weight.jpg
deleted file mode 100644
index a5b8519..0000000
--- a/public/data/thumb-dark/scatter-weight.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/scatter-world-population.jpg b/public/data/thumb-dark/scatter-world-population.jpg
deleted file mode 100644
index cfc9a00..0000000
--- a/public/data/thumb-dark/scatter-world-population.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-book.jpg b/public/data/thumb-dark/sunburst-book.jpg
deleted file mode 100644
index 87c32bf..0000000
--- a/public/data/thumb-dark/sunburst-book.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-book.png b/public/data/thumb-dark/sunburst-book.png
index 3e3a350..4f189e2 100644
--- a/public/data/thumb-dark/sunburst-book.png
+++ b/public/data/thumb-dark/sunburst-book.png
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-book.webp b/public/data/thumb-dark/sunburst-book.webp
index da5d9f5..cf24e5f 100644
--- a/public/data/thumb-dark/sunburst-book.webp
+++ b/public/data/thumb-dark/sunburst-book.webp
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-drink.jpg b/public/data/thumb-dark/sunburst-drink.jpg
deleted file mode 100644
index e30a886..0000000
--- a/public/data/thumb-dark/sunburst-drink.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-label-rotate.jpg b/public/data/thumb-dark/sunburst-label-rotate.jpg
deleted file mode 100644
index a57218d..0000000
--- a/public/data/thumb-dark/sunburst-label-rotate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-monochrome.jpg b/public/data/thumb-dark/sunburst-monochrome.jpg
deleted file mode 100644
index e72104a..0000000
--- a/public/data/thumb-dark/sunburst-monochrome.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-simple.jpg b/public/data/thumb-dark/sunburst-simple.jpg
deleted file mode 100644
index 73a986e..0000000
--- a/public/data/thumb-dark/sunburst-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/sunburst-visualMap.jpg b/public/data/thumb-dark/sunburst-visualMap.jpg
deleted file mode 100644
index cfae33b..0000000
--- a/public/data/thumb-dark/sunburst-visualMap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/themeRiver-basic.jpg b/public/data/thumb-dark/themeRiver-basic.jpg
deleted file mode 100644
index 48521da..0000000
--- a/public/data/thumb-dark/themeRiver-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/themeRiver-lastfm.jpg b/public/data/thumb-dark/themeRiver-lastfm.jpg
deleted file mode 100644
index 884396c..0000000
--- a/public/data/thumb-dark/themeRiver-lastfm.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-basic.jpg b/public/data/thumb-dark/tree-basic.jpg
deleted file mode 100644
index 6b5def0..0000000
--- a/public/data/thumb-dark/tree-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-legend.jpg b/public/data/thumb-dark/tree-legend.jpg
deleted file mode 100644
index c1270c7..0000000
--- a/public/data/thumb-dark/tree-legend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-orient-bottom-top.jpg b/public/data/thumb-dark/tree-orient-bottom-top.jpg
deleted file mode 100644
index 65c484e..0000000
--- a/public/data/thumb-dark/tree-orient-bottom-top.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-orient-right-left.jpg b/public/data/thumb-dark/tree-orient-right-left.jpg
deleted file mode 100644
index 291ff67..0000000
--- a/public/data/thumb-dark/tree-orient-right-left.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-polyline.jpg b/public/data/thumb-dark/tree-polyline.jpg
deleted file mode 100644
index f02f6d7..0000000
--- a/public/data/thumb-dark/tree-polyline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-radial.jpg b/public/data/thumb-dark/tree-radial.jpg
deleted file mode 100644
index 816e72a..0000000
--- a/public/data/thumb-dark/tree-radial.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/tree-vertical.jpg b/public/data/thumb-dark/tree-vertical.jpg
deleted file mode 100644
index f225083..0000000
--- a/public/data/thumb-dark/tree-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-disk.jpg b/public/data/thumb-dark/treemap-disk.jpg
deleted file mode 100644
index 6938270..0000000
--- a/public/data/thumb-dark/treemap-disk.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-drill-down.jpg b/public/data/thumb-dark/treemap-drill-down.jpg
deleted file mode 100644
index 79c8bd6..0000000
--- a/public/data/thumb-dark/treemap-drill-down.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-obama.jpg b/public/data/thumb-dark/treemap-obama.jpg
deleted file mode 100644
index bc5c85b..0000000
--- a/public/data/thumb-dark/treemap-obama.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-show-parent.jpg b/public/data/thumb-dark/treemap-show-parent.jpg
deleted file mode 100644
index cc6e272..0000000
--- a/public/data/thumb-dark/treemap-show-parent.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-simple.jpg b/public/data/thumb-dark/treemap-simple.jpg
deleted file mode 100644
index a4ae279..0000000
--- a/public/data/thumb-dark/treemap-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/treemap-visual.jpg b/public/data/thumb-dark/treemap-visual.jpg
deleted file mode 100644
index 04c9243..0000000
--- a/public/data/thumb-dark/treemap-visual.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/watermark.jpg b/public/data/thumb-dark/watermark.jpg
deleted file mode 100644
index a69fe08..0000000
--- a/public/data/thumb-dark/watermark.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb-dark/wind-barb.jpg b/public/data/thumb-dark/wind-barb.jpg
deleted file mode 100644
index 3197ebf..0000000
--- a/public/data/thumb-dark/wind-barb.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/area-basic.jpg b/public/data/thumb/area-basic.jpg
deleted file mode 100644
index 458d8e7..0000000
--- a/public/data/thumb/area-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/area-basic.png b/public/data/thumb/area-basic.png
index 3173973..a4b7500 100644
--- a/public/data/thumb/area-basic.png
+++ b/public/data/thumb/area-basic.png
Binary files differ
diff --git a/public/data/thumb/area-basic.webp b/public/data/thumb/area-basic.webp
index e54f6fe..7bbfc84 100644
--- a/public/data/thumb/area-basic.webp
+++ b/public/data/thumb/area-basic.webp
Binary files differ
diff --git a/public/data/thumb/area-pieces.jpg b/public/data/thumb/area-pieces.jpg
deleted file mode 100644
index 0e19c6a..0000000
--- a/public/data/thumb/area-pieces.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/area-rainfall.jpg b/public/data/thumb/area-rainfall.jpg
deleted file mode 100644
index 6dd6aed..0000000
--- a/public/data/thumb/area-rainfall.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/area-simple.jpg b/public/data/thumb/area-simple.jpg
deleted file mode 100644
index b945e3a..0000000
--- a/public/data/thumb/area-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/area-stack.jpg b/public/data/thumb/area-stack.jpg
deleted file mode 100644
index 1d29cac..0000000
--- a/public/data/thumb/area-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-animation-delay.jpg b/public/data/thumb/bar-animation-delay.jpg
deleted file mode 100644
index e5de2a7..0000000
--- a/public/data/thumb/bar-animation-delay.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-background.jpg b/public/data/thumb/bar-background.jpg
deleted file mode 100644
index 4bfade8..0000000
--- a/public/data/thumb/bar-background.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-brush.jpg b/public/data/thumb/bar-brush.jpg
deleted file mode 100644
index 1680e6e..0000000
--- a/public/data/thumb/bar-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-gradient.jpg b/public/data/thumb/bar-gradient.jpg
deleted file mode 100644
index 8d754a5..0000000
--- a/public/data/thumb/bar-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-histogram.jpg b/public/data/thumb/bar-histogram.jpg
deleted file mode 100644
index 18b1090..0000000
--- a/public/data/thumb/bar-histogram.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-label-rotation.jpg b/public/data/thumb/bar-label-rotation.jpg
deleted file mode 100644
index f58e15f..0000000
--- a/public/data/thumb/bar-label-rotation.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-large.jpg b/public/data/thumb/bar-large.jpg
deleted file mode 100644
index a84a06d..0000000
--- a/public/data/thumb/bar-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-negative.jpg b/public/data/thumb/bar-negative.jpg
deleted file mode 100644
index 9ff1cea..0000000
--- a/public/data/thumb/bar-negative.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-negative2.jpg b/public/data/thumb/bar-negative2.jpg
deleted file mode 100644
index 576747f..0000000
--- a/public/data/thumb/bar-negative2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-polar-real-estate.jpg b/public/data/thumb/bar-polar-real-estate.jpg
deleted file mode 100644
index 94e1baf..0000000
--- a/public/data/thumb/bar-polar-real-estate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-polar-stack-radial.jpg b/public/data/thumb/bar-polar-stack-radial.jpg
deleted file mode 100644
index aeb3645..0000000
--- a/public/data/thumb/bar-polar-stack-radial.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-polar-stack.jpg b/public/data/thumb/bar-polar-stack.jpg
deleted file mode 100644
index d31ea2e..0000000
--- a/public/data/thumb/bar-polar-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-race-country.png b/public/data/thumb/bar-race-country.png
new file mode 100644
index 0000000..2dfd629
--- /dev/null
+++ b/public/data/thumb/bar-race-country.png
Binary files differ
diff --git a/public/data/thumb/bar-race-country.webp b/public/data/thumb/bar-race-country.webp
new file mode 100644
index 0000000..ff54d06
--- /dev/null
+++ b/public/data/thumb/bar-race-country.webp
Binary files differ
diff --git a/public/data/thumb/bar-race.png b/public/data/thumb/bar-race.png
index 9c4e13e..b5ac8c8 100644
--- a/public/data/thumb/bar-race.png
+++ b/public/data/thumb/bar-race.png
Binary files differ
diff --git a/public/data/thumb/bar-race.webp b/public/data/thumb/bar-race.webp
index 4cbf4e8..b501392 100644
--- a/public/data/thumb/bar-race.webp
+++ b/public/data/thumb/bar-race.webp
Binary files differ
diff --git a/public/data/thumb/bar-rich-text.jpg b/public/data/thumb/bar-rich-text.jpg
deleted file mode 100644
index f87f431..0000000
--- a/public/data/thumb/bar-rich-text.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-rich-text.png b/public/data/thumb/bar-rich-text.png
index c274fdf..2f47f20 100644
--- a/public/data/thumb/bar-rich-text.png
+++ b/public/data/thumb/bar-rich-text.png
Binary files differ
diff --git a/public/data/thumb/bar-rich-text.webp b/public/data/thumb/bar-rich-text.webp
index 09d2701..6523f75 100644
--- a/public/data/thumb/bar-rich-text.webp
+++ b/public/data/thumb/bar-rich-text.webp
Binary files differ
diff --git a/public/data/thumb/bar-simple.jpg b/public/data/thumb/bar-simple.jpg
deleted file mode 100644
index 17054c1..0000000
--- a/public/data/thumb/bar-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-stack.jpg b/public/data/thumb/bar-stack.jpg
deleted file mode 100644
index abc467b..0000000
--- a/public/data/thumb/bar-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-tick-align.jpg b/public/data/thumb/bar-tick-align.jpg
deleted file mode 100644
index 847d366..0000000
--- a/public/data/thumb/bar-tick-align.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-waterfall.jpg b/public/data/thumb/bar-waterfall.jpg
deleted file mode 100644
index cc871a3..0000000
--- a/public/data/thumb/bar-waterfall.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-waterfall2.jpg b/public/data/thumb/bar-waterfall2.jpg
deleted file mode 100644
index b9ab3fc..0000000
--- a/public/data/thumb/bar-waterfall2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-y-category-stack.jpg b/public/data/thumb/bar-y-category-stack.jpg
deleted file mode 100644
index 08f8cf9..0000000
--- a/public/data/thumb/bar-y-category-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar-y-category.jpg b/public/data/thumb/bar-y-category.jpg
deleted file mode 100644
index cb2bf09..0000000
--- a/public/data/thumb/bar-y-category.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bar1.jpg b/public/data/thumb/bar1.jpg
deleted file mode 100644
index ef95d51..0000000
--- a/public/data/thumb/bar1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/boxplot-light-velocity.jpg b/public/data/thumb/boxplot-light-velocity.jpg
deleted file mode 100644
index 5a54992..0000000
--- a/public/data/thumb/boxplot-light-velocity.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/boxplot-light-velocity2.jpg b/public/data/thumb/boxplot-light-velocity2.jpg
deleted file mode 100644
index b1ca86a..0000000
--- a/public/data/thumb/boxplot-light-velocity2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/boxplot-multi.jpg b/public/data/thumb/boxplot-multi.jpg
deleted file mode 100644
index 58286ab..0000000
--- a/public/data/thumb/boxplot-multi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bubble-gradient.jpg b/public/data/thumb/bubble-gradient.jpg
deleted file mode 100644
index 1580883..0000000
--- a/public/data/thumb/bubble-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/bubble-gradient.png b/public/data/thumb/bubble-gradient.png
index 94905d1..f691f18 100644
--- a/public/data/thumb/bubble-gradient.png
+++ b/public/data/thumb/bubble-gradient.png
Binary files differ
diff --git a/public/data/thumb/bubble-gradient.webp b/public/data/thumb/bubble-gradient.webp
index 77f21dc..8ca1645 100644
--- a/public/data/thumb/bubble-gradient.webp
+++ b/public/data/thumb/bubble-gradient.webp
Binary files differ
diff --git a/public/data/thumb/calendar-charts.jpg b/public/data/thumb/calendar-charts.jpg
deleted file mode 100644
index a415392..0000000
--- a/public/data/thumb/calendar-charts.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-charts.png b/public/data/thumb/calendar-charts.png
index 5c5c185..e7baf74 100644
--- a/public/data/thumb/calendar-charts.png
+++ b/public/data/thumb/calendar-charts.png
Binary files differ
diff --git a/public/data/thumb/calendar-charts.webp b/public/data/thumb/calendar-charts.webp
index 0f52ba2..072b922 100644
--- a/public/data/thumb/calendar-charts.webp
+++ b/public/data/thumb/calendar-charts.webp
Binary files differ
diff --git a/public/data/thumb/calendar-effectscatter.jpg b/public/data/thumb/calendar-effectscatter.jpg
deleted file mode 100644
index 956ad2b..0000000
--- a/public/data/thumb/calendar-effectscatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-effectscatter.png b/public/data/thumb/calendar-effectscatter.png
index ea47c68..1525f06 100644
--- a/public/data/thumb/calendar-effectscatter.png
+++ b/public/data/thumb/calendar-effectscatter.png
Binary files differ
diff --git a/public/data/thumb/calendar-effectscatter.webp b/public/data/thumb/calendar-effectscatter.webp
index 5fef281..534a877 100644
--- a/public/data/thumb/calendar-effectscatter.webp
+++ b/public/data/thumb/calendar-effectscatter.webp
Binary files differ
diff --git a/public/data/thumb/calendar-graph.jpg b/public/data/thumb/calendar-graph.jpg
deleted file mode 100644
index 1c02394..0000000
--- a/public/data/thumb/calendar-graph.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-graph.png b/public/data/thumb/calendar-graph.png
index 93db3ba..f8a1840 100644
--- a/public/data/thumb/calendar-graph.png
+++ b/public/data/thumb/calendar-graph.png
Binary files differ
diff --git a/public/data/thumb/calendar-graph.webp b/public/data/thumb/calendar-graph.webp
index f2cdc16..6c73d1f 100644
--- a/public/data/thumb/calendar-graph.webp
+++ b/public/data/thumb/calendar-graph.webp
Binary files differ
diff --git a/public/data/thumb/calendar-heatmap.jpg b/public/data/thumb/calendar-heatmap.jpg
deleted file mode 100644
index 979e666..0000000
--- a/public/data/thumb/calendar-heatmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-horizontal.jpg b/public/data/thumb/calendar-horizontal.jpg
deleted file mode 100644
index 5ec1d3b..0000000
--- a/public/data/thumb/calendar-horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-lunar.jpg b/public/data/thumb/calendar-lunar.jpg
deleted file mode 100644
index e5b7cd3..0000000
--- a/public/data/thumb/calendar-lunar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-pie.jpg b/public/data/thumb/calendar-pie.jpg
deleted file mode 100644
index 626cbfc..0000000
--- a/public/data/thumb/calendar-pie.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-simple.jpg b/public/data/thumb/calendar-simple.jpg
deleted file mode 100644
index c859929..0000000
--- a/public/data/thumb/calendar-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/calendar-vertical.jpg b/public/data/thumb/calendar-vertical.jpg
deleted file mode 100644
index 5b7f7e4..0000000
--- a/public/data/thumb/calendar-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-brush.jpg b/public/data/thumb/candlestick-brush.jpg
deleted file mode 100644
index 433a8e7..0000000
--- a/public/data/thumb/candlestick-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-large.jpg b/public/data/thumb/candlestick-large.jpg
deleted file mode 100644
index b754beb..0000000
--- a/public/data/thumb/candlestick-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-sh-2015.jpg b/public/data/thumb/candlestick-sh-2015.jpg
deleted file mode 100644
index 7fa36b1..0000000
--- a/public/data/thumb/candlestick-sh-2015.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-sh.jpg b/public/data/thumb/candlestick-sh.jpg
deleted file mode 100644
index e24219d..0000000
--- a/public/data/thumb/candlestick-sh.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-simple.jpg b/public/data/thumb/candlestick-simple.jpg
deleted file mode 100644
index 6969cac..0000000
--- a/public/data/thumb/candlestick-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-touch.jpg b/public/data/thumb/candlestick-touch.jpg
deleted file mode 100644
index 00c8171..0000000
--- a/public/data/thumb/candlestick-touch.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/candlestick-touch.png b/public/data/thumb/candlestick-touch.png
index 4e99471..9d141c9 100644
--- a/public/data/thumb/candlestick-touch.png
+++ b/public/data/thumb/candlestick-touch.png
Binary files differ
diff --git a/public/data/thumb/candlestick-touch.webp b/public/data/thumb/candlestick-touch.webp
index 5ea2613..7df1ae8 100644
--- a/public/data/thumb/candlestick-touch.webp
+++ b/public/data/thumb/candlestick-touch.webp
Binary files differ
diff --git a/public/data/thumb/circle-packing-with-d3.png b/public/data/thumb/circle-packing-with-d3.png
new file mode 100644
index 0000000..2f7af4f
--- /dev/null
+++ b/public/data/thumb/circle-packing-with-d3.png
Binary files differ
diff --git a/public/data/thumb/circle-packing-with-d3.webp b/public/data/thumb/circle-packing-with-d3.webp
new file mode 100644
index 0000000..498d020
--- /dev/null
+++ b/public/data/thumb/circle-packing-with-d3.webp
Binary files differ
diff --git a/public/data/thumb/confidence-band.jpg b/public/data/thumb/confidence-band.jpg
deleted file mode 100644
index a3e5fc4..0000000
--- a/public/data/thumb/confidence-band.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/covid-america.png b/public/data/thumb/covid-america.png
new file mode 100644
index 0000000..42d3190
--- /dev/null
+++ b/public/data/thumb/covid-america.png
Binary files differ
diff --git a/public/data/thumb/covid-america.webp b/public/data/thumb/covid-america.webp
new file mode 100644
index 0000000..2b65353
--- /dev/null
+++ b/public/data/thumb/covid-america.webp
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-bar.png b/public/data/thumb/custom-aggregate-scatter-bar.png
new file mode 100644
index 0000000..c94e23a
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-bar.png
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-bar.webp b/public/data/thumb/custom-aggregate-scatter-bar.webp
new file mode 100644
index 0000000..9647451
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-bar.webp
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-cluster.png b/public/data/thumb/custom-aggregate-scatter-cluster.png
new file mode 100644
index 0000000..e13a8fc
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-cluster.png
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-cluster.webp b/public/data/thumb/custom-aggregate-scatter-cluster.webp
new file mode 100644
index 0000000..7ba554f
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-cluster.webp
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-pie.png b/public/data/thumb/custom-aggregate-scatter-pie.png
new file mode 100644
index 0000000..93aae54
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-pie.png
Binary files differ
diff --git a/public/data/thumb/custom-aggregate-scatter-pie.webp b/public/data/thumb/custom-aggregate-scatter-pie.webp
new file mode 100644
index 0000000..7ba554f
--- /dev/null
+++ b/public/data/thumb/custom-aggregate-scatter-pie.webp
Binary files differ
diff --git a/public/data/thumb/custom-bar-trend.jpg b/public/data/thumb/custom-bar-trend.jpg
deleted file mode 100644
index 0f56cb5..0000000
--- a/public/data/thumb/custom-bar-trend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-calendar-icon.jpg b/public/data/thumb/custom-calendar-icon.jpg
deleted file mode 100644
index 5f93313..0000000
--- a/public/data/thumb/custom-calendar-icon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-cartesian-polygon.jpg b/public/data/thumb/custom-cartesian-polygon.jpg
deleted file mode 100644
index fa467e9..0000000
--- a/public/data/thumb/custom-cartesian-polygon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-combine-separate-morph.png b/public/data/thumb/custom-combine-separate-morph.png
index 61279f2..059e0f9 100644
--- a/public/data/thumb/custom-combine-separate-morph.png
+++ b/public/data/thumb/custom-combine-separate-morph.png
Binary files differ
diff --git a/public/data/thumb/custom-combine-separate-morph.webp b/public/data/thumb/custom-combine-separate-morph.webp
index 3d14a7a..5e824b1 100644
--- a/public/data/thumb/custom-combine-separate-morph.webp
+++ b/public/data/thumb/custom-combine-separate-morph.webp
Binary files differ
diff --git a/public/data/thumb/custom-error-bar.jpg b/public/data/thumb/custom-error-bar.jpg
deleted file mode 100644
index fcb87d3..0000000
--- a/public/data/thumb/custom-error-bar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-error-scatter.jpg b/public/data/thumb/custom-error-scatter.jpg
deleted file mode 100644
index a037362..0000000
--- a/public/data/thumb/custom-error-scatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-gantt-flight.jpg b/public/data/thumb/custom-gantt-flight.jpg
deleted file mode 100644
index 540ce04..0000000
--- a/public/data/thumb/custom-gantt-flight.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-gauge.png b/public/data/thumb/custom-gauge.png
index d34646b..b1b4179 100644
--- a/public/data/thumb/custom-gauge.png
+++ b/public/data/thumb/custom-gauge.png
Binary files differ
diff --git a/public/data/thumb/custom-gauge.webp b/public/data/thumb/custom-gauge.webp
index ed85334..76445b1 100644
--- a/public/data/thumb/custom-gauge.webp
+++ b/public/data/thumb/custom-gauge.webp
Binary files differ
diff --git a/public/data/thumb/custom-hexbin.jpg b/public/data/thumb/custom-hexbin.jpg
deleted file mode 100644
index 6cdb0bc..0000000
--- a/public/data/thumb/custom-hexbin.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-ohlc.jpg b/public/data/thumb/custom-ohlc.jpg
deleted file mode 100644
index 9e503d7..0000000
--- a/public/data/thumb/custom-ohlc.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-one-to-one-morph.png b/public/data/thumb/custom-one-to-one-morph.png
index 3890b8b..8297148 100644
--- a/public/data/thumb/custom-one-to-one-morph.png
+++ b/public/data/thumb/custom-one-to-one-morph.png
Binary files differ
diff --git a/public/data/thumb/custom-one-to-one-morph.webp b/public/data/thumb/custom-one-to-one-morph.webp
index 50d5882..d409f39 100644
--- a/public/data/thumb/custom-one-to-one-morph.webp
+++ b/public/data/thumb/custom-one-to-one-morph.webp
Binary files differ
diff --git a/public/data/thumb/custom-polar-heatmap.jpg b/public/data/thumb/custom-polar-heatmap.jpg
deleted file mode 100644
index 69f3930..0000000
--- a/public/data/thumb/custom-polar-heatmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-profile.jpg b/public/data/thumb/custom-profile.jpg
deleted file mode 100644
index 0b4194a..0000000
--- a/public/data/thumb/custom-profile.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-profile.png b/public/data/thumb/custom-profile.png
index fa76931..a5411b7 100644
--- a/public/data/thumb/custom-profile.png
+++ b/public/data/thumb/custom-profile.png
Binary files differ
diff --git a/public/data/thumb/custom-profile.webp b/public/data/thumb/custom-profile.webp
index d37fd46..1461ccf 100644
--- a/public/data/thumb/custom-profile.webp
+++ b/public/data/thumb/custom-profile.webp
Binary files differ
diff --git a/public/data/thumb/custom-profit.jpg b/public/data/thumb/custom-profit.jpg
deleted file mode 100644
index e1fae3c..0000000
--- a/public/data/thumb/custom-profit.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/custom-spiral-race.png b/public/data/thumb/custom-spiral-race.png
index 434eeeb..30ee758 100644
--- a/public/data/thumb/custom-spiral-race.png
+++ b/public/data/thumb/custom-spiral-race.png
Binary files differ
diff --git a/public/data/thumb/custom-spiral-race.webp b/public/data/thumb/custom-spiral-race.webp
index 9384515..bfd9eb6 100644
--- a/public/data/thumb/custom-spiral-race.webp
+++ b/public/data/thumb/custom-spiral-race.webp
Binary files differ
diff --git a/public/data/thumb/custom-story-transition.png b/public/data/thumb/custom-story-transition.png
index 84e20c0..f951786 100644
--- a/public/data/thumb/custom-story-transition.png
+++ b/public/data/thumb/custom-story-transition.png
Binary files differ
diff --git a/public/data/thumb/custom-story-transition.webp b/public/data/thumb/custom-story-transition.webp
index 69b939f..c27f36b 100644
--- a/public/data/thumb/custom-story-transition.webp
+++ b/public/data/thumb/custom-story-transition.webp
Binary files differ
diff --git a/public/data/thumb/custom-wind.jpg b/public/data/thumb/custom-wind.jpg
deleted file mode 100644
index effc271..0000000
--- a/public/data/thumb/custom-wind.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/cycle-plot.jpg b/public/data/thumb/cycle-plot.jpg
deleted file mode 100644
index b6bf847..0000000
--- a/public/data/thumb/cycle-plot.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/data-transform-aggregate.png b/public/data/thumb/data-transform-aggregate.png
new file mode 100644
index 0000000..0571552
--- /dev/null
+++ b/public/data/thumb/data-transform-aggregate.png
Binary files differ
diff --git a/public/data/thumb/data-transform-aggregate.webp b/public/data/thumb/data-transform-aggregate.webp
new file mode 100644
index 0000000..a9687fa
--- /dev/null
+++ b/public/data/thumb/data-transform-aggregate.webp
Binary files differ
diff --git a/public/data/thumb/dataset-default.jpg b/public/data/thumb/dataset-default.jpg
deleted file mode 100644
index eb9ba29..0000000
--- a/public/data/thumb/dataset-default.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-encode0.jpg b/public/data/thumb/dataset-encode0.jpg
deleted file mode 100644
index f68999b..0000000
--- a/public/data/thumb/dataset-encode0.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-encode1.jpg b/public/data/thumb/dataset-encode1.jpg
deleted file mode 100644
index dd52df4..0000000
--- a/public/data/thumb/dataset-encode1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-link.jpg b/public/data/thumb/dataset-link.jpg
deleted file mode 100644
index e5832ea..0000000
--- a/public/data/thumb/dataset-link.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-link.png b/public/data/thumb/dataset-link.png
index c0d8bba..53a7f76 100644
--- a/public/data/thumb/dataset-link.png
+++ b/public/data/thumb/dataset-link.png
Binary files differ
diff --git a/public/data/thumb/dataset-link.webp b/public/data/thumb/dataset-link.webp
index 268d8af..4f28e50 100644
--- a/public/data/thumb/dataset-link.webp
+++ b/public/data/thumb/dataset-link.webp
Binary files differ
diff --git a/public/data/thumb/dataset-series-layout-by.jpg b/public/data/thumb/dataset-series-layout-by.jpg
deleted file mode 100644
index 69402d2..0000000
--- a/public/data/thumb/dataset-series-layout-by.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-simple0.jpg b/public/data/thumb/dataset-simple0.jpg
deleted file mode 100644
index 8028200..0000000
--- a/public/data/thumb/dataset-simple0.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dataset-simple1.jpg b/public/data/thumb/dataset-simple1.jpg
deleted file mode 100644
index 8028200..0000000
--- a/public/data/thumb/dataset-simple1.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dynamic-data.jpg b/public/data/thumb/dynamic-data.jpg
deleted file mode 100644
index a0bd68c..0000000
--- a/public/data/thumb/dynamic-data.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/dynamic-data.png b/public/data/thumb/dynamic-data.png
index c4be2c4..f30b8f1 100644
--- a/public/data/thumb/dynamic-data.png
+++ b/public/data/thumb/dynamic-data.png
Binary files differ
diff --git a/public/data/thumb/dynamic-data.webp b/public/data/thumb/dynamic-data.webp
index 50f3799..3218950 100644
--- a/public/data/thumb/dynamic-data.webp
+++ b/public/data/thumb/dynamic-data.webp
Binary files differ
diff --git a/public/data/thumb/dynamic-data2.jpg b/public/data/thumb/dynamic-data2.jpg
deleted file mode 100644
index 6649480..0000000
--- a/public/data/thumb/dynamic-data2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/effectScatter-bmap.jpg b/public/data/thumb/effectScatter-bmap.jpg
deleted file mode 100644
index c8ed7b1..0000000
--- a/public/data/thumb/effectScatter-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/effectScatter-bmap.png b/public/data/thumb/effectScatter-bmap.png
index cbb1855..2412b9e 100644
--- a/public/data/thumb/effectScatter-bmap.png
+++ b/public/data/thumb/effectScatter-bmap.png
Binary files differ
diff --git a/public/data/thumb/effectScatter-bmap.webp b/public/data/thumb/effectScatter-bmap.webp
index 9dbf290..c4b36d9 100644
--- a/public/data/thumb/effectScatter-bmap.webp
+++ b/public/data/thumb/effectScatter-bmap.webp
Binary files differ
diff --git a/public/data/thumb/effectScatter-map.jpg b/public/data/thumb/effectScatter-map.jpg
deleted file mode 100644
index b7a9498..0000000
--- a/public/data/thumb/effectScatter-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/effectScatter-map.png b/public/data/thumb/effectScatter-map.png
index 837188e..86cfec6 100644
--- a/public/data/thumb/effectScatter-map.png
+++ b/public/data/thumb/effectScatter-map.png
Binary files differ
diff --git a/public/data/thumb/effectScatter-map.webp b/public/data/thumb/effectScatter-map.webp
index 369ead4..c4452e7 100644
--- a/public/data/thumb/effectScatter-map.webp
+++ b/public/data/thumb/effectScatter-map.webp
Binary files differ
diff --git a/public/data/thumb/funnel-align.jpg b/public/data/thumb/funnel-align.jpg
deleted file mode 100644
index 6200bdd..0000000
--- a/public/data/thumb/funnel-align.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/funnel-customize.jpg b/public/data/thumb/funnel-customize.jpg
deleted file mode 100644
index 74c3ac7..0000000
--- a/public/data/thumb/funnel-customize.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/funnel-mutiple.jpg b/public/data/thumb/funnel-mutiple.jpg
deleted file mode 100644
index e07f166..0000000
--- a/public/data/thumb/funnel-mutiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/funnel.jpg b/public/data/thumb/funnel.jpg
deleted file mode 100644
index 0d376f0..0000000
--- a/public/data/thumb/funnel.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/gauge-barometer.png b/public/data/thumb/gauge-barometer.png
index 2e9b7ec..d20bf22 100644
--- a/public/data/thumb/gauge-barometer.png
+++ b/public/data/thumb/gauge-barometer.png
Binary files differ
diff --git a/public/data/thumb/gauge-barometer.webp b/public/data/thumb/gauge-barometer.webp
index 53dd3ff..f2e231f 100644
--- a/public/data/thumb/gauge-barometer.webp
+++ b/public/data/thumb/gauge-barometer.webp
Binary files differ
diff --git a/public/data/thumb/gauge-car-dark.jpg b/public/data/thumb/gauge-car-dark.jpg
deleted file mode 100644
index 6f9cd2e..0000000
--- a/public/data/thumb/gauge-car-dark.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/gauge-car.jpg b/public/data/thumb/gauge-car.jpg
deleted file mode 100644
index fc9ebb4..0000000
--- a/public/data/thumb/gauge-car.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/gauge-car.png b/public/data/thumb/gauge-car.png
index 33d57e5..14b843e 100644
--- a/public/data/thumb/gauge-car.png
+++ b/public/data/thumb/gauge-car.png
Binary files differ
diff --git a/public/data/thumb/gauge-car.webp b/public/data/thumb/gauge-car.webp
index 7e64cac..91215ed 100644
--- a/public/data/thumb/gauge-car.webp
+++ b/public/data/thumb/gauge-car.webp
Binary files differ
diff --git a/public/data/thumb/gauge-clock.png b/public/data/thumb/gauge-clock.png
index d57eba6..be089b4 100644
--- a/public/data/thumb/gauge-clock.png
+++ b/public/data/thumb/gauge-clock.png
Binary files differ
diff --git a/public/data/thumb/gauge-clock.webp b/public/data/thumb/gauge-clock.webp
index 930d5fd..cd90e3d 100644
--- a/public/data/thumb/gauge-clock.webp
+++ b/public/data/thumb/gauge-clock.webp
Binary files differ
diff --git a/public/data/thumb/gauge-multi-title.png b/public/data/thumb/gauge-multi-title.png
index 0826be1..692b149 100644
--- a/public/data/thumb/gauge-multi-title.png
+++ b/public/data/thumb/gauge-multi-title.png
Binary files differ
diff --git a/public/data/thumb/gauge-multi-title.webp b/public/data/thumb/gauge-multi-title.webp
index de52943..d19ac8e 100644
--- a/public/data/thumb/gauge-multi-title.webp
+++ b/public/data/thumb/gauge-multi-title.webp
Binary files differ
diff --git a/public/data/thumb/gauge-progress.png b/public/data/thumb/gauge-progress.png
index 53cb973..4b8df93 100644
--- a/public/data/thumb/gauge-progress.png
+++ b/public/data/thumb/gauge-progress.png
Binary files differ
diff --git a/public/data/thumb/gauge-progress.webp b/public/data/thumb/gauge-progress.webp
index e1c1322..45c2636 100644
--- a/public/data/thumb/gauge-progress.webp
+++ b/public/data/thumb/gauge-progress.webp
Binary files differ
diff --git a/public/data/thumb/gauge-ring.png b/public/data/thumb/gauge-ring.png
index abe0858..cc93c57 100644
--- a/public/data/thumb/gauge-ring.png
+++ b/public/data/thumb/gauge-ring.png
Binary files differ
diff --git a/public/data/thumb/gauge-ring.webp b/public/data/thumb/gauge-ring.webp
index 7b3dadc..7f39f74 100644
--- a/public/data/thumb/gauge-ring.webp
+++ b/public/data/thumb/gauge-ring.webp
Binary files differ
diff --git a/public/data/thumb/gauge-stage.png b/public/data/thumb/gauge-stage.png
index 6c92cc0..95df0bc 100644
--- a/public/data/thumb/gauge-stage.png
+++ b/public/data/thumb/gauge-stage.png
Binary files differ
diff --git a/public/data/thumb/gauge-stage.webp b/public/data/thumb/gauge-stage.webp
index 3d3360e..0b458e4 100644
--- a/public/data/thumb/gauge-stage.webp
+++ b/public/data/thumb/gauge-stage.webp
Binary files differ
diff --git a/public/data/thumb/gauge.jpg b/public/data/thumb/gauge.jpg
deleted file mode 100644
index 0a6d8cb..0000000
--- a/public/data/thumb/gauge.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/geo-lines.jpg b/public/data/thumb/geo-lines.jpg
deleted file mode 100644
index 8c4a8e1..0000000
--- a/public/data/thumb/geo-lines.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/geo-lines.png b/public/data/thumb/geo-lines.png
index 913966c..bcc0923 100644
--- a/public/data/thumb/geo-lines.png
+++ b/public/data/thumb/geo-lines.png
Binary files differ
diff --git a/public/data/thumb/geo-lines.webp b/public/data/thumb/geo-lines.webp
index 06c3236..e7daa24 100644
--- a/public/data/thumb/geo-lines.webp
+++ b/public/data/thumb/geo-lines.webp
Binary files differ
diff --git a/public/data/thumb/geo-map-scatter.jpg b/public/data/thumb/geo-map-scatter.jpg
deleted file mode 100644
index 9179a09..0000000
--- a/public/data/thumb/geo-map-scatter.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-circular-layout.jpg b/public/data/thumb/graph-circular-layout.jpg
deleted file mode 100644
index 48cedea..0000000
--- a/public/data/thumb/graph-circular-layout.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-force-dynamic.jpg b/public/data/thumb/graph-force-dynamic.jpg
deleted file mode 100644
index 054bef5..0000000
--- a/public/data/thumb/graph-force-dynamic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-force-dynamic.png b/public/data/thumb/graph-force-dynamic.png
index be6e200..adbf1a4 100644
--- a/public/data/thumb/graph-force-dynamic.png
+++ b/public/data/thumb/graph-force-dynamic.png
Binary files differ
diff --git a/public/data/thumb/graph-force-dynamic.webp b/public/data/thumb/graph-force-dynamic.webp
index cb21bae..597c5a6 100644
--- a/public/data/thumb/graph-force-dynamic.webp
+++ b/public/data/thumb/graph-force-dynamic.webp
Binary files differ
diff --git a/public/data/thumb/graph-force.jpg b/public/data/thumb/graph-force.jpg
deleted file mode 100644
index 5cb352f..0000000
--- a/public/data/thumb/graph-force.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-force2.jpg b/public/data/thumb/graph-force2.jpg
deleted file mode 100644
index 07f4ae8..0000000
--- a/public/data/thumb/graph-force2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-grid.jpg b/public/data/thumb/graph-grid.jpg
deleted file mode 100644
index 793595e..0000000
--- a/public/data/thumb/graph-grid.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-life-expectancy.jpg b/public/data/thumb/graph-life-expectancy.jpg
deleted file mode 100644
index 01a3759..0000000
--- a/public/data/thumb/graph-life-expectancy.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-npm.jpg b/public/data/thumb/graph-npm.jpg
deleted file mode 100644
index 612821c..0000000
--- a/public/data/thumb/graph-npm.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-simple.jpg b/public/data/thumb/graph-simple.jpg
deleted file mode 100644
index e5773a9..0000000
--- a/public/data/thumb/graph-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph-webkit-dep.jpg b/public/data/thumb/graph-webkit-dep.jpg
deleted file mode 100644
index 1c100ab..0000000
--- a/public/data/thumb/graph-webkit-dep.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/graph.jpg b/public/data/thumb/graph.jpg
deleted file mode 100644
index ea1c67c..0000000
--- a/public/data/thumb/graph.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/grid-multiple.jpg b/public/data/thumb/grid-multiple.jpg
deleted file mode 100644
index ad32134..0000000
--- a/public/data/thumb/grid-multiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/heatmap-bmap.jpg b/public/data/thumb/heatmap-bmap.jpg
deleted file mode 100644
index 2d6ca9d..0000000
--- a/public/data/thumb/heatmap-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/heatmap-bmap.png b/public/data/thumb/heatmap-bmap.png
index 37fd2d2..bf30234 100644
--- a/public/data/thumb/heatmap-bmap.png
+++ b/public/data/thumb/heatmap-bmap.png
Binary files differ
diff --git a/public/data/thumb/heatmap-bmap.webp b/public/data/thumb/heatmap-bmap.webp
index f57e0cd..643e721 100644
--- a/public/data/thumb/heatmap-bmap.webp
+++ b/public/data/thumb/heatmap-bmap.webp
Binary files differ
diff --git a/public/data/thumb/heatmap-cartesian.jpg b/public/data/thumb/heatmap-cartesian.jpg
deleted file mode 100644
index 976c0e4..0000000
--- a/public/data/thumb/heatmap-cartesian.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/heatmap-large-piecewise.jpg b/public/data/thumb/heatmap-large-piecewise.jpg
deleted file mode 100644
index b1c97f9..0000000
--- a/public/data/thumb/heatmap-large-piecewise.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/heatmap-large-piecewise.png b/public/data/thumb/heatmap-large-piecewise.png
index 0f25d7a..39c7054 100644
--- a/public/data/thumb/heatmap-large-piecewise.png
+++ b/public/data/thumb/heatmap-large-piecewise.png
Binary files differ
diff --git a/public/data/thumb/heatmap-large-piecewise.webp b/public/data/thumb/heatmap-large-piecewise.webp
index b5bcc8e..01abb77 100644
--- a/public/data/thumb/heatmap-large-piecewise.webp
+++ b/public/data/thumb/heatmap-large-piecewise.webp
Binary files differ
diff --git a/public/data/thumb/heatmap-large.jpg b/public/data/thumb/heatmap-large.jpg
deleted file mode 100644
index 821d82b..0000000
--- a/public/data/thumb/heatmap-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/heatmap-map.jpg b/public/data/thumb/heatmap-map.jpg
deleted file mode 100644
index 99d1ed8..0000000
--- a/public/data/thumb/heatmap-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-aqi.jpg b/public/data/thumb/line-aqi.jpg
deleted file mode 100644
index 9f267f7..0000000
--- a/public/data/thumb/line-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-draggable.jpg b/public/data/thumb/line-draggable.jpg
deleted file mode 100644
index d2f1ade..0000000
--- a/public/data/thumb/line-draggable.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-easing.jpg b/public/data/thumb/line-easing.jpg
deleted file mode 100644
index a4dbf59..0000000
--- a/public/data/thumb/line-easing.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-function.jpg b/public/data/thumb/line-function.jpg
deleted file mode 100644
index 62f713d..0000000
--- a/public/data/thumb/line-function.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-gradient.jpg b/public/data/thumb/line-gradient.jpg
deleted file mode 100644
index fe6506a..0000000
--- a/public/data/thumb/line-gradient.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-graphic.jpg b/public/data/thumb/line-graphic.jpg
deleted file mode 100644
index 267e613..0000000
--- a/public/data/thumb/line-graphic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-graphic.png b/public/data/thumb/line-graphic.png
index 23790f8..b809cda 100644
--- a/public/data/thumb/line-graphic.png
+++ b/public/data/thumb/line-graphic.png
Binary files differ
diff --git a/public/data/thumb/line-graphic.webp b/public/data/thumb/line-graphic.webp
index 94013e6..76af025 100644
--- a/public/data/thumb/line-graphic.webp
+++ b/public/data/thumb/line-graphic.webp
Binary files differ
diff --git a/public/data/thumb/line-in-cartesian-coordinate-system.jpg b/public/data/thumb/line-in-cartesian-coordinate-system.jpg
deleted file mode 100644
index 100005e..0000000
--- a/public/data/thumb/line-in-cartesian-coordinate-system.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-log.jpg b/public/data/thumb/line-log.jpg
deleted file mode 100644
index 1f55ec4..0000000
--- a/public/data/thumb/line-log.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-marker.jpg b/public/data/thumb/line-marker.jpg
deleted file mode 100644
index fd2448f..0000000
--- a/public/data/thumb/line-marker.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-markline.jpg b/public/data/thumb/line-markline.jpg
deleted file mode 100644
index 9ec9fe4..0000000
--- a/public/data/thumb/line-markline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-pen.jpg b/public/data/thumb/line-pen.jpg
deleted file mode 100644
index 13c03d5..0000000
--- a/public/data/thumb/line-pen.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-polar.jpg b/public/data/thumb/line-polar.jpg
deleted file mode 100644
index 795535a..0000000
--- a/public/data/thumb/line-polar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-polar2.jpg b/public/data/thumb/line-polar2.jpg
deleted file mode 100644
index ae9e9cc..0000000
--- a/public/data/thumb/line-polar2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-race.png b/public/data/thumb/line-race.png
new file mode 100644
index 0000000..8c8fd13
--- /dev/null
+++ b/public/data/thumb/line-race.png
Binary files differ
diff --git a/public/data/thumb/line-race.webp b/public/data/thumb/line-race.webp
new file mode 100644
index 0000000..a5591c5
--- /dev/null
+++ b/public/data/thumb/line-race.webp
Binary files differ
diff --git a/public/data/thumb/line-sections.jpg b/public/data/thumb/line-sections.jpg
deleted file mode 100644
index 72cceec..0000000
--- a/public/data/thumb/line-sections.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-sections.png b/public/data/thumb/line-sections.png
index 60e60db..f84ef59 100644
--- a/public/data/thumb/line-sections.png
+++ b/public/data/thumb/line-sections.png
Binary files differ
diff --git a/public/data/thumb/line-sections.webp b/public/data/thumb/line-sections.webp
index fbe40af..49dc98e 100644
--- a/public/data/thumb/line-sections.webp
+++ b/public/data/thumb/line-sections.webp
Binary files differ
diff --git a/public/data/thumb/line-simple.jpg b/public/data/thumb/line-simple.jpg
deleted file mode 100644
index 74e651b..0000000
--- a/public/data/thumb/line-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-smooth.jpg b/public/data/thumb/line-smooth.jpg
deleted file mode 100644
index f507719..0000000
--- a/public/data/thumb/line-smooth.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-stack.jpg b/public/data/thumb/line-stack.jpg
deleted file mode 100644
index 0f5cc41..0000000
--- a/public/data/thumb/line-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-stack.png b/public/data/thumb/line-stack.png
index 0e511da..318ca1e 100644
--- a/public/data/thumb/line-stack.png
+++ b/public/data/thumb/line-stack.png
Binary files differ
diff --git a/public/data/thumb/line-stack.webp b/public/data/thumb/line-stack.webp
index 3af1532..766ca3d 100644
--- a/public/data/thumb/line-stack.webp
+++ b/public/data/thumb/line-stack.webp
Binary files differ
diff --git a/public/data/thumb/line-step.jpg b/public/data/thumb/line-step.jpg
deleted file mode 100644
index 796d43a..0000000
--- a/public/data/thumb/line-step.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-style.jpg b/public/data/thumb/line-style.jpg
deleted file mode 100644
index 8672286..0000000
--- a/public/data/thumb/line-style.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-tooltip-touch.jpg b/public/data/thumb/line-tooltip-touch.jpg
deleted file mode 100644
index 6533a1a..0000000
--- a/public/data/thumb/line-tooltip-touch.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-tooltip-touch.png b/public/data/thumb/line-tooltip-touch.png
index 592409d..8ff75fb 100644
--- a/public/data/thumb/line-tooltip-touch.png
+++ b/public/data/thumb/line-tooltip-touch.png
Binary files differ
diff --git a/public/data/thumb/line-tooltip-touch.webp b/public/data/thumb/line-tooltip-touch.webp
index bdc266b..cddc24e 100644
--- a/public/data/thumb/line-tooltip-touch.webp
+++ b/public/data/thumb/line-tooltip-touch.webp
Binary files differ
diff --git a/public/data/thumb/line-y-category.jpg b/public/data/thumb/line-y-category.jpg
deleted file mode 100644
index f06d70e..0000000
--- a/public/data/thumb/line-y-category.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/line-y-category.png b/public/data/thumb/line-y-category.png
index 2e4541b..41c1d6f 100644
--- a/public/data/thumb/line-y-category.png
+++ b/public/data/thumb/line-y-category.png
Binary files differ
diff --git a/public/data/thumb/line-y-category.webp b/public/data/thumb/line-y-category.webp
index d6b83f9..8b4a1c6 100644
--- a/public/data/thumb/line-y-category.webp
+++ b/public/data/thumb/line-y-category.webp
Binary files differ
diff --git a/public/data/thumb/lines-airline.jpg b/public/data/thumb/lines-airline.jpg
deleted file mode 100644
index 14a1cea..0000000
--- a/public/data/thumb/lines-airline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/lines-bmap-bus.jpg b/public/data/thumb/lines-bmap-bus.jpg
deleted file mode 100644
index dec84ee..0000000
--- a/public/data/thumb/lines-bmap-bus.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/lines-bmap-effect.jpg b/public/data/thumb/lines-bmap-effect.jpg
deleted file mode 100644
index f247c77..0000000
--- a/public/data/thumb/lines-bmap-effect.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/lines-bmap-effect.png b/public/data/thumb/lines-bmap-effect.png
index 911a9f3..055130b 100644
--- a/public/data/thumb/lines-bmap-effect.png
+++ b/public/data/thumb/lines-bmap-effect.png
Binary files differ
diff --git a/public/data/thumb/lines-bmap-effect.webp b/public/data/thumb/lines-bmap-effect.webp
index 813c759..7a4d477 100644
--- a/public/data/thumb/lines-bmap-effect.webp
+++ b/public/data/thumb/lines-bmap-effect.webp
Binary files differ
diff --git a/public/data/thumb/lines-bmap.jpg b/public/data/thumb/lines-bmap.jpg
deleted file mode 100644
index 93bfa25..0000000
--- a/public/data/thumb/lines-bmap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/lines-ny.jpg b/public/data/thumb/lines-ny.jpg
deleted file mode 100644
index c8d7a02..0000000
--- a/public/data/thumb/lines-ny.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/lines-ny.png b/public/data/thumb/lines-ny.png
index 7632ea1..a8ac450 100644
--- a/public/data/thumb/lines-ny.png
+++ b/public/data/thumb/lines-ny.png
Binary files differ
diff --git a/public/data/thumb/lines-ny.webp b/public/data/thumb/lines-ny.webp
index 68edcd7..eea4ff0 100644
--- a/public/data/thumb/lines-ny.webp
+++ b/public/data/thumb/lines-ny.webp
Binary files differ
diff --git a/public/data/thumb/map-HK.jpg b/public/data/thumb/map-HK.jpg
deleted file mode 100644
index 075b478..0000000
--- a/public/data/thumb/map-HK.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-bin.jpg b/public/data/thumb/map-bin.jpg
deleted file mode 100644
index ec71ca2..0000000
--- a/public/data/thumb/map-bin.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-china-dataRange.jpg b/public/data/thumb/map-china-dataRange.jpg
deleted file mode 100644
index 07a3e04..0000000
--- a/public/data/thumb/map-china-dataRange.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-china.jpg b/public/data/thumb/map-china.jpg
deleted file mode 100644
index 218819b..0000000
--- a/public/data/thumb/map-china.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-labels.jpg b/public/data/thumb/map-labels.jpg
deleted file mode 100644
index b386ec3..0000000
--- a/public/data/thumb/map-labels.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-locate.jpg b/public/data/thumb/map-locate.jpg
deleted file mode 100644
index 3f94a2e..0000000
--- a/public/data/thumb/map-locate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-locate.png b/public/data/thumb/map-locate.png
index c6f7971..493e7b3 100644
--- a/public/data/thumb/map-locate.png
+++ b/public/data/thumb/map-locate.png
Binary files differ
diff --git a/public/data/thumb/map-locate.webp b/public/data/thumb/map-locate.webp
index 49f02a9..0edb57b 100644
--- a/public/data/thumb/map-locate.webp
+++ b/public/data/thumb/map-locate.webp
Binary files differ
diff --git a/public/data/thumb/map-parallel-prices.jpg b/public/data/thumb/map-parallel-prices.jpg
deleted file mode 100644
index 6d8243a..0000000
--- a/public/data/thumb/map-parallel-prices.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-polygon.jpg b/public/data/thumb/map-polygon.jpg
deleted file mode 100644
index bd8cf9d..0000000
--- a/public/data/thumb/map-polygon.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-polygon.png b/public/data/thumb/map-polygon.png
index 0b8b2ab..a247d53 100644
--- a/public/data/thumb/map-polygon.png
+++ b/public/data/thumb/map-polygon.png
Binary files differ
diff --git a/public/data/thumb/map-polygon.webp b/public/data/thumb/map-polygon.webp
index dc46786..63c03af 100644
--- a/public/data/thumb/map-polygon.webp
+++ b/public/data/thumb/map-polygon.webp
Binary files differ
diff --git a/public/data/thumb/map-province.jpg b/public/data/thumb/map-province.jpg
deleted file mode 100644
index d40a0c8..0000000
--- a/public/data/thumb/map-province.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-usa.jpg b/public/data/thumb/map-usa.jpg
deleted file mode 100644
index 65108a6..0000000
--- a/public/data/thumb/map-usa.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-world-dataRange.jpg b/public/data/thumb/map-world-dataRange.jpg
deleted file mode 100644
index 3d162e6..0000000
--- a/public/data/thumb/map-world-dataRange.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/map-world.jpg b/public/data/thumb/map-world.jpg
deleted file mode 100644
index 8e262f8..0000000
--- a/public/data/thumb/map-world.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/mix-line-bar.jpg b/public/data/thumb/mix-line-bar.jpg
deleted file mode 100644
index a4d6a57..0000000
--- a/public/data/thumb/mix-line-bar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/mix-timeline-finance.jpg b/public/data/thumb/mix-timeline-finance.jpg
deleted file mode 100644
index c5f589c..0000000
--- a/public/data/thumb/mix-timeline-finance.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/mix-timeline-finance.png b/public/data/thumb/mix-timeline-finance.png
index 5c607bf..ade2396 100644
--- a/public/data/thumb/mix-timeline-finance.png
+++ b/public/data/thumb/mix-timeline-finance.png
Binary files differ
diff --git a/public/data/thumb/mix-timeline-finance.webp b/public/data/thumb/mix-timeline-finance.webp
index f6c0e8a..cbaadb7 100644
--- a/public/data/thumb/mix-timeline-finance.webp
+++ b/public/data/thumb/mix-timeline-finance.webp
Binary files differ
diff --git a/public/data/thumb/mix-zoom-on-value.jpg b/public/data/thumb/mix-zoom-on-value.jpg
deleted file mode 100644
index c5975fc..0000000
--- a/public/data/thumb/mix-zoom-on-value.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/multiple-x-axis.jpg b/public/data/thumb/multiple-x-axis.jpg
deleted file mode 100644
index 92fc5fd..0000000
--- a/public/data/thumb/multiple-x-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/multiple-y-axis.jpg b/public/data/thumb/multiple-y-axis.jpg
deleted file mode 100644
index 30aa3f9..0000000
--- a/public/data/thumb/multiple-y-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/parallel-aqi.jpg b/public/data/thumb/parallel-aqi.jpg
deleted file mode 100644
index 9554dad..0000000
--- a/public/data/thumb/parallel-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/parallel-nutrients.jpg b/public/data/thumb/parallel-nutrients.jpg
deleted file mode 100644
index 336728c..0000000
--- a/public/data/thumb/parallel-nutrients.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/parallel-simple.jpg b/public/data/thumb/parallel-simple.jpg
deleted file mode 100644
index ee446d1..0000000
--- a/public/data/thumb/parallel-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-body-fill.jpg b/public/data/thumb/pictorialBar-body-fill.jpg
deleted file mode 100644
index bfb3491..0000000
--- a/public/data/thumb/pictorialBar-body-fill.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-dotted.jpg b/public/data/thumb/pictorialBar-dotted.jpg
deleted file mode 100644
index 3c4ff9b..0000000
--- a/public/data/thumb/pictorialBar-dotted.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-dotted.png b/public/data/thumb/pictorialBar-dotted.png
index 23f6278..cacc078 100644
--- a/public/data/thumb/pictorialBar-dotted.png
+++ b/public/data/thumb/pictorialBar-dotted.png
Binary files differ
diff --git a/public/data/thumb/pictorialBar-dotted.webp b/public/data/thumb/pictorialBar-dotted.webp
index 63a2077..e3516e3 100644
--- a/public/data/thumb/pictorialBar-dotted.webp
+++ b/public/data/thumb/pictorialBar-dotted.webp
Binary files differ
diff --git a/public/data/thumb/pictorialBar-forest.jpg b/public/data/thumb/pictorialBar-forest.jpg
deleted file mode 100644
index 640591b..0000000
--- a/public/data/thumb/pictorialBar-forest.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-forest.png b/public/data/thumb/pictorialBar-forest.png
index d2efbd6..28b9fb6 100644
--- a/public/data/thumb/pictorialBar-forest.png
+++ b/public/data/thumb/pictorialBar-forest.png
Binary files differ
diff --git a/public/data/thumb/pictorialBar-forest.webp b/public/data/thumb/pictorialBar-forest.webp
index ed0b189..98c9f5c 100644
--- a/public/data/thumb/pictorialBar-forest.webp
+++ b/public/data/thumb/pictorialBar-forest.webp
Binary files differ
diff --git a/public/data/thumb/pictorialBar-hill.jpg b/public/data/thumb/pictorialBar-hill.jpg
deleted file mode 100644
index 2f16344..0000000
--- a/public/data/thumb/pictorialBar-hill.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-hill.png b/public/data/thumb/pictorialBar-hill.png
index 1aa772e..5e17a6c 100644
--- a/public/data/thumb/pictorialBar-hill.png
+++ b/public/data/thumb/pictorialBar-hill.png
Binary files differ
diff --git a/public/data/thumb/pictorialBar-hill.webp b/public/data/thumb/pictorialBar-hill.webp
index 729348c..5f662ac 100644
--- a/public/data/thumb/pictorialBar-hill.webp
+++ b/public/data/thumb/pictorialBar-hill.webp
Binary files differ
diff --git a/public/data/thumb/pictorialBar-spirit.jpg b/public/data/thumb/pictorialBar-spirit.jpg
deleted file mode 100644
index 1640c73..0000000
--- a/public/data/thumb/pictorialBar-spirit.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-vehicle.jpg b/public/data/thumb/pictorialBar-vehicle.jpg
deleted file mode 100644
index 84da8e1..0000000
--- a/public/data/thumb/pictorialBar-vehicle.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pictorialBar-velocity.jpg b/public/data/thumb/pictorialBar-velocity.jpg
deleted file mode 100644
index e7d6909..0000000
--- a/public/data/thumb/pictorialBar-velocity.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-alignTo.jpg b/public/data/thumb/pie-alignTo.jpg
deleted file mode 100644
index 83d84e4..0000000
--- a/public/data/thumb/pie-alignTo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-custom.jpg b/public/data/thumb/pie-custom.jpg
deleted file mode 100644
index f55d2d0..0000000
--- a/public/data/thumb/pie-custom.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-custom.png b/public/data/thumb/pie-custom.png
index 0120c41..d32c845 100644
--- a/public/data/thumb/pie-custom.png
+++ b/public/data/thumb/pie-custom.png
Binary files differ
diff --git a/public/data/thumb/pie-custom.webp b/public/data/thumb/pie-custom.webp
index e3e778b..2acd7ad 100644
--- a/public/data/thumb/pie-custom.webp
+++ b/public/data/thumb/pie-custom.webp
Binary files differ
diff --git a/public/data/thumb/pie-doughnut.jpg b/public/data/thumb/pie-doughnut.jpg
deleted file mode 100644
index 85aa3e7..0000000
--- a/public/data/thumb/pie-doughnut.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-legend.jpg b/public/data/thumb/pie-legend.jpg
deleted file mode 100644
index ee5635c..0000000
--- a/public/data/thumb/pie-legend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-nest.jpg b/public/data/thumb/pie-nest.jpg
deleted file mode 100644
index 2c8759e..0000000
--- a/public/data/thumb/pie-nest.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-pattern.jpg b/public/data/thumb/pie-pattern.jpg
deleted file mode 100644
index 29f3ef9..0000000
--- a/public/data/thumb/pie-pattern.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-rich-text.jpg b/public/data/thumb/pie-rich-text.jpg
deleted file mode 100644
index 86adb11..0000000
--- a/public/data/thumb/pie-rich-text.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-roseType.jpg b/public/data/thumb/pie-roseType.jpg
deleted file mode 100644
index 6f2d3c5..0000000
--- a/public/data/thumb/pie-roseType.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/pie-simple.jpg b/public/data/thumb/pie-simple.jpg
deleted file mode 100644
index 2fb9410..0000000
--- a/public/data/thumb/pie-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/polar-roundCap.jpg b/public/data/thumb/polar-roundCap.jpg
deleted file mode 100644
index 2674c86..0000000
--- a/public/data/thumb/polar-roundCap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/radar-aqi.jpg b/public/data/thumb/radar-aqi.jpg
deleted file mode 100644
index 8244fd7..0000000
--- a/public/data/thumb/radar-aqi.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/radar-custom.jpg b/public/data/thumb/radar-custom.jpg
deleted file mode 100644
index 325e69a..0000000
--- a/public/data/thumb/radar-custom.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/radar-custom.png b/public/data/thumb/radar-custom.png
index 85f9129..85c28d6 100644
--- a/public/data/thumb/radar-custom.png
+++ b/public/data/thumb/radar-custom.png
Binary files differ
diff --git a/public/data/thumb/radar-custom.webp b/public/data/thumb/radar-custom.webp
index 2f181ec..5ecf16c 100644
--- a/public/data/thumb/radar-custom.webp
+++ b/public/data/thumb/radar-custom.webp
Binary files differ
diff --git a/public/data/thumb/radar-multiple.jpg b/public/data/thumb/radar-multiple.jpg
deleted file mode 100644
index 6d7e4c4..0000000
--- a/public/data/thumb/radar-multiple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/radar.jpg b/public/data/thumb/radar.jpg
deleted file mode 100644
index e0f4846..0000000
--- a/public/data/thumb/radar.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/radar2.jpg b/public/data/thumb/radar2.jpg
deleted file mode 100644
index f417dad..0000000
--- a/public/data/thumb/radar2.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-energy.jpg b/public/data/thumb/sankey-energy.jpg
deleted file mode 100644
index a1b697c..0000000
--- a/public/data/thumb/sankey-energy.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-itemstyle.jpg b/public/data/thumb/sankey-itemstyle.jpg
deleted file mode 100644
index 63ddac8..0000000
--- a/public/data/thumb/sankey-itemstyle.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-levels.jpg b/public/data/thumb/sankey-levels.jpg
deleted file mode 100644
index f8ef4dd..0000000
--- a/public/data/thumb/sankey-levels.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-nodeAlign-left.jpg b/public/data/thumb/sankey-nodeAlign-left.jpg
deleted file mode 100644
index 9cbf7d8..0000000
--- a/public/data/thumb/sankey-nodeAlign-left.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-nodeAlign-right.jpg b/public/data/thumb/sankey-nodeAlign-right.jpg
deleted file mode 100644
index 9b962fb..0000000
--- a/public/data/thumb/sankey-nodeAlign-right.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-simple.jpg b/public/data/thumb/sankey-simple.jpg
deleted file mode 100644
index 41eb02d..0000000
--- a/public/data/thumb/sankey-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sankey-vertical.jpg b/public/data/thumb/sankey-vertical.jpg
deleted file mode 100644
index 6154d28..0000000
--- a/public/data/thumb/sankey-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-anscombe-quartet.jpg b/public/data/thumb/scatter-anscombe-quartet.jpg
deleted file mode 100644
index 77d9c6c..0000000
--- a/public/data/thumb/scatter-anscombe-quartet.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-aqi-color.jpg b/public/data/thumb/scatter-aqi-color.jpg
deleted file mode 100644
index 4200e2f..0000000
--- a/public/data/thumb/scatter-aqi-color.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-aqi-color.png b/public/data/thumb/scatter-aqi-color.png
index d20d59c..933738c 100644
--- a/public/data/thumb/scatter-aqi-color.png
+++ b/public/data/thumb/scatter-aqi-color.png
Binary files differ
diff --git a/public/data/thumb/scatter-aqi-color.webp b/public/data/thumb/scatter-aqi-color.webp
index 1a27004..15c3814 100644
--- a/public/data/thumb/scatter-aqi-color.webp
+++ b/public/data/thumb/scatter-aqi-color.webp
Binary files differ
diff --git a/public/data/thumb/scatter-clustering-process.jpg b/public/data/thumb/scatter-clustering-process.jpg
deleted file mode 100644
index 67cb903..0000000
--- a/public/data/thumb/scatter-clustering-process.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-clustering-process.png b/public/data/thumb/scatter-clustering-process.png
index 7e33092..e761c1d 100644
--- a/public/data/thumb/scatter-clustering-process.png
+++ b/public/data/thumb/scatter-clustering-process.png
Binary files differ
diff --git a/public/data/thumb/scatter-clustering-process.webp b/public/data/thumb/scatter-clustering-process.webp
index 2552fe5..c7f58f1 100644
--- a/public/data/thumb/scatter-clustering-process.webp
+++ b/public/data/thumb/scatter-clustering-process.webp
Binary files differ
diff --git a/public/data/thumb/scatter-effect.jpg b/public/data/thumb/scatter-effect.jpg
deleted file mode 100644
index 347fac5..0000000
--- a/public/data/thumb/scatter-effect.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-effect.png b/public/data/thumb/scatter-effect.png
index 632f4e8..879ad13 100644
--- a/public/data/thumb/scatter-effect.png
+++ b/public/data/thumb/scatter-effect.png
Binary files differ
diff --git a/public/data/thumb/scatter-effect.webp b/public/data/thumb/scatter-effect.webp
index 517586f..d18f95c 100644
--- a/public/data/thumb/scatter-effect.webp
+++ b/public/data/thumb/scatter-effect.webp
Binary files differ
diff --git a/public/data/thumb/scatter-exponential-regression.jpg b/public/data/thumb/scatter-exponential-regression.jpg
deleted file mode 100644
index 626d036..0000000
--- a/public/data/thumb/scatter-exponential-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-large.jpg b/public/data/thumb/scatter-large.jpg
deleted file mode 100644
index 0d6d4ab..0000000
--- a/public/data/thumb/scatter-large.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-life-expectancy-timeline.jpg b/public/data/thumb/scatter-life-expectancy-timeline.jpg
deleted file mode 100644
index ec229f0..0000000
--- a/public/data/thumb/scatter-life-expectancy-timeline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-life-expectancy-timeline.png b/public/data/thumb/scatter-life-expectancy-timeline.png
index a92b34b..cc4ba52 100644
--- a/public/data/thumb/scatter-life-expectancy-timeline.png
+++ b/public/data/thumb/scatter-life-expectancy-timeline.png
Binary files differ
diff --git a/public/data/thumb/scatter-life-expectancy-timeline.webp b/public/data/thumb/scatter-life-expectancy-timeline.webp
index 3dbd7a8..a8fff5c 100644
--- a/public/data/thumb/scatter-life-expectancy-timeline.webp
+++ b/public/data/thumb/scatter-life-expectancy-timeline.webp
Binary files differ
diff --git a/public/data/thumb/scatter-linear-regression.jpg b/public/data/thumb/scatter-linear-regression.jpg
deleted file mode 100644
index d39e6e0..0000000
--- a/public/data/thumb/scatter-linear-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-logarithmic-regression.jpg b/public/data/thumb/scatter-logarithmic-regression.jpg
deleted file mode 100644
index cd3049a..0000000
--- a/public/data/thumb/scatter-logarithmic-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-map-brush.jpg b/public/data/thumb/scatter-map-brush.jpg
deleted file mode 100644
index f23f6ff..0000000
--- a/public/data/thumb/scatter-map-brush.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-map-brush.png b/public/data/thumb/scatter-map-brush.png
index dc314bf..9282668 100644
--- a/public/data/thumb/scatter-map-brush.png
+++ b/public/data/thumb/scatter-map-brush.png
Binary files differ
diff --git a/public/data/thumb/scatter-map-brush.webp b/public/data/thumb/scatter-map-brush.webp
index 121fd8d..ff20f9a 100644
--- a/public/data/thumb/scatter-map-brush.webp
+++ b/public/data/thumb/scatter-map-brush.webp
Binary files differ
diff --git a/public/data/thumb/scatter-map.jpg b/public/data/thumb/scatter-map.jpg
deleted file mode 100644
index 41aaede..0000000
--- a/public/data/thumb/scatter-map.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-matrix.jpg b/public/data/thumb/scatter-matrix.jpg
deleted file mode 100644
index f93e1df..0000000
--- a/public/data/thumb/scatter-matrix.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-nebula.jpg b/public/data/thumb/scatter-nebula.jpg
deleted file mode 100644
index aadfc94..0000000
--- a/public/data/thumb/scatter-nebula.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-nutrients-matrix.jpg b/public/data/thumb/scatter-nutrients-matrix.jpg
deleted file mode 100644
index 2cb2d57..0000000
--- a/public/data/thumb/scatter-nutrients-matrix.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-nutrients.jpg b/public/data/thumb/scatter-nutrients.jpg
deleted file mode 100644
index f1893b8..0000000
--- a/public/data/thumb/scatter-nutrients.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-painter-choice.jpg b/public/data/thumb/scatter-painter-choice.jpg
deleted file mode 100644
index 7b35d3b..0000000
--- a/public/data/thumb/scatter-painter-choice.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-polar-punchCard.jpg b/public/data/thumb/scatter-polar-punchCard.jpg
deleted file mode 100644
index 1d7737e..0000000
--- a/public/data/thumb/scatter-polar-punchCard.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-polynomial-regression.jpg b/public/data/thumb/scatter-polynomial-regression.jpg
deleted file mode 100644
index 2c7886b..0000000
--- a/public/data/thumb/scatter-polynomial-regression.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-punchCard.jpg b/public/data/thumb/scatter-punchCard.jpg
deleted file mode 100644
index 41b1a79..0000000
--- a/public/data/thumb/scatter-punchCard.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-simple.jpg b/public/data/thumb/scatter-simple.jpg
deleted file mode 100644
index 1983942..0000000
--- a/public/data/thumb/scatter-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-single-axis.jpg b/public/data/thumb/scatter-single-axis.jpg
deleted file mode 100644
index 01dba4d..0000000
--- a/public/data/thumb/scatter-single-axis.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-stream-visual.jpg b/public/data/thumb/scatter-stream-visual.jpg
deleted file mode 100644
index f301b46..0000000
--- a/public/data/thumb/scatter-stream-visual.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-weibo.jpg b/public/data/thumb/scatter-weibo.jpg
deleted file mode 100644
index 8f2107f..0000000
--- a/public/data/thumb/scatter-weibo.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-weight.jpg b/public/data/thumb/scatter-weight.jpg
deleted file mode 100644
index 1eeeac6..0000000
--- a/public/data/thumb/scatter-weight.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/scatter-world-population.jpg b/public/data/thumb/scatter-world-population.jpg
deleted file mode 100644
index cfc9a00..0000000
--- a/public/data/thumb/scatter-world-population.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-book.jpg b/public/data/thumb/sunburst-book.jpg
deleted file mode 100644
index 87c32bf..0000000
--- a/public/data/thumb/sunburst-book.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-book.png b/public/data/thumb/sunburst-book.png
index 3e3a350..4f189e2 100644
--- a/public/data/thumb/sunburst-book.png
+++ b/public/data/thumb/sunburst-book.png
Binary files differ
diff --git a/public/data/thumb/sunburst-book.webp b/public/data/thumb/sunburst-book.webp
index da5d9f5..cf24e5f 100644
--- a/public/data/thumb/sunburst-book.webp
+++ b/public/data/thumb/sunburst-book.webp
Binary files differ
diff --git a/public/data/thumb/sunburst-drink.jpg b/public/data/thumb/sunburst-drink.jpg
deleted file mode 100644
index ad6512d..0000000
--- a/public/data/thumb/sunburst-drink.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-label-rotate.jpg b/public/data/thumb/sunburst-label-rotate.jpg
deleted file mode 100644
index 9c5712f..0000000
--- a/public/data/thumb/sunburst-label-rotate.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-monochrome.jpg b/public/data/thumb/sunburst-monochrome.jpg
deleted file mode 100644
index d75f782..0000000
--- a/public/data/thumb/sunburst-monochrome.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-simple.jpg b/public/data/thumb/sunburst-simple.jpg
deleted file mode 100644
index 5ad7622..0000000
--- a/public/data/thumb/sunburst-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/sunburst-visualMap.jpg b/public/data/thumb/sunburst-visualMap.jpg
deleted file mode 100644
index 66fdb96..0000000
--- a/public/data/thumb/sunburst-visualMap.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/themeRiver-basic.jpg b/public/data/thumb/themeRiver-basic.jpg
deleted file mode 100644
index 2900906..0000000
--- a/public/data/thumb/themeRiver-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/themeRiver-lastfm.jpg b/public/data/thumb/themeRiver-lastfm.jpg
deleted file mode 100644
index f215ff0..0000000
--- a/public/data/thumb/themeRiver-lastfm.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-basic.jpg b/public/data/thumb/tree-basic.jpg
deleted file mode 100644
index aa19f28..0000000
--- a/public/data/thumb/tree-basic.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-legend.jpg b/public/data/thumb/tree-legend.jpg
deleted file mode 100644
index e47d0db..0000000
--- a/public/data/thumb/tree-legend.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-orient-bottom-top.jpg b/public/data/thumb/tree-orient-bottom-top.jpg
deleted file mode 100644
index 30b3d63..0000000
--- a/public/data/thumb/tree-orient-bottom-top.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-orient-right-left.jpg b/public/data/thumb/tree-orient-right-left.jpg
deleted file mode 100644
index 173cc9b..0000000
--- a/public/data/thumb/tree-orient-right-left.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-polyline.jpg b/public/data/thumb/tree-polyline.jpg
deleted file mode 100644
index 4f93eff..0000000
--- a/public/data/thumb/tree-polyline.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-radial.jpg b/public/data/thumb/tree-radial.jpg
deleted file mode 100644
index 9befafc..0000000
--- a/public/data/thumb/tree-radial.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/tree-vertical.jpg b/public/data/thumb/tree-vertical.jpg
deleted file mode 100644
index cf271eb..0000000
--- a/public/data/thumb/tree-vertical.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-disk.jpg b/public/data/thumb/treemap-disk.jpg
deleted file mode 100644
index 6658ab4..0000000
--- a/public/data/thumb/treemap-disk.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-drill-down.jpg b/public/data/thumb/treemap-drill-down.jpg
deleted file mode 100644
index a9f1540..0000000
--- a/public/data/thumb/treemap-drill-down.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-obama.jpg b/public/data/thumb/treemap-obama.jpg
deleted file mode 100644
index 278bacc..0000000
--- a/public/data/thumb/treemap-obama.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-show-parent.jpg b/public/data/thumb/treemap-show-parent.jpg
deleted file mode 100644
index ded9568..0000000
--- a/public/data/thumb/treemap-show-parent.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-simple.jpg b/public/data/thumb/treemap-simple.jpg
deleted file mode 100644
index e45a22d..0000000
--- a/public/data/thumb/treemap-simple.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/treemap-visual.jpg b/public/data/thumb/treemap-visual.jpg
deleted file mode 100644
index 2dd5fba..0000000
--- a/public/data/thumb/treemap-visual.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/watermark.jpg b/public/data/thumb/watermark.jpg
deleted file mode 100644
index 87119ff..0000000
--- a/public/data/thumb/watermark.jpg
+++ /dev/null
Binary files differ
diff --git a/public/data/thumb/wind-barb.jpg b/public/data/thumb/wind-barb.jpg
deleted file mode 100644
index a51a483..0000000
--- a/public/data/thumb/wind-barb.jpg
+++ /dev/null
Binary files differ
diff --git a/public/en/index.html b/public/en/index.html
index ce9241e..31a4ee6 100644
--- a/public/en/index.html
+++ b/public/en/index.html
@@ -13,31 +13,6 @@
             padding: 0;
         }
 
-        ::-webkit-scrollbar {
-            height: 8px;
-            width: 8px;
-            -webkit-transition: all 0.3s ease-in-out;
-            transition: all 0.3s ease-in-out;
-            border-radius: 2px
-        }
-
-        ::-webkit-scrollbar-button {
-            display: none
-        }
-
-        ::-webkit-scrollbar-thumb {
-            width: 8px;
-            min-height: 15px;
-            background: rgba(50, 50, 50, 0.3) !important;
-            -webkit-transition: all 0.3s ease-in-out;
-            transition: all 0.3s ease-in-out;
-            border-radius: 2px
-        }
-
-        ::-webkit-scrollbar-thumb:hover {
-            background: rgba(0, 0, 0, 0.5) !important
-        }
-
     </style>
     <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
     <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
diff --git a/public/screenshot.html b/public/screenshot.html
deleted file mode 100644
index 18208c6..0000000
--- a/public/screenshot.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lodash@3.10.1/index.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/echarts.js"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/map/js/china.js?_v_=1510583857922"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/map/js/world.js?_v_=1510583857922"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/extension/dataTool.js?_v_=1510583857922"></script>
-    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&amp;ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/extension/bmap.js?_v_=1510583857922"></script>
-    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
-    <script type="text/javascript" src="../tool/seedrandom.js"></script>
-    <style>
-        html, body {
-            margin: 0;
-            overflow: hidden;
-        }
-        #viewport {
-            position: absolute;
-            left: 0px;
-            top: 0px;
-            right: 0px;
-            bottom: 0px;
-        }
-    </style>
-</head>
-<body>
-<div id="viewport"></div>
-<script>
-    // Params parser
-    var params = {};
-    (location.search || '').substr(1).split('&').forEach(function (item) {
-        var kv = item.split('=');
-        params[kv[0]] = kv[1];
-    });
-
-    var myChart = echarts.init(document.getElementById('viewport'), params.t || null);
-    var app = {};
-</script>
-<script>
-    var myrng = new Math.seedrandom('echarts');
-    Math.random = function () {
-        return myrng();
-    };
-
-    $.getJSON = function (url, cb) {
-        const deferred = $.Deferred();
-        readLocalFile(url).then(data => {
-            data = JSON.parse(data);
-            cb && cb(data);
-
-            deferred.resolve([data]);
-        });
-        return deferred;
-    }
-
-    $.get = function (url, cb) {
-        const deferred = $.Deferred();
-        readLocalFile(url).then(data => {
-            try {
-                data = JSON.parse(data);
-            }
-            catch(e) {}
-
-            cb(data);
-            deferred.resolve([data]);
-        });
-        return deferred;
-    }
-
-    function addComponentPadding(componentOpt) {
-        if (!componentOpt) {
-            return;
-        }
-        if (!(componentOpt instanceof Array)) {
-            componentOpt = [componentOpt];
-        }
-        componentOpt.forEach(function (opt) {
-            if (!opt.padding) {
-                opt.padding = 15;
-            }
-        });
-    }
-
-    echarts.registerPreprocessor(function (option) {
-        option.animation = false;
-        // option.textStyle = {
-        //     fontSize: 14
-        // };
-        if (option.series) {
-            if (!(option.series instanceof Array)) {
-                option.series = [option.series];
-            }
-            option.series.forEach(function (seriesOpt) {
-                if (seriesOpt.type === 'graph') {
-                    seriesOpt.force = seriesOpt.force || {};
-                    seriesOpt.force.layoutAnimation = false;
-                }
-                seriesOpt.progressive = 1e5;
-                seriesOpt.animation = false;
-            });
-        }
-        addComponentPadding(option.title);
-        addComponentPadding(option.legend);
-        addComponentPadding(option.toolbox);
-    });
-
-    if (params.c) {
-        if (!window.ROOT_PATH) {
-            // When visiting `screenshot.html` In browser.
-            console.error('No ROOT_PATH specified. Use default ROOT_PATH "."');
-            window.ROOT_PATH = '.';
-        }
-        var sourceFolder = params.s || 'data';
-        var scriptTag = document.createElement('script');
-        scriptTag.async = false;
-        scriptTag.src = `./${sourceFolder}/${params.c}.js`
-        document.body.appendChild(scriptTag);
-
-        scriptTag.onload = function () {
-            if (typeof option !== 'undefined' && option) {
-                myChart.setOption(option);
-            }
-        }
-    }
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/public/zh/index.html b/public/zh/index.html
index 6198bce..4d534de 100644
--- a/public/zh/index.html
+++ b/public/zh/index.html
@@ -13,31 +13,6 @@
             padding: 0;
         }
 
-        ::-webkit-scrollbar {
-            height: 8px;
-            width: 8px;
-            -webkit-transition: all 0.3s ease-in-out;
-            transition: all 0.3s ease-in-out;
-            border-radius: 2px
-        }
-
-        ::-webkit-scrollbar-button {
-            display: none
-        }
-
-        ::-webkit-scrollbar-thumb {
-            width: 8px;
-            min-height: 15px;
-            background: rgba(50, 50, 50, 0.3) !important;
-            -webkit-transition: all 0.3s ease-in-out;
-            transition: all 0.3s ease-in-out;
-            border-radius: 2px
-        }
-
-        ::-webkit-scrollbar-thumb:hover {
-            background: rgba(0, 0, 0, 0.5) !important
-        }
-
     </style>
     <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css">
     <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css">
diff --git a/src/asset/chart-icon.png b/src/asset/chart-icon.png
deleted file mode 100644
index d0fc8a3..0000000
--- a/src/asset/chart-icon.png
+++ /dev/null
Binary files differ
diff --git a/src/asset/chart-icon.psd b/src/asset/chart-icon.psd
deleted file mode 100644
index c2fbf5e..0000000
--- a/src/asset/chart-icon.psd
+++ /dev/null
Binary files differ
diff --git a/src/asset/icon/bar.svg b/src/asset/icon/bar.svg
new file mode 100644
index 0000000..c77a317
--- /dev/null
+++ b/src/asset/icon/bar.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="138px" viewBox="0 0 175 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>bar</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="bar" fill="#5067A2" fill-rule="nonzero">
+            <path d="M121.488231,0 L102.050114,0 C99.36627,-1.1969592e-16 97.1905846,2.17568537 97.1905846,4.85952929 L97.1905846,133.140471 C97.1905846,135.824315 99.36627,138 102.050114,138 L121.488231,138 C124.172075,138 126.34776,135.824315 126.34776,133.140471 L126.34776,4.85952929 C126.34776,2.17568537 124.172075,1.1969592e-16 121.488231,0 Z M170.083523,30.1571753 L150.645406,30.1571753 C147.961562,30.1571753 145.785877,32.3328607 145.785877,35.0167046 L145.785877,132.207289 C145.785877,134.891133 147.961562,137.066819 150.645406,137.066819 L170.083523,137.066819 C172.767367,137.066819 174.943052,134.891133 174.943052,132.207289 L174.943052,35.0167046 C174.943052,32.3328607 172.767367,30.1571753 170.083523,30.1571753 Z M53.4548215,39.8762339 C50.7709777,39.876234 48.5952924,42.0519193 48.5952924,44.7357631 L48.5952924,132.207289 C48.5952924,134.891133 50.7709777,137.066818 53.4548215,137.066819 L72.8929386,137.066819 C75.5767824,137.066818 77.7524677,134.891133 77.7524677,132.207289 L77.7524677,44.7357631 C77.7524676,42.0519193 75.5767824,39.876234 72.8929386,39.8762339 L53.4548215,39.8762339 Z M29.1571753,67.17388 L29.1571753,132.207289 C29.1571753,134.891133 26.9814901,137.066818 24.2976462,137.066819 L4.85952929,137.066819 C2.17568537,137.066819 3.28676086e-16,134.891133 0,132.207289 L0,67.17388 C7.33863613e-08,64.4900361 2.17568542,62.3143508 4.85952929,62.3143508 L24.2976462,62.3143508 C26.98149,62.3143509 29.1571753,64.4900362 29.1571753,67.17388 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/boxplot.svg b/src/asset/icon/boxplot.svg
new file mode 100644
index 0000000..c84f920
--- /dev/null
+++ b/src/asset/icon/boxplot.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="98px" viewBox="0 0 175 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>boxplot</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="boxplot" fill="#5067A2" fill-rule="nonzero">
+            <path d="M165.206074,4.85900217 L165.206074,43.7310195 L145.770065,43.7310195 L145.770065,14.5770065 C145.770065,11.8934537 143.594616,9.71800434 140.911063,9.71800434 L72.8850325,9.71800434 C70.2014797,9.71800434 68.0260304,11.8934537 68.0260304,14.5770065 L68.0260304,82.6030369 C68.0260304,85.2865897 70.2014797,87.462039 72.8850325,87.462039 L140.911063,87.462039 C143.594616,87.462039 145.770065,85.2865897 145.770065,82.6030369 L145.770065,53.4490239 L165.206074,53.4490239 L165.206074,92.3210412 C165.206074,95.004594 167.381523,97.1800434 170.065076,97.1800434 C172.748629,97.1800434 174.924078,95.004594 174.924078,92.3210412 L174.924078,4.85900217 C174.924078,2.17544937 172.748629,1.43751749e-14 170.065076,1.42108547e-14 C167.381523,-1.05827854e-15 165.206074,2.17544937 165.206074,4.85900217 Z M58.308026,14.5770065 L58.308026,82.6030369 C58.308026,83.8917244 57.7960969,85.1276306 56.8848572,86.0388703 C55.9736176,86.9501099 54.7377114,87.462039 53.4490239,87.462039 L34.0130152,87.462039 C31.3294624,87.462039 29.154013,85.2865897 29.154013,82.6030369 L29.154013,53.4490239 L9.71800434,53.4490239 L9.71800434,92.3210412 C9.71800434,95.004594 7.54255497,97.1800434 4.85900217,97.1800434 C2.17544937,97.1800434 3.28640434e-16,95.004594 0,92.3210412 L0,4.85900217 C-3.28640434e-16,2.17544937 2.17544937,4.31255248e-14 4.85900217,4.26325641e-14 C7.54255497,4.21396035e-14 9.71800434,2.17544937 9.71800434,4.85900217 L9.71800434,43.7310195 L29.154013,43.7310195 L29.154013,14.5770065 C29.154013,11.8934537 31.3294624,9.71800434 34.0130152,9.71800434 L53.4490239,9.71800434 C56.1325767,9.71800434 58.308026,11.8934537 58.308026,14.5770065 L58.308026,14.5770065 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/calendar.svg b/src/asset/icon/calendar.svg
new file mode 100644
index 0000000..544d591
--- /dev/null
+++ b/src/asset/icon/calendar.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="164px" height="138px" viewBox="0 0 164 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>calendar </title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="calendar-" transform="translate(-0.500000, -0.315789)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M147.236842,56.3782895 C147.236842,53.9965615 145.304597,52.0657895 142.921053,52.0657895 L125.657895,52.0657895 C123.27435,52.0657895 121.342105,53.9965615 121.342105,56.3782895 L121.342105,65.0032895 C121.342105,67.3850175 123.27435,69.3157895 125.657895,69.3157895 L142.921053,69.3157895 C145.304597,69.3157895 147.236842,67.3850175 147.236842,65.0032895 L147.236842,56.3782895 Z M147.236842,82.2532895 C147.236842,79.8715615 145.304597,77.9407895 142.921053,77.9407895 L125.657895,77.9407895 C123.27435,77.9407895 121.342105,79.8715615 121.342105,82.2532895 L121.342105,90.8782895 C121.342105,93.2600175 123.27435,95.1907895 125.657895,95.1907895 L142.921053,95.1907895 C145.304597,95.1907895 147.236842,93.2600175 147.236842,90.8782895 L147.236842,82.2532895 Z M112.710526,56.3782895 C112.710526,53.9965615 110.778282,52.0657895 108.394737,52.0657895 L91.1315789,52.0657895 C88.7480342,52.0657895 86.8157895,53.9965615 86.8157895,56.3782895 L86.8157895,65.0032895 C86.8157895,67.3850175 88.7480342,69.3157895 91.1315789,69.3157895 L108.394737,69.3157895 C110.778282,69.3157895 112.710526,67.3850175 112.710526,65.0032895 L112.710526,56.3782895 Z M112.710526,82.2532895 C112.710526,79.8715615 110.778282,77.9407895 108.394737,77.9407895 L91.1315789,77.9407895 C88.7480342,77.9407895 86.8157895,79.8715615 86.8157895,82.2532895 L86.8157895,90.8782895 C86.8157895,93.2600175 88.7480342,95.1907895 91.1315789,95.1907895 L108.394737,95.1907895 C110.778282,95.1907895 112.710526,93.2600175 112.710526,90.8782895 L112.710526,82.2532895 Z M112.710526,108.128289 C112.710526,105.746561 110.778282,103.815789 108.394737,103.815789 L91.1315789,103.815789 C88.7480342,103.815789 86.8157895,105.746561 86.8157895,108.128289 L86.8157895,116.753289 C86.8157895,119.135017 88.7480342,121.065789 91.1315789,121.065789 L108.394737,121.065789 C110.778282,121.065789 112.710526,119.135017 112.710526,116.753289 L112.710526,108.128289 Z M78.1842105,56.3782895 C78.1842105,53.9965615 76.2519658,52.0657895 73.8684211,52.0657895 L56.6052632,52.0657895 C54.2217184,52.0657895 52.2894737,53.9965615 52.2894737,56.3782895 L52.2894737,65.0032895 C52.2894737,67.3850175 54.2217184,69.3157895 56.6052632,69.3157895 L73.8684211,69.3157895 C76.2519658,69.3157895 78.1842105,67.3850175 78.1842105,65.0032895 L78.1842105,56.3782895 Z M78.1842105,82.2532895 C78.1842105,79.8715615 76.2519658,77.9407895 73.8684211,77.9407895 L56.6052632,77.9407895 C54.2217184,77.9407895 52.2894737,79.8715615 52.2894737,82.2532895 L52.2894737,90.8782895 C52.2894737,93.2600175 54.2217184,95.1907895 56.6052632,95.1907895 L73.8684211,95.1907895 C76.2519658,95.1907895 78.1842105,93.2600175 78.1842105,90.8782895 L78.1842105,82.2532895 Z M78.1842105,108.128289 C78.1842105,105.746561 76.2519658,103.815789 73.8684211,103.815789 L56.6052632,103.815789 C54.2217184,103.815789 52.2894737,105.746561 52.2894737,108.128289 L52.2894737,116.753289 C52.2894737,119.135017 54.2217184,121.065789 56.6052632,121.065789 L73.8684211,121.065789 C76.2519658,121.065789 78.1842105,119.135017 78.1842105,116.753289 L78.1842105,108.128289 Z M43.6578947,82.2532895 C43.6578947,79.8715615 41.72565,77.9407895 39.3421053,77.9407895 L22.0789474,77.9407895 C19.6954027,77.9407895 17.7631579,79.8715615 17.7631579,82.2532895 L17.7631579,90.8782895 C17.7631579,93.2600175 19.6954027,95.1907895 22.0789474,95.1907895 L39.3421053,95.1907895 C41.72565,95.1907895 43.6578947,93.2600175 43.6578947,90.8782895 L43.6578947,82.2532895 Z M43.6578947,108.128289 C43.6578947,105.746561 41.72565,103.815789 39.3421053,103.815789 L22.0789474,103.815789 C19.6954027,103.815789 17.7631579,105.746561 17.7631579,108.128289 L17.7631579,116.753289 C17.7631579,119.135017 19.6954027,121.065789 22.0789474,121.065789 L39.3421053,121.065789 C41.72565,121.065789 43.6578947,119.135017 43.6578947,116.753289 L43.6578947,108.128289 Z M164.5,39.1282895 L164.5,134.003289 C164.5,136.385017 162.567755,138.315789 160.184211,138.315789 L4.81578947,138.315789 C2.43224476,138.315789 0.5,136.385017 0.5,134.003289 L0.5,39.1282895 C0.5,36.7465615 2.43224476,34.8157895 4.81578947,34.8157895 L160.184211,34.8157895 C162.567755,34.8157895 164.5,36.7465615 164.5,39.1282895 Z M164.5,4.62828947 L164.5,21.8782895 C164.5,24.2600175 162.567755,26.1907895 160.184211,26.1907895 L4.81578947,26.1907895 C2.43224476,26.1907895 0.5,24.2600175 0.5,21.8782895 L0.5,4.62828947 C0.5,2.24656149 2.43224476,0.315789474 4.81578947,0.315789474 L160.184211,0.315789474 C162.567755,0.315789474 164.5,2.24656149 164.5,4.62828947 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/candlestick.svg b/src/asset/icon/candlestick.svg
new file mode 100644
index 0000000..fee8251
--- /dev/null
+++ b/src/asset/icon/candlestick.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="138px" viewBox="0 0 175 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>Candlestick (1)</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Candlestick-(1)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M121.508001,34.0222403 L116.647681,33.0222403 L116.647681,4.86032 C116.647681,2.17603934 114.471642,-7.11961547e-08 111.787361,-7.11961549e-08 C109.10308,-7.1196155e-08 106.927041,2.17603934 106.927041,4.86032 L106.927041,33.0222403 L102.066721,33.0222403 C100.777684,33.0222403 99.5414424,33.5343082 98.6299556,34.4457951 C97.7184688,35.3572819 97.2064009,36.5935234 97.2064009,37.8825604 L97.2064009,105.927041 C97.2064009,107.216078 97.7184688,108.452319 98.6299556,109.363806 C99.5414424,110.275293 100.777684,110.787361 102.066721,110.787361 L106.927041,110.787361 L106.927041,125.572455 C106.927041,128.256735 109.10308,130.432775 111.787361,130.432775 C114.471642,130.432775 116.647681,128.256735 116.647681,125.572455 L116.647681,110.787361 L121.508001,110.787361 C122.797038,110.787361 124.03328,110.275293 124.944766,109.363806 C125.856253,108.452319 126.368321,107.216078 126.368321,105.927041 L126.368321,37.8825604 C126.368321,36.5935233 125.856253,35.3572819 124.944766,34.445795 C124.03328,33.5343082 122.797038,33.0222402 121.508001,33.0222403 L121.508001,34.0222403 Z M170.111202,41.6032004 L165.250881,41.6032004 L165.250881,27.0222403 C165.250881,24.3379598 163.074842,22.1619207 160.390561,22.1619207 C157.706281,22.1619207 155.530242,24.3379598 155.530241,27.0222403 L155.530241,41.6032004 L150.669921,41.6032004 C149.380884,41.6032004 148.144643,42.1152684 147.233156,43.0267552 C146.321669,43.938242 145.809601,45.1744835 145.809601,46.4635205 L145.809601,75.6254408 C145.809601,78.3097214 147.985641,80.4857608 150.669921,80.4857608 L155.530241,80.4857608 L155.530241,104.729037 C155.530241,107.413318 157.706281,109.589357 160.390561,109.589357 C163.074842,109.589357 165.250881,107.413318 165.250881,104.729037 L165.250881,80.4857608 L170.111202,80.4857608 C172.795482,80.4857608 174.971522,78.3097214 174.971522,75.6254408 L174.971522,46.4635205 C174.971522,45.1744835 174.459454,43.938242 173.547967,43.0267552 C172.63648,42.1152684 171.400239,41.6032004 170.111202,41.6032004 L170.111202,41.6032004 Z M72.9048007,84.3460808 L68.0444807,84.3460808 L68.0444807,55.1841605 C68.0444805,52.4998799 65.8684412,50.3238407 63.1841606,50.3238407 C60.49988,50.3238407 58.3238406,52.4998799 58.3238405,55.1841605 L58.3238405,84.3460808 L53.4635205,84.3460808 C52.1744835,84.3460807 50.938242,84.8581487 50.0267552,85.7696355 C49.1152683,86.6811224 48.6032003,87.9173639 48.6032004,89.2064009 L48.6032004,118.368321 C48.6032004,119.657358 49.1152684,120.8936 50.0267552,121.805086 C50.938242,122.716573 52.1744835,123.228641 53.4635205,123.228641 L58.3238405,123.228641 L58.3238405,132.949281 C58.3238406,135.633562 60.49988,137.809601 63.1841606,137.809601 C65.8684412,137.809601 68.0444805,135.633562 68.0444807,132.949281 L68.0444807,123.228641 L72.9048007,123.228641 C75.5890813,123.228641 77.7651206,121.052602 77.7651206,118.368321 L77.7651206,89.2064009 C77.7651207,87.9173639 77.2530527,86.6811224 76.3415659,85.7696356 C75.4300791,84.8581488 74.1938377,84.3460808 72.9048007,84.3460808 Z M29.1619203,41.6032004 L29.1619203,90.2064009 C29.1619203,92.8906815 26.9858809,95.0667209 24.3016003,95.0667209 L19.4412801,95.0667209 L19.4412801,119.572455 C19.4412801,122.256735 17.2652407,124.432775 14.5809601,124.432775 C11.8966795,124.432775 9.72064013,122.256735 9.72064013,119.572455 L9.72064013,95.0667209 L4.86032,95.0667209 C2.17603938,95.0667209 3.28729566e-16,92.8906815 0,90.2064009 L0,41.6032004 C-3.28729566e-16,38.9189198 2.17603938,36.7428804 4.86032,36.7428804 L9.72064013,36.7428804 L9.72064013,12.4412801 C9.72064013,9.75699951 11.8966795,7.58096013 14.5809601,7.58096013 C17.2652407,7.58096013 19.4412801,9.75699951 19.4412801,12.4412801 L19.4412801,36.7428804 L24.3016003,36.7428804 C26.9858809,36.7428804 29.1619203,38.9189198 29.1619203,41.6032004 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/custom.svg b/src/asset/icon/custom.svg
new file mode 100644
index 0000000..54741b4
--- /dev/null
+++ b/src/asset/icon/custom.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="159px" height="142px" viewBox="0 0 159 142" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>custom</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="custom" transform="translate(0.000000, -0.825151)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M74.8235294,81.2918174 L74.8235294,138.091817 C74.8235294,140.705965 72.7298022,142.825151 70.1470588,142.825151 L4.67647054,142.825151 C2.09372718,142.825151 3.16294839e-16,140.705965 0,138.091817 L0,81.2918174 C-3.63362476e-08,80.0364594 0.492698108,78.8325175 1.36970646,77.9448453 C2.24671482,77.0571731 3.43619342,76.558484 4.67647054,76.558484 L70.1470588,76.558484 C71.387336,76.558484 72.5768146,77.0571731 73.4538229,77.9448453 C74.3308313,78.8325175 74.8235294,80.0364594 74.8235294,81.2918174 Z M74.8235294,5.55848402 L74.8235294,62.358484 C74.8235294,63.6138421 74.3308313,64.817784 73.4538229,65.7054562 C72.5768146,66.5931284 71.387336,67.0918174 70.1470588,67.0918174 L4.67647054,67.0918174 C3.43619342,67.0918174 2.24671482,66.5931284 1.36970646,65.7054562 C0.492698108,64.817784 -3.63362423e-08,63.6138421 0,62.358484 L0,5.55848402 C-2.35506485e-15,4.30312598 0.492698161,3.09918414 1.36970651,2.21151195 C2.24671486,1.32383977 3.43619344,0.825150732 4.67647054,0.825150732 L70.1470588,0.825150732 C72.7298022,0.825150732 74.8235294,2.94433623 74.8235294,5.55848402 Z M159,10.2918174 L159,57.6251507 C159,62.8534463 154.812546,67.0918174 149.647059,67.0918174 L93.5294118,67.0918174 C88.363925,67.0918174 84.1764706,62.8534464 84.1764706,57.6251507 L84.1764706,10.2918174 C84.1764706,5.06352179 88.363925,0.825150732 93.5294118,0.825150732 L149.647059,0.825150732 C154.812546,0.825150809 159,5.06352184 159,10.2918174 Z M154.323529,76.558484 C155.563807,76.558484 156.753285,77.0571731 157.630294,77.9448453 C158.507302,78.8325175 159,80.0364594 159,81.2918174 L159,138.091817 C159,140.705965 156.906273,142.825151 154.323529,142.825151 L88.8529412,142.825151 C86.2701978,142.825151 84.1764706,140.705965 84.1764706,138.091817 L84.1764706,81.2918174 C84.1764706,80.0364594 84.6691687,78.8325175 85.5461771,77.9448453 C86.4231854,77.0571731 87.612664,76.558484 88.8529412,76.558484 L154.323529,76.558484 L154.323529,76.558484 Z M93.5294118,133.358484 L149.647059,133.358484 L149.647059,86.0251507 L93.5294118,86.0251507 L93.5294118,133.358484 L93.5294118,133.358484 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/dataZoom.svg b/src/asset/icon/dataZoom.svg
new file mode 100644
index 0000000..f0013fe
--- /dev/null
+++ b/src/asset/icon/dataZoom.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="83px" viewBox="0 0 175 83" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>dataZoom</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dataZoom" fill="#5067A2" fill-rule="nonzero">
+            <path d="M9.20037003,18.4191593 L9.20957963,13.8143694 L9.20957963,18.4191593 L41.4431082,18.4191593 L41.4431082,64.4670572 L9.20957963,64.4670572 L9.20957963,18.4191593 L9.20037003,18.4191593 Z M133.538904,64.4670572 L133.538904,18.4191593 L165.772433,18.4191593 L165.772433,64.4670572 L133.538904,64.4670572 L133.538904,64.4670572 Z M165.772433,9.20957963 L133.538904,9.20957963 L133.538904,4.60478981 C133.538904,2.06163473 131.47727,2.74466854e-07 128.934115,2.74466854e-07 C126.390959,2.74466855e-07 124.329325,2.06163473 124.329325,4.60478981 L124.329325,9.20957963 L50.6526879,9.20957963 L50.6526879,4.60478981 C50.6526879,2.06163462 48.5910532,-6.1602121e-15 46.047898,-6.31593544e-15 C43.5047429,-6.47165878e-15 41.4431082,2.06163462 41.4431082,4.60478981 L41.4431082,9.20957963 L9.20957963,9.20957963 C4.13510123,9.20957963 0,13.3446809 0,18.4191593 L0,64.4670572 C0,69.5507451 4.13510123,73.6766368 9.20957963,73.6766368 L41.4431082,73.6766368 L41.4431082,78.2814267 C41.4431082,80.8245818 43.5047429,82.8862165 46.047898,82.8862165 C48.5910532,82.8862165 50.6526879,80.8245818 50.6526879,78.2814267 L50.6526879,73.6766368 L124.329325,73.6766368 L124.329325,78.2814267 C124.329325,80.8245818 126.390959,82.8862165 128.934115,82.8862165 C131.47727,82.8862165 133.538904,80.8245818 133.538904,78.2814267 L133.538904,73.6766368 L165.772433,73.6766368 C170.858743,73.6766368 174.982013,69.5533676 174.982013,64.4670572 L174.982013,18.4191593 C174.982013,13.3446809 170.856121,9.20957963 165.772433,9.20957963 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/dataset.svg b/src/asset/icon/dataset.svg
new file mode 100644
index 0000000..39be190
--- /dev/null
+++ b/src/asset/icon/dataset.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="145px" height="157px" viewBox="0 0 145 157" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>dataset</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dataset" fill="#5067A2" fill-rule="nonzero">
+            <path d="M77,133.051622 C77,135.720999 74.7614237,137.884956 72,137.884956 C69.2385763,137.884956 67,135.720999 67,133.051622 L67,92.7182891 C67,90.0489128 69.2385763,87.8849558 72,87.8849558 C74.7614237,87.8849558 77,90.0489128 77,92.7182891 L77,133.051622 Z M87,92.7182888 C87.0000002,90.0489126 89.2385764,87.8849558 92,87.8849558 C94.7614236,87.8849558 96.9999998,90.0489126 97,92.7182888 L97,133.051623 C96.9999998,135.720999 94.7614236,137.884956 92,137.884956 C89.2385764,137.884956 87.0000002,135.720999 87,133.051623 L87,92.7182888 Z M58,133.072456 C58,135.730326 55.7614237,137.884956 53,137.884956 C50.2385763,137.884956 48,135.730326 48,133.072456 L48,73.6974557 C48,71.0395854 50.2385763,68.8849558 53,68.8849558 C55.7614237,68.8849558 58,71.0395854 58,73.6974557 L58,133.072456 Z M39,133.066774 C38.9999999,135.727782 36.7614237,137.884956 34,137.884956 C31.2385763,137.884956 29.0000001,135.727782 29,133.066774 L29,44.7031376 C29,42.0421293 31.2385763,39.8849558 34,39.8849558 C36.7614237,39.8849558 39,42.0421293 39,44.7031376 L39,133.066774 Z M126.3,132.884956 L126.3,63.9913737 C126.403893,62.6917747 125.897136,61.4145164 124.9129,60.4952543 L83.0962,21.7192841 C82.9895,21.6282393 82.8537001,21.5918214 82.7469999,21.5098811 C81.8447692,20.5509026 80.5501183,19.997952 79.1870999,19.9894333 L39,19.9894333 L39,10.8849558 L135.9903,10.8849558 L136,132.884956 L126.3,132.884956 Z M116,146.884956 L10,146.884956 L10,28.8849558 L74.0143636,28.8849558 L74.0143636,58.8841865 C74.0143636,63.8855711 78.3314545,67.9611095 83.6507272,67.9611097 L116,67.9611097 L116,146.884956 Z M144.990333,10.0614263 C144.990333,5.00519104 140.659667,0.884955752 135.323667,0.884955752 L38.6666667,0.884955752 C33.3403334,0.884955752 29.0000001,5.00519104 28.9999999,10.0614263 L28.9999999,19.2378969 L9.66666665,19.2378969 C4.34033332,19.2378969 0,23.3581322 0,28.4143675 L0,147.708485 C0,152.773897 4.34033332,156.884956 9.66666665,156.884956 L116,156.884956 C121.338753,156.884956 125.666667,152.77651 125.666667,147.708485 L125.666667,142.202603 L135.333333,142.202603 C140.672086,142.202603 145,138.094157 145,133.026132 L144.990333,10.0614263 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/drag.svg b/src/asset/icon/drag.svg
new file mode 100644
index 0000000..d42a2bf
--- /dev/null
+++ b/src/asset/icon/drag.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="159px" viewBox="0 0 175 159" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>drag</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="drag" transform="translate(0.000000, 0.000000)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M174.799112,77.2243509 C175.141784,80.4933122 173.860538,83.7226514 171.369927,85.8675022 L145.821493,107.665891 C143.704571,109.29545 140.681703,108.978807 138.948417,106.945941 C137.215132,104.913075 137.380357,101.878162 139.32409,100.045479 L158.345038,83.8019696 L92.4385031,83.8019696 L92.4385031,144.173679 L109.273597,130.085944 C111.397298,128.30558 114.562167,128.583909 116.342532,130.70761 C118.122896,132.83131 117.844567,135.99618 115.720867,137.776544 L93.3308935,156.516741 C89.5429956,159.697467 83.9995074,159.633553 80.2859517,156.366338 L59.0490671,137.706356 C57.140269,135.840194 57.0244102,132.80703 58.7852891,130.800695 C60.546168,128.79436 63.5687212,128.515654 65.6667932,130.166159 L82.4116455,144.885586 L82.4116455,83.8019696 L16.5051101,83.8019696 L35.5360859,100.045479 C36.9700273,101.186546 37.6671397,103.019075 37.3541473,104.824694 C37.041155,106.630312 35.7679333,108.121296 34.0335988,108.713163 C32.2992644,109.305031 30.380183,108.903467 29.0286553,107.665891 L3.52032945,85.8975828 C1.25557692,83.9644222 -0.0328273042,81.1246883 0.00397844461,78.147297 C0.0407841935,75.1699056 1.39899211,72.3628885 3.71083975,70.4863026 L29.118897,49.820949 C31.2816477,48.328475 34.2285594,48.7508003 35.8850928,50.7906204 C37.5416262,52.8304405 37.3503183,55.8013071 35.4458442,57.6118174 L15.5625855,73.7751119 L82.4116455,73.7751119 L82.4116455,14.1153089 L65.6667932,28.8347359 C64.3276607,30.0598688 62.43094,30.4655542 60.7078175,29.8954003 C58.9846951,29.3252464 57.7042897,27.8683002 57.360198,26.0862151 C57.0161064,24.30413 57.662069,22.4752334 59.0490671,21.3045658 L80.2759248,2.65461056 C83.9853287,-0.629787191 89.5418994,-0.698070701 93.3308935,2.49418084 L115.720867,21.2243509 C117.320514,22.5881211 117.904229,24.8023516 117.184781,26.777481 C116.465334,28.7526104 114.594242,30.0726692 112.492218,30.0880931 C111.314421,30.0896881 110.174126,29.6740664 109.273597,28.9149508 L92.4385031,14.8272158 L92.4385031,73.7751119 L159.29759,73.7751119 L139.414331,57.6118174 C138.022627,56.4816171 137.339593,54.6948034 137.622523,52.9244518 C137.905453,51.1541001 139.111362,49.669169 140.785997,49.0290176 C142.460631,48.3888662 144.349574,48.6907487 145.741278,49.820949 L171.149336,70.4863026 C173.218763,72.1532673 174.533435,74.5803549 174.799112,77.2243509" id="Path"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/funnel.svg b/src/asset/icon/funnel.svg
new file mode 100644
index 0000000..dd0ab02
--- /dev/null
+++ b/src/asset/icon/funnel.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="137px" viewBox="0 0 175 137" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>funnel </title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="funnel-" fill="#5067A2" fill-rule="nonzero">
+            <path d="M116.331467,108.325366 L60.5285591,108.325366 C58.9291301,108.325102 57.4459378,109.160985 56.6178211,110.52934 C55.7897045,111.897695 55.7371711,113.5994 56.4793063,115.016231 L66.3876358,133.863994 C67.1750739,135.367321 68.7306799,136.310539 70.4277481,136.313655 L106.432278,136.313655 C108.129346,136.310539 109.684952,135.367321 110.47239,133.863994 L120.380719,115.016231 C121.122854,113.5994 121.070321,111.897695 120.242204,110.52934 C119.414088,109.160985 117.930896,108.325102 116.331467,108.325366 L116.331467,108.325366 Z M134.968998,71.0137414 L41.9001683,71.0137414 C40.2925309,71.0025161 38.7981975,71.8401445 37.9688482,73.2173896 C37.139499,74.5946346 37.098146,76.3072185 37.8600561,77.722887 L47.8415098,96.5706503 C48.6348072,98.0648166 50.1899261,98.9971843 51.881622,98.9928896 L125.024106,98.9928896 C126.716211,98.9981743 128.270437,98.0607046 129.055078,96.5615098 L139.00911,77.7137465 C139.754942,76.2976526 139.705659,74.5945859 138.879188,73.2239903 C138.052717,71.8533948 136.569493,71.014997 134.968998,71.0137414 L134.968998,71.0137414 Z M153.63395,35.5759245 L23.2352156,35.5759245 C21.6347203,35.5771801 20.151496,36.4155778 19.325025,37.7861734 C18.498554,39.156769 18.4492717,40.8598357 19.1951033,42.2759296 L29.1491354,61.1145524 C29.9359394,62.6172637 31.4930184,63.5578521 33.1892477,63.5550727 L143.70734,63.5550727 C145.402425,63.5537423 146.957543,62.6143387 147.747452,61.1145524 L157.674063,42.266789 C158.415446,40.8514003 158.363824,39.1515952 157.537917,37.7838041 C156.712011,36.4160129 155.231751,35.5788553 153.63395,35.5759245 L153.63395,35.5759245 Z M174.995358,4.69922974 C174.994253,5.44166711 174.81229,6.17265769 174.465208,6.82897225 L164.538597,25.6767355 C163.746223,27.1729824 162.191592,28.108575 160.498485,28.1081153 L14.4968732,28.1081153 C12.8031994,28.1106197 11.2475937,27.1744407 10.4567611,25.6767355 L0.530150516,6.82897225 C-0.215681017,5.41287837 -0.166398756,3.70981169 0.660072225,2.33921611 C1.48654321,0.96862053 2.96976742,0.130222778 4.57026264,0.1289671 L170.425096,0.1289671 C172.949182,0.1289671 174.995358,2.17514338 174.995358,4.69922974 L174.995358,4.69922974 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/gauge.svg b/src/asset/icon/gauge.svg
new file mode 100644
index 0000000..71d2bb2
--- /dev/null
+++ b/src/asset/icon/gauge.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="100px" viewBox="0 0 175 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>gange</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="gange" fill="#5067A2" fill-rule="nonzero">
+            <path d="M143.698895,82.9089367 C142.437361,67.6655629 135.026556,53.5920156 123.171797,43.9267897 L135.7146,25.9137777 C153.409366,39.7333892 164.305583,60.4959162 165.625777,82.9089367 L143.698895,82.9089367 L143.698895,82.9089367 Z M115.601912,38.6960173 C112.342946,36.8541942 108.909619,35.339582 105.352176,34.174346 L107.654453,22.8655635 C107.981818,21.2534161 107.424245,19.5890834 106.191766,18.4995036 C104.959288,17.4099237 103.239147,17.0606298 101.679304,17.5831975 C100.119461,18.1057651 98.9568933,19.4208039 98.6295287,21.0329513 L96.4193432,31.8996968 C93.4676767,31.3974455 90.4804994,31.132603 87.4865101,31.1077136 C77.1817177,31.1042083 67.0761605,33.9468942 58.284434,39.3222365 L45.5021944,21.4934066 C70.6181595,5.43266895 102.701308,5.12868193 128.117087,20.7106326 L115.601912,38.6960173 L115.601912,38.6960173 Z M31.2649159,82.9089367 L9.34724295,82.9089367 C10.6455448,61.0475255 21.0636813,40.7358347 38.0612364,26.9267794 L50.843476,44.7464001 C39.5322634,54.3814577 32.493597,68.101229 31.2649159,82.9089367 L31.2649159,82.9089367 Z M87.4865101,0.0269797767 C39.2492112,0.0269797767 0,39.276191 0,87.5134899 C5.46353103e-08,90.0565144 2.06152873,92.118043 4.60455321,92.118043 L35.685287,92.118043 C38.2283115,92.118043 40.2898401,90.0565144 40.2898401,87.5134899 C40.315223,61.4580101 61.4310302,40.3422029 87.4865101,40.31682 C89.908505,40.31682 92.2384089,40.6759751 94.5683128,41.0351302 L86.9247546,78.6451205 C82.0531374,79.4923583 78.2774037,83.5443651 78.2774037,88.6646282 C78.2774037,94.3864333 82.9158433,99.0248728 88.6376484,99.0248728 C94.3594535,99.0248728 98.997893,94.3864333 98.997893,88.6646282 C98.997893,85.7361324 97.7546637,83.102328 95.793124,81.2236703 L103.501146,43.3005704 C121.633876,49.8942906 134.68318,67.1337376 134.68318,87.5134899 C134.68318,90.0565144 136.744709,92.118043 139.287733,92.118043 L170.368467,92.118043 C172.911491,92.118043 174.97302,90.0565144 174.97302,87.5134899 C174.97302,39.276191 135.723809,0.0269798756 87.4865101,0.0269797767 L87.4865101,0.0269797767 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/geo.svg b/src/asset/icon/geo.svg
new file mode 100644
index 0000000..4e46613
--- /dev/null
+++ b/src/asset/icon/geo.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="142px" viewBox="0 0 175 142" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>geo</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="geo" fill="#5067A2" fill-rule="nonzero">
+            <path d="M9.20332621,34.019885 L55.2181167,56.861627 L55.2181167,128.571076 L9.20332621,103.207724 L9.20332621,34.019885 Z M171.819596,50.2815119 L151.996424,43.1124076 C149.63126,42.3318353 147.074346,43.5747977 146.227189,45.9169373 C145.380032,48.2590769 146.550177,50.8501245 148.867418,51.7631882 L165.653614,57.8371405 L165.653614,131.138702 L119.638823,119.625801 L119.638823,87.4706656 C119.638823,84.9293389 117.578671,82.8691865 115.037344,82.8691865 C112.496018,82.8691865 110.435865,84.9293389 110.435865,87.4706656 L110.435865,119.644207 L64.4210748,131.41479 L64.4210748,58.2236647 L81.060023,51.7263763 C83.2914479,50.7138845 84.3410975,48.1328302 83.4496557,45.8503474 C82.5582139,43.5678645 80.037126,42.3813901 77.7101463,43.1492194 L61.2460542,49.5820871 L6.64490386,22.4793755 C5.21943693,21.7614379 3.52312776,21.8367966 2.16693957,22.6783095 C0.810751382,23.5198224 -0.00997312356,25.0062796 0.000368118324,26.6023007 L0.000368118324,105.913394 C0.000368118324,107.597535 0.91146097,109.134429 2.38393426,109.944289 L58.8072703,141.059491 C59.8287987,141.620871 61.0435892,141.795727 62.16635,141.49203 L115.046547,127.963681 L169.141535,141.501233 C170.516378,141.840666 171.970958,141.532118 173.089604,140.663763 C174.206625,139.788526 174.858383,138.44767 174.856572,137.028595 L174.856572,54.6069022 C174.855748,52.6695411 173.64154,50.9402146 171.819596,50.2815119 Z M115.037344,16.5986853 C121.13907,16.6012266 126.083435,21.5497125 126.080894,27.651438 C126.078353,33.7531634 121.129867,38.697529 115.028141,38.6949877 C108.926416,38.6924463 103.98205,33.7439604 103.984592,27.642235 C103.987133,21.5405096 108.935619,16.596144 115.037344,16.5986853 L115.037344,16.5986853 Z M99.5763747,54.7173377 C102.208421,58.3341002 105.00612,61.9140509 107.813022,65.199507 C108.806942,66.3866886 109.718035,67.4358258 110.491083,68.3285127 C111.04326,68.8806902 111.402176,69.2856204 111.558626,69.4512736 C112.438859,70.4713636 113.723372,71.0524431 115.07068,71.0400337 C116.417988,71.0276243 117.69158,70.4229833 118.552874,69.3868529 C118.72773,69.2211997 119.06824,68.8254725 119.555997,68.264092 C120.506081,67.2663872 121.406012,66.2220982 122.252463,65.1350863 C125.059366,61.8496302 127.866268,58.2788825 130.498314,54.6437141 C133.121157,51.0177486 135.412694,47.4470008 137.262488,44.0879211 C140.741206,37.8851274 142.646219,32.5382087 142.646219,28.1207888 C142.701436,12.5861956 130.314255,0.0425636812 115.028141,0.0425636812 C99.7604339,0.0425636812 87.42847,12.5861956 87.42847,28.1207888 C87.42847,32.5382087 89.3334823,37.9403451 92.8029975,44.1523418 C94.7172128,47.5114215 97.0087494,51.0729663 99.5763747,54.7173377 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/gl.svg b/src/asset/icon/gl.svg
new file mode 100644
index 0000000..ddc0d51
--- /dev/null
+++ b/src/asset/icon/gl.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="120px" viewBox="0 0 175 120" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>gl</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="gl" fill="#5067A2">
+            <path d="M170.394737,101.315789 L119.736842,101.315789 L119.736842,4.60526316 C119.736842,2.06315789 117.673684,0 115.131579,0 L105.921053,0 C103.378947,0 101.315789,2.06315789 101.315789,4.60526316 L101.315789,115.131579 C101.315789,117.673684 103.378947,119.736842 105.921053,119.736842 L170.394737,119.736842 C172.936842,119.736842 175,117.673684 175,115.131579 L175,105.921053 C175,103.378947 172.936842,101.315789 170.394737,101.315789" id="Fill-1"></path>
+            <path d="M78.2894737,0 L4.60526316,0 C2.06315789,0 0,2.06315789 0,4.60526316 L0,115.131579 C0,117.673684 2.06315789,119.736842 4.60526316,119.736842 L78.2894737,119.736842 C80.8315789,119.736842 82.8947368,117.673684 82.8947368,115.131579 L82.8947368,59.8684211 C82.8947368,57.3263158 80.8315789,55.2631579 78.2894737,55.2631579 L41.4473684,55.2631579 C38.9052632,55.2631579 36.8421053,57.3263158 36.8421053,59.8684211 L36.8421053,69.0789474 C36.8421053,71.6210526 38.9052632,73.6842105 41.4473684,73.6842105 L64.4736842,73.6842105 L64.4736842,101.315789 L18.4210526,101.315789 L18.4210526,18.4210526 L64.4736842,18.4210526 L64.4736842,32.2368421 C64.4736842,34.7789474 66.5368421,36.8421053 69.0789474,36.8421053 L78.2894737,36.8421053 C80.8315789,36.8421053 82.8947368,34.7789474 82.8947368,32.2368421 L82.8947368,4.60526316 C82.8947368,2.06315789 80.8315789,0 78.2894737,0" id="Fill-3"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/graph.svg b/src/asset/icon/graph.svg
new file mode 100644
index 0000000..d91df5b
--- /dev/null
+++ b/src/asset/icon/graph.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="171px" height="146px" viewBox="0 0 171 146" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>graph</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <polygon id="path-1" points="0.06 0 171 0 171 146 0.06 146"></polygon>
+    </defs>
+    <g id="graph" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <mask id="mask-2" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+        <g id="Clip-2"></g>
+        <path d="M171,100 C171,106.075 166.075,111 160,111 C154.016,111 149.158,106.219 149.014,100.27 L114.105,83.503 C111.564,86.693 108.179,89.18 104.282,90.616 L108.698,124.651 C112.951,126.172 116,130.225 116,135 C116,141.075 111.075,146 105,146 C98.925,146 94,141.075 94,135 C94,131.233 95.896,127.912 98.781,125.93 L94.364,91.896 C82.94,90.82 74,81.206 74,69.5 C74,69.479 74.001,69.46 74.001,69.439 L53.719,64.759 C50.642,70.269 44.76,74 38,74 C36.07,74 34.215,73.689 32.472,73.127 L20.624,90.679 C21.499,92.256 22,94.068 22,96 C22,102.075 17.075,107 11,107 C4.925,107 0,102.075 0,96 C0,89.925 4.925,85 11,85 C11.452,85 11.895,85.035 12.332,85.089 L24.184,67.531 C21.574,64.407 20,60.389 20,56 C20,48.496 24.594,42.07 31.121,39.368 L29.111,21.279 C24.958,19.707 22,15.704 22,11 C22,4.925 26.925,0 33,0 C39.075,0 44,4.925 44,11 C44,14.838 42.031,18.214 39.051,20.182 L41.061,38.279 C49.223,39.681 55.49,46.564 55.95,55.011 L76.245,59.694 C79.889,52.181 87.589,47 96.5,47 C100.902,47 105.006,48.269 108.475,50.455 L131.538,27.391 C131.192,26.322 131,25.184 131,24 C131,17.925 135.925,13 142,13 C148.075,13 153,17.925 153,24 C153,30.075 148.075,35 142,35 C140.816,35 139.678,34.808 138.609,34.461 L115.546,57.525 C117.73,60.994 119,65.098 119,69.5 C119,71.216 118.802,72.884 118.438,74.49 L153.345,91.257 C155.193,89.847 157.495,89 160,89 C166.075,89 171,93.925 171,100" id="Fill-1" fill="#4F608A" mask="url(#mask-2)"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/heatmap.svg b/src/asset/icon/heatmap.svg
new file mode 100644
index 0000000..63be1a7
--- /dev/null
+++ b/src/asset/icon/heatmap.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="165px" height="137px" viewBox="0 0 165 137" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>heatmap</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="heatmap" transform="translate(-0.500000, -0.474277)" fill-rule="nonzero">
+            <path d="M44.5999999,89.4742765 L5.40000005,89.4742765 C2.6938048,89.4742765 0.500000074,87.2916647 0.5,84.5992766 L0.5,55.3492765 C0.500000074,52.6568883 2.6938048,50.4742765 5.40000005,50.4742765 L44.5999999,50.4742765 C47.3061952,50.4742765 49.4999999,52.6568883 49.5,55.3492765 L49.5,84.5992766 C49.4999999,87.2916647 47.3061952,89.4742765 44.5999999,89.4742765" id="Path" fill="#687DB0"></path>
+            <path d="M102.6,89.4742765 L63.3999999,89.4742765 C60.6938047,89.4742765 58.5000001,87.2916647 58.5,84.5992766 L58.5,55.3492765 C58.5000001,52.6568884 60.6938047,50.4742766 63.3999999,50.4742765 L102.6,50.4742765 C105.306195,50.4742765 107.5,52.6568883 107.5,55.3492765 L107.5,84.5992766 C107.5,87.2916647 105.306195,89.4742765 102.6,89.4742765" id="Path" fill="#8497C0"></path>
+            <path d="M160.6,89.4742765 L121.4,89.4742765 C118.693805,89.4742765 116.5,87.2916647 116.5,84.5992766 L116.5,55.3492765 C116.5,52.6568884 118.693805,50.4742766 121.4,50.4742765 L160.6,50.4742765 C163.306195,50.4742766 165.5,52.6568884 165.5,55.3492765 L165.5,84.5992766 C165.5,87.2916647 163.306195,89.4742765 160.6,89.4742765" id="Path" fill="#A7B4D1"></path>
+            <path d="M44.5999999,137.474277 L5.40000005,137.474277 C2.69380475,137.474277 0.5,135.291665 0.5,132.599276 L0.5,103.349277 C0.5,100.656888 2.69380475,98.4742765 5.40000005,98.4742765 L44.5999999,98.4742765 C45.8995608,98.4742765 47.1458949,98.9878911 48.0648232,99.902131 C48.9837515,100.816371 49.5,102.056346 49.5,103.349277 L49.5,132.599276 C49.5,135.291665 47.3061953,137.474277 44.5999999,137.474277" id="Path" fill="#8497C0"></path>
+            <path d="M102.6,137.474277 L63.3999999,137.474277 C60.6938047,137.474276 58.5,135.291665 58.5,132.599276 L58.5,103.349277 C58.5,100.656888 60.6938047,98.4742766 63.3999999,98.4742765 L102.6,98.4742765 C105.306195,98.4742765 107.5,100.656888 107.5,103.349277 L107.5,132.599276 C107.5,135.291665 105.306195,137.474277 102.6,137.474277" id="Path" fill="#A7B4D1"></path>
+            <path d="M160.6,137.474277 L121.4,137.474277 C118.693805,137.474276 116.5,135.291665 116.5,132.599276 L116.5,103.349277 C116.5,100.656888 118.693805,98.4742766 121.4,98.4742765 L160.6,98.4742765 C163.306195,98.4742766 165.5,100.656888 165.5,103.349277 L165.5,132.599276 C165.5,135.291665 163.306195,137.474276 160.6,137.474277" id="Path" fill="#CDD5E3"></path>
+            <path d="M5.40000005,0.474276527 L44.5999999,0.474276527 C47.3061953,0.474276527 49.5,2.65688839 49.5,5.34927658 L49.5,34.5992765 C49.5,37.2916647 47.3061953,39.4742765 44.5999999,39.4742765 L5.40000005,39.4742765 C2.69380475,39.4742765 0.5,37.2916647 0.5,34.5992765 L0.5,5.34927658 C0.5,2.65688839 2.69380475,0.474276527 5.40000005,0.474276527" id="Path" fill="#5067A2"></path>
+            <path d="M102.6,39.4742765 L63.3999999,39.4742765 C60.6938047,39.4742765 58.5,37.2916646 58.5,34.5992765 L58.5,5.34927658 C58.5,2.65688845 60.6938047,0.474276601 63.3999999,0.474276527 L102.6,0.474276527 C105.306195,0.474276527 107.5,2.65688839 107.5,5.34927658 L107.5,34.5992765 C107.5,37.2916647 105.306195,39.4742765 102.6,39.4742765" id="Path" fill="#687DB0"></path>
+            <path d="M160.6,39.4742765 L121.4,39.4742765 C118.693805,39.4742765 116.5,37.2916646 116.5,34.5992765 L116.5,5.34927658 C116.5,2.65688845 118.693805,0.474276601 121.4,0.474276527 L160.6,0.474276527 C163.306195,0.474276601 165.5,2.65688845 165.5,5.34927658 L165.5,34.5992765 C165.5,37.2916646 163.306195,39.4742765 160.6,39.4742765" id="Path" fill="#8497C0"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/line.svg b/src/asset/icon/line.svg
new file mode 100644
index 0000000..daeb425
--- /dev/null
+++ b/src/asset/icon/line.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="138px" viewBox="0 0 175 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>line</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="line" fill="#5067A2" fill-rule="nonzero">
+            <path d="M25.2739189,111.655778 C26.7855309,111.657407 28.2007506,110.913642 29.0567232,109.667735 L69.3606163,51.4346379 L108.642876,94.5825372 C109.596174,95.6275458 110.977093,96.1760957 112.387618,96.0700817 C113.798143,95.9640677 115.081554,95.2152689 115.86794,94.0395069 L167.15209,17.582681 C168.126301,16.2187314 168.281888,14.4329668 167.558237,12.9210891 C166.834585,11.4092114 165.346152,10.4103472 163.672804,10.3136363 C161.999456,10.2169253 160.40586,11.0376639 159.512851,12.4561069 L111.496086,84.0348638 L72.2782537,40.9605957 C71.3313898,39.926718 69.968454,39.3754562 68.5690807,39.4603596 C67.1694417,39.5586882 65.8899144,40.2864616 65.0900052,41.4391988 L21.4911146,104.439918 C20.5200574,105.846972 20.4090348,107.676368 21.202809,109.190526 C21.9965833,110.704685 23.5643138,111.65402 25.2739189,111.655778" id="Path"></path>
+            <path d="M170.272214,127.854648 L9.20390349,127.854648 L9.20390349,5.00465881 C9.20390349,2.46307104 7.14353951,0.402707066 4.60195174,0.402707066 C2.06036398,0.402707066 3.11254732e-16,2.46307104 0,5.00465881 L0,132.4566 C3.11254728e-16,134.998188 2.06036395,137.058552 4.60195168,137.058552 L170.272214,137.058552 C172.813801,137.058552 174.874165,134.998188 174.874165,132.4566 C174.874165,129.915012 172.813801,129.257355 170.272214,129.257355" id="Path"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/lines.svg b/src/asset/icon/lines.svg
new file mode 100644
index 0000000..e17d855
--- /dev/null
+++ b/src/asset/icon/lines.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="163px" height="137px" viewBox="0 0 163 137" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>lines</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="lines" fill="#5067A2" fill-rule="nonzero">
+            <path d="M118.024118,118.8 C120.522388,118.8 122.566427,120.8475 122.566427,123.35 C122.566427,125.8525 120.522388,127.9 118.024118,127.9 C115.517543,127.894993 113.486807,125.860819 113.481809,123.35 C113.481809,120.8475 115.525848,118.8 118.024118,118.8 Z M142.434485,46 L64.9673569,46 C62.4587091,46 60.4250482,48.0371044 60.4250482,50.55 C60.4250482,53.0628956 62.4587091,55.1 64.9673569,55.1 L142.034762,55.0909 C149.519307,56.1087027 154.7743,62.9956941 153.790257,70.4972 C152.963556,76.6852 148.066948,81.5264 142.434485,82.2544 L20.6642736,82.2726 C14.6272756,82.8301001 9.06337697,85.7822231 5.21133949,90.4717 C0.0521031846,96.7506172 -1.39663076,105.298969 1.40493936,112.931618 C4.20650947,120.564268 10.8382585,126.136619 18.8291809,127.5724 L105.232977,127.8909 C107.143393,133.33221 112.265894,136.980155 118.024118,137 C125.537097,137 131.651044,130.8757 131.651044,123.35 C131.651044,115.8243 125.537097,109.7 118.024118,109.7 C112.110032,109.7 107.113492,113.5129 105.232977,118.8 L21.8634431,118.8728 L20.4099043,118.618 C14.3307333,117.521702 9.72082575,112.509885 9.12680957,106.3512 C8.77445503,102.712306 9.88625731,99.0830035 12.2155795,96.2684 C14.5594108,93.4383 17.8571269,91.6911 21.0912506,91.3544 L142.988646,91.3271 C153.280464,90.058092 161.421536,81.9929721 162.802197,71.6984 C164.446513,59.2314 155.679857,47.729 142.434485,46 Z" id="Shape"></path>
+            <path d="M31.9999101,18.2496933 C36.9704563,18.2496933 40.9998801,22.3350263 40.9998801,27.37454 C40.9998801,32.4140537 36.9704563,36.4993867 31.9999101,36.4993867 C27.0293639,36.4993867 22.9999401,32.4140537 22.9999401,27.37454 C22.9999401,22.3350263 27.0293639,18.2496933 31.9999101,18.2496933 Z M16.8799604,56.2181803 C19.4539519,59.9411177 22.1809428,63.6184309 24.9259336,66.9946242 C25.9069304,68.2173537 26.7979274,69.3032104 27.5539249,70.2156951 C28.1029231,70.7814356 28.435922,71.1920537 28.5979214,71.3654258 C30.4699152,73.555389 33.5839048,73.555389 35.4378986,71.3015518 C35.617898,71.1373046 35.932897,70.7266865 36.4188954,70.1518212 C37.2648925,69.2393365 38.1288897,68.1443549 39.0558866,66.9307503 C41.8008774,63.554557 44.5368683,59.8863687 47.1108598,56.1451815 C49.6758512,52.4131192 51.9258437,48.7449309 53.7348377,45.2957388 C57.1368264,38.917471 58.9998202,33.4243133 58.9998202,28.8710148 C59.05382,12.911658 46.9398603,0 31.9909101,0 C17.0509599,0 5,12.911658 5,28.8710148 C5,33.4243133 6.8629938,38.9722201 10.2559825,45.3596128 C12.1279763,48.8088048 14.3689688,52.4678683 16.8799604,56.2181803 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/map.svg b/src/asset/icon/map.svg
new file mode 100644
index 0000000..4e46613
--- /dev/null
+++ b/src/asset/icon/map.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="142px" viewBox="0 0 175 142" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>geo</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="geo" fill="#5067A2" fill-rule="nonzero">
+            <path d="M9.20332621,34.019885 L55.2181167,56.861627 L55.2181167,128.571076 L9.20332621,103.207724 L9.20332621,34.019885 Z M171.819596,50.2815119 L151.996424,43.1124076 C149.63126,42.3318353 147.074346,43.5747977 146.227189,45.9169373 C145.380032,48.2590769 146.550177,50.8501245 148.867418,51.7631882 L165.653614,57.8371405 L165.653614,131.138702 L119.638823,119.625801 L119.638823,87.4706656 C119.638823,84.9293389 117.578671,82.8691865 115.037344,82.8691865 C112.496018,82.8691865 110.435865,84.9293389 110.435865,87.4706656 L110.435865,119.644207 L64.4210748,131.41479 L64.4210748,58.2236647 L81.060023,51.7263763 C83.2914479,50.7138845 84.3410975,48.1328302 83.4496557,45.8503474 C82.5582139,43.5678645 80.037126,42.3813901 77.7101463,43.1492194 L61.2460542,49.5820871 L6.64490386,22.4793755 C5.21943693,21.7614379 3.52312776,21.8367966 2.16693957,22.6783095 C0.810751382,23.5198224 -0.00997312356,25.0062796 0.000368118324,26.6023007 L0.000368118324,105.913394 C0.000368118324,107.597535 0.91146097,109.134429 2.38393426,109.944289 L58.8072703,141.059491 C59.8287987,141.620871 61.0435892,141.795727 62.16635,141.49203 L115.046547,127.963681 L169.141535,141.501233 C170.516378,141.840666 171.970958,141.532118 173.089604,140.663763 C174.206625,139.788526 174.858383,138.44767 174.856572,137.028595 L174.856572,54.6069022 C174.855748,52.6695411 173.64154,50.9402146 171.819596,50.2815119 Z M115.037344,16.5986853 C121.13907,16.6012266 126.083435,21.5497125 126.080894,27.651438 C126.078353,33.7531634 121.129867,38.697529 115.028141,38.6949877 C108.926416,38.6924463 103.98205,33.7439604 103.984592,27.642235 C103.987133,21.5405096 108.935619,16.596144 115.037344,16.5986853 L115.037344,16.5986853 Z M99.5763747,54.7173377 C102.208421,58.3341002 105.00612,61.9140509 107.813022,65.199507 C108.806942,66.3866886 109.718035,67.4358258 110.491083,68.3285127 C111.04326,68.8806902 111.402176,69.2856204 111.558626,69.4512736 C112.438859,70.4713636 113.723372,71.0524431 115.07068,71.0400337 C116.417988,71.0276243 117.69158,70.4229833 118.552874,69.3868529 C118.72773,69.2211997 119.06824,68.8254725 119.555997,68.264092 C120.506081,67.2663872 121.406012,66.2220982 122.252463,65.1350863 C125.059366,61.8496302 127.866268,58.2788825 130.498314,54.6437141 C133.121157,51.0177486 135.412694,47.4470008 137.262488,44.0879211 C140.741206,37.8851274 142.646219,32.5382087 142.646219,28.1207888 C142.701436,12.5861956 130.314255,0.0425636812 115.028141,0.0425636812 C99.7604339,0.0425636812 87.42847,12.5861956 87.42847,28.1207888 C87.42847,32.5382087 89.3334823,37.9403451 92.8029975,44.1523418 C94.7172128,47.5114215 97.0087494,51.0729663 99.5763747,54.7173377 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/parallel.svg b/src/asset/icon/parallel.svg
new file mode 100644
index 0000000..bc9fa98
--- /dev/null
+++ b/src/asset/icon/parallel.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="148px" viewBox="0 0 175 148" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>parallel</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="parallel" fill="#5067A2" fill-rule="nonzero">
+            <path d="M119.966527,90.2642567 L119.966527,71.4595035 L164.953975,91.1040224 L164.953975,117.16675 L119.966527,90.2642567 Z M99.5422259,68.8202399 L109.969317,68.8202399 L109.969317,80.2370544 L99.5422259,68.8202399 Z M64.9818688,58.8230293 L64.9818688,45.8666444 L76.8485579,58.8230293 L64.9818688,58.8230293 L64.9818688,58.8230293 Z M9.99721065,95.6627504 L9.99721065,37.9888424 L54.9846583,37.9888424 L54.9846583,61.3523236 L9.99721065,95.6627504 Z M170,2.04051565e-11 C167.238576,2.04245402e-11 165,2.23857623 165,4.99999995 L165,80.2194419 L120,60.5694419 L120,5.00139509 C120,2.23997133 117.761424,0.00139506489 115,0.00139506489 C112.238576,0.00139506489 110,2.23997133 110,5.00139509 L110,58.8394419 L90.42,58.8394419 L64.9999999,31.059442 L64.9999999,5.00139509 C64.9999999,2.23997137 62.7614237,0.00139513813 60,0.00139513813 C57.2385763,0.00139513813 55,2.23997137 55,5.00139509 L55,27.999442 L10,27.999442 L10,4.99999995 C10,2.23857619 7.76142378,-7.3221713e-08 5.00000002,-7.32217131e-08 C2.23857626,-7.32217133e-08 3.38176877e-16,2.23857619 0,4.99999995 L0,142.999442 C3.38176877e-16,145.760866 2.23857626,147.999442 5.00000002,147.999442 C7.76142378,147.999442 10,145.760866 10,142.999442 L10,108.249442 L55,73.9494419 L55,142.999442 C55,145.760866 57.2385763,147.999442 60,147.999442 C62.7614237,147.999442 64.9999999,145.760866 64.9999999,142.999442 L64.9999999,68.839442 L86.01,68.839442 L110,95.0694419 L110,142.999442 C110,145.760866 112.238576,147.999442 115,147.999442 C117.761424,147.999442 120,145.760866 120,142.999442 L120,101.939442 L165,128.839442 L165,142.999442 C165,145.760866 167.238576,147.999442 170,147.999442 C172.761424,147.999442 175,145.760866 175,142.999442 L175,4.99999995 C175,3.67391749 174.473216,2.40214791 173.535534,1.46446603 C172.597852,0.526784141 171.326082,-3.88296707e-08 170,2.04051565e-11 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/pictorialBar.svg b/src/asset/icon/pictorialBar.svg
new file mode 100644
index 0000000..dfc71c6
--- /dev/null
+++ b/src/asset/icon/pictorialBar.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="141px" viewBox="0 0 175 141" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>pictorialBar</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="pictorialBar" fill="#5067A2" fill-rule="nonzero">
+            <path d="M165.182447,113.123194 C161.75364,113.169204 158.605604,115.027549 156.908673,118.007359 L62.4782339,118.007359 C59.7807842,118.007359 57.5940692,120.194074 57.5940692,122.891524 C57.5940692,125.588973 59.7807842,127.775688 62.4782339,127.775688 L156.908673,127.775688 C158.605604,130.755498 161.75364,132.613843 165.182447,132.659853 C170.576885,132.6592 174.949595,128.285961 174.949595,122.891524 C174.949595,117.497086 170.576885,113.123847 165.182447,113.123194 L165.182447,113.123194 Z M165.182447,78.9340419 C161.75364,78.980052 158.605603,80.8383969 156.908673,83.8182066 L77.2674843,83.8182066 C74.5700347,83.8182066 72.3833197,86.0049216 72.3833197,88.7023712 C72.3833197,91.3998208 74.5700347,93.5865358 77.2674843,93.5865358 L156.908673,93.5865358 C158.605603,96.5663455 161.75364,98.4246904 165.182447,98.4707005 C170.577347,98.4707005 174.950777,94.0972705 174.950777,88.7023712 C174.950777,83.3074719 170.577347,78.9340419 165.182447,78.9340419 L165.182447,78.9340419 Z M165.182447,44.7448896 C170.407595,44.9786234 174.523583,49.2828462 174.523583,54.5132188 C174.523583,59.7435915 170.407595,64.0478142 165.182447,64.2815481 C161.75364,64.235538 158.605604,62.3771932 156.908673,59.3973835 L77.2674843,59.3973835 C74.5700346,59.3973835 72.3833196,57.2106685 72.3833196,54.5132188 C72.3833196,51.8157692 74.5700346,49.6290542 77.2674843,49.6290542 L156.908673,49.6290542 C158.605604,46.6492445 161.75364,44.7908997 165.182447,44.7448896 Z M62.6149904,20.3240665 C62.6149904,19.0287054 63.1295706,17.7863991 64.0455291,16.8704405 C64.9614877,15.954482 66.2037941,15.4399018 67.4991551,15.4399019 L156.908673,15.4399019 C158.605604,12.4600922 161.75364,10.6017474 165.182447,10.5557373 C170.407595,10.7894711 174.523583,15.0936938 174.523583,20.3240665 C174.523583,25.5544392 170.407595,29.8586619 165.182447,30.0923957 C161.75364,30.0463857 158.605604,28.1880408 156.908673,25.2082312 L67.4991551,25.2082312 C66.2037941,25.2082312 64.9614877,24.6936511 64.0455291,23.7776925 C63.1295705,22.8617339 62.6149904,21.6194275 62.6149904,20.3240665 Z M23.5416735,29.3240665 C31.6340224,29.3240665 38.1941674,22.7639215 38.1941674,14.6715726 C38.1941674,6.57922368 31.6340224,0.0190787204 23.5416735,0.0190787204 C15.4493246,0.0190787204 8.88917966,6.57922368 8.88917966,14.6715726 C8.88917966,22.7639215 15.4493246,29.3240665 23.5416735,29.3240665 Z M34.0523957,34.2082312 L13.0211829,34.2082312 C10.6337153,34.2093302 8.59694107,35.9362503 8.20539657,38.2913927 L0.0683783524,87.133039 C-0.166957522,88.5485838 0.232108973,89.996 1.15960938,91.0909397 C2.08710979,92.1858793 3.44919091,92.8175461 4.88416457,92.8182066 L8.88917966,92.8182066 L9.0426883,136.115835 C9.0426883,138.813285 11.2294033,141 13.9268529,141 L33.4635113,141 C34.7588723,141 36.0011787,140.48542 36.9171373,139.569461 C37.8330959,138.653503 38.347676,137.411196 38.347676,136.115835 L38.1941674,92.8182066 L42.189414,92.8182066 C43.6255482,92.8209447 44.9898051,92.1902296 45.9180572,91.0944026 C46.8463094,89.9985755 47.2440794,88.5491696 47.0052003,87.133039 L38.8681821,38.2913927 C38.4766376,35.9362503 36.4398634,34.2093302 34.0523957,34.2082312 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/pie.svg b/src/asset/icon/pie.svg
new file mode 100644
index 0000000..f64a9bc
--- /dev/null
+++ b/src/asset/icon/pie.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="144px" height="152px" viewBox="0 0 144 152" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>pie (2)</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="pie-(2)" transform="translate(0.000000, -0.612903)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M72.1778824,12.9606446 L72.1778824,73.6462877 C72.1779317,75.129331 72.9386663,76.5065116 74.1881954,77.2856176 C75.4377246,78.0647237 76.9977039,78.1345538 78.3105882,77.4701504 L128.354824,52.1402676 L132.666353,49.9503148 C134.757503,48.8920984 137.302156,49.7461658 138.350118,51.857969 L138.468706,52.1060495 L138.782118,52.8930638 C140.942118,58.6416896 144,65.8873535 144,83.8518095 C144,116.316148 115.123765,152.612903 73.2282353,152.612903 C31.3242354,152.612903 0,119.994584 0,80.8406245 C0,44.5353146 27.216,13.7391044 62.2588236,9.22232682 C64.122353,8.98280072 65.9265883,8.80315611 67.6715294,8.69194766 C68.8395088,8.61630135 69.986418,9.03213213 70.8400527,9.84074781 C71.6936873,10.6493635 72.1779411,11.7786714 72.1778824,12.9606446 Z M90.0254118,0.659269609 C88.9814749,0.488081123 87.9163292,0.795987208 87.1201941,1.49909291 C86.324059,2.20219861 85.8798887,3.22724309 85.9087059,4.29493319 L85.9087059,54.6039644 C85.9087059,56.9393437 87.6028236,57.8717845 89.5680001,56.7511446 L133.149176,31.9088684 C134.092985,31.4117209 134.762111,30.50855 134.968019,29.4538349 C135.173928,28.3991197 134.894328,27.3070442 134.208,26.4853136 C134.208,26.4853136 133.538824,25.5357637 132.446118,24.3381334 C127.296,18.6921614 122.832,14.7399812 116.860235,10.9417819 C109.345997,6.07770841 100.978781,2.71218494 92.2108235,1.0271132 C89.9745882,0.599388123 90.0254118,0.659269609 90.0254118,0.659269609 L90.0254118,0.659269609 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/radar.svg b/src/asset/icon/radar.svg
new file mode 100644
index 0000000..d61f5ce
--- /dev/null
+++ b/src/asset/icon/radar.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="151px" height="170px" viewBox="0 0 151 170" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>radar</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="radar" transform="translate(0.500000, 0.000000)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M79.573911,32.0195055 C79.7511468,32.0807796 79.9252225,32.1507623 80.0954971,32.2291958 L126.376239,53.5077701 C128.225278,54.3572545 129.374745,56.2354539 129.285085,58.2607506 L126.927916,110.733256 C126.832633,112.851954 125.405699,114.680595 123.367088,115.296516 L76.444394,129.315811 C75.5054275,129.595861 74.5046062,129.595861 73.5656397,129.315811 L32.4706683,117.053921 C30.8367372,116.566659 29.5635821,115.286115 29.0909814,113.654618 C28.6183807,112.023122 29.0111288,110.264354 30.133561,108.985836 L59.2822032,75.635091 C59.7218624,75.142978 60.0532763,74.5647698 60.2551619,73.937598 L73.2246026,35.1848307 C74.1062345,32.570839 76.9431645,31.1565423 79.573911,32.0195055 L79.573911,32.0195055 Z M139.476076,121.926724 L75.0000016,158.991984 L10.5239274,121.926724 L10.5239274,47.816176 L75.0000016,10.7509165 L139.476076,47.816176 L139.476076,121.926724 Z M146.998953,40.6068232 L77.5076273,0.665810956 C75.9548023,-0.221936985 74.0452007,-0.221936985 72.4923757,0.665810956 L3.00105014,40.6068232 C1.44784731,41.4971353 0.491395456,43.1462367 0.493424274,44.9304378 L0.493424274,124.812462 C0.493424274,126.599823 1.44632208,128.247389 3.00105014,129.136077 L72.4923757,169.077089 C74.047355,169.95676 75.9526481,169.95676 77.5076273,169.077089 L146.998953,129.136077 C148.550638,128.244253 149.506533,126.596111 149.506579,124.812462 L149.506579,44.9304378 C149.506533,43.1467894 148.550638,41.4986473 146.998953,40.6068232 L146.998953,40.6068232 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/rich.svg b/src/asset/icon/rich.svg
new file mode 100644
index 0000000..18bfbec
--- /dev/null
+++ b/src/asset/icon/rich.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="167px" height="162px" viewBox="0 0 167 162" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>rich</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="rich" fill="#5067A2" fill-rule="nonzero">
+            <path d="M5.52634288,101.24857 L96.0005147,101.24857 C98.7764873,101.24857 101.026858,98.9820436 101.026858,96.1861415 C101.026858,93.3902395 98.7764873,91.123713 96.0005147,91.123713 L5.52634288,91.123713 C2.75037036,91.123713 0.5,93.3902395 0.5,96.1861415 C0.5,98.9820436 2.75037036,101.24857 5.52634288,101.24857 Z M75.8951432,121.498284 L5.52634288,121.498284 C2.75037036,121.498284 0.5,123.76481 0.5,126.560713 C0.5,129.356615 2.75037036,131.623141 5.52634288,131.623141 L75.8951432,131.623141 C78.6711157,131.623141 80.9214861,129.356615 80.9214861,126.560713 C80.9214861,123.76481 78.6711157,121.498284 75.8951432,121.498284 Z M146.394628,92.0653247 L128.923061,116.435856 L146.394628,116.435856 L146.394628,92.0653247 Z M166.5,60.749142 L166.5,151.872855 C166.5,157.464659 161.999259,161.997712 156.447314,161.997712 C150.895369,161.997712 146.394628,157.464659 146.394628,151.872855 L146.394628,136.68557 L114.406982,136.68557 L99.2575849,157.806021 C96.0041451,162.338178 89.7188607,163.355849 85.2190093,160.079052 C80.7191578,156.802254 79.7087415,150.471846 82.9621813,145.939689 L148.304639,54.8261007 C148.455429,54.6033538 148.706746,54.4919804 148.867589,54.2894832 C149.318111,53.7697312 149.823755,53.3011987 150.375492,52.892253 C150.857637,52.4854402 151.379728,52.1292264 151.933658,51.829143 C152.481136,51.5631055 153.053631,51.3528145 153.642615,51.2014019 C154.31205,50.9842108 155.003114,50.8416105 155.703415,50.7761579 C155.954733,50.7559082 156.185944,50.624285 156.447314,50.624285 C156.819264,50.624285 157.130897,50.7964076 157.492794,50.836907 C158.850886,50.9717079 160.164137,51.3999382 161.342972,52.0923893 C161.674711,52.2746367 162.036608,52.3151361 162.338188,52.537883 C162.559347,52.7100056 162.659874,52.9428773 162.87098,53.1251247 C163.403773,53.5807433 163.836038,54.0869861 164.268304,54.6337284 C164.650306,55.1399712 165.022255,55.6259644 165.30373,56.1929564 C165.585206,56.7498235 165.766154,57.3370652 165.947102,57.9546815 C166.138103,58.6330469 166.298946,59.2709129 166.34921,59.969528 C166.369315,60.2428992 166.5,60.4757709 166.5,60.749142 L166.5,60.749142 Z M55.7897717,151.872855 L5.52634288,151.872855 C2.75037036,151.872855 0.5,154.139381 0.5,156.935284 C0.5,159.731186 2.75037036,161.997712 5.52634288,161.997712 L55.7897717,161.997712 C58.5657442,161.997712 60.8161146,159.731186 60.8161146,156.935284 C60.8161146,154.139381 58.5657442,151.872855 55.7897717,151.872855 Z M86.3887335,40.499428 L161.100608,40.499428 C164.04791,40.499428 166.437171,38.2329016 166.437171,35.4369995 C166.437171,32.6410974 164.04791,30.374571 161.100608,30.374571 L86.3887335,30.374571 C83.4414314,30.374571 81.052171,32.6410974 81.052171,35.4369995 C81.052171,38.2329016 83.4414314,40.499428 86.3887335,40.499428 Z M86.3887335,10.124857 L161.100608,10.124857 C164.04791,10.124857 166.437171,7.85833056 166.437171,5.0624285 C166.437171,2.26652644 164.04791,1.71199625e-16 161.100608,0 L86.3887335,0 C83.4414314,-1.71199625e-16 81.052171,2.26652644 81.052171,5.0624285 C81.052171,7.85833056 83.4414314,10.124857 86.3887335,10.124857 Z M5.6570278,70.873999 L60.9467995,70.873999 C63.722772,70.873999 65.9731424,68.6074726 65.9731424,65.8115705 L65.9731424,5.0624285 C65.9731424,2.26652644 63.722772,1.71199625e-16 60.9467995,0 L5.6570278,0 C2.88105528,-1.71199625e-16 0.630684915,2.26652644 0.630684915,5.0624285 L0.630684915,65.8115705 C0.630684915,68.6074726 2.88105528,70.873999 5.6570278,70.873999 Z M81.052171,65.8115705 C81.052171,63.0156685 83.3025414,60.749142 86.0785139,60.749142 L116.236571,60.749142 C119.012544,60.749142 121.262914,63.0156685 121.262914,65.8115705 C121.262914,68.6074726 119.012544,70.873999 116.236571,70.873999 L86.0785139,70.873999 C83.3025414,70.873999 81.052171,68.6074726 81.052171,65.8115705 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/sankey.svg b/src/asset/icon/sankey.svg
new file mode 100644
index 0000000..97144e8
--- /dev/null
+++ b/src/asset/icon/sankey.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="139px" viewBox="0 0 175 139" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>sankey</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="sankey" fill-rule="nonzero">
+            <path d="M4.60195168,138.058552 C2.06036395,138.058552 3.11254728e-16,135.998188 0,133.4566 L0,115.048793 C-3.11254732e-16,112.507205 2.06036398,110.446841 4.60195174,110.446841 C7.14353951,110.446841 9.20390349,112.507205 9.20390349,115.048793 L9.20390349,133.4566 C9.20390349,134.677113 8.71905638,135.847638 7.856023,136.710671 C6.99298962,137.573705 5.82246517,138.058552 4.60195168,138.058552 M4.60195168,106.820503 C2.06036395,106.820503 3.11254728e-16,104.760139 0,102.218552 L0,4.60195168 C-3.11254732e-16,2.06036391 2.06036398,-6.74114049e-08 4.60195174,-6.74114054e-08 C7.14353951,-6.74114058e-08 9.20390349,2.06036391 9.20390349,4.60195168 L9.20390349,102.218552 C9.20390349,103.439065 8.71905638,104.60959 7.856023,105.472623 C6.99298962,106.335656 5.82246517,106.820503 4.60195168,106.820503" id="Shape" fill="#5067A2"></path>
+            <path d="M4.60195168,106.820503 C2.06036395,106.820503 3.11254728e-16,104.760139 0,102.218552 L0,4.60195168 C-3.11254732e-16,2.06036391 2.06036398,-6.74114049e-08 4.60195174,-6.74114054e-08 C7.14353951,-6.74114058e-08 9.20390349,2.06036391 9.20390349,4.60195168 L9.20390349,102.218552 C9.20390349,103.439065 8.71905638,104.60959 7.856023,105.472623 C6.99298962,106.335656 5.82246517,106.820503 4.60195168,106.820503" id="Path" fill="#5067A2"></path>
+            <path d="M87.4370826,64.4273241 C86.2165692,64.4273241 85.0460447,63.942477 84.1830114,63.0794436 C83.319978,62.2164103 82.8351309,61.0458858 82.835131,59.8253723 L82.835131,4.60195168 C82.835131,2.06036391 84.8954949,-6.74113054e-08 87.4370827,-6.74113059e-08 C89.9786705,-6.74113063e-08 92.0390345,2.06036391 92.0390345,4.60195168 L92.0390345,59.8253723 C92.0390345,61.0458858 91.5541874,62.2164103 90.691154,63.0794437 C89.8281206,63.9424771 88.6575962,64.4273242 87.4370826,64.4273241 M170.272214,38.2054031 C167.730626,38.2054031 165.670262,36.1450392 165.670262,33.6034515 L165.670262,4.60195168 C165.670262,2.06036391 167.730626,-6.74114049e-08 170.272214,-6.74114054e-08 C172.813801,-6.74114058e-08 174.874165,2.06036391 174.874165,4.60195168 L174.874165,33.6034515 C174.874165,34.823965 174.389318,35.9944894 173.526285,36.8575227 C172.663252,37.7205561 171.492727,38.2054032 170.272214,38.2054031 M105.84489,138.058552 C104.624376,138.058552 103.453852,137.573705 102.590818,136.710671 C101.727785,135.847638 101.242938,134.677113 101.242938,133.4566 L101.242938,78.2331793 C101.242938,75.6915915 103.303302,73.6312276 105.84489,73.6312276 C108.386477,73.6312276 110.446841,75.6915915 110.446841,78.2331793 L110.446841,133.4566 C110.446841,135.998188 108.386477,138.058552 105.84489,138.058552 M170.272214,138.058552 C167.730626,138.058552 165.670262,135.998188 165.670262,133.4566 L165.670262,48.3020853 C165.670262,45.7604975 167.730626,43.7001336 170.272214,43.7001336 C172.813801,43.7001336 174.874165,45.7604975 174.874165,48.3020853 L174.874165,133.4566 C174.874165,134.677113 174.389318,135.847638 173.526285,136.710671 C172.663252,137.573705 171.492727,138.058552 170.272214,138.058552" id="Shape" fill="#5067A2"></path>
+            <polygon id="Path" fill="#95A5C8" points="110.446841 133.4566 165.670262 133.4566 165.670262 78.2331793 110.446841 78.2331793"></polygon>
+            <polygon id="Path" fill="#5067A2" points="165.670262 133.4566 174.874165 133.4566 174.874165 78.2331793 165.670262 78.2331793"></polygon>
+            <path d="M165.670262,77.9478582 C124.491998,75.6100668 130.198418,59.8345763 92.0390345,59.8253723 L92.0390345,32.213662 C124.832542,32.2228659 136.825229,48.0167643 165.670262,48.6242219 L165.670262,77.9478582" id="Path" fill="#95A5C8"></path>
+            <path d="M92.0390345,59.8253723 L92.0022188,59.8253723 L92.0022188,32.213662 L92.0390345,32.213662 L92.0390345,59.8253723 M174.874165,78.2331793 C171.56076,78.2055676 168.505064,78.1135285 165.670262,77.9478582 L165.670262,48.6242219 L167.400596,48.6426296 C169.765999,48.6426296 172.260257,48.5413867 174.874165,48.3204931 L174.874165,78.2331793" id="Shape" fill="#5067A2"></path>
+            <polygon id="Path" fill="#95A5C8" points="92.0390345 32.213662 165.670262 32.213662 165.670262 4.60195168 92.0390345 4.60195168"></polygon>
+            <path d="M82.835131,32.213662 L92.0390345,32.213662 L92.0390345,4.60195168 L82.835131,4.60195168 L82.835131,32.213662 Z M165.670262,32.213662 L174.506009,32.213662 L174.506009,4.60195168 L165.670262,4.60195168 L165.670262,32.213662 Z" id="Shape" fill="#5067A2"></path>
+            <polygon id="Path" fill="#95A5C8" points="9.20390349 59.8253723 82.835131 59.8253723 82.835131 4.60195168 9.20390349 4.60195168"></polygon>
+            <polyline id="Path" fill="#5067A2" points="82.835131 59.8253723 82.835131 4.60195168 82.835131 59.8253723"></polyline>
+            <polygon id="Path" fill="#95A5C8" points="9.20390349 133.4566 101.242938 133.4566 101.242938 115.048793 9.20390349 115.048793"></polygon>
+            <polygon id="Path" fill="#5067A2" points="101.242938 133.4566 110.446841 133.4566 110.446841 115.048793 101.242938 115.048793"></polygon>
+            <path d="M101.242938,115.048793 C43.4792398,114.699045 52.1585208,101.445424 9.20390349,101.445424 L9.20390349,59.8253723 C56.5579867,59.8253723 47.7682589,78.1319363 101.242938,78.2331793 L101.242938,115.048793" id="Path" fill="#95A5C8"></path>
+            <path d="M101.675521,115.048793 L101.242938,115.048793 L101.242938,78.2331793 L101.675521,78.2331793 C104.335449,78.2331793 100.46981,113.723431 101.675521,115.048793" id="Path" fill="#5067A2"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/scatter.svg b/src/asset/icon/scatter.svg
new file mode 100644
index 0000000..7cab8f8
--- /dev/null
+++ b/src/asset/icon/scatter.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="138px" viewBox="0 0 175 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>scatter</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="scatter" fill="#5067A2" fill-rule="nonzero">
+            <path d="M173.526285,129.202529 C172.663252,128.339495 171.492727,127.854648 170.272214,127.854648 L9.20390349,127.854648 L9.20390349,4.60195168 C9.20390349,2.06036391 7.14353951,-6.74112924e-08 4.60195174,-6.74112925e-08 C2.06036398,-6.74112927e-08 3.11254732e-16,2.06036391 0,4.60195168 L0,132.4566 C3.11254728e-16,134.998188 2.06036395,137.058552 4.60195168,137.058552 L170.272214,137.058552 C171.492727,137.058552 172.663252,136.573705 173.526285,135.710671 C174.389318,134.847638 174.874165,133.677113 174.874165,132.4566 C174.874165,131.236086 174.389318,130.065562 173.526285,129.202529 Z M151.864407,12.8058552 C155.15291,12.8054572 158.191783,14.5596242 159.836149,17.4074853 C161.480516,20.2553464 161.480516,23.7641708 159.836149,26.6120319 C158.191783,29.459893 155.15291,31.21406 151.864407,31.213662 C146.781666,31.2130468 142.661617,27.0924991 142.661617,22.0097586 C142.661617,16.9270181 146.781666,12.8064703 151.864407,12.8058552 Z M142.660503,58.8253723 C147.743679,58.8253723 151.864407,62.9461003 151.864407,68.0292758 C151.864407,73.1124513 147.743679,77.2331793 142.660503,77.2331793 C137.577328,77.2331793 133.4566,73.1124513 133.4566,68.0292758 C133.4566,62.9461003 137.577328,58.8253723 142.660503,58.8253723 Z M124.252696,40.4175655 C127.5412,40.4171675 130.580072,42.1713345 132.224439,45.0191956 C133.868806,47.8670567 133.868806,51.3758811 132.224439,54.2237422 C130.580072,57.0716033 127.5412,58.8257703 124.252696,58.8253723 C119.169956,58.8247572 115.049907,54.7042094 115.049907,49.6214689 C115.049907,44.5387284 119.169956,40.4181807 124.252696,40.4175655 L124.252696,40.4175655 Z M105.84489,22.0097586 C109.133393,22.0093606 112.172266,23.7635277 113.816632,26.6113888 C115.460999,29.4592498 115.460999,32.9680743 113.816632,35.8159354 C112.172266,38.6637965 109.133393,40.4179635 105.84489,40.4175655 C100.762149,40.4169503 96.6421001,36.2964026 96.6421001,31.2136621 C96.6421001,26.1309216 100.762149,22.0103738 105.84489,22.0097586 L105.84489,22.0097586 Z M105.84489,58.8253723 C110.928065,58.8253723 115.048793,62.9461003 115.048793,68.0292758 C115.048793,73.1124513 110.928065,77.2331793 105.84489,77.2331793 C100.761714,77.2331793 96.6409861,73.1124513 96.6409861,68.0292758 C96.6409861,62.9461003 100.761714,58.8253723 105.84489,58.8253723 L105.84489,58.8253723 Z M87.4370826,77.2331793 C90.8200008,77.0784213 94.0146452,78.7938663 95.7543045,81.6993216 C97.4939639,84.6047768 97.4975937,88.2308616 95.7637545,91.1397939 C94.0299154,94.0487262 90.8387117,95.7705634 87.4554905,95.6225784 C82.5370015,95.4074394 78.6587219,91.3598697 78.6537937,86.4366802 C78.6488656,81.5134907 82.5190342,77.4581647 87.4370826,77.2331793 L87.4370826,77.2331793 Z M59.8253723,68.0292758 C63.1138756,68.0288778 66.1527483,69.7830448 67.7971148,72.6309059 C69.4414814,75.478767 69.4414814,78.9875915 67.7971148,81.8354525 C66.1527483,84.6833136 63.1138756,86.4374807 59.8253723,86.4370826 C54.7426318,86.4364675 50.6225828,82.3159197 50.6225828,77.2331792 C50.6225828,72.1504387 54.7426318,68.029891 59.8253723,68.0292758 L59.8253723,68.0292758 Z M32.213662,95.6409861 C35.5021653,95.6405881 38.541038,97.3947552 40.1854045,100.242616 C41.8297711,103.090477 41.8297711,106.599302 40.1854045,109.447163 C38.541038,112.295024 35.5021653,114.049191 32.213662,114.048793 C27.1309215,114.048178 23.0108725,109.92763 23.0108725,104.84489 C23.0108725,99.762149 27.1309215,95.6416013 32.213662,95.6409861 L32.213662,95.6409861 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/sunburst.svg b/src/asset/icon/sunburst.svg
new file mode 100644
index 0000000..f74f085
--- /dev/null
+++ b/src/asset/icon/sunburst.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="176px" height="154px" viewBox="0 0 176 154" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>sunburst</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="sunburst" transform="translate(-0.500000, -0.495167)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M119.233629,98.0044542 L110.718691,87.8510962 C116.698944,81.6134116 119.776927,73.1460671 119.198407,64.5239101 L132.221771,61.7588152 C132.389075,63.3350954 132.468325,64.9289877 132.468325,66.5404921 C132.486789,78.3855449 127.713147,89.7343283 119.233629,98.0044542 L119.233629,98.0044542 Z M63.3185781,30.3829135 C74.7931609,22.4121709 89.3686325,20.3583561 102.598787,24.8479794 C115.828942,29.3376027 126.144611,39.8381699 130.399028,53.1465133 L117.38447,55.9116082 C114.163414,47.1482037 107.14477,40.3166874 98.2978797,37.3338959 C89.4509892,34.3511045 79.7290566,35.5384174 71.8599325,40.5626897 L63.3185781,30.3829135 L63.3185781,30.3829135 Z M57.4981296,97.8547516 L67.6773104,89.3128978 C73.1543438,94.3147256 80.4453141,97.3616135 88.4495316,97.3616137 C93.8284022,97.3676833 99.1146581,95.9617789 103.779942,93.2844195 L112.365323,103.508226 C105.247152,108.132446 96.9377023,110.586264 88.4495316,110.570666 C76.8578752,110.587037 65.7306915,106.015602 57.4981296,97.8547516 L57.4981296,97.8547516 Z M51.880208,91.0741048 C47.0035405,83.8229191 44.4062144,75.2791485 44.4219328,66.5404921 C44.4219328,54.7315996 49.0624416,44.0146553 56.6263832,36.1068361 L65.194154,46.3130303 C60.3076881,51.9176198 57.6201378,59.1046557 57.6302124,66.5404921 C57.6302124,72.3876992 59.2592335,77.8562467 62.0858054,82.5146391 L51.880208,91.0741048 L51.880208,91.0741048 Z M40.5915316,112.05008 L50.7354904,103.534644 C60.658337,113.682313 74.2570793,119.394563 88.4495316,119.3767 C99.4212094,119.3767 109.618001,116.030407 118.062495,110.306485 L126.586238,120.468649 C115.441046,128.370969 102.111678,132.606084 88.4495316,132.585752 C70.3533434,132.605952 53.0459635,125.179425 40.5915316,112.05008 L40.5915316,112.05008 Z M0.5,62.1374747 C1.61718015,39.3368661 11.5653323,17.8665508 28.2373873,2.27405071 L36.7435195,12.4097967 C23.0478109,25.4703646 14.8209875,43.2437342 13.7258907,62.1374747 L0.5,62.1374747 Z M0.5,70.9435094 L13.7258907,70.9435094 C14.5580363,85.4042184 19.5854188,99.3091254 28.1933598,110.958131 L18.0582064,119.464761 C7.47186066,105.41813 1.35420505,88.5122858 0.5,70.9435094 L0.5,70.9435094 Z M22.5490216,62.1374747 C23.6176776,45.8469855 30.7006658,30.5346593 42.4230797,19.1728312 L50.9380174,29.3261893 C42.1806215,38.1364527 36.8165849,49.7571326 35.7925234,62.1374747 L22.5490216,62.1374747 L22.5490216,62.1374747 Z M22.5490216,70.9435094 L35.7925234,70.9435094 C36.5571371,80.2216635 39.7688087,89.1310032 45.0999577,96.7628032 L34.9559989,105.278239 C27.6604148,95.2350677 23.3587128,83.3306553 22.5490216,70.9435094 Z M160.064824,88.3354281 C162.208458,81.2692542 163.294499,73.9246962 163.287644,66.5404921 C163.287927,62.7888436 163.014228,59.0421838 162.468731,55.3304099 L175.40404,52.5829271 C177.539642,66.0542744 176.545357,79.8364744 172.498218,92.86173 L160.064824,88.3354281 Z M157.009309,96.5954887 L169.451508,101.130596 C164.453629,112.804913 156.992417,123.261434 147.578597,131.784403 L139.08127,121.666269 C146.731696,114.64362 152.837128,106.105711 157.009309,96.5954887 L157.009309,96.5954887 Z M139.336631,80.7886563 C141.234304,74.0037443 141.75525,66.9076826 140.868791,59.9183539 L153.830516,57.1620651 C155.148964,66.5886629 154.449628,76.187832 151.77883,85.3237642 L139.336631,80.7886563 Z M136.263504,89.0487169 L148.714509,93.5750188 C145.090489,101.633987 139.889912,108.885878 133.419321,114.903235 L124.913189,104.776295 C129.629614,100.274719 133.477161,94.943361 136.263504,89.0487169 L136.263504,89.0487169 Z M84.1260215,141.268503 L84.1260215,154.495167 C61.049526,153.386197 39.3397973,143.226766 23.7025446,126.218989 L33.8288923,117.71236 C46.9380429,131.745712 64.9535467,140.183088 84.1260215,141.268503 L84.1260215,141.268503 Z M104.94227,2.57345585 C127.679056,8.4576749 145.591926,25.956003 152.007773,48.5497632 L139.046048,51.306052 C133.813709,33.9700374 120.081572,20.5128194 102.64403,15.6328053 L104.933465,2.64390412 L104.94227,2.57345585 L104.94227,2.57345585 Z M96.2952498,0.953145396 L96.2600278,1.12046007 L93.9970091,13.9948829 C81.1068487,12.6102912 68.1594065,16.034712 57.6390179,23.6110727 L49.1240802,13.4665207 C60.4957814,5.02434618 74.2870046,0.475385223 88.4495316,0.495231624 C91.0999932,0.495231624 93.7152325,0.644934198 96.2952498,0.953145396 L96.2952498,0.953145396 Z" id="Shape"></path>
+            <path d="M88.5,75.295167 C93.3601058,75.295167 97.3,71.3552728 97.3,66.495167 C97.3,61.6350611 93.3601058,57.6951669 88.5,57.6951669 C83.6398942,57.6951669 79.7,61.6350611 79.7,66.495167 C79.7,71.3552728 83.6398942,75.295167 88.5,75.295167 Z M88.5,88.495167 C76.3497355,88.495167 66.5,78.6454315 66.5,66.495167 C66.5,54.3449025 76.3497355,44.495167 88.5,44.495167 C100.650264,44.495167 110.5,54.3449025 110.5,66.495167 C110.5,78.6454315 100.650264,88.495167 88.5,88.495167 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/themeRiver.svg b/src/asset/icon/themeRiver.svg
new file mode 100644
index 0000000..bb7396c
--- /dev/null
+++ b/src/asset/icon/themeRiver.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="175px" height="130px" viewBox="0 0 175 130" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>themeriver</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="themeriver" fill="#5067A2" fill-rule="nonzero">
+            <path d="M4.9275627,42.5798026 C5.20117275,42.5813119 5.47437729,42.5585448 5.74396361,42.5117692 C10.5811329,41.6686599 15.2612908,40.0922201 19.6227791,37.836902 C26.4649962,34.328322 32.1798026,30.0130599 43.8718299,30.0130599 C55.5638572,30.0130599 63.7861807,41.3940774 79.5602127,41.4912681 C95.3342445,41.5787397 96.9864845,31.7333333 115.384662,31.7333333 C132.976158,31.7333333 137.621868,44.6208049 153.6,45.4566438 C160.490812,45.8162491 166.6041,44.9318147 171.930144,42.7936218 C173.778744,42.0602993 174.992296,40.2727177 174.991648,38.2839788 L174.991648,26.7960517 C174.987486,25.3270305 174.319017,23.9387356 173.173189,23.0194311 C172.027362,22.1001266 170.527173,21.7484925 169.092179,22.0628701 C165.933485,22.7529233 162.084738,22.8403949 157.5265,22.3155656 C145.533181,20.9160213 134.676993,5.82232335 119.476386,5.82232348 C102.788762,5.82232348 99.3093394,11.1678056 81.9899772,11.1678056 C64.6803341,11.1678056 59.6069856,0.126955258 43.8718299,0.126955258 C37.3211845,0.126955258 27.9422931,3.46059231 17.9025057,7.6009112 C12.9652241,9.65163256 8.49445708,10.8373576 4.50964317,11.1678056 C1.98627058,11.3754189 0.0451326562,13.4857192 0.0485952544,16.0176158 L0.0583143318,37.7202733 C0.0583143318,40.4027335 2.24510251,42.5798026 4.9275627,42.5798026 M170.132118,85.5283219 C169.634444,85.5282959 169.139638,85.6036638 168.664541,85.7518603 C162.658162,87.6665148 157.633409,88.7064541 153.551405,88.9008353 C139.342141,89.522855 131.343356,82.7583903 118.543356,82.7583903 C104.227183,82.7583903 97.8611998,94.1491269 80.444647,94.1491269 C61.0356872,94.1491269 52.3274108,84.1287775 42.4917236,84.1287775 C35.416249,84.1287775 28.7392558,88.7453303 19.9337889,92.9828398 C15.5893698,95.0627183 10.3507973,96.5594533 4.2083523,97.4438876 C1.81553905,97.7920745 0.0427391378,99.8465342 0.0485952544,102.264541 L0.0485952544,124.297646 C0.0496707163,125.687409 0.645723287,127.010209 1.68608385,127.931672 C2.72644442,128.853134 4.11154706,129.285071 5.491268,129.118299 C10.3313591,128.544875 15.142293,127.670159 19.9337889,126.513592 C29.8083523,124.132422 34.2305239,119.068793 42.4917236,118.388459 C54.5822323,117.397115 66.5658314,123.267426 82.4759302,121.323614 C98.386029,119.379803 106.3265,110.156416 120.273349,108.543052 C132.577676,107.12407 140.586181,111.293546 152.083827,110.030068 C159.995141,109.174791 166.81792,107.085194 172.552164,103.780714 C174.06095,102.911932 174.991067,101.303681 174.991648,99.5626424 L174.991648,90.3878512 C174.991648,87.7040073 172.815962,85.5283219 170.132118,85.5283219" id="Shape"></path>
+            <path d="M170.132118,55.1659834 C169.755896,55.1642513 169.380769,55.206657 169.014427,55.2923311 C163.386911,56.5597226 157.597804,56.9530934 151.850569,56.4586181 C133.889749,55.0007593 128.388762,42.7839029 114.655733,42.7839029 C103.264996,42.7839029 93.9249811,52.940319 79.7157175,52.5807138 C59.2668185,52.0656038 52.6578588,41.0733486 42.0738042,41.0733486 C35.5231587,41.0733486 26.5330296,47.0991647 20.6724373,49.7524677 C15.5296251,52.0293301 10.0450596,53.4382394 4.44160976,53.9219438 C1.94888222,54.1623556 0.0470459996,56.2577415 0.0485952544,58.762035 L0.0485952544,80.8242976 C0.0491745866,82.2971429 0.717699925,83.69025 1.86632297,84.6121711 C3.01494602,85.5340923 4.51970635,85.8853329 5.95778278,85.5671982 C11.10094,84.3721963 16.0531556,82.4685044 20.6724373,79.9107062 C28.3018983,75.7703873 34.249962,72.7866364 41.8016705,72.7866364 C56.6037965,72.7866364 63.1252849,82.7778284 79.3755505,82.7778284 C94.6441914,82.7778284 103.070615,71.5231587 117.639484,71.5231587 C132.208352,71.5231587 139.964161,77.2185269 150.314958,77.5295368 C156.48656,77.7044798 163.707821,76.0813971 171.988459,72.6408505 C173.80584,71.8896408 174.991328,70.1171628 174.991648,68.1506454 L174.991648,60.0255125 C174.991648,57.3416686 172.815962,55.1659834 170.132118,55.1659834" id="Path"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/tree.svg b/src/asset/icon/tree.svg
new file mode 100644
index 0000000..8660dd5
--- /dev/null
+++ b/src/asset/icon/tree.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="174px" height="147px" viewBox="0 0 174 147" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>tree (1)</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <polygon id="path-1" points="2 4.69629167 172 4.69629167 172 146.375 2 146.375"></polygon>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="tree-(1)">
+            <mask id="mask-2" fill="white">
+                <use xlink:href="#path-1"></use>
+            </mask>
+            <g id="path-1"></g>
+            <path d="M174,127.4965 C173.994333,137.928125 165.534,146.380667 155.101667,146.375708 C144.670042,146.370042 136.216792,137.909 136.222458,127.476667 C136.222458,127.470292 136.222458,127.464625 136.222458,127.45825 C136.226708,118.755667 142.117917,111.435042 150.127042,109.248417 L150.127042,80.2563333 L91.4625,80.2563333 L91.4625,109.120208 C99.7407917,111.126208 105.890542,118.582125 105.889125,127.476667 C105.889125,127.483042 105.889125,127.490125 105.889125,127.4965 C105.883458,137.928125 97.4224167,146.380667 86.9907917,146.375708 C76.5584583,146.370042 68.1059167,137.909 68.1115833,127.476667 C68.1122917,118.764875 74.0049167,111.440708 82.0182917,109.254083 L82.0182917,80.2563333 L23.3530417,80.2563333 L23.3530417,109.120917 C31.630625,111.127625 37.7789583,118.582833 37.77825,127.476667 C37.77825,127.478792 37.77825,127.480917 37.77825,127.483042 C37.776125,137.915375 29.3179167,146.37075 18.8862917,146.368625 C8.45395833,146.367208 -0.00141666667,137.909 0,127.476667 C0.00141666667,118.764167 5.89545833,111.439292 13.9088333,109.254083 L13.9088333,80.2563333 C13.9088333,75.0500833 18.1425417,70.812125 23.3530417,70.812125 L82.0182917,70.812125 L82.0182917,37.8179167 C74.0006667,35.6305833 68.106625,28.298625 68.1115833,19.58825 C68.1122917,9.15025 76.5705,0.694875 87.0028333,0.696291667 C97.4344583,0.697708333 105.890542,9.15591667 105.889125,19.58825 C105.889125,19.594625 105.889125,19.601 105.889125,19.607375 C105.884167,28.4976667 99.7358333,35.9465 91.4625,37.9517917 L91.4625,70.812125 L150.127042,70.812125 C155.337542,70.812125 159.57125,75.0500833 159.57125,80.2563333 L159.57125,109.113125 C167.853083,111.119125 174.00425,118.579292 174,127.476667 C174,127.483042 174,127.490125 174,127.4965 Z" id="Fill-1" fill="#5067A2" fill-rule="nonzero"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/asset/icon/treemap.svg b/src/asset/icon/treemap.svg
new file mode 100644
index 0000000..d8f7b8a
--- /dev/null
+++ b/src/asset/icon/treemap.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="160px" height="132px" viewBox="0 0 160 132" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
+    <title>treemap</title>
+    <desc>Created with Sketch.</desc>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="treemap" transform="translate(-0.500000, -0.095199)" fill="#5067A2" fill-rule="nonzero">
+            <path d="M84.9444444,79.2951993 L4.9444444,79.2951993 C2.48984554,79.2951993 0.5,81.2651464 0.5,83.6951993 L0.5,127.695199 C0.5,130.125252 2.48984554,132.095199 4.9444444,132.095199 L84.9444444,132.095199 C86.1231844,132.095199 87.2536462,131.631629 88.0871413,130.806469 C88.9206363,129.981309 89.3888889,128.862152 89.3888889,127.695199 L89.3888889,83.6951993 C89.3888889,82.5282467 88.9206363,81.4090895 88.0871413,80.5839295 C87.2536462,79.7587694 86.1231844,79.2951993 84.9444444,79.2951993 L84.9444444,79.2951993 Z M156.055556,105.695199 L102.722222,105.695199 C101.543482,105.695199 100.41302,106.158769 99.5795254,106.983929 C98.7460304,107.80909 98.2777777,108.928247 98.2777777,110.095199 L98.2777777,127.695199 C98.2777777,128.862152 98.7460304,129.981309 99.5795254,130.806469 C100.41302,131.631629 101.543482,132.095199 102.722222,132.095199 L156.055556,132.095199 C158.510154,132.095199 160.5,130.125252 160.5,127.695199 L160.5,110.095199 C160.5,107.665146 158.510154,105.695199 156.055556,105.695199 L156.055556,105.695199 Z M156.055556,61.6951994 L102.722222,61.6951994 C101.543482,61.6951994 100.41302,62.1587694 99.5795254,62.9839295 C98.7460304,63.8090896 98.2777777,64.9282468 98.2777777,66.0951993 L98.2777777,92.4951993 C98.2777777,93.6621519 98.7460304,94.7813091 99.5795254,95.6064692 C100.41302,96.4316293 101.543482,96.8951993 102.722222,96.8951993 L156.055556,96.8951993 C158.510154,96.8951993 160.5,94.9252522 160.5,92.4951993 L160.5,66.0951993 C160.5,63.6651465 158.510154,61.6951994 156.055556,61.6951994 L156.055556,61.6951994 Z M156.055556,0.0951993491 L102.722222,0.0951993491 C101.543482,0.0951993149 100.41302,0.558769393 99.5795254,1.38392945 C98.7460304,2.20908951 98.2777777,3.32824674 98.2777777,4.49519931 L98.2777777,48.4951994 C98.2777777,49.662152 98.7460304,50.7813092 99.5795254,51.6064692 C100.41302,52.4316293 101.543482,52.8951994 102.722222,52.8951993 L156.055556,52.8951993 C158.510154,52.8951993 160.5,50.9252523 160.5,48.4951994 L160.5,4.49519931 C160.5,2.06514643 158.510154,0.0951993491 156.055556,0.0951993491 L156.055556,0.0951993491 Z M89.3888889,4.49519931 L89.3888889,66.0951993 C89.3888889,67.2621519 88.9206363,68.3813091 88.0871413,69.2064692 C87.2536462,70.0316293 86.1231844,70.4951993 84.9444444,70.4951993 L4.9444444,70.4951993 C2.48984554,70.4951993 0.5,68.5252522 0.5,66.0951993 L0.5,4.49519931 C0.5,2.06514643 2.48984554,0.0951993491 4.9444444,0.0951993491 L84.9444444,0.0951993491 C86.1231844,0.0951993149 87.2536462,0.558769393 88.0871413,1.38392945 C88.9206363,2.20908951 89.3888889,3.32824674 89.3888889,4.49519931 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/src/common/config.js b/src/common/config.js
index ae5b490..abfa9d9 100644
--- a/src/common/config.js
+++ b/src/common/config.js
@@ -119,11 +119,12 @@
 })();
 
 export const SCRIPT_URLS = {
-    localEChartsMinJS: 'http://localhost/echarts-next/dist/echarts.js',
-    echartsMinJS: 'https://cdn.jsdelivr.net/npm/echarts@5.0.0-rc.1/dist/echarts.min.js',
-    echartsDir: 'https://cdn.jsdelivr.net/npm/echarts@5.0.0-rc.1',
+    localEChartsMinJS: 'http://localhost/echarts/dist/echarts.js',
+    echartsMinJS: 'https://cdn.jsdelivr.net/npm/echarts@5.0.1/dist/echarts.min.js',
+    echartsDir: 'https://cdn.jsdelivr.net/npm/echarts@5.0.1',
     echartsStatMinJS: 'https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js',
-    echartsGLMinJS: 'https://cdn.jsdelivr.net/npm/echarts-gl@2.0.0-rc.1/dist/echarts-gl.min.js',
+    // echartsGLMinJS: 'http://localhost/echarts-gl/dist/echarts-gl.min.js',
+    echartsGLMinJS: 'https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js',
     datGUIMinJS: 'https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js',
     monacoDir: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.21.2/min/vs',
     aceDir: 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict'
diff --git a/src/common/i18n.js b/src/common/i18n.js
index cfe24c5..369cba4 100644
--- a/src/common/i18n.js
+++ b/src/common/i18n.js
@@ -16,7 +16,12 @@
             download: 'Download',
 
             edit: 'Edit',
-            monacoMode: 'Enable Type Checking'
+            monacoMode: 'Enable Type Checking',
+
+            tabEditor: 'Edit Example',
+            tabFullCodePreview: 'Full Code',
+            tabOptionPreview: 'Option Preview',
+            minimalBundle: 'Minimal Bundle'
         },
 
         chartTypes: {
@@ -77,7 +82,12 @@
             download: '下载示例',
 
             edit: '编辑',
-            monacoMode: '开启类型检查'
+            monacoMode: '开启类型检查',
+
+            tabEditor: '示例编辑',
+            tabFullCodePreview: '完整代码',
+            tabOptionPreview: '配置项',
+            minimalBundle: '按需引入'
         },
 
         chartTypes: {
diff --git a/src/common/store.js b/src/common/store.js
index 469928d..f06fafa 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -17,6 +17,8 @@
     runCode: '',
     sourceCode: '',
 
+    runHash: '',
+
     isMobile: window.innerWidth < 600,
 
     editorStatus: {
@@ -40,3 +42,8 @@
 export function parseSourceCode(code) {
     return code.replace(/\/\*[\w\W]*?\*\//, '').trim();
 }
+
+let hashId = 123;
+export function updateRunHash() {
+    store.runHash = hashId++;
+}
\ No newline at end of file
diff --git a/src/data/chart-list-data-gl.js b/src/data/chart-list-data-gl.js
index 1f58210..dfa4912 100644
--- a/src/data/chart-list-data-gl.js
+++ b/src/data/chart-list-data-gl.js
@@ -9,6 +9,7 @@
     "id": "animating-contour-on-globe",
     "tags": [],
     "title": "Animating Contour on Globe",
+    "titleCN": "Animating Contour on Globe",
     "difficulty": 10
   },
   {
@@ -18,6 +19,7 @@
     "id": "bar3d-dataset",
     "tags": [],
     "title": "3D Bar with Dataset",
+    "titleCN": "使用 dataset 为三维柱状图设置数据",
     "difficulty": 10
   },
   {
@@ -27,15 +29,7 @@
     "id": "bar3d-global-population",
     "tags": [],
     "title": "Bar3D - Global Population",
-    "difficulty": 10
-  },
-  {
-    "category": [
-      "bar3D"
-    ],
-    "id": "bar3d-music-visualization",
-    "tags": [],
-    "title": "Music Visualization",
+    "titleCN": "Bar3D - Global Population",
     "difficulty": 10
   },
   {
@@ -45,6 +39,7 @@
     "id": "bar3d-myth",
     "tags": [],
     "title": "星云",
+    "titleCN": "星云",
     "difficulty": 10
   },
   {
@@ -54,6 +49,7 @@
     "id": "bar3d-noise-modified-from-marpi-demo",
     "tags": [],
     "title": "Noise modified from marpi's demo",
+    "titleCN": "Noise modified from marpi's demo",
     "difficulty": 10
   },
   {
@@ -63,6 +59,7 @@
     "id": "bar3d-punch-card",
     "tags": [],
     "title": "Bar3D - Punch Card",
+    "titleCN": "Bar3D - Punch Card",
     "difficulty": 10
   },
   {
@@ -73,6 +70,7 @@
     "tags": [],
     "theme": "dark",
     "title": "Bar3D - Simplex Noise",
+    "titleCN": "Bar3D - Simplex Noise",
     "difficulty": 10
   },
   {
@@ -82,6 +80,7 @@
     "id": "bar3d-voxelize-image",
     "tags": [],
     "title": "Voxelize image",
+    "titleCN": "Voxelize image",
     "difficulty": 10
   },
   {
@@ -92,6 +91,7 @@
     "tags": [],
     "theme": "dark",
     "title": "Flow on the cartesian",
+    "titleCN": "直角坐标系上的向量场",
     "difficulty": 10
   },
   {
@@ -101,6 +101,7 @@
     "id": "geo3d",
     "tags": [],
     "title": "Geo3D",
+    "titleCN": "Geo3D",
     "difficulty": 10
   },
   {
@@ -110,6 +111,7 @@
     "id": "geo3d-with-different-height",
     "tags": [],
     "title": "Geo3D with Different Height",
+    "titleCN": "Geo3D with Different Height",
     "difficulty": 10
   },
   {
@@ -119,6 +121,7 @@
     "id": "global-population-bar3d-on-globe",
     "tags": [],
     "title": "Global Population - Bar3D on Globe",
+    "titleCN": "Global Population - Bar3D on Globe",
     "difficulty": 10
   },
   {
@@ -128,6 +131,7 @@
     "id": "global-wind-visualization",
     "tags": [],
     "title": "Global wind visualization",
+    "titleCN": "Global wind visualization",
     "difficulty": 10
   },
   {
@@ -137,6 +141,17 @@
     "id": "global-wind-visualization-2",
     "tags": [],
     "title": "Global Wind Visualization 2",
+    "titleCN": "Global Wind Visualization 2",
+    "difficulty": 10
+  },
+  {
+    "category": [
+      "globe"
+    ],
+    "id": "globe-atmosphere",
+    "tags": [],
+    "title": "Globe with Atmosphere",
+    "titleCN": "大气层显示",
     "difficulty": 10
   },
   {
@@ -146,6 +161,7 @@
     "id": "globe-contour-paint",
     "tags": [],
     "title": "Contour Paint",
+    "titleCN": "Contour Paint",
     "difficulty": 10
   },
   {
@@ -155,6 +171,7 @@
     "id": "globe-country-carousel",
     "tags": [],
     "title": "Country Carousel",
+    "titleCN": "Country Carousel",
     "difficulty": 10
   },
   {
@@ -164,6 +181,7 @@
     "id": "globe-displacement",
     "tags": [],
     "title": "Globe Displacement",
+    "titleCN": "Globe Displacement",
     "difficulty": 10
   },
   {
@@ -173,6 +191,7 @@
     "id": "globe-echarts-gl-hello-world",
     "tags": [],
     "title": "ECharts-GL Hello World",
+    "titleCN": "ECharts-GL Hello World",
     "difficulty": 10
   },
   {
@@ -182,6 +201,7 @@
     "id": "globe-layers",
     "tags": [],
     "title": "Globe Layers",
+    "titleCN": "Globe Layers",
     "difficulty": 10
   },
   {
@@ -191,6 +211,7 @@
     "id": "globe-moon",
     "tags": [],
     "title": "Moon",
+    "titleCN": "Moon",
     "difficulty": 10
   },
   {
@@ -200,6 +221,7 @@
     "id": "globe-with-echarts-surface",
     "tags": [],
     "title": "Globe with ECharts Surface",
+    "titleCN": "Globe with ECharts Surface",
     "difficulty": 10
   },
   {
@@ -210,6 +232,7 @@
     "tags": [],
     "theme": "dark",
     "title": "GraphGL GPU Layout",
+    "titleCN": "GraphGL GPU Layout",
     "difficulty": 10
   },
   {
@@ -220,6 +243,7 @@
     "tags": [],
     "theme": "dark",
     "title": "GraphGL - Large Internet",
+    "titleCN": "GraphGL - Large Internet",
     "difficulty": 10
   },
   {
@@ -229,7 +253,8 @@
     "id": "graphgl-npm-dep",
     "tags": [],
     "theme": "dark",
-    "title": "1w 节点 2w7 边的NPM 依赖图",
+    "title": "NPM Dependencies with graphGL",
+    "titleCN": "1w 节点 2w7 边的NPM 依赖图",
     "difficulty": 10
   },
   {
@@ -239,6 +264,7 @@
     "id": "image-surface-sushuang",
     "tags": [],
     "title": "Image Surface Sushuang",
+    "titleCN": "Image Surface Sushuang",
     "difficulty": 10
   },
   {
@@ -248,6 +274,7 @@
     "id": "image-to-bar3d",
     "tags": [],
     "title": "Image to Bar3D",
+    "titleCN": "Image to Bar3D",
     "difficulty": 10
   },
   {
@@ -257,6 +284,7 @@
     "id": "iron-globe",
     "tags": [],
     "title": "Iron globe",
+    "titleCN": "Iron globe",
     "difficulty": 10
   },
   {
@@ -266,6 +294,7 @@
     "id": "line3d-orthographic",
     "tags": [],
     "title": "三维折线图正交投影",
+    "titleCN": "三维折线图正交投影",
     "difficulty": 10
   },
   {
@@ -275,6 +304,7 @@
     "id": "lines3d-airline-on-globe",
     "tags": [],
     "title": "Airline on Globe",
+    "titleCN": "Airline on Globe",
     "difficulty": 10
   },
   {
@@ -284,6 +314,7 @@
     "id": "lines3d-flights",
     "tags": [],
     "title": "Flights",
+    "titleCN": "Flights",
     "difficulty": 10
   },
   {
@@ -293,6 +324,7 @@
     "id": "lines3d-flights-gl",
     "tags": [],
     "title": "Flights GL",
+    "titleCN": "Flights GL",
     "difficulty": 10
   },
   {
@@ -302,6 +334,7 @@
     "id": "lines3d-flights-on-geo3d",
     "tags": [],
     "title": "Flights on Geo3D",
+    "titleCN": "Flights on Geo3D",
     "difficulty": 10
   },
   {
@@ -311,6 +344,7 @@
     "id": "linesGL-ny",
     "tags": [],
     "title": "Use linesGL to draw 1 million ny streets.",
+    "titleCN": "实时交互的纽约街道可视化",
     "difficulty": 10
   },
   {
@@ -320,6 +354,7 @@
     "id": "map3d-alcohol-consumption",
     "tags": [],
     "title": "Map3D - Alcohol Consumption",
+    "titleCN": "Map3D - Alcohol Consumption",
     "difficulty": 10
   },
   {
@@ -329,6 +364,7 @@
     "id": "map3d-buildings",
     "tags": [],
     "title": "Buildings",
+    "titleCN": "Buildings",
     "difficulty": 10
   },
   {
@@ -338,6 +374,7 @@
     "id": "map3d-wood-city",
     "tags": [],
     "title": "Wood City",
+    "titleCN": "Wood City",
     "difficulty": 10
   },
   {
@@ -347,6 +384,7 @@
     "id": "map3d-wood-map",
     "tags": [],
     "title": "木质世界地图",
+    "titleCN": "木质世界地图",
     "difficulty": 10
   },
   {
@@ -356,6 +394,7 @@
     "id": "metal-bar3d",
     "tags": [],
     "title": "Metal Bar3D",
+    "titleCN": "Metal Bar3D",
     "difficulty": 10
   },
   {
@@ -365,6 +404,7 @@
     "id": "metal-surface",
     "tags": [],
     "title": "Metal Surface",
+    "titleCN": "Metal Surface",
     "difficulty": 10
   },
   {
@@ -374,6 +414,7 @@
     "id": "parametric-surface-rose",
     "tags": [],
     "title": "Parametric Surface Rose",
+    "titleCN": "Parametric Surface Rose",
     "difficulty": 10
   },
   {
@@ -384,6 +425,7 @@
     "tags": [],
     "theme": "dark",
     "title": "Scatter3D",
+    "titleCN": "Scatter3D",
     "difficulty": 10
   },
   {
@@ -393,6 +435,7 @@
     "id": "scatter3D-dataset",
     "tags": [],
     "title": "3D Scatter with Dataset",
+    "titleCN": "使用 dataset 为三维散点图设置数据",
     "difficulty": 10
   },
   {
@@ -402,6 +445,7 @@
     "id": "scatter3d-globe-population",
     "tags": [],
     "title": "Scatter3D - Globe Population",
+    "titleCN": "Scatter3D - Globe Population",
     "difficulty": 10
   },
   {
@@ -412,6 +456,7 @@
     "tags": [],
     "theme": "dark",
     "title": "三维散点图正交投影",
+    "titleCN": "三维散点图正交投影",
     "difficulty": 10
   },
   {
@@ -421,6 +466,7 @@
     "id": "scatter3d-scatter",
     "tags": [],
     "title": "3D Scatter with Scatter Matrix",
+    "titleCN": "三维散点图和散点矩阵结合使用",
     "difficulty": 10
   },
   {
@@ -431,6 +477,7 @@
     "tags": [],
     "theme": "dark",
     "title": "Scatter3D - Simplex Noise",
+    "titleCN": "Scatter3D - Simplex Noise",
     "difficulty": 10
   },
   {
@@ -440,6 +487,7 @@
     "id": "scatterGL-gps",
     "tags": [],
     "title": "10 million Bulk GPS points",
+    "titleCN": "1 千万 GPS 点可视化",
     "difficulty": 10
   },
   {
@@ -450,6 +498,7 @@
     "tags": [],
     "theme": "dark",
     "title": "微博签到数据点亮中国",
+    "titleCN": "微博签到数据点亮中国",
     "difficulty": 10
   },
   {
@@ -459,6 +508,7 @@
     "id": "simple-surface",
     "tags": [],
     "title": "Simple Surface",
+    "titleCN": "Simple Surface",
     "difficulty": 10
   },
   {
@@ -468,6 +518,7 @@
     "id": "sphere-parametric-surface",
     "tags": [],
     "title": "Sphere Parametric Surface",
+    "titleCN": "Sphere Parametric Surface",
     "difficulty": 10
   },
   {
@@ -477,6 +528,7 @@
     "id": "stacked-bar3d",
     "tags": [],
     "title": "Stacked Bar3D",
+    "titleCN": "Stacked Bar3D",
     "difficulty": 10
   },
   {
@@ -486,6 +538,7 @@
     "id": "surface-breather",
     "tags": [],
     "title": "Breather",
+    "titleCN": "Breather",
     "difficulty": 10
   },
   {
@@ -495,6 +548,7 @@
     "id": "surface-golden-rose",
     "tags": [],
     "title": "Golden Rose",
+    "titleCN": "Golden Rose",
     "difficulty": 10
   },
   {
@@ -504,6 +558,7 @@
     "id": "surface-leather",
     "tags": [],
     "title": "皮革材质",
+    "titleCN": "皮革材质",
     "difficulty": 10
   },
   {
@@ -513,6 +568,7 @@
     "id": "surface-mollusc-shell",
     "tags": [],
     "title": "Mollusc Shell",
+    "titleCN": "Mollusc Shell",
     "difficulty": 10
   },
   {
@@ -522,6 +578,7 @@
     "id": "surface-theme-roses",
     "tags": [],
     "title": "Theme Roses",
+    "titleCN": "Theme Roses",
     "difficulty": 10
   },
   {
@@ -531,6 +588,7 @@
     "id": "surface-wave",
     "tags": [],
     "title": "Surface Wave",
+    "titleCN": "Surface Wave",
     "difficulty": 10
   },
   {
@@ -540,6 +598,7 @@
     "id": "transparent-bar3d",
     "tags": [],
     "title": "Transparent Bar3D",
+    "titleCN": "Transparent Bar3D",
     "difficulty": 10
   }
 ]
\ No newline at end of file
diff --git a/src/data/chart-list-data.js b/src/data/chart-list-data.js
index bfec51b..6de5003 100644
--- a/src/data/chart-list-data.js
+++ b/src/data/chart-list-data.js
@@ -1090,6 +1090,16 @@
   },
   {
     "category": [
+      "boxplot"
+    ],
+    "id": "data-transform-aggregate",
+    "tags": [],
+    "title": "Data Transform Simple Aggregate",
+    "titleCN": "简单的数据聚合",
+    "difficulty": 4
+  },
+  {
+    "category": [
       "gauge"
     ],
     "id": "gauge-grade",
@@ -1386,6 +1396,16 @@
   },
   {
     "category": [
+      "line"
+    ],
+    "id": "line-race",
+    "tags": [],
+    "title": "Line Race",
+    "titleCN": "动态排序折线图",
+    "difficulty": 5
+  },
+  {
+    "category": [
       "pie",
       "rich"
     ],
@@ -1448,6 +1468,16 @@
   },
   {
     "category": [
+      "bar"
+    ],
+    "id": "bar-race-country",
+    "tags": [],
+    "title": "Bar Race",
+    "titleCN": "动态排序柱状图 - 人均收入",
+    "difficulty": 6
+  },
+  {
+    "category": [
       "bar",
       "rich"
     ],
@@ -1763,6 +1793,26 @@
     "category": [
       "custom"
     ],
+    "id": "custom-aggregate-scatter-bar",
+    "tags": [],
+    "title": "Aggregate Morphing Between Scatter and Bar",
+    "titleCN": "聚合分割形变(散点图 - 柱状图)",
+    "difficulty": 9
+  },
+  {
+    "category": [
+      "custom"
+    ],
+    "id": "custom-aggregate-scatter-pie",
+    "tags": [],
+    "title": "Aggregate Morphing Between Scatter and Pie",
+    "titleCN": "聚合分割形变(散点图 - 饼图)",
+    "difficulty": 9
+  },
+  {
+    "category": [
+      "custom"
+    ],
     "id": "custom-gauge",
     "tags": [],
     "title": "Custom Gauge",
@@ -1876,6 +1926,22 @@
     "difficulty": 10
   },
   {
+    "category": [],
+    "id": "covid-america",
+    "tags": [],
+    "difficulty": 10
+  },
+  {
+    "category": [
+      "custom"
+    ],
+    "id": "custom-aggregate-scatter-cluster",
+    "tags": [],
+    "title": "Aggregate Morphing Between Scatter Clustering",
+    "titleCN": "聚合分割形变(散点图聚类)",
+    "difficulty": 10
+  },
+  {
     "category": [
       "scatter",
       "map"
@@ -2461,10 +2527,10 @@
     "category": [
       "custom"
     ],
-    "id": "custom-combine-separate-morph",
+    "id": "circle-packing-with-d3",
     "tags": [],
-    "title": "Combine-Separate Morphing",
-    "titleCN": "聚合分割形变",
+    "title": "Circle Packing with d3",
+    "titleCN": "Circle Packing with d3",
     "difficulty": 11
   },
   {
diff --git a/src/editor/CodeAce.vue b/src/editor/CodeAce.vue
index 82a09da..ba51f76 100644
--- a/src/editor/CodeAce.vue
+++ b/src/editor/CodeAce.vue
@@ -104,5 +104,13 @@
     font-size: 12px;
     line-height: 18px;
     padding: 10px;
+    // height: 100%;
+
+    // Fix safari
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
 }
 </style>
\ No newline at end of file
diff --git a/src/editor/CodeMonaco.vue b/src/editor/CodeMonaco.vue
index a0f3d06..990443d 100644
--- a/src/editor/CodeMonaco.vue
+++ b/src/editor/CodeMonaco.vue
@@ -165,5 +165,12 @@
     font-size: 12px;
     padding: 0;
     overflow-y: hidden;
+    // height: 100%;
+    // Fix safari
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
 }
 </style>
\ No newline at end of file
diff --git a/src/editor/Editor.vue b/src/editor/Editor.vue
index 7f026bc..bf9507c 100644
--- a/src/editor/Editor.vue
+++ b/src/editor/Editor.vue
@@ -1,23 +1,59 @@
 <template>
 <div id="main-container">
-    <div id="code-container" :style="{width: leftContainerSize + '%'}" v-if="!shared.isMobile">
-        <div id="control-panel">
-            <div id="code-info">
-                <template v-if="shared.editorStatus.message">
-                    <span class="code-info-time">{{currentTime}}</span>
-                    <span :class="'code-info-type-' + shared.editorStatus.type">{{shared.editorStatus.message}}</span>
-                </template>
-            </div>
-            <div class="control-btn-panel">
-                <!-- <el-switch v-model="shared.typeCheck"
-                    :active-text="$t('editor.monacoMode')"
-                    :inactive-text="''"
-                ></el-switch> -->
-                <a href="javascript:;" class='btn btn-default btn-sm' @click='disposeAndRun'>{{$t('editor.run')}}</a>
-            </div>
-        </div>
-        <CodeMonaco v-if="shared.typeCheck" id="code-panel" :initialCode="initialCode"></CodeMonaco>
-        <CodeAce v-else id="code-panel" :initialCode="initialCode"></CodeAce>
+    <div id="editor-left-container" :style="{width: leftContainerSize + '%'}" v-if="!shared.isMobile">
+        <el-tabs v-model="currentTab" type="border-card">
+            <el-tab-pane :label="$t('editor.tabEditor')" name="code-editor">
+                <el-container>
+                    <el-header id="editor-control-panel">
+                        <div id="code-info">
+                            <template v-if="shared.editorStatus.message">
+                                <span class="code-info-time">{{currentTime}}</span>
+                                <span :class="'code-info-type-' + shared.editorStatus.type">{{shared.editorStatus.message}}</span>
+                            </template>
+                        </div>
+                        <div class="editor-controls">
+                            <!-- <el-switch v-model="shared.typeCheck"
+                                :active-text="$t('editor.monacoMode')"
+                                :inactive-text="''"
+                            ></el-switch> -->
+                            <a href="javascript:;" class='btn btn-default btn-sm' @click='disposeAndRun'>{{$t('editor.run')}}</a>
+                        </div>
+                    </el-header>
+                    <el-main>
+                        <CodeMonaco v-if="shared.typeCheck" id="code-panel" :initialCode="initialCode"></CodeMonaco>
+                        <CodeAce v-else id="code-panel" :initialCode="initialCode"></CodeAce>
+                    </el-main>
+                </el-container>
+            </el-tab-pane>
+
+            <el-tab-pane :label="$t('editor.tabFullCodePreview')" name="full-code" :lazy="true">
+                <el-container style="width: 100%; height: 100%">
+                    <el-header id="full-code-generate-config">
+                        <span class="full-code-generate-config-label">
+                            <!-- <i class="el-icon-setting"></i> 配置 -->
+                        </span>
+                        <el-switch
+                            class="enable-decal"
+                            v-model="fullCodeConfig.minimal"
+                            :active-text="$t('editor.minimalBundle')"
+                            :inactive-text="''">
+                        </el-switch>
+                        <el-switch
+                            class="enable-decal"
+                            v-model="fullCodeConfig.esm"
+                            active-text="ES Modules"
+                            :inactive-text="''">
+                        </el-switch>
+                    </el-header>
+                    <el-main>
+                        <FullCodePreview :code="fullCode"></FullCodePreview>
+                    </el-main>
+                </el-container>
+            </el-tab-pane>
+            <el-tab-pane :label="$t('editor.tabOptionPreview')" name="full-option">
+                <div id="option-outline"></div>
+            </el-tab-pane>
+        </el-tabs>
     </div>
     <div class="handler" id="h-handler" @mousedown="onSplitterDragStart" :style="{left: leftContainerSize + '%'}" v-if="!shared.isMobile"></div>
     <Preview :inEditor="true" class="right-container" ref="preview" :style="{
@@ -31,14 +67,20 @@
 
 import CodeAce from './CodeAce.vue';
 import CodeMonaco from './CodeMonaco.vue';
+import FullCodePreview from './FullCodePreview.vue';
 import Preview from './Preview.vue';
 import {URL_PARAMS} from '../common/config';
 import {store, loadExampleCode, parseSourceCode} from '../common/store';
+import {collectDeps, buildExampleCode} from '../../common/buildCode';
+import { mount } from "@lang/object-visualizer";
+
+import './object-visualizer.css';
 
 export default {
     components: {
         CodeAce,
         CodeMonaco,
+        FullCodePreview,
         Preview
     },
 
@@ -48,7 +90,17 @@
             leftContainerSize: 40,
             mobileMode: false,
             shared: store,
-            initialCode: ''
+            initialCode: '',
+
+            currentTab: 'code-editor',
+
+            fullCode: '',
+
+            fullCodeConfig: {
+                mimimal: false,
+                esm: true,
+                node: false // If is in node
+            }
         };
     },
 
@@ -105,6 +157,54 @@
         },
         disposeAndRun() {
             this.$refs.preview.refreshAll();
+        },
+        updateFullCode() {
+            const option = this.$refs.preview.getOption();
+            if (!option) {
+                return;
+            }
+            const deps = collectDeps(option);
+            deps.push(store.renderer === 'svg' ? 'SVGRenderer' : 'CanvasRenderer');
+            this.fullCode = buildExampleCode(store.sourceCode, deps, {
+                minimal: this.fullCodeConfig.minimal,
+                ts: false,
+                esm: this.fullCodeConfig.esm,
+                // legacy: true,
+                theme: store.darkMode ? 'dark' : '',
+                ROOT_PATH: store.cdnRoot
+            });
+        },
+        updateOptionOutline() {
+            const option = Object.freeze(this.$refs.preview.getOption());
+            if (!option) {
+                return;
+            }
+            mount(
+                option,
+                this.$el.querySelector('#option-outline'),
+                {
+                    getKeys(object, path) {
+                        return Object.keys(object).filter(key => {
+                            if (Array.isArray(object[key]) && !object[key].length) {
+                                return false;
+                            }
+                            return true;
+                        });
+                    },
+                    expandOnCreatedAndUpdated(path) {
+                        return path.length === 0
+                            || (path[0] === 'series' && path.length <= 1);
+                    },
+                }
+            );
+        },
+        updateTabContent(tab) {
+            if (tab === 'full-code') {
+                this.updateFullCode();
+            }
+            else if (tab === 'full-option') {
+                this.updateOptionOutline();
+            }
         }
     },
 
@@ -112,6 +212,19 @@
         'shared.typeCheck'(enableTypeCheck) {
             // Update initialCode to avoid code changed when switching editor
             this.initialCode = store.sourceCode;
+            this.updateFullCode();
+        },
+        'currentTab'(tab) {
+            this.updateTabContent(tab);
+        },
+        'shared.runHash'() {
+            this.updateTabContent(this.currentTab);
+        },
+        fullCodeConfig: {
+            deep: true,
+            handler() {
+                this.updateFullCode();
+            }
         }
     }
 }
@@ -144,25 +257,119 @@
 
 }
 
-#code-container {
+#editor-left-container {
     position: absolute;
     left: 0;
     bottom: 0;
     top: 0;
 
     width: 50%;
+
+    .el-tab-pane {
+        height: 100%;
+
+        .el-container {
+            width: 100%;
+            height: 100%;
+        }
+
+        .el-header {
+            height: $control-panel-height!important;
+            position: relative;
+            z-index: 10;
+            padding: 0;
+        }
+        .el-main {
+            padding: 0;
+            position: relative;
+
+            ::-webkit-scrollbar {
+                height:8px;
+                width:8px;
+                transition:all 0.3s ease-in-out;
+                border-radius:2px;
+            }
+
+            ::-webkit-scrollbar-button {
+                display:none;
+            }
+
+            ::-webkit-scrollbar-thumb {
+                width:8px;
+                min-height:15px;
+                background:rgba(50, 50, 50, 0.6) !important;
+                transition:all 0.3s ease-in-out;border-radius:2px;
+            }
+
+            ::-webkit-scrollbar-thumb:hover {
+                background:rgba(0, 0, 0, 0.5) !important;
+            }
+        }
+    }
+
+    .el-tabs {
+        box-shadow: none;
+    }
+
+    .el-tabs--border-card>.el-tabs__header {
+        border-bottom: none;
+    }
+
+    .el-tabs__content {
+        position: absolute;
+        top: 34px;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        padding: 0;
+    }
+
+    .el-tabs__item {
+        height: 34px;
+        line-height: 34px;
+    }
 }
 
-#control-panel {
-    height: $control-panel-height;
-    position: absolute;;
-    left: 0;
-    right: 0;
-    top: 0;
-    z-index: 20;
-    padding: 0;
+#editor-control-panel, #full-code-generate-config {
     box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
 
+#option-outline {
+    // height: 100%;
+    // Fix safari
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
+
+    font-size: 13px;
+
+    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
+}
+
+#full-code-generate-config {
+    .full-code-generate-config-label {
+        height: $control-panel-height;
+        line-height: $control-panel-height;
+        vertical-align: middle;
+        margin: 0 0 0 20px;
+    }
+
+    .el-switch {
+        margin-right: 10px;
+    }
+
+    .el-switch__label {
+        margin-left: 8px;
+        margin-top: -2px;
+    }
+    .el-switch__label * {
+        font-size: 12px;
+    }
+}
+
+#editor-control-panel {
     .setting-panel {
         display: inline-block;
 
@@ -171,7 +378,7 @@
         }
     }
 
-    .control-btn-panel  {
+    .editor-controls  {
         float: right;
 
         .el-switch__label {
@@ -196,36 +403,6 @@
     }
 }
 
-
-#code-panel {
-    position: absolute;
-    top: $control-panel-height;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    ::-webkit-scrollbar {
-        height:8px;
-        width:8px;
-        transition:all 0.3s ease-in-out;
-        border-radius:2px;
-    }
-
-    ::-webkit-scrollbar-button {
-        display:none;
-    }
-
-    ::-webkit-scrollbar-thumb {
-        width:8px;
-        min-height:15px;
-        background:rgba(50, 50, 50, 0.6) !important;
-        transition:all 0.3s ease-in-out;border-radius:2px;
-    }
-
-    ::-webkit-scrollbar-thumb:hover {
-        background:rgba(0, 0, 0, 0.5) !important;
-    }
-}
-
 #code-info {
     position: absolute;
     bottom: 0;
@@ -242,10 +419,12 @@
         color: $clr-text;
         display: inline-block;
         margin-right: 10px;
+        font-size: 12px;
     }
 
     .code-info-type-info {
         color: $clr-text;
+        font-size: 12px;
     }
 
     .code-info-type-warn {
diff --git a/src/editor/FullCodePreview.vue b/src/editor/FullCodePreview.vue
new file mode 100644
index 0000000..e2f1c3f
--- /dev/null
+++ b/src/editor/FullCodePreview.vue
@@ -0,0 +1,94 @@
+<template>
+<div class="full-code-preview" v-loading="loading"></div>
+</template>
+
+<script>
+
+import {loadScriptsAsync} from '../common/helper';
+import {store} from '../common/store';
+import {SCRIPT_URLS} from '../common/config';
+
+function ensureACE() {
+    if (typeof ace === 'undefined') {
+        return loadScriptsAsync([
+            SCRIPT_URLS.aceDir + '/ace.js'
+        ]);
+    }
+    return Promise.resolve();
+}
+
+export default {
+
+    props: ['code'],
+
+    data() {
+        return {
+            shared: store,
+            loading: false
+        }
+    },
+
+    mounted() {
+        this.loading = true;
+        ensureACE().then(() => {
+            this.loading = false;
+            const editor = ace.edit(this.$el);
+            editor.getSession().setMode('ace/mode/javascript');
+            // https://stackoverflow.com/questions/32806060/is-there-a-programmatic-way-to-hide-the-cursor-in-ace-editor
+            editor.setOptions({
+                readOnly: true,
+                showLineNumbers: false,
+                showFoldWidgets: false,
+                highlightActiveLine: false,
+                highlightGutterLine: false
+            });
+            // editor.renderer.setShowGutter(false);
+            editor.renderer.$cursorLayer.element.style.display = 'none';
+
+            this._editor = editor;
+
+            this.setCode(this.code);
+
+        });
+    },
+
+    methods: {
+        setCode(code) {
+            if (this._editor) {
+                this._editor.setValue(code);
+                this._editor.selection.setSelectionRange({
+                    start: {
+                        row:1,
+                        column: 4
+                    }, end: {
+                        row:1,
+                        column: 4
+                    }
+                });
+            }
+        }
+    },
+
+    watch: {
+        code(newVal) {
+            this.setCode(newVal);
+        }
+    }
+}
+</script>
+
+<style lang="scss">
+.full-code-preview {
+    font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
+    font-size: 12px;
+    line-height: 18px;
+    // height: 100%;
+
+    // Fix safari
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
+}
+</style>
\ No newline at end of file
diff --git a/src/editor/Preview.vue b/src/editor/Preview.vue
index 52a3db1..7363ce8 100644
--- a/src/editor/Preview.vue
+++ b/src/editor/Preview.vue
@@ -15,6 +15,8 @@
                 :inactive-text="''">
             </el-switch>
             <el-switch
+                v-if="!isGL"
+
                 class="enable-decal"
                 v-model="shared.enableDecal"
                 :active-text="$t('editor.enableDecal')"
@@ -26,6 +28,8 @@
                 width="450"
                 trigger="click"
                 style="margin-top:3px;"
+
+                v-if="!isGL"
             >
                 <div class="render-config-container">
                     <el-row :gutter="2" type="flex" align="middle">
@@ -60,16 +64,21 @@
 
 <script>
 
-import {store} from '../common/store';
+import {store, updateRunHash} from '../common/store';
 import {SCRIPT_URLS, URL_PARAMS} from '../common/config';
 import {loadScriptsAsync} from '../common/helper';
 import {createSandbox} from './sandbox';
 import debounce from 'lodash/debounce';
 import { addListener, removeListener } from 'resize-detector';
 import CHART_LIST from '../data/chart-list-data';
+import CHART_LIST_GL from '../data/chart-list-data-gl';
 import {download} from './downloadExample';
 
-const example = CHART_LIST.find(item => URL_PARAMS.c === item.id);
+function findExample(item) {
+    return URL_PARAMS.c === item.id;
+}
+const example = CHART_LIST.concat(CHART_LIST_GL).find(findExample);
+const isGL = CHART_LIST_GL.find(findExample);
 
 function addDecalIfNecessary(option) {
     if (store.enableDecal) {
@@ -121,6 +130,7 @@
 
 
 function run() {
+
     if (typeof echarts === 'undefined') {
         return;
     }
@@ -155,6 +165,10 @@
                 break;
             }
         }
+
+        // Update run hash to let others known chart has been changed.
+        updateRunHash();
+
     }
     catch (e) {
         log(this.$t('editor.errorInEditor'), 'error');
@@ -173,7 +187,9 @@
             debouncedTime: undefined,
             backgroundColor: '',
             autoRun: true,
-            loading: false
+            loading: false,
+
+            isGL
         }
     },
 
@@ -261,6 +277,9 @@
                 });
                 $a.dispatchEvent(evt);
             }
+        },
+        getOption() {
+            return this.sandbox && this.sandbox.getOption();
         }
         // hasEditorError() {
         //     const annotations = this.editor.getSession().getAnnotations();
diff --git a/src/editor/object-visualizer.css b/src/editor/object-visualizer.css
new file mode 100644
index 0000000..372a9fd
--- /dev/null
+++ b/src/editor/object-visualizer.css
@@ -0,0 +1,72 @@
+.object-visualizer {
+    border-radius: 4px;
+    overflow-x: auto;
+    margin: 0;
+    padding: 10px;
+    /* font-family: Menlo; */
+    font-size: 0.6em;
+    line-height: 1.7;
+  }
+
+  .array > .value,
+  .object > .value {
+    display: flex;
+    flex-direction: column;
+    margin-left: 2em;
+  }
+
+  .key {
+    /* color: #4078f2; */
+    color: #111;
+    user-select: none;
+  }
+
+  .string > .value {
+    color: #50a14f;
+  }
+
+  .boolean > .value,
+  .number > .value {
+    color: #d19a66;
+  }
+
+  .null > .value,
+  .undefined > .value {
+    color: hsl(0, 0%, 40%);
+  }
+
+  .separator {
+    cursor: pointer;
+    font-size: 0.8em;
+    user-select: none;
+    color: hsl(0, 0%, 30%);
+  }
+
+  .indicator {
+    cursor: pointer;
+    font-size: 0.8em;
+    padding-right: 0.5em;
+    user-select: none;
+    vertical-align: text-bottom;
+    color: hsl(0, 0%, 30%);
+  }
+
+  .array > .key,
+  .object > .key {
+    cursor: pointer;
+  }
+
+  .value > .array,
+  .value > .object {
+    position: relative;
+    left: -0.8em;
+  }
+
+  .count,
+  .preview,
+  .quotes {
+    cursor: pointer;
+    font-size: 0.8em;
+    user-select: none;
+    color: hsl(0, 0%, 30%);
+  }
diff --git a/src/editor/sandbox.js b/src/editor/sandbox.js
index cfeafe8..4786d75 100644
--- a/src/editor/sandbox.js
+++ b/src/editor/sandbox.js
@@ -79,6 +79,10 @@
             });
         },
 
+        getOption() {
+            return chartInstance.getOption();
+        },
+
         run(el, store) {
 
             if (!chartInstance) {
diff --git a/src/explore/ExampleCard.vue b/src/explore/ExampleCard.vue
index c6f5bdd..bd465b8 100644
--- a/src/explore/ExampleCard.vue
+++ b/src/explore/ExampleCard.vue
@@ -33,7 +33,7 @@
 
         exampleTheme() {
             const example = this.example;
-            return example.isGL ? '' : (example.theme || (store.darkMode ? 'dark' : ''));
+            return example.theme || (store.darkMode ? 'dark' : '');
         },
 
         exampleLink() {
@@ -58,7 +58,7 @@
         screenshotURL() {
             const example = this.example;
             const themePostfix = this.exampleTheme ? ('-' + this.exampleTheme) : '';
-            const ext = example.isGL ? 'jpg' : SUPPORT_WEBP ? 'webp' : 'png';
+            const ext = SUPPORT_WEBP ? 'webp' : 'png';
             const folder = example.isGL ? 'data-gl' : 'data';
             return `${store.cdnRoot}/${folder}/thumb${themePostfix}/${example.id}.${ext}?_v_=${store.version}`;
         }
diff --git a/src/explore/Explore.vue b/src/explore/Explore.vue
index 89f418f..873674e 100644
--- a/src/explore/Explore.vue
+++ b/src/explore/Explore.vue
@@ -1,14 +1,6 @@
 <template>
 <div id="example-explore">
     <div id="left-container">
-        <div id="left-toolbar">
-            <el-switch
-                v-model="shared.darkMode"
-                active-color="#181432"
-                :active-text="$t('editor.darkMode')"
-                :inactive-text="''">
-            </el-switch>
-        </div>
         <div id="left-chart-nav">
             <scrollactive
                 active-class="active"
@@ -23,7 +15,7 @@
                         <a class="left-chart-nav-link scrollactive-item" :id="'left-chart-nav-' + category"
                             :href="'#chart-type-' + category"
                         >
-                            <span class="chart-icon"></span>
+                            <span class="chart-icon" v-html="icons[category]"></span>
                             <span class="chart-name">{{$t('chartTypes.' + category)}}</span>
                         </a>
                     </li>
@@ -50,6 +42,14 @@
             </div>
         </div>
     </div>
+    <div id="toolbar">
+        <el-switch
+            v-model="shared.darkMode"
+            active-color="#181432"
+            :active-text="$t('editor.darkMode')"
+            :inactive-text="''">
+        </el-switch>
+    </div>
 </div>
 </template>
 
@@ -61,7 +61,23 @@
 import {store} from '../common/store';
 import ExampleCard from './ExampleCard.vue';
 import LazyLoad from 'vanilla-lazyload/dist/lazyload.esm';
-import scrollIntoView from 'scroll-into-view';
+// import scrollIntoView from 'scroll-into-view';
+
+const icons = {};
+
+['line', 'bar', 'scatter', 'pie', 'radar', 'funnel', 'gauge', 'map',
+    'graph', 'treemap', 'parallel', 'sankey', 'candlestick', 'boxplot', 'heatmap',
+    'pictorialBar', 'themeRiver', 'calendar', 'custom', 'sunburst', 'tree', 'dataset', 'geo', 'lines',
+    'dataZoom', 'rich', 'drag'
+].forEach(function (category) {
+    icons[category] = require('../asset/icon/' + category + '.svg');
+});
+
+const glIcon = require('../asset/icon/gl.svg');
+['globe', 'bar3D', 'scatter3D', 'surface', 'map3D', 'lines3D', 'line3D',
+    'scatterGL', 'linesGL', 'flowGL', 'graphGL', 'geo3D'].forEach(function (category) {
+    icons[category] = glIcon;
+});
 
 const LAZY_LOADED_CLASS = 'ec-shot-loaded';
 
@@ -117,6 +133,8 @@
         return {
             shared: store,
 
+            icons,
+
             EXAMPLE_CATEGORIES,
             // [{
             //  category: '',
@@ -168,11 +186,9 @@
 
     methods: {
         onActiveNavChanged(event, currentItem, lastActiveItem) {
-            // currentItem && currentItem.scrollIntoView && currentItem.parentNode.scrollIntoView({
-            //     // behavior: "smooth"
-            // });
+            // currentItem && currentItem.scrollIntoView && currentItem.parentNode.scrollIntoView();
             // scrollIntoView(currentItem, {
-            //     time: 300,
+            //     time: 100,
             //     cancellable: false,
             //     align: {
             //         top: 0,
@@ -189,14 +205,18 @@
 @import "../style/color.scss";
 @import "../style/config.xl.scss";
 
-$chart-nav-width: 170px;
+$chart-nav-width: 200px;
 $chart-icon-width: 25px;
 $chart-icon-border: 1px;
 
-$left-toolbar-height: 30px;
+$toolbar-height: 30px;
 
 $nav-height: 50px;
-$nav-bg: #252839;
+$nav-active-bg: #5470C6;
+$nav-hover-border: $nav-active-bg;
+
+$nav-text-color: #6E7079;
+$nav-hover-text-color: #464646;
 
 $pd-basic: 10px;
 $pd-sm: 6px;
@@ -212,6 +232,32 @@
     bottom: 0;
     left: 0;
     overflow-y: auto;
+
+    ::-webkit-scrollbar {
+        height: 4px;
+        width: 4px;
+        -webkit-transition: all 0.3s ease-in-out;
+        transition: all 0.3s ease-in-out;
+        border-radius: 2px;
+        background: #fff;
+    }
+
+    ::-webkit-scrollbar-button {
+        display: none
+    }
+
+    ::-webkit-scrollbar-thumb {
+        width: 4px;
+        min-height: 15px;
+        background: rgba(50, 50, 50, 0.2) !important;
+        -webkit-transition: all 0.3s ease-in-out;
+        transition: all 0.3s ease-in-out;
+        border-radius: 2px
+    }
+
+    ::-webkit-scrollbar-thumb:hover {
+        background: rgba(0, 0, 0, 0.5) !important
+    }
 }
 
 #explore-container {
@@ -226,38 +272,41 @@
     h3 {
         margin-bottom: 20px;
         padding-bottom: 10px;
-        border-bottom: 1px solid #ccd3e8;
+        border-bottom: 1px solid #E1E5F2;
         font-weight: normal;
-        color: #252839;
+        color: #464646;
+        font-size: 20px;
     }
     .chart-type-head span {
-        font-size: 18px;
+        font-size: 16px;
         padding-left: 5px;
-        color: #999;
+        color: #949CB1;
         font-weight: 200;
     }
 }
 
 #left-container {
-    position: fixed;
-    top: 10px;
-    bottom: 10px;
-    left: 10px;
+    position: sticky;
+    left: 0;
+    top: 0;
+    float: left;
+    height: calc(100%);
     width: $chart-nav-width;
+    box-shadow: 0 0 10px rgba(0,0,0,0.1);
+    overflow-y: auto;
+
 }
 
-#left-toolbar {
-    position: absolute;
-    left: 0;
-    right: 0;
-    height: $left-toolbar-height;
-    top: 0;
+#toolbar {
+    position: fixed;
+    right: 30px;
+    top: 20px;
+    height: $toolbar-height;
     background-color: #fff;
-    border-radius: 10px;
+    border-radius: $toolbar-height / 2;
     // color: #fff;
+    padding: 4px 15px;
     box-shadow: 0 0 10px rgba(0,0,0,0.1);
-    padding-left: 5px;
-    padding-top: 4px;
 
     .el-switch__label * {
         font-size: 12px;
@@ -270,15 +319,9 @@
 }
 
 #left-chart-nav {
-    position: absolute;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    top: $left-toolbar-height + 10px;
-    background-color: $nav-bg;
+    background-color: #fff;
     overflow-y: hidden;
-    border-radius: 10px;
-    color: #fff;
+    color: #111;
     box-shadow: 0 0 20px rgba(0,0,0,0.2);
 
     &:hover {
@@ -290,16 +333,16 @@
     }
 
     li {
-        transition: 0.5s;
+        // transition: background-color 0.5s;
         cursor: pointer;
 
         a {
             height: 45px;
-            padding: 10px 0 10px 10px;
+            padding: 10px 0 10px 20px;
             display: block;
-            transition: 0.5s;
+            // transition: background-color 0.5s;
             text-decoration: none;
-            color: inherit;
+            color: $nav-text-color;
 
             .chart-name {
                 display: inline-block;
@@ -310,24 +353,37 @@
 
             .chart-icon {
                 content: '';
+                width: 20px;
                 display: inline-block;
-                width: $chart-icon-width;
-                height: $chart-icon-width;
-                background-image: url('../asset/chart-icon.png');
-                background-size: $chart-icon-width;
-                background-repeat: no-repeat;
                 border-radius: 50%;
-                border: $chart-icon-border solid #fff;
                 vertical-align: middle;
-            }
-            &.active {
-                background-color: $clr-contrast;
+
+                svg {
+                    width: 100%!important;
+                    height: auto!important;
+                }
             }
 
+            &.active {
+                background-color: $nav-active-bg;
+                color: #fff;
+
+                .chart-icon * {
+                    fill: #fff;
+                }
+            }
+
+            &.active:hover {
+                color: #fff;
+            }
         }
 
         &:hover {
-            background-color: darken($nav-bg, 10);
+            border-right: 4px solid $nav-hover-border;
+
+            a {
+                color: $nav-hover-text-color;
+            }
         }
     }
 }
@@ -341,22 +397,4 @@
     }
 }
 
-// icon sprites
-$chart-types: 'line', 'bar', 'scatter', 'pie', 'radar', 'funnel', 'gauge', 'map',
-    'graph', 'treemap', 'parallel', 'sankey', 'candlestick', 'boxplot', 'heatmap',
-    'pictorialBar', 'themeRiver', 'calendar', 'custom', 'sunburst', 'tree',
-    'globe', 'bar3D', 'scatter3D', 'surface', 'map3D', 'lines3D', 'line3D',
-    'scatterGL', 'linesGL', 'flowGL', 'graphGL', 'geo3D', 'geo', 'lines', 'dataset';
-$chart-position: 0, 1, 2, 4, 5, 10, 9, 8, 7, 15, 16, 17, 3, 18, 11, 24, 25, 26, 27, 28, 14,
-    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 8, 20, 22;
-
-@each $type in $chart-types {
-    $i: index($chart-types, $type);
-    $pos: nth($chart-position, $i);
-    #left-chart-nav-#{$type} .chart-icon {
-        background-position-x: - $chart-icon-border;
-        background-position-y: - $chart-icon-border - $pos * $chart-icon-width;
-    }
-}
-
 </style>
\ No newline at end of file
diff --git a/tool/build-example.js b/tool/build-example.js
index f548824..417634e 100644
--- a/tool/build-example.js
+++ b/tool/build-example.js
@@ -1,5 +1,5 @@
 const fs = require('fs');
-const glob = require('glob');
+const globby = require('globby');
 const path = require('path');
 const puppeteer = require('puppeteer');
 const matter = require('gray-matter');
@@ -10,6 +10,23 @@
 const util = require('util');
 const chalk = require('chalk');
 const sharp = require('sharp');
+const fse = require('fs-extra');
+const { compareImage } = require('../common/compareImage');
+const { runTasks } = require('../common/task');
+const nStatic = require('node-static');
+
+function optionToJson(obj, prop) {
+    let json = JSON.stringify(obj, function(key, value) {
+        if (typeof value === 'function') {
+            return 'expr: ' + value.toString();
+        }
+        return value;
+    }, 2);
+    return json;
+};
+function codeSize(code) {
+    return Buffer.byteLength(code, 'utf-8');
+}
 
 const parser = new argparse.ArgumentParser({
     addHelp: true
@@ -41,16 +58,23 @@
     return new Promise((resolve) => setTimeout(resolve, time));
 }
 
-const BUILD_THUMBS = sourceFolder === 'data' && !args.no_thumb;
-const BASE_PATH = 'file://' + __dirname;
-const SCREENSHOT_PAGE_URL = path.join(BASE_PATH, `../public/screenshot.html`);
+const BUILD_THUMBS = !args.no_thumb;
 const DEFAULT_PAGE_WIDTH = 700;
 const DEFAULT_PAGE_RATIO = 0.75;
 const OUTPUT_IMAGE_WIDTH = 600;
 
+const PORT = 3323;
+const BASE_URL = `http://localhost:${PORT}`;
+const SCREENSHOT_PAGE_URL = `${BASE_URL}/tool/screenshot.html`;
+
 const IGNORE_LOG = [
+    // For BMap
     'A cookie associated with a cross-site resource at',
-    'A parser-blocking, cross site'
+    'A parser-blocking, cross site',
+    // For ECharts GL
+    'RENDER WARNING',
+    'GL ERROR',
+    'GL_INVALID_OPERATION'
 ];
 
 async function convertToWebP(filePath) {
@@ -67,25 +91,13 @@
 ) {
     const thumbFolder = (theme !== 'default') ? ('thumb-' + theme) : 'thumb';
     const page = await browser.newPage();
-    await page.exposeFunction('readLocalFile', async (filePath, type) => {
-        filePath = filePath.replace(/^file:\/*?/, '');
-        return new Promise((resolve, reject) => {
-            fs.readFile(filePath, type || 'utf8', (err, text) => {
-                if (err) {
-                    reject(err);
-                }
-                else {
-                    resolve(text);
-                }
-            });
-        });
-    });
+
     await page.setViewport({
         width: (pageWidth || DEFAULT_PAGE_WIDTH),
         height: (pageWidth || DEFAULT_PAGE_WIDTH) * DEFAULT_PAGE_RATIO
     });
     const url = `${SCREENSHOT_PAGE_URL}?c=${basename}&s=${sourceFolder}&t=${theme}`;
-    const resourceRootPath = path.join(BASE_PATH, '../public/');
+    const resourceRootPath = `${BASE_URL}/public`;
     // console.log(url);
     await page.evaluateOnNewDocument(function (resourceRootPath) {
         window.ROOT_PATH = resourceRootPath;
@@ -98,7 +110,7 @@
     page.on('console', msg => {
         const text = msg.text();
         if (!IGNORE_LOG.find(a => text.indexOf(a) >= 0)) {
-            console.log('PAGE LOG:', text);
+            console.log(chalk.gray(`PAGE LOG[${basename}]: ${text}`));
         }
     });
     console.log(`Generating ${theme} thumbs.....${basename}`);
@@ -107,7 +119,7 @@
         try {
             await page.goto(url, {
                 waitUntil: 'networkidle0',
-                timeout: 10000
+                timeout: 20000
             });
         }
         catch (e) {
@@ -116,18 +128,57 @@
         }
         await waitTime(200);
         await waitTime(screenshotDelay || 0);
-        const fileBase = `${rootDir}public/${sourceFolder}/${thumbFolder}/${basename}`;
+        const thumbDir = `${rootDir}public/${sourceFolder}/${thumbFolder}`;
+        const fileBase = `${thumbDir}/${basename}`;
+        const filePathTmpRaw = `${fileBase}-tmp-raw.png`;
         const filePathTmp = `${fileBase}-tmp.png`;
         const filePath = `${fileBase}.png`;
-        console.log(filePath);
+
+        fse.ensureDirSync(thumbDir);
+
+        // Save option for further tests.
+        try {
+            const option = await page.evaluate(() => {
+                return _$getEChartsOption()
+            });
+            const optionStr = optionToJson(option);
+            fse.ensureDirSync(`${rootDir}public/${sourceFolder}/option/`);
+            fs.writeFileSync(`${rootDir}public/${sourceFolder}/option/${basename}.json`, optionStr, 'utf-8');
+        }
+        catch (e) {
+            console.error(chalk.red('Failed to generate option'));
+            console.error(chalk.red(e));
+        }
+
         await page.screenshot({
-            path: filePathTmp,
+            path: filePathTmpRaw,
             type: 'png'
         });
-        await sharp(filePathTmp).resize(OUTPUT_IMAGE_WIDTH, OUTPUT_IMAGE_WIDTH * DEFAULT_PAGE_RATIO)
-            .toFile(filePath);
+
+
+        await sharp(filePathTmpRaw)
+            .resize(OUTPUT_IMAGE_WIDTH, OUTPUT_IMAGE_WIDTH * DEFAULT_PAGE_RATIO)
+            .toFile(filePathTmp);
+
+        const {diffRatio} = await compareImage(filePath, filePathTmp, 0.1);
+
+        console.log(filePath);
+        if (diffRatio < 0.01) {
+            console.log('Not changed');
+        }
+        else {
+            console.log(diffRatio);
+            fs.copyFileSync(filePathTmp, filePath);
+            await convertToWebP(filePath);
+        }
+
+        try {
+            fs.unlinkSync(filePathOld);
+        }
+        catch (e) {}
+
+        fs.unlinkSync(filePathTmpRaw);
         fs.unlinkSync(filePathTmp);
-        await convertToWebP(filePath);
     }
     catch (e) {
         console.error(url);
@@ -137,21 +188,26 @@
 }
 
 (async () => {
-    const rootDir = path.join(__dirname, '../');
 
-    // await compress(`${rootDir}public/${sourceFolder}/thumb`);
-    // return;
+    const rootDir = path.join(__dirname, '../');
+    const fileServer = new nStatic.Server(rootDir);
+    const server = BUILD_THUMBS && require('http').createServer(function (request, response) {
+        request.addListener('end', function () {
+            fileServer.serve(request, response);
+        }).resume();
+    })
+    server && server.listen(PORT);
 
     let browser;
-    // https://github.com/GoogleChrome/puppeteer/issues/1260
     if (BUILD_THUMBS) {
         browser = await puppeteer.launch({
             headless: false,
             args: [
               '--headless',
               '--hide-scrollbars',
-              '--mute-audio',
-		      '--allow-file-access-from-files'
+              // https://github.com/puppeteer/puppeteer/issues/4913
+              '--use-gl=egl',
+              '--mute-audio'
             ]
         });
     }
@@ -159,121 +215,113 @@
     // TODO puppeteer will have Navigation Timeout Exceeded: 30000ms exceeded error in these examples.
     const screenshotBlackList = [];
 
+    const files = await globby(`${rootDir}public/${sourceFolder}/*.js`);
 
-    glob(`${rootDir}public/${sourceFolder}/*.js`, async function (err, files) {
+    const exampleList = [];
 
-        const exampleList = [];
+    let tasks = [];
 
-        const threadNum = BUILD_THUMBS ? 16 : 1;
-        let buckets = [];
-        for (let i = 0; i < files.length;) {
-            const bucket = [];
-            for (let k = 0; k < threadNum; k++) {
-                const fileName = files[i++];
-                if (!fileName) {
-                    continue;
-                }
-                const basename = path.basename(fileName, '.js');
-
-                if (
-                    !matchPattern || matchPattern.some(function (pattern) {
-                        return minimatch(basename, pattern);
-                    })
-                ) {
-                    bucket.push({
-                        buildThumb: BUILD_THUMBS && screenshotBlackList.indexOf(basename) < 0,
-                        basename
-                    });
-                }
-            }
-            buckets.push(bucket);
-        }
-
-        for (let theme of themeList) {
-            for (let bucket of buckets) {
-                const promises = [];
-
-                for (const {basename, buildThumb} of bucket) {
-
-                    // Remove mapbox temporary
-                    if (basename.indexOf('mapbox') >= 0
-                        || basename.indexOf('shanghai') >= 0
-                        || basename === 'lines3d-taxi-routes-of-cape-town'
-                        || basename === 'lines3d-taxi-chengdu'
-                        || basename === 'map3d-colorful-cities'
-                    ) {
-                        continue;
-                    }
-
-                    let fmResult;
-                    try {
-                        const code = fs.readFileSync(`${rootDir}public/${sourceFolder}/${basename}.js`, 'utf-8');
-                        fmResult = matter(code, {
-                            delimiters: ['/*', '*/']
-                        });
-                    }
-                    catch (e) {
-                        fmResult = {
-                            data: {}
-                        };
-                    }
-
-                    // const descHTML = marked(fmResult.body);
-
-                    try {
-                        const difficulty = fmResult.data.difficulty != null ? fmResult.data.difficulty : 10;
-                        const category = (fmResult.data.category || '').split(/,/g).map(a => a.trim()).filter(a => !!a);
-                        if (!exampleList.find(item => item.id === basename)) {  // Avoid add mulitple times when has multiple themes.
-                            exampleList.push({
-                                category: category,
-                                id: basename,
-                                tags: (fmResult.data.tags || '').split(/,/g).map(a => a.trim()).filter(a => !!a),
-                                theme: fmResult.data.theme,
-                                title: fmResult.data.title,
-                                titleCN: fmResult.data.titleCN,
-                                difficulty: +difficulty
-                            });
-                        }
-                        // Do screenshot
-                        if (buildThumb) {
-                            promises.push(takeScreenshot(
-                                browser,
-                                theme,
-                                rootDir,
-                                basename,
-                                fmResult.data.shotWidth,
-                                fmResult.data.shotDelay
-                            ));
-                        }
-                    }
-                    catch (e) {
-                        await browser.close();
-                        throw new Error(e.toString());
-                    }
-                }
-                if (promises.length) {
-                    await Promise.all(promises);
-                }
+    for (let theme of themeList) {
+        for (let fileName of files) {
+            const basename = path.basename(fileName, '.js');
+            if (
+                !matchPattern || matchPattern.some(function (pattern) {
+                    return minimatch(basename, pattern);
+                })
+            ) {
+                tasks.push({
+                    buildThumb: BUILD_THUMBS && screenshotBlackList.indexOf(basename) < 0,
+                    theme,
+                    basename
+                });
             }
         }
+    }
 
-        if (BUILD_THUMBS) {
+    await runTasks(tasks, async ({basename, buildThumb, theme}) => {
+        // Remove mapbox temporary
+        if (basename.indexOf('mapbox') >= 0
+            || basename.indexOf('shanghai') >= 0
+            || basename === 'lines3d-taxi-routes-of-cape-town'
+            || basename === 'lines3d-taxi-chengdu'
+            || basename === 'map3d-colorful-cities'
+
+            // TODO Examples that can't work temporary.
+            || basename === 'bar3d-music-visualization'
+        ) {
+            return;
+        }
+
+        let fmResult;
+        try {
+            const code = fs.readFileSync(`${rootDir}public/${sourceFolder}/${basename}.js`, 'utf-8');
+            fmResult = matter(code, {
+                delimiters: ['/*', '*/']
+            });
+        }
+        catch (e) {
+            fmResult = {
+                data: {}
+            };
+        }
+
+        try {
+            const difficulty = fmResult.data.difficulty != null ? fmResult.data.difficulty : 10;
+            const category = (fmResult.data.category || '').split(/,/g).map(a => a.trim()).filter(a => !!a);
+            if (!exampleList.find(item => item.id === basename)) {  // Avoid add mulitple times when has multiple themes.
+                exampleList.push({
+                    category: category,
+                    id: basename,
+                    tags: (fmResult.data.tags || '').split(/,/g).map(a => a.trim()).filter(a => !!a),
+                    theme: fmResult.data.theme,
+                    title: fmResult.data.title,
+                    titleCN: fmResult.data.titleCN,
+                    difficulty: +difficulty
+                });
+            }
+            // Do screenshot
+            if (buildThumb) {
+                await takeScreenshot(
+                    browser,
+                    theme,
+                    rootDir,
+                    basename,
+                    fmResult.data.shotWidth,
+                    fmResult.data.shotDelay
+                );
+            }
+        }
+        catch (e) {
+            server.close();
             await browser.close();
+            throw new Error(e.toString());
         }
+    }, sourceFolder === 'data-gl' ? 2 : 16);
 
-        exampleList.sort(function (a, b) {
-            if (a.difficulty === b.difficulty) {
-                return a.id.localeCompare(b.id);
-            }
-            return a.difficulty - b.difficulty;
-        });
+    if (BUILD_THUMBS) {
+        server.close();
+        await browser.close();
+    }
 
-        const code = `
+    exampleList.sort(function (a, b) {
+        if (a.difficulty === b.difficulty) {
+            return a.id.localeCompare(b.id);
+        }
+        return a.difficulty - b.difficulty;
+    });
+
+    const code = `
 /* eslint-disable */
 // THIS FILE IS GENERATED, DON'T MODIFY */
 export default ${JSON.stringify(exampleList, null, 2)}`;
-        if (!matchPattern) {
-            fs.writeFileSync(path.join(__dirname, `../src/data/chart-list-${sourceFolder}.js`), code, 'utf-8');
-        }
-    });
-})();
\ No newline at end of file
+    if (!matchPattern) {
+        fs.writeFileSync(path.join(__dirname, `../src/data/chart-list-${sourceFolder}.js`), code, 'utf-8');
+    }
+})();
+
+
+process.on('SIGINT', function() {
+    console.log('Closing');
+    // Close through ctrl + c;
+    process.exit();
+});
\ No newline at end of file
diff --git a/tool/screenshot.html b/tool/screenshot.html
new file mode 100644
index 0000000..44c9b5e
--- /dev/null
+++ b/tool/screenshot.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lodash@3.10.1/index.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-alpha.2/map/js/china.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-alpha.2/map/js/world.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.js"></script>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&amp;ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/bmap.js"></script>
+    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
+    <script type="text/javascript" src="./seedrandom.js"></script>
+    <style>
+        html, body {
+            margin: 0;
+            overflow: hidden;
+        }
+        #viewport {
+            position: absolute;
+            left: 0px;
+            top: 0px;
+            right: 0px;
+            bottom: 0px;
+        }
+    </style>
+</head>
+<body>
+<div id="viewport"></div>
+<script>
+    // Params parser
+    var params = {};
+    (location.search || '').substr(1).split('&').forEach(function (item) {
+        var kv = item.split('=');
+        params[kv[0]] = kv[1];
+    });
+
+    var myChart = echarts.init(document.getElementById('viewport'), params.t || null);
+    // var _$oldSetOption = myChart.setOption;
+    // var _$finalOption;
+    // myChart.setOption = function (option, notMerge) {
+    //     if (!_$finalOption || notMerge === true || (notMerge && notMerge.notMerge)) {
+    //         _$finalOption = option;
+    //     }
+    //     else {
+    //         // TODO Should be same logic with echarts merge.
+    //         _$finalOption = echarts.util.merge(_$finalOption, option);
+    //     }
+
+    //     return _$oldSetOption.apply(this, arguments);
+    // }
+    var _$getEChartsOption = function () {
+        return myChart.getOption();
+    }
+    var app = {};
+</script>
+<script>
+    var myrng = new Math.seedrandom('echarts');
+    Math.random = function () {
+        return myrng();
+    };
+
+    function addComponentPadding(componentOpt) {
+        if (!componentOpt) {
+            return;
+        }
+        if (!(componentOpt instanceof Array)) {
+            componentOpt = [componentOpt];
+        }
+        componentOpt.forEach(function (opt) {
+            if (!opt.padding) {
+                opt.padding = 15;
+            }
+        });
+    }
+
+    echarts.registerPreprocessor(function (option) {
+        option.animation = false;
+        // option.textStyle = {
+        //     fontSize: 14
+        // };
+        if (option.series) {
+            if (!(option.series instanceof Array)) {
+                option.series = [option.series];
+            }
+            option.series.forEach(function (seriesOpt) {
+                if (seriesOpt.type === 'graph') {
+                    seriesOpt.force = seriesOpt.force || {};
+                    seriesOpt.force.layoutAnimation = false;
+                }
+                seriesOpt.progressive = 1e5;
+                seriesOpt.animation = false;
+            });
+        }
+        addComponentPadding(option.title);
+        addComponentPadding(option.legend);
+        addComponentPadding(option.toolbox);
+    });
+
+    if (params.c) {
+        if (!window.ROOT_PATH) {
+            // When visiting `screenshot.html` In browser.
+            console.error('No ROOT_PATH specified. Use default ROOT_PATH "."');
+            window.ROOT_PATH = '.';
+        }
+        var sourceFolder = params.s || 'data';
+        var scriptTag = document.createElement('script');
+        scriptTag.async = false;
+        scriptTag.src = `../public/${sourceFolder}/${params.c}.js`
+        document.body.appendChild(scriptTag);
+
+        scriptTag.onload = function () {
+            if (typeof option !== 'undefined' && option) {
+                myChart.setOption(option);
+            }
+        }
+    }
+</script>
+</body>
+</html>
\ No newline at end of file