commit 7fb9bd1d0688169b5ab4c75cc3f209dec6aa970f Author: a624669980 Date: Sun Sep 26 10:35:02 2021 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ca983df --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### Go template +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Example user template template +### Example user template + +# IntelliJ project files +.idea +*.iml +out +gen +/logs/ +/sql/ +/out/ +/db/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2cb2422 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "UI"] + path = UI + url = https://github.com/ZimaBoard/CasaOS-UI.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..23ab079 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY:build build-ui build-backend help + +build: build-ui build-backend + + +build-ui: + cd UI && yarn install && yarn build + +build-backend: + export CGO_ENABLED=1;export CGO_LDFLAGS=-static;go mod tidy;go build -o ./casa main.go;upx --lzma --best casa + +help: + @echo "call john" diff --git a/README-ZH.md b/README-ZH.md new file mode 100644 index 0000000..20789a4 --- /dev/null +++ b/README-ZH.md @@ -0,0 +1,7 @@ +## 目录结构 + +- conf 配置文件 +- route 路由 +- service 方法的具体实现 +- utils 工具 +- main.go 入口 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c708740 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Oasis + diff --git a/UI/.browserslistrc b/UI/.browserslistrc new file mode 100644 index 0000000..214388f --- /dev/null +++ b/UI/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not dead diff --git a/UI/.env.dev b/UI/.env.dev new file mode 100644 index 0000000..26bb3e2 --- /dev/null +++ b/UI/.env.dev @@ -0,0 +1,2 @@ +// .env.dev +NODE_ENV='dev' \ No newline at end of file diff --git a/UI/.env.production b/UI/.env.production new file mode 100644 index 0000000..387895b --- /dev/null +++ b/UI/.env.production @@ -0,0 +1,2 @@ +// .env.production +NODE_ENV='prod' \ No newline at end of file diff --git a/UI/.eslintrc.js b/UI/.eslintrc.js new file mode 100644 index 0000000..462ecb2 --- /dev/null +++ b/UI/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { + node: true + }, + 'extends': [ + 'plugin:vue/essential', + 'eslint:recommended' + ], + parserOptions: { + parser: 'babel-eslint' + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'vue/no-unused-vars':'off' + } +} diff --git a/UI/.gitignore b/UI/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/UI/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/UI/README.md b/UI/README.md new file mode 100644 index 0000000..649d41d --- /dev/null +++ b/UI/README.md @@ -0,0 +1,32 @@ + +# CasaOS-UI + +The front-end of CasaOs,build with VueJS + +## Project setup +``` +yarn install +``` + +### Compiles and hot-reloads for development +``` +yarn serve +``` + +### Compiles and minifies for production +``` +yarn build +``` +Will be output to the ../web folder + +### Lints and fixes files +``` +yarn lint +``` \ No newline at end of file diff --git a/UI/babel.config.js b/UI/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/UI/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/UI/package.json b/UI/package.json new file mode 100644 index 0000000..dd6e04d --- /dev/null +++ b/UI/package.json @@ -0,0 +1,43 @@ +{ + "name": "CasaOS", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve --mode dev", + "build": "vue-cli-service build --no-clean --dest ../web --mode production", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "axios": "^0.21.4", + "buefy": "^0.9.0", + "core-js": "^3.6.5", + "easy-affix": "^1.0.8", + "lodash.debounce": "^4.0.8", + "lottie-vuejs": "^0.4.0", + "moment": "^2.29.1", + "nth-check": "^2.0.1", + "qs": "^6.10.1", + "vee-validate": "^3.4.12", + "vue": "^2.6.11", + "vue-router": "^3.2.0", + "vue-slider-component": "^3.2.14", + "vuex": "^3.4.0", + "vuex-persistedstate": "^4.0.0", + "yargs-parser": "^20.2.9" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-router": "~4.5.0", + "@vue/cli-plugin-vuex": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "babel-eslint": "^10.1.0", + "compression-webpack-plugin": "^9.0.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^6.2.2", + "node-sass": "^4.9.0", + "sass-loader": "^7.0.1", + "vue-cli-plugin-buefy": "~0.3.8", + "vue-template-compiler": "^2.6.11" + } +} diff --git a/UI/public/browserconfig.xml b/UI/public/browserconfig.xml new file mode 100644 index 0000000..a02d62e --- /dev/null +++ b/UI/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/UI/public/favicon.ico b/UI/public/favicon.ico new file mode 100644 index 0000000..27a87c9 Binary files /dev/null and b/UI/public/favicon.ico differ diff --git a/UI/public/img/ani/icon/android-chrome-192x192.png b/UI/public/img/ani/icon/android-chrome-192x192.png new file mode 100644 index 0000000..c3d1cea Binary files /dev/null and b/UI/public/img/ani/icon/android-chrome-192x192.png differ diff --git a/UI/public/img/ani/icon/apple-touch-icon.png b/UI/public/img/ani/icon/apple-touch-icon.png new file mode 100644 index 0000000..8525617 Binary files /dev/null and b/UI/public/img/ani/icon/apple-touch-icon.png differ diff --git a/UI/public/img/ani/icon/favicon-16x16.png b/UI/public/img/ani/icon/favicon-16x16.png new file mode 100644 index 0000000..37f9217 Binary files /dev/null and b/UI/public/img/ani/icon/favicon-16x16.png differ diff --git a/UI/public/img/ani/icon/favicon-32x32.png b/UI/public/img/ani/icon/favicon-32x32.png new file mode 100644 index 0000000..8474b54 Binary files /dev/null and b/UI/public/img/ani/icon/favicon-32x32.png differ diff --git a/UI/public/img/ani/icon/mstile-150x150.png b/UI/public/img/ani/icon/mstile-150x150.png new file mode 100644 index 0000000..7d4fb0f Binary files /dev/null and b/UI/public/img/ani/icon/mstile-150x150.png differ diff --git a/UI/public/img/ani/icon/safari-pinned-tab.svg b/UI/public/img/ani/icon/safari-pinned-tab.svg new file mode 100644 index 0000000..e750780 --- /dev/null +++ b/UI/public/img/ani/icon/safari-pinned-tab.svg @@ -0,0 +1,25 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/UI/public/img/ani/rocket-launching.json b/UI/public/img/ani/rocket-launching.json new file mode 100644 index 0000000..14fb94e --- /dev/null +++ b/UI/public/img/ani/rocket-launching.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":29.9700012207031,"ip":0,"op":80.0000032584668,"w":1080,"h":1080,"nm":"Rocket","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[539.086,490.913,0],"to":[0,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[539.086,460.913,0],"to":[0,0,0],"ti":[0,-5,0]},{"t":39.0000015885026,"s":[539.086,490.913,0]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('pingpong');","l":2},"a":{"a":0,"k":[126.431,256.861,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.005,-0.007],[0.338,-0.47],[-22.705,-2.408],[-5.77,34.451],[0,0]],"o":[[-0.341,0.47],[9.118,11.95],[2.207,-37.822],[0,0],[-0.006,0.007]],"v":[[-30.31,29.889],[-31.313,31.309],[19.347,54.524],[31.313,-54.524],[-30.294,29.867]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.7843137254901961,0.8156862745098039,0.996078431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.66,55.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.348,0.477],[0,0],[0,0],[0.342,-0.478],[-28.149,0],[-10.739,14.073]],"o":[[0,0],[0,0],[-0.348,0.477],[10.737,14.073],[28.149,0],[-0.344,-0.478]],"v":[[62.064,29.843],[-0.001,-55.177],[-62.066,29.843],[-63.084,31.285],[-0.001,55.177],[63.084,31.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.432,55.427],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.961,5.994],[0,0],[12.545,7.242],[0,0],[-4.85,-14.824],[0,0],[0,-5.358],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.267,-16.106],[0,0],[11.349,7.757],[0,0],[1.96,5.995],[0,0],[0,0],[0,0],[0,-5.358]],"v":[[25.358,28.837],[0.879,-45.994],[-28.335,-84.287],[-28.335,-83.804],[-2.087,-47.399],[22.391,27.431],[25.368,44.664],[25.368,79.856],[28.335,84.287],[28.335,46.069]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[212.787,429.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.961,5.994],[0,0],[12.544,7.242]],"o":[[0,0],[0,0],[0,-5.358],[0,0],[-5.269,-16.106],[0,0]],"v":[[-28.335,-0.348],[28.335,84.286],[28.335,46.07],[25.358,28.838],[0.88,-45.994],[-28.335,-84.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.538,429.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[1.961,5.995],[0,0],[12.544,7.242],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-5.357],[0,0],[-5.269,-16.106],[0,0],[0,0]],"v":[[-23.755,-3.161],[23.381,87.1],[32.915,81.474],[32.915,43.256],[29.938,26.024],[5.46,-48.807],[-23.755,-87.1],[-32.915,-81.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[216.493,426.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.961,5.996],[0,0],[-11.879,7.563],[0,0],[5.269,-16.106],[0,0],[0,-5.358],[0,0],[0,0]],"o":[[0,-5.358],[0,0],[5.034,-15.389],[0,0],[-12.544,7.242],[0,0],[-1.96,5.996],[0,0],[0,0],[0,0]],"v":[[-26.669,47.318],[-23.692,30.085],[0.786,-44.745],[28.335,-82.008],[28.335,-84.287],[-0.88,-45.995],[-25.359,28.836],[-28.335,46.069],[-28.335,84.287],[-26.669,81.798]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[40.492,428.978],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.96,5.994],[0,0],[-12.545,7.243]],"o":[[0,0],[0,0],[0,-5.358],[0,0],[5.268,-16.106],[0,0]],"v":[[28.335,-0.348],[-28.335,84.288],[-28.335,46.07],[-25.359,28.838],[-0.88,-45.993],[28.335,-84.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.325,429.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-1.961,5.995],[0,0],[-12.545,7.243],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-5.357],[0,0],[5.269,-16.106],[0,0],[0,0]],"v":[[23.756,-3.161],[-23.381,87.101],[-32.915,81.474],[-32.915,43.256],[-29.938,26.024],[-5.46,-48.807],[23.756,-87.101],[32.915,-81.563]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36.37,426.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[22.059,12.736],[5.067,-2.396],[-8.952,-5.169],[0,-25.313],[7.76,-3.881],[0,15.04]],"o":[[-10.574,-6.104],[6.66,-1.863],[22.059,12.736],[0,13.179],[8.142,-3.011],[0,-25.312]],"v":[[-6.679,-45.741],[-33.262,-49.041],[-8.235,-44.609],[31.706,24.283],[17.941,50.675],[33.262,23.151]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.91,269.366],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.61,3.816],[0,20.554],[-5.082,3.637],[0,-12.969],[-17.913,-10.342],[-5.941,4.252]],"o":[[-17.913,-10.342],[0,-9.475],[-8.767,1.6],[0,20.555],[9.655,5.575],[-5.127,0.936]],"v":[[10.466,33.754],[-21.969,-22.189],[-13.796,-42.159],[-28.348,-19.514],[4.086,36.429],[28.348,37.907]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.972,271.258],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-20.554],[17.913,10.341],[0,20.555],[-17.912,-10.342]],"o":[[0,20.555],[-17.912,-10.342],[0,-20.555],[17.913,10.342]],"v":[[32.434,18.726],[0,37.218],[-32.434,-18.725],[0,-37.217]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.058,270.469],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-25.312],[22.058,12.736],[0,25.312],[-22.06,-12.736]],"o":[[0,25.312],[-22.06,-12.735],[0,-25.313],[22.058,12.736]],"v":[[39.941,23.06],[0.001,45.832],[-39.941,-23.06],[0.001,-45.832]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.058,270.47],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-25.312],[6.936,-4.239],[0.213,-0.12],[10.96,6.328],[0,25.312],[-7.087,4.179],[-0.201,0.11],[-10.847,-6.263]],"o":[[0,12.364],[-0.209,0.128],[-7.217,4.035],[-22.059,-12.736],[0,-12.517],[0.198,-0.117],[7.198,-3.898],[22.059,12.736]],"v":[[41.577,21.066],[30.374,46.427],[23.496,50.771],[9.934,39.321],[-30.007,-29.57],[-34.491,-46.367],[-26.245,-50.908],[1.636,-47.825]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.304,267.8],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-11.77,70.276],[0,0],[1.37,-1.986],[-6.824,-57.084],[0,0],[0,0],[0,-0.24],[-47.027,-1.54]],"o":[[-3.159,-78.822],[0,0],[-1.425,1.952],[-32.648,47.319],[0,0],[0,0],[-0.006,0.24],[0,27.771],[0,0]],"v":[[42.816,9.995],[55.833,-219.026],[-5.773,-134.635],[-9.966,-128.727],[-49.009,33.745],[-33.159,166.308],[-33.127,166.308],[-33.159,167.027],[51.189,219.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9333333333333333,0.9254901960784314,0.984313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.139,219.905],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.648,47.319],[1.425,1.952],[0,0],[0,0],[1.371,-1.987],[-6.825,-57.083],[0,0],[0,0],[0,-0.24],[-49.403,0],[0,28.77],[0.007,0.241],[0,0]],"o":[[6.824,-57.083],[-1.37,-1.987],[0,0],[0,0],[-1.426,1.952],[-32.648,47.319],[0,0],[0,0],[-0.006,0.241],[0,28.77],[49.403,0],[0,-0.24],[0,0],[0,0]],"v":[[105.302,34.013],[66.258,-128.458],[62.065,-134.366],[0.001,-219.386],[-62.064,-134.366],[-66.258,-128.458],[-105.301,34.013],[-89.451,166.576],[-89.419,166.576],[-89.451,167.295],[0.001,219.386],[89.451,167.295],[89.419,166.576],[89.451,166.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8666666666666667,0.8274509803921568,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,219.636],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,-0.181],[-37.195,0],[0,21.66],[0.003,0.181],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.004,0.181],[0,21.66],[37.196,0],[0,-0.181],[0,0],[0,0]],"v":[[67.349,-39.891],[-67.349,-39.891],[-67.349,0.131],[-67.325,0.131],[-67.349,0.672],[0,39.891],[67.349,0.672],[67.326,0.131],[67.349,0.131]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,418.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,-0.077],[-15.573,0],[0,9.068],[0.001,0.075],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.002,0.075],[0,9.068],[15.574,0],[0,-0.077],[0,0],[0,0]],"v":[[28.198,-12.302],[-28.198,-12.302],[-28.198,-4.346],[-28.188,-4.346],[-28.198,-4.119],[-0.001,12.302],[28.198,-4.119],[28.188,-4.346],[28.198,-4.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,461.768],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.049,3.898],[0,0],[-13.109,-7.568]],"o":[[0,0],[0,0],[0,-5.598],[0,0],[5.505,-10.473],[0,0]],"v":[[29.61,26.123],[-29.61,57.672],[-29.61,17.736],[-26.499,3.32],[-0.92,-45.341],[29.61,-50.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[29.859,342.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[2.049,3.898],[0,0],[13.109,-7.568]],"o":[[0,0],[0,0],[0,-5.598],[0,0],[-5.506,-10.473],[0,0]],"v":[[-29.61,26.123],[29.61,57.672],[29.61,17.736],[26.499,3.32],[0.92,-45.341],[-29.61,-50.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.002,342.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3 Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[127.071,467.425,0],"ix":2,"l":2},"a":{"a":0,"k":[33.238,6.415,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[81,81,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":39.0000015885026,"s":[81,81,100]}],"ix":6,"x":"var $bm_rt;\n$bm_rt = loopOut('pingpong');","l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-22.978],[0,0],[0,49.712],[-18.22,0]],"o":[[0,49.712],[0,0],[0,-22.978],[18.218,0]],"v":[[32.989,-23.56],[0,65.165],[-32.989,-23.56],[0,-65.165]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9803921568627451,0.6274509803921569,0.8588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.239,65.415],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,543,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":30,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":132.00000537647,"s":[1800]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,543,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":132.00000537647,"s":[1800]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,776,0],"ix":2,"l":2},"a":{"a":0,"k":[0,233,0],"ix":1,"l":2},"s":{"a":0,"k":[142.736,142.736,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":30,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":80.0000032584668,"s":[697.5]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,776,0],"ix":2,"l":2},"a":{"a":0,"k":[0,233,0],"ix":1,"l":2},"s":{"a":0,"k":[142.736,142.736,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":80.0000032584668,"s":[697.5]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":1,"nm":"Dark Gray Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1080,"sh":1080,"sc":"#2d2d2d","ip":900.000036657751,"op":900.000036657751,"st":0,"bm":0,"hidden":0}],"markers":[]} \ No newline at end of file diff --git a/UI/public/index.html b/UI/public/index.html new file mode 100644 index 0000000..272e7c6 --- /dev/null +++ b/UI/public/index.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + +
+ + + + diff --git a/UI/public/site.webmanifest b/UI/public/site.webmanifest new file mode 100644 index 0000000..349082a --- /dev/null +++ b/UI/public/site.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/ui/img/icon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/UI/src/App.vue b/UI/src/App.vue new file mode 100644 index 0000000..564cea9 --- /dev/null +++ b/UI/src/App.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/UI/src/assets/background/AbstractShapes.jpg b/UI/src/assets/background/AbstractShapes.jpg new file mode 100644 index 0000000..ab8514d Binary files /dev/null and b/UI/src/assets/background/AbstractShapes.jpg differ diff --git a/UI/src/assets/img/casa.svg b/UI/src/assets/img/casa.svg new file mode 100644 index 0000000..33a2f35 --- /dev/null +++ b/UI/src/assets/img/casa.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/UI/src/assets/img/default.png b/UI/src/assets/img/default.png new file mode 100644 index 0000000..03ff6c8 Binary files /dev/null and b/UI/src/assets/img/default.png differ diff --git a/UI/src/assets/img/icon.png b/UI/src/assets/img/icon.png new file mode 100755 index 0000000..d7eece8 Binary files /dev/null and b/UI/src/assets/img/icon.png differ diff --git a/UI/src/assets/img/wuji.svg b/UI/src/assets/img/wuji.svg new file mode 100644 index 0000000..6f25454 --- /dev/null +++ b/UI/src/assets/img/wuji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UI/src/assets/logo.png b/UI/src/assets/logo.png new file mode 100644 index 0000000..44f5cb5 Binary files /dev/null and b/UI/src/assets/logo.png differ diff --git a/UI/src/assets/scss/_variables.scss b/UI/src/assets/scss/_variables.scss new file mode 100644 index 0000000..9dc5491 --- /dev/null +++ b/UI/src/assets/scss/_variables.scss @@ -0,0 +1,152 @@ +// Included below are all the defined variables from Bulma +// Modify as needed, removing the !default attribute. + +// Colors + +$black: hsl(0, 0%, 4%) !default; +$black-bis: hsl(0, 0%, 7%) !default; +$black-ter: hsl(0, 0%, 14%) !default; + +$grey-darker: hsl(0, 0%, 21%) !default; +$grey-dark: hsl(0, 0%, 29%) !default; +$grey: hsl(0, 0%, 48%) !default; +$grey-light: hsl(0, 0%, 71%) !default; +$grey-lighter: hsl(0, 0%, 86%) !default; + +$white-ter: hsl(0, 0%, 96%) !default; +$white-bis: hsl(0, 0%, 98%) !default; +$white: hsl(0, 0%, 100%) !default; + +$orange: hsl(14, 100%, 53%) !default; +$yellow: hsl(48, 100%, 67%) !default; +$green: hsl(141, 71%, 48%) !default; +$turquoise: hsl(171, 100%, 41%) !default; +$cyan: hsl(204, 86%, 53%) !default; +$blue: hsl(217, 71%, 53%) !default; +$purple: hsl(271, 100%, 71%) !default; +$red: hsl(348, 100%, 61%) !default; + +// Typography + +$family-sans-serif: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !default; +$family-monospace: monospace !default; +$render-mode: optimizeLegibility !default; + +$size-1: 3rem !default; +$size-2: 2.5rem !default; +$size-3: 2rem !default; +$size-4: 1.5rem !default; +$size-5: 1.25rem !default; +$size-6: 1rem !default; +$size-7: 0.75rem !default; + +$weight-light: 300 !default; +$weight-normal: 400 !default; +$weight-medium: 500 !default; +$weight-semibold: 600 !default; +$weight-bold: 700 !default; + +// Responsiveness + +// The container horizontal gap, which acts as the offset for breakpoints +$gap: 32px !default; +// 960, 1152, and 1344 have been chosen because they are divisible by both 12 and 16 +$tablet: 769px !default; +// 960px container + 4rem +$desktop: 960px + (2 * $gap) !default; +// 1152px container + 4rem +$widescreen: 1152px + (2 * $gap) !default; +// 1344px container + 4rem; +$fullhd: 1344px + (2 * $gap) !default; + +// Miscellaneous + +$easing: ease-out !default; +$radius-small: 2px !default; +$radius: 3px !default; +$radius-large: 5px !default; +$radius-rounded: 290486px !default; +$speed: 86ms !default; + +// Flags + +$variable-columns: true !default; + + +// The default Bulma derived variables are declared below + +$primary: $turquoise !default; + +$info: $cyan !default; +$success: $green !default; +$warning: $yellow !default; +$danger: $red !default; + +$light: $white-ter !default; +$dark: $grey-darker !default; + +// Invert colors + +$orange-invert: findColorInvert($orange) !default; +$yellow-invert: findColorInvert($yellow) !default; +$green-invert: findColorInvert($green) !default; +$turquoise-invert: findColorInvert($turquoise) !default; +$cyan-invert: findColorInvert($cyan) !default; +$blue-invert: findColorInvert($blue) !default; +$purple-invert: findColorInvert($purple) !default; +$red-invert: findColorInvert($red) !default; + +$primary-invert: $turquoise-invert !default; +$info-invert: $cyan-invert !default; +$success-invert: $green-invert !default; +$warning-invert: $yellow-invert !default; +$danger-invert: $red-invert !default; +$light-invert: $dark !default; +$dark-invert: $light !default; + +// General colors + +$background: $white-ter !default; + +$border: $grey-lighter !default; +$border-hover: $grey-light !default; + +// Text colors + +$text: $grey-dark !default; +$text-invert: findColorInvert($text) !default; +$text-light: $grey !default; +$text-strong: $grey-darker !default; + +// Code colors + +$code: $red !default; +$code-background: $background !default; + +$pre: $text !default; +$pre-background: $background !default; + +// Link colors + +$link: $blue !default; +$link-invert: $blue-invert !default; +$link-visited: $purple !default; + +$link-hover: $grey-darker !default; +$link-hover-border: $grey-light !default; + +$link-focus: $grey-darker !default; +$link-focus-border: $blue !default; + +$link-active: $grey-darker !default; +$link-active-border: $grey-dark !default; + +// Typography + +$family-primary: $family-sans-serif !default; +$family-code: $family-monospace !default; + +$size-small: $size-7 !default; +$size-normal: $size-6 !default; +$size-medium: $size-5 !default; +$size-large: $size-4 !default; diff --git a/UI/src/assets/scss/app.scss b/UI/src/assets/scss/app.scss new file mode 100644 index 0000000..e12ccb7 --- /dev/null +++ b/UI/src/assets/scss/app.scss @@ -0,0 +1,429 @@ +@import "~bulma/sass/utilities/initial-variables"; +@import "~bulma/sass/utilities/functions"; +// 1. Set your own initial variables and derived +// variables in _variables.scss +@import "variables"; +@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;1,100;1,300;1,400;1,500;1,700&display=swap"); + +// 2. Setup your Custom Colors +$linkedin: #0077b5; +$linkedin-invert: findColorInvert($linkedin); +$twitter: #55acee; +$twitter-invert: findColorInvert($twitter); +$github: #333; +$github-invert: findColorInvert($github); + +@import "~bulma/sass/utilities/derived-variables"; + +// 3. Add new color variables to the color map. +$addColors: ( + "twitter": ( + $twitter, + $twitter-invert, + ), + "linkedin": ( + $linkedin, + $linkedin-invert, + ), + "github": ( + $github, + $github-invert, + ), +); +$colors: map-merge($colors, $addColors); + +@import "~bulma"; +@import "~buefy/src/scss/buefy"; + +$backDropColor: rgba(123, 123, 123, 0.16); +$backDropBlur: blur(1rem); +$backDropBorderRadius: 0.5rem; + +// 4. Provide custom buefy overrides and site styles here +body, +html { + overflow: hidden; + font-family: "Roboto", sans-serif; +} + +#app { + width: 100vw; + height: 100vh; + font-family: Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-align: center; + color: #2c3e50; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.top-bar { + position: relative; + z-index: 10; + + height: 3rem; + background: rgba(255, 255, 255, 0.22); + backdrop-filter: blur(180.282px); + .navbar-brand { + .dropdown-menu { + margin-top: 0.5rem; + min-width: 20rem; + .dropdown-content { + .dropdown-item { + padding: 1.25rem; + text-align: left; + .item { + height: 2rem; + } + } + } + } + } + .field { + line-height: 1rem; + } + .switch { + &.is-flex-direction-row-reverse { + .control-label { + padding-left: 0; + padding-right: calc(0.75em - 1px); + } + } + } + .update-container { + .button.is-rounded { + border-radius: 9999px !important; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); + } + } + .button{ + &.is-small{ + height: 2em; + } + } +} + +.brand-bar { + position: fixed; + left: 2rem; + bottom: 2rem; +} + +.contact-bar { + position: fixed; + right: 2rem; + bottom: 2rem; + height: 3.5rem; + background: rgba(0, 0, 0, 0.16); + backdrop-filter: blur(24px); + border-radius: 4px; + font-size: 1.5rem; + a { + color: $white; + margin: 0.5rem; + display: flex; + align-items: center; + &:hover { + color: #0077b5; + } + } +} + +.contents { + flex: 1; + overflow: auto; +} + +.side-bar { + width: 16rem; + position: fixed; +} + +.main-content { + flex: 1; + margin-left: 17.5rem; +} + +.pt-7 { + padding-top: 4rem; +} + +.pt-55 { + padding-top: 2rem; +} +.p-55 { + padding: 2rem !important; +} +.button.is-light { + background-color: #a6afb9; + color: white; +} +.label { + font-size: 0.875rem; + margin-bottom: 0.5rem; +} + +.button, +.input, +.textarea, +.taginput .taginput-container.is-focusable, +.select select, +.file-cta, +.file-name, +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + &:focus { + box-shadow: none; + } +} +.image.is-72x72 { + height: 72px; + width: 72px; +} + +// widgets +.widget { + background: $backDropColor; + backdrop-filter: $backDropBlur; + border-radius: $backDropBorderRadius; + padding: 0.875rem 1.5rem; + margin-bottom: 0.75rem; +} + +// Cards +.wuji-card { + background: $backDropColor; + backdrop-filter: $backDropBlur; + border-radius: $backDropBorderRadius; + padding: 1.5rem; + color: $white; + position: relative; + + .info { + flex: 1; + margin-right: 1rem; + color: white; + } + + .simg { + img { + border-radius: 4px; + } + } + .icon-img { + position: relative; + &.stop::after { + position: absolute; + content: ""; + width: 0.75rem; + height: 0.75rem; + background-color: #ff1616; + border-radius: 50%; + right: -0.375rem; + top: -0.375rem; + } + img { + border-radius: 8px; + margin: 0 auto; + } + } + .b-image-wrapper { + position: relative; + display: flex; + align-items: center; + justify-content: center; + &.stop::after { + position: absolute; + content: ""; + width: 0.75rem; + height: 0.75rem; + background-color: #ff1616; + border-radius: 50%; + right: -0.375rem; + top: -0.375rem; + } + img { + border-radius: 8px; + margin: 0 auto; + } + } + .action-btn { + position: absolute; + right: 0.5rem; + top: 1rem; + visibility: hidden; + opacity: 0; + transition: all 0.2s; + } + p { + font-weight: 500; + } + .one-line { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + } + .two-line { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + &:hover { + .action-btn { + visibility: visible; + opacity: 1; + } + } + a { + color: white; + p { + color: white; + } + } +} +.flex1 { + flex: 1; +} +.title-bar { + margin-bottom: 1.5rem; + .title { + flex: 1; + margin-bottom: 0; + } +} +.ii { + .dropdown-menu { + background: rgba(255, 255, 255, 0.88); + backdrop-filter: $backDropBlur; + border-radius: $backDropBorderRadius; + overflow: hidden; + padding-top: 0; + + .dropdown-content { + background: none; + padding: 0; + .button { + border-radius: 0; + padding-left: 1.5rem; + padding-right: 1.5rem; + &.is-text { + text-decoration: none; + justify-content: flex-start; + outline: none; + transition: all 0.2s; + border: none !important; + &.running { + color: #779e2a !important; + } + &.exited { + color: #ff1616 !important; + } + } + &:active { + background: none; + outline: none; + } + &:focus { + background: none; + box-shadow: none; + outline: none; + } + } + .bbor { + overflow: hidden; + border-top: #2c3e50 1px solid; + .is-text { + text-decoration: none; + justify-content: center !important ; + } + .column:first-child { + border-right: #2c3e50 1px solid; + } + } + } + } +} +//Panel +.modal-background { + background: rgba(0, 0, 0, 0.8); +} +.modal-card { + background: rgba(255, 255, 255, 0.88); + backdrop-filter: $backDropBlur; + border-radius: $backDropBorderRadius; + .modal-card-head, + .modal-card-body, + .modal-card-foot { + background-color: transparent; + border: none; + } + .modal-card-head { + padding: 3rem; + } + .modal-card-body { + padding: 0 3rem; + .button.is-static, + .input, + .textarea, + .taginput .taginput-container.is-focusable, + .select select, + .file-cta, + .file-name, + .pagination-previous, + .pagination-next, + .pagination-link, + .pagination-ellipsis { + font-size: 0.875rem; + height: 2.714em; + border: 1px solid #cfcfcf !important; + border-radius: 4px; + &:focus { + box-shadow: none; + } + } + .media { + padding: 0rem; + } + .field:last-child { + margin-bottom: 0.5rem; + } + .field-body { + .field:last-child { + margin-bottom: 0rem; + } + } + + .port-item:not(:last-child) { + .field { + margin-bottom: 0; + } + } + } + .modal-card-foot { + padding: 1rem 3rem 2rem 3rem; + .button { + border-radius: 9999px; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); + } + } +} + +.import-area .textarea { + max-height: 40em; + min-height: 16em; +} + +.app-card { + .loading-background { + background: none !important; + border-radius: $backDropBorderRadius; + } +} diff --git a/UI/src/assets/widgets/Clock.vue b/UI/src/assets/widgets/Clock.vue new file mode 100644 index 0000000..3d92179 --- /dev/null +++ b/UI/src/assets/widgets/Clock.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/UI/src/assets/widgets/Weather.vue b/UI/src/assets/widgets/Weather.vue new file mode 100644 index 0000000..aa4a38c --- /dev/null +++ b/UI/src/assets/widgets/Weather.vue @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/UI/src/components/Apps.vue b/UI/src/components/Apps.vue new file mode 100644 index 0000000..67ce455 --- /dev/null +++ b/UI/src/components/Apps.vue @@ -0,0 +1,128 @@ + + + + + + + \ No newline at end of file diff --git a/UI/src/components/Apps/AppCard.vue b/UI/src/components/Apps/AppCard.vue new file mode 100644 index 0000000..8e5505f --- /dev/null +++ b/UI/src/components/Apps/AppCard.vue @@ -0,0 +1,202 @@ + + + + + + + \ No newline at end of file diff --git a/UI/src/components/BrandBar.vue b/UI/src/components/BrandBar.vue new file mode 100644 index 0000000..9d01848 --- /dev/null +++ b/UI/src/components/BrandBar.vue @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/UI/src/components/ContactBar.vue b/UI/src/components/ContactBar.vue new file mode 100644 index 0000000..0129795 --- /dev/null +++ b/UI/src/components/ContactBar.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/UI/src/components/Panel.vue b/UI/src/components/Panel.vue new file mode 100644 index 0000000..3349553 --- /dev/null +++ b/UI/src/components/Panel.vue @@ -0,0 +1,453 @@ + + + + + diff --git a/UI/src/components/SearchBar.vue b/UI/src/components/SearchBar.vue new file mode 100644 index 0000000..b9da05c --- /dev/null +++ b/UI/src/components/SearchBar.vue @@ -0,0 +1,105 @@ + + + + + + + \ No newline at end of file diff --git a/UI/src/components/Shortcuts.vue b/UI/src/components/Shortcuts.vue new file mode 100644 index 0000000..48d6c4a --- /dev/null +++ b/UI/src/components/Shortcuts.vue @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/UI/src/components/SideBar.vue b/UI/src/components/SideBar.vue new file mode 100644 index 0000000..6b9795d --- /dev/null +++ b/UI/src/components/SideBar.vue @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file diff --git a/UI/src/components/Suggestion.vue b/UI/src/components/Suggestion.vue new file mode 100644 index 0000000..3c53e44 --- /dev/null +++ b/UI/src/components/Suggestion.vue @@ -0,0 +1,55 @@ + + + + + + \ No newline at end of file diff --git a/UI/src/components/TopBar.vue b/UI/src/components/TopBar.vue new file mode 100644 index 0000000..fee06fa --- /dev/null +++ b/UI/src/components/TopBar.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/UI/src/components/forms/ImportPanel.vue b/UI/src/components/forms/ImportPanel.vue new file mode 100644 index 0000000..a3071fc --- /dev/null +++ b/UI/src/components/forms/ImportPanel.vue @@ -0,0 +1,154 @@ + + + + + \ No newline at end of file diff --git a/UI/src/components/forms/InputGroup.vue b/UI/src/components/forms/InputGroup.vue new file mode 100644 index 0000000..4e2c418 --- /dev/null +++ b/UI/src/components/forms/InputGroup.vue @@ -0,0 +1,108 @@ + + + + diff --git a/UI/src/components/forms/Ports.vue b/UI/src/components/forms/Ports.vue new file mode 100644 index 0000000..4573f01 --- /dev/null +++ b/UI/src/components/forms/Ports.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/UI/src/main.js b/UI/src/main.js new file mode 100644 index 0000000..d1aaa2f --- /dev/null +++ b/UI/src/main.js @@ -0,0 +1,17 @@ +import Vue from 'vue' +import App from '@/App.vue' +import router from '@/router' +import store from '@/store' +import api from '@/service/api.js' +import Buefy from 'buefy' +import '@/assets/scss/app.scss' + +Vue.use(Buefy) + +Vue.config.productionTip = false +Vue.prototype.$api = api; +new Vue({ + router, + store, + render: h => h(App) +}).$mount('#app') diff --git a/UI/src/plugins/vee-validate.js b/UI/src/plugins/vee-validate.js new file mode 100644 index 0000000..1e7755f --- /dev/null +++ b/UI/src/plugins/vee-validate.js @@ -0,0 +1,28 @@ +import { required, confirmed, length, email, min } from "vee-validate/dist/rules"; +import { extend } from "vee-validate"; + +extend("required", { + ...required, + message: "This field is required" +}); + +extend("email", { + ...email, + message: "This field must be a valid email" +}); + +extend("confirmed", { + ...confirmed, + message: "This field confirmation does not match" +}); + +extend("length", { + ...length, + message: "This field must have 2 options" +}); + +extend("min", { + ...min, + message: "This field must have more than {length} characters" +}); + diff --git a/UI/src/router/index.js b/UI/src/router/index.js new file mode 100644 index 0000000..19defd5 --- /dev/null +++ b/UI/src/router/index.js @@ -0,0 +1,24 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-18 23:19:27 + * @Description: + * @FilePath: \CasaOS-UI\src\router\index.js + */ +import Vue from 'vue' +import VueRouter from 'vue-router' + +Vue.use(VueRouter) + +const routes = [ + +] + +const router = new VueRouter({ + mode: 'history', + base: process.env.BASE_URL, + routes +}) + +export default router diff --git a/UI/src/service/api.js b/UI/src/service/api.js new file mode 100644 index 0000000..83e8a41 --- /dev/null +++ b/UI/src/service/api.js @@ -0,0 +1,19 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-23 15:59:52 + * @Description: + * @FilePath: /CasaOS-UI/src/service/api.js + */ +import user from "./user.js"; +import app from './app.js'; +import task from './task.js'; +import info from './info.js'; + +export default { + app, + info, + user, + task +} \ No newline at end of file diff --git a/UI/src/service/app.js b/UI/src/service/app.js new file mode 100644 index 0000000..86ab269 --- /dev/null +++ b/UI/src/service/app.js @@ -0,0 +1,79 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:20 + * @Description: Application API + * @FilePath: \CasaOS-UI\src\service\app.js + */ +import { api } from "./service.js"; + +const app = { + //Get Install Info + appConfig() { + return api.get("/app/install/config"); + }, + //Store List + storeList(data) { + return api.get("/app/list", data); + }, + //Store App Info + storeAppInfo(id) { + return api.get("/app/appinfo/" + id); + }, + //Store Category List + storeCategoryList() { + return api.get("/app/category"); + }, + //Check Port + checkPort(port, type) { + let data = { + type: type + } + return api.get('/app/check/' + port, data); + }, + // Get a free port + getPort() { + return api.get('/app/getport'); + }, + // Get app Running State + getState(id, data) { + return api.get('/app/state/' + id, data); + }, + //Install App + install(id, data) { + return api.post('/app/install/' + id, data); + }, + //Install Info + state(id) { + return api.get('/app/speed/' + id); + }, + // Uninstall App + uninstall(id) { + return api.delete('/app/uninstall/' + id); + }, + //My App List + myAppList(data) { + return api.get('/app/mylist', data); + }, + //Container info + getContainerInfo(id) { + return api.get('/app/info/' + id); + }, + //Container Log + getContainerLogs(id) { + return api.get('/app/logs/' + id) + }, + //Start Or Stop Or Restart A Container with ID + startContainer(id, data) { + return api.put('/app/state/' + id, data) + }, + getContainerSettingdata(id) { + return api.get(`/app/update/${id}/info`) + }, + //Update Container Settings + updateContainerSetting(id, data) { + return api.put(`/app/update/${id}/setting`, data); + } +} +export default app; diff --git a/UI/src/service/ddns.js b/UI/src/service/ddns.js new file mode 100644 index 0000000..987956b --- /dev/null +++ b/UI/src/service/ddns.js @@ -0,0 +1,37 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:08 + * @Description: DDNS Service API + * @FilePath: \CasaOS-UI\src\service\ddns.js + */ +import { api } from "./service.js"; + +const ddns = { + //Add New DDNS + add(data) { + return api.post("/ddns/set", data); + }, + //Delete a DDNS Item + delete(id) { + return api.delete("/ddns/delete/" + id); + }, + //Get DDNS List + get_list() { + return api.get('/ddns/list'); + }, + //Ger DDNS Provider List + get_provider_list() { + return api.get('/ddns/getlist'); + }, + //Get Public Internet IP address (IPv4) + get_ipv4() { + return api.get('/ddns/ip'); + }, + // Ping Host + ping(host) { + return api.get('/ddns/ping/' + host); + } +} +export default ddns; diff --git a/UI/src/service/disk.js b/UI/src/service/disk.js new file mode 100644 index 0000000..28747e5 --- /dev/null +++ b/UI/src/service/disk.js @@ -0,0 +1,35 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:02 + * @Description: Disk API + * @FilePath: \CasaOS-UI\src\service\disk.js + */ +import { api } from "./service.js"; + +const disk = { + // get Path list + diskInfo() { + return api.get('/disk/info'); + }, + diskList() { + return api.get('/disk/list'); + }, + // System path + renamePath(oldpath, path) { + let data = { + oldpath: oldpath, + newpath: path + } + return api.get('/zima/rename', data); + }, + // Make a new Dir + mkdir(path) { + let data = { + path: path + } + return api.get('/zima/mkdir', data) + } +} +export default disk; diff --git a/UI/src/service/file.js b/UI/src/service/file.js new file mode 100644 index 0000000..84d998f --- /dev/null +++ b/UI/src/service/file.js @@ -0,0 +1,36 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:25:53 + * @Description: File API + * @FilePath: \CasaOS-UI\src\service\file.js + */ +import { api } from "./service.js"; + +const file = { + // get Path list + dirPath(path) { + let data = { + path: path + } + return api.get('/file/dirpath', data); + }, + // System path + renamePath(oldpath, path) { + let data = { + oldpath: oldpath, + newpath: path + } + return api.get('/file/rename', data); + }, + // Make a new Dir + mkdir(path) { + let data = { + path: path + } + return api.post('/file/mkdir', data) + } +} + +export default file; \ No newline at end of file diff --git a/UI/src/service/info.js b/UI/src/service/info.js new file mode 100644 index 0000000..60ca393 --- /dev/null +++ b/UI/src/service/info.js @@ -0,0 +1,53 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-23 17:41:01 + * @Description: System HardWare Info API + * @FilePath: /CasaOS-UI/src/service/info.js + */ +import { api } from "./service.js"; + +const info = { + //CPU info + cpuInfo() { + return api.get("/zima/getcpuinfo"); + }, + //Memory Info + memoryInfo() { + return api.get("/zima/getmeminfo"); + }, + //Network Info + networkInfo() { + return api.get('/zima/getnetinfo'); + }, + //Disk Info + diskInfo() { + return api.get('/zima/getdiskinfo'); + }, + //All Info + allInfo() { + return api.get('/zima/getinfo'); + }, + // System Info + systemInfo() { + return api.get('/zima/sysinfo'); + }, + //Get CasaOS Config + systemConfig() { + return api.get('/sys/config') + }, + //Save CasaOs Config + saveSystemConfig(data) { + return api.post('/sys/config', data) + }, + // Check Verison + checkVersion() { + return api.get('/sys/check'); + }, + //Update System + updateSystem(){ + return api.post('/sys/update'); + } +} +export default info; diff --git a/UI/src/service/service.js b/UI/src/service/service.js new file mode 100644 index 0000000..976ca61 --- /dev/null +++ b/UI/src/service/service.js @@ -0,0 +1,138 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-23 17:26:31 + * @Description: + * @FilePath: /CasaOS-UI/src/service/service.js + */ +import axios from 'axios' +import qs from 'qs' +import router from '@/router' +import store from '@/store' +// Set Post Headers +axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; +axios.defaults.withCredentials = false; +if (process.env.NODE_ENV === "'dev'") { + axios.defaults.baseURL = `http://${store.state.devIp}:8089/v1`; +} else { + axios.defaults.baseURL = `${document.location.protocol}//${document.location.host}/v1` +} + +//Create a axios instance, And set timeout to 30s +const instance = axios.create({ + timeout: 10000, +}); + + +window.isRefreshing = false + +let refreshSubscribers = [] + +function subscribeTokenRefresh(cb) { + refreshSubscribers.push(cb) +} + +function onRrefreshed(token) { + refreshSubscribers.map(cb => cb(token)) +} + +// Request interceptors +instance.interceptors.request.use((config) => { + let token = '' + if (sessionStorage.getItem("user_token")) { + token = sessionStorage.getItem("user_token") + } + if (localStorage.getItem("user_token")) { + token = localStorage.getItem("user_token") + } + config.headers.Authorization = token + if (token === "" && config.url !== "user/login") { + if (!window.isRefreshing) { + window.isRefreshing = true; + axios.post('user/login', qs.stringify({ + username: "admin", + pwd: "admin" + })).then(res => { + token = res.data.data; + store.commit('setToken', token) + localStorage.setItem("user_token", token) + onRrefreshed(token); + }) + } + let retry = new Promise((resolve) => { + /* (token) => {...}这个函数就是回调函数 */ + subscribeTokenRefresh((token) => { + config.headers.Authorization = token + /* 将请求挂起 */ + resolve(config) + }) + }) + return retry + } else { + return config; + } + + +}, (error) => { + // Do something with request error + return Promise.reject(error) +}) + +// 响应拦截(请求返回后拦截) +instance.interceptors.response.use(response => { + //console.log("响应拦截", response); + return response; +}, error => { + console.log('catch', error) + if (error.response) { + + switch (error.response.status) { + case 401: + sessionStorage.removeItem('user_token') //可能是token过期,清除它 + router.replace({ //跳转到登录页面 + path: '/', + query: { redirect: router.currentRoute.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由 + }) + break; + case 404: + store.commit('setServiceError', true); + break; + case 500: + break; + } + } else { + + store.commit('setServiceError', true); + } + return Promise.reject(error) +}) + +//按照请求类型对axios进行封装 +const api = { + get(url, data) { + return instance.get(url, { params: data }) + }, + post(url, data) { + let newData = (url.indexOf("install") > 0 || url.indexOf("sys") > 0) ? JSON.stringify(data) : qs.stringify(data) + if (url.indexOf("install") > 0) { + axios.defaults.headers.post['Content-Type'] = 'application/json'; + } else { + axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; + } + return instance.post(url, newData) + }, + put(url, data) { + let newData = (url.indexOf("setting") > 0) ? JSON.stringify(data) : qs.stringify(data) + if (url.indexOf("setting") > 0) { + axios.defaults.headers.post['Content-Type'] = 'application/json'; + } else { + axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; + } + return instance.put(url, newData) + }, + delete(url, data) { + return instance.delete(url, { params: data }) + } +} +export { api } diff --git a/UI/src/service/task.js b/UI/src/service/task.js new file mode 100644 index 0000000..8265374 --- /dev/null +++ b/UI/src/service/task.js @@ -0,0 +1,21 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:45 + * @Description: Task API + * @FilePath: \CasaOS-UI\src\service\task.js + */ +import { api } from "./service.js"; + +const task = { + //List + list() { + return api.get("/task/list"); + }, + //Mark + completion(id) { + return api.put(`/task/completion/${id}`); + } +} +export default task; diff --git a/UI/src/service/user.js b/UI/src/service/user.js new file mode 100644 index 0000000..b2d7054 --- /dev/null +++ b/UI/src/service/user.js @@ -0,0 +1,47 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:47 + * @Description: User API + * @FilePath: \CasaOS-UI\src\service\user.js + */ +import { api } from "./service.js"; + +const user = { + //login + login(data) { + return api.post("user/login", data); + }, + + // Create UserName and Password + createUsernameAndPaword(data) { + return api.post("/user/setusernamepwd", data); + }, + + // Change User Avatar + changeAvatar(data) { + return api.post("/user/changhead", data); + }, + + // Change UserName + changeUserName(data) { + return api.put("/user/changusername", data); + }, + + // Change User Password + changePassword(data) { + return api.put("/user/changuserpwd", data); + }, + + // Get user info + getUserInfo() { + return api.get("/user/info"); + }, + + // Change User Info + changeUserInfo(data) { + return api.post('/user/changuserinfo', data) + } +} +export default user; diff --git a/UI/src/service/zerotier.js b/UI/src/service/zerotier.js new file mode 100644 index 0000000..5193f21 --- /dev/null +++ b/UI/src/service/zerotier.js @@ -0,0 +1,64 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-19 09:26:50 + * @Description: Zerotier API + * @FilePath: \CasaOS-UI\src\service\zerotier.js + */ +import { api } from "./service.js"; + +const zerotier = { + //Check if Need login to zerotier + isLogin() { + return api.get("/zerotier/islogin"); + }, + //Login + login(data) { + return api.post("/zerotier/login", data); + }, + //Register + register(data) { + return api.post('/zerotier/register', data); + }, + //networklist + networkLits() { + return api.get('/zerotier/list'); + }, + //joinNetwork + joinNetwork(id) { + return api.post(`/zerotier/join/${id}`); + }, + // leaveNetwork + leaveNetwork(id) { + return api.post(`/zerotier/leave/${id}`); + }, + // Get Network detial + networkDetail(id) { + return api.get(`/zerotier/info/${id}`); + }, + // Edit Network + editNetwork(id, data) { + return api.put(`/zerotier/edit/${id}`, data) + }, + // Delete A Network + delNetwork(id) { + return api.delete(`/zerotier/network/${id}/del`) + }, + createNetwork() { + return api.post('/zerotier/create') + }, + // Get Network member list + getMembers(id) { + return api.get(`/zerotier/member/${id}`) + }, + // Edit Member + editMember(id, mId, data) { + return api.put(`/zerotier/member/${id}/edit/${mId}`, data) + }, + // Delete Member + delMemeber(id, mId) { + return api.delete(`/zerotier/member/${id}/del/${mId}`) + } +} +export default zerotier; diff --git a/UI/src/store/index.js b/UI/src/store/index.js new file mode 100644 index 0000000..11f3de3 --- /dev/null +++ b/UI/src/store/index.js @@ -0,0 +1,34 @@ +/* + * @Author: JerryK + * @Date: 2021-09-18 21:32:13 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-22 16:28:16 + * @Description: + * @FilePath: /CasaOS-UI/src/store/index.js + */ +import Vue from 'vue' +import Vuex from 'vuex' +//import createPersistedState from "vuex-persistedstate"; + +Vue.use(Vuex) + +export default new Vuex.Store({ + //plugins: [createPersistedState()], + state: { + token: "", + devIp: "192.168.2.217", + serviceError: false + }, + mutations: { + setToken(state, val) { + state.token = val + }, + setServiceError(state, val) { + state.serviceError = val + } + }, + actions: { + }, + modules: { + } +}) diff --git a/UI/vue.config.js b/UI/vue.config.js new file mode 100644 index 0000000..d2e2467 --- /dev/null +++ b/UI/vue.config.js @@ -0,0 +1,23 @@ +/* + * @Author: JerryK + * @Date: 2021-09-22 10:10:10 + * @LastEditors: JerryK + * @LastEditTime: 2021-09-22 15:26:47 + * @Description: + * @FilePath: /CasaOS-UI/vue.config.js + */ +const webpack = require('webpack') + +module.exports = { + publicPath: '/ui/', + runtimeCompiler: true, + lintOnSave: false, + productionSourceMap: false, + pluginOptions: { + + }, + chainWebpack: config => { + config.plugin('ignore') + .use(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)); + } +} diff --git a/UI/yarn.lock b/UI/yarn.lock new file mode 100644 index 0000000..5b9ce1e --- /dev/null +++ b/UI/yarn.lock @@ -0,0 +1,9172 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280394200&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts= + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.nlark.com/@babel/compat-data/download/@babel/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha1-Lbr4uFM0eWyvuw9Xk6kKL8AQsXY= + +"@babel/core@^7.11.0": + version "7.15.5" + resolved "https://registry.nlark.com/@babel/core/download/@babel/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha1-+O2aznMHIlRGCfkMm7SRYtw79bk= + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/generator/download/@babel/generator-7.15.4.tgz?cache=0&sync_timestamp=1630618918440&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha1-hayxWaJnymMk+Xk5hpke4gIqBbA= + dependencies: + "@babel/types" "^7.15.4" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.15.4.tgz?cache=0&sync_timestamp=1630618920081&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha1-PQ5DsAxeSf22xX5CFgGnpljV+DU= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz?cache=0&sync_timestamp=1630619287194&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor%2Fdownload%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha1-Ia2BX2CbhO4OMFhnbDPPbRZwUl8= + dependencies: + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.9.6": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.15.4.tgz?cache=0&sync_timestamp=1630618788550&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha1-z22U8w++/BORI+J91rAvZa7tt7k= + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.15.4.tgz?cache=0&sync_timestamp=1630618927387&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha1-f5d8F70SpfujY8sZvqCQOUvzfS4= + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.14.5.tgz?cache=0&sync_timestamp=1623280375996&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-create-regexp-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha1-x9WsXpz2IcJgV3Ivt6ikxYiTWMQ= + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.nlark.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.2.3.tgz?cache=0&sync_timestamp=1622025470416&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-define-polyfill-provider%2Fdownload%2F%40babel%2Fhelper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha1-BSXt7FCUZTooJojTTYRuTHXpwLY= + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.15.4.tgz?cache=0&sync_timestamp=1630619284047&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha1-+a7J0hnycer5K59WFZjKayaCYAw= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-function-name/download/@babel/helper-function-name-7.15.4.tgz?cache=0&sync_timestamp=1630618923307&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha1-hFdE2vxDgaSl+2r6bD02+Yp4frw= + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.15.4.tgz?cache=0&sync_timestamp=1630618916983&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha1-CYgYk0oTf854tTaj4BWGS+Hih5s= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.15.4.tgz?cache=0&sync_timestamp=1630618919536&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha1-CZk6MlnA6Rj5nRBCYd/fwDPxeN8= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.15.4.tgz?cache=0&sync_timestamp=1630618921004&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha1-v9NNybupgkpGWLAxfsL9VxpR5u8= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4", "@babel/helper-module-imports@^7.8.3": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.15.4.tgz?cache=0&sync_timestamp=1630619202866&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha1-4YAH0jBjLeoZtHhTuYRHbntOED8= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" + integrity sha1-lizGKaf3+aCC3WLQMH+nX+h4jXw= + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.15.4.tgz?cache=0&sync_timestamp=1630618919803&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha1-8xClEho7nMUtmrGRIr1ymCLe4XE= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha1-WsgizpfuxGdBq3ClF5ceRDpwxak= + +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha1-JjfAcx5MkPv1isWLULK1oZL8lw8= + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.15.4.tgz?cache=0&sync_timestamp=1630618924259&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha1-UqirJrqRjH9t7ihiiwcHGse3NHo= + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.15.4.tgz?cache=0&sync_timestamp=1630619204668&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha1-rDaJBavx3o6XgUNLY12PhnS8wTs= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.15.4.tgz?cache=0&sync_timestamp=1630619286160&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha1-cH29uh9K0Po0+RFPyBl67H1dous= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.15.4.tgz?cache=0&sync_timestamp=1630618922438&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha1-rsq5Lc2+9qEKo7YqsgSwhfd24lc= + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz?cache=0&sync_timestamp=1627804430461&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg= + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha1-bnKh//GNXfy4eOHmLxoCHEty1aM= + +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha1-b3VLJEbPrz1hJSPmq415wnw6Pec= + dependencies: + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/helpers/download/@babel/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha1-X0DwIFCjAnEho89I1JfAXFVer0M= + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz?cache=0&sync_timestamp=1623280393681&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk= + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.0": + version "7.15.6" + resolved "https://registry.nlark.com/@babel/parser/download/@babel/parser-7.15.6.tgz?cache=0&sync_timestamp=1631216210940&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" + integrity sha1-BDuao8MDwHIuU3f++Rl/TPF5ZUk= + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining%2Fdownload%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha1-296rsegPYi2fC1g++ymZYF4KVn4= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" + integrity sha1-+Cqr6WwTXSzqqRf+ufX8oxY1J34= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.14.5.tgz?cache=0&sync_timestamp=1623280683880&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-class-properties%2Fdownload%2F%40babel%2Fplugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha1-QNHuFAxbHjGjUPT17tlFCWVZtC4= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-class-static-block%2Fdownload%2F%40babel%2Fplugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha1-PnymEoRTwInotHepn5cMY/wcuNc= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.15.4.tgz#fb55442bc83ab4d45dda76b91949706bf22881d2" + integrity sha1-+1VEK8g6tNRd2na5GUlwa/IogdI= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.14.5.tgz?cache=0&sync_timestamp=1623280457211&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-dynamic-import%2Fdownload%2F%40babel%2Fplugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha1-DGYX30YcDB+P/ztHzVl3I2AQHSw= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha1-260kQxDObM0IMHIWfYzqg6Uvr3Y= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha1-ON5g2zYug6PYyUSshY3fnwwiOes= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.14.5.tgz?cache=0&sync_timestamp=1623280460897&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-logical-assignment-operators%2Fdownload%2F%40babel%2Fplugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha1-bmIpwqmbAqspFfglceDMZGpAxzg= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz?cache=0&sync_timestamp=1623280605042&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha1-7jhYnOAOLMWbKZ7D6kBvzToP2vY= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.14.5.tgz?cache=0&sync_timestamp=1623280460632&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-numeric-separator%2Fdownload%2F%40babel%2Fplugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha1-g2Mb8z2aUd8YTCECoGmsDFjAXxg= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.15.6": + version "7.15.6" + resolved "https://registry.nlark.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.15.6.tgz?cache=0&sync_timestamp=1631216850709&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha1-72gFDIcD0Hslr0AsuWz380po7RE= + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.15.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha1-k53W7d7/Omf997PwRLU0cmJZjDw= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha1-+oNlHmCjYOPxN5fu8AuNUZaVtgM= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha1-N0RklZlrKUXzD1vltg1eKqT1eS0= + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-private-property-in-object%2Fdownload%2F%40babel%2Fplugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha1-VcXjtNAmH9RP5jfj9iTPsPSE4+U= + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha1-D5XuDnV6XWR/N42qDsp+k/qou+g= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.nlark.com/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz?cache=0&sync_timestamp=1618847046078&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-async-generators%2Fdownload%2F%40babel%2Fplugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.nlark.com/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz?cache=0&sync_timestamp=1623280461402&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-class-static-block%2Fdownload%2F%40babel%2Fplugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha1-6vucDL4JyK/rlkujp7vWOUWnLyA= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha1-AolkqbqA28CUyRXEh618TnpmRlo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.8.3": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha1-AA4uJdhnPM5JMAUXo+2kTCY+QgE= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.nlark.com/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.nlark.com/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.nlark.com/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.nlark.com/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.nlark.com/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz?cache=0&sync_timestamp=1623280462994&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-private-property-in-object%2Fdownload%2F%40babel%2Fplugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz?cache=0&sync_timestamp=1623280464882&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha1-9xh9lYinaN0IC/TJ/+EX6mL3hio= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.14.5.tgz?cache=0&sync_timestamp=1623280684756&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-async-to-generator%2Fdownload%2F%40babel%2Fplugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha1-cseJCE2PIJSsuUVjOUPvhEPTnmc= + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha1-5IZB2ZnUvBV6Z+8zautUvET9OtQ= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.15.3": + version "7.15.3" + resolved "https://registry.nlark.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha1-lMgabi/CMLzObvU3rJah5NKzr68= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha1-UK7heq9/MyrkTjvOTC4QU01dO/E= + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha1-G514mHQg0RIj1BGVRhzEO5dLIE8= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.nlark.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha1-CtWO034j4iCE0QnxhSYINeVVdXY= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.14.5.tgz?cache=0&sync_timestamp=1623280386290&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-dotall-regex%2Fdownload%2F%40babel%2Fplugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha1-L2v3bka9+AQ7Tn4WzyRTJim6DHo= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha1-NlpIRIgb3xUB46nwJw5/D5EXeVQ= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.14.5.tgz?cache=0&sync_timestamp=1623280390976&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha1-UVS43Wo9/m2Qkj1hckvT3uuQtJM= + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha1-JcYszicYz7KXFfQW511SY/s2qMI= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha1-6Bxl7LkAdG1/MYAva+0fUtkV1vI= + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha1-QdBsf/XU0J489Fh70+zzkwxzD3g= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha1-s5zVISor8jWmF9Mg7CtIvMCRuKc= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.14.5.tgz?cache=0&sync_timestamp=1623280684461&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha1-T9nOfjQRy4uDhISAtwQdgwBIWPc= + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha1-ggEQEkDqu1p2wI72GylU92e2tME= + dependencies: + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha1-tCiQxzSaeMgncZ8dLQzTjH0mgTI= + dependencies: + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.14.5.tgz?cache=0&sync_timestamp=1623280687270&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha1-+2Yt/uaXzOJ0p82lJRkKeQlqpuA= + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.nlark.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha1-xo9cXRLS66ujdi5XwsT2NHpG57I= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha1-Mb2ui5JdyEB26/zSqZQBQ67X2/g= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.14.5.tgz?cache=0&sync_timestamp=1623280681813&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha1-0LX66snphZehYanPeMUn7ZNM3EU= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + +"@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha1-XyKFzDFgv0jIUCQycWtIUE0p7WI= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha1-DduqH4PbNgbxzfSEb6HftHNFizQ= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.14.5.tgz?cache=0&sync_timestamp=1623280395479&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha1-lnb9VwftKPUicnxbPAqoVERAsE8= + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.14.5.tgz?cache=0&sync_timestamp=1623280468592&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-reserved-words%2Fdownload%2F%40babel%2Fplugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha1-xEWJtmHP2++NQwDcx0ad/6kvgwQ= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.11.0": + version "7.15.0" + resolved "https://registry.nlark.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.15.0.tgz#d3aa650d11678ca76ce294071fda53d7804183b3" + integrity sha1-06plDRFnjKds4pQHH9pT14BBg7M= + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.14.5.tgz?cache=0&sync_timestamp=1623280351390&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-shorthand-properties%2Fdownload%2F%40babel%2Fplugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha1-l/E4VfFAkzjYyty6ymcK154JGlg= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.14.6": + version "7.14.6" + resolved "https://registry.nlark.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.14.6.tgz?cache=0&sync_timestamp=1623708435507&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha1-a9QOV/596UqpBIUZY7VhZlL3MUQ= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.14.5.tgz?cache=0&sync_timestamp=1623280350911&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-sticky-regex%2Fdownload%2F%40babel%2Fplugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha1-W2F1Qmdei3dhKUOB88KMYz9Arrk= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.14.5.tgz?cache=0&sync_timestamp=1623280350943&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-template-literals%2Fdownload%2F%40babel%2Fplugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha1-pfK8Izk32EU4hdxza92Nn/q/PZM= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.14.5.tgz?cache=0&sync_timestamp=1623280352113&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha1-Oa8nOemJor0pG/a1PxaYFCPUV9Q= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.14.5.tgz?cache=0&sync_timestamp=1623280468339&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-unicode-escapes%2Fdownload%2F%40babel%2Fplugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha1-nUvSpoHjxdes9PV/qeURddkdDGs= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.nlark.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha1-TNCbbIQl3YElXHzrP7GDbnQUOC4= + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.11.0": + version "7.15.6" + resolved "https://registry.nlark.com/@babel/preset-env/download/@babel/preset-env-7.15.6.tgz?cache=0&sync_timestamp=1631216850458&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" + integrity sha1-DziY251j0yDyGxc4DYRid53ldlk= + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.4" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@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/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha1-Ni8raMZihClw/bXiVP/I/BwuQV4= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.4.tgz?cache=0&sync_timestamp=1630618785994&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha1-/RfRa/34eObdAtGXU6OfqKjZyEo= + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.0.0", "@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/template/download/@babel/template-7.15.4.tgz?cache=0&sync_timestamp=1630618922172&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha1-UYmNNdzz+qZwxO5q/P1RfuE58ZQ= + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.0": + version "7.15.4" + resolved "https://registry.nlark.com/@babel/traverse/download/@babel/traverse-7.15.4.tgz?cache=0&sync_timestamp=1630618923983&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha1-/4UQNnoUS/v/VS2eGOKPPiiJwi0= + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.15.6" + resolved "https://registry.nlark.com/@babel/types/download/@babel/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha1-mavcSCGLKIHAWN0KerBbmcm+dY8= + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.nlark.com/@hapi/address/download/@hapi/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha1-XWftQ/P9QaadS5/3tW58DR0KgeU= + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.nlark.com/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha1-CnCVreoGckPOMoPhtWuKj0U7JCo= + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.nlark.com/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha1-/elgZMpEbeyMVajC8TCVewcMbgY= + +"@hapi/joi@^15.0.1": + version "15.1.1" + resolved "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz?cache=0&sync_timestamp=1615984328397&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fjoi%2Fdownload%2F%40hapi%2Fjoi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc= + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.nlark.com/@hapi/topo/download/@hapi/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck= + dependencies: + "@hapi/hoek" "^8.3.0" + +"@intervolga/optimize-cssnano-plugin@^1.0.5": + version "1.0.6" + resolved "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8" + integrity sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg= + dependencies: + cssnano "^4.0.0" + cssnano-preset-default "^4.0.0" + postcss "^7.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4= + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1622792655362&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= + +"@soda/friendly-errors-webpack-plugin@^1.7.1": + version "1.8.0" + resolved "https://registry.nlark.com/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240" + integrity sha1-hHUdgqkwGdXJLAzw5FrFkIfNIkA= + dependencies: + chalk "^2.4.2" + error-stack-parser "^2.0.2" + string-width "^2.0.0" + strip-ansi "^5" + +"@soda/get-current-script@^1.0.0": + version "1.0.2" + resolved "https://registry.nlark.com/@soda/get-current-script/download/@soda/get-current-script-1.0.2.tgz#a53515db25d8038374381b73af20bb4f2e508d87" + integrity sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc= + +"@types/body-parser@*": + version "1.19.1" + resolved "https://registry.nlark.com/@types/body-parser/download/@types/body-parser-1.19.1.tgz?cache=0&sync_timestamp=1629706727694&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fbody-parser%2Fdownload%2F%40types%2Fbody-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha1-DAF0xCp9AXuBgwPUtdlpywt1kpw= + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect-history-api-fallback@*": + version "1.3.5" + resolved "https://registry.nlark.com/@types/connect-history-api-fallback/download/@types/connect-history-api-fallback-1.3.5.tgz?cache=0&sync_timestamp=1629707083783&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fconnect-history-api-fallback%2Fdownload%2F%40types%2Fconnect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha1-0feooJ0O1aV67lrpwYq5uAMgXa4= + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.nlark.com/@types/connect/download/@types/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE= + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.24" + resolved "https://registry.nlark.com/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha1-6kH5O/fg1ZzVp2ZlBo7WqraBXAc= + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.nlark.com/@types/express/download/@types/express-4.17.13.tgz?cache=0&sync_timestamp=1629707683466&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fexpress%2Fdownload%2F%40types%2Fexpress-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha1-p24plXKJmbq1GjP6vOHXBaNwkDQ= + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.1.4" + resolved "https://registry.nlark.com/@types/glob/download/@types/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha1-6lniHS7lxReRTLS8jkFTuZ5WZnI= + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.nlark.com/@types/http-proxy/download/@types/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha1-MOqFzCyGg2g1Kjfw0NNYHiSDTG8= + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1629708116786&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha1-l+3JA36gw4WFMgsolk3eOznkZg0= + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.nlark.com/@types/mime/download/@types/mime-1.3.2.tgz?cache=0&sync_timestamp=1629708374856&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o= + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.nlark.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1629708301760&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha1-EAHMXmo3BLg8I2An538vWOoBD0A= + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.nlark.com/@types/minimist/download/@types/minimist-1.2.2.tgz?cache=0&sync_timestamp=1629708337116&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimist%2Fdownload%2F%40types%2Fminimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w= + +"@types/node@*": + version "16.9.1" + resolved "https://registry.nlark.com/@types/node/download/@types/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" + integrity sha1-BhGzfbQkbJN/7vUp3cwBjPjjVwg= + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.nlark.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz?cache=0&sync_timestamp=1629708441689&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE= + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha1-daKo59irSyMEFFBdkjNdHctTpt8= + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.nlark.com/@types/qs/download/@types/qs-6.9.7.tgz?cache=0&sync_timestamp=1629708766601&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss= + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.nlark.com/@types/range-parser/download/@types/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw= + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.nlark.com/@types/serve-static/download/@types/serve-static-1.13.10.tgz?cache=0&sync_timestamp=1629709268732&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha1-9eDOh5fS18xevtpIpSyWxPpHqNk= + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.nlark.com/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz?cache=0&sync_timestamp=1629709261080&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fsource-list-map%2Fdownload%2F%40types%2Fsource-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk= + +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.nlark.com/@types/tapable/download/@types/tapable-1.0.8.tgz?cache=0&sync_timestamp=1629709376833&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Ftapable%2Fdownload%2F%40types%2Ftapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha1-uUpDkchWZse3Mpn9OtedT6pDUxA= + +"@types/uglify-js@*": + version "3.13.1" + resolved "https://registry.nlark.com/@types/uglify-js/download/@types/uglify-js-3.13.1.tgz?cache=0&sync_timestamp=1629709561839&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fuglify-js%2Fdownload%2F%40types%2Fuglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha1-XoienoHpQkXHW2RQYA4cXqKHiuo= + dependencies: + source-map "^0.6.1" + +"@types/webpack-dev-server@^3.11.0": + version "3.11.6" + resolved "https://registry.nlark.com/@types/webpack-dev-server/download/@types/webpack-dev-server-3.11.6.tgz#d8888cfd2f0630203e13d3ed7833a4d11b8a34dc" + integrity sha1-2IiM/S8GMCA+E9PteDOk0RuKNNw= + dependencies: + "@types/connect-history-api-fallback" "*" + "@types/express" "*" + "@types/serve-static" "*" + "@types/webpack" "^4" + http-proxy-middleware "^1.0.0" + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.nlark.com/@types/webpack-sources/download/@types/webpack-sources-3.2.0.tgz?cache=0&sync_timestamp=1629709682598&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack-sources%2Fdownload%2F%40types%2Fwebpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha1-FtdZuglsKJA0smVT0t8b9FJI04s= + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4", "@types/webpack@^4.0.0": + version "4.41.31" + resolved "https://registry.nlark.com/@types/webpack/download/@types/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa" + integrity sha1-w18lKjVZ3fnIXA2LC0IBkCXlgao= + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@vue/babel-helper-vue-jsx-merge-props@^1.2.1": + version "1.2.1" + resolved "https://registry.nlark.com/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" + integrity sha1-MWJKelBfsU2h1YAjclpMXycOaoE= + +"@vue/babel-helper-vue-transform-on@^1.0.2": + version "1.0.2" + resolved "https://registry.nlark.com/@vue/babel-helper-vue-transform-on/download/@vue/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" + integrity sha1-m5xpHNBvyFUiGiR1w8yDHXdLx9w= + +"@vue/babel-plugin-jsx@^1.0.3": + version "1.0.7" + resolved "https://registry.nlark.com/@vue/babel-plugin-jsx/download/@vue/babel-plugin-jsx-1.0.7.tgz?cache=0&sync_timestamp=1630684863225&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fbabel-plugin-jsx%2Fdownload%2F%40vue%2Fbabel-plugin-jsx-1.0.7.tgz#22d6c84ef8db5ac13db971476a55cc5215902168" + integrity sha1-ItbITvjbWsE9uXFHalXMUhWQIWg= + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + "@vue/babel-helper-vue-transform-on" "^1.0.2" + camelcase "^6.0.0" + html-tags "^3.1.0" + svg-tags "^1.0.0" + +"@vue/babel-plugin-transform-vue-jsx@^1.2.1": + version "1.2.1" + resolved "https://registry.nlark.com/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.2.1.tgz#646046c652c2f0242727f34519d917b064041ed7" + integrity sha1-ZGBGxlLC8CQnJ/NFGdkXsGQEHtc= + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + html-tags "^2.0.0" + lodash.kebabcase "^4.1.1" + svg-tags "^1.0.0" + +"@vue/babel-preset-app@^4.5.13": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/babel-preset-app/download/@vue/babel-preset-app-4.5.13.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fbabel-preset-app%2Fdownload%2F%40vue%2Fbabel-preset-app-4.5.13.tgz#cb475321e4c73f7f110dac29a48c2a9cb80afeb6" + integrity sha1-y0dTIeTHP38RDawppIwqnLgK/rY= + dependencies: + "@babel/core" "^7.11.0" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.11.0" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.0" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.2.4" + babel-plugin-dynamic-import-node "^2.3.3" + core-js "^3.6.5" + core-js-compat "^3.6.5" + semver "^6.1.0" + +"@vue/babel-preset-jsx@^1.2.4": + version "1.2.4" + resolved "https://registry.nlark.com/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" + integrity sha1-kv6nnbbxOwHoDToAmeKSS9y+Toc= + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + "@vue/babel-sugar-composition-api-inject-h" "^1.2.1" + "@vue/babel-sugar-composition-api-render-instance" "^1.2.4" + "@vue/babel-sugar-functional-vue" "^1.2.2" + "@vue/babel-sugar-inject-h" "^1.2.2" + "@vue/babel-sugar-v-model" "^1.2.3" + "@vue/babel-sugar-v-on" "^1.2.3" + +"@vue/babel-sugar-composition-api-inject-h@^1.2.1": + version "1.2.1" + resolved "https://registry.npm.taobao.org/@vue/babel-sugar-composition-api-inject-h/download/@vue/babel-sugar-composition-api-inject-h-1.2.1.tgz#05d6e0c432710e37582b2be9a6049b689b6f03eb" + integrity sha1-BdbgxDJxDjdYKyvppgSbaJtvA+s= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-composition-api-render-instance@^1.2.4": + version "1.2.4" + resolved "https://registry.nlark.com/@vue/babel-sugar-composition-api-render-instance/download/@vue/babel-sugar-composition-api-render-instance-1.2.4.tgz#e4cbc6997c344fac271785ad7a29325c51d68d19" + integrity sha1-5MvGmXw0T6wnF4WteikyXFHWjRk= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-functional-vue@^1.2.2": + version "1.2.2" + resolved "https://registry.nlark.com/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.2.2.tgz#267a9ac8d787c96edbf03ce3f392c49da9bd2658" + integrity sha1-JnqayNeHyW7b8Dzj85LEnam9Jlg= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.2.2": + version "1.2.2" + resolved "https://registry.nlark.com/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.2.2.tgz#d738d3c893367ec8491dcbb669b000919293e3aa" + integrity sha1-1zjTyJM2fshJHcu2abAAkZKT46o= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.2.3": + version "1.2.3" + resolved "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.2.3.tgz#fa1f29ba51ebf0aa1a6c35fa66d539bc459a18f2" + integrity sha1-+h8pulHr8KoabDX6ZtU5vEWaGPI= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +"@vue/babel-sugar-v-on@^1.2.3": + version "1.2.3" + resolved "https://registry.nlark.com/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.2.3.tgz#342367178586a69f392f04bfba32021d02913ada" + integrity sha1-NCNnF4WGpp85LwS/ujICHQKROto= + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + +"@vue/cli-overlay@^4.5.13": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-overlay/download/@vue/cli-overlay-4.5.13.tgz?cache=0&sync_timestamp=1628579244198&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-overlay%2Fdownload%2F%40vue%2Fcli-overlay-4.5.13.tgz#4f1fd2161be8f69d6cba8079f3f0d7dc4dee47a7" + integrity sha1-Tx/SFhvo9p1suoB58/DX3E3uR6c= + +"@vue/cli-plugin-babel@~4.5.0": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.5.13.tgz?cache=0&sync_timestamp=1628579256313&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-plugin-babel%2Fdownload%2F%40vue%2Fcli-plugin-babel-4.5.13.tgz#a89c482edcc4ea1d135645cec502a7f5fd4c30e7" + integrity sha1-qJxILtzE6h0TVkXOxQKn9f1MMOc= + dependencies: + "@babel/core" "^7.11.0" + "@vue/babel-preset-app" "^4.5.13" + "@vue/cli-shared-utils" "^4.5.13" + babel-loader "^8.1.0" + cache-loader "^4.1.0" + thread-loader "^2.1.3" + webpack "^4.0.0" + +"@vue/cli-plugin-eslint@~4.5.0": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-4.5.13.tgz#8baf22d0d96d76720c7506646b96f4f62c05bdfa" + integrity sha1-i68i0NltdnIMdQZka5b09iwFvfo= + dependencies: + "@vue/cli-shared-utils" "^4.5.13" + eslint-loader "^2.2.1" + globby "^9.2.0" + inquirer "^7.1.0" + webpack "^4.0.0" + yorkie "^2.0.0" + +"@vue/cli-plugin-router@^4.5.13", "@vue/cli-plugin-router@~4.5.0": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.5.13.tgz?cache=0&sync_timestamp=1628579325890&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-plugin-router%2Fdownload%2F%40vue%2Fcli-plugin-router-4.5.13.tgz#0b67c8898a2bf132941919a2a2e5f3aacbd9ffbe" + integrity sha1-C2fIiYor8TKUGRmiouXzqsvZ/74= + dependencies: + "@vue/cli-shared-utils" "^4.5.13" + +"@vue/cli-plugin-vuex@^4.5.13", "@vue/cli-plugin-vuex@~4.5.0": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.5.13.tgz#98646d8bc1e69cf6c6a6cba2fed3eace0356c360" + integrity sha1-mGRti8HmnPbGpsui/tPqzgNWw2A= + +"@vue/cli-service@~4.5.0": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-service/download/@vue/cli-service-4.5.13.tgz?cache=0&sync_timestamp=1628579326809&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-service%2Fdownload%2F%40vue%2Fcli-service-4.5.13.tgz#a09e684a801684b6e24e5414ad30650970eec9ed" + integrity sha1-oJ5oSoAWhLbiTlQUrTBlCXDuye0= + dependencies: + "@intervolga/optimize-cssnano-plugin" "^1.0.5" + "@soda/friendly-errors-webpack-plugin" "^1.7.1" + "@soda/get-current-script" "^1.0.0" + "@types/minimist" "^1.2.0" + "@types/webpack" "^4.0.0" + "@types/webpack-dev-server" "^3.11.0" + "@vue/cli-overlay" "^4.5.13" + "@vue/cli-plugin-router" "^4.5.13" + "@vue/cli-plugin-vuex" "^4.5.13" + "@vue/cli-shared-utils" "^4.5.13" + "@vue/component-compiler-utils" "^3.1.2" + "@vue/preload-webpack-plugin" "^1.1.0" + "@vue/web-component-wrapper" "^1.2.0" + acorn "^7.4.0" + acorn-walk "^7.1.1" + address "^1.1.2" + autoprefixer "^9.8.6" + browserslist "^4.12.0" + cache-loader "^4.1.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + cli-highlight "^2.1.4" + clipboardy "^2.3.0" + cliui "^6.0.0" + copy-webpack-plugin "^5.1.1" + css-loader "^3.5.3" + cssnano "^4.1.10" + debug "^4.1.1" + default-gateway "^5.0.5" + dotenv "^8.2.0" + dotenv-expand "^5.1.0" + file-loader "^4.2.0" + fs-extra "^7.0.1" + globby "^9.2.0" + hash-sum "^2.0.0" + html-webpack-plugin "^3.2.0" + launch-editor-middleware "^2.2.1" + lodash.defaultsdeep "^4.6.1" + lodash.mapvalues "^4.6.0" + lodash.transform "^4.6.0" + mini-css-extract-plugin "^0.9.0" + minimist "^1.2.5" + pnp-webpack-plugin "^1.6.4" + portfinder "^1.0.26" + postcss-loader "^3.0.0" + ssri "^8.0.1" + terser-webpack-plugin "^1.4.4" + thread-loader "^2.1.3" + url-loader "^2.2.0" + vue-loader "^15.9.2" + vue-style-loader "^4.1.2" + webpack "^4.0.0" + webpack-bundle-analyzer "^3.8.0" + webpack-chain "^6.4.0" + webpack-dev-server "^3.11.0" + webpack-merge "^4.2.2" + optionalDependencies: + vue-loader-v16 "npm:vue-loader@^16.1.0" + +"@vue/cli-shared-utils@^4.5.13": + version "4.5.13" + resolved "https://registry.nlark.com/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.5.13.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-shared-utils%2Fdownload%2F%40vue%2Fcli-shared-utils-4.5.13.tgz#acd40f31b4790f1634292bdaa5fca95dc1e0ff50" + integrity sha1-rNQPMbR5DxY0KSvapfypXcHg/1A= + dependencies: + "@hapi/joi" "^15.0.1" + chalk "^2.4.2" + execa "^1.0.0" + launch-editor "^2.2.1" + lru-cache "^5.1.1" + node-ipc "^9.1.1" + open "^6.3.0" + ora "^3.4.0" + read-pkg "^5.1.1" + request "^2.88.2" + semver "^6.1.0" + strip-ansi "^6.0.0" + +"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2": + version "3.2.2" + resolved "https://registry.nlark.com/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.2.2.tgz#2f7ed5feed82ff7f0284acc11d525ee7eff22460" + integrity sha1-L37V/u2C/38ChKzBHVJe5+/yJGA= + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.36" + postcss-selector-parser "^6.0.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2" + +"@vue/preload-webpack-plugin@^1.1.0": + version "1.1.2" + resolved "https://registry.nlark.com/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz#ceb924b4ecb3b9c43871c7a429a02f8423e621ab" + integrity sha1-zrkktOyzucQ4ccekKaAvhCPmIas= + +"@vue/web-component-wrapper@^1.2.0": + version "1.3.0" + resolved "https://registry.nlark.com/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" + integrity sha1-trQKdiVCnSvXwigd26YB7QXcfxo= + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz?cache=0&sync_timestamp=1625473466238&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ= + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz?cache=0&sync_timestamp=1625473463638&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Ffloating-point-hex-parser%2Fdownload%2F%40webassemblyjs%2Ffloating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q= + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI= + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA= + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&sync_timestamp=1625473420790&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc= + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz?cache=0&sync_timestamp=1625473415428&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-fsm%2Fdownload%2F%40webassemblyjs%2Fhelper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg= + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc= + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz?cache=0&sync_timestamp=1625473463016&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-wasm-bytecode%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A= + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz?cache=0&sync_timestamp=1625473466570&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y= + dependencies: + "@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/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ= + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU= + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha1-BNM7Y2945qaBMifoJAL3Y3tiKas= + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz?cache=0&sync_timestamp=1625473468202&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha1-P+bXnT8PkiGDqoYALELdJWz+6c8= + dependencies: + "@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/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw= + dependencies: + "@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/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz?cache=0&sync_timestamp=1625473467198&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha1-IhEYHlsxMmRDzIES658LkChyGmE= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz?cache=0&sync_timestamp=1625473464593&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4= + dependencies: + "@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/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz?cache=0&sync_timestamp=1625473422035&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwast-parser%2Fdownload%2F%40webassemblyjs%2Fwast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ= + dependencies: + "@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" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.nlark.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz?cache=0&sync_timestamp=1625473465901&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwast-printer%2Fdownload%2F%40webassemblyjs%2Fwast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha1-STXVTIX+9jewDOn1I3dFHQDUeJk= + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.nlark.com/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.nlark.com/@xtuc/long/download/@xtuc/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= + +abbrev@1: + version "1.1.1" + resolved "https://registry.nlark.com/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^5.2.0: + version "5.3.2" + resolved "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha1-ftW7VZCLOy8bxVxq8WU7rafweTc= + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.nlark.com/acorn-walk/download/acorn-walk-7.2.0.tgz?cache=0&sync_timestamp=1630916588767&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w= + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.nlark.com/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1630916517167&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha1-NYZv1xBSjpLeEM8GAWSY5H454eY= + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1630916517167&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo= + +address@^1.1.2: + version "1.1.2" + resolved "https://registry.nlark.com/address/download/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY= + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/ajv-errors/download/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha1-81mGrOuRr63sQQL72FAUlQzvpk0= + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.nlark.com/ajv-keywords/download/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha1-MfKdpatuANHC0yms97WSlhTVAU0= + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1631470871211&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.nlark.com/alphanum-sort/download/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.nlark.com/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha1-46PaS/uubIapwoViXeEkojQCb78= + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.nlark.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz?cache=0&sync_timestamp=1618847144938&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.nlark.com/ansi-html/download/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha1-7dgDYornHATIWuegkG7a00tkiTc= + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.nlark.com/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.nlark.com/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.nlark.com/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= + +arch@^2.1.1: + version "2.2.0" + resolved "https://registry.npm.taobao.org/arch/download/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha1-G8R4GPMFdk8jqzMGsL/AhsWinRE= + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.nlark.com/are-we-there-yet/download/are-we-there-yet-1.1.7.tgz?cache=0&sync_timestamp=1630592961858&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fare-we-there-yet%2Fdownload%2Fare-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha1-sVR0qTKtq0/4pQ2a36fk6SbyEUY= + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.nlark.com/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.1.0.tgz?cache=0&sync_timestamp=1618846805394&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farr-flatten%2Fdownload%2Farr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.nlark.com/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.nlark.com/array-flatten/download/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= + +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.nlark.com/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.nlark.com/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha1-EamAuE67kXgc41sP3C7ilON4Pwc= + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.nlark.com/assert/download/assert-1.5.0.tgz?cache=0&sync_timestamp=1618847153747&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fassert%2Fdownload%2Fassert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs= + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/astral-regex/download/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.nlark.com/async/download/async-2.6.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fasync%2Fdownload%2Fasync-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.nlark.com/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.nlark.com/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + +autoprefixer@^9.8.6: + version "9.8.6" + resolved "https://registry.nlark.com/autoprefixer/download/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha1-O3NZTKG/kmYyDFrPFYjXTep0IQ8= + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.nlark.com/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.nlark.com/aws4/download/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= + +axios@^0.19.0: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + +axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.nlark.com/babel-eslint/download/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI= + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-loader@^8.1.0: + version "8.2.2" + resolved "https://registry.nlark.com/babel-loader/download/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha1-k2POhMEMmkDmx1N0jhRBtgyKC4E= + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.nlark.com/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz?cache=0&sync_timestamp=1618846790496&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.nlark.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.2.tgz?cache=0&sync_timestamp=1622023904181&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha1-6RJHheb9lPlLYYp5VOVpMFO/Uyc= + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.4" + resolved "https://registry.nlark.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.2.4.tgz?cache=0&sync_timestamp=1627502231082&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs3%2Fdownload%2Fbabel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + integrity sha1-aMuBMWsOjZ1yGpLgAJ7G7NTNLKk= + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" + +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.nlark.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.2.2.tgz?cache=0&sync_timestamp=1622023907940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-regenerator%2Fdownload%2Fbabel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha1-sxDI1kKsraNIwfo7Pmzg6FG+4Hc= + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.nlark.com/base64-js/download/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + 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" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha1-MlyGGoIryzWKQceKM7jm4ght3n8= + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.nlark.com/big.js/download/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.nlark.com/big.js/download/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.nlark.com/binary-extensions/download/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.nlark.com/bindings/download/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= + dependencies: + file-uri-to-path "1.0.0" + +block-stream@*: + version "0.0.9" + resolved "https://registry.nlark.com/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.nlark.com/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1618847007562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha1-d1s/J477uXGO7HNh9IP7Nvu/6og= + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.npm.taobao.org/bn.js/download/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI= + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz?cache=0&sync_timestamp=1615984442879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbody-parser%2Fdownload%2Fbody-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.nlark.com/bonjour/download/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.nlark.com/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + 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" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.nlark.com/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.nlark.com/browserify-aes/download/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/browserify-cipher/download/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.nlark.com/browserify-des/download/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.nlark.com/browserify-rsa/download/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0= + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.nlark.com/browserify-sign/download/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM= + dependencies: + 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" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.nlark.com/browserify-zlib/download/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.0: + version "4.17.0" + resolved "https://registry.nlark.com/browserslist/download/browserslist-4.17.0.tgz?cache=0&sync_timestamp=1630836541147&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" + integrity sha1-H82B7HW0HW1JlPsIMbkqwYwBZJw= + dependencies: + caniuse-lite "^1.0.30001254" + colorette "^1.3.0" + electron-to-chromium "^1.3.830" + escalade "^3.1.1" + node-releases "^1.1.75" + +buefy@^0.9.0: + version "0.9.10" + resolved "https://registry.nlark.com/buefy/download/buefy-0.9.10.tgz#17f64ee1ba43a145d1d3c56f45cba95e4e2975fa" + integrity sha1-F/ZO4bpDoUXR08VvRcupXk4pdfo= + dependencies: + bulma "0.9.3" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.nlark.com/buffer-indexof/download/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/buffer-json/download/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM= + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.nlark.com/buffer/download/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bulma@0.9.3: + version "0.9.3" + resolved "https://registry.nlark.com/bulma/download/bulma-0.9.3.tgz#ddccb7436ebe3e21bf47afe01d3c43a296b70243" + integrity sha1-3cy3Q26+PiG/R6/gHTxDopa3AkM= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= + +cacache@^12.0.2, cacache@^12.0.3: + version "12.0.4" + resolved "https://registry.nlark.com/cacache/download/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw= + dependencies: + 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" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + 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" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.nlark.com/cache-loader/download/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha1-mUjK41OuwKH8ser9ojAIFuyFOH4= + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/caller-callsite/download/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/caller-path/download/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/callsites/download/callsites-2.0.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/camelcase-keys/download/camelcase-keys-2.1.0.tgz?cache=0&sync_timestamp=1624608993530&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.nlark.com/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.nlark.com/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.nlark.com/camelcase/download/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/caniuse-api/download/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001254: + version "1.0.30001257" + resolved "https://registry.nlark.com/caniuse-lite/download/caniuse-lite-1.0.30001257.tgz#150aaf649a48bee531104cfeda57f92ce587f6e5" + integrity sha1-FQqvZJpIvuUxEEz+2lf5LOWH9uU= + +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.nlark.com/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha1-22QGbGQi7tLgjMFLmGykN5bbxtQ= + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha1-qsTit3NKdAhnrrFr8CqtVWoeegE= + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.nlark.com/chardet/download/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.nlark.com/check-types/download/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha1-M1bMoZyIlUTy16le1JzlCKDs9VI= + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.nlark.com/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1623763535523&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + 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" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.2" + resolved "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz?cache=0&sync_timestamp=1623763535523&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchokidar%2Fdownload%2Fchokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha1-26OXb8rbAW9m/TZQIdkWANAcHnU= + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.nlark.com/chownr/download/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.nlark.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.nlark.com/ci-info/download/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.nlark.com/cipher-base/download/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.nlark.com/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x: + version "4.2.3" + resolved "https://registry.nlark.com/clean-css/download/clean-css-4.2.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fclean-css%2Fdownload%2Fclean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g= + dependencies: + source-map "~0.6.0" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/cli-cursor/download/cli-cursor-2.1.0.tgz?cache=0&sync_timestamp=1629747481175&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/cli-cursor/download/cli-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629747481175&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= + dependencies: + restore-cursor "^3.1.0" + +cli-highlight@^2.1.4: + version "2.1.11" + resolved "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.11.tgz?cache=0&sync_timestamp=1616955767588&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha1-SXNvpFLwqvT65YDjCssmgo0twb8= + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@^2.0.0: + version "2.6.0" + resolved "https://registry.nlark.com/cli-spinners/download/cli-spinners-2.6.0.tgz?cache=0&sync_timestamp=1618847030071&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha1-NsfcmPtqmna9YjjsP3fiQlYn6Tk= + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/cli-width/download/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= + +clipboardy@^2.3.0: + version "2.3.0" + resolved "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" + integrity sha1-PCkDZQxo5GqRs4iYW8J3QofbopA= + dependencies: + arch "^2.1.1" + execa "^1.0.0" + is-wsl "^2.1.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.nlark.com/cliui/download/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.nlark.com/cliui/download/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE= + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.nlark.com/cliui/download/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08= + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/clone-deep/download/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.nlark.com/clone/download/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM= + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.nlark.com/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= + +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.nlark.com/color-string/download/color-string-1.6.0.tgz?cache=0&sync_timestamp=1626503501666&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcolor-string%2Fdownload%2Fcolor-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha1-w5FfYf4mdnLLfh4GTJ1pIhn2wxI= + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.nlark.com/color/download/color-3.2.1.tgz?cache=0&sync_timestamp=1628104117021&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcolor%2Fdownload%2Fcolor-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha1-NUTcGYyvRJDD7MmnkLVP6f9F4WQ= + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^1.2.1, colorette@^1.3.0: + version "1.4.0" + resolved "https://registry.nlark.com/colorette/download/colorette-1.4.0.tgz?cache=0&sync_timestamp=1631034394587&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcolorette%2Fdownload%2Fcolorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha1-UZD7uHJ2JZqGrXAL/yxtb6o/ykA= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.nlark.com/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= + dependencies: + delayed-stream "~1.0.0" + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.nlark.com/commander/download/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha1-vXerfebelCBc6sxy8XFtKfIKd78= + +commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.nlark.com/commander/download/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.nlark.com/commander/download/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So= + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.nlark.com/component-emitter/download/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.nlark.com/compressible/download/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= + dependencies: + mime-db ">= 1.43.0 < 2" + +compression-webpack-plugin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.0.0.tgz#38b4e18313f5d704c453ab5645e38a5805ba5889" + integrity sha512-V2KmQqaUkErPT+ZcUGHa8zWpIw1oTYaC7wjGewJm053GWAoY04GfU5B/NZ/JSz1eFp9MggMdLQpEHe1TJAQY1A== + dependencies: + schema-utils "^3.1.0" + serialize-javascript "^6.0.0" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.nlark.com/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.nlark.com/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz?cache=0&sync_timestamp=1618847040596&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconnect-history-api-fallback%2Fdownload%2Fconnect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.nlark.com/console-browserify/download/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha1-ZwY871fOts9Jk6KrOlWECujEkzY= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha1-IasEMjXHGgfUXZqtmFk7DbpWurc= + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/constants-browserify/download/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045304679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k= + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.nlark.com/cookie/download/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.nlark.com/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= + dependencies: + 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@^0.1.0: + version "0.1.1" + resolved "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@^5.1.1: + version "5.1.2" + resolved "https://registry.nlark.com/copy-webpack-plugin/download/copy-webpack-plugin-5.1.2.tgz?cache=0&sync_timestamp=1624628567065&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2" + integrity sha1-ioieHcr6bJHGzUvhrRWPHTgjuuI= + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + webpack-log "^2.0.0" + +core-js-compat@^3.14.0, core-js-compat@^3.16.0, core-js-compat@^3.6.5: + version "3.17.3" + resolved "https://registry.nlark.com/core-js-compat/download/core-js-compat-3.17.3.tgz?cache=0&sync_timestamp=1631177006967&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-js-compat%2Fdownload%2Fcore-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e" + integrity sha1-s5yOTexx7NxzXGU85SM0ZuVhMk4= + dependencies: + browserslist "^4.17.0" + semver "7.0.0" + +core-js@^3.6.5: + version "3.17.3" + resolved "https://registry.nlark.com/core-js/download/core-js-3.17.3.tgz?cache=0&sync_timestamp=1631176914291&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-js%2Fdownload%2Fcore-js-3.17.3.tgz#8e8bd20e91df9951e903cabe91f9af4a0895bc1e" + integrity sha1-jovSDpHfmVHpA8q+kfmvSgiVvB4= + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.2.tgz?cache=0&sync_timestamp=1630420570787&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-util-is%2Fdownload%2Fcore-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz?cache=0&sync_timestamp=1630420570787&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-util-is%2Fdownload%2Fcore-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.nlark.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz?cache=0&sync_timestamp=1629585969900&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha1-BA9yaAnFked6F8CjYmykW08Wixo= + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.nlark.com/create-ecdh/download/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4= + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= + dependencies: + 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.nlark.com/create-hmac/download/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= + dependencies: + 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" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY= + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= + dependencies: + 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-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.nlark.com/css-color-names/download/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz?cache=0&sync_timestamp=1630965563343&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-declaration-sorter%2Fdownload%2Fcss-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha1-wZiUD2OnbX42wecQGLABchBUyyI= + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^3.5.3: + version "3.6.0" + resolved "https://registry.nlark.com/css-loader/download/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU= + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc= + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/css-select/download/css-select-2.1.0.tgz?cache=0&sync_timestamp=1622994276976&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-select%2Fdownload%2Fcss-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8= + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.nlark.com/css-select/download/css-select-4.1.3.tgz?cache=0&sync_timestamp=1622994276976&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-select%2Fdownload%2Fcss-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha1-pwRA9wMX8maRGK10/xBeZYSccGc= + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.nlark.com/css-tree/download/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha1-mL69YsTB2flg7DQM+fdSLjBwmiI= + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.nlark.com/css-tree/download/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha1-60hw+2/XcHMn7JXC/yqwm16NuR0= + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.nlark.com/css-what/download/css-what-3.4.2.tgz?cache=0&sync_timestamp=1622227051808&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-what%2Fdownload%2Fcss-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ= + +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.nlark.com/css-what/download/css-what-5.0.1.tgz?cache=0&sync_timestamp=1622227051808&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-what%2Fdownload%2Fcss-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha1-PvqCATH0ZpqKwkCPnDLnx96fTK0= + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= + +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.nlark.com/cssnano-preset-default/download/cssnano-preset-default-4.0.8.tgz?cache=0&sync_timestamp=1629280549966&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssnano-preset-default%2Fdownload%2Fcssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha1-kgYisfwelaNOiDggPxOXpQTy0/8= + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI= + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.nlark.com/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M= + +cssnano@^4.0.0, cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.nlark.com/cssnano/download/cssnano-4.1.11.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssnano%2Fdownload%2Fcssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha1-x7X1uB2iacsf2YLLlgwSAJEMmpk= + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.npm.taobao.org/csso/download/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha1-6jpWE0bo3J9UbW/r7dUBh884lSk= + dependencies: + css-tree "^1.1.2" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/cyclist/download/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.nlark.com/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/de-indent/download/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.nlark.com/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= + dependencies: + ms "2.1.2" + +decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.nlark.com/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.nlark.com/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdeep-is%2Fdownload%2Fdeep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= + +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha1-EEmdhohEza1P7ghC34x/bwyVp1M= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.nlark.com/default-gateway/download/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs= + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +default-gateway@^5.0.5: + version "5.0.5" + resolved "https://registry.nlark.com/default-gateway/download/default-gateway-5.0.5.tgz#4fd6bd5d2855d39b34cc5a59505486e9aafc9b10" + integrity sha1-T9a9XShV05s0zFpZUFSG6ar8mxA= + dependencies: + execa "^3.3.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz?cache=0&sync_timestamp=1618847174317&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdefine-properties%2Fdownload%2Fdefine-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz?cache=0&sync_timestamp=1615984345486&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha1-no8RciLqRKMf86FWwEm5kFKp8LQ= + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.nlark.com/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/des.js/download/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.nlark.com/detect-node/download/detect-node-2.1.0.tgz?cache=0&sync_timestamp=1621146954463&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdetect-node%2Fdownload%2Fdetect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha1-yccHdaScPQO8LAbZpzvlUPl4+LE= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.nlark.com/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0, dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ= + dependencies: + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.nlark.com/dns-packet/download/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha1-40VQZYJKJQe6iGxVqJljuxB97G8= + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/doctrine/download/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= + dependencies: + esutils "^2.0.2" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha1-YgZDfTLO767HFhgDIwx6ILwbTZE= + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.nlark.com/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1627591557212&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= + +domelementtype@1: + version "1.3.1" + resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha1-6CXXIdGahrjCAaNSZOImxnjudV8= + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.nlark.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.nlark.com/dot-prop/download/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog= + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.nlark.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz?cache=0&sync_timestamp=1618847017659&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv-expand%2Fdownload%2Fdotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha1-P7rwIL/XlIhAcuomsel5HUWmKfA= + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.nlark.com/dotenv/download/dotenv-8.6.0.tgz?cache=0&sync_timestamp=1621627076012&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv%2Fdownload%2Fdotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha1-Bhr2ZNGff02PxuT/m1hM4jety4s= + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.nlark.com/duplexer/download/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.nlark.com/duplexify/download/duplexify-3.7.1.tgz?cache=0&sync_timestamp=1626860645267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fduplexify%2Fdownload%2Fduplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk= + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-affix@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/easy-affix/-/easy-affix-1.0.8.tgz#60d0f2d215bae1dcb63799eed9b0fda14857db1a" + integrity sha512-FiazZoWULGKViVYI+oJBqArrBM3z1uqODqARvWC+xGX2OKAFo+fx3nUtUGNbcwqUBRzaZ7tJai85a0s6h0q+cQ== + dependencies: + throttle-debounce "^2.1.0" + +easy-stack@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/easy-stack/download/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066" + integrity sha1-iv5CZGJpiMq7EfPHBMzQyDVBEGY= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.nlark.com/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.nlark.com/ejs/download/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha1-SGYSh1c9zFPjZsehrlLDoSDuybo= + +electron-to-chromium@^1.3.830: + version "1.3.836" + resolved "https://registry.nlark.com/electron-to-chromium/download/electron-to-chromium-1.3.836.tgz#823cb9c98f28c64c673920f1c90ea3826596eaf9" + integrity sha1-gjy5yY8oxkxnOSDxyQ6jgmWW6vk= + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.nlark.com/elliptic/download/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s= + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.nlark.com/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.nlark.com/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/emojis-list/download/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha1-VXBmIEatKeLpFucariYKvf9Pang= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.nlark.com/end-of-stream/download/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz?cache=0&sync_timestamp=1620663202047&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.nlark.com/entities/download/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.npm.taobao.org/errno/download/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8= + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.nlark.com/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.2: + version "2.0.6" + resolved "https://registry.nlark.com/error-stack-parser/download/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha1-WpmnB716TFinl5AtSNgoA+3mqtg= + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.6" + resolved "https://registry.nlark.com/es-abstract/download/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" + integrity sha1-LETj6npiVQORZNJlWXd6bZeMtFY= + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-string "^1.0.7" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-loader@^2.2.1: + version "2.2.1" + resolved "https://registry.nlark.com/eslint-loader/download/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337" + integrity sha1-KLnBLaVAV68IReKmEScBova/gzc= + dependencies: + loader-fs-cache "^1.0.0" + loader-utils "^1.0.2" + object-assign "^4.0.1" + object-hash "^1.1.4" + rimraf "^2.6.1" + +eslint-plugin-vue@^6.2.2: + version "6.2.2" + resolved "https://registry.nlark.com/eslint-plugin-vue/download/eslint-plugin-vue-6.2.2.tgz?cache=0&sync_timestamp=1630038057187&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" + integrity sha1-J/7NmjokeJsPER7N1UCp5WGY4P4= + dependencies: + natural-compare "^1.4.0" + semver "^5.6.0" + vue-eslint-parser "^7.0.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.nlark.com/eslint-scope/download/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha1-ygODMxD2iJoyZHgaqC5j65z+eEg= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.nlark.com/eslint-utils/download/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8= + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha1-MOvR73wv3/AcOk8VEESvJfqwUj4= + +eslint@^6.7.2: + version "6.8.0" + resolved "https://registry.nlark.com/eslint/download/eslint-6.8.0.tgz?cache=0&sync_timestamp=1631312108443&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint%2Fdownload%2Feslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s= + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2, espree@^6.2.1: + version "6.2.1" + resolved "https://registry.nlark.com/espree/download/espree-6.2.1.tgz?cache=0&sync_timestamp=1631307745569&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fespree%2Fdownload%2Fespree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o= + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.nlark.com/esquery/download/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.nlark.com/esrecurse/download/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.nlark.com/estraverse/download/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.nlark.com/estraverse/download/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA= + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.nlark.com/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity sha1-9o2Ba8KfHsAsU53FjI3UDOcss24= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.nlark.com/events/download/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.npm.taobao.org/eventsource/download/eventsource-1.1.0.tgz?cache=0&sync_timestamp=1616041716084&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventsource%2Fdownload%2Feventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha1-AOjKfJIQnpSw3fMtrGd9hBAoz68= + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.nlark.com/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.nlark.com/execa/download/execa-0.8.0.tgz?cache=0&sync_timestamp=1622825396605&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexeca%2Fdownload%2Fexeca-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1622825396605&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= + dependencies: + 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" + +execa@^3.3.0: + version "3.4.0" + resolved "https://registry.nlark.com/execa/download/execa-3.4.0.tgz?cache=0&sync_timestamp=1622825396605&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexeca%2Fdownload%2Fexeca-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha1-wI7UVQ72XYWPrCaf/IVyRG8364k= + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + 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" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.nlark.com/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1618847120573&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.nlark.com/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.nlark.com/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.nlark.com/external-editor/download/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.nlark.com/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.nlark.com/fast-glob/download/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha1-aVOFfDr6R1//ku5gFdUtpwpM050= + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.nlark.com/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.nlark.com/faye-websocket/download/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo= + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4= + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.nlark.com/figures/download/figures-3.2.0.tgz?cache=0&sync_timestamp=1625254307578&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffigures%2Fdownload%2Ffigures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w= + dependencies: + flat-cache "^2.0.1" + +file-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.nlark.com/file-loader/download/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8= + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.nlark.com/filesize/download/filesize-3.6.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffilesize%2Fdownload%2Ffilesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc= + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.nlark.com/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-0.1.1.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc= + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks= + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.nlark.com/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1629976988340&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1629976988340&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.nlark.com/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1629976988340&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/flat-cache/download/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA= + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.nlark.com/flatted/download/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha1-RXWyHivO50NKqb5mL0t7X5wrUTg= + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.nlark.com/flush-write-stream/download/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug= + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0: + version "1.14.3" + resolved "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e" + integrity sha1-atp4EY2NJMruWVWVrM3ArGq9Ai4= + +follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.nlark.com/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.nlark.com/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.nlark.com/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU= + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.nlark.com/gauge/download/gauge-2.7.4.tgz?cache=0&sync_timestamp=1627307694276&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgauge%2Fdownload%2Fgauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + 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" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.nlark.com/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko= + dependencies: + globule "^1.0.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.nlark.com/gensync/download/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.nlark.com/get-stream/download/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha1-wbJVV189wh1Zv8ec09K0axw6VLU= + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.nlark.com/get-stream/download/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha1-SWaheV7lrOZecGxLe+txJX1uItM= + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha1-f9uByQAQH71WTdXxowr1qtweWNY= + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.nlark.com/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.nlark.com/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1626760200164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1626760200164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.7" + resolved "https://registry.nlark.com/glob/download/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha1-Oxk+kjPwHULQs/eClLvutBj5SpA= + dependencies: + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.nlark.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1628810148451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.nlark.com/globals/download/globals-12.4.0.tgz?cache=0&sync_timestamp=1628810148451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg= + dependencies: + type-fest "^0.8.1" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.nlark.com/globby/download/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.nlark.com/globby/download/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.nlark.com/globby/download/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha1-/QKacGxwPSm90XD0tts6P3p8tj0= + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globule@^1.0.0: + version "1.3.3" + resolved "https://registry.nlark.com/globule/download/globule-1.3.3.tgz?cache=0&sync_timestamp=1629247263605&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobule%2Fdownload%2Fglobule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2" + integrity sha1-gRkZ7qwatzROkF8uO+gKE0R5c8I= + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.8" + resolved "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.8.tgz?cache=0&sync_timestamp=1628194078324&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo= + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ= + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.nlark.com/har-validator/download/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/has-bigints/download/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628196402801&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.nlark.com/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.nlark.com/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.nlark.com/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.nlark.com/hash-base/download/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM= + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo= + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x, he@^1.1.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8= + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/hex-color-regex/download/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4= + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.nlark.com/highlight.js/download/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE= + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.nlark.com/hoopy/download/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha1-YJIH1mEQADOpqUAq096mdzgcGx0= + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/hsl-regex/download/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.nlark.com/html-entities/download/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha1-z70bAdKvr5rcobEK59/6uYxx0tw= + +html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.nlark.com/html-minifier/download/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw= + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha1-e15vfmZen7QfMAB+2eDUHpf7IUA= + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.nlark.com/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.nlark.com/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1631386311915&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.nlark.com/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.nlark.com/http-parser-js/download/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha1-GDx9xKoUeRUDBkmMIQza+WCApDo= + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity sha1-Q3ANbZ7st0Gb8IahKND3IF2etmU= + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.nlark.com/http-proxy/download/http-proxy-1.18.1.tgz?cache=0&sync_timestamp=1618847045732&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhttp-proxy%2Fdownload%2Fhttp-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.nlark.com/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1624364695595&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha1-xbHNFPUK6uCatsWf5jujOV/k36M= + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc= + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.nlark.com/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.nlark.com/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.nlark.com/ignore/download/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM= + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.nlark.com/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/import-cwd/download/import-cwd-2.1.0.tgz?cache=0&sync_timestamp=1618846826220&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fimport-cwd%2Fdownload%2Fimport-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.3.0" + resolved "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha1-NxYsJfy566oublPVtNiM4X2eDCs= + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/import-from/download/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/import-local/download/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha1-VQcL44pZk88Y72236WH1vuXFoJ0= + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.nlark.com/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/in-publish/download/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha1-lIsaU1yAMFYc6lIvc/ePS+NX4Aw= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz?cache=0&sync_timestamp=1618679561483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Findent-string%2Fdownload%2Findent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha1-xM78qo5RBRwqQLos6KPScpWvlGc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.nlark.com/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/inherits/download/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inquirer@^7.0.0, inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.nlark.com/inquirer/download/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.nlark.com/internal-ip/download/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc= + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.nlark.com/internal-slot/download/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha1-c0fjB97uovqsKsYgXUvH00ln9Zw= + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/ip-regex/download/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.nlark.com/ip/download/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628201919104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha1-RXSirlb3qyBolvtDHq7tBm/fjwM= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM= + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-boolean-object%2Fdownload%2Fis-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.nlark.com/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-callable%2Fdownload%2Fis-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU= + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz?cache=0&sync_timestamp=1615984407284&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-ci%2Fdownload%2Fis-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= + dependencies: + ci-info "^1.5.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.nlark.com/is-color-stop/download/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.2.0: + version "2.6.0" + resolved "https://registry.nlark.com/is-core-module/download/is-core-module-2.6.0.tgz?cache=0&sync_timestamp=1629224656971&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + integrity sha1-11U7JSb+Wbkro+QMjfdX7Ipwnhk= + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8= + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz?cache=0&sync_timestamp=1630451108035&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-docker%2Fdownload%2Fis-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.nlark.com/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.nlark.com/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.nlark.com/is-finite/download/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/is-negative-zero/download/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ= + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha1-anqvg4x/BoalC0VT9+VKlklOifA= + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.nlark.com/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz?cache=0&sync_timestamp=1618600919478&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-obj%2Fdownload%2Fis-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz?cache=0&sync_timestamp=1620047156679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha1-v+Lcomxp85cmWkAJljYCk1oFOss= + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/is-path-inside/download/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha1-fJgQWH1lmkDSe8201WFuqwWUlLI= + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221853554&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg= + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.nlark.com/is-resolvable/download/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/is-stream/download/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha1-+sHj1TuXrVqdCunO8jifWBClwHc= + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0= + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha1-ptrJO2NbBjymhyI23oiRClevE5w= + dependencies: + has-symbols "^1.0.2" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/is-windows/download/is-windows-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-windows%2Fdownload%2Fis-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.nlark.com/is-wsl/download/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/isexe/download/isexe-2.0.0.tgz?cache=0&sync_timestamp=1618847054312&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fisexe%2Fdownload%2Fisexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.nlark.com/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk= + +js-base64@^2.1.8: + version "2.6.4" + resolved "https://registry.nlark.com/js-base64/download/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ= + +js-message@1.0.7: + version "1.0.7" + resolved "https://registry.npm.taobao.org/js-message/download/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47" + integrity sha1-+93QU8ekcCGHG7iyyVOXzBfCDkc= + +js-queue@2.0.2: + version "2.0.2" + resolved "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.2.tgz#0be590338f903b36c73d33c31883a821412cd482" + integrity sha1-C+WQM4+QOzbHPTPDGIOoIUEs1II= + dependencies: + easy-stack "^1.0.1" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.nlark.com/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.nlark.com/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.nlark.com/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.nlark.com/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E= + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4= + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM= + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/killable/download/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.nlark.com/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.nlark.com/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.nlark.com/kind-of/download/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= + +launch-editor-middleware@^2.2.1: + version "2.2.1" + resolved "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" + integrity sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc= + dependencies: + launch-editor "^2.2.1" + +launch-editor@^2.2.1: + version "2.2.1" + resolved "https://registry.nlark.com/launch-editor/download/launch-editor-2.2.1.tgz?cache=0&sync_timestamp=1618846949344&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flaunch-editor%2Fdownload%2Flaunch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca" + integrity sha1-hxtaPuOdZoD8wm03kwtu7aidsMo= + dependencies: + chalk "^2.3.0" + shell-quote "^1.6.1" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.nlark.com/lines-and-columns/download/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.nlark.com/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-fs-cache@^1.0.0: + version "1.0.3" + resolved "https://registry.nlark.com/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k= + dependencies: + find-cache-dir "^0.1.1" + mkdirp "^0.5.1" + +loader-runner@^2.3.1, loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.nlark.com/loader-utils/download/loader-utils-0.2.17.tgz?cache=0&sync_timestamp=1618846812625&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floader-utils%2Fdownload%2Floader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.nlark.com/loader-utils/download/loader-utils-1.4.0.tgz?cache=0&sync_timestamp=1618846812625&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floader-utils%2Fdownload%2Floader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha1-xXm140yzSxp07cbB+za/o3HVphM= + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/loader-utils/download/loader-utils-2.0.0.tgz?cache=0&sync_timestamp=1618846812625&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floader-utils%2Fdownload%2Floader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha1-5MrOW4FtQloWa18JfhDNErNgZLA= + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaultsdeep@^4.6.1: + version "4.6.1" + resolved "https://registry.nlark.com/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY= + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.nlark.com/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.nlark.com/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.nlark.com/lodash.memoize/download/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.transform@^4.6.0: + version "4.6.0" + resolved "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" + integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.nlark.com/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@~4.17.10: + version "4.17.21" + resolved "https://registry.nlark.com/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.nlark.com/log-symbols/download/log-symbols-2.2.0.tgz?cache=0&sync_timestamp=1618847128438&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flog-symbols%2Fdownload%2Flog-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo= + dependencies: + chalk "^2.0.1" + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.nlark.com/loglevel/download/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc= + +lottie-vuejs@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/lottie-vuejs/-/lottie-vuejs-0.4.0.tgz#9a28c2bd0ddc402a4354ce83a60cf19a8fb672ad" + integrity sha512-0gmUq/RGbu6EptrUEBKlr+o4YV1vuWs6wcjNcnPODz9Rrrgn664xY/QaGzJHCL6GU/Oab2oJ7MDxs4HqCY9ryA== + dependencies: + axios "^0.19.0" + lottie-web "^5.1.9" + +lottie-web@^5.1.9: + version "5.7.13" + resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.7.13.tgz#c4087e4742c485fc2c4034adad65d1f3fcd438b0" + integrity sha512-6iy93BGPkdk39b0jRgJ8Zosxi8QqcMP5XcDvg1f0XAvEkke6EMCl6BUO4Lu78dpgvfG2tzut4QJ+0vCrfbrldQ== + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.nlark.com/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^4.0.1, lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.nlark.com/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.nlark.com/lru-cache/download/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= + dependencies: + semver "^6.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.nlark.com/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.nlark.com/mdn-data/download/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA= + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.nlark.com/mdn-data/download/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.nlark.com/memory-fs/download/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.nlark.com/memory-fs/download/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.nlark.com/meow/download/meow-3.7.0.tgz?cache=0&sync_timestamp=1627560980063&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmeow%2Fdownload%2Fmeow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/merge-source-map/download/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha1-L93n5gIJOfcJBqaPLXrmheTIxkY= + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/merge-stream/download/merge-stream-2.0.0.tgz?cache=0&sync_timestamp=1622025345923&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmerge-stream%2Fdownload%2Fmerge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= + +merge2@^1.2.3: + version "1.4.1" + resolved "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.nlark.com/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + 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" + +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.nlark.com/micromatch/download/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k= + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.nlark.com/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": + version "1.49.0" + resolved "https://registry.nlark.com/mime-db/download/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha1-89/eYMmenPO8lwHWh3ePU3ABy+0= + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.nlark.com/mime-types/download/mime-types-2.1.32.tgz?cache=0&sync_timestamp=1627407819001&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha1-HQDonn3n/gIAjbYQAdngKFJnD9U= + dependencies: + mime-db "1.49.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1615984369368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= + +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.npm.taobao.org/mime/download/mime-2.5.2.tgz?cache=0&sync_timestamp=1615984369368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha1-bj3GzCuVEGQ4MOXxnVy3U9pe6r4= + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= + +mini-css-extract-plugin@^0.9.0: + version "0.9.0" + resolved "https://registry.nlark.com/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1631375762466&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54= + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.nlark.com/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1618847017774&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= + +minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha1-fUL/HzljVILhX5zbUxhN7r1YFf0= + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/mississippi/download/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha1-6goykfl+C16HdrNj1fChLZTGcCI= + dependencies: + 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@^1.2.0: + version "1.3.2" + resolved "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= + dependencies: + minimist "^1.2.5" + +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/move-concurrently/download/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + 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@2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.nlark.com/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.nlark.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.nlark.com/ms/download/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.nlark.com/multicast-dns/download/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha1-oOx72QVcQoL3kMPIL04o2zsxsik= + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.nlark.com/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI= + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.12.1, nan@^2.13.2: + version "2.15.0" + resolved "https://registry.nlark.com/nan/download/nan-2.15.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnan%2Fdownload%2Fnan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.nlark.com/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + 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@^1.4.0: + version "1.4.0" + resolved "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.nlark.com/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.nlark.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.nlark.com/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.nlark.com/no-case/download/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw= + dependencies: + lower-case "^1.1.1" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.nlark.com/node-gyp/download/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw= + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-ipc@^9.1.1: + version "9.2.1" + resolved "https://registry.nlark.com/node-ipc/download/node-ipc-9.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-ipc%2Fdownload%2Fnode-ipc-9.2.1.tgz#b32f66115f9d6ce841dc4ec2009d6a733f98bb6b" + integrity sha1-sy9mEV+dbOhB3E7CAJ1qcz+Yu2s= + dependencies: + event-pubsub "4.3.0" + js-message "1.0.7" + js-queue "2.0.2" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.nlark.com/node-libs-browser/download/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU= + dependencies: + 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" + +node-releases@^1.1.75: + version "1.1.75" + resolved "https://registry.nlark.com/node-releases/download/node-releases-1.1.75.tgz?cache=0&sync_timestamp=1629280398871&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" + integrity sha1-bdjIdrmJehuOWgLeJq+nm7VOu/4= + +node-sass@^4.9.0: + version "4.14.1" + resolved "https://registry.nlark.com/node-sass/download/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha1-mch+wu+3BH7WOPtMnbfzpC4iF7U= + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.nlark.com/normalize-range/download/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.nlark.com/normalize-url/download/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.nlark.com/normalize-url/download/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha1-suHE3E98bVd0PfczpPWXjRhlBVk= + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha1-t+zR5e1T2o43pV4cImnguX7XSOo= + dependencies: + path-key "^3.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.nlark.com/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/nth-check/download/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/nth-check/download/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha1-G7T22scAcvwxPoyc0UF7UHTAoSU= + dependencies: + boolbase "^1.0.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.nlark.com/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.nlark.com/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1618847043548&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^1.1.4: + version "1.3.1" + resolved "https://registry.nlark.com/object-hash/download/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz?cache=0&sync_timestamp=1626120241132&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha1-nc6xRs7dQUig2eUauI00z1CZIrE= + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha1-ud7qpfx/GEag+uzc7sE45XePU6w= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/object-keys/download/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.nlark.com/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha1-G9Y66s8NXS0vMbXjk7A6fGAaI/c= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.4" + resolved "https://registry.nlark.com/object.values/download/object.values-1.1.4.tgz?cache=0&sync_timestamp=1622070620040&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha1-DSc3YoM+gWtpOmN9MAc+cFFTWzA= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.nlark.com/obuf/download/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.nlark.com/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1617889724435&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1617889724435&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= + dependencies: + mimic-fn "^2.1.0" + +open@^6.3.0: + version "6.4.0" + resolved "https://registry.nlark.com/open/download/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk= + dependencies: + is-wsl "^1.1.0" + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha1-XTfh81B3udysQwE3InGv3rKhNZg= + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.nlark.com/opn/download/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.nlark.com/optionator/download/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= + dependencies: + 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" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.nlark.com/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1629755504079&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fora%2Fdownload%2Fora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha1-vwdSSRBZo+8+1MhQl1Md6f280xg= + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8= + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0: + version "0.1.5" + resolved "https://registry.nlark.com/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-finally%2Fdownload%2Fp-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-finally%2Fdownload%2Fp-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE= + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: + version "2.3.0" + resolved "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1628812721654&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/p-map/download/p-map-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-map%2Fdownload%2Fp-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha1-MQko/u+cnsxltosXaTAYpmXOoXU= + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.nlark.com/p-retry/download/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha1-MWtMiJPiyNwc+okfQGxLQivr8yg= + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.nlark.com/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1627560213493&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpako%2Fdownload%2Fpako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.nlark.com/parallel-transform/download/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw= + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.nlark.com/param-case/download/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.nlark.com/parse-asn1/download/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ= + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.nlark.com/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.nlark.com/parse-json/download/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= + dependencies: + "@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-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.nlark.com/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha1-LN+a2CMyEUA3DU2/XT6Sx8jdxuY= + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.nlark.com/parse5/download/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg= + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.nlark.com/parse5/download/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz?cache=0&sync_timestamp=1615984376007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparseurl%2Fdownload%2Fparseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.nlark.com/path-browserify/download/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha1-5sTd1+06onxoogzE5Q4aTug7vEo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.nlark.com/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.nlark.com/path-exists/download/path-exists-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1618846809278&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.nlark.com/pbkdf2/download/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU= + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648246651&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/pinkie-promise/download/pinkie-promise-2.0.1.tgz?cache=0&sync_timestamp=1618847023792&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpinkie-promise%2Fdownload%2Fpinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.nlark.com/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM= + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= + dependencies: + find-up "^4.0.0" + +pnp-webpack-plugin@^1.6.4: + version "1.7.0" + resolved "https://registry.nlark.com/pnp-webpack-plugin/download/pnp-webpack-plugin-1.7.0.tgz?cache=0&sync_timestamp=1626888209947&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpnp-webpack-plugin%2Fdownload%2Fpnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9" + integrity sha1-ZXQThPbYBW824iVajWf/wghm9ck= + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.nlark.com/portfinder/download/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.nlark.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.nlark.com/postcss-calc/download/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4= + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.nlark.com/postcss-colormin/download/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz?cache=0&sync_timestamp=1621449733448&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-convert-values%2Fdownload%2Fpostcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz?cache=0&sync_timestamp=1621449558287&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-discard-comments%2Fdownload%2Fpostcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz?cache=0&sync_timestamp=1621449558296&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-discard-duplicates%2Fdownload%2Fpostcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha1-P+EzzTyCKC5VD8myORdqkge3hOs= + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz?cache=0&sync_timestamp=1621449733074&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-discard-empty%2Fdownload%2Fpostcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha1-yMlR6fc+2UKAGUWERKAq2Qu592U= + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz?cache=0&sync_timestamp=1621449732464&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-discard-overridden%2Fdownload%2Fpostcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha1-ZSrvipZybwKfXj4AFG7npOdV/1c= + dependencies: + postcss "^7.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.nlark.com/postcss-load-config/download/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha1-xepQTyxK7zPHNZo03jVzdyrXUCo= + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/postcss-loader/download/postcss-loader-3.0.0.tgz?cache=0&sync_timestamp=1625143020485&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-loader%2Fdownload%2Fpostcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0= + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.nlark.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.nlark.com/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz?cache=0&sync_timestamp=1622234641993&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-merge-rules%2Fdownload%2Fpostcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha1-NivqT/Wh+Y5AdacTxsslrv75plA= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz?cache=0&sync_timestamp=1621449734134&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-minify-font-values%2Fdownload%2Fpostcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz?cache=0&sync_timestamp=1629280548352&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-minify-gradients%2Fdownload%2Fpostcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz?cache=0&sync_timestamp=1621449735393&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-minify-params%2Fdownload%2Fpostcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz?cache=0&sync_timestamp=1621449558355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-minify-selectors%2Fdownload%2Fpostcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha1-gYcZoa4doyX5gyRGsBE27rSTzX4= + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.nlark.com/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A= + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha1-OFyuATzHdD9afXYC0Qc6iequYu4= + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA= + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz?cache=0&sync_timestamp=1621449558308&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-charset%2Fdownload%2Fpostcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha1-izWt067oOhNrBHHg1ZvlilAoXdQ= + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz?cache=0&sync_timestamp=1621449652268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-display-values%2Fdownload%2Fpostcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz?cache=0&sync_timestamp=1621449651580&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-repeat-style%2Fdownload%2Fpostcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz?cache=0&sync_timestamp=1621449646930&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-string%2Fdownload%2Fpostcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha1-jgCcoqOUnNr4rSPmtquZy159KNk= + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz?cache=0&sync_timestamp=1621449825612&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-unicode%2Fdownload%2Fpostcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz?cache=0&sync_timestamp=1623330505231&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-url%2Fdownload%2Fpostcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE= + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz?cache=0&sync_timestamp=1621449646853&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-normalize-whitespace%2Fdownload%2Fpostcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.nlark.com/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz?cache=0&sync_timestamp=1623330460500&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.nlark.com/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz?cache=0&sync_timestamp=1621449728984&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-reduce-initial%2Fdownload%2Fpostcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.nlark.com/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz?cache=0&sync_timestamp=1621449730895&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-reduce-transforms%2Fdownload%2Fpostcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha1-F++kBerMbge+NBSlyi0QdGgdTik= + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA= + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.6" + resolved "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752939806&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo= + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.nlark.com/postcss-svgo/download/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4= + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.nlark.com/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz?cache=0&sync_timestamp=1621449730035&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-unique-selectors%2Fdownload%2Fpostcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w= + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.nlark.com/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha1-n/giVH4okyE88cMO+lGsX9G6goE= + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.nlark.com/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha1-RD9qIM7WSBor2k+oUypuVdeJoss= + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.36" + resolved "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz?cache=0&sync_timestamp=1626882960231&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss%2Fdownload%2Fpostcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s= + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.nlark.com/prepend-http/download/prepend-http-1.0.4.tgz?cache=0&sync_timestamp=1628547439455&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprepend-http%2Fdownload%2Fprepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier@^1.18.2: + version "1.19.1" + resolved "https://registry.nlark.com/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1631179311919&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha1-99f1/4qc2HKnvkyhQglZVqYHl8s= + +pretty-error@^2.0.2: + version "2.1.2" + resolved "https://registry.nlark.com/pretty-error/download/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y= + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.nlark.com/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha1-foz42PW48jnBvGi+tOt4Vn1XLvg= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU= + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= + dependencies: + 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" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.nlark.com/punycode/download/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.nlark.com/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.nlark.com/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.nlark.com/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= + +qs@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.nlark.com/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.nlark.com/query-string/download/query-string-4.3.4.tgz?cache=0&sync_timestamp=1624297034221&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fquery-string%2Fdownload%2Fquery-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.nlark.com/querystring-es3/download/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.nlark.com/querystring/download/querystring-0.2.0.tgz?cache=0&sync_timestamp=1626179435543&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fquerystring%2Fdownload%2Fquerystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo= + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.nlark.com/randomfill/download/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.nlark.com/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI= + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.nlark.com/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^5.1.1: + version "5.2.0" + resolved "https://registry.nlark.com/read-pkg/download/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.nlark.com/readable-stream/download/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= + dependencies: + 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" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.nlark.com/readable-stream/download/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.nlark.com/readdirp/download/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.nlark.com/readdirp/download/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= + dependencies: + picomatch "^2.2.1" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.nlark.com/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha1-5d5xEdZV57pgwFfb6f83yH5lzew= + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.nlark.com/regenerate/download/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I= + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1627057502723&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ= + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.nlark.com/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/regexpp/download/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha1-jRnTHPYySCtYkEn4KB+T28uk0H8= + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.nlark.com/regexpu-core/download/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha1-LepamgcjMpj78NuR+pq8TG4PitY= + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.nlark.com/regjsgen/download/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM= + +regjsparser@^0.6.4: + version "0.6.9" + resolved "https://registry.nlark.com/regjsparser/download/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha1-tInu98mizkNydicBFCnPgzpxg+Y= + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.nlark.com/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.nlark.com/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.nlark.com/renderkid/download/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha1-Rk8namvc7mBvShWZP5sp/HTKhgk= + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.nlark.com/repeat-element/download/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.87.0, request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.nlark.com/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= + dependencies: + 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" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.nlark.com/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/resolve-from/download/resolve-from-3.0.0.tgz?cache=0&sync_timestamp=1622605305717&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fresolve-from%2Fdownload%2Fresolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/resolve-from/download/resolve-from-4.0.0.tgz?cache=0&sync_timestamp=1622605305717&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fresolve-from%2Fdownload%2Fresolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.nlark.com/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2: + version "1.20.0" + resolved "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/restore-cursor/download/restore-cursor-2.0.0.tgz?cache=0&sync_timestamp=1629746923086&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/restore-cursor/download/restore-cursor-3.1.0.tgz?cache=0&sync_timestamp=1629746923086&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.nlark.com/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.nlark.com/retry/download/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= + dependencies: + glob "^7.1.3" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.nlark.com/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.nlark.com/run-async/download/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.nlark.com/rxjs/download/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk= + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.nlark.com/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.nlark.com/sass-graph/download/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha1-qYHIdEa4MZ2W3OBnHkh4eb0kwug= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + +sass-loader@^7.0.1: + version "7.3.1" + resolved "https://registry.nlark.com/sass-loader/download/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f" + integrity sha1-pb9ooEvOocE/+ELXRxUPerfQ0j8= + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.0.1" + neo-async "^2.5.0" + pify "^4.0.1" + semver "^6.3.0" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694740261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz?cache=0&sync_timestamp=1626694740261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.nlark.com/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.nlark.com/selfsigned/download/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k= + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.nlark.com/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.nlark.com/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha1-XzyjV2HkfgWyBsba/yz4FPAxa44= + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.nlark.com/semver/download/semver-5.3.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://registry.nlark.com/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao= + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.nlark.com/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.nlark.com/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1631437838608&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.nlark.com/shallow-clone/download/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.nlark.com/shell-quote/download/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I= + +shvl@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/shvl/-/shvl-2.0.3.tgz#eb4bd37644f5684bba1fc52c3010c96fb5e6afd1" + integrity sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/side-channel/download/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha1-785cj9wQTudRslxY1CkAEfpeos8= + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.nlark.com/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz?cache=0&sync_timestamp=1618384508676&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslash%2Fdownload%2Fslash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz?cache=0&sync_timestamp=1618384508676&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslash%2Fdownload%2Fslash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.nlark.com/slice-ansi/download/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY= + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.nlark.com/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz?cache=0&sync_timestamp=1617971785350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsnapdragon%2Fdownload%2Fsnapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + 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" + +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.nlark.com/sockjs-client/download/sockjs-client-1.5.2.tgz?cache=0&sync_timestamp=1629825213973&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity sha1-S8SMLanOR2nxnccjOWtQ9cEjMKM= + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.nlark.com/sockjs/download/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc= + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.nlark.com/sort-keys/download/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.nlark.com/source-list-map/download/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.nlark.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= + dependencies: + 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@~0.5.12: + version "0.5.20" + resolved "https://registry.nlark.com/source-map-support/download/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha1-EhZgifj15ejFaSazd2Mzkt0stsk= + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.nlark.com/source-map-url/download/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.nlark.com/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.nlark.com/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.nlark.com/source-map/download/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M= + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.nlark.com/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.nlark.com/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha1-DZvszN5wA9bGWNSH3UijLwvzAUs= + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&sync_timestamp=1618847174560&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= + dependencies: + 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@^6.0.1: + version "6.0.2" + resolved "https://registry.nlark.com/ssri/download/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha1-FXk5E08gRk5zAd26PpD/qPdyisU= + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha1-Y45OQ54v+9LNKJd21cpFfE9Roq8= + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88= + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha1-UkKUktY8YuuYmATBFVLj0i53kwM= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4= + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha1-1wiCgVWasneEJCebCHfaPDktWj0= + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.nlark.com/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.nlark.com/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.nlark.com/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.nlark.com/string-width/download/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU= + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.nlark.com/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.nlark.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1631350330859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1631350330859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.nlark.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1631350330859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.nlark.com/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1631350330859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz?cache=0&sync_timestamp=1620046435959&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-final-newline%2Fdownload%2Fstrip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/strip-indent/download/strip-indent-1.0.1.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/strip-indent/download/strip-indent-2.0.0.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.nlark.com/stylehacks/download/stylehacks-4.0.3.tgz?cache=0&sync_timestamp=1621449652268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstylehacks%2Fdownload%2Fstylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU= + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= + dependencies: + has-flag "^4.0.0" + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.nlark.com/svgo/download/svgo-1.3.2.tgz?cache=0&sync_timestamp=1630142300400&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsvgo%2Fdownload%2Fsvgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc= + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.nlark.com/table/download/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha1-EpLRlQDOP4YFOwXw6Ofko7shB54= + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.nlark.com/tapable/download/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha1-ofzMBrWNth/XpF2i2kT186Pme6I= + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.nlark.com/tar/download/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha1-DKiEhWLHKZuLRG/2pNYM27I+3EA= + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4: + version "1.4.5" + resolved "https://registry.nlark.com/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha1-oheu+uozDnNP+sthIOwfoxLWBAs= + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.nlark.com/terser/download/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc= + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz?cache=0&sync_timestamp=1618847142316&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftext-table%2Fdownload%2Ftext-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.nlark.com/thenify-all/download/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.nlark.com/thenify/download/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8= + dependencies: + any-promise "^1.0.0" + +thread-loader@^2.1.3: + version "2.1.3" + resolved "https://registry.nlark.com/thread-loader/download/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda" + integrity sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo= + dependencies: + loader-runner "^2.3.1" + loader-utils "^1.1.0" + neo-async "^2.6.0" + +throttle-debounce@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.nlark.com/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.nlark.com/thunky/download/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.nlark.com/timers-browserify/download/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4= + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1615984440866&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418893613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.nlark.com/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.nlark.com/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.nlark.com/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.nlark.com/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/trim-newlines/download/trim-newlines-1.0.0.tgz?cache=0&sync_timestamp=1623341510447&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0= + dependencies: + glob "^7.1.2" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/tryer/download/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha1-8shUBoALmw90yfdGW4HqrSQSUvg= + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI= + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha1-zy04vcNKE0vK8QkcQfZhni9nLQA= + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.nlark.com/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.nlark.com/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.nlark.com/type-fest/download/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.nlark.com/type-fest/download/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha1-jSojcNPfiG61yQraHFv2GIrPg4s= + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.nlark.com/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.nlark.com/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.nlark.com/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1631026555366&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha1-mtlWPY6zrN+404WX0q8dgV9qdV8= + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE= + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha1-JhmADEyCWADv3YNDr33Zkzy+KBg= + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.nlark.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw= + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.nlark.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha1-DZH2AO7rMJaqlisdb8iIduZOpTE= + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.nlark.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.nlark.com/union-value/download/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/uniq/download/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/unique-filename/download/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.nlark.com/unique-slug/download/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha1-uqvOkQg/xk6UWw861hPiZPfNTmw= + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.nlark.com/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.nlark.com/unquote/download/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.nlark.com/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.nlark.com/upper-case/download/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.nlark.com/uri-js/download/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.nlark.com/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^2.2.0: + version "2.3.0" + resolved "https://registry.nlark.com/url-loader/download/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs= + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.nlark.com/url-parse/download/url-parse-1.5.3.tgz?cache=0&sync_timestamp=1627251248997&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl-parse%2Fdownload%2Furl-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha1-ccEwPTj7Zjmt4YPCmSyMwGht+GI= + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.nlark.com/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.nlark.com/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1615984387069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA= + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&sync_timestamp=1615984387069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha1-a693dLgO6w91INi4HQeYKlmruu4= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.nlark.com/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1622212984161&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.nlark.com/util/download/util-0.11.1.tgz?cache=0&sync_timestamp=1622212984161&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE= + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.nlark.com/utila/download/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.nlark.com/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1622213136953&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.nlark.com/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.nlark.com/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.nlark.com/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vee-validate@^3.4.12: + version "3.4.12" + resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-3.4.12.tgz#a268f34b712ac8a2f951544ff4cc14d9808212f0" + integrity sha512-mKYlbLmnKVj6zQ4pWBpOEQhc4rcee+wYy2IuMJEuH4Omx31g62YRVnjO3DMeWz7kAQN8z11UwHTY5s75gAGzRw== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.nlark.com/vendors/download/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha1-4rgApT56Kbk1BsPPQRANFsTErY4= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.nlark.com/vm-browserify/download/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha1-eGQcSIuObKkadfUR56OzKobl3aA= + +vue-class-component@^7.1.0: + version "7.2.6" + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.6.tgz#8471e037b8e4762f5a464686e19e5afc708502e4" + integrity sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w== + +vue-cli-plugin-buefy@~0.3.8: + version "0.3.8" + resolved "https://registry.nlark.com/vue-cli-plugin-buefy/download/vue-cli-plugin-buefy-0.3.8.tgz#62d1494a27387c93eb65e9b8dbc5ebe284190cf2" + integrity sha1-YtFJSic4fJPrZem428Xr4oQZDPI= + +vue-eslint-parser@^7.0.0: + version "7.11.0" + resolved "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.11.0.tgz?cache=0&sync_timestamp=1630882911486&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" + integrity sha1-IUtd6pYQB/z/su5luJEjB2KNDa8= + dependencies: + debug "^4.1.1" + eslint-scope "^5.1.1" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^6.3.0" + +vue-hot-reload-api@^2.3.0: + version "2.3.4" + resolved "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity sha1-UylVzB6yCKPZkLOp+acFdGV+CPI= + +"vue-loader-v16@npm:vue-loader@^16.1.0": + version "16.5.0" + resolved "https://registry.nlark.com/vue-loader/download/vue-loader-16.5.0.tgz?cache=0&sync_timestamp=1628666767864&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-16.5.0.tgz#09c4e0712466899e34b99a686524f19165fb2892" + integrity sha1-CcTgcSRmiZ40uZpoZSTxkWX7KJI= + dependencies: + chalk "^4.1.0" + hash-sum "^2.0.0" + loader-utils "^2.0.0" + +vue-loader@^15.9.2: + version "15.9.8" + resolved "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.8.tgz?cache=0&sync_timestamp=1628666767864&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.8.tgz#4b0f602afaf66a996be1e534fb9609dc4ab10e61" + integrity sha1-Sw9gKvr2aplr4eU0+5YJ3EqxDmE= + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-property-decorator@^8.0.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz#571a91cf8d2b507f537d79bf8275af3184572fff" + integrity sha512-O6OUN2OMsYTGPvgFtXeBU3jPnX5ffQ9V4I1WfxFQ6dqz6cOUbR3Usou7kgFpfiXDvV7dJQSFcJ5yUPgOtPPm1Q== + dependencies: + vue-class-component "^7.1.0" + +vue-router@^3.2.0: + version "3.5.2" + resolved "https://registry.nlark.com/vue-router/download/vue-router-3.5.2.tgz?cache=0&sync_timestamp=1628495505697&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.2.tgz#5f55e3f251970e36c3e8d88a7cd2d67a350ade5c" + integrity sha1-X1Xj8lGXDjbD6NiKfNLWejUK3lw= + +vue-slider-component@^3.2.14: + version "3.2.14" + resolved "https://registry.yarnpkg.com/vue-slider-component/-/vue-slider-component-3.2.14.tgz#21d61de647cf075e977126cf2b2951ee1cc98b27" + integrity sha512-h+1UJi4dtib6gt1GU/KUiHVGW9gqCNxCoqJK4iM9YgFeQu4AQu/wWg56RM5sOUhrbUA043+EqtvDfUtYARe+lQ== + dependencies: + core-js "^3.6.5" + vue-property-decorator "^8.0.0" + +vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: + version "4.1.3" + resolved "https://registry.nlark.com/vue-style-loader/download/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" + integrity sha1-bVWGOlH6dXqyTonZNxRlByqnvDU= + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.11: + version "2.6.14" + resolved "https://registry.nlark.com/vue-template-compiler/download/vue-template-compiler-2.6.14.tgz?cache=0&sync_timestamp=1623059640396&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-template-compiler%2Fdownload%2Fvue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" + integrity sha1-ovDn2YVnDULJye4NBE/tdpD092M= + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.nlark.com/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU= + +vue@^2.6.11: + version "2.6.14" + resolved "https://registry.nlark.com/vue/download/vue-2.6.14.tgz?cache=0&sync_timestamp=1631141991995&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue%2Fdownload%2Fvue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" + integrity sha1-5RqlJQJQ1Wmj+606ilpofWA24jU= + +vuex-persistedstate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-4.0.0.tgz#ed82f266ca98c869a2aad9cb9880c2f608c05f3a" + integrity sha512-jDs+awbV9YD2A2F6S5zgtYq1Bjd8v0YldOK6HPv1EJZzGMse0FtZTREfXvA7zlVfq9MpmSZJNmYQVylfpZ5znQ== + dependencies: + deepmerge "^4.2.2" + shvl "^2.0.3" + +vuex@^3.4.0: + version "3.6.2" + resolved "https://registry.nlark.com/vuex/download/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71" + integrity sha1-I2vAhqhww655lG8QfxbeWdWJXnE= + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.nlark.com/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc= + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.nlark.com/watchpack/download/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM= + dependencies: + chokidar "^3.4.1" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + watchpack-chokidar2 "^2.0.1" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.nlark.com/wcwidth/download/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webpack-bundle-analyzer@^3.8.0: + version "3.9.0" + resolved "https://registry.nlark.com/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.9.0.tgz?cache=0&sync_timestamp=1621259099265&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack-bundle-analyzer%2Fdownload%2Fwebpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity sha1-9vlNsQj7V05BWtMT3kGicH0z7zw= + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.19" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-chain@^6.4.0: + version "6.5.1" + resolved "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206" + integrity sha1-TycoTLu2N+PI+970Pu9YjU2GEgY= + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^2.0.1" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.nlark.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU= + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.11.0: + version "3.11.2" + resolved "https://registry.nlark.com/webpack-dev-server/download/webpack-dev-server-3.11.2.tgz?cache=0&sync_timestamp=1631214053701&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack-dev-server%2Fdownload%2Fwebpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha1-aV687Xakkp8NXef9c/r+GF/jNwg= + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8= + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.nlark.com/webpack-merge/download/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha1-onxS6ng9E5iv0gh/VH17nS9DY00= + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.nlark.com/webpack-sources/download/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha1-7t2OwLko+/HL/plOItLYkPMwqTM= + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.0.0: + version "4.46.0" + resolved "https://registry.nlark.com/webpack/download/webpack-4.46.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack%2Fdownload%2Fwebpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI= + dependencies: + "@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.5.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" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.nlark.com/websocket-driver/download/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.nlark.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.nlark.com/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.nlark.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.nlark.com/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.nlark.com/worker-farm/download/worker-farm-1.7.0.tgz?cache=0&sync_timestamp=1618846953836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fworker-farm%2Fdownload%2Fworker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag= + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha1-6Tk7oHEC5skaOyIUePAlfNKFblM= + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM= + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.nlark.com/write/download/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM= + dependencies: + mkdirp "^0.5.1" + +ws@^6.0.0, ws@^6.2.1: + version "6.2.2" + resolved "https://registry.nlark.com/ws/download/ws-6.2.2.tgz?cache=0&sync_timestamp=1631130711705&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fws%2Fdownload%2Fws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha1-3Vzb1XqZeZFgl2UtePHMX66gwy4= + dependencies: + async-limiter "~1.0.0" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.nlark.com/y18n/download/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.nlark.com/yallist/download/yallist-2.1.2.tgz?cache=0&sync_timestamp=1622604530774&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.nlark.com/yallist/download/yallist-3.1.1.tgz?cache=0&sync_timestamp=1622604530774&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.nlark.com/yallist/download/yallist-4.0.0.tgz?cache=0&sync_timestamp=1622604530774&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyallist%2Fdownload%2Fyallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.nlark.com/yargs-parser/download/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg= + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.nlark.com/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1628889096518&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= + dependencies: + 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@^16.0.0: + version "16.2.0" + resolved "https://registry.nlark.com/yargs/download/yargs-16.2.0.tgz?cache=0&sync_timestamp=1628889096518&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs%2Fdownload%2Fyargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yorkie@^2.0.0: + version "2.0.0" + resolved "https://registry.nlark.com/yorkie/download/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" + integrity sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k= + dependencies: + execa "^0.8.0" + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" diff --git a/conf/conf.ini b/conf/conf.ini new file mode 100644 index 0000000..cae42af --- /dev/null +++ b/conf/conf.ini @@ -0,0 +1,49 @@ +[app] +PAGE_SIZE = 10 +RuntimeRootPath = runtime/ +LogSavePath = /casaOS/logs/server/ +LogSaveName = log +LogFileExt = log +; 必须的格式 +DateStrFormat = 20060102 +DateTimeFormat = 2006-01-02 15:04:05 +TimeFormat = 15:04:05 +DateFormat = 2006-01-02 + + +[server] +HttpPort = 8089 +RunMode = debug +;ServerApi = http://113.52.135.30:8090 +;ServerApi = https://casaos.zimaboard.com +;ServerApi = http://192.168.2.167:8090 +ServerApi = http://192.168.2.142:8090 + +[user] +UserName = admin +PWD = zimaboard +Email = aaa@222.ddd +Description = ddddddd +Token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImVyZXJlIiwicGFzc3dvcmQiOiJhZHNmZGYiLCJleHAiOjE2MjQwMDU0ODEsImlzcyI6Imdpbi1ibG9nIn0.JNsCccZuFCwlSMLJg62iOIB2xymk_k7xGa11xhZ07bc + +[zerotier] +UserName = ddddd +PWD = +Token = yBKYyavr2RdFAIVN7iTpzlsB1o6CqTgm + +[redis] +Host = 192.168.2.167:6379 +Password = +MaxIdle = 30 +MaxActive = 30 +IdleTimeout = 200 + +[system] +AutoUpdate = true +SearchSwitch = true +WidgetsSwitch = false +ShortcutsSwitch = true +SearchEngine = baidu +Background = http://baidu.com1 +BackgroundType = d + diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..9cac60e --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,2901 @@ +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// This file was generated by swaggo/swag + +package docs + +import ( + "bytes" + "encoding/json" + "strings" + + "github.com/alecthomas/template" + "github.com/swaggo/swag" +) + +var doc = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{.Description}}", + "title": "{{.Title}}", + "contact": { + "name": "lauren.pan", + "url": "https://www.zimaboard.com", + "email": "lauren.pan@icewhale.org" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/app/appinfo/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "应用详情", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/category": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取远程分类列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/check/{port}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "检查端口是否可用", + "parameters": [ + { + "type": "integer", + "description": "端口号", + "name": "port", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "端口类型 udp/tcp", + "name": "type", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/getport": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取一个可用端口", + "parameters": [ + { + "type": "string", + "description": "端口类型 udp/tcp", + "name": "type", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取容器详情", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/install/config": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取安装所需要的数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/install/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "安装app(该接口需要post json数据)", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "主端口", + "name": "port", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "tcp端口", + "name": "tcp", + "in": "formData" + }, + { + "type": "string", + "description": "udp端口", + "name": "udp", + "in": "formData" + }, + { + "type": "string", + "description": "环境变量", + "name": "env", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取远程列表", + "parameters": [ + { + "type": "integer", + "description": "页码", + "name": "index", + "in": "query" + }, + { + "type": "integer", + "description": "每页数量", + "name": "size", + "in": "query" + }, + { + "type": "integer", + "description": "分类id", + "name": "category_id", + "in": "query" + }, + { + "type": "string", + "description": "rank,new", + "name": "type", + "in": "query" + }, + { + "type": "string", + "description": "search key", + "name": "key", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/logs/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "查看容器日志", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/mylist": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "我的应用列表", + "parameters": [ + { + "type": "integer", + "description": "index", + "name": "index", + "in": "query" + }, + { + "type": "integer", + "description": "size", + "name": "size", + "in": "query" + }, + { + "type": "boolean", + "description": "是否是首页应用", + "name": "position", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/rely/{id}/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取依赖数据", + "parameters": [ + { + "type": "string", + "description": "rely id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/speed/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取安装进度", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/state/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取容器状态", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "type=1", + "name": "type", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + }, + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "修改app状态", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "是否停止 strat stop restart", + "name": "state", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/uninstall/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "卸载app", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/update/{id}/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取可更新数据", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/update/{id}/setting": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "更新设置", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "cpu权重", + "name": "shares", + "in": "formData" + }, + { + "type": "string", + "description": "内存大小MB", + "name": "mem", + "in": "formData" + }, + { + "type": "string", + "description": "重启策略", + "name": "restart", + "in": "formData" + }, + { + "type": "string", + "description": "应用名称", + "name": "label", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否放到首页", + "name": "position", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/delete/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "删除ddns", + "parameters": [ + { + "type": "integer", + "description": "ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/getlist": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取可以设置的ddns列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/ip": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取ip,仅做展示使用", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取已设置的列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/ping/{api_host}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "测试网址是否可以ping通", + "parameters": [ + { + "type": "integer", + "description": "api地址", + "name": "api_host", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/set": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "添加新的ddns(按给定模型返回内容)", + "parameters": [ + { + "type": "string", + "description": "类型", + "name": "type", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "host", + "name": "host", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/addpart": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "添加分区", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "需要分区容量大小(MB)", + "name": "size", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "磁盘符号", + "name": "num", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/delpart": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "删除分区", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda1", + "name": "path", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/format": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "磁盘详情", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda1", + "name": "path", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "磁盘详情", + "parameters": [ + { + "type": "string", + "description": "要获取的磁盘详情 例如/dev/sda", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取磁盘列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/lists": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取磁盘列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取支持的格式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/dirpath": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "获取目录列表", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/download": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "下载文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/mkdir": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "上传文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/read": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "读取文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/rename": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "重命名目录或文件", + "parameters": [ + { + "type": "string", + "description": "旧的路径", + "name": "oldpath", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "新路径", + "name": "newpath", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/notify/read/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notify" + ], + "summary": "标记notify已读", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/notify/ws": {}, + "/share/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "添加文件共享", + "parameters": [ + { + "type": "string", + "description": "要分享的文件路径", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "名称", + "name": "name", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "描述", + "name": "comment", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "是否只读", + "name": "read_only", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可写", + "name": "writeable", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可浏览", + "name": "browseable", + "in": "formData" + }, + { + "type": "string", + "description": "用户", + "name": "user", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/del/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "删除分享", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "分享详情", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "获取列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/update/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "更新分享详情", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "要分享的文件路径", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "名称", + "name": "name", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "描述", + "name": "comment", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "是否只读", + "name": "read_only", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可写", + "name": "writeable", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可浏览", + "name": "browseable", + "in": "formData" + }, + { + "type": "string", + "description": "用户", + "name": "user", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "添加shortcuts", + "parameters": [ + { + "type": "string", + "description": "title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "url", + "name": "url", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/del/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "删除shortcuts", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/edit": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "编辑shortcuts", + "parameters": [ + { + "type": "string", + "description": "title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "url", + "name": "url", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "获取短链列表", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/sys/chackversion": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "sys" + ], + "summary": "系统信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/task/completion/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "task" + ], + "summary": "标记task已完成", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/task/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "task" + ], + "summary": "获取task列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changhead": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改配置文件", + "parameters": [ + { + "type": "file", + "description": "用户头像", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changuserinfo": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改用户信息", + "parameters": [ + { + "type": "string", + "description": "User Name", + "name": "username", + "in": "formData" + }, + { + "type": "string", + "description": "Email", + "name": "email", + "in": "formData" + }, + { + "type": "string", + "description": "Description", + "name": "description", + "in": "formData" + }, + { + "type": "string", + "description": "Password", + "name": "pwd", + "in": "formData" + }, + { + "type": "string", + "description": "Old password", + "name": "oldpwd", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changusername": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改用户名", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Old user name", + "name": "oldname", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changuserpwd": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改密码", + "parameters": [ + { + "type": "string", + "description": "Password", + "name": "pwd", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Old password", + "name": "oldpwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "mapplication/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "获取用户详情", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/login": { + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "登录", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/setusernamepwd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "设置用户名和密码", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/create": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "create new network", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/edit/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "修改网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "json数据", + "name": "json", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络详情", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/islogin": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "是否需要登录zerotier", + "responses": { + "200": { + "description": "false:需要登录,true:不需要登录", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/join/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "加入网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/joined/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取已加入的网络", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/leave/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络列表", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/login": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "登录zerotier获取token", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "网络列表", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}/del/{mId}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "删除网络中的用户", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "member_id", + "name": "mId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}/edit/{mId}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "修改网络用户信息", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "mId", + "name": "mId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "json数据", + "name": "json", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/network/{id}/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "删除网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/register": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "注册zerotier", + "parameters": [ + { + "type": "string", + "description": "first name", + "name": "firstName", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "email", + "name": "email", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "last name", + "name": "lastName", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getcpuinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取cpu信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getdiskinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取硬盘信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getmeminfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取内存信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getnetinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取网络信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/sysinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取信息系统信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +}` + +type swaggerInfo struct { + Version string + Host string + BasePath string + Schemes []string + Title string + Description string +} + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = swaggerInfo{ + Version: "1.0.0", + Host: "192.168.2.114:8089", + BasePath: "/v1", + Schemes: []string{}, + Title: "Oasis API", + Description: "Oasis v1版本api", +} + +type s struct{} + +func (s *s) ReadDoc() string { + sInfo := SwaggerInfo + sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1) + + t, err := template.New("swagger_info").Funcs(template.FuncMap{ + "marshal": func(v interface{}) string { + a, _ := json.Marshal(v) + return string(a) + }, + }).Parse(doc) + if err != nil { + return doc + } + + var tpl bytes.Buffer + if err := t.Execute(&tpl, sInfo); err != nil { + return doc + } + + return tpl.String() +} + +func init() { + swag.Register(swag.Name, &s{}) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..404b758 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,2839 @@ +{ + "swagger": "2.0", + "info": { + "description": "Oasis v1版本api", + "title": "Oasis API", + "contact": { + "name": "lauren.pan", + "url": "https://www.zimaboard.com", + "email": "lauren.pan@icewhale.org" + }, + "version": "1.0.0" + }, + "host": "192.168.2.114:8089", + "basePath": "/v1", + "paths": { + "/app/appinfo/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "应用详情", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/category": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取远程分类列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/check/{port}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "检查端口是否可用", + "parameters": [ + { + "type": "integer", + "description": "端口号", + "name": "port", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "端口类型 udp/tcp", + "name": "type", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/getport": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取一个可用端口", + "parameters": [ + { + "type": "string", + "description": "端口类型 udp/tcp", + "name": "type", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取容器详情", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/install/config": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取安装所需要的数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/install/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "安装app(该接口需要post json数据)", + "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "主端口", + "name": "port", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "tcp端口", + "name": "tcp", + "in": "formData" + }, + { + "type": "string", + "description": "udp端口", + "name": "udp", + "in": "formData" + }, + { + "type": "string", + "description": "环境变量", + "name": "env", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取远程列表", + "parameters": [ + { + "type": "integer", + "description": "页码", + "name": "index", + "in": "query" + }, + { + "type": "integer", + "description": "每页数量", + "name": "size", + "in": "query" + }, + { + "type": "integer", + "description": "分类id", + "name": "category_id", + "in": "query" + }, + { + "type": "string", + "description": "rank,new", + "name": "type", + "in": "query" + }, + { + "type": "string", + "description": "search key", + "name": "key", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/logs/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "查看容器日志", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/mylist": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "我的应用列表", + "parameters": [ + { + "type": "integer", + "description": "index", + "name": "index", + "in": "query" + }, + { + "type": "integer", + "description": "size", + "name": "size", + "in": "query" + }, + { + "type": "boolean", + "description": "是否是首页应用", + "name": "position", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/rely/{id}/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取依赖数据", + "parameters": [ + { + "type": "string", + "description": "rely id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/speed/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取安装进度", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/state/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取容器状态", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "type=1", + "name": "type", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + }, + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "修改app状态", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "是否停止 strat stop restart", + "name": "state", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/uninstall/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "卸载app", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/update/{id}/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "获取可更新数据", + "parameters": [ + { + "type": "string", + "description": "appid", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/app/update/{id}/setting": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "app" + ], + "summary": "更新设置", + "parameters": [ + { + "type": "string", + "description": "容器id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "cpu权重", + "name": "shares", + "in": "formData" + }, + { + "type": "string", + "description": "内存大小MB", + "name": "mem", + "in": "formData" + }, + { + "type": "string", + "description": "重启策略", + "name": "restart", + "in": "formData" + }, + { + "type": "string", + "description": "应用名称", + "name": "label", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否放到首页", + "name": "position", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/delete/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "删除ddns", + "parameters": [ + { + "type": "integer", + "description": "ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/getlist": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取可以设置的ddns列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/ip": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取ip,仅做展示使用", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "获取已设置的列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/ping/{api_host}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "测试网址是否可以ping通", + "parameters": [ + { + "type": "integer", + "description": "api地址", + "name": "api_host", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/ddns/set": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ddns" + ], + "summary": "添加新的ddns(按给定模型返回内容)", + "parameters": [ + { + "type": "string", + "description": "类型", + "name": "type", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "host", + "name": "host", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/addpart": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "添加分区", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "需要分区容量大小(MB)", + "name": "size", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "磁盘符号", + "name": "num", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/delpart": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "删除分区", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda1", + "name": "path", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/format": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "磁盘详情", + "parameters": [ + { + "type": "string", + "description": "磁盘路径 例如/dev/sda1", + "name": "path", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "磁盘详情", + "parameters": [ + { + "type": "string", + "description": "要获取的磁盘详情 例如/dev/sda", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取磁盘列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/lists": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取磁盘列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/disk/type": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "disk" + ], + "summary": "获取支持的格式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/dirpath": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "获取目录列表", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/download": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "下载文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/mkdir": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "上传文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/read": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "读取文件", + "parameters": [ + { + "type": "string", + "description": "路径", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/file/rename": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "重命名目录或文件", + "parameters": [ + { + "type": "string", + "description": "旧的路径", + "name": "oldpath", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "新路径", + "name": "newpath", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/notify/read/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notify" + ], + "summary": "标记notify已读", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/notify/ws": {}, + "/share/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "添加文件共享", + "parameters": [ + { + "type": "string", + "description": "要分享的文件路径", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "名称", + "name": "name", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "描述", + "name": "comment", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "是否只读", + "name": "read_only", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可写", + "name": "writeable", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可浏览", + "name": "browseable", + "in": "formData" + }, + { + "type": "string", + "description": "用户", + "name": "user", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/del/{id}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "删除分享", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "分享详情", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "获取列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/share/update/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "share" + ], + "summary": "更新分享详情", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "要分享的文件路径", + "name": "path", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "名称", + "name": "name", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "描述", + "name": "comment", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "是否只读", + "name": "read_only", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可写", + "name": "writeable", + "in": "formData" + }, + { + "type": "boolean", + "description": "是否可浏览", + "name": "browseable", + "in": "formData" + }, + { + "type": "string", + "description": "用户", + "name": "user", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/add": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "添加shortcuts", + "parameters": [ + { + "type": "string", + "description": "title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "url", + "name": "url", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/del/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "删除shortcuts", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/edit": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "编辑shortcuts", + "parameters": [ + { + "type": "string", + "description": "title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "url", + "name": "url", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/shortcuts/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "shortcuts" + ], + "summary": "获取短链列表", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/sys/chackversion": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "sys" + ], + "summary": "系统信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/task/completion/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "task" + ], + "summary": "标记task已完成", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/task/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "task" + ], + "summary": "获取task列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changhead": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改配置文件", + "parameters": [ + { + "type": "file", + "description": "用户头像", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changuserinfo": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改用户信息", + "parameters": [ + { + "type": "string", + "description": "User Name", + "name": "username", + "in": "formData" + }, + { + "type": "string", + "description": "Email", + "name": "email", + "in": "formData" + }, + { + "type": "string", + "description": "Description", + "name": "description", + "in": "formData" + }, + { + "type": "string", + "description": "Password", + "name": "pwd", + "in": "formData" + }, + { + "type": "string", + "description": "Old password", + "name": "oldpwd", + "in": "formData" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changusername": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改用户名", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Old user name", + "name": "oldname", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/changuserpwd": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "修改密码", + "parameters": [ + { + "type": "string", + "description": "Password", + "name": "pwd", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Old password", + "name": "oldpwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/info": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "mapplication/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "获取用户详情", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/login": { + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "登录", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/user/setusernamepwd": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "设置用户名和密码", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/create": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "create new network", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/edit/{id}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "修改网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "json数据", + "name": "json", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/info/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络详情", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/islogin": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "是否需要登录zerotier", + "responses": { + "200": { + "description": "false:需要登录,true:不需要登录", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/join/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "加入网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/joined/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取已加入的网络", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/leave/{id}": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络列表", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/list": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "获取zerotier网络列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/login": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "登录zerotier获取token", + "parameters": [ + { + "type": "string", + "description": "User name", + "name": "username", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "网络列表", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}/del/{mId}": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "删除网络中的用户", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "member_id", + "name": "mId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/member/{id}/edit/{mId}": { + "put": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "修改网络用户信息", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "mId", + "name": "mId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "json数据", + "name": "json", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/network/{id}/del": { + "delete": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "删除网络", + "parameters": [ + { + "type": "string", + "description": "network id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zerotier/register": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zerotier" + ], + "summary": "注册zerotier", + "parameters": [ + { + "type": "string", + "description": "first name", + "name": "firstName", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "password", + "name": "pwd", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "email", + "name": "email", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "last name", + "name": "lastName", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getcpuinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取cpu信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getdiskinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取硬盘信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getmeminfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取内存信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/getnetinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取网络信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/zima/sysinfo": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "zima" + ], + "summary": "获取信息系统信息", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..98070d9 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,1753 @@ +basePath: /v1 +host: 192.168.2.114:8089 +info: + contact: + email: lauren.pan@icewhale.org + name: lauren.pan + url: https://www.zimaboard.com + description: Oasis v1版本api + title: Oasis API + version: 1.0.0 +paths: + /app/appinfo/{id}: + get: + consumes: + - application/json + parameters: + - description: id + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 应用详情 + tags: + - app + /app/category: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取远程分类列表 + tags: + - app + /app/check/{port}: + get: + consumes: + - application/json + parameters: + - description: 端口号 + in: path + name: port + required: true + type: integer + - description: 端口类型 udp/tcp + in: query + name: type + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 检查端口是否可用 + tags: + - app + /app/getport: + get: + consumes: + - application/json + parameters: + - description: 端口类型 udp/tcp + in: query + name: type + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取一个可用端口 + tags: + - app + /app/info/{id}: + get: + consumes: + - application/json + parameters: + - description: appid + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取容器详情 + tags: + - app + /app/install/{id}: + post: + consumes: + - application/json + parameters: + - description: id + in: path + name: id + required: true + type: integer + - description: 主端口 + in: formData + name: port + required: true + type: integer + - description: tcp端口 + in: formData + name: tcp + type: string + - description: udp端口 + in: formData + name: udp + type: string + - description: 环境变量 + in: formData + name: env + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 安装app(该接口需要post json数据) + tags: + - app + /app/install/config: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取安装所需要的数据 + tags: + - app + /app/list: + get: + consumes: + - application/json + parameters: + - description: 页码 + in: query + name: index + type: integer + - description: 每页数量 + in: query + name: size + type: integer + - description: 分类id + in: query + name: category_id + type: integer + - description: rank,new + in: query + name: type + type: string + - description: search key + in: query + name: key + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取远程列表 + tags: + - app + /app/logs/{id}: + get: + consumes: + - application/json + parameters: + - description: appid + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 查看容器日志 + tags: + - app + /app/mylist: + get: + consumes: + - application/json + parameters: + - description: index + in: query + name: index + type: integer + - description: size + in: query + name: size + type: integer + - description: 是否是首页应用 + in: query + name: position + type: boolean + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 我的应用列表 + tags: + - app + /app/rely/{id}/info: + get: + consumes: + - application/json + parameters: + - description: rely id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取依赖数据 + tags: + - app + /app/speed/{id}: + get: + consumes: + - application/json + parameters: + - description: 容器id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取安装进度 + tags: + - app + /app/state/{id}: + get: + consumes: + - application/json + parameters: + - description: 容器id + in: path + name: id + required: true + type: string + - description: type=1 + in: query + name: type + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取容器状态 + tags: + - app + put: + consumes: + - multipart/form-data + parameters: + - description: appid + in: path + name: id + required: true + type: string + - description: 是否停止 strat stop restart + in: query + name: state + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改app状态 + tags: + - app + /app/uninstall/{id}: + delete: + consumes: + - multipart/form-data + parameters: + - description: 容器id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 卸载app + tags: + - app + /app/update/{id}/info: + get: + consumes: + - application/json + parameters: + - description: appid + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取可更新数据 + tags: + - app + /app/update/{id}/setting: + put: + consumes: + - multipart/form-data + parameters: + - description: 容器id + in: path + name: id + required: true + type: string + - description: cpu权重 + in: formData + name: shares + type: string + - description: 内存大小MB + in: formData + name: mem + type: string + - description: 重启策略 + in: formData + name: restart + type: string + - description: 应用名称 + in: formData + name: label + type: string + - description: 是否放到首页 + in: formData + name: position + required: true + type: boolean + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新设置 + tags: + - app + /ddns/delete/{id}: + delete: + consumes: + - application/json + parameters: + - description: ID + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除ddns + tags: + - ddns + /ddns/getlist: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取可以设置的ddns列表 + tags: + - ddns + /ddns/ip: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取ip,仅做展示使用 + tags: + - ddns + /ddns/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取已设置的列表 + tags: + - ddns + /ddns/ping/{api_host}: + get: + consumes: + - application/json + parameters: + - description: api地址 + in: path + name: api_host + required: true + type: integer + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 测试网址是否可以ping通 + tags: + - ddns + /ddns/set: + post: + consumes: + - multipart/form-data + parameters: + - description: 类型 + in: formData + name: type + required: true + type: string + - description: host + in: formData + name: host + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加新的ddns(按给定模型返回内容) + tags: + - ddns + /disk/addpart: + post: + consumes: + - multipart/form-data + parameters: + - description: 磁盘路径 例如/dev/sda + in: formData + name: path + required: true + type: string + - description: 需要分区容量大小(MB) + in: formData + name: size + required: true + type: string + - description: 磁盘符号 + in: formData + name: num + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加分区 + tags: + - disk + /disk/delpart: + delete: + consumes: + - multipart/form-data + parameters: + - description: 磁盘路径 例如/dev/sda1 + in: formData + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除分区 + tags: + - disk + /disk/format: + post: + consumes: + - multipart/form-data + parameters: + - description: 磁盘路径 例如/dev/sda1 + in: formData + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 磁盘详情 + tags: + - disk + /disk/info: + get: + consumes: + - application/json + parameters: + - description: 要获取的磁盘详情 例如/dev/sda + in: query + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 磁盘详情 + tags: + - disk + /disk/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取磁盘列表 + tags: + - disk + /disk/lists: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取磁盘列表 + tags: + - disk + /disk/type: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取支持的格式 + tags: + - disk + /file/dirpath: + get: + consumes: + - application/json + parameters: + - description: 路径 + in: query + name: path + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取目录列表 + tags: + - file + /file/download: + get: + consumes: + - application/json + parameters: + - description: 路径 + in: query + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 下载文件 + tags: + - file + /file/mkdir: + post: + consumes: + - multipart/form-data + parameters: + - description: 路径 + in: formData + name: path + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 上传文件 + tags: + - file + /file/read: + get: + consumes: + - application/json + parameters: + - description: 路径 + in: query + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 读取文件 + tags: + - file + /file/rename: + put: + consumes: + - application/json + parameters: + - description: 旧的路径 + in: formData + name: oldpath + required: true + type: string + - description: 新路径 + in: formData + name: newpath + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 重命名目录或文件 + tags: + - file + /notify/read/{id}: + put: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 标记notify已读 + tags: + - notify + /notify/ws: {} + /share/add: + post: + consumes: + - multipart/form-data + parameters: + - description: 要分享的文件路径 + in: formData + name: path + required: true + type: string + - description: 名称 + in: formData + name: name + required: true + type: string + - description: 描述 + in: formData + name: comment + required: true + type: string + - description: 是否只读 + in: formData + name: read_only + type: boolean + - description: 是否可写 + in: formData + name: writeable + type: boolean + - description: 是否可浏览 + in: formData + name: browseable + type: boolean + - description: 用户 + in: formData + name: user + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加文件共享 + tags: + - share + /share/del/{id}: + delete: + consumes: + - application/json + parameters: + - description: id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除分享 + tags: + - share + /share/info/{id}: + get: + consumes: + - application/json + parameters: + - description: id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 分享详情 + tags: + - share + /share/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取列表 + tags: + - share + /share/update/{id}: + put: + consumes: + - application/json + parameters: + - description: id + in: path + name: id + required: true + type: string + - description: 要分享的文件路径 + in: formData + name: path + required: true + type: string + - description: 名称 + in: formData + name: name + required: true + type: string + - description: 描述 + in: formData + name: comment + required: true + type: string + - description: 是否只读 + in: formData + name: read_only + type: boolean + - description: 是否可写 + in: formData + name: writeable + type: boolean + - description: 是否可浏览 + in: formData + name: browseable + type: boolean + - description: 用户 + in: formData + name: user + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 更新分享详情 + tags: + - share + /shortcuts/add: + post: + consumes: + - application/json + parameters: + - description: title + in: formData + name: title + required: true + type: string + - description: url + in: formData + name: url + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 添加shortcuts + tags: + - shortcuts + /shortcuts/del/{id}: + post: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除shortcuts + tags: + - shortcuts + /shortcuts/edit: + put: + consumes: + - application/json + parameters: + - description: title + in: formData + name: title + required: true + type: string + - description: url + in: formData + name: url + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 编辑shortcuts + tags: + - shortcuts + /shortcuts/list: + get: + consumes: + - application/json + parameters: + - description: User name + in: formData + name: username + required: true + type: string + - description: password + in: formData + name: pwd + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取短链列表 + tags: + - shortcuts + /sys/chackversion: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 系统信息 + tags: + - sys + /task/completion/{id}: + put: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 标记task已完成 + tags: + - task + /task/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取task列表 + tags: + - task + /user/changhead: + post: + consumes: + - multipart/form-data + parameters: + - description: 用户头像 + in: formData + name: file + required: true + type: file + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改配置文件 + tags: + - user + /user/changuserinfo: + post: + consumes: + - multipart/form-data + parameters: + - description: User Name + in: formData + name: username + type: string + - description: Email + in: formData + name: email + type: string + - description: Description + in: formData + name: description + type: string + - description: Password + in: formData + name: pwd + type: string + - description: Old password + in: formData + name: oldpwd + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改用户信息 + tags: + - user + /user/changusername: + put: + consumes: + - multipart/form-data + parameters: + - description: User name + in: formData + name: username + required: true + type: string + - description: Old user name + in: formData + name: oldname + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改用户名 + tags: + - user + /user/changuserpwd: + put: + consumes: + - multipart/form-data + parameters: + - description: Password + in: formData + name: pwd + required: true + type: string + - description: Old password + in: formData + name: oldpwd + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改密码 + tags: + - user + /user/info: + get: + consumes: + - mapplication/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取用户详情 + tags: + - user + /user/login: + post: + consumes: + - multipart/form-data + parameters: + - description: User name + in: formData + name: username + required: true + type: string + - description: password + in: formData + name: pwd + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 登录 + tags: + - user + /user/setusernamepwd: + post: + consumes: + - multipart/form-data + parameters: + - description: User name + in: formData + name: username + required: true + type: string + - description: password + in: formData + name: pwd + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 设置用户名和密码 + tags: + - user + /zerotier/create: + post: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: create new network + tags: + - zerotier + /zerotier/edit/{id}: + put: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + - description: json数据 + in: formData + name: json + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改网络 + tags: + - zerotier + /zerotier/info/{id}: + get: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取zerotier网络详情 + tags: + - zerotier + /zerotier/islogin: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: false:需要登录,true:不需要登录 + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 是否需要登录zerotier + tags: + - zerotier + /zerotier/join/{id}: + post: + consumes: + - multipart/form-data + parameters: + - description: network id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 加入网络 + tags: + - zerotier + /zerotier/joined/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取已加入的网络 + tags: + - zerotier + /zerotier/leave/{id}: + post: + consumes: + - multipart/form-data + parameters: + - description: network id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取zerotier网络列表 + tags: + - zerotier + /zerotier/list: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取zerotier网络列表 + tags: + - zerotier + /zerotier/login: + post: + consumes: + - multipart/form-data + parameters: + - description: User name + in: formData + name: username + required: true + type: string + - description: password + in: formData + name: pwd + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 登录zerotier获取token + tags: + - zerotier + /zerotier/member/{id}: + get: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 网络列表 + tags: + - zerotier + /zerotier/member/{id}/del/{mId}: + delete: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + - description: member_id + in: path + name: mId + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除网络中的用户 + tags: + - zerotier + /zerotier/member/{id}/edit/{mId}: + put: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + - description: mId + in: path + name: mId + required: true + type: string + - description: json数据 + in: formData + name: json + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 修改网络用户信息 + tags: + - zerotier + /zerotier/network/{id}/del: + delete: + consumes: + - application/json + parameters: + - description: network id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 删除网络 + tags: + - zerotier + /zerotier/register: + post: + consumes: + - multipart/form-data + parameters: + - description: first name + in: formData + name: firstName + required: true + type: string + - description: password + in: formData + name: pwd + required: true + type: string + - description: email + in: formData + name: email + required: true + type: string + - description: last name + in: formData + name: lastName + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 注册zerotier + tags: + - zerotier + /zima/getcpuinfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取cpu信息 + tags: + - zima + /zima/getdiskinfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取硬盘信息 + tags: + - zima + /zima/getinfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取信息 + tags: + - zima + /zima/getmeminfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取内存信息 + tags: + - zima + /zima/getnetinfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取网络信息 + tags: + - zima + /zima/sysinfo: + get: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + security: + - ApiKeyAuth: [] + summary: 获取信息系统信息 + tags: + - zima +securityDefinitions: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey +swagger: "2.0" diff --git a/file/lll.png b/file/lll.png new file mode 100644 index 0000000..ad7ea95 Binary files /dev/null and b/file/lll.png differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..71ed966 --- /dev/null +++ b/go.mod @@ -0,0 +1,57 @@ +module oasis + +go 1.16 + +require ( + github.com/PuerkitoBio/goquery v1.7.0 + github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 // indirect + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 + github.com/containerd/containerd v1.5.2 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/docker/docker v20.10.7+incompatible + github.com/docker/go-connections v0.4.0 + github.com/forease/gotld v0.0.0-20190808124948-c50ff635576b + github.com/gin-contrib/gzip v0.0.2 // indirect + github.com/gin-gonic/gin v1.7.2 + github.com/go-ini/ini v1.62.0 + github.com/go-ole/go-ole v1.2.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/spec v0.20.3 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-playground/validator/v10 v10.6.1 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/gomodule/redigo v1.8.5 + github.com/google/go-github/v36 v36.0.0 + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.4.2 + github.com/jinzhu/copier v0.3.2 + github.com/json-iterator/go v1.1.11 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.13 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/pkg/errors v0.9.1 + github.com/prestonTao/upnp v0.0.0-20150206124352-f4370df5e109 + github.com/robfig/cron v1.2.0 + github.com/satori/go.uuid v1.2.0 + github.com/shirou/gopsutil/v3 v3.21.5 + github.com/sirupsen/logrus v1.8.1 + github.com/smartystreets/goconvey v1.6.4 // indirect + github.com/swaggo/gin-swagger v1.3.0 + github.com/swaggo/swag v1.7.0 + github.com/tidwall/gjson v1.8.0 + github.com/tklauser/go-sysconf v0.3.6 // indirect + github.com/ugorji/go v1.2.6 // indirect + golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d + golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 // indirect + golang.org/x/tools v0.1.3 // indirect + google.golang.org/grpc v1.39.0 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect + gorm.io/driver/mysql v1.1.1 // indirect + gorm.io/driver/sqlite v1.1.5 + gorm.io/gorm v1.21.15 + src.techknowlogick.com/xgo v1.4.1-0.20210909190026-ce016894db20 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0499411 --- /dev/null +++ b/go.sum @@ -0,0 +1,1169 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16 h1:8/auA4LFIZFTGrqfKhGBSXwM6/4X1fHa/xniyEHu8ac= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/goquery v1.7.0 h1:O5SP3b9JWqMSVMG69zMfj577zwkSNpxrFf7ybS74eiw= +github.com/PuerkitoBio/goquery v1.7.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 h1:5sXbqlSomvdjlRbWyNqkPsJ3Fg+tQZCbgeX1VGljbQY= +github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.2 h1:MG/Bg1pbmMb61j3wHCFWPxESXHieiKr2xG64px/k8zQ= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2 h1:2/O3oTZN36q2xRolk0a2WWGgh7/Vf/liElg5hFYLX9U= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/forease/gotld v0.0.0-20190808124948-c50ff635576b h1:r13MvtFTtnvxtuKK7z0ZSQ2EfMmTzWDHwfDvGCoqUQE= +github.com/forease/gotld v0.0.0-20190808124948-c50ff635576b/go.mod h1:EfR6AU78zUiZ36oVS5YrmTzc2um3zDXWPx4L4st++jo= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= +github.com/gin-contrib/gzip v0.0.2 h1:VMBkd4ZB1Hl7e1lOA5gEZ/qdD3d9vLIq57xKWgPCCV8= +github.com/gin-contrib/gzip v0.0.2/go.mod h1:YxxswVZIqOvcHEQpsSn+QF5guQtO1dCfy0shBPy4jFc= +github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= +github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.62.0 h1:7VJT/ZXjzqSrvtraFp4ONq80hTcRQth1c9ZnQ3uNQvU= +github.com/go-ini/ini v1.62.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.14/go.mod h1:gwrgJS15eCUgjLpMjBJmbZezCsw88LmgeEip0M63doA= +github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.6.1 h1:W6TRDXt4WcWp4c4nf/G+6BkGdhiIo0k417gfr+V6u4I= +github.com/go-playground/validator/v10 v10.6.1/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc= +github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github/v36 v36.0.0 h1:ndCzM616/oijwufI7nBRa+5eZHLldT+4yIB68ib5ogs= +github.com/google/go-github/v36 v36.0.0/go.mod h1:LFlKC047IOqiglRGNqNb9s/iAPTnnjtlshm+bxp+kwk= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jinzhu/copier v0.3.2 h1:QdBOCbaouLDYaIPFfi1bKv5F5tPpeTwXe4sD0jqtz5w= +github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13 h1:eSvu8Tmq6j2psUJqJrLcWH6K3w5Dwc+qipbaA6eVEN4= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93 h1:x2UMpOOVf3kQ8arv/EsDGwim8PTNqzL1/EYDr/+scOM= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d h1:pNa8metDkwZjb9g4T8s+krQ+HRgZAkqnXml+wNir/+s= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0 h1:+77ba4ar4jsCbL1GLbFL8fFM57w6suPfSS9PDLDY7KM= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prestonTao/upnp v0.0.0-20150206124352-f4370df5e109 h1:h9WYaTCQJ7hap8C5vQniEum2YZbc+iRad/ROafTjy10= +github.com/prestonTao/upnp v0.0.0-20150206124352-f4370df5e109/go.mod h1:U7VCLF6LMHzOFD/6Kww2MTQuwaNeEA1U1dOxFyZBoBE= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/shirou/gopsutil/v3 v3.21.5 h1:YUBf0w/KPLk7w1803AYBnH7BmA+1Z/Q5MEZxpREUaB4= +github.com/shirou/gopsutil/v3 v3.21.5/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= +github.com/swaggo/gin-swagger v1.3.0 h1:eOmp7r57oUgZPw2dJOjcGNMse9cvXcI4tTqBcnZtPsI= +github.com/swaggo/gin-swagger v1.3.0/go.mod h1:oy1BRA6WvgtCp848lhxce7BnWH4C8Bxa0m5SkWx+cS0= +github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= +github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= +github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tidwall/gjson v1.8.0 h1:Qt+orfosKn0rbNTZqHYDqBrmm3UDA4KRkv70fDzG+PQ= +github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= +github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= +github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4= +github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= +github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= +github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= +github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= +github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= +github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 h1:Vv0JUPWTyeqUq42B2WJ1FeIDjjvGKoA2Ss+Ts0lAVbs= +golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201120155355-20be4ac4bd6e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.1.1 h1:yr1bpyqiwuSPJ4aGGUX9nu46RHXlF8RASQVb1QQNcvo= +gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU= +gorm.io/driver/sqlite v1.1.5 h1:JU8G59VyKu1x1RMQgjefQnkZjDe9wHc1kARDZPu5dZs= +gorm.io/driver/sqlite v1.1.5/go.mod h1:NpaYMcVKEh6vLJ47VP6T7Weieu4H1Drs3dGD/K6GrGc= +gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.21.15 h1:gAyaDoPw0lCyrSFWhBlahbUA1U4P5RViC1uIqoB+1Rk= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +src.techknowlogick.com/xgo v1.4.1-0.20210909190026-ce016894db20 h1:kLvR3yWbtk+Gkkoqy++vULhSfn5WY93Y+mf3BtO+mUk= +src.techknowlogick.com/xgo v1.4.1-0.20210909190026-ce016894db20/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU= diff --git a/main.go b/main.go new file mode 100644 index 0000000..834825a --- /dev/null +++ b/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "flag" + "fmt" + "github.com/gin-gonic/gin" + "github.com/robfig/cron" + "gorm.io/gorm" + "net/http" + "oasis/pkg/config" + "oasis/pkg/sqlite" + loger2 "oasis/pkg/utils/loger" + "oasis/route" + "oasis/service" + "time" +) + +var sqliteDB *gorm.DB + +var swagHandler gin.HandlerFunc +var configFlag = flag.String("c", "", "config address") + +func init() { + flag.Parse() + config.InitSetup(*configFlag) + loger2.LogSetup() + sqliteDB = sqlite.GetDb(config.AppInfo.ProjectPath) + //gredis.GetRedisConn(config.RedisInfo), + service.MyService = service.NewService(sqliteDB, loger2.NewOLoger()) +} + +// @title Oasis API +// @version 1.0.0 +// @contact.name lauren.pan +// @contact.url https://www.zimaboard.com +// @contact.email lauren.pan@icewhale.org +// @description Oasis v1版本api +// @host 192.168.2.114:8089 +// @securityDefinitions.apikey ApiKeyAuth +// @in header +// @name Authorization +// @BasePath /v1 +func main() { + //model.Setup() + //gredis.Setup() + r := route.InitRouter(swagHandler) + service.SyncTask(sqliteDB) + cron2 := cron.New() //创建一个cron实例 + //执行定时任务(每5秒执行一次) + err := cron2.AddFunc("0 0 0 1/1 * *", func() { + //service.UpdataDDNSList(mysqldb) + service.SyncTask(sqliteDB) + }) + if err != nil { + fmt.Println(err) + } + + //启动/关闭 + cron2.Start() + defer cron2.Stop() + s := &http.Server{ + Addr: fmt.Sprintf(":%v", config.ServerInfo.HttpPort), + Handler: r, + ReadTimeout: 60 * time.Second, + WriteTimeout: 60 * time.Second, + MaxHeaderBytes: 1 << 20, + } + s.ListenAndServe() + +} diff --git a/middleware/gin.go b/middleware/gin.go new file mode 100644 index 0000000..c4e7cd3 --- /dev/null +++ b/middleware/gin.go @@ -0,0 +1,43 @@ +package middleware + +import ( + "fmt" + "github.com/gin-gonic/gin" + "net/http" +) + +func Cors() gin.HandlerFunc { + return func(c *gin.Context) { + method := c.Request.Method + //origin := c.Request.Header.Get("Origin") //请求头部 + //if origin != "" { + //接收客户端发送的origin (重要!) + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Header("Access-Control-Allow-Origin", "*") + //服务器支持的所有跨域请求的方法 + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") + //允许跨域设置可以返回其他子段,可以自定义字段 + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session") + // 允许浏览器(客户端)可以解析的头部 (重要) + c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") + //设置缓存时间 + c.Header("Access-Control-Max-Age", "172800") + //允许客户端传递校验信息比如 cookie (重要) + c.Header("Access-Control-Allow-Credentials", "true") + c.Set("content-type", "application/json") + //} + + //允许类型校验 + if method == "OPTIONS" { + c.JSON(http.StatusOK, "ok!") + } + + defer func() { + if err := recover(); err != nil { + fmt.Println(err) + } + }() + + c.Next() + } +} diff --git a/model/app.go b/model/app.go new file mode 100644 index 0000000..d647863 --- /dev/null +++ b/model/app.go @@ -0,0 +1,100 @@ +package model + +import ( + "database/sql/driver" + "encoding/json" + "time" +) + +type ServerAppList struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Title string `json:"title"` + Description string `json:"description"` + Tagline string `json:"tagline"` + Tags Strings `gorm:"type:json" json:"tags"` + Icon string `json:"icon"` + ScreenshotLink Strings `gorm:"type:json" json:"screenshot_link"` + Category string `json:"category"` + TcpPort uint `json:"tcp_port"` + PortMap uint `json:"port_map"` + ImageVersion string `json:"image_version"` + Tip string `json:"tip"` + Configures configures `gorm:"type:json" json:"configures"` + NetworkModel string `json:"network_mode"` + Image string `json:"image"` + Index string `json:"index"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + State string `json:"state"` + Author string `json:"author"` + MinMemory int `json:"min_memory"` + MinDisk int `json:"min_disk"` + MaxMemory uint64 `json:"max_memory"` + Thumbnail string `json:"thumbnail"` + Healthy string `json:"healthy"` + Plugins Strings `json:"plugins"` +} + +type Ports struct { + ContainerPort uint `json:"container_port"` + CommendPort int `json:"commend_port"` + Desc string `json:"desc"` + Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 +} + +type Volume struct { + ContainerPath string `json:"container_path"` + Path string `json:"path"` + Desc string `json:"desc"` + Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 +} + +type Envs struct { + Name string `json:"name"` + Value string `json:"value"` + Desc string `json:"desc"` + Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 +} + +type Devices struct { + ContainerPath string `json:"container_path"` + Path string `json:"path"` + Desc string `json:"desc"` + Type int `json:"type"` // 1:必选 2:可选 3:默认值不必显示 4:系统处理 5:container内容也可编辑 +} + +type configures struct { + TcpPorts []Ports `json:"tcp_ports"` + UdpPorts []Ports `json:"udp_ports"` + Envs []Envs `json:"envs"` + Volumes []Volume `json:"volumes"` + Devices []Devices `json:"devices"` +} + +/****************使gorm支持[]string结构*******************/ +type Strings []string + +func (c Strings) Value() (driver.Value, error) { + b, err := json.Marshal(c) + return string(b), err +} + +func (c *Strings) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), c) +} + +/****************使gorm支持[]string结构*******************/ + +/****************使gorm支持[]string结构*******************/ +type MapStrings []map[string]string + +func (c MapStrings) Value() (driver.Value, error) { + b, err := json.Marshal(c) + return string(b), err +} + +func (c *MapStrings) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), c) +} + +/****************使gorm支持[]string结构*******************/ diff --git a/model/category.go b/model/category.go new file mode 100644 index 0000000..2040730 --- /dev/null +++ b/model/category.go @@ -0,0 +1,10 @@ +package model + +type ServerCategoryList struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + //CreatedAt time.Time `json:"created_at"` + // + //UpdatedAt time.Time `json:"updated_at"` + Name string `json:"name"` + Count uint `json:"count"` +} diff --git a/model/ddns.go b/model/ddns.go new file mode 100644 index 0000000..d481504 --- /dev/null +++ b/model/ddns.go @@ -0,0 +1,9 @@ +package model + +type GoDaddyModel struct { + Type uint `json:"type"` + ApiHost string `json:"api_host"` + Key string `json:"key"` + Secret string `json:"secret"` + Host string `json:"host"` +} diff --git a/model/disk.go b/model/disk.go new file mode 100644 index 0000000..8edfd63 --- /dev/null +++ b/model/disk.go @@ -0,0 +1,31 @@ +package model + +type LSBLKModel struct { + Name string `json:"name"` + FsType string `json:"fstype"` + Size uint64 `json:"size"` + FSSize string `json:"fssize"` + Path string `json:"path"` + Model string `json:"model"` //设备标识符 + RM bool `json:"rm"` //是否为可移动设备 + RO bool `json:"ro"` //是否为只读设备 + State string `json:"state"` + PhySec int `json:"phy-sec"` //物理扇区大小 + Type string `json:"type"` + Vendor string `json:"vendor"` //供应商 + Rev string `json:"rev"` //修订版本 + FSAvail string `json:"fsavail"` //可用空间 + FSUse string `json:"fsuse%"` //已用百分比 + MountPoint string `json:"mountpoint"` + Format string `json:"format"` + Health string `json:"health"` + HotPlug bool `json:"hotplug"` + FSUsed string `json:"fsused"` + Tran string `json:"tran"` + MinIO uint64 `json:"min-io"` + UsedPercent float64 `json:"used_percent"` + Children []LSBLKModel `json:"children"` + //详情特有 + StartSector uint64 `json:"start_sector,omitempty"` + EndSector uint64 `json:"end_sector,omitempty"` +} diff --git a/model/manifest.go b/model/manifest.go new file mode 100644 index 0000000..5bd9bff --- /dev/null +++ b/model/manifest.go @@ -0,0 +1,119 @@ +package model + +import ( + "database/sql/driver" + "encoding/json" +) + +type TcpPorts struct { + Desc string `json:"desc"` + ContainerPort int `json:"container_port"` +} +type UdpPorts struct { + Desc string `json:"desc"` + ContainerPort int `json:"container_port"` +} + +/*******************使用gorm支持json************************************/ + +type PortMap struct { + ContainerPort string `json:"container,omitempty"` + CommendPort string `json:"host,omitempty"` + Protocol string `json:"protocol"` +} + +type PortArrey []PortMap + +// Value 实现方法 +func (p PortArrey) Value() (driver.Value, error) { + return json.Marshal(p) +} + +// Scan 实现方法 +func (p *PortArrey) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), p) +} + +/************************************************************************/ + +/*******************使用gorm支持json************************************/ + +type Env struct { + Name string `json:"container"` + Value string `json:"host"` +} + +type JSON json.RawMessage + +type EnvArrey []Env + +// Value 实现方法 +func (p EnvArrey) Value() (driver.Value, error) { + return json.Marshal(p) + //return .MarshalJSON() +} + +// Scan 实现方法 +func (p *EnvArrey) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), p) +} + +/************************************************************************/ + +/*******************使用gorm支持json************************************/ + +type PathMap struct { + ContainerPath string `json:"container"` + Path string `json:"host"` +} + +type PathArrey []PathMap + +// Value 实现方法 +func (p PathArrey) Value() (driver.Value, error) { + return json.Marshal(p) +} + +// Scan 实现方法 +func (p *PathArrey) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), p) +} + +/************************************************************************/ + +//type PostData struct { +// Envs EnvArrey `json:"envs,omitempty"` +// Udp PortArrey `json:"udp_ports"` +// Tcp PortArrey `json:"tcp_ports"` +// Volumes PathArrey `json:"volumes"` +// Devices PathArrey `json:"devices"` +// Port string `json:"port,omitempty"` +// PortMap string `json:"port_map"` +// CpuShares int64 `json:"cpu_shares,omitempty"` +// Memory int64 `json:"memory,omitempty"` +// Restart string `json:"restart,omitempty"` +// EnableUPNP bool `json:"enable_upnp"` +// Label string `json:"label"` +// Position bool `json:"position"` +//} + +type CustomizationPostData struct { + Origin string `json:"origin"` + NetworkModel string `json:"network_model"` + Index string `json:"index"` + Icon string `json:"icon"` + Image string `json:"image"` + Envs EnvArrey `json:"envs"` + Ports PortArrey `json:"ports"` + Volumes PathArrey `json:"volumes"` + Devices PathArrey `json:"devices"` + //Port string `json:"port,omitempty"` + PortMap string `json:"port_map"` + CpuShares int64 `json:"cpu_shares"` + Memory int64 `json:"memory"` + Restart string `json:"restart"` + EnableUPNP bool `json:"enable_upnp"` + Label string `json:"label"` + Description string `json:"description"` + Position bool `json:"position"` +} diff --git a/model/net.go b/model/net.go new file mode 100644 index 0000000..fcc90a6 --- /dev/null +++ b/model/net.go @@ -0,0 +1,19 @@ +package model + +import "time" + +type IOCountersStat struct { + Name string `json:"name"` // interface name + BytesSent uint64 `json:"bytesSent"` // number of bytes sent + BytesRecv uint64 `json:"bytesRecv"` // number of bytes received + PacketsSent uint64 `json:"packetsSent"` // number of packets sent + PacketsRecv uint64 `json:"packetsRecv"` // number of packets received + Errin uint64 `json:"errin"` // total number of errors while receiving + Errout uint64 `json:"errout"` // total number of errors while sending + Dropin uint64 `json:"dropin"` // total number of incoming packets which were dropped + Dropout uint64 `json:"dropout"` // total number of outgoing packets which were dropped (always 0 on OSX and BSD) + Fifoin uint64 `json:"fifoin"` // total number of FIFO buffers errors while receiving + Fifoout uint64 `json:"fifoout"` // total number of FIFO buffers errors while sending + State string `json:"state"` + DateTime time.Time `json:"date_time"` +} diff --git a/model/sys_common.go b/model/sys_common.go new file mode 100644 index 0000000..686e43a --- /dev/null +++ b/model/sys_common.go @@ -0,0 +1,70 @@ +package model + +import "time" + +//系统配置 +type SysInfoModel struct { + Name string //系统名称 +} + +//用户相关 +type UserModel struct { + UserName string + PWD string + Token string + Head string + Email string + Description string +} + +//服务配置 +type ServerModel struct { + HttpPort string + RunMode string + ServerApi string +} + +//服务配置 +type APPModel struct { + LogSavePath string + LogSaveName string + LogFileExt string + DateStrFormat string + DateTimeFormat string + TimeFormat string + DateFormat string + ProjectPath string +} + +//公共返回模型 +type Result struct { + Success int `json:"success" example:"200"` + Message string `json:"message" example:"ok"` + Data interface{} `json:"data" example:"返回结果"` +} + +//zeritier相关 +type ZeroTierModel struct { + UserName string + PWD string + Token string +} + +//redis配置文件 +type RedisModel struct { + Host string + Password string + MaxIdle int + MaxActive int + IdleTimeout time.Duration +} + +type SystemConfig struct { + SearchSwitch bool `json:"search_switch"` //搜索开关 + SearchEngine string `json:"search_engine"` //搜索引擎 + ShortcutsSwitch bool `json:"shortcuts_switch"` + WidgetsSwitch bool `json:"widgets_switch"` + BackgroundType string `json:"background_type"` + Background string `json:"background"` + AutoUpdate bool `json:"auto_update"` +} diff --git a/model/system.go b/model/system.go new file mode 100644 index 0000000..c52acae --- /dev/null +++ b/model/system.go @@ -0,0 +1,3 @@ +package model + + diff --git a/model/version.go b/model/version.go new file mode 100644 index 0000000..9e0f2ea --- /dev/null +++ b/model/version.go @@ -0,0 +1,11 @@ +package model + +import "time" + +type Version struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + ChangLog string `json:"chang_log"` + Version string `json:"version"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} diff --git a/model/zerotier.go b/model/zerotier.go new file mode 100644 index 0000000..a913e61 --- /dev/null +++ b/model/zerotier.go @@ -0,0 +1,9 @@ +package model + +type ZeroTierUpData struct { + Config ZeroTierConfig `json:"config"` +} + +type ZeroTierConfig struct { + Private bool `json:"private"` +} diff --git a/model/zima.go b/model/zima.go new file mode 100644 index 0000000..79952ec --- /dev/null +++ b/model/zima.go @@ -0,0 +1,6 @@ +package model + +type Path struct { + Name string `json:"name"` + Path string `json:"path"` +} diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 0000000..8bae691 --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,5 @@ +package config + +const ( + USERCONFIGURL = "conf/conf.ini" +) diff --git a/pkg/config/init.go b/pkg/config/init.go new file mode 100644 index 0000000..c3c5386 --- /dev/null +++ b/pkg/config/init.go @@ -0,0 +1,84 @@ +package config + +import ( + "fmt" + "github.com/go-ini/ini" + "log" + "oasis/model" + "os" + "path" + "path/filepath" + "runtime" + "strings" +) + +//系统配置 +var SysInfo = &model.SysInfoModel{} + +//用户相关 +var UserInfo = &model.UserModel{} + +//用户相关 +var AppInfo = &model.APPModel{} + +//redis相关配置 +var RedisInfo = &model.RedisModel{} + +//zerotier相关 +var ZeroTierInfo = &model.ZeroTierModel{} + +//server相关 +var ServerInfo = &model.ServerModel{} + +var SystemConfigInfo = &model.SystemConfig{} + +var Cfg *ini.File + +//初始化设置,获取系统的部分信息。 +func InitSetup(config string) { + + var configDir = USERCONFIGURL + if len(config) > 0 { + configDir = config + } + var err error + //读取文件 + Cfg, err = ini.Load(configDir) + if err != nil { + fmt.Printf("Fail to read file: %v", err) + os.Exit(1) + } + + mapTo("user", UserInfo) + mapTo("app", AppInfo) + mapTo("zerotier", ZeroTierInfo) + mapTo("redis", RedisInfo) + mapTo("server", ServerInfo) + mapTo("system", SystemConfigInfo) + AppInfo.ProjectPath = getCurrentDirectory() //os.Getwd() +} + +//映射 +func mapTo(section string, v interface{}) { + err := Cfg.Section(section).MapTo(v) + if err != nil { + log.Fatalf("Cfg.MapTo %s err: %v", section, err) + } +} + +// 获取当前执行文件绝对路径(go run) +func getCurrentAbPathByCaller() string { + var abPath string + _, filename, _, ok := runtime.Caller(0) + if ok { + abPath = path.Dir(filename) + } + return abPath +} +func getCurrentDirectory() string { + dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + log.Fatal(err) + } + return strings.Replace(dir, "\\", "/", -1) +} diff --git a/pkg/ddns/emum.go b/pkg/ddns/emum.go new file mode 100644 index 0000000..30807e1 --- /dev/null +++ b/pkg/ddns/emum.go @@ -0,0 +1,15 @@ +package ddns + +const ( + GOGADDY = iota + GOOGLE +) + +const ( + A = "A" + AAAA = "AAAA" +) + +const ( + GODADDYAPIURL = "https://api.godaddy.com" +) diff --git a/pkg/docker/emum.go b/pkg/docker/emum.go new file mode 100644 index 0000000..fad329b --- /dev/null +++ b/pkg/docker/emum.go @@ -0,0 +1,3 @@ +package docker + +const NETWORKNAME = "oasis" diff --git a/pkg/docker/helper.go b/pkg/docker/helper.go new file mode 100644 index 0000000..a4f4a61 --- /dev/null +++ b/pkg/docker/helper.go @@ -0,0 +1,248 @@ +package docker + +import ( + "bytes" + json2 "encoding/json" + "fmt" + "github.com/gorilla/websocket" + "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh" + "io" + "regexp" + "strconv" + "sync" + "time" +) + +func NewSshClient() (*ssh.Client, error) { + config := &ssh.ClientConfig{ + Timeout: time.Second * 5, + User: "root", + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + //HostKeyCallback: , + //HostKeyCallback: hostKeyCallBackFunc(h.Host), + } + //if h.Type == "password" { + config.Auth = []ssh.AuthMethod{ssh.Password("123456")} + //} else { + // config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(h.Key)} + //} + addr := fmt.Sprintf("%s:%d", "192.168.2.142", 22) + c, err := ssh.Dial("tcp", addr, config) + if err != nil { + return nil, err + } + return c, nil +} + +// setup ssh shell session +// set Session and StdinPipe here, +// and the Session.Stdout and Session.Sdterr are also set. +func NewSshConn(cols, rows int, sshClient *ssh.Client) (*SshConn, error) { + sshSession, err := sshClient.NewSession() + if err != nil { + return nil, err + } + + stdinP, err := sshSession.StdinPipe() + if err != nil { + return nil, err + } + comboWriter := new(wsBufferWriter) + + sshSession.Stdout = comboWriter + sshSession.Stderr = comboWriter + + modes := ssh.TerminalModes{ + ssh.ECHO: 1, // disable echo + ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud + ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud + } + // Request pseudo terminal + if err := sshSession.RequestPty("xterm", rows, cols, modes); err != nil { + return nil, err + } + // Start remote shell + if err := sshSession.Shell(); err != nil { + return nil, err + } + return &SshConn{StdinPipe: stdinP, ComboOutput: comboWriter, Session: sshSession}, nil +} + +type SshConn struct { + // calling Write() to write data into ssh server + StdinPipe io.WriteCloser + // Write() be called to receive data from ssh server + ComboOutput *wsBufferWriter + Session *ssh.Session +} +type wsBufferWriter struct { + buffer bytes.Buffer + mu sync.Mutex +} + +func (w *wsBufferWriter) Write(p []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.buffer.Write(p) +} +func (s *SshConn) Close() { + if s.Session != nil { + s.Session.Close() + } + +} + +const ( + wsMsgCmd = "cmd" + wsMsgResize = "resize" +) + +//ReceiveWsMsg receive websocket msg do some handling then write into ssh.session.stdin +func (ssConn *SshConn) ReceiveWsMsg(wsConn *websocket.Conn, logBuff *bytes.Buffer, exitCh chan bool) { + //tells other go routine quit + defer setQuit(exitCh) + for { + select { + case <-exitCh: + return + default: + //read websocket msg + _, wsData, err := wsConn.ReadMessage() + if err != nil { + logrus.WithError(err).Error("reading webSocket message failed") + return + } + //unmashal bytes into struct + //msgObj := wsMsg{ + // Type: "cmd", + // Cmd: "", + // Rows: 50, + // Cols: 180, + //} + msgObj := wsMsg{} + if err := json2.Unmarshal(wsData, &msgObj); err != nil { + msgObj.Type = "cmd" + msgObj.Cmd = string(wsData) + } + //if err := json.Unmarshal(wsData, &msgObj); err != nil { + // logrus.WithError(err).WithField("wsData", string(wsData)).Error("unmarshal websocket message failed") + //} + switch msgObj.Type { + + case wsMsgResize: + //handle xterm.js size change + if msgObj.Cols > 0 && msgObj.Rows > 0 { + if err := ssConn.Session.WindowChange(msgObj.Rows, msgObj.Cols); err != nil { + logrus.WithError(err).Error("ssh pty change windows size failed") + } + } + case wsMsgCmd: + //handle xterm.js stdin + //decodeBytes, err := base64.StdEncoding.DecodeString(msgObj.Cmd) + decodeBytes := []byte(msgObj.Cmd) + if err != nil { + logrus.WithError(err).Error("websock cmd string base64 decoding failed") + } + if _, err := ssConn.StdinPipe.Write(decodeBytes); err != nil { + logrus.WithError(err).Error("ws cmd bytes write to ssh.stdin pipe failed") + } + //write input cmd to log buffer + if _, err := logBuff.Write(decodeBytes); err != nil { + logrus.WithError(err).Error("write received cmd into log buffer failed") + } + } + } + } +} + +func (ssConn *SshConn) SendComboOutput(wsConn *websocket.Conn, exitCh chan bool) { + //tells other go routine quit + //defer setQuit(exitCh) + + //every 120ms write combine output bytes into websocket response + tick := time.NewTicker(time.Millisecond * time.Duration(120)) + //for range time.Tick(120 * time.Millisecond){} + defer tick.Stop() + for { + select { + case <-tick.C: + //write combine output bytes into websocket response + if err := flushComboOutput(ssConn.ComboOutput, wsConn); err != nil { + logrus.WithError(err).Error("ssh sending combo output to webSocket failed") + return + } + case <-exitCh: + return + } + } +} +func flushComboOutput(w *wsBufferWriter, wsConn *websocket.Conn) error { + if w.buffer.Len() != 0 { + err := wsConn.WriteMessage(websocket.TextMessage, w.buffer.Bytes()) + if err != nil { + return err + } + w.buffer.Reset() + } + return nil +} +func (ssConn *SshConn) SessionWait(quitChan chan bool) { + if err := ssConn.Session.Wait(); err != nil { + logrus.WithError(err).Error("ssh session wait failed") + setQuit(quitChan) + } +} + +func setQuit(ch chan bool) { + ch <- true +} + +type wsMsg struct { + Type string `json:"type"` + Cmd string `json:"cmd"` + Cols int `json:"cols"` + Rows int `json:"rows"` +} + +// 将终端的输出转发到前端 +func WsWriterCopy(reader io.Reader, writer *websocket.Conn) { + buf := make([]byte, 8192) + reg1 := regexp.MustCompile(`stty rows \d+ && stty cols \d+ `) + for { + nr, err := reader.Read(buf) + if nr > 0 { + result1 := reg1.FindIndex(buf[0:nr]) + if len(result1) > 0 { + fmt.Println(result1) + } else { + err := writer.WriteMessage(websocket.BinaryMessage, buf[0:nr]) + if err != nil { + return + } + } + + } + if err != nil { + return + } + } +} + +// 将前端的输入转发到终端 +func WsReaderCopy(reader *websocket.Conn, writer io.Writer) { + for { + messageType, p, err := reader.ReadMessage() + if err != nil { + return + } + if messageType == websocket.TextMessage { + msgObj := wsMsg{} + if err = json2.Unmarshal(p, &msgObj); err != nil { + writer.Write(p) + } else if msgObj.Type == wsMsgResize { + writer.Write([]byte("stty rows " + strconv.Itoa(msgObj.Rows) + " && stty cols " + strconv.Itoa(msgObj.Cols) + " \r" )) + } + } + } +} diff --git a/pkg/docker/volumes.go b/pkg/docker/volumes.go new file mode 100644 index 0000000..eb9c657 --- /dev/null +++ b/pkg/docker/volumes.go @@ -0,0 +1,12 @@ +package docker + +func GetDir(id, envName string) string { + var path string + switch envName { + case "/config": + path = "/oasis/app_data/" + id + "/" + default: + //path = "/media" + } + return path +} diff --git a/pkg/github/github.go b/pkg/github/github.go new file mode 100644 index 0000000..ed007c1 --- /dev/null +++ b/pkg/github/github.go @@ -0,0 +1,25 @@ +package github + +import ( + "context" + "github.com/google/go-github/v36/github" + "golang.org/x/oauth2" +) + + +func GetGithubClient() *github.Client { + ctx := context.Background() + ts := oauth2.StaticTokenSource( + &oauth2.Token{AccessToken: "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"}, + ) + tc := oauth2.NewClient(ctx, ts) + client := github.NewClient(tc) + return client + + // list all repositories for the authenticated user + //repos, _, err := client.Repositories.List(ctx, "", nil) + + //fmt.Print(err) + //fmt.Print(repos) + +} diff --git a/pkg/github/github_test.go b/pkg/github/github_test.go new file mode 100644 index 0000000..fba1cd5 --- /dev/null +++ b/pkg/github/github_test.go @@ -0,0 +1,7 @@ +package github + +import "testing" + +func TestGetRepos(t *testing.T) { + GetRepos() +} diff --git a/pkg/gredis/redis.go b/pkg/gredis/redis.go new file mode 100644 index 0000000..994b1dc --- /dev/null +++ b/pkg/gredis/redis.go @@ -0,0 +1,33 @@ +package gredis + +import ( + "github.com/gomodule/redigo/redis" + "oasis/model" + "time" +) + +func GetRedisConn(m *model.RedisModel) *redis.Pool { + redisConn := &redis.Pool{ + MaxIdle: m.MaxIdle, + MaxActive: m.MaxActive, + IdleTimeout: m.IdleTimeout * time.Second, + Dial: func() (redis.Conn, error) { + c, err := redis.Dial("tcp", m.Host) + if err != nil { + return nil, err + } + if m.Password != "" { + if _, err := c.Do("AUTH", m.Password); err != nil { + c.Close() + return nil, err + } + } + return c, err + }, + TestOnBorrow: func(c redis.Conn, t time.Time) error { + _, err := c.Do("PING") + return err + }, + } + return redisConn +} diff --git a/pkg/sqlite/db.go b/pkg/sqlite/db.go new file mode 100644 index 0000000..21224fc --- /dev/null +++ b/pkg/sqlite/db.go @@ -0,0 +1,38 @@ +package sqlite + +import ( + "fmt" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "oasis/pkg/utils/file" + model2 "oasis/service/model" + "time" +) + +var gdb *gorm.DB + +func GetDb(projectPath string) *gorm.DB { + if gdb != nil { + return gdb + } + // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情 + //dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", m.User, m.PWD, m.IP, m.Port, m.DBName) + //db, err := gorm.Open(mysql2.Open(dsn), &gorm.Config{}) + file.IsNotExistMkDir(projectPath + "/db/") + db, err := gorm.Open(sqlite.Open(projectPath+"/db/casaOS.db"), &gorm.Config{}) + c, _ := db.DB() + c.SetMaxIdleConns(10) + c.SetMaxOpenConns(100) + c.SetConnMaxIdleTime(time.Second * 1000) + if err != nil { + fmt.Println("连接数据失败!") + panic("数据库连接失败") + return nil + } + gdb = db + err = db.AutoMigrate(&model2.TaskDBModel{}, &model2.AppNotify{}, &model2.AppListDBModel{}) + if err != nil { + fmt.Println("检查和创建数据库出错", err) + } + return db +} diff --git a/pkg/sqlite/db_test.go b/pkg/sqlite/db_test.go new file mode 100644 index 0000000..ebb3051 --- /dev/null +++ b/pkg/sqlite/db_test.go @@ -0,0 +1,15 @@ +package sqlite + +import ( + "testing" +) + +func TestGetDb(t *testing.T) { + // fmt.Println(GetDb()) + // db:=GetDb() + // d:=model.DDNSTypeDBModel{ + // Name: "test", + // ApiHost: "http://www.google.com", + // } + // db.Create(&d) +} diff --git a/pkg/upnp/device.go b/pkg/upnp/device.go new file mode 100644 index 0000000..d0b9e9d --- /dev/null +++ b/pkg/upnp/device.go @@ -0,0 +1,89 @@ +package upnp + +import ( + "encoding/xml" + "io/ioutil" + "net/http" + "strings" +) + +func GetCtrlUrl(host,device string) string { + request := ctrlUrlRequest(host, device) + response, _ := http.DefaultClient.Do(request) + resultBody, _ := ioutil.ReadAll(response.Body) + defer response.Body.Close() + if response.StatusCode == 200 { + return resolve(string(resultBody)) + + } + return "" +} + +func ctrlUrlRequest(host string, deviceDescUrl string) *http.Request { + //请求头 + header := http.Header{} + header.Set("Accept", "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2") + header.Set("User-Agent", "preston") + header.Set("Host", host) + header.Set("Connection", "keep-alive") + request, _ := http.NewRequest("GET", "http://"+host+deviceDescUrl, nil) + request.Header = header + return request +} + +func resolve(resultStr string) string { + inputReader := strings.NewReader(resultStr) + + // 从文件读取,如可以如下: + // content, err := ioutil.ReadFile("studygolang.xml") + // decoder := xml.NewDecoder(bytes.NewBuffer(content)) + + lastLabel := "" + + ISUpnpServer := false + + IScontrolURL := false + var controlURL string //`controlURL` + // var eventSubURL string //`eventSubURL` + // var SCPDURL string //`SCPDURL` + + decoder := xml.NewDecoder(inputReader) + for t, err := decoder.Token(); err == nil && !IScontrolURL; t, err = decoder.Token() { + switch token := t.(type) { + // 处理元素开始(标签) + case xml.StartElement: + if ISUpnpServer { + name := token.Name.Local + lastLabel = name + } + + // 处理元素结束(标签) + case xml.EndElement: + // log.Println("结束标记:", token.Name.Local) + // 处理字符数据(这里就是元素的文本) + case xml.CharData: + //得到url后其他标记就不处理了 + content := string([]byte(token)) + //找到提供端口映射的服务 + if content == "urn:schemas-upnp-org:service:WANIPConnection:1" { + ISUpnpServer = true + continue + } + + if ISUpnpServer { + switch lastLabel { + case "controlURL": + controlURL = content + IScontrolURL = true + case "eventSubURL": + // eventSubURL = content + case "SCPDURL": + // SCPDURL = content + } + } + default: + // ... + } + } + return controlURL +} \ No newline at end of file diff --git a/pkg/upnp/device_test.go b/pkg/upnp/device_test.go new file mode 100644 index 0000000..f848967 --- /dev/null +++ b/pkg/upnp/device_test.go @@ -0,0 +1,16 @@ +package upnp + +import ( + ip_helper2 "oasis/pkg/utils/ip_helper" + "testing" +) + +func TestGetCtrlUrl(t *testing.T) { + upnp, err := Gateway() + if err == nil { + upnp.CtrlUrl = GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + upnp.LocalHost = ip_helper2.GetLoclIp() + upnp.AddPortMapping(8090, 8090, "TCP") + //upnp.DelPortMapping(9999, "TCP") + } +} diff --git a/pkg/upnp/gateway.go b/pkg/upnp/gateway.go new file mode 100644 index 0000000..653ab80 --- /dev/null +++ b/pkg/upnp/gateway.go @@ -0,0 +1,76 @@ +package upnp + +import ( + "github.com/pkg/errors" + "net" + ip_helper2 "oasis/pkg/utils/ip_helper" + "strings" +) + +func Gateway() (*Upnp, error) { + result, error := send() + if result == "" || error != nil { + return nil, error + } + upnp := resolvesss(result) + return upnp, nil +} + +func send() (string, error) { + var str = "M-SEARCH * HTTP/1.1\r\n" + + "HOST: 239.255.255.250:1900\r\n" + + "ST: urn:schemas-upnp-org:service:WANIPConnection:1\r\n" + + "MAN: \"ssdp:discover\"\r\n" + "MX: 3\r\n\r\n" + var conn *net.UDPConn + remotAddr, err := net.ResolveUDPAddr("udp", "239.255.255.250:1900") + if err != nil { + return "", errors.New("组播地址格式不正确") + } + locaAddr, err := net.ResolveUDPAddr("udp", ip_helper2.GetLoclIp()+":") + + if err != nil { + return "", errors.New("本地ip地址格式不正确") + } + conn, err = net.ListenUDP("udp", locaAddr) + defer conn.Close() + if err != nil { + return "", errors.New("监听udp出错") + } + _, err = conn.WriteToUDP([]byte(str), remotAddr) + if err != nil { + return "", errors.New("发送msg到组播地址出错") + } + buf := make([]byte, 1024) + n, _, err := conn.ReadFromUDP(buf) + if err != nil { + return "", errors.New("从组播地址接搜消息出错") + } + result := string(buf[:n]) + return result, nil +} + +func resolvesss(result string) *Upnp { + var upnp = &Upnp{} + lines := strings.Split(result, "\r\n") + for _, line := range lines { + //按照第一个冒号分为两个字符串 + nameValues := strings.SplitAfterN(line, ":", 2) + if len(nameValues) < 2 { + continue + } + switch strings.ToUpper(strings.Trim(strings.Split(nameValues[0], ":")[0], " ")) { + case "ST": + //fmt.Println(nameValues[1]) + case "CACHE-CONTROL": + //fmt.Println(nameValues[1]) + case "LOCATION": + urls := strings.Split(strings.Split(nameValues[1], "//")[1], "/") + upnp.GatewayHost = (urls[0]) + upnp.DeviceDescUrl = ("/" + urls[1]) + case "SERVER": + upnp.GatewayName = (nameValues[1]) + default: + } + } + return upnp +} diff --git a/pkg/upnp/gateway_test.go b/pkg/upnp/gateway_test.go new file mode 100644 index 0000000..2fc42cb --- /dev/null +++ b/pkg/upnp/gateway_test.go @@ -0,0 +1,8 @@ +package upnp + +import "testing" + +func TestGateway(t *testing.T) { + + Gateway() +} \ No newline at end of file diff --git a/pkg/upnp/mapping.go b/pkg/upnp/mapping.go new file mode 100644 index 0000000..5bb2509 --- /dev/null +++ b/pkg/upnp/mapping.go @@ -0,0 +1,163 @@ +package upnp + +import ( + "bytes" + "github.com/pkg/errors" + "net/http" + "strconv" + "strings" +) + +// +////添加一个端口映射 +func (n *Upnp)AddPortMapping(localPort, remotePort int, protocol string) (err error) { + defer func(err error) { + if errTemp := recover(); errTemp != nil { + //log.Println("upnp模块报错了", errTemp) + err = errTemp.(error) + } + }(err) + if issuccess := addSend(localPort, remotePort, protocol,n.GatewayHost, n.CtrlUrl,n.LocalHost); issuccess { + return nil + } else { + return errors.New("添加一个端口映射失败") + } + return +} + +func addSend(localPort, remotePort int, protocol, host, ctrUrl,localHost string) bool { + request := addRequest(localPort, remotePort, protocol, host, ctrUrl,localHost) + response, _ := http.DefaultClient.Do(request) + defer response.Body.Close() + //resultBody, _ := ioutil.ReadAll(response.Body) + //fmt.Println(string(resultBody)) + if response.StatusCode == 200 { + return true + } + + return false +} + +type Node struct { + Name string + Content string + Attr map[string]string + Child []Node +} + +func addRequest(localPort, remotePort int, protocol string, gatewayHost, ctlUrl,localHost string) *http.Request { + //请求头 + header := http.Header{} + header.Set("Accept", "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2") + header.Set("SOAPAction", `"urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"`) + header.Set("Content-Type", "text/xml") + header.Set("Connection", "Close") + header.Set("Content-Length", "") + //请求体 + body := Node{Name: "SOAP-ENV:Envelope", + Attr: map[string]string{"xmlns:SOAP-ENV": `"http://schemas.xmlsoap.org/soap/envelope/"`, + "SOAP-ENV:encodingStyle": `"http://schemas.xmlsoap.org/soap/encoding/"`}} + childOne := Node{Name: `SOAP-ENV:Body`} + childTwo := Node{Name: `m:AddPortMapping`, + Attr: map[string]string{"xmlns:m": `"urn:schemas-upnp-org:service:WANIPConnection:1"`}} + + childList1 := Node{Name: "NewExternalPort", Content: strconv.Itoa(remotePort)} + childList2 := Node{Name: "NewInternalPort", Content: strconv.Itoa(localPort)} + childList3 := Node{Name: "NewProtocol", Content: protocol} + childList4 := Node{Name: "NewEnabled", Content: "1"} + childList5 := Node{Name: "NewInternalClient", Content: localHost} + childList6 := Node{Name: "NewLeaseDuration", Content: "0"} + childList7 := Node{Name: "NewPortMappingDescription", Content: "Oasis"} + childList8 := Node{Name: "NewRemoteHost"} + childTwo.AddChild(childList1) + childTwo.AddChild(childList2) + childTwo.AddChild(childList3) + childTwo.AddChild(childList4) + childTwo.AddChild(childList5) + childTwo.AddChild(childList6) + childTwo.AddChild(childList7) + childTwo.AddChild(childList8) + + childOne.AddChild(childTwo) + body.AddChild(childOne) + bodyStr := body.BuildXML() + //请求 + request, _ := http.NewRequest("POST", "http://"+gatewayHost+ctlUrl, + strings.NewReader(bodyStr)) + request.Header = header + request.Header.Set("Content-Length", strconv.Itoa(len([]byte(bodyStr)))) + return request +} + +func (n *Node) AddChild(node Node) { + n.Child = append(n.Child, node) +} + +func (n *Node) BuildXML() string { + buf := bytes.NewBufferString("<") + buf.WriteString(n.Name) + for key, value := range n.Attr { + buf.WriteString(" ") + buf.WriteString(key + "=" + value) + } + buf.WriteString(">" + n.Content) + + for _, node := range n.Child { + buf.WriteString(node.BuildXML()) + } + buf.WriteString("") + return buf.String() +} + +func (n *Upnp)DelPortMapping(remotePort int, protocol string) bool { + issuccess := delSendSend(remotePort, protocol,n.GatewayHost,n.CtrlUrl) + if issuccess { + //this.MappingPort.delMapping(remotePort, protocol) + //fmt.Println("删除了一个端口映射: remote:", remotePort) + } + return issuccess +} + +func delSendSend(remotePort int, protocol,host,ctlUrl string) bool { + delrequest := delbuildRequest(remotePort, protocol,host,ctlUrl) + response, _ := http.DefaultClient.Do(delrequest) + //resultBody, _ := ioutil.ReadAll(response.Body) + defer response.Body.Close() + if response.StatusCode == 200 { + // log.Println(string(resultBody)) + return true + } + return false +} +func delbuildRequest(remotePort int, protocol,host,ctlUrl string) *http.Request { + //请求头 + header := http.Header{} + header.Set("Accept", "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2") + header.Set("SOAPAction", `"urn:schemas-upnp-org:service:WANIPConnection:1#DeletePortMapping"`) + header.Set("Content-Type", "text/xml") + header.Set("Connection", "Close") + header.Set("Content-Length", "") + //请求体 + body := Node{Name: "SOAP-ENV:Envelope", + Attr: map[string]string{"xmlns:SOAP-ENV": `"http://schemas.xmlsoap.org/soap/envelope/"`, + "SOAP-ENV:encodingStyle": `"http://schemas.xmlsoap.org/soap/encoding/"`}} + childOne := Node{Name: `SOAP-ENV:Body`} + childTwo := Node{Name: `m:DeletePortMapping`, + Attr: map[string]string{"xmlns:m": `"urn:schemas-upnp-org:service:WANIPConnection:1"`}} + childList1 := Node{Name: "NewExternalPort", Content: strconv.Itoa(remotePort)} + childList2 := Node{Name: "NewProtocol", Content: protocol} + childList3 := Node{Name: "NewRemoteHost"} + childTwo.AddChild(childList1) + childTwo.AddChild(childList2) + childTwo.AddChild(childList3) + childOne.AddChild(childTwo) + body.AddChild(childOne) + bodyStr := body.BuildXML() + + //请求 + request, _ := http.NewRequest("POST", "http://"+host+ctlUrl, + strings.NewReader(bodyStr)) + request.Header = header + request.Header.Set("Content-Length", strconv.Itoa(len([]byte(bodyStr)))) + return request +} \ No newline at end of file diff --git a/pkg/upnp/mapping_test.go b/pkg/upnp/mapping_test.go new file mode 100644 index 0000000..08e4fbf --- /dev/null +++ b/pkg/upnp/mapping_test.go @@ -0,0 +1,7 @@ +package upnp + +import "testing" + +func TestAddPortMapping(t *testing.T) { + //AddPortMapping(6666,6666,"TCP","192.168.2.1:5000",) +} diff --git a/pkg/upnp/upnp.go b/pkg/upnp/upnp.go new file mode 100644 index 0000000..3b5e013 --- /dev/null +++ b/pkg/upnp/upnp.go @@ -0,0 +1,26 @@ +package upnp + +import ( + "fmt" + "github.com/prestonTao/upnp" +) + +type Upnp struct { + LocalHost string `json:"local_host"` + GatewayName string `json:"gateway_name"` //网关名称 + GatewayHost string `json:"gateway_host"` //网关ip和端口 + DeviceDescUrl string `json:"device_desc_url"` //设备描述url + CtrlUrl string `json:"ctrl_url"` //控制请求url +} + +func Testaaa() { + upnpMan := new(upnp.Upnp) + err := upnpMan.SearchGateway() + if err != nil { + fmt.Println(err.Error()) + } else { + fmt.Println("local ip address: ", upnpMan.LocalHost) + fmt.Println("gateway ip address: ", upnpMan.Gateway.Host) + } +} + diff --git a/pkg/upnp/upnp_test.go b/pkg/upnp/upnp_test.go new file mode 100644 index 0000000..e7a1e5f --- /dev/null +++ b/pkg/upnp/upnp_test.go @@ -0,0 +1,9 @@ +package upnp + +import ( + "testing" +) + +func TestTestaaa(t *testing.T) { + (Testaaa()) +} \ No newline at end of file diff --git a/pkg/utils/command/command_helper.go b/pkg/utils/command/command_helper.go new file mode 100644 index 0000000..26dd4c3 --- /dev/null +++ b/pkg/utils/command/command_helper.go @@ -0,0 +1,90 @@ +package command + +import ( + "bufio" + "fmt" + "io/ioutil" + "os/exec" +) + +func OnlyExec(cmdStr string) { + cmd := exec.Command("/bin/bash", "-c", cmdStr) + stdout, err := cmd.StdoutPipe() + if err != nil { + return + } + defer stdout.Close() + if err := cmd.Start(); err != nil { + return + } + cmd.Wait() + return +} + +func ExecResultStrArray(cmdStr string) []string { + cmd := exec.Command("/bin/bash", "-c", cmdStr) + stdout, err := cmd.StdoutPipe() + if err != nil { + fmt.Println(err) + return nil + } + defer stdout.Close() + if err = cmd.Start(); err != nil { + fmt.Println(err) + return nil + } + //str, err := ioutil.ReadAll(stdout) + var networklist = []string{} + outputBuf := bufio.NewReader(stdout) + for { + output, _, err := outputBuf.ReadLine() + if err != nil { + if err.Error() != "EOF" { + fmt.Printf("Error :%s\n", err) + } + break + } + networklist = append(networklist, string(output)) + } + cmd.Wait() + return networklist +} + +func ExecResultStr(cmdStr string) string { + cmd := exec.Command("/bin/bash", "-c", cmdStr) + stdout, err := cmd.StdoutPipe() + if err != nil { + fmt.Println(err) + return "" + } + defer stdout.Close() + if err := cmd.Start(); err != nil { + fmt.Println(err) + return "" + } + str, err := ioutil.ReadAll(stdout) + cmd.Wait() + if err != nil { + fmt.Println(err) + return "" + } + return string(str) +} + +//执行 lsblk 命令 +func ExecLSBLK() []byte { + output, err := exec.Command("lsblk", "-O", "-J", "-b").Output() + if err != nil { + return nil + } + return output +} + +//执行 lsblk 命令 +func ExecLSBLKByPath(path string) []byte { + output, err := exec.Command("lsblk", path, "-O", "-J", "-b").Output() + if err != nil { + return nil + } + return output +} diff --git a/pkg/utils/file/file.go b/pkg/utils/file/file.go new file mode 100644 index 0000000..ed355fe --- /dev/null +++ b/pkg/utils/file/file.go @@ -0,0 +1,128 @@ +package file + +import ( + "fmt" + "io/ioutil" + "mime/multipart" + "os" + "path" +) + +// GetSize get the file size +func GetSize(f multipart.File) (int, error) { + content, err := ioutil.ReadAll(f) + return len(content), err +} + +// GetExt get the file ext +func GetExt(fileName string) string { + return path.Ext(fileName) +} + +// CheckNotExist check if the file exists +func CheckNotExist(src string) bool { + _, err := os.Stat(src) + + return os.IsNotExist(err) +} + +// CheckPermission check if the file has permission +func CheckPermission(src string) bool { + _, err := os.Stat(src) + + return os.IsPermission(err) +} + +// IsNotExistMkDir create a directory if it does not exist +func IsNotExistMkDir(src string) error { + if notExist := CheckNotExist(src); notExist == true { + if err := MkDir(src); err != nil { + return err + } + } + + return nil +} + +// MkDir create a directory +func MkDir(src string) error { + err := os.MkdirAll(src, os.ModePerm) + if err != nil { + return err + } + + return nil +} + +// RMDir remove a directory +func RMDir(src string) error { + err := os.RemoveAll(src) + if err != nil { + return err + } + os.Remove(src) + return nil +} + +// Open a file according to a specific mode +func Open(name string, flag int, perm os.FileMode) (*os.File, error) { + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + + return f, nil +} + +// MustOpen maximize trying to open the file +func MustOpen(fileName, filePath string) (*os.File, error) { + //dir, err := os.Getwd() + //if err != nil { + // return nil, fmt.Errorf("os.Getwd err: %v", err) + //} + + src := filePath + perm := CheckPermission(src) + if perm == true { + return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src) + } + + err := IsNotExistMkDir(src) + if err != nil { + return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err) + } + + f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) + if err != nil { + return nil, fmt.Errorf("Fail to OpenFile :%v", err) + } + + return f, nil +} + + +// 判断所给路径文件/文件夹是否存在 +func Exists(path string) bool { + _, err := os.Stat(path) //os.Stat获取文件信息 + if err != nil { + if os.IsExist(err) { + return true + } + return false + } + return true +} + +// 判断所给路径是否为文件夹 +func IsDir(path string) bool { + s, err := os.Stat(path) + if err != nil { + return false + } + return s.IsDir() +} + +// 判断所给路径是否为文件 +func IsFile(path string) bool { + return !IsDir(path) +} diff --git a/pkg/utils/httper/httper.go b/pkg/utils/httper/httper.go new file mode 100644 index 0000000..7481446 --- /dev/null +++ b/pkg/utils/httper/httper.go @@ -0,0 +1,200 @@ +package httper + +import ( + "bytes" + "encoding/json" + "github.com/tidwall/gjson" + "io" + "io/ioutil" + "net/http" + "oasis/pkg/config" + "time" +) + +//发送GET请求 +//url:请求地址 +//response:请求返回的内容 +func Get(url string, head map[string]string) (response string) { + client := http.Client{Timeout: 30 * time.Second} + req, err := http.NewRequest("GET", url, nil) + req.BasicAuth() + for k, v := range head { + req.Header.Add(k, v) + } + if err != nil { + return "" + } + resp, err := client.Do(req) + if err != nil { + //需要错误日志的处理 + //loger.Error(error) + return "" + //panic(error) + } + defer resp.Body.Close() + var buffer [512]byte + result := bytes.NewBuffer(nil) + for { + n, err := resp.Body.Read(buffer[0:]) + result.Write(buffer[0:n]) + if err != nil && err == io.EOF { + break + } else if err != nil { + //loger.Error(err) + return "" + // panic(err) + } + } + response = result.String() + return +} + +//发送POST请求 +//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +//content:请求放回的内容 +func Post(url string, data interface{}, contentType string) (content string) { + jsonStr, _ := json.Marshal(data) + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) + req.Header.Add("content-type", contentType) + if err != nil { + panic(err) + } + + client := &http.Client{Timeout: 5 * time.Second} + resp, error := client.Do(req) + if error != nil { + panic(error) + } + defer resp.Body.Close() + + result, _ := ioutil.ReadAll(resp.Body) + content = string(result) + return +} + +//发送POST请求 +//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +//content:请求放回的内容 +func ZeroTierPost(url string, data map[string]string, head map[string]string, cookies []*http.Cookie) (content string, code int) { + b, _ := json.Marshal(data) + req, err := http.NewRequest("POST", url, bytes.NewReader(b)) + for _, cookie := range cookies { + req.AddCookie(cookie) + } + for k, v := range head { + req.Header.Add(k, v) + } + if err != nil { + panic(err) + } + + client := &http.Client{Timeout: 20 * time.Second} + resp, error := client.Do(req) + + if error != nil { + panic(error) + } + defer resp.Body.Close() + code = resp.StatusCode + result, _ := ioutil.ReadAll(resp.Body) + content = string(result) + return +} + +//发送POST请求 +//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +//content:请求放回的内容 +func ZeroTierPostJson(url string, data string, head map[string]string) (content string, code int) { + var postData *bytes.Buffer + + jsonStr := []byte(data) + postData = bytes.NewBuffer(jsonStr) + + req, err := http.NewRequest("POST", url, postData) + for k, v := range head { + req.Header.Add(k, v) + } + if err != nil { + panic(err) + } + + client := &http.Client{Timeout: 20 * time.Second} + resp, error := client.Do(req) + + if error != nil { + panic(error) + } + defer resp.Body.Close() + result, _ := ioutil.ReadAll(resp.Body) + content = string(result) + code = resp.StatusCode + return +} + +func ZeroTierDelete(url string, head map[string]string) (content string, code int) { + + req, err := http.NewRequest("DELETE", url, nil) + for k, v := range head { + req.Header.Add(k, v) + } + if err != nil { + panic(err) + } + + client := &http.Client{Timeout: 20 * time.Second} + resp, error := client.Do(req) + + if error != nil { + panic(error) + } + defer resp.Body.Close() + result, _ := ioutil.ReadAll(resp.Body) + content = string(result) + code = resp.StatusCode + return +} + +//发送POST请求 +//url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +//content:请求放回的内容 +func ZeroTierGet(url string, head map[string]string) (content string, code int) { + req, err := http.NewRequest(http.MethodGet, url, nil) + for k, v := range head { + req.Header.Add(k, v) + } + if err != nil { + panic(err) + } + + client := &http.Client{Timeout: 20 * time.Second} + resp, error := client.Do(req) + + if error != nil { + panic(error) + } + defer resp.Body.Close() + code = resp.StatusCode + result, _ := ioutil.ReadAll(resp.Body) + content = string(result) + return +} + +//发送GET请求 +//url:请求地址 +//response:请求返回的内容 +func OasisGet(url string) (response string) { + + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + return Get(url, head) + +} diff --git a/pkg/utils/ini_helper.go b/pkg/utils/ini_helper.go new file mode 100644 index 0000000..d4b585b --- /dev/null +++ b/pkg/utils/ini_helper.go @@ -0,0 +1 @@ +package utils diff --git a/pkg/utils/ip_helper/ip.go b/pkg/utils/ip_helper/ip.go new file mode 100644 index 0000000..1571e05 --- /dev/null +++ b/pkg/utils/ip_helper/ip.go @@ -0,0 +1,41 @@ +package ip_helper + +import ( + "net" + httper2 "oasis/pkg/utils/httper" + "strings" +) + +func IsIPv4(address string) bool { + return strings.Count(address, ":") < 2 +} +func IsIPv6(address string) bool { + return strings.Count(address, ":") >= 2 +} + +//获取外网ip +func GetExternalIPV4() string { + return httper2.Get("https://api.ipify.org", nil) +} + +//获取外网ip +func GetExternalIPV6() string { + return httper2.Get("https://api6.ipify.org", nil) +} + +//获取本地ip +func GetLoclIp() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "127.0.0.1" + } + for _, address := range addrs { + if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + return ipnet.IP.String() + } + + } + } + return "127.0.0.1" +} diff --git a/pkg/utils/ip_helper/ip_test.go b/pkg/utils/ip_helper/ip_test.go new file mode 100644 index 0000000..dfbf5aa --- /dev/null +++ b/pkg/utils/ip_helper/ip_test.go @@ -0,0 +1,22 @@ +package ip_helper + +import ( + "fmt" + "testing" +) + +func TestGetExternalIPV4(t *testing.T) { + ipv4 := make(chan string) + go func() { ipv4 <- GetExternalIPV4() }() + fmt.Println(<-ipv4) +} +func TestGetExternalIPV6(t *testing.T) { + ipv6 := make(chan string) + go func() { ipv6 <- GetExternalIPV6() }() + fmt.Println(<-ipv6) + +} + +func TestGetLoclIp(t *testing.T) { + fmt.Println(GetLoclIp()) +} diff --git a/pkg/utils/jwt/jwt.go b/pkg/utils/jwt/jwt.go new file mode 100644 index 0000000..77ec820 --- /dev/null +++ b/pkg/utils/jwt/jwt.go @@ -0,0 +1,46 @@ +package jwt + +import ( + jwt "github.com/dgrijalva/jwt-go" + "time" +) + +type Claims struct { + UserName string `json:"username"` + PassWord string `json:"password"` + jwt.StandardClaims +} + +var jwtSecret []byte + +//创建token +func GenerateToken(username, password string) (string, error) { + nowTime := time.Now() + expireTime := nowTime.Add(3 * time.Hour) + clims := Claims{ + username, + password, + jwt.StandardClaims{ + ExpiresAt: expireTime.Unix(), + Issuer: "gin-blog", + }, + } + + tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, clims) + token, err := tokenClaims.SignedString(jwtSecret) + return token, err + +} + +//解析token +func ParseToken(token string) (*Claims, error) { + tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { + return jwtSecret, nil + }) + if tokenClaims != nil { + if clims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid { + return clims, nil + } + } + return nil, err +} diff --git a/pkg/utils/jwt/jwt_helper.go b/pkg/utils/jwt/jwt_helper.go new file mode 100644 index 0000000..23e7098 --- /dev/null +++ b/pkg/utils/jwt/jwt_helper.go @@ -0,0 +1,52 @@ +package jwt + +import ( + "fmt" + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + loger2 "oasis/pkg/utils/loger" + oasis_err2 "oasis/pkg/utils/oasis_err" + "time" +) + +func JWT(swagHandler gin.HandlerFunc) gin.HandlerFunc { + return func(c *gin.Context) { + var code int + code = oasis_err2.SUCCESS + token := c.GetHeader("Authorization") + if len(token) == 0 { + token = c.Query("token") + } + if token == "" { + code = oasis_err2.INVALID_PARAMS + } + if swagHandler == nil { + claims, err := ParseToken(token) + if err != nil { + code = oasis_err2.ERROR_AUTH_TOKEN + + } else if time.Now().Unix() > claims.ExpiresAt { + code = oasis_err2.ERROR_AUTH_TOKEN + } + } + + if code != oasis_err2.SUCCESS { + c.JSON(http.StatusOK, model.Result{Success: code, Message: oasis_err2.GetMsg(code)}) + c.Abort() + return + } + c.Next() + } +} + +//获取token +func GetToken(username, pwd string) string { + token, err := GenerateToken(username, pwd) + if err == nil { + return token + } else { + loger2.NewOLoger().Fatal(fmt.Sprintf("Get Token Fail: %V", err)) + return "" + } +} diff --git a/pkg/utils/loger/log.go b/pkg/utils/loger/log.go new file mode 100644 index 0000000..88129b2 --- /dev/null +++ b/pkg/utils/loger/log.go @@ -0,0 +1,102 @@ +package loger + +import ( + "fmt" + "log" + "oasis/pkg/config" + file2 "oasis/pkg/utils/file" + "os" + "path/filepath" + "runtime" + "time" +) + +//定义一个int的别名 +type Level int + +type OLog interface { + Debug(v ...interface{}) + Info(v ...interface{}) + Warn(v ...interface{}) + Error(v ...interface{}) + Fatal(v ...interface{}) +} + +type oLog struct { +} + +var ( + F *os.File + DefaultPrefix = "" + DefaultCallerDepth = 2 + logger *log.Logger + logPrefix = "" + levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"} +) + +//iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 +const ( + DEBUG Level = iota + INFO + WARN + ERROR + FATAL +) + +//日志初始化 +func LogSetup() { + var err error + filePath := fmt.Sprintf("%s", config.AppInfo.LogSavePath) + fileName := fmt.Sprintf("%s%s.%s", + config.AppInfo.LogSaveName, + time.Now().Format(config.AppInfo.DateStrFormat), + config.AppInfo.LogFileExt, + ) + F, err = file2.MustOpen(fileName, filePath) + if err != nil { + log.Fatalf("logging.Setup err: %v", err) + } + + logger = log.New(F, DefaultPrefix, log.LstdFlags) + +} + +func (o *oLog) Debug(v ...interface{}) { + setPrefix(DEBUG) + logger.Println(v) +} + +func (o *oLog) Info(v ...interface{}) { + setPrefix(INFO) + logger.Println(v) +} + +func (o *oLog) Warn(v ...interface{}) { + setPrefix(WARN) + logger.Println(v) +} + +func (o *oLog) Error(v ...interface{}) { + setPrefix(ERROR) + logger.Println(v) +} + +func (o *oLog) Fatal(v ...interface{}) { + setPrefix(FATAL) + logger.Println(v) +} + +func setPrefix(level Level) { + _, file, line, ok := runtime.Caller(DefaultCallerDepth) + if ok { + logPrefix = fmt.Sprintf("[%s][%s:%d]", levelFlags[level], filepath.Base(file), line) + } else { + logPrefix = fmt.Sprintf("[%s]", levelFlags[level]) + } + + logger.SetPrefix(logPrefix) +} + +func NewOLoger() OLog { + return &oLog{} +} diff --git a/pkg/utils/oasis_err/e.go b/pkg/utils/oasis_err/e.go new file mode 100644 index 0000000..8ce043c --- /dev/null +++ b/pkg/utils/oasis_err/e.go @@ -0,0 +1,66 @@ +package oasis_err + +const ( + SUCCESS = 200 + ERROR = 500 + INVALID_PARAMS = 400 + ERROR_AUTH_TOKEN = 401 + + //user + PWD_INVALID = 10001 + + //system + DIR_ALREADY_EXISTS = 20001 + + //zerotier + GET_TOKEN_ERROR = 30001 + + //app + UNINSTALL_APP_ERROR = 50001 + PULL_IMAGE_ERROR = 50002 + DEVICE_NOT_EXIST = 50003 + + //file + FILE_DOES_NOT_EXIST = 60001 + FILE_READ_ERROR = 60002 + + //shortcuts + SHORTCUTS_URL_ERROR = 70001 +) + +var MsgFlags = map[int]string{ + SUCCESS: "ok", + ERROR: "fail", + INVALID_PARAMS: "Invalid params", + ERROR_AUTH_TOKEN: "error auth token", + + //user + PWD_INVALID: "Password invalid", + + //system + DIR_ALREADY_EXISTS: "Directory already exists", + + + //zerotier + GET_TOKEN_ERROR: "Get token error,Please log in to zerotier's official website to confirm whether the account is available", + + //app + UNINSTALL_APP_ERROR: "uninstall app error", + PULL_IMAGE_ERROR: "pull image error", + DEVICE_NOT_EXIST: "device not exist", + + // + FILE_DOES_NOT_EXIST: "file does not exist", + + FILE_READ_ERROR: "file read error", + SHORTCUTS_URL_ERROR: "url error", +} + +//获取错误信息 +func GetMsg(code int) string { + msg, ok := MsgFlags[code] + if ok { + return msg + } + return MsgFlags[ERROR] +} diff --git a/pkg/utils/port/port.go b/pkg/utils/port/port.go new file mode 100644 index 0000000..0f1fdba --- /dev/null +++ b/pkg/utils/port/port.go @@ -0,0 +1,67 @@ +package port + +import ( + "fmt" + "net" +) + +// 获取可用端口 +func GetAvailablePort(t string) (int, error) { + address := fmt.Sprintf("%s:0", "0.0.0.0") + if t == "udp" { + add, err := net.ResolveUDPAddr(t, address) + if err != nil { + return 0, err + } + + listener, err := net.ListenUDP(t, add) + if err != nil { + return 0, err + } + + defer listener.Close() + return listener.LocalAddr().(*net.UDPAddr).Port, nil + } else { + add, err := net.ResolveTCPAddr(t, address) + if err != nil { + return 0, err + } + + listener, err := net.ListenTCP(t, add) + if err != nil { + return 0, err + } + + defer listener.Close() + return listener.Addr().(*net.TCPAddr).Port, nil + } + +} + +// 判断端口是否可以(未被占用) +// param t tcp/udp +func IsPortAvailable(port int, t string) bool { + address := fmt.Sprintf("%s:%d", "0.0.0.0", port) + if t == "udp" { + sadd, err := net.ResolveUDPAddr("udp", address) + uc, err := net.ListenUDP("udp", sadd) + + if err != nil { + return false + } else { + defer uc.Close() + return true + } + + } else { + listener, err := net.Listen(t, address) + + if err != nil { + //log.Infof("port %s is taken: %s", address, err) + return false + } + defer listener.Close() + return true + } + +} diff --git a/pkg/utils/port/port_test.go b/pkg/utils/port/port_test.go new file mode 100644 index 0000000..85a4140 --- /dev/null +++ b/pkg/utils/port/port_test.go @@ -0,0 +1,18 @@ +package port + +import ( + "fmt" + "testing" +) + +func TestPortAvailable(t *testing.T) { + // fmt.Println(PortAvailable()) + //fmt.Println(IsPortAvailable(6881,"tcp")) + p, _ := GetAvailablePort("udp") + fmt.Println("udp", p) + fmt.Println(IsPortAvailable(p, "udp")) + + t1, _ := GetAvailablePort("tcp") + fmt.Println("tcp", t1) + fmt.Println(IsPortAvailable(t1, "tcp")) +} diff --git a/pkg/utils/random/random.go b/pkg/utils/random/random.go new file mode 100644 index 0000000..6909cad --- /dev/null +++ b/pkg/utils/random/random.go @@ -0,0 +1,24 @@ +package random + +import ( + "math/rand" + "time" +) + +func RandomString(n int, onlyLetter bool) string { + + var letters []rune + + if onlyLetter { + letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + } else { + letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + } + + b := make([]rune, n) + rand.Seed(time.Now().UnixNano()) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} diff --git a/pkg/utils/random/random_test.go b/pkg/utils/random/random_test.go new file mode 100644 index 0000000..a9b5d31 --- /dev/null +++ b/pkg/utils/random/random_test.go @@ -0,0 +1,10 @@ +package random + +import ( + "fmt" + "testing" +) + +func TestRandomString(t *testing.T) { + fmt.Println(RandomString(6,true)) +} \ No newline at end of file diff --git a/pkg/utils/sort/app_info_dev.go b/pkg/utils/sort/app_info_dev.go new file mode 100644 index 0000000..9efa958 --- /dev/null +++ b/pkg/utils/sort/app_info_dev.go @@ -0,0 +1,73 @@ +package sort + +import ( + "oasis/model" + "sort" +) + +// 数据集类型, 与上一篇排序文章(多字段单独排序)比较, less字段的数据类型不再是 func(p1, p2 *Change) bool +// 而是 []func(p1, p2 *Change) bool 因为在第一个比较的值相等的情况下, 还要比较第二个值, 所以这里需要多个比较函数 +type devSorter struct { + dev []model.Devices + less []lessFuncDev +} + +// sort接口方法之一(Less) +type lessFuncDev func(p1, p2 *model.Devices) bool + +// Sort 函数有两个作用 +// 第一, 将参数(实际的数据集)赋值给ms对象 +// 第二, 调用内置sort函数进行排序操作 +func (ms *devSorter) Sort(dev []model.Devices) { + ms.dev = dev + sort.Sort(ms) +} + +// OrderedBy 函数的作用是返回一个multiSorter实例, 并将所有的实际排序函数赋值给实例的less字段, +// 上面已经为multiSorter结构体定义了Sort方法, 所以该函数的返回值可以直接调用Sort方法进行排序 +// 该函数中, 为multiSorter结构体中的less字段赋值, Sort方法中又将实际数据集传入, 赋值给multiSorter的ports字段 +// 一个函数, 一个方法调用过后, multiSorter实例中两个字段就已经全部被正确赋值, 可以调用系统sort函数进行排序 +// 该函数也可看作是一个工厂方法, 用来生成less字段已经被赋值的multiSorter实例 +func DevSort(less ...lessFuncDev) *devSorter { + return &devSorter{ + less: less, + } +} + +// Len 为sort接口方法之一 +func (ms *devSorter) Len() int { + return len(ms.dev) +} + +// Swap 为sort接口方法之一 +func (ms *devSorter) Swap(i, j int) { + ms.dev[i], ms.dev[j] = ms.dev[j], ms.dev[i] +} + +// Less 为sort接口方法之一 +func (ms *devSorter) Less(i, j int) bool { + temp := ms.dev + p, q := &temp[i], &temp[j] + // Try all but the last comparison. + var k int + // 由于可能有多个需要排序的字段, 也就对应了多个less函数, 当第一个字段的值相等时, + // 需要依次尝试比对后续其他字段的值得大小, 所以这里需要获取比较函数的长度, 以便遍历比较 + for k = 0; k < len(ms.less)-1; k++ { + // 提取比较函数, 将函数赋值到新的变量中以便调用 + less := ms.less[k] + switch { + case less(p, q): + // 如果 p < q, 返回值为true, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + // 如果 p > q, 返回值为false, 则调到下一个case中处理 + return true + case less(q, p): + // 如果 p > q, 返回值为false, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + return false + } + // 如果代码走到这里, 说明ms.less[k]函数比较后 p == q; 重新开始下一次循环, 更换到下一个比较函数处理 + continue + } + // 如果代码走到这里, 说明所有的比较函数执行过后, 所有比较的值都相等 + // 直接返回最后一次的比较结果数据即可 + return ms.less[k](p, q) +} diff --git a/pkg/utils/sort/app_info_evn.go b/pkg/utils/sort/app_info_evn.go new file mode 100644 index 0000000..2f13842 --- /dev/null +++ b/pkg/utils/sort/app_info_evn.go @@ -0,0 +1,73 @@ +package sort + +import ( + "oasis/model" + "sort" +) + +// 数据集类型, 与上一篇排序文章(多字段单独排序)比较, less字段的数据类型不再是 func(p1, p2 *Change) bool +// 而是 []func(p1, p2 *Change) bool 因为在第一个比较的值相等的情况下, 还要比较第二个值, 所以这里需要多个比较函数 +type evnSorter struct { + evn []model.Envs + less []lessFuncEnv +} + +// sort接口方法之一(Less) +type lessFuncEnv func(p1, p2 *model.Envs) bool + +// Sort 函数有两个作用 +// 第一, 将参数(实际的数据集)赋值给ms对象 +// 第二, 调用内置sort函数进行排序操作 +func (ms *evnSorter) Sort(env []model.Envs) { + ms.evn = env + sort.Sort(ms) +} + +// OrderedBy 函数的作用是返回一个multiSorter实例, 并将所有的实际排序函数赋值给实例的less字段, +// 上面已经为multiSorter结构体定义了Sort方法, 所以该函数的返回值可以直接调用Sort方法进行排序 +// 该函数中, 为multiSorter结构体中的less字段赋值, Sort方法中又将实际数据集传入, 赋值给multiSorter的ports字段 +// 一个函数, 一个方法调用过后, multiSorter实例中两个字段就已经全部被正确赋值, 可以调用系统sort函数进行排序 +// 该函数也可看作是一个工厂方法, 用来生成less字段已经被赋值的multiSorter实例 +func EnvSort(less ...lessFuncEnv) *evnSorter { + return &evnSorter{ + less: less, + } +} + +// Len 为sort接口方法之一 +func (ms *evnSorter) Len() int { + return len(ms.evn) +} + +// Swap 为sort接口方法之一 +func (ms *evnSorter) Swap(i, j int) { + ms.evn[i], ms.evn[j] = ms.evn[j], ms.evn[i] +} + +// Less 为sort接口方法之一 +func (ms *evnSorter) Less(i, j int) bool { + temp := ms.evn + p, q := &temp[i], &temp[j] + // Try all but the last comparison. + var k int + // 由于可能有多个需要排序的字段, 也就对应了多个less函数, 当第一个字段的值相等时, + // 需要依次尝试比对后续其他字段的值得大小, 所以这里需要获取比较函数的长度, 以便遍历比较 + for k = 0; k < len(ms.less)-1; k++ { + // 提取比较函数, 将函数赋值到新的变量中以便调用 + less := ms.less[k] + switch { + case less(p, q): + // 如果 p < q, 返回值为true, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + // 如果 p > q, 返回值为false, 则调到下一个case中处理 + return true + case less(q, p): + // 如果 p > q, 返回值为false, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + return false + } + // 如果代码走到这里, 说明ms.less[k]函数比较后 p == q; 重新开始下一次循环, 更换到下一个比较函数处理 + continue + } + // 如果代码走到这里, 说明所有的比较函数执行过后, 所有比较的值都相等 + // 直接返回最后一次的比较结果数据即可 + return ms.less[k](p, q) +} diff --git a/pkg/utils/sort/app_info_port.go b/pkg/utils/sort/app_info_port.go new file mode 100644 index 0000000..19121a9 --- /dev/null +++ b/pkg/utils/sort/app_info_port.go @@ -0,0 +1,73 @@ +package sort + +import ( + "oasis/model" + "sort" +) + +// 数据集类型, 与上一篇排序文章(多字段单独排序)比较, less字段的数据类型不再是 func(p1, p2 *Change) bool +// 而是 []func(p1, p2 *Change) bool 因为在第一个比较的值相等的情况下, 还要比较第二个值, 所以这里需要多个比较函数 +type multiSorter struct { + ports []model.Ports + less []lessFunc +} + +// sort接口方法之一(Less) +type lessFunc func(p1, p2 *model.Ports) bool + +// Sort 函数有两个作用 +// 第一, 将参数(实际的数据集)赋值给ms对象 +// 第二, 调用内置sort函数进行排序操作 +func (ms *multiSorter) Sort(ports []model.Ports) { + ms.ports = ports + sort.Sort(ms) +} + +// OrderedBy 函数的作用是返回一个multiSorter实例, 并将所有的实际排序函数赋值给实例的less字段, +// 上面已经为multiSorter结构体定义了Sort方法, 所以该函数的返回值可以直接调用Sort方法进行排序 +// 该函数中, 为multiSorter结构体中的less字段赋值, Sort方法中又将实际数据集传入, 赋值给multiSorter的ports字段 +// 一个函数, 一个方法调用过后, multiSorter实例中两个字段就已经全部被正确赋值, 可以调用系统sort函数进行排序 +// 该函数也可看作是一个工厂方法, 用来生成less字段已经被赋值的multiSorter实例 +func PortsSort(less ...lessFunc) *multiSorter { + return &multiSorter{ + less: less, + } +} + +// Len 为sort接口方法之一 +func (ms *multiSorter) Len() int { + return len(ms.ports) +} + +// Swap 为sort接口方法之一 +func (ms *multiSorter) Swap(i, j int) { + ms.ports[i], ms.ports[j] = ms.ports[j], ms.ports[i] +} + +// Less 为sort接口方法之一 +func (ms *multiSorter) Less(i, j int) bool { + port := ms.ports + p, q := &port[i], &port[j] + // Try all but the last comparison. + var k int + // 由于可能有多个需要排序的字段, 也就对应了多个less函数, 当第一个字段的值相等时, + // 需要依次尝试比对后续其他字段的值得大小, 所以这里需要获取比较函数的长度, 以便遍历比较 + for k = 0; k < len(ms.less)-1; k++ { + // 提取比较函数, 将函数赋值到新的变量中以便调用 + less := ms.less[k] + switch { + case less(p, q): + // 如果 p < q, 返回值为true, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + // 如果 p > q, 返回值为false, 则调到下一个case中处理 + return true + case less(q, p): + // 如果 p > q, 返回值为false, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + return false + } + // 如果代码走到这里, 说明ms.less[k]函数比较后 p == q; 重新开始下一次循环, 更换到下一个比较函数处理 + continue + } + // 如果代码走到这里, 说明所有的比较函数执行过后, 所有比较的值都相等 + // 直接返回最后一次的比较结果数据即可 + return ms.less[k](p, q) +} diff --git a/pkg/utils/sort/app_info_vol.go b/pkg/utils/sort/app_info_vol.go new file mode 100644 index 0000000..1df1444 --- /dev/null +++ b/pkg/utils/sort/app_info_vol.go @@ -0,0 +1,73 @@ +package sort + +import ( + "oasis/model" + "sort" +) + +// 数据集类型, 与上一篇排序文章(多字段单独排序)比较, less字段的数据类型不再是 func(p1, p2 *Change) bool +// 而是 []func(p1, p2 *Change) bool 因为在第一个比较的值相等的情况下, 还要比较第二个值, 所以这里需要多个比较函数 +type volSorter struct { + vol []model.Volume + less []lessFuncVol +} + +// sort接口方法之一(Less) +type lessFuncVol func(p1, p2 *model.Volume) bool + +// Sort 函数有两个作用 +// 第一, 将参数(实际的数据集)赋值给ms对象 +// 第二, 调用内置sort函数进行排序操作 +func (ms *volSorter) Sort(vol []model.Volume) { + ms.vol = vol + sort.Sort(ms) +} + +// OrderedBy 函数的作用是返回一个multiSorter实例, 并将所有的实际排序函数赋值给实例的less字段, +// 上面已经为multiSorter结构体定义了Sort方法, 所以该函数的返回值可以直接调用Sort方法进行排序 +// 该函数中, 为multiSorter结构体中的less字段赋值, Sort方法中又将实际数据集传入, 赋值给multiSorter的ports字段 +// 一个函数, 一个方法调用过后, multiSorter实例中两个字段就已经全部被正确赋值, 可以调用系统sort函数进行排序 +// 该函数也可看作是一个工厂方法, 用来生成less字段已经被赋值的multiSorter实例 +func VolSort(less ...lessFuncVol) *volSorter { + return &volSorter{ + less: less, + } +} + +// Len 为sort接口方法之一 +func (ms *volSorter) Len() int { + return len(ms.vol) +} + +// Swap 为sort接口方法之一 +func (ms *volSorter) Swap(i, j int) { + ms.vol[i], ms.vol[j] = ms.vol[j], ms.vol[i] +} + +// Less 为sort接口方法之一 +func (ms *volSorter) Less(i, j int) bool { + temp := ms.vol + p, q := &temp[i], &temp[j] + // Try all but the last comparison. + var k int + // 由于可能有多个需要排序的字段, 也就对应了多个less函数, 当第一个字段的值相等时, + // 需要依次尝试比对后续其他字段的值得大小, 所以这里需要获取比较函数的长度, 以便遍历比较 + for k = 0; k < len(ms.less)-1; k++ { + // 提取比较函数, 将函数赋值到新的变量中以便调用 + less := ms.less[k] + switch { + case less(p, q): + // 如果 p < q, 返回值为true, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + // 如果 p > q, 返回值为false, 则调到下一个case中处理 + return true + case less(q, p): + // 如果 p > q, 返回值为false, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回 + return false + } + // 如果代码走到这里, 说明ms.less[k]函数比较后 p == q; 重新开始下一次循环, 更换到下一个比较函数处理 + continue + } + // 如果代码走到这里, 说明所有的比较函数执行过后, 所有比较的值都相等 + // 直接返回最后一次的比较结果数据即可 + return ms.less[k](p, q) +} diff --git a/pkg/utils/version/version.go b/pkg/utils/version/version.go new file mode 100644 index 0000000..301c89b --- /dev/null +++ b/pkg/utils/version/version.go @@ -0,0 +1,37 @@ +package version + +import ( + json2 "encoding/json" + "github.com/tidwall/gjson" + "oasis/model" + "oasis/pkg/config" + "oasis/pkg/utils/httper" + "oasis/types" + "strconv" + "strings" +) + +func IsNeedUpdate() (bool, model.Version) { + var version model.Version + v := httper.OasisGet(config.ServerInfo.ServerApi + "/v1/sys/version") + data := gjson.Get(v, "data") + json2.Unmarshal([]byte(data.String()), &version) + + v1 := strings.Split(version.Version, ".") + v2 := strings.Split(types.CURRENTVERSION, ".") + + for len(v1) < len(v2) { + v1 = append(v1, "0") + } + for len(v2) < len(v1) { + v2 = append(v2, "0") + } + for i := 0; i < len(v1); i++ { + a, _ := strconv.Atoi(v1[i]) + b, _ := strconv.Atoi(v2[i]) + if a > b { + return true, version + } + } + return false, version +} diff --git a/pkg/zerotier/zerotier_api.go b/pkg/zerotier/zerotier_api.go new file mode 100644 index 0000000..33d5778 --- /dev/null +++ b/pkg/zerotier/zerotier_api.go @@ -0,0 +1,48 @@ +package zerotier + +import ( + "github.com/tidwall/gjson" + "net/http" + httper2 "oasis/pkg/utils/httper" +) + +func PostData(url,token string, data string) interface{} { + + + body, code := httper2.ZeroTierPostJson(url, data, GetHead(token)) + + if code != http.StatusOK { + return "" + } + result := gjson.Parse(body) + return result.Value() +} + +func GetData(url, token string) interface{} { + + body, code := httper2.ZeroTierGet(url, GetHead(token)) + + if code != http.StatusOK { + return "" + } + result := gjson.Parse(body) + return result.Value() +} + +func DeleteMember(url, token string) interface{} { + + body, code := httper2.ZeroTierDelete(url, GetHead(token)) + + if code != http.StatusOK { + return "" + } + result := gjson.Parse(body) + return result.Value() +} + +func GetHead(token string) map[string]string { + var head = make(map[string]string) + head["Authorization"] = "Bearer " + token + head["Content-Type"] = "application/json" + return head +} diff --git a/route/doc.go b/route/doc.go new file mode 100644 index 0000000..c09a928 --- /dev/null +++ b/route/doc.go @@ -0,0 +1,13 @@ +// +build doc + +package route + +import ( + ginSwagger "github.com/swaggo/gin-swagger" + "github.com/swaggo/gin-swagger/swaggerFiles" + _ "oasis/docs" +) + +func init() { + swagHandler = ginSwagger.WrapHandler(swaggerFiles.Handler) +} diff --git a/route/route.go b/route/route.go new file mode 100644 index 0000000..5a5a259 --- /dev/null +++ b/route/route.go @@ -0,0 +1,256 @@ +package route + +import ( + "github.com/gin-gonic/gin" + "net/http" + "oasis/middleware" + "oasis/pkg/config" + jwt2 "oasis/pkg/utils/jwt" + v1 "oasis/route/v1" + "oasis/web" +) + +var swagHandler gin.HandlerFunc + +func InitRouter(swagHandler gin.HandlerFunc) *gin.Engine { + + r := gin.Default() + r.Use(middleware.Cors()) + gin.SetMode(config.ServerInfo.RunMode) + + r.StaticFS("/ui", http.FS(web.Static)) + r.GET("/", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "ui/") + }) + if swagHandler != nil { + r.GET("/swagger/*any", swagHandler) + } + //登录 + r.POST("/v1/user/login", v1.Login) + + r.GET("/debug", v1.GetSystemConfigDebug) + + v1Group := r.Group("/v1") + + v1Group.Use(jwt2.JWT(swagHandler)) + { + v1UserGroup := v1Group.Group("/user") + v1UserGroup.Use() + { + //设置用户 + v1UserGroup.POST("/setusernamepwd", v1.Set_Name_Pwd) + //chang head + v1UserGroup.POST("/changhead", v1.Up_Load_Head) + //chang user name + v1UserGroup.PUT("/changusername", v1.Chang_User_Name) + //chang pwd + v1UserGroup.PUT("/changuserpwd", v1.Chang_User_Pwd) + //edit user info + v1UserGroup.POST("/changuserinfo", v1.Chang_User_Info) + //get user info + v1UserGroup.GET("/info", v1.UserInfo) + } + + v1ZiMaGroup := v1Group.Group("/zima") + v1ZiMaGroup.Use() + { + //获取cpu信息 + v1ZiMaGroup.GET("/getcpuinfo", v1.CupInfo) + //获取内存信息 + v1ZiMaGroup.GET("/getmeminfo", v1.MemInfo) + //获取硬盘信息 + v1ZiMaGroup.GET("/getdiskinfo", v1.DiskInfo) + + //获取网络信息 + v1ZiMaGroup.GET("/getnetinfo", v1.NetInfo) + //获取网络信息 + v1ZiMaGroup.GET("/getinfo", v1.Info) + //获取系统信息 + v1ZiMaGroup.GET("/sysinfo", v1.SysInfo) + } + + v1ZeroTierGroup := v1Group.Group("/zerotier") + v1ZeroTierGroup.Use() + { + //获取zerotier token + v1ZeroTierGroup.POST("/login", v1.ZeroTierGetToken) + //注册zerotier + v1ZeroTierGroup.POST("/register", v1.ZeroTierRegister) + //是否需要登录 + v1ZeroTierGroup.GET("/islogin", v1.ZeroTierIsNeedLogin) + //获取网络列表 + v1ZeroTierGroup.GET("/list", v1.ZeroTierGetNetworkList) + //加入网络 + v1ZeroTierGroup.POST("/join/:id", v1.ZeroTierJoinNetwork) + //离开网络 + v1ZeroTierGroup.POST("/leave/:id", v1.ZeroTierLeaveNetwork) + //详情 + v1ZeroTierGroup.GET("/info/:id", v1.ZeroTierGetNetworkGetInfo) + ////网络状态 + //v1ZeroTierGroup.GET("/status", v1.ZeroTierGetNetworkGetStatus) + //修改网络类型 + //v1ZeroTierGroup.PUT("/type/:id", v1.ZeroTierEditType) + //修改网络类型 + //v1ZeroTierGroup.PUT("/name/:id", v1.ZeroTierEditName) + //修改v6 assign + //v1ZeroTierGroup.PUT("/v6assign/:id", v1.ZeroTierEditV6Assign) + //修改 broadcast + //v1ZeroTierGroup.PUT("/broadcast/:id", v1.ZeroTierEditBroadcast) + //create new network + v1ZeroTierGroup.POST("/create", v1.ZeroTierCreateNetwork) + //获取用户列表 + v1ZeroTierGroup.GET("/member/:id", v1.ZeroTierMemberList) + //修改用户信息 + //v1ZeroTierGroup.PUT("/members/:id/auth/:mId", v1.ZeroTierMemberAuth) + //修改网络用户name + //v1ZeroTierGroup.PUT("/members/:id/name/:mId", v1.ZeroTierMemberName) + v1ZeroTierGroup.DELETE("/members/:id/del/:mId", v1.ZeroTierMemberDelete) + v1ZeroTierGroup.DELETE("/network/:id/del", v1.ZeroTierDeleteNetwork) + //修改网络用户bridge功能 + //v1ZeroTierGroup.PUT("/members/:id/bridge/:mId", v1.ZeroTierMemberBridge) + v1ZeroTierGroup.PUT("/edit/:id", v1.ZeroTierEdit) + v1ZeroTierGroup.GET("/joined/list", v1.ZeroTierJoinedList) + v1ZeroTierGroup.PUT("/member/:id/edit/:mId", v1.ZeroTierMemberEdit) + + } + v1DDNSGroup := v1Group.Group("/ddns") + v1DDNSGroup.Use() + { + //获取ddns列表 + v1DDNSGroup.GET("/getlist", v1.DDNSGetDomainList) + //测试连接性 + v1DDNSGroup.GET("/ping/:api_host", v1.DDNSPing) + //获取ip + v1DDNSGroup.GET("/ip", v1.DDNSGetIP) + //设置ddns + v1DDNSGroup.POST("/set", v1.DDNSAddConfig) + //获取ddns + v1DDNSGroup.GET("/list", v1.DDNSConfigList) + //获取ddns + v1DDNSGroup.DELETE("/delete/:id", v1.DDNSDelete) + } + v1AppGroup := v1Group.Group("/app") + v1AppGroup.Use() + { + //获取我的已安装的列表 + v1AppGroup.GET("/mylist", v1.MyAppList) + //app详情 + v1AppGroup.GET("/appinfo/:id", v1.AppInfo) + //获取未安装的列表 + v1AppGroup.GET("/list", v1.AppList) + //获取端口 + v1AppGroup.GET("/port", v1.GetPort) + //检查端口 + v1AppGroup.GET("/check/:port", v1.PortCheck) + //分类 + v1AppGroup.GET("/category", v1.CategoryList) + //容器相关 + v1AppGroup.GET("/terminal/:id", v1.DockerTerminal) + //准备安装 + //v1AppGroup.GET("/ready/:id", v1.ReadyInstall) + //app容器详情 + v1AppGroup.GET("/info/:id", v1.ContainerInfo) + //app容器日志 + v1AppGroup.GET("/logs/:id", v1.ContainerLog) + //暂停或启动容器 + v1AppGroup.PUT("/state/:id", v1.ChangAppState) + //安装app + v1AppGroup.POST("/install/:id", v1.InstallApp) + //卸载app + v1AppGroup.DELETE("/uninstall/:id", v1.UnInstallApp) + //获取安装进度 + v1AppGroup.GET("/speed/:id", v1.GetInstallSpeed) + //获取进度 + v1AppGroup.GET("/state/:id", v1.GetContainerState) + //更新容器配置 + v1AppGroup.PUT("/update/:id/setting", v1.UpdateSetting) + //获取可能新数据 + v1AppGroup.GET("/update/:id/info", v1.ContainerUpdateInfo) + v1AppGroup.GET("/rely/:id/info", v1.ContainerRelyInfo) + v1AppGroup.GET("/install/config", v1.GetDockerInstallConfig) + //v1AppGroup.POST("/custom/install", v1.CustomInstallApp) + + } + + v1SysGroup := v1Group.Group("/sys") + v1SysGroup.Use() + { + //获取检查版本是否需要升级 + v1SysGroup.GET("/check", v1.CheckVersion) + v1SysGroup.POST("/update", v1.SystemUpdate) + v1SysGroup.GET("/sys", v1.Sys) + v1SysGroup.GET("/wsssh", v1.WsSsh) + v1SysGroup.GET("/config", v1.GetSystemConfig) + v1SysGroup.POST("/config", v1.PostSetSystemConfig) + } + v1FileGroup := v1Group.Group("/file") + v1FileGroup.Use() + { + //修改文件名称/目录名称 + v1FileGroup.PUT("/rename", v1.RenamePath) + v1FileGroup.GET("/read", v1.GetFilerContent) + v1FileGroup.POST("/upload", v1.PostFileUpload) + v1FileGroup.GET("/dirpath", v1.DirPath) + //创建目录 + v1FileGroup.POST("/mkdir", v1.MkdirAll) + + v1FileGroup.GET("/download", v1.GetDownloadFile) + //v1FileGroup.GET("/download", v1.UserFileDownloadCommonService) + } + v1DiskGroup := v1Group.Group("/disk") + v1DiskGroup.Use() + { + //获取磁盘列表 + v1DiskGroup.GET("/list", v1.GetPlugInDisk) + + //获取磁盘详情 + v1DiskGroup.GET("/info", v1.GetDiskInfo) + + //格式化磁盘 + v1DiskGroup.POST("/format", v1.FormatDisk) + + //添加分区 + v1DiskGroup.POST("/addpart", v1.AddPartition) + + //获取可以格式化的内容 + v1DiskGroup.GET("/type", v1.FormatDiskType) + + //删除分区 + v1DiskGroup.DELETE("/delpart", v1.RemovePartition) + + } + v1ShareGroup := v1Group.Group("/share") + v1ShareGroup.Use() + { + v1ShareGroup.POST("/add", v1.PostShareDirAdd) + v1ShareGroup.DELETE("/del/:id", v1.DeleteShareDirDel) + v1ShareGroup.GET("/list", v1.GetShareDirList) + v1ShareGroup.GET("/info/:id", v1.GetShareDirInfo) + v1ShareGroup.PUT("/update/:id", v1.PutShareDirEdit) + } + v1TaskGroup := v1Group.Group("/task") + v1TaskGroup.Use() + { + v1TaskGroup.GET("/list", v1.GetTaskList) + v1TaskGroup.PUT("/update", v1.PutTaskUpdate) + v1TaskGroup.POST("/add", v1.PostTaskAdd) + v1TaskGroup.PUT("/completion/:id", v1.PutTaskMarkerCompletion) + + } + v1ShortcutsGroup := v1Group.Group("/shortcuts") + v1ShortcutsGroup.Use() + { + v1ShortcutsGroup.GET("/list", v1.GetShortcutsList) + v1ShortcutsGroup.POST("/add", v1.PostShortcutsAdd) + v1ShortcutsGroup.PUT("/edit", v1.PutShortcutsEdit) + v1ShortcutsGroup.DELETE("/del/:id", v1.DeleteShortcutsDelete) + } + v1NotifyGroup := v1Group.Group("/notify") + v1NotifyGroup.Use() + { + v1NotifyGroup.GET("/ws", v1.NotifyWS) + v1NotifyGroup.PUT("/read/:id", v1.PutNotifyRead) + } + } + return r +} diff --git a/route/v1/app.go b/route/v1/app.go new file mode 100644 index 0000000..f89e28d --- /dev/null +++ b/route/v1/app.go @@ -0,0 +1,182 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/utils/file" + oasis_err2 "oasis/pkg/utils/oasis_err" + port2 "oasis/pkg/utils/port" + "oasis/pkg/utils/sort" + "oasis/service" + "strconv" +) + +// @Summary 获取远程列表 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param index query int false "页码" +// @Param size query int false "每页数量" +// @Param category_id query int false "分类id" +// @Param type query string false "rank,new" +// @Param key query string false "search key" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/list [get] +func AppList(c *gin.Context) { + + //service.MyService.Docker().DockerContainerCommit("test2") + + index := c.DefaultQuery("index", "1") + size := c.DefaultQuery("size", "10") + t := c.DefaultQuery("type", "rank") + categoryId := c.DefaultQuery("category_id", "0") + key := c.DefaultQuery("key", "") + list, count := service.MyService.OAPI().GetServerList(index, size, t, categoryId, key) + for i := 0; i < len(list); i++ { + ct, _ := service.MyService.Docker().DockerListByImage(list[i].Image, list[i].ImageVersion) + if ct != nil { + list[i].State = ct.State + } + } + data := make(map[string]interface{}, 2) + data["count"] = count + data["items"] = list + + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) +} + +// @Summary 获取一个可用端口 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param type query string true "端口类型 udp/tcp" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/getport [get] +func GetPort(c *gin.Context) { + t := c.DefaultQuery("type", "tcp") + var p int + ok := true + for ok { + p, _ = port2.GetAvailablePort(t) + ok = !port2.IsPortAvailable(p, t) + } + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: p}) +} + +// @Summary 检查端口是否可用 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param port path int true "端口号" +// @Param type query string true "端口类型 udp/tcp" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/check/{port} [get] +func PortCheck(c *gin.Context) { + p, _ := strconv.Atoi(c.Param("port")) + t := c.DefaultQuery("type", "tcp") + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: port2.IsPortAvailable(p, t)}) +} + +// @Summary 我的应用列表 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Security ApiKeyAuth +// @Param index query int false "index" +// @Param size query int false "size" +// @Param position query bool false "是否是首页应用" +// @Success 200 {string} string "ok" +// @Router /app/mylist [get] +func MyAppList(c *gin.Context) { + index, _ := strconv.Atoi(c.DefaultQuery("index", "1")) + size, _ := strconv.Atoi(c.DefaultQuery("size", "0")) + position, _ := strconv.ParseBool(c.DefaultQuery("position", "true")) + list := service.MyService.App().GetMyList(index, size, position) + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list}) +} + +// @Summary 应用详情 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path int true "id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/appinfo/{id} [get] +func AppInfo(c *gin.Context) { + + id := c.Param("id") + info := service.MyService.App().GetServerAppInfo(id) + if info.NetworkModel != "host" { + port, _ := port2.GetAvailablePort("tcp") + info.PortMap = uint(port) + for i := 0; i < len(info.Configures.TcpPorts); i++ { + info.Configures.TcpPorts[i].CommendPort, _ = port2.GetAvailablePort("tcp") + } + for i := 0; i < len(info.Configures.UdpPorts); i++ { + info.Configures.UdpPorts[i].CommendPort, _ = port2.GetAvailablePort("udp") + } + } else { + info.PortMap = info.TcpPort + } + + for i := 0; i < len(info.Configures.Devices); i++ { + if !file.CheckNotExist(info.Configures.Devices[i].ContainerPath) { + info.Configures.Devices[i].Path = info.Configures.Devices[i].ContainerPath + } + } + + portOrder := func(c1, c2 *model.Ports) bool { + return c1.Type < c2.Type + } + + envOrder := func(c1, c2 *model.Envs) bool { + return c1.Type < c2.Type + } + + volOrder := func(c1, c2 *model.Volume) bool { + return c1.Type < c2.Type + } + + devOrder := func(c1, c2 *model.Devices) bool { + return c1.Type < c2.Type + } + + //sort + if info.NetworkModel != "host" { + sort.PortsSort(portOrder).Sort(info.Configures.TcpPorts) + sort.PortsSort(portOrder).Sort(info.Configures.UdpPorts) + } + + sort.EnvSort(envOrder).Sort(info.Configures.Envs) + sort.VolSort(volOrder).Sort(info.Configures.Volumes) + sort.DevSort(devOrder).Sort(info.Configures.Devices) + + info.MaxMemory = service.MyService.ZiMa().GetMemInfo().Total >> 20 + + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 获取远程分类列表 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/category [get] +func CategoryList(c *gin.Context) { + list := service.MyService.OAPI().GetServerCategoryList() + var count uint = 0 + for _, category := range list { + count += category.Count + } + + rear := append([]model.ServerCategoryList{}, list[0:]...) + list = append(list[:0], model.ServerCategoryList{Count: count, Name: "All"}) + list = append(list, rear...) + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list}) +} diff --git a/route/v1/ddns.go b/route/v1/ddns.go new file mode 100644 index 0000000..56ca9be --- /dev/null +++ b/route/v1/ddns.go @@ -0,0 +1,174 @@ +package v1 + +import ( + "fmt" + "github.com/forease/gotld" + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + ip_helper2 "oasis/pkg/utils/ip_helper" + oasis_err2 "oasis/pkg/utils/oasis_err" + "oasis/service" + model2 "oasis/service/model" + "os/exec" + "strconv" + "strings" +) + +// @Summary 获取可以设置的ddns列表 +// @Produce application/json +// @Accept application/json +// @Tags ddns +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/getlist [get] +func DDNSGetDomainList(c *gin.Context) { + + host, domain, tld := gotld.GetSubdomain("bbb.aaa.liru-05.com.cn", 3) + fmt.Println(strings.Replace(host, "."+domain, "", 1)) + fmt.Println(domain) + fmt.Println(tld) + + data := make(map[string]interface{}, 2) + t, api := service.MyService.DDNS().GetType("godaddy") + data["godaddy"] = &model.GoDaddyModel{Type: t, ApiHost: api} + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: data, + }) + return +} + +// @Summary 添加新的ddns(按给定模型返回内容) +// @Produce application/json +// @Accept multipart/form-data +// @Tags ddns +// @Param type formData string true "类型" +// @Param host formData string true "host" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/set [post] +func DDNSAddConfig(c *gin.Context) { + t, _ := strconv.Atoi(c.PostForm("type")) + host := c.PostForm("host") + _, domain, _ := gotld.GetSubdomain("host", 3) + sub := strings.ReplaceAll(host, "."+domain, "") + + if service.MyService.DDNS().IsExis(t, domain, sub) { + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.ERROR, + Message: "Repeat add", + }) + return + } + var m model2.DDNSUpdataDBModel + c.Bind(&m) + if err := service.MyService.DDNS().SaveConfig(m); err != nil { + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.ERROR, + Message: oasis_err2.GetMsg(oasis_err2.ERROR), + Data: err.Error(), + }) + return + } + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + }) +} + +// @Summary 获取ip,仅做展示使用 +// @Produce application/json +// @Accept application/json +// @Tags ddns +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/ip [get] +func DDNSGetIP(c *gin.Context) { + ipv4, ipv6 := service.MyService.DDNS().GetExternalIP() + var ipjson = make(map[string]string, 2) + ipjson["ipv4"] = ipv4 + ipjson["ipv6"] = ipv6 + c.JSON(http.StatusOK, &model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: ipjson, + }) +} + +// @Summary 测试网址是否可以ping通 +// @Produce application/json +// @Accept application/json +// @Tags ddns +// @Param api_host path int true "api地址" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/ping/{api_host} [get] +func DDNSPing(c *gin.Context) { + url := c.Param("api_host") + url = strings.ReplaceAll(url, "https://", "") + url = strings.ReplaceAll(url, "http://", "") + cmd := exec.Command("ping", url, "-c", "1", "-W", "5") + err := cmd.Run() + if err != nil { + c.JSON(http.StatusOK, &model.Result{ + Success: oasis_err2.ERROR, + Message: err.Error(), + Data: false, + }) + } else { + c.JSON(http.StatusOK, &model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: true, + }) + } +} + +// @Summary 获取已设置的列表 +// @Produce application/json +// @Accept application/json +// @Tags ddns +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/list [get] +func DDNSConfigList(c *gin.Context) { + j := service.MyService.DDNS().GetConfigList() + ip4 := ip_helper2.GetExternalIPV4() + ip6 := ip_helper2.GetExternalIPV6() + for i := 0; i < len(*j); i++ { + (*j)[i].IPV6 = ip6 + (*j)[i].IPV4 = ip4 + cmd := exec.Command("ping", (*j)[i].Host+"."+(*j)[i].Domain, "-c", "1", "-W", "3") + err := cmd.Run() + if err != nil { + (*j)[i].State = false + } else { + (*j)[i].State = true + } + } + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: j}) +} + +// @Summary 删除ddns +// @Produce application/json +// @Accept application/json +// @Tags ddns +// @Param id path int true "ID" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /ddns/delete/{id} [delete] +func DDNSDelete(c *gin.Context) { + id, err := strconv.ParseUint(c.Param("id"), 10, 32) + if err != nil { + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + isok := service.MyService.DDNS().DeleteConfig(uint(id)) + c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: isok}) +} diff --git a/route/v1/disk.go b/route/v1/disk.go new file mode 100644 index 0000000..12df25b --- /dev/null +++ b/route/v1/disk.go @@ -0,0 +1,178 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "github.com/shirou/gopsutil/v3/disk" + "net/http" + "oasis/model" + "oasis/pkg/utils/oasis_err" + "oasis/service" + "strconv" +) + +// @Summary 获取磁盘列表 +// @Produce application/json +// @Accept application/json +// @Tags disk +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /disk/list [get] +func GetPlugInDisk(c *gin.Context) { + + //ls := service.MyService.Disk().GetPlugInDisk() + //fmt.Println(ls) + //dd, _ := disk.Partitions(true) + //fmt.Println(dd) + // + //dir, err := ioutil.ReadDir("/sys/block") + //if err != nil { + // panic(err) + //} + // + //files := make([]string, 0) + // + ////fmt.Println(regexp.MatchString("sd[a-z]*[0-9]", "sda")) + // + //for _, f := range dir { + // if match, _ := regexp.MatchString("sd[a-z]", f.Name()); match { + // files = append(files, f.Name()) + // } + //} + //fmt.Println(files) + //filess := make([]string, 0) + //for _, file := range files { + // dirs, _ := ioutil.ReadDir("/sys/block/" + file) + // + // for _, f := range dirs { + // if match, _ := regexp.MatchString("sd[a-z]*[0-9]", f.Name()); match { + // filess = append(filess, f.Name()) + // } + // } + //} + //fmt.Println(filess) + // + //for _, s := range filess { + // fmt.Println(disk.Usage("/dev/" + s)) + //} + + lst := service.MyService.Disk().LSBLK() + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: lst}) +} + +// @Summary 获取磁盘列表 +// @Produce application/json +// @Accept application/json +// @Tags disk +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /disk/lists [get] +func GetPlugInDisks(c *gin.Context) { + + list := service.MyService.Disk().LSBLK() + var result []*disk.UsageStat + for _, item := range list { + result = append(result, service.MyService.Disk().GetDiskInfoByPath(item.Path)) + } + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: result}) +} + +// @Summary 磁盘详情 +// @Produce application/json +// @Accept application/json +// @Tags disk +// @Security ApiKeyAuth +// @Param path query string true "要获取的磁盘详情 例如/dev/sda" +// @Success 200 {string} string "ok" +// @Router /disk/info [get] +func GetDiskInfo(c *gin.Context) { + path := c.Query("path") + if len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + } + m := service.MyService.Disk().GetDiskInfo(path) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: m}) +} + +// @Summary 磁盘详情 +// @Produce application/json +// @Accept multipart/form-data +// @Tags disk +// @Security ApiKeyAuth +// @Param path formData string true "磁盘路径 例如/dev/sda1" +// @Success 200 {string} string "ok" +// @Router /disk/format [post] +func FormatDisk(c *gin.Context) { + path := c.PostForm("path") + + t := c.PostForm("type") + + if len(path) == 0 || len(t) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + } + + //删除挂载点 + service.MyService.Disk().UmountPointAndRemoveDir(path) + + //格式化磁盘 + service.MyService.Disk().FormatDisk(path, t) + + //重新挂载 + + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +// @Summary 获取支持的格式 +// @Produce application/json +// @Accept application/json +// @Tags disk +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /disk/type [get] +func FormatDiskType(c *gin.Context) { + var strArr = [4]string{"fat32", "ntfs", "ext4", "exfat"} + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: strArr}) + +} + +// @Summary 删除分区 +// @Produce application/json +// @Accept multipart/form-data +// @Tags disk +// @Security ApiKeyAuth +// @Param path formData string true "磁盘路径 例如/dev/sda1" +// @Success 200 {string} string "ok" +// @Router /disk/delpart [delete] +func RemovePartition(c *gin.Context) { + path := c.PostForm("path") + + if len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + } + var p = path[:len(path)-1] + var n = path[len(path)-1:] + service.MyService.Disk().DelPartition(p, n) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +// @Summary 添加分区 +// @Produce application/json +// @Accept multipart/form-data +// @Tags disk +// @Security ApiKeyAuth +// @Param path formData string true "磁盘路径 例如/dev/sda" +// @Param size formData string true "需要分区容量大小(MB)" +// @Param num formData string true "磁盘符号" +// @Success 200 {string} string "ok" +// @Router /disk/addpart [post] +func AddPartition(c *gin.Context) { + path := c.PostForm("path") + size, _ := strconv.Atoi(c.DefaultPostForm("size", "0")) + num := c.DefaultPostForm("num", "9") + if len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + } + + //size*1024*1024/512 + service.MyService.Disk().AddPartition(path, num, uint64(size*1024*2)) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} diff --git a/route/v1/docker.go b/route/v1/docker.go new file mode 100644 index 0000000..aef7209 --- /dev/null +++ b/route/v1/docker.go @@ -0,0 +1,1162 @@ +package v1 + +import ( + "bytes" + json2 "encoding/json" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "github.com/jinzhu/copier" + uuid "github.com/satori/go.uuid" + "net/http" + "oasis/model" + "oasis/pkg/docker" + upnp2 "oasis/pkg/upnp" + "oasis/pkg/utils/file" + ip_helper2 "oasis/pkg/utils/ip_helper" + oasis_err2 "oasis/pkg/utils/oasis_err" + port2 "oasis/pkg/utils/port" + "oasis/pkg/utils/random" + "oasis/service" + "oasis/service/docker_base" + model2 "oasis/service/model" + "oasis/types" + "reflect" + "strconv" + "strings" + "time" +) + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { return true }, + HandshakeTimeout: time.Duration(time.Second * 5), +} + +//打开docker的terminal +func DockerTerminal(c *gin.Context) { + col := c.DefaultQuery("cols", "100") + row := c.DefaultQuery("rows", "30") + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR), Data: err.Error()}) + return + } + defer conn.Close() + container := c.Param("id") + hr, err := service.Exec(container, row, col) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR), Data: err.Error()}) + return + } + // 关闭I/O流 + defer hr.Close() + // 退出进程 + defer func() { + hr.Conn.Write([]byte("exit\r")) + }() + go func() { + docker.WsWriterCopy(hr.Conn, conn) + }() + docker.WsReaderCopy(conn, hr.Conn) +} + +//打开本机的ssh接口 +func WsSsh(c *gin.Context) { + wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil) + defer wsConn.Close() + cols, _ := strconv.Atoi(c.DefaultQuery("cols", "200")) + rows, _ := strconv.Atoi(c.DefaultQuery("rows", "32")) + client, _ := docker.NewSshClient() + defer client.Close() + ssConn, _ := docker.NewSshConn(cols, rows, client) + defer ssConn.Close() + quitChan := make(chan bool, 3) + + var logBuff = new(bytes.Buffer) + go ssConn.ReceiveWsMsg(wsConn, logBuff, quitChan) + go ssConn.SendComboOutput(wsConn, quitChan) + go ssConn.SessionWait(quitChan) + <-quitChan + +} + +//安装进度推送 +func SpeedPush(c *gin.Context) { + //token := c.Query("token") + //if len(token) == 0 || token != config.UserInfo.Token { + // c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR_AUTH_TOKEN, Message: oasis_err2.GetMsg(oasis_err2.ERROR_AUTH_TOKEN)}) + // return + //} + + //ws, _ := upgrader.Upgrade(c.Writer, c.Request, nil) + //defer ws.Close() + // + //for { + // select { + // case msg := <-WSMSG: + // ws.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintln(msg))) + // } + //} +} + +// @Summary 安装app(该接口需要post json数据) +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path int true "id" +// @Param port formData int true "主端口" +// @Param tcp formData string false "tcp端口" +// @Param udp formData string false "udp端口" +// @Param env formData string false "环境变量" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/install/{id} [post] +func InstallApp(c *gin.Context) { + appId := c.Param("id") + var appInfo model.ServerAppList + m := model.CustomizationPostData{} + c.BindJSON(&m) + + const CUSTOM = "custom" + var dockerImage string + var dockerImageVersion string + //检查端口 + if len(m.PortMap) > 0 && m.PortMap != "0" { + //c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + portMap, _ := strconv.Atoi(m.PortMap) + if !port2.IsPortAvailable(portMap, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + m.PortMap}) + return + } + } + //if len(m.Port) == 0 || m.Port == "0" { + // m.Port = m.PortMap + //} + + imageArr := strings.Split(m.Image, ":") + if len(imageArr) == 2 { + dockerImage = imageArr[0] + dockerImageVersion = imageArr[1] + } else { + dockerImage = m.Image + dockerImageVersion = "latest" + } + if m.Origin != "custom" { + appInfo = service.MyService.App().GetServerAppInfo(appId) + + } else { + + appInfo.Title = m.Label + appInfo.Description = m.Description + appInfo.Icon = m.Icon + appInfo.ScreenshotLink = model.Strings{} + appInfo.NetworkModel = m.NetworkModel + appInfo.Tags = model.Strings{} + appInfo.Tagline = "" + appInfo.Index = m.Index + + } + + for _, u := range m.Ports { + + if u.Protocol == "udp" { + t, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(t, "udp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } else if u.Protocol == "tcp" { + + te, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(te, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } else if u.Protocol == "both" { + t, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(t, "udp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + te, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(te, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } + + } + + for _, device := range m.Devices { + if file.CheckNotExist(device.Path) { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.DEVICE_NOT_EXIST, Message: device.Path + "," + oasis_err2.GetMsg(oasis_err2.DEVICE_NOT_EXIST)}) + return + } + + } + //restart := c.PostForm("restart") //always 总是重启, unless-stopped 除非用户手动停止容器,否则总是重新启动, on-failure:仅当容器退出代码非零时重新启动 + //if len(restart) > 0 { + // + //} + // + //privileged := c.PostForm("privileged") //是否处于特权模式 + //if len(privileged) > 0 { + // + //} + id := uuid.NewV4().String() + + var relyMap = make(map[string]string) + go func() { + installLog := model2.AppNotify{} + installLog.CustomId = id + installLog.State = 0 + installLog.Message = "installing rely" + installLog.Speed = 10 + installLog.Type = types.NOTIFY_TYPE_UNIMPORTANT + installLog.CreatedAt = strconv.FormatInt(time.Now().Unix(), 10) + installLog.UpdatedAt = strconv.FormatInt(time.Now().Unix(), 10) + service.MyService.Notify().AddLog(installLog) + if m.Origin != "custom" { + for _, plugin := range appInfo.Plugins { + if plugin == "mysql" { + mid := uuid.NewV4().String() + mc := docker_base.MysqlConfig{} + mc.DataBasePassword = random.RandomString(6, false) + mc.DataBaseDB = appInfo.Title + mc.DataBaseUser = "root" + mc.DataBasePort = "3306" + mysqlContainerId, err := docker_base.MysqlCreate(mc, mid, m.CpuShares, m.Memory) + if len(mysqlContainerId) > 0 && err == nil { + + mc.DataBaseHost = mid + + m.Envs = docker_base.MysqlFilter(mc, m.Envs) + + rely := model2.RelyDBModel{} + rely.Type = types.RELY_TYPE_MYSQL + rely.ContainerId = mysqlContainerId + rely.CustomId = mid + rely.ContainerCustomId = id + var msqlConfig model2.MysqlConfigs + + //结构体转换 + copier.Copy(&msqlConfig, &mc) + rely.Config = msqlConfig + service.MyService.Rely().Create(rely) + + relyMap["mysql"] = mid + + } else { + docker_base.MysqlDelete(mysqlContainerId) + installLog.State = 0 + installLog.Speed = 30 + installLog.Message = err.Error() + service.MyService.Notify().UpdateLog(installLog) + } + } + } + + } + + installLog.Speed = 50 + installLog.Message = "pulling" + service.MyService.Notify().UpdateLog(installLog) + + // step:下载镜像 + err := service.MyService.Docker().DockerPullImage(dockerImage+":"+dockerImageVersion, installLog) + if err != nil { + installLog.State = 0 + installLog.Speed = 70 + installLog.Message = err.Error() + installLog.Type = types.NOTIFY_TYPE_ERROR + service.MyService.Notify().UpdateLog(installLog) + return + } + + for !service.MyService.Docker().IsExistImage(dockerImage + ":" + dockerImageVersion) { + time.Sleep(time.Second) + } + + //if { + + //} + + //step:创建容器 + containerId, err := service.MyService.Docker().DockerContainerCreate(dockerImage+":"+dockerImageVersion, id, m, appInfo.NetworkModel) + installLog.ContainerId = containerId + if err != nil { + //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":80}", 100) + installLog.State = 0 + installLog.Speed = 80 + installLog.Type = types.NOTIFY_TYPE_ERROR + installLog.Message = err.Error() + service.MyService.Notify().UpdateLog(installLog) + return + } else { + //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"starting\",\"speed\":80}", 100) + installLog.Speed = 80 + installLog.Message = "starting" + service.MyService.Notify().UpdateLog(installLog) + } + + //step:启动容器 + err = service.MyService.Docker().DockerContainerStart(id) + if err != nil { + //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100) + installLog.State = 0 + installLog.Type = types.NOTIFY_TYPE_ERROR + installLog.Speed = 90 + installLog.Message = err.Error() + service.MyService.Notify().UpdateLog(installLog) + return + } else { + //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"setting upnp\",\"speed\":90}", 100) + installLog.Speed = 90 + if m.Origin != CUSTOM { + installLog.Message = "setting upnp" + } else { + installLog.Message = "nearing completion" + } + service.MyService.Notify().UpdateLog(installLog) + } + + if m.Origin != CUSTOM { + //step:启动upnp + if m.EnableUPNP { + upnp, err := upnp2.Gateway() + if err == nil { + for _, p := range m.Ports { + if p.Protocol == "udp" { + upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + upnp.LocalHost = ip_helper2.GetLoclIp() + tComment, _ := strconv.Atoi(p.CommendPort) + upnp.AddPortMapping(tComment, tComment, "UDP") + time.Sleep(time.Millisecond * 200) + } else if p.Protocol == "tcp" { + upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + upnp.LocalHost = ip_helper2.GetLoclIp() + tComment, _ := strconv.Atoi(p.CommendPort) + upnp.AddPortMapping(tComment, tComment, "TCP") + time.Sleep(time.Millisecond * 200) + } else if p.Protocol == "both" { + + upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + upnp.LocalHost = ip_helper2.GetLoclIp() + tComment, _ := strconv.Atoi(p.CommendPort) + upnp.AddPortMapping(tComment, tComment, "UDP") + time.Sleep(time.Millisecond * 200) + + upnp.AddPortMapping(tComment, tComment, "TCP") + time.Sleep(time.Millisecond * 200) + } + + } + + } + if err != nil { + //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":95}", 100) + installLog.State = 0 + installLog.Speed = 95 + installLog.Type = types.NOTIFY_TYPE_ERROR + installLog.Message = err.Error() + service.MyService.Notify().UpdateLog(installLog) + } else { + //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"checking\",\"speed\":95}", 100) + installLog.Speed = 95 + installLog.Message = "checking" + service.MyService.Notify().UpdateLog(installLog) + } + } + } + + //step: 启动成功 检查容器状态确认启动成功 + container, err := service.MyService.Docker().DockerContainerInfo(id) + if err != nil && container.ContainerJSONBase.State.Running { + //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":100}", 100) + installLog.State = 0 + installLog.Speed = 100 + installLog.Type = types.NOTIFY_TYPE_ERROR + installLog.Message = err.Error() + service.MyService.Notify().UpdateLog(installLog) + return + } else { + //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"installed\",\"speed\":100}", 100) + installLog.Speed = 100 + installLog.Message = "installed" + service.MyService.Notify().UpdateLog(installLog) + } + + rely := model.MapStrings{} + + copier.Copy(&rely, &relyMap) + portsStr, _ := json2.Marshal(m.Ports) + envsStr, _ := json2.Marshal(m.Envs) + volumesStr, _ := json2.Marshal(m.Volumes) + devicesStr, _ := json2.Marshal(m.Devices) + //step: 保存数据到数据库 + md := model2.AppListDBModel{ + CustomId: id, + Title: appInfo.Title, + //ScreenshotLink: appInfo.ScreenshotLink, + Slogan: appInfo.Tagline, + Description: appInfo.Description, + //Tags: appInfo.Tags, + Icon: appInfo.Icon, + Version: dockerImageVersion, + ContainerId: containerId, + Image: dockerImage, + Index: appInfo.Index, + //Port: m.Port, + PortMap: m.PortMap, + Label: m.Label, + EnableUPNP: m.EnableUPNP, + Ports: string(portsStr), + Envs: string(envsStr), + Volumes: string(volumesStr), + Position: m.Position, + NetModel: appInfo.NetworkModel, + Restart: m.Restart, + CpuShares: m.CpuShares, + Memory: m.Memory, + Devices: string(devicesStr), + //Rely: rely, + Origin: m.Origin, + CreatedAt: strconv.FormatInt(time.Now().Unix(), 10), + UpdatedAt: strconv.FormatInt(time.Now().Unix(), 10), + } + //if appInfo.NetworkModel == "host" { + // m.PortMap = m.Port + //} + service.MyService.App().SaveContainer(md) + + }() + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: id}) + +} + +//// @Summary 自定义安装app(该接口需要post json数据) +//// @Produce application/json +//// @Accept application/json +//// @Tags app +//// @Param id path int true "id" +//// @Param port formData int true "主端口" +//// @Param tcp formData string false "tcp端口" +//// @Param udp formData string false "udp端口" +//// @Param env formData string false "环境变量" +//// @Security ApiKeyAuth +//// @Success 200 {string} string "ok" +//// @Router /app/install/{id} [post] +//func CustomInstallApp(c *gin.Context) { +// //appId := c.Param("id") +// // appInfo := service.MyService.App().GetServerAppInfo(appId) +// +// m := model.CustomizationPostData{} +// c.BindJSON(&m) +// //检查端口 +// if len(m.PortMap) == 0 || m.PortMap == "0" { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// if len(m.Port) == 0 || m.Port == "0" { +// m.Port = m.PortMap +// } +// +// portMap, _ := strconv.Atoi(m.PortMap) +// if !port2.IsPortAvailable(portMap, "tcp") { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + m.PortMap}) +// return +// } +// +// for _, u := range m.Udp { +// t, _ := strconv.Atoi(u.CommendPort) +// if !port2.IsPortAvailable(t, "udp") { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) +// return +// } +// } +// +// for _, t := range m.Tcp { +// te, _ := strconv.Atoi(t.CommendPort) +// if !port2.IsPortAvailable(te, "tcp") { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + t.CommendPort}) +// return +// } +// } +// +// //restart := c.PostForm("restart") //always 总是重启, unless-stopped 除非用户手动停止容器,否则总是重新启动, on-failure:仅当容器退出代码非零时重新启动 +// //if len(restart) > 0 { +// // +// //} +// // +// //privileged := c.PostForm("privileged") //是否处于特权模式 +// //if len(privileged) > 0 { +// // +// //} +// +// err := service.MyService.Docker().DockerPullImage(m.Image) +// if err != nil { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.PULL_IMAGE_ERROR, Message: oasis_err2.GetMsg(oasis_err2.PULL_IMAGE_ERROR)}) +// } +// +// id := uuid.NewV4().String() +// +// var relyMap = make(map[string]string) +// go func() { +// installLog := model2.AppNotify{} +// installLog.CustomId = id +// installLog.State = 0 +// installLog.Message = "installing rely" +// installLog.Speed = 30 +// installLog.CreatedAt = time.Now() +// installLog.UpdatedAt = time.Now() +// service.MyService.Notify().AddLog(installLog) +// +// for !service.MyService.Docker().IsExistImage(m.Image) { +// time.Sleep(time.Second) +// } +// +// installLog.Speed = 50 +// installLog.Message = "pulling" +// service.MyService.Notify().UpdateLog(installLog) +// // step:下载镜像 +// +// var cpd model.PostData +// copier.Copy(&cpd, &m) +// //step:创建容器 +// containerId, err := service.MyService.Docker().DockerContainerCreate(m.Image, id, cpd, m.NetworkModel, m.Image, "custom") +// installLog.ContainerId = containerId +// if err != nil { +// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":80}", 100) +// installLog.State = 0 +// installLog.Speed = 80 +// installLog.Message = err.Error() +// service.MyService.Notify().UpdateLog(installLog) +// return +// } else { +// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"starting\",\"speed\":80}", 100) +// installLog.Speed = 80 +// installLog.Message = "starting" +// service.MyService.Notify().UpdateLog(installLog) +// } +// +// //step:启动容器 +// err = service.MyService.Docker().DockerContainerStart(id) +// if err != nil { +// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100) +// installLog.State = 0 +// installLog.Speed = 90 +// installLog.Message = err.Error() +// service.MyService.Notify().UpdateLog(installLog) +// return +// } else { +// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"setting upnp\",\"speed\":90}", 100) +// installLog.Speed = 90 +// installLog.Message = "setting upnp" +// service.MyService.Notify().UpdateLog(installLog) +// } +// +// //step: 启动成功 检查容器状态确认启动成功 +// containerStatus, err := service.MyService.Docker().DockerContainerInfo(id) +// if err != nil && containerStatus.ContainerJSONBase.State.Running { +// //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":100}", 100) +// installLog.State = 0 +// installLog.Speed = 100 +// installLog.Message = err.Error() +// service.MyService.Notify().UpdateLog(installLog) +// return +// } else { +// //service.MyService.Redis().Set(id, "{\"id\":\""+id+"\",\"state\":true,\"message\":\"installed\",\"speed\":100}", 100) +// installLog.Speed = 100 +// installLog.Message = "installed" +// service.MyService.Notify().UpdateLog(installLog) +// } +// +// rely := model.MapStrings{} +// +// copier.Copy(&rely, &relyMap) +// +// //step: 保存数据到数据库 +// md := model2.AppListDBModel{ +// CustomId: id, +// Title: m.Label, +// // ScreenshotLink: []string, +// Slogan: "", +// Description: m.Description, +// // Tags: , +// Icon: m.Icon, +// Version: m.Image, +// ContainerId: containerId, +// Image: m.Image, +// Index: "", +// Port: m.Port, +// PortMap: m.PortMap, +// Label: m.Label, +// EnableUPNP: m.EnableUPNP, +// UdpPorts: m.Udp, +// TcpPorts: m.Tcp, +// Envs: m.Envs, +// Volumes: m.Volumes, +// Position: m.Position, +// NetModel: m.NetworkModel, +// Restart: m.Restart, +// CpuShares: m.CpuShares, +// Memory: m.Memory, +// Devices: m.Devices, +// Rely: rely, +// Origin: "custom", +// } +// if m.NetworkModel == "host" { +// m.PortMap = m.Port +// } +// service.MyService.App().SaveContainer(md) +// +// }() +// +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: id}) +// +//} + +// @Summary 卸载app +// @Produce application/json +// @Accept multipart/form-data +// @Tags app +// @Param id path string true "容器id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/uninstall/{id} [delete] +func UnInstallApp(c *gin.Context) { + appId := c.Param("id") + + if len(appId) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.App().GetUninstallInfo(appId) + + //step:停止容器 + err := service.MyService.Docker().DockerContainerStop(appId) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.UNINSTALL_APP_ERROR, Message: oasis_err2.GetMsg(oasis_err2.UNINSTALL_APP_ERROR), Data: err.Error()}) + return + } + + //step:删除容器 + err = service.MyService.Docker().DockerContainerRemove(appId) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.UNINSTALL_APP_ERROR, Message: oasis_err2.GetMsg(oasis_err2.UNINSTALL_APP_ERROR), Data: err.Error()}) + return + } + + //存在镜像正在使用的情况 + // step:删除镜像 + service.MyService.Docker().DockerImageRemove(info.Image + ":" + info.Version) + + //step: 删除本地数据 + service.MyService.App().RemoveContainerById(appId) + if info.Origin != "custom" { + + //step: 删除文件夹 + service.MyService.App().DelAppConfigDir(appId) + + //step: 删除install log + service.MyService.Notify().DelLog(appId) + + // for k, v := range info.Rely { + // + // if k == "mysql" { + // docker_base.MysqlDelete(v) + // service.MyService.Rely().Delete(v) + // } + // } + + //if info.EnableUPNP { + // upnp, err := upnp2.Gateway() + // if err == nil { + // for _, p := range info.Ports { + // if p.Protocol == "udp" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "UDP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "tcp" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "both" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "UDP") + // + // upnp.DelPortMapping(tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } + // } + // } + //} + } + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + +} + +// @Summary 修改app状态 +// @Produce application/json +// @Accept multipart/form-data +// @Tags app +// @Param id path string true "appid" +// @Param state query string false "是否停止 start stop restart" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/state/{id} [put] +func ChangAppState(c *gin.Context) { + appId := c.Param("id") + state := c.DefaultPostForm("state", "stop") + var err error + if state == "stop" { + err = service.MyService.Docker().DockerContainerStop(appId) + } else if state == "start" { + err = service.MyService.Docker().DockerContainerStart(appId) + } else if state == "restart" { + err = service.MyService.Docker().DockerContainerStop(appId) + err = service.MyService.Docker().DockerContainerStart(appId) + } + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR), Data: err.Error()}) + return + } + info, err := service.MyService.App().GetContainerInfo(appId) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR), Data: err.Error()}) + return + } + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info.State}) +} + +// @Summary 查看容器日志 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "appid" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/logs/{id} [get] +func ContainerLog(c *gin.Context) { + appId := c.Param("id") + log, _ := service.MyService.Docker().DockerContainerLog(appId) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: log}) +} + +// @Summary 获取安装进度 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "容器id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/speed/{id} [get] +func GetInstallSpeed(c *gin.Context) { + id := c.Param("id") + b := service.MyService.Notify().GetLog(id) + b.Id = b.CustomId + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: b}) +} + +// @Summary 获取容器状态 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "容器id" +// @Param type query string false "type=1" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/state/{id} [get] +func GetContainerState(c *gin.Context) { + id := c.Param("id") + t := c.DefaultQuery("type", "0") + containerInfo, e := service.MyService.App().GetSimpleContainerInfo(id) + if e != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: e.Error()}) + return + } + + var data = make(map[string]interface{}) + + data["state"] = containerInfo.State + + if t == "1" { + appInfo := service.MyService.App().GetAppDBInfo(id) + data["app"] = appInfo + } + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) +} + +// @Summary 更新设置 +// @Produce application/json +// @Accept multipart/form-data +// @Tags app +// @Param id path string true "容器id" +// @Param shares formData string false "cpu权重" +// @Param mem formData string false "内存大小MB" +// @Param restart formData string false "重启策略" +// @Param label formData string false "应用名称" +// @Param position formData bool true "是否放到首页" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/update/{id}/setting [put] +func UpdateSetting(c *gin.Context) { + id := c.Param("id") + const CUSTOM = "custom" + m := model.CustomizationPostData{} + c.BindJSON(&m) + + if len(id) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + var cpd model.CustomizationPostData + + copier.Copy(&cpd, &m) + + appInfo := service.MyService.App().GetAppDBInfo(id) + + var containerId string + containerId = appInfo.ContainerId + + service.MyService.Docker().DockerContainerStop(id) + + portMap, _ := strconv.Atoi(m.PortMap) + if !port2.IsPortAvailable(portMap, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + m.PortMap}) + return + } + + for _, u := range m.Ports { + + if u.Protocol == "udp" { + t, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(t, "udp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } else if u.Protocol == "tcp" { + te, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(te, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } else if u.Protocol == "both" { + t, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(t, "udp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + + te, _ := strconv.Atoi(u.CommendPort) + if !port2.IsPortAvailable(te, "tcp") { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: "Duplicate port:" + u.CommendPort}) + return + } + } + + } + + if !reflect.DeepEqual(m.Ports, appInfo.Ports) || !reflect.DeepEqual(m.Envs, appInfo.Envs) || !reflect.DeepEqual(m.Volumes, appInfo.Volumes) || m.PortMap != appInfo.PortMap { + + service.MyService.Docker().DockerContainerRemove(id) + + var err error + + containerId, err = service.MyService.Docker().DockerContainerCreate(appInfo.Image+":"+appInfo.Version, id, cpd, appInfo.NetModel) + + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR)}) + return + } + + } else if !reflect.DeepEqual(m.Devices, appInfo.Devices) || m.CpuShares != appInfo.CpuShares || m.Memory != appInfo.Memory || m.Restart != appInfo.Restart { + service.MyService.Docker().DockerContainerUpdate(cpd, id) + } + + err := service.MyService.Docker().DockerContainerStart(id) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR)}) + return + } + //更新upnp + if m.Origin != CUSTOM { + //if appInfo.EnableUPNP != appInfo.EnableUPNP { + // if appInfo.EnableUPNP { + // upnp, err := upnp2.Gateway() + // if err == nil { + // + // for _, p := range appInfo.Ports { + // if p.Protocol == "udp" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.AddPortMapping(tComment, tComment, "UDP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "tcp" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.AddPortMapping(tComment, tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "both" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.AddPortMapping(tComment, tComment, "UDP") + // time.Sleep(time.Millisecond * 200) + // + // upnp.AddPortMapping(tComment, tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } + // } + // } + // } else { + // upnp, err := upnp2.Gateway() + // if err == nil { + // for _, p := range appInfo.Ports { + // if p.Protocol == "udp" { + // + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "UDP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "tcp" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } else if p.Protocol == "both" { + // upnp.CtrlUrl = upnp2.GetCtrlUrl(upnp.GatewayHost, upnp.DeviceDescUrl) + // upnp.LocalHost = ip_helper2.GetLoclIp() + // tComment, _ := strconv.Atoi(p.CommendPort) + // upnp.DelPortMapping(tComment, "UDP") + // time.Sleep(time.Millisecond * 200) + // + // upnp.DelPortMapping(tComment, "TCP") + // time.Sleep(time.Millisecond * 200) + // } + // } + // } + // } + //} + } + + //如果容器端口均未修改,这不进行处理 + portsStr, _ := json2.Marshal(m.Ports) + envsStr, _ := json2.Marshal(m.Envs) + volumesStr, _ := json2.Marshal(m.Volumes) + devicesStr, _ := json2.Marshal(m.Devices) + appInfo.ContainerId = containerId + appInfo.PortMap = m.PortMap + appInfo.Label = m.Label + appInfo.Ports = string(portsStr) + appInfo.Envs = string(envsStr) + appInfo.Icon = m.Icon + appInfo.Volumes = string(volumesStr) + appInfo.Devices = string(devicesStr) + appInfo.Position = m.Position + appInfo.EnableUPNP = m.EnableUPNP + appInfo.Restart = m.Restart + appInfo.Memory = m.Memory + appInfo.CpuShares = m.CpuShares + appInfo.UpdatedAt = strconv.FormatInt(time.Now().Unix(), 10) + service.MyService.App().UpdateApp(appInfo) + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) +} + +// @Summary 获取容器详情 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "appid" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/info/{id} [get] +func ContainerInfo(c *gin.Context) { + appId := c.Param("id") + appInfo := service.MyService.App().GetAppDBInfo(appId) + containerInfo, _ := service.MyService.Docker().DockerContainerStats(appId) + var cpuModel = "arm" + if cpu := service.MyService.ZiMa().GetCpuInfo(); len(cpu) > 0 { + if strings.Count(strings.ToLower(strings.TrimSpace(cpu[0].ModelName)), "intel") > 0 { + cpuModel = "intel" + } else if strings.Count(strings.ToLower(strings.TrimSpace(cpu[0].ModelName)), "amd") > 0 { + cpuModel = "amd" + } + } + + info, err := service.MyService.Docker().DockerContainerInfo(appId) + if err != nil { + //todo 需要自定义错误 + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: err.Error()}) + return + } + con := struct { + Status string `json:"status"` + StartedAt string `json:"started_at"` + CPUShares int64 `json:"cpu_shares"` + Memory int64 `json:"memory"` + Restart string `json:"restart"` + }{Status: info.State.Status, StartedAt: info.State.StartedAt, CPUShares: info.HostConfig.CPUShares, Memory: info.HostConfig.Memory >> 20, Restart: info.HostConfig.RestartPolicy.Name} + data := make(map[string]interface{}, 5) + data["app"] = appInfo + data["cpu"] = cpuModel + data["memory"] = service.MyService.ZiMa().GetMemInfo().Total + data["container"] = json2.RawMessage(containerInfo) + data["info"] = con + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) +} + +// @Summary 获取安装所需要的数据 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/install/config [get] +func GetDockerInstallConfig(c *gin.Context) { + networks := service.MyService.Docker().DockerNetworkModelList() + data := make(map[string]interface{}, 2) + list := []map[string]string{} + for _, network := range networks { + if network.Driver != "null" { + list = append(list, map[string]string{"name": network.Name, "driver": network.Driver, "id": network.ID}) + } + } + data["networks"] = list + data["memory"] = service.MyService.ZiMa().GetMemInfo() + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) +} + +// @Summary 获取依赖数据 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "rely id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/rely/{id}/info [get] +func ContainerRelyInfo(c *gin.Context) { + id := c.Param("id") + appInfo := service.MyService.Rely().GetInfo(id) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: appInfo}) +} + +// @Summary 获取可更新数据 +// @Produce application/json +// @Accept application/json +// @Tags app +// @Param id path string true "appid" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /app/update/{id}/info [get] +func ContainerUpdateInfo(c *gin.Context) { + appId := c.Param("id") + appInfo := service.MyService.App().GetAppDBInfo(appId) + + info, err := service.MyService.Docker().DockerContainerInfo(appId) + if err != nil { + //todo 需要自定义错误 + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: err.Error()}) + return + } + var port model.PortArrey + json2.Unmarshal([]byte(appInfo.Ports), &port) + + var envs model.EnvArrey + json2.Unmarshal([]byte(appInfo.Envs), &envs) + + var vol model.PathArrey + json2.Unmarshal([]byte(appInfo.Volumes), &vol) + + var dir model.PathArrey + json2.Unmarshal([]byte(appInfo.Devices), &dir) + + //volumesStr, _ := json2.Marshal(m.Volumes) + //devicesStr, _ := json2.Marshal(m.Devices) + m := model.CustomizationPostData{} + m.Index = appInfo.Index + m.Icon = appInfo.Icon + m.Ports = port + m.Image = appInfo.Image + ":" + appInfo.Version + m.Origin = appInfo.Origin + m.NetworkModel = appInfo.NetModel + m.Description = appInfo.Description + m.Label = appInfo.Label + m.PortMap = appInfo.PortMap + m.Devices = dir //appInfo.Devices + m.Envs = envs + m.Memory = info.HostConfig.Memory >> 20 + m.CpuShares = info.HostConfig.CPUShares + m.Volumes = vol //appInfo.Volumes + m.Restart = info.HostConfig.RestartPolicy.Name + m.EnableUPNP = appInfo.EnableUPNP + m.Position = appInfo.Position + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: m}) +} + +////准备安装(暂时不需要) +//func ReadyInstall(c *gin.Context) { +// _, tcp, udp := service.MyService.GetManifestJsonByRepo() +// data := make(map[string]interface{}, 2) +// if t := gjson.Parse(tcp).Array(); len(t) > 0 { +// //tcpList := []model.TcpPorts{} +// //e := json2.Unmarshal([]byte(tcp), tcpList) +// //if e!=nil { +// // return +// //} +// //for _, port := range tcpList { +// // if port.ContainerPort>0&&port.ExtranetPort { +// // +// // } +// //} +// var inarr []interface{} +// for _, result := range t { +// +// var p int +// ok := true +// for ok { +// p, _ = port.GetAvailablePort() +// ok = !port.IsPortAvailable(p) +// } +// pm := model.PortMap{gjson.Get(result.Raw, "container_port").Int(), p} +// inarr = append(inarr, pm) +// } +// data["tcp"] = inarr +// } +// if u := gjson.Parse(udp).Array(); len(u) > 0 { +// //udpList := []model.UdpPorts{} +// //e := json2.Unmarshal([]byte(udp), udpList) +// //if e != nil { +// // return +// //} +// var inarr []model.PortMap +// for _, result := range u { +// var p int +// ok := true +// for ok { +// p, _ = port.GetAvailablePort() +// ok = !port.IsPortAvailable(p) +// } +// pm := model.PortMap{gjson.Get(result.Raw, "container_port").Int(), p} +// inarr = append(inarr, pm) +// } +// data["udp"] = inarr +// } +// c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: data}) +//} diff --git a/route/v1/file.go b/route/v1/file.go new file mode 100644 index 0000000..48c3f89 --- /dev/null +++ b/route/v1/file.go @@ -0,0 +1,238 @@ +package v1 + +import ( + "bufio" + "encoding/csv" + "fmt" + "github.com/gin-gonic/gin" + "io" + "io/ioutil" + "net/http" + "oasis/model" + "oasis/pkg/utils/file" + oasis_err2 "oasis/pkg/utils/oasis_err" + "oasis/service" + "os" + "path" +) + +func downloadReadFile(c *gin.Context) { + //http下载地址 csv + csvFileUrl := c.PostForm("file_name") + res, err := http.Get(csvFileUrl) + if err != nil { + c.String(400, err.Error()) + return + } + defer res.Body.Close() + //读取csv + reader := csv.NewReader(bufio.NewReader(res.Body)) + for { + line, err := reader.Read() + if err == io.EOF { + break + } else if err != nil { + c.String(400, err.Error()) + return + } + //line 就是每一行的内容 + fmt.Println(line) + //line[0] 就是第几列 + fmt.Println(line[0]) + } +} + +func downloadWriteFile(c *gin.Context) { + //写文件 + var filename = "./output1.csv" + + file, err := os.Create(filename) //创建文件 + if err != nil { + c.String(400, err.Error()) + return + } + buf := bufio.NewWriter(file) //创建新的 Writer 对象 + buf.WriteString("test") + buf.Flush() + defer file.Close() + + //返回文件流 + c.File(filename) +} + +// @Summary 读取文件 +// @Produce application/json +// @Accept application/json +// @Tags file +// @Security ApiKeyAuth +// @Param path query string true "路径" +// @Success 200 {string} string "ok" +// @Router /file/read [get] +func GetFilerContent(c *gin.Context) { + filePath := c.Query("path") + if len(filePath) == 0 { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.INVALID_PARAMS, + Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS), + }) + return + } + if !file.Exists(filePath) { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.FILE_DOES_NOT_EXIST, + Message: oasis_err2.GetMsg(oasis_err2.FILE_DOES_NOT_EXIST), + }) + return + } + //文件读取任务是将文件内容读取到内存中。 + info, err := ioutil.ReadFile(filePath) + if err != nil { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.FILE_READ_ERROR, + Message: oasis_err2.GetMsg(oasis_err2.FILE_READ_ERROR), + Data: err.Error(), + }) + return + } + result := string(info) + + //返回结果 + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: result, + }) +} + +func GetLocalFile(c *gin.Context) { + path := c.Query("path") + if len(path) == 0 { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.INVALID_PARAMS, + Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS), + }) + return + } + if !file.Exists(path) { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.FILE_DOES_NOT_EXIST, + Message: oasis_err2.GetMsg(oasis_err2.FILE_DOES_NOT_EXIST), + }) + return + } + c.File(path) + return +} + +// @Summary 下载文件 +// @Produce application/json +// @Accept application/json +// @Tags file +// @Security ApiKeyAuth +// @Param path query string true "路径" +// @Success 200 {string} string "ok" +// @Router /file/download [get] +func GetDownloadFile(c *gin.Context) { + filePath := c.Query("path") + if len(filePath) == 0 { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.INVALID_PARAMS, + Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS), + }) + return + } + if !file.Exists(filePath) { + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err2.FILE_DOES_NOT_EXIST, + Message: oasis_err2.GetMsg(oasis_err2.FILE_DOES_NOT_EXIST), + }) + return + } + //打开文件 + fileTmp, _ := os.Open(filePath) + defer fileTmp.Close() + //获取文件的名称 + fileName := path.Base(filePath) + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Disposition", "attachment; filename="+fileName) + c.Header("Content-Transfer-Encoding", "binary") + c.Header("Cache-Control", "no-cache") + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Disposition", "attachment; filename="+fileName) + c.Header("Content-Transfer-Encoding", "binary") + + c.File(filePath) + return +} + +// @Summary 获取目录列表 +// @Produce application/json +// @Accept application/json +// @Tags file +// @Security ApiKeyAuth +// @Param path query string false "路径" +// @Success 200 {string} string "ok" +// @Router /file/dirpath [get] +func DirPath(c *gin.Context) { + path := c.DefaultQuery("path", "/") + info := service.MyService.ZiMa().GetDirPath(path) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 重命名目录或文件 +// @Produce application/json +// @Accept application/json +// @Tags file +// @Security ApiKeyAuth +// @Param oldpath formData string true "旧的路径" +// @Param newpath formData string true "新路径" +// @Success 200 {string} string "ok" +// @Router /file/rename [put] +func RenamePath(c *gin.Context) { + op := c.PostForm("oldpath") + np := c.PostForm("newpath") + if len(op) == 0 || len(np) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + service.MyService.ZiMa().RenameFile(op, np) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) +} + +// @Summary 创建文件夹 +// @Produce application/json +// @Accept multipart/form-data +// @Tags file +// @Security ApiKeyAuth +// @Param path formData string false "路径" +// @Success 200 {string} string "ok" +// @Router /file/mkdir [post] +func MkdirAll(c *gin.Context) { + path := c.PostForm("path") + var code int + if len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + code, _ = service.MyService.ZiMa().MkdirAll(path) + c.JSON(http.StatusOK, model.Result{Success: code, Message: oasis_err2.GetMsg(code)}) +} + +// @Summary 上传文件 +// @Produce application/json +// @Accept multipart/form-data +// @Tags file +// @Security ApiKeyAuth +// @Param path formData string false "路径" +// @Success 200 {string} string "ok" +// @Router /file/mkdir [post] +func PostFileUpload(c *gin.Context) { + file, _, _ := c.Request.FormFile("file") + //file.Read() + path := c.Query("path") + //上传文件 + out, _ := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0644) + defer out.Close() + io.Copy(out, file) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) +} diff --git a/route/v1/notify.go b/route/v1/notify.go new file mode 100644 index 0000000..d86239d --- /dev/null +++ b/route/v1/notify.go @@ -0,0 +1,70 @@ +package v1 + +import ( + json2 "encoding/json" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "net/http" + "oasis/model" + "oasis/pkg/utils/oasis_err" + "oasis/service" + "oasis/types" + "time" +) + +var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// @Summary websocket 接口,连接成功后发送一个"notify"字符串 +// @Produce application/json +// @Accept application/json +// @Tags notify +// @Security ApiKeyAuth +// @Param token path string true "token" +// @Success 200 {string} string "ok" +// @Router /notify/ws [get] +func NotifyWS(c *gin.Context) { + //升级get请求为webSocket协议 + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + return + } + defer ws.Close() + for { + mt, message, err := ws.ReadMessage() + if err != nil { + break + } + if string(message) != "notify" { + return + } + for { + list := service.MyService.Notify().GetList() + json, _ := json2.Marshal(list) + err = ws.WriteMessage(mt, json) + if err != nil { + break + } + time.Sleep(time.Second * 2) + } + } +} + +// @Summary 标记notify已读 +// @Produce application/json +// @Accept application/json +// @Tags notify +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /notify/read/{id} [put] +func PutNotifyRead(c *gin.Context) { + id := c.Param("id") + if len(id) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + service.MyService.Notify().MarkRead(id, types.NOTIFY_READ) +} diff --git a/route/v1/share_directory.go b/route/v1/share_directory.go new file mode 100644 index 0000000..af6e200 --- /dev/null +++ b/route/v1/share_directory.go @@ -0,0 +1,144 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/utils/oasis_err" + "oasis/service" + model2 "oasis/service/model" + "strconv" +) + +// @Summary 获取列表 +// @Produce application/json +// @Accept application/json +// @Tags share +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /share/list [get] +func GetShareDirList(c *gin.Context) { + list := service.MyService.ShareDirectory().List(true) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: list}) +} + +// @Summary 添加文件共享 +// @Produce application/json +// @Accept multipart/form-data +// @Tags share +// @Security ApiKeyAuth +// @Param path formData string true "要分享的文件路径" +// @Param name formData string true "名称" +// @Param comment formData string true "描述" +// @Param read_only formData bool false "是否只读" +// @Param writeable formData bool false "是否可写" +// @Param browseable formData bool false "是否可浏览" +// @Param user formData string false "用户" +// @Success 200 {string} string "ok" +// @Router /share/add [post] +func PostShareDirAdd(c *gin.Context) { + + name := c.PostForm("name") + comment := c.PostForm("comment") + path := c.PostForm("path") + readOnly, _ := strconv.ParseBool(c.DefaultPostForm("read_only", "false")) + writeable, _ := strconv.ParseBool(c.DefaultPostForm("writeable", "true")) + browse, _ := strconv.ParseBool(c.DefaultPostForm("browseable", "true")) + user := c.PostForm("user") + + if len(name) == 0 || len(comment) == 0 || len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + + var m model2.ShareDirDBModel + m.Name = name + m.Comment = comment + m.Path = path + m.ReadOnly = readOnly + m.Writeable = writeable + m.Browseable = browse + m.ValidUsers = user + + service.MyService.ShareDirectory().Add(&m) + service.MyService.ShareDirectory().UpConfig() + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +// @Summary 删除分享 +// @Produce application/json +// @Accept application/json +// @Tags share +// @Security ApiKeyAuth +// @Param id path string true "id" +// @Success 200 {string} string "ok" +// @Router /share/del/{id} [delete] +func DeleteShareDirDel(c *gin.Context) { + id := c.Param("id") + service.MyService.ShareDirectory().Delete(id) + service.MyService.ShareDirectory().UpConfig() + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +// @Summary 分享详情 +// @Produce application/json +// @Accept application/json +// @Tags share +// @Security ApiKeyAuth +// @Param id path string true "id" +// @Success 200 {string} string "ok" +// @Router /share/info/{id} [get] +func GetShareDirInfo(c *gin.Context) { + id := c.Param("id") + info := service.MyService.ShareDirectory().Info(id) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: info}) +} + +// @Summary 更新分享详情 +// @Produce application/json +// @Accept application/json +// @Tags share +// @Security ApiKeyAuth +// @Param id path string true "id" +// @Param path formData string true "要分享的文件路径" +// @Param name formData string true "名称" +// @Param comment formData string true "描述" +// @Param read_only formData bool false "是否只读" +// @Param writeable formData bool false "是否可写" +// @Param browseable formData bool false "是否可浏览" +// @Param user formData string false "用户" +// @Success 200 {string} string "ok" +// @Router /share/update/{id} [put] +func PutShareDirEdit(c *gin.Context) { + id, err := strconv.ParseUint(c.Param("id"), 10, 32) + + if err != nil || id == 0 { + //todo 报错出去 + } + + name := c.PostForm("name") + comment := c.PostForm("comment") + path := c.PostForm("path") + readOnly, _ := strconv.ParseBool(c.DefaultPostForm("read_only", "false")) + writeable, _ := strconv.ParseBool(c.DefaultPostForm("writeable", "true")) + browse, _ := strconv.ParseBool(c.DefaultPostForm("browseable", "true")) + user := c.PostForm("user") + + if len(name) == 0 || len(comment) == 0 || len(path) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + + var m model2.ShareDirDBModel + m.Id = uint(id) + m.Name = name + m.Comment = comment + m.Path = path + m.ReadOnly = readOnly + m.Writeable = writeable + m.Browseable = browse + m.ValidUsers = user + service.MyService.ShareDirectory().Update(&m) + service.MyService.ShareDirectory().UpConfig() + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} diff --git a/route/v1/shortcuts.go b/route/v1/shortcuts.go new file mode 100644 index 0000000..a1749d6 --- /dev/null +++ b/route/v1/shortcuts.go @@ -0,0 +1,96 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "net/http" + "net/url" + "oasis/model" + "oasis/pkg/utils/oasis_err" + "oasis/service" + model2 "oasis/service/model" +) + +// @Summary 获取短链列表 +// @Produce application/json +// @Accept application/json +// @Tags shortcuts +// @Param username formData string true "User name" +// @Param pwd formData string true "password" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /shortcuts/list [get] +func GetShortcutsList(c *gin.Context) { + list := service.MyService.Shortcuts().GetList() + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: list}) +} + +// @Summary 添加shortcuts +// @Produce application/json +// @Accept application/json +// @Tags shortcuts +// @Param title formData string true "title" +// @Param url formData string true "url" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /shortcuts/add [post] +func PostShortcutsAdd(c *gin.Context) { + var m model2.ShortcutsDBModel + + c.BindJSON(&m) + if len(m.Url) == 0 || len(m.Title) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + u, err := url.Parse(m.Url) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SHORTCUTS_URL_ERROR, Message: oasis_err.GetMsg(oasis_err.SHORTCUTS_URL_ERROR), Data: err.Error()}) + return + } + m.Icon = "https://api.faviconkit.com/" + u.Host + "/57" + service.MyService.Shortcuts().AddData(m) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) + +} + +// @Summary 删除shortcuts +// @Produce application/json +// @Accept application/json +// @Tags shortcuts +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /shortcuts/del/{id} [post] +func DeleteShortcutsDelete(c *gin.Context) { + id := c.Param("id") + service.MyService.Shortcuts().DeleteData(id) + c.JSON(http.StatusOK, model.Result{ + Success: oasis_err.SUCCESS, + Message: oasis_err.GetMsg(oasis_err.SUCCESS), + Data: "", + }) +} + +// @Summary 编辑shortcuts +// @Produce application/json +// @Accept application/json +// @Tags shortcuts +// @Param title formData string true "title" +// @Param url formData string true "url" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /shortcuts/edit [put] +func PutShortcutsEdit(c *gin.Context) { + var m model2.ShortcutsDBModel + c.BindJSON(&m) + if len(m.Url) == 0 || len(m.Title) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + u, err := url.Parse(m.Url) + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SHORTCUTS_URL_ERROR, Message: oasis_err.GetMsg(oasis_err.SHORTCUTS_URL_ERROR), Data: err.Error()}) + return + } + m.Icon = "https://api.faviconkit.com/" + u.Host + "/57" + service.MyService.Shortcuts().EditData(m) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: ""}) +} diff --git a/route/v1/system.go b/route/v1/system.go new file mode 100644 index 0000000..35f6ee2 --- /dev/null +++ b/route/v1/system.go @@ -0,0 +1,98 @@ +package v1 + +import ( + "fmt" + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/config" + "oasis/pkg/utils/oasis_err" + "oasis/pkg/utils/version" + "oasis/service" + model2 "oasis/service/model" + "oasis/types" + "strconv" + "time" +) + +// @Summary 系统信息 +// @Produce application/json +// @Accept application/json +// @Tags sys +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /sys/chackversion [get] +func CheckVersion(c *gin.Context) { + need, version := version.IsNeedUpdate() + if need { + installLog := model2.AppNotify{} + installLog.CustomId = "" + installLog.State = 0 + installLog.Message = "New version " + version.Version + " is ready, ready to upgrade" + installLog.Speed = 100 + installLog.Type = types.NOTIFY_TYPE_NEED_CONFIRM + installLog.CreatedAt = strconv.FormatInt(time.Now().Unix(), 10) + installLog.UpdatedAt = strconv.FormatInt(time.Now().Unix(), 10) + service.MyService.Notify().AddLog(installLog) + } + data := make(map[string]interface{}, 1) + data["is_need"] = need + data["version"] = version + data["current_version"] = types.CURRENTVERSION + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: data}) + return +} + +// @Summary 系统信息 +// @Produce application/json +// @Accept application/json +// @Tags sys +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /sys/update [post] +func SystemUpdate(c *gin.Context) { + need, version := version.IsNeedUpdate() + if need { + service.MyService.System().UpdateSystemVersion(version.Version) + } + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +//系统配置 +func GetSystemConfig(c *gin.Context) { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: config.SystemConfigInfo}) +} + +// @Summary 修改配置文件 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param file formData file true "用户头像" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/changhead [post] +func PostSetSystemConfig(c *gin.Context) { + var systemConfig model.SystemConfig + c.BindJSON(&systemConfig) + service.MyService.System().UpSystemConfig(systemConfig) + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err.SUCCESS, + Message: oasis_err.GetMsg(oasis_err.SUCCESS), + Data: config.SystemConfigInfo, + }) + return +} + +//系统配置 +func GetSystemConfigDebug(c *gin.Context) { + + array := service.MyService.System().GetSystemConfigDebug() + disk := service.MyService.ZiMa().GetDiskInfo() + array = append(array, fmt.Sprintf("disk,totle:%v,used:%v,UsedPercent:%v", disk.Total>>20, disk.Used>>20, disk.UsedPercent)) + + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: array}) +} +func Sys(c *gin.Context) { + service.DockerPull() +} diff --git a/route/v1/task.go b/route/v1/task.go new file mode 100644 index 0000000..7ff303a --- /dev/null +++ b/route/v1/task.go @@ -0,0 +1,57 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/utils/oasis_err" + "oasis/service" + model2 "oasis/service/model" + "oasis/types" + "strconv" +) + +// @Summary 获取task列表 +// @Produce application/json +// @Accept application/json +// @Tags task +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /task/list [get] +func GetTaskList(c *gin.Context) { + list := service.MyService.Task().List(true) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS), Data: list}) +} + +func PutTaskUpdate(c *gin.Context) { + service.MyService.Task().SyncTaskService() + + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +// @Summary 标记task已完成 +// @Produce application/json +// @Accept application/json +// @Tags task +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /task/completion/{id} [put] +func PutTaskMarkerCompletion(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + if id == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err.INVALID_PARAMS, Message: oasis_err.GetMsg(oasis_err.INVALID_PARAMS)}) + return + } + var m model2.TaskDBModel + m.Id = uint(id) + m.State = types.TASK_STATE_COMPLETED + service.MyService.Task().Update(&m) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} + +func PostTaskAdd(c *gin.Context) { + var m model2.TaskDBModel + c.BindJSON(&m) + service.MyService.Task().Add(&m) + c.JSON(http.StatusOK, model.Result{Success: oasis_err.SUCCESS, Message: oasis_err.GetMsg(oasis_err.SUCCESS)}) +} diff --git a/route/v1/user.go b/route/v1/user.go new file mode 100644 index 0000000..af42d04 --- /dev/null +++ b/route/v1/user.go @@ -0,0 +1,202 @@ +package v1 + +import ( + "fmt" + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/config" + jwt2 "oasis/pkg/utils/jwt" + oasis_err2 "oasis/pkg/utils/oasis_err" + "oasis/service" +) + +var user_service service.UserService + +func init() { + user_service = service.NewUserService() +} + +// @Summary 设置用户名和密码 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param username formData string true "User name" +// @Param pwd formData string true "password" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/setusernamepwd [post] +func Set_Name_Pwd(c *gin.Context) { + //json := make(map[string]string) + //c.BindJSON(&json) + username := c.PostForm("username") + pwd := c.PostForm("pwd") + //老用户名是否存在即新用户名和密码的验证 + if len(config.UserInfo.UserName) > 0 || len(username) == 0 || len(pwd) == 0 { + c.JSON(http.StatusOK, + model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + //开始设置 + err := user_service.SetUser(username, pwd, "", "", "") + if err != nil { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: fmt.Sprintf("%v", err)}) + return + } else { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + return + } +} + +// @Summary 登录 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param username formData string true "User name" +// @Param pwd formData string true "password" +// @Success 200 {string} string "ok" +// @Router /user/login [post] +func Login(c *gin.Context) { + username := c.PostForm("username") + pwd := c.PostForm("pwd") + //检查参数是否正确 + if len(username) == 0 || len(pwd) == 0 { + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.ERROR, + Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS), + }) + return + } + + //if config.UserInfo.UserName == username && config.UserInfo.PWD == pwd { + if username == "admin" && pwd == "admin" { + token := jwt2.GetToken(username, pwd) + //user_service.SetUser("", "", token, "", "") + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: token, + }) + return + } + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.ERROR, + Message: oasis_err2.GetMsg(oasis_err2.ERROR), + }) + +} + +// @Summary 修改头像 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param file formData file true "用户头像" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/changhead [post] +func Up_Load_Head(c *gin.Context) { + file, _, _ := c.Request.FormFile("file") + user_service.UpLoadFile(file, config.UserInfo.Head) + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: config.UserInfo.Head, + }) + return +} + +// @Summary 修改用户名 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param username formData string true "User name" +// @Param oldname formData string true "Old user name" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/changusername [put] +func Chang_User_Name(c *gin.Context) { + oldname := c.PostForm("oldname") + username := c.PostForm("username") + if len(username) == 0 || config.UserInfo.UserName != oldname { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR)}) + return + } + user_service.SetUser(username, "", "", "", "") + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + return +} + +// @Summary 修改密码 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param pwd formData string true "Password" +// @Param oldpwd formData string true "Old password" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/changuserpwd [put] +func Chang_User_Pwd(c *gin.Context) { + oldpwd := c.PostForm("oldpwd") + pwd := c.PostForm("pwd") + if len(pwd) == 0 || config.UserInfo.PWD != oldpwd { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.ERROR)}) + return + } + user_service.SetUser("", pwd, "", "", "") + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + return +} + +// @Summary 修改用户信息 +// @Produce application/json +// @Accept multipart/form-data +// @Tags user +// @Param username formData string false "User Name" +// @Param email formData string false "Email" +// @Param description formData string false "Description" +// @Param pwd formData string false "Password" +// @Param oldpwd formData string false "Old password" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/changuserinfo [post] +func Chang_User_Info(c *gin.Context) { + username := c.PostForm("username") + email := c.PostForm("email") + description := c.PostForm("description") + oldpwd := c.PostForm("oldpwd") + pwd := c.PostForm("pwd") + if len(pwd) > 0 && config.UserInfo.PWD != oldpwd { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.PWD_INVALID, Message: oasis_err2.GetMsg(oasis_err2.PWD_INVALID)}) + return + } + user_service.SetUser(username, pwd, "", email, description) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + return +} + +// @Summary 获取用户详情 +// @Produce application/json +// @Accept mapplication/json +// @Tags user +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /user/info [get] +func UserInfo(c *gin.Context) { + var u = make(map[string]string, 2) + u["user_name"] = config.UserInfo.UserName + u["token"] = config.UserInfo.Token + u["head"] = config.UserInfo.Head + u["email"] = config.UserInfo.Email + u["description"] = config.UserInfo.Description + c.JSON(http.StatusOK, + model.Result{ + Success: oasis_err2.SUCCESS, + Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), + Data: u, + }) + return +} diff --git a/route/v1/zerotier.go b/route/v1/zerotier.go new file mode 100644 index 0000000..28622ef --- /dev/null +++ b/route/v1/zerotier.go @@ -0,0 +1,459 @@ +package v1 + +import ( + json2 "encoding/json" + "github.com/gin-gonic/gin" + "net/http" + "oasis/model" + "oasis/pkg/config" + oasis_err2 "oasis/pkg/utils/oasis_err" + "oasis/service" +) + +// @Summary 登录zerotier获取token +// @Produce application/json +// @Accept multipart/form-data +// @Tags zerotier +// @Param username formData string true "User name" +// @Param pwd formData string true "password" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/login [post] +func ZeroTierGetToken(c *gin.Context) { + username := c.PostForm("username") + pwd := c.PostForm("pwd") + if len(username) == 0 || len(pwd) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + errInfo := service.MyService.ZeroTier().GetToken(username, pwd) + + if len(errInfo) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: oasis_err2.GetMsg(oasis_err2.GET_TOKEN_ERROR)}) + } else { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + } +} + +// @Summary 注册zerotier +// @Produce application/json +// @Accept multipart/form-data +// @Tags zerotier +// @Param firstName formData string true "first name" +// @Param pwd formData string true "password" +// @Param email formData string true "email" +// @Param lastName formData string true "last name" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/register [post] +func ZeroTierRegister(c *gin.Context) { + firstName := c.PostForm("firstName") + pwd := c.PostForm("pwd") + email := c.PostForm("email") + lastName := c.PostForm("lastName") + if len(firstName) == 0 || len(pwd) == 0 || len(email) == 0 || len(lastName) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + errInfo := service.MyService.ZeroTier().ZeroTierRegister(email, lastName, firstName, pwd) + if len(errInfo) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) + } else { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.ERROR, Message: errInfo}) + } +} + +// @Summary 是否需要登录zerotier +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Success 200 {string} string "false:需要登录,true:不需要登录" +// @Router /zerotier/islogin [get] +func ZeroTierIsNeedLogin(c *gin.Context) { + if len(config.ZeroTierInfo.Token) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: false}) + } else { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: true}) + } +} + +// @Summary 获取zerotier网络列表 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/list [get] +func ZeroTierGetNetworkList(c *gin.Context) { + jsonList, joined := service.MyService.ZeroTier().ZeroTierNetworkList(config.ZeroTierInfo.Token) + rdata := make(map[string]interface{}) + rdata["network_list"] = jsonList + rdata["joined"] = joined + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: rdata}) +} + +// @Summary 获取zerotier网络详情 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Success 200 {string} string "ok" +// @Router /zerotier/info/{id} [get] +func ZeroTierGetNetworkGetInfo(c *gin.Context) { + id := c.Param("id") + if len(id) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info, joined := service.MyService.ZeroTier().ZeroTierGetInfo(config.ZeroTierInfo.Token, id) + rdata := make(map[string]interface{}) + rdata["info"] = info + rdata["joined"] = joined + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: rdata}) +} + +//// @Summary 获取zerotier网络状态 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Success 200 {string} string "ok" +//// @Router /zerotier/status [get] +//func ZeroTierGetNetworkGetStatus(c *gin.Context) { +// status := service.MyService.ZeroTier().ZeroTierGetStatus(config.ZeroTierInfo.Token) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: status}) +//} + +//// @Summary 修改网络类型 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param type formData string true "Private true/false" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/type/{id} [put] +//func ZeroTierEditType(c *gin.Context) { +// id := c.Param("id") +// t := c.PostForm("type") +// if len(id) == 0 || len(t) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"config":{"private":` + t + `}}` +// info := service.MyService.ZeroTier().EditNetwork(config.ZeroTierInfo.Token, postData, id) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +//// @Summary 修改名称 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param name formData string true "需要过滤特殊字符串" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/name/{id} [put] +//func ZeroTierEditName(c *gin.Context) { +// id := c.Param("id") +// name := c.PostForm("name") +// if len(id) == 0 || len(name) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"config":{"name":"` + name + `"}}` +// info := service.MyService.ZeroTier().EditNetwork(config.ZeroTierInfo.Token, postData, id) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +//// @Summary V6Assign (注意三个属性需要一起传过来,不传的会被zerotier设置成false) +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param v6plan formData string false "true/false" +//// @Param rfc formData string false "true/false" +//// @Param auto formData string false "true/false" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/v6assign/{id} [put] +//func ZeroTierEditV6Assign(c *gin.Context) { +// id := c.Param("id") +// v6plan := c.PostForm("v6plan") +// rfc := c.PostForm("rfc") +// auto := c.PostForm("auto") +// if len(id) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// var spicing string +// if len(v6plan) > 0 { +// spicing = `"6plane":` + v6plan +// } +// if len(rfc) > 0 { +// if len(spicing) > 0 { +// spicing += "," +// } +// spicing += `"rfc4193":` + rfc +// } +// +// if len(auto) > 0 { +// if len(spicing) > 0 { +// spicing += "," +// } +// spicing += `"zt":` + auto +// } +// postData := `{"config":{"v6AssignMode":{` + spicing + `}}}` +// info := service.MyService.ZeroTier().EditNetwork(config.ZeroTierInfo.Token, postData, id) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +//// @Summary Broadcast +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param broadcast formData string true "true/false" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/broadcast/{id} [put] +//func ZeroTierEditBroadcast(c *gin.Context) { +// id := c.Param("id") +// broadcast := c.PostForm("broadcast") +// if len(id) == 0 || len(broadcast) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"config":{"enableBroadcast":` + broadcast + `}}` +// info := service.MyService.ZeroTier().EditNetwork(config.ZeroTierInfo.Token, postData, id) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +// @Summary 网络列表 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Success 200 {string} string "ok" +// @Router /zerotier/member/{id} [get] +func ZeroTierMemberList(c *gin.Context) { + id := c.Param("id") + if len(id) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.ZeroTier().MemberList(config.ZeroTierInfo.Token, id) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary create new network +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/create [post] +func ZeroTierCreateNetwork(c *gin.Context) { + info := service.MyService.ZeroTier().CreateNetwork(config.ZeroTierInfo.Token) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +//// @Summary 通过/拒绝客户端 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param mId path string true "member_id" +//// @Param auth formData string true "true/false" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/member/{id}/auth/{mId} [put] +//func ZeroTierMemberAuth(c *gin.Context) { +// id := c.Param("id") +// mId := c.Param("mId") +// auth := c.PostForm("auth") +// if len(id) == 0 || len(mId) == 0 || len(auth) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"config":{"authorized":` + auth + `}}` +// info := service.MyService.ZeroTier().EditNetworkMember(config.ZeroTierInfo.Token, postData, id, mId) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +//// @Summary 修改名字 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param mId path string true "member_id" +//// @Param name formData string true "name" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/member/{id}/name/{mId} [put] +//func ZeroTierMemberName(c *gin.Context) { +// id := c.Param("id") +// mId := c.Param("mId") +// name := c.PostForm("name") +// if len(id) == 0 || len(mId) == 0 || len(name) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"name":"` + name + `"}` +// info := service.MyService.ZeroTier().EditNetworkMember(config.ZeroTierInfo.Token, postData, id, mId) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +//// @Summary 修改桥接 +//// @Produce application/json +//// @Accept application/json +//// @Tags zerotier +//// @Security ApiKeyAuth +//// @Param id path string true "network id" +//// @Param mId path string true "member_id" +//// @Param bridge formData string true "true/false" +//// @Success 200 {string} string "ok" +//// @Router /zerotier/member/{id}/bridge/{mId} [put] +//func ZeroTierMemberBridge(c *gin.Context) { +// id := c.Param("id") +// mId := c.Param("mId") +// bridge := c.PostForm("bridge") +// if len(id) == 0 || len(mId) == 0 || len(bridge) == 0 { +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) +// return +// } +// postData := `{"config":{"activeBridge":` + bridge + `}}` +// info := service.MyService.ZeroTier().EditNetworkMember(config.ZeroTierInfo.Token, postData, id, mId) +// c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +//} + +// @Summary 修改网络 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Param json formData string true "json数据" +// @Success 200 {string} string "ok" +// @Router /zerotier/edit/{id} [put] +func ZeroTierEdit(c *gin.Context) { + id := c.Param("id") + json := c.PostForm("json") + if len(id) == 0 || len(json) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.ZeroTier().EditNetwork(config.ZeroTierInfo.Token, json, id) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 获取已加入的网络 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/joined/list [get] +func ZeroTierJoinedList(c *gin.Context) { + info := service.MyService.ZeroTier().GetJoinNetworks() + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: json2.RawMessage(info)}) +} + +// @Summary 修改网络用户信息 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Param mId path string true "mId" +// @Param json formData string true "json数据" +// @Success 200 {string} string "ok" +// @Router /zerotier/member/{id}/edit/{mId} [put] +func ZeroTierMemberEdit(c *gin.Context) { + id := c.Param("id") + mId := c.Param("mId") + json := c.PostForm("json") + if len(id) == 0 || len(json) == 0 || len(mId) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.ZeroTier().EditNetworkMember(config.ZeroTierInfo.Token, json, id, mId) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 删除网络中的用户 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Param mId path string true "member_id" +// @Success 200 {string} string "ok" +// @Router /zerotier/member/{id}/del/{mId} [delete] +func ZeroTierMemberDelete(c *gin.Context) { + id := c.Param("id") + mId := c.Param("mId") + if len(id) == 0 || len(mId) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.ZeroTier().DeleteMember(config.ZeroTierInfo.Token, id, mId) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 删除网络 +// @Produce application/json +// @Accept application/json +// @Tags zerotier +// @Security ApiKeyAuth +// @Param id path string true "network id" +// @Success 200 {string} string "ok" +// @Router /zerotier/network/{id}/del [delete] +func ZeroTierDeleteNetwork(c *gin.Context) { + id := c.Param("id") + if len(id) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + info := service.MyService.ZeroTier().DeleteNetwork(config.ZeroTierInfo.Token, id) + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} + +// @Summary 加入网络 +// @Produce application/json +// @Accept multipart/form-data +// @Tags zerotier +// @Param id path string true "network id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/join/{id} [post] +func ZeroTierJoinNetwork(c *gin.Context) { + networkId := c.Param("id") + service.MyService.ZeroTier().ZeroTierJoinNetwork(networkId) + if len(networkId) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) +} + +// @Summary 获取zerotier网络列表 +// @Produce application/json +// @Accept multipart/form-data +// @Tags zerotier +// @Param id path string true "network id" +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zerotier/leave/{id} [post] +func ZeroTierLeaveNetwork(c *gin.Context) { + networkId := c.Param("id") + service.MyService.ZeroTier().ZeroTierLeaveNetwork(networkId) + if len(networkId) == 0 { + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)}) + return + } + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)}) +} diff --git a/route/v1/zima_info.go b/route/v1/zima_info.go new file mode 100644 index 0000000..6a9875e --- /dev/null +++ b/route/v1/zima_info.go @@ -0,0 +1,138 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "github.com/shirou/gopsutil/v3/disk" + "net/http" + "oasis/model" + oasis_err2 "oasis/pkg/utils/oasis_err" + "oasis/service" + "strings" + "time" + "unsafe" +) + +// @Summary 获取cpu信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/getcpuinfo [get] +func CupInfo(c *gin.Context) { + //检查参数是否正确 + cpu := service.MyService.ZiMa().GetCpuPercent() + num := service.MyService.ZiMa().GetCpuCoreNum() + data := make(map[string]interface{}) + data["percent"] = cpu + data["num"] = num + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) + +} + +// @Summary 获取内存信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/getmeminfo [get] +func MemInfo(c *gin.Context) { + + //检查参数是否正确 + mem := service.MyService.ZiMa().GetMemInfo() + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: mem}) + +} + +// @Summary 获取硬盘信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/getdiskinfo [get] +func DiskInfo(c *gin.Context) { + disk := service.MyService.ZiMa().GetDiskInfo() + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: disk}) +} + +// @Summary 获取网络信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/getnetinfo [get] +func NetInfo(c *gin.Context) { + netList := service.MyService.ZiMa().GetNetInfo() + + newNet := []model.IOCountersStat{} + for _, n := range netList { + for _, netCardName := range service.MyService.ZiMa().GetNet(true) { + if n.Name == netCardName { + item := *(*model.IOCountersStat)(unsafe.Pointer(&n)) + item.State = strings.TrimSpace(service.MyService.ZiMa().GetNetState(n.Name)) + item.DateTime = time.Now() + newNet = append(newNet, item) + break + } + } + } + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: newNet}) +} + +// @Summary 获取信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/getinfo [get] +func Info(c *gin.Context) { + var data = make(map[string]interface{}, 4) + + var diskArr []*disk.UsageStat + diskArr = append(diskArr, service.MyService.ZiMa().GetDiskInfo()) + data["disk"] = diskArr + cpu := service.MyService.ZiMa().GetCpuPercent() + num := service.MyService.ZiMa().GetCpuCoreNum() + cpuData := make(map[string]interface{}) + cpuData["percent"] = cpu + cpuData["num"] = num + data["cpu"] = cpuData + data["mem"] = service.MyService.ZiMa().GetMemInfo() + + //拼装网络信息 + netList := service.MyService.ZiMa().GetNetInfo() + newNet := []model.IOCountersStat{} + nets := service.MyService.ZiMa().GetNet(true) + for _, n := range netList { + for _, netCardName := range nets { + if n.Name == netCardName { + item := *(*model.IOCountersStat)(unsafe.Pointer(&n)) + item.State = strings.TrimSpace(service.MyService.ZiMa().GetNetState(n.Name)) + item.DateTime = time.Now() + newNet = append(newNet, item) + break + } + } + } + + data["net"] = newNet + + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data}) +} + +// @Summary 获取信息系统信息 +// @Produce application/json +// @Accept application/json +// @Tags zima +// @Security ApiKeyAuth +// @Success 200 {string} string "ok" +// @Router /zima/sysinfo [get] +func SysInfo(c *gin.Context) { + info := service.MyService.ZiMa().GetSysInfo() + c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info}) +} diff --git a/service/app.go b/service/app.go new file mode 100644 index 0000000..1a0c968 --- /dev/null +++ b/service/app.go @@ -0,0 +1,198 @@ +package service + +import ( + "context" + json2 "encoding/json" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + client2 "github.com/docker/docker/client" + "github.com/pkg/errors" + "github.com/tidwall/gjson" + "gorm.io/gorm" + "oasis/model" + "oasis/pkg/config" + "oasis/pkg/docker" + "oasis/pkg/utils/command" + httper2 "oasis/pkg/utils/httper" + loger2 "oasis/pkg/utils/loger" + model2 "oasis/service/model" + "strings" + "time" +) + +type AppService interface { + GetMyList(index, size int, position bool) *[]model2.MyAppList + SaveContainer(m model2.AppListDBModel) + GetServerAppInfo(id string) model.ServerAppList + GetUninstallInfo(id string) model2.AppListDBModel + RemoveContainerById(id string) + GetContainerInfo(name string) (types.Container, error) + GetAppDBInfo(id string) model2.AppListDBModel + UpdateApp(m model2.AppListDBModel) + GetSimpleContainerInfo(name string) (types.Container, error) + DelAppConfigDir(id string) +} + +type appStruct struct { + db *gorm.DB + log loger2.OLog +} + +//获取我的应用列表 +func (a *appStruct) GetMyList(index, size int, position bool) *[]model2.MyAppList { + //获取docker应用 + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + a.log.Error("初始化client失败", "app.getmylist", "line:36", err) + } + defer cli.Close() + fts := filters.NewArgs() + fts.Add("label", "origin") + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts}) + if err != nil { + a.log.Error("获取docker容器失败", "app.getmylist", "line:42", err) + } + + //获取本地数据库应用 + + var lm []model2.AppListDBModel + a.db.Table(model2.CONTAINERTABLENAME).Select("title,icon,port_map,`index`,container_id,position,label,slogan").Find(&lm) + + list := []model2.MyAppList{} + lMap := make(map[string]interface{}) + for _, dbModel := range lm { + if position { + if dbModel.Position { + lMap[dbModel.ContainerId] = dbModel + } + } else { + lMap[dbModel.ContainerId] = dbModel + } + } + for _, container := range containers { + + if lMap[container.ID] != nil { + var m model2.AppListDBModel + m = lMap[container.ID].(model2.AppListDBModel) + if len(m.Label) == 0 { + m.Label = m.Title + } + + info, err := cli.ContainerInspect(context.Background(), container.ID) + var tm string + if err != nil { + tm = time.Now().String() + } else { + tm = info.State.StartedAt + } + list = append(list, model2.MyAppList{ + Name: m.Label, + Icon: m.Icon, + State: container.State, + CustomId: strings.ReplaceAll(container.Names[0], "/", ""), + Port: m.PortMap, + Index: m.Index, + UpTime: tm, + Slogan: m.Slogan, + //Rely: m.Rely, + }) + } + + } + + return &list + +} + +//获取我的应用列表 +func (a *appStruct) GetContainerInfo(name string) (types.Container, error) { + //获取docker应用 + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + a.log.Error("初始化client失败", "app.getmylist", "line:36", err) + } + filters := filters.NewArgs() + filters.Add("name", name) + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: filters}) + if err != nil { + a.log.Error("获取docker容器失败", "app.getmylist", "line:42", err) + } + + if len(containers) > 0 { + return containers[0], nil + } + return types.Container{}, nil + +} + +func (a *appStruct) GetSimpleContainerInfo(name string) (types.Container, error) { + //获取docker应用 + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return types.Container{}, err + } + defer cli.Close() + filters := filters.NewArgs() + filters.Add("name", name) + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: filters}) + if len(containers) > 0 { + return containers[0], nil + } + return types.Container{}, errors.New("container not existent") +} + +//获取我的应用列表 +func (a *appStruct) GetAppDBInfo(id string) model2.AppListDBModel { + var m model2.AppListDBModel + a.db.Table(model2.CONTAINERTABLENAME).Where("custom_id = ?", id).First(&m) + return m +} + +//根据容器id获取镜像名称 +func (a *appStruct) GetUninstallInfo(id string) model2.AppListDBModel { + var m model2.AppListDBModel + a.db.Table(model2.CONTAINERTABLENAME).Select("image,version,enable_upnp,ports,envs,volumes,origin").Where("custom_id = ?", id).First(&m) + return m +} + +func (a *appStruct) GetServerAppInfo(id string) model.ServerAppList { + + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + infoS := httper2.Get(config.ServerInfo.ServerApi+"/v1/app/info/"+id, head) + + info := model.ServerAppList{} + json2.Unmarshal([]byte(gjson.Get(infoS, "data").String()), &info) + + return info +} + +//创建容器成功后保存容器 +func (a *appStruct) SaveContainer(m model2.AppListDBModel) { + a.db.Table(model2.CONTAINERTABLENAME).Create(&m) +} + +func (a *appStruct) UpdateApp(m model2.AppListDBModel) { + a.db.Table(model2.CONTAINERTABLENAME).Save(&m) +} + +func (a *appStruct) DelAppConfigDir(id string) { + command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;DelAppConfigDir " + docker.GetDir(id, "/config")) +} + +func (a *appStruct) RemoveContainerById(id string) { + a.db.Table(model2.CONTAINERTABLENAME).Where("custom_id = ?", id).Delete(&model2.AppListDBModel{}) +} + +func NewAppService(db *gorm.DB, logger loger2.OLog) AppService { + return &appStruct{db: db, log: logger} +} diff --git a/service/ddns.go b/service/ddns.go new file mode 100644 index 0000000..24e32c9 --- /dev/null +++ b/service/ddns.go @@ -0,0 +1,119 @@ +package service + +import ( + "gorm.io/gorm" + ip_helper2 "oasis/pkg/utils/ip_helper" + loger2 "oasis/pkg/utils/loger" + "oasis/service/ddns" + "oasis/service/model" + "os/exec" +) + +type ddnsStruct struct { + db *gorm.DB + log loger2.OLog +} + +type DDNSService interface { + IsExis(t int, domain string, host string) bool + GetExternalIP() (string, string) + GetConfigList() *[]model.DDNSList + DeleteConfig(id uint) bool + GetType(name string) (uint, string) + SaveConfig(model model.DDNSUpdataDBModel) error +} + +//判断当前添加的是否存在 +func (d *ddnsStruct) IsExis(t int, domain string, host string) bool { + var count int64 + d.db.Table(model.DDNSLISTTABLENAME).Where("type=? AND domain=? AND host=?", t, domain, host).Count(&count) + if count > 0 { + return true + } + return false +} + +//前台获取已配置的ddns列表 +func (d *ddnsStruct) GetConfigList() *[]model.DDNSList { + var s []model.DDNSList + d.db.Table(model.DDNSLISTTABLENAME).Select("o_ddns_type.name as name,o_ddns.id,host,domain,created_at,updated_at,message,state").Joins("left join o_ddns_type on o_ddns.type=o_ddns_type.id").Scan(&s) + return &s +} + +func (d *ddnsStruct) DeleteConfig(id uint) bool { + d.db.Delete(&model.DDNSUpdataDBModel{Id: id}) + return true +} + +func (d *ddnsStruct) GetExternalIP() (string, string) { + ipv4 := make(chan string) + ipv6 := make(chan string) + go func() { ipv4 <- ip_helper2.GetExternalIPV4() }() + go func() { ipv6 <- ip_helper2.GetExternalIPV6() }() + + return <-ipv4, <-ipv6 +} + +func NewDDNSService(db *gorm.DB, log loger2.OLog) DDNSService { + return &ddnsStruct{db, log} +} + +//根据名称获取类型 +func (d *ddnsStruct) GetType(name string) (uint, string) { + var result model.DDNSTypeDBModel + d.db.Model(&model.DDNSTypeDBModel{}).Where("name = ?", name).First(&result) + return result.Id, result.Name +} + +//保存配置到数据库 +func (d *ddnsStruct) GetDockerRootDir(model model.DDNSUpdataDBModel) error { + return d.db.Create(&model).Error +} + +//保存配置到数据库 +func (d *ddnsStruct) SaveConfig(model model.DDNSUpdataDBModel) error { + return d.db.Create(&model).Error +} + +//更新数据库ping状态 +func chackPing(b chan bool, url string) { + cmd := exec.Command("ping", url, "-c", "1", "-W", "5") + err := cmd.Run() + if err != nil { + b <- false + } else { + b <- true + } +} + +//更新列表 +func UpdataDDNSList(db *gorm.DB) { + var s []model.DDNSCoreList + db.Table(model.DDNSLISTTABLENAME).Select("o_ddns_type.name as name,o_ddns_type.api_host as api_host,o_ddns.id,`host`,domain,user_name,`password`,`key`,secret,type").Joins("left join o_ddns_type on o_ddns.type=o_ddns_type.id").Scan(&s) + for _, item := range s { + var msg string + switch item.Type { + case 1: + var godaddy = &ddns.GoDaddy{ + Host: item.Host, + Key: item.Key, + Secret: item.Secret, + Domain: item.Domain, + IPV4: ip_helper2.GetExternalIPV4(), + IPV6: ip_helper2.GetExternalIPV6(), + ApiHost: item.ApiHost, + } + msg = godaddy.Update() + } + + b := make(chan bool) + + //获取ping状态 + go chackPing(b, item.Host+"."+item.Domain) + + item.State = <-b + item.Message = msg + db.Table(model.DDNSLISTTABLENAME).Model(&item).Select("state", "message").Updates(&item) + + } +} diff --git a/service/ddns/common.go b/service/ddns/common.go new file mode 100644 index 0000000..9d26ee0 --- /dev/null +++ b/service/ddns/common.go @@ -0,0 +1,34 @@ +package ddns + +import ( + "net/http" +) + +func SetUserAgent(request *http.Request) { + request.Header.Set("User-Agent", "Oasis lauren.pan@icewhale.org") +} + +func SetContentType(request *http.Request, contentType string) { + request.Header.Set("Content-Type", contentType) +} + +func SetAccept(request *http.Request, acceptContent string) { + request.Header.Set("Accept", acceptContent) +} + +func SetAuthBearer(request *http.Request, token string) { + request.Header.Set("Authorization", "Bearer "+token) +} + +func SetAuthSSOKey(request *http.Request, key, secret string) { + request.Header.Set("Authorization", "sso-key "+key+":"+secret) +} + +func SetOauth(request *http.Request, value string) { + request.Header.Set("oauth", value) +} + +func SetXFilter(request *http.Request, value string) { + request.Header.Set("X-Filter", value) +} + diff --git a/service/ddns/goddy.go b/service/ddns/goddy.go new file mode 100644 index 0000000..5b144ad --- /dev/null +++ b/service/ddns/goddy.go @@ -0,0 +1,87 @@ +package ddns + +import ( + "bytes" + "context" + "fmt" + "github.com/tidwall/gjson" + "io/ioutil" + "net/http" + "oasis/pkg/ddns" + "time" +) + +type GoDaddyService interface { + Update(ctx context.Context, client *http.Client) +} +type GoDaddy struct { + Host string `json:"host"` + Key string `json:"key"` + Secret string `json:"secret"` + Domain string `json:"domain"` + IPV4 string `json:"ipv_4"` + IPV6 string `json:"ipv_6"` + ApiHost string `json:"api_host"` +} + +func (g *GoDaddy) Update() string { + client := &http.Client{Timeout: 30 * time.Second} + recordType := ddns.A + buffer1 := bytes.NewBuffer(nil) + buffer1.WriteString(`[{"data":"`) + buffer1.WriteString(g.IPV4) + buffer1.WriteString(`"}]`) + request, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", g.ApiHost, g.Domain, recordType, g.Host), buffer1) + if err != nil { + return err.Error() + } + g.setHead(request) + response, err := client.Do(request) + if err != nil { + return err.Error() + } + defer response.Body.Close() + b, err := ioutil.ReadAll(response.Body) + if err != nil { + return err.Error() + } + defer response.Body.Close() + if len(b) > 0 { + r := gjson.GetBytes(b, "message") + return r.String() + } + if len(g.IPV6) > 0 { + recordType = ddns.AAAA + buffer1 := bytes.NewBuffer(nil) + buffer1.WriteString(`[{"data":"`) + buffer1.WriteString(g.IPV6) + buffer1.WriteString(`"}]`) + request6, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/v1/domains/%s/records/%s/%s", ddns.GODADDYAPIURL, g.Domain, recordType, g.Host), buffer1) + if err != nil { + return err.Error() + } + g.setHead(request6) + response6, err := client.Do(request6) + if err != nil { + return err.Error() + } + defer response6.Body.Close() + + d, err := ioutil.ReadAll(response6.Body) + if err != nil { + return err.Error() + } + if len(d) > 0 { + r := gjson.GetBytes(d, "message") + return r.String() + } + } + return "" +} + +func (g *GoDaddy) setHead(request *http.Request) { + SetUserAgent(request) + SetAuthSSOKey(request, g.Key, g.Secret) + SetContentType(request, "application/json") + SetAccept(request, "application/json") +} diff --git a/service/ddns/goddy_test.go b/service/ddns/goddy_test.go new file mode 100644 index 0000000..7738af6 --- /dev/null +++ b/service/ddns/goddy_test.go @@ -0,0 +1,15 @@ +package ddns + +import ( + "testing" +) + +func TestSetConfig(t *testing.T) { + var model GoDaddy + model.IPV4 = "180.164.179.198" + model.Domain = "link-liang.xyz" + model.Secret = "secret" + model.Key = "key" + //model.Type=ddns.GOGADDY + //model.SetConfig() +} diff --git a/service/disk.go b/service/disk.go new file mode 100644 index 0000000..b08c990 --- /dev/null +++ b/service/disk.go @@ -0,0 +1,212 @@ +package service + +import ( + json2 "encoding/json" + "fmt" + "github.com/shirou/gopsutil/v3/disk" + "github.com/tidwall/gjson" + "oasis/model" + "oasis/pkg/config" + command2 "oasis/pkg/utils/command" + loger2 "oasis/pkg/utils/loger" + "strconv" + "strings" +) + +type DiskService interface { + GetPlugInDisk() []string + LSBLK() []model.LSBLKModel + FormatDisk(path, format string) string + UmountPointAndRemoveDir(path string) string + GetDiskInfo(path string) model.LSBLKModel + DelPartition(path, num string) string + AddPartition(path, num string, size uint64) string + GetDiskInfoByPath(path string) *disk.UsageStat +} +type diskService struct { + log loger2.OLog +} + +//通过脚本获取外挂磁盘 +func (d *diskService) GetPlugInDisk() []string { + return command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetPlugInDisk") +} + +//格式化硬盘 +func (d *diskService) FormatDisk(path, format string) string { + + r := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;FormatDisk " + path + " " + format) + fmt.Println(r) + return "" +} + +//移除挂载点,删除目录 +func (d *diskService) UmountPointAndRemoveDir(path string) string { + r := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;UMountPorintAndRemoveDir " + path) + fmt.Println(r) + return "" +} + +//删除分区 +func (d *diskService) DelPartition(path, num string) string { + r := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;DelPartition " + path + " " + num) + fmt.Println(r) + return "" +} + +//添加分区 +func (d *diskService) AddPartition(path, num string, size uint64) string { + + var maxSector uint64 = 0 + + chiList := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetPartitionSectors " + path) + if len(chiList) == 0 { + d.log.Error("chiList length error") + } + for i := 0; i < len(chiList); i++ { + tempArr := strings.Split(chiList[i], ",") + tempSector, _ := strconv.ParseUint(tempArr[2], 10, 64) + if tempSector > maxSector { + maxSector = tempSector + } + } + + r := command2.ExecResultStrArray("source ./shell/helper.sh ;AddPartition " + path + " " + num + " " + strconv.FormatUint(maxSector+1, 10) + " " + strconv.FormatUint(size+maxSector+1, 10)) + fmt.Println(r) + return "" +} + +//获取硬盘详情 +func (d *diskService) GetDiskInfoByPath(path string) *disk.UsageStat { + diskInfo, err := disk.Usage(path + "1") + if err != nil { + fmt.Println(err) + } + fmt.Println(path) + fmt.Println(diskInfo) + diskInfo.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.UsedPercent), 64) + diskInfo.InodesUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.InodesUsedPercent), 64) + return diskInfo +} + +//获取磁盘信息 +func (d *diskService) LSBLK() []model.LSBLKModel { + str := command2.ExecLSBLK() + if str == nil { + d.log.Error("lsblk exec error") + return nil + } + var m []model.LSBLKModel + err := json2.Unmarshal([]byte(gjson.Get(string(str), "blockdevices").String()), &m) + if err != nil { + d.log.Error("json ummarshal error", err) + } + + var n []model.LSBLKModel + + var c []model.LSBLKModel + + var fsused uint64 + + var health = true + for _, i := range m { + if i.Children != nil { + fsused = 0 + for _, child := range i.Children { + if child.RM { + child.Health = strings.TrimSpace(command2.ExecResultStr("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetDiskHealthState " + child.Path)) + if strings.ToLower(strings.TrimSpace(child.State)) != "ok" { + health = false + } + f, _ := strconv.ParseUint(child.FSUsed, 10, 64) + fsused += f + } else { + health = false + } + c = append(c, child) + } + i.Format = strings.TrimSpace(command2.ExecResultStr("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetDiskType " + i.Path)) + if health { + i.Health = "OK" + } + i.FSUsed = strconv.FormatUint(fsused, 10) + i.Children = c + if fsused > 0 { + i.UsedPercent, err = strconv.ParseFloat(fmt.Sprintf("%.4f", float64(fsused)/float64(i.Size)), 64) + fmt.Println(err) + } + n = append(n, i) + health = true + c = []model.LSBLKModel{} + fsused = 0 + } + } + return n +} + +func (d *diskService) GetDiskInfo(path string) model.LSBLKModel { + str := command2.ExecLSBLKByPath(path) + if str == nil { + d.log.Error("lsblk exec error") + return model.LSBLKModel{} + } + var ml []model.LSBLKModel + err := json2.Unmarshal([]byte(gjson.Get(string(str), "blockdevices").String()), &ml) + if err != nil { + d.log.Info(string(str)) + d.log.Error("json ummarshal error", err) + return model.LSBLKModel{} + } + //todo 需要判断长度 + m := ml[0] + //声明数组 + chiArr := make(map[string]string) + chiList := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetPartitionSectors " + m.Path) + if len(chiList) == 0 { + d.log.Error(m.Path, chiList) + d.log.Error("chiList length error") + } + for i := 0; i < len(chiList); i++ { + tempArr := strings.Split(chiList[i], ",") + chiArr[tempArr[0]] = chiList[i] + } + + var maxSector uint64 = 0 + for i := 0; i < len(m.Children); i++ { + tempArr := strings.Split(chiArr[m.Children[i].Path], ",") + m.Children[i].StartSector, _ = strconv.ParseUint(tempArr[1], 10, 64) + m.Children[i].EndSector, _ = strconv.ParseUint(tempArr[2], 10, 64) + if m.Children[i].EndSector > maxSector { + maxSector = m.Children[i].EndSector + } + } + diskEndSector := command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetDiskSizeAndSectors " + m.Path) + + if len(diskEndSector) < 2 { + d.log.Error("diskEndSector length error") + } + + diskEndSectorInt, _ := strconv.ParseUint(diskEndSector[len(diskEndSector)-1], 10, 64) + if (diskEndSectorInt-maxSector)*m.MinIO/1024/1024 > 100 { + //添加可以分区情况 + p := model.LSBLKModel{} + p.Path = "可以添加" + m.Children = append(m.Children, p) + } + return m +} + +//func GetDiskInfo(path string) *disk.UsageStat { +// diskInfo, _ := disk.Usage(path) +// diskInfo.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.UsedPercent), 64) +// diskInfo.InodesUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.InodesUsedPercent), 64) +// return diskInfo +//} + +//func (d *diskService) GetPlugInDisk() []string { +// return disk.Partitions(false) +//} + +func NewDiskService(log loger2.OLog) DiskService { + return &diskService{log: log} +} diff --git a/service/docker.go b/service/docker.go new file mode 100644 index 0000000..7218a54 --- /dev/null +++ b/service/docker.go @@ -0,0 +1,801 @@ +package service + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/binary" + json2 "encoding/json" + "fmt" + "github.com/containerd/containerd" + "github.com/containerd/containerd/cio" + "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/oci" + model2 "oasis/service/model" + types2 "oasis/types" + "syscall" + + //"github.com/containerd/containerd/oci" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/network" + client2 "github.com/docker/docker/client" + "github.com/docker/go-connections/nat" + "io" + "io/ioutil" + "log" + "oasis/model" + "oasis/pkg/docker" + command2 "oasis/pkg/utils/command" + "oasis/pkg/utils/file" + loger2 "oasis/pkg/utils/loger" + "os" + "strconv" + "strings" + "time" +) + +type DockerService interface { + DockerPullImage(imageName string, m model2.AppNotify) error + IsExistImage(imageName string) bool + DockerContainerCreate(imageName string, containerDbId string, m model.CustomizationPostData, net string) (containerId string, err error) + DockerContainerStart(name string) error + DockerContainerStats(name string) (string, error) + DockerListByName(name string) (*types.Container, error) + DockerListByImage(image, version string) (*types.Container, error) + DockerContainerInfo(name string) (*types.ContainerJSON, error) + DockerImageRemove(name string) error + DockerContainerRemove(name string) error + DockerContainerStop(id string) error + DockerContainerUpdate(m model.CustomizationPostData, id string) (err error) + DockerContainerLog(name string) (string, error) + DockerContainerCommit(name string) + DockerNetworkModelList() []types.NetworkResource + DockerImageInfo(image string) +} + +type dockerService struct { + rootDir string + log loger2.OLog +} + +func DockerPs() { + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) + if err != nil { + os.Exit(5) + } + for _, container := range containers { + fmt.Printf("%s %s\n", container.ID[:10], container.Image) + } +} + +//创建默认网络 +func DockerNetwork() { + + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + d, _ := cli.NetworkList(context.Background(), types.NetworkListOptions{}) + for _, resource := range d { + if resource.Name == docker.NETWORKNAME { + return + } + } + cli.NetworkCreate(context.Background(), docker.NETWORKNAME, types.NetworkCreate{}) +} + +//拉取镜像 +func DockerPull() { + + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + + authConfig := types.AuthConfig{ + Username: "cn-north-4@M4OW0IULZ3U6PCQPBUZC", + Password: "7390181a1565f90927bbd98038436b57d6ebc66a3828d7a11dfda42b9c19d91d", + } + encodedJSON, err := json2.Marshal(authConfig) + fmt.Println(err) + + authStr := base64.URLEncoding.EncodeToString(encodedJSON) + reader, err := cli.ImagePull(context.Background(), "swr.cn-north-4.myhuaweicloud.com/root/swr-demo-2048:latest", types.ImagePullOptions{RegistryAuth: authStr}) + + buf := new(bytes.Buffer) + buf.ReadFrom(reader) + fmt.Println(buf.String()) + +} + +//拉取镜像 +func DockerEx() { + + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + + importResponse, err := cli.ImageImport(context.Background(), types.ImageImportSource{ + Source: strings.NewReader("source"), + SourceName: "image_source", + }, "repository_name:imported", types.ImageImportOptions{ + Tag: "imported", + Message: "A message", + Changes: []string{"change1", "change2"}, + }) + + response, err := ioutil.ReadAll(importResponse) + if err != nil { + fmt.Println(err) + } + importResponse.Close() + println(string(response)) + if string(response) != "response" { + fmt.Println("expected response to contain 'response', got %s", string(response)) + } +} + +//func DockerContainerSize() { +// cli, err := client2.NewClientWithOpts(client2.FromEnv) +// //but := bytes.Buffer{} +// d, err := cli.ContainerExecCreate(context.Background(), "c3adcef92bae648890941ac00e6c4024d7f2959c2e629f0b581d6a19d77b5eda") +// fmt.Println(d) +// st, _ := ioutil.ReadAll(d.Body) +// fmt.Println(string(st)) +// if err != nil { +// fmt.Print(err) +// } +// +//} + +func (ds *dockerService) DockerImageInfo(image string) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + + //but := bytes.Buffer{} + d, b, err := cli.ImageInspectWithRaw(context.Background(), image) + st, _ := json2.Marshal(d.Config) + fmt.Println(string(st)) + fmt.Println("换行") + fmt.Println(string(b)) + if err != nil { + fmt.Print(err) + } + +} + +func MsqlExec(container string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + ctx := context.Background() + // 执行/bin/bash命令 + ir, err := cli.ContainerExecCreate(ctx, container, types.ExecConfig{ + AttachStdin: false, + AttachStdout: true, + AttachStderr: true, + Cmd: []string{"date"}, + Tty: true, + Env: []string{"aaa=ddd"}, + }) + err = cli.ContainerExecStart(ctx, ir.ID, types.ExecStartCheck{}) + + fmt.Println(err) + + return err +} + +func Exec(container, row, col string) (hr types.HijackedResponse, err error) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + ctx := context.Background() + // 执行/bin/bash命令 + ir, err := cli.ContainerExecCreate(ctx, container, types.ExecConfig{ + AttachStdin: true, + AttachStdout: true, + AttachStderr: true, + Env: []string{"COLUMNS=" + col, "LINES=" + row}, + Cmd: []string{"/bin/bash"}, + Tty: true, + }) + if err != nil { + return + } + // 附加到上面创建的/bin/bash进程中 + hr, err = cli.ContainerExecAttach(ctx, ir.ID, types.ExecStartCheck{Detach: false, Tty: true}) + if err != nil { + return + } + return +} + +func DockerLog() { + //cli, err := client2.NewClientWithOpts(client2.FromEnv) + //ctx := context.Background() + //ir, err := cli.ContainerLogs(ctx, "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{}) + //str, err := ioutil.ReadAll(ir) + //fmt.Println(string(str)) + //fmt.Println(err) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + client, _ := client2.NewClientWithOpts(client2.FromEnv) + reader, err := client.ContainerLogs(ctx, "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{}) + if err != nil { + log.Fatal(err) + } + _, err = io.Copy(os.Stdout, reader) + if err != nil && err != io.EOF { + log.Fatal(err) + } +} + +func DockerLogs() { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + i, err := cli.ContainerLogs(context.Background(), "79c6fa382c330b9149e2d28d24f4d2c231cdb8cfc0710c2d268ccee13c5b24f8", types.ContainerLogsOptions{ + ShowStderr: true, + ShowStdout: true, + Timestamps: false, + Follow: true, + Tail: "40", + }) + if err != nil { + log.Fatal(err) + } + hdr := make([]byte, 8) + for { + _, err := i.Read(hdr) + if err != nil { + log.Fatal(err) + } + var w io.Writer + switch hdr[0] { + case 1: + w = os.Stdout + default: + w = os.Stderr + } + count := binary.BigEndian.Uint32(hdr[4:]) + dat := make([]byte, count) + _, err = i.Read(dat) + fmt.Fprint(w, string(dat)) + } + defer i.Close() +} + +//正式内容 + +//检查镜像是否存在 +func (ds *dockerService) IsExistImage(imageName string) bool { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return false + } + defer cli.Close() + filter := filters.NewArgs() + filter.Add("reference", imageName) + + list, err := cli.ImageList(context.Background(), types.ImageListOptions{Filters: filter}) + + if err == nil && len(list) > 0 { + return true + } + + return false +} + +//安装镜像 +func (ds *dockerService) DockerPullImage(imageName string, m model2.AppNotify) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + out, err := cli.ImagePull(context.Background(), imageName, types.ImagePullOptions{}) + if err != nil { + return err + } + defer out.Close() + if err != nil { + + return err + } + buf := make([]byte, 256) + for { + n, err := out.Read(buf) + if err != nil { + if err != io.EOF { + fmt.Println("read error:", err) + } + break + } + m.Type = types2.NOTIFY_TYPE_INSTALL_LOG + m.State = 0 + m.Speed = 70 + m.Message = string(buf[:n]) + MyService.Notify().UpdateLog(m) + } + return err +} + +//param imageName 镜像名称 +//param containerDbId 数据库的id +//param port 容器内部主端口 +//param mapPort 容器主端口映射到外部的端口 +//param tcp 容器其他tcp端口 +//param udp 容器其他udp端口 +func (ds *dockerService) DockerContainerCreate(imageName string, containerDbId string, m model.CustomizationPostData, net string) (containerId string, err error) { + if len(net) == 0 { + net = "oasis" + } + + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return "", err + } + defer cli.Close() + ports := make(nat.PortSet) + portMaps := make(nat.PortMap) + // ports[nat.Port(fmt.Sprint(m.PortMap)+"/tcp")] = struct{}{} + // if net != "host" { + // portMaps[nat.Port(fmt.Sprint(m.Port)+"/tcp")] = []nat.PortBinding{{HostIP: "", HostPort: m.PortMap}} + // } + + for _, portMap := range m.Ports { + if portMap.Protocol == "tcp" { + tContainer, _ := strconv.Atoi(portMap.ContainerPort) + if tContainer > 0 { + ports[nat.Port(portMap.ContainerPort+"/tcp")] = struct{}{} + if net != "host" { + portMaps[nat.Port(portMap.ContainerPort+"/tcp")] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: portMap.CommendPort}} + } + } + } else if portMap.Protocol == "both" { + + tContainer, _ := strconv.Atoi(portMap.ContainerPort) + if tContainer > 0 { + ports[nat.Port(portMap.ContainerPort+"/tcp")] = struct{}{} + if net != "host" { + portMaps[nat.Port(portMap.ContainerPort+"/tcp")] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: portMap.CommendPort}} + } + } + + uContainer, _ := strconv.Atoi(portMap.ContainerPort) + if uContainer > 0 { + ports[nat.Port(portMap.ContainerPort+"/udp")] = struct{}{} + if net != "host" { + portMaps[nat.Port(portMap.ContainerPort+"/udp")] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: portMap.CommendPort}} + } + } + + } else { + uContainer, _ := strconv.Atoi(portMap.ContainerPort) + if uContainer > 0 { + ports[nat.Port(portMap.ContainerPort+"/udp")] = struct{}{} + if net != "host" { + portMaps[nat.Port(portMap.ContainerPort+"/udp")] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: portMap.CommendPort}} + } + } + } + + } + + var envArr []string + for _, e := range m.Envs { + if len(e.Value) > 0 { + if e.Value == "port_map" { + envArr = append(envArr, e.Name+"="+m.PortMap) + continue + } + envArr = append(envArr, e.Name+"="+e.Value) + } + } + + res := container.Resources{} + if m.CpuShares > 0 { + res.CPUShares = m.CpuShares + } + if m.Memory > 0 { + res.Memory = m.Memory << 20 + } + for _, p := range m.Devices { + if len(p.Path) > 0 { + res.Devices = append(res.Devices, container.DeviceMapping{PathOnHost: p.Path, PathInContainer: p.ContainerPath}) + } + } + // volumes bind + volumes := []mount.Mount{} + for _, v := range m.Volumes { + path := v.Path + if len(path) == 0 { + path = docker.GetDir(containerDbId, v.ContainerPath) + if len(path) == 0 { + continue + } + + } + err := file.IsNotExistMkDir(path) + if err != nil { + ds.log.Error("mkdir error", err) + continue + } + + volumes = append(volumes, mount.Mount{ + Type: mount.TypeBind, + Source: path, + Target: v.ContainerPath, + }) + + } + + rp := container.RestartPolicy{} + + if len(m.Restart) > 0 { + rp.Name = m.Restart + } + + config := &container.Config{ + Image: imageName, + Labels: map[string]string{"origin": m.Origin, m.Origin: m.Origin}, + Env: envArr, + } + hostConfig := &container.HostConfig{Resources: res, Mounts: volumes, RestartPolicy: rp, NetworkMode: container.NetworkMode(net)} + //if net != "host" { + config.ExposedPorts = ports + hostConfig.PortBindings = portMaps + //} + + containerDb, err := cli.ContainerCreate(context.Background(), + config, + hostConfig, + &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{net: {NetworkID: "", Aliases: []string{}}}}, + nil, + containerDbId) + if err != nil { + return "", err + } + return containerDb.ID, err +} + +//删除容器 +func (ds *dockerService) DockerContainerRemove(name string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + err = cli.ContainerRemove(context.Background(), name, types.ContainerRemoveOptions{}) + + //路径处理 + path := docker.GetDir(name, "/config") + if !file.CheckNotExist(path) { + file.RMDir(path) + } + + if err != nil { + return err + } + + return err +} + +//删除镜像 +func (ds *dockerService) DockerImageRemove(name string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + imageList, err := cli.ImageList(context.Background(), types.ImageListOptions{}) + + imageId := "" + +Loop: + for _, ig := range imageList { + for _, i := range ig.RepoTags { + if i == name { + imageId = ig.ID + break Loop + } + } + } + _, err = cli.ImageRemove(context.Background(), imageId, types.ImageRemoveOptions{}) + return err +} + +func DockerImageRemove(name string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + imageList, err := cli.ImageList(context.Background(), types.ImageListOptions{}) + imageId := "" + +Loop: + for _, ig := range imageList { + fmt.Println(ig.RepoDigests) + fmt.Println(ig.Containers) + for _, i := range ig.RepoTags { + if i == name { + imageId = ig.ID + break Loop + } + } + } + _, err = cli.ImageRemove(context.Background(), imageId, types.ImageRemoveOptions{}) + return err +} + +//停止镜像 +func (ds *dockerService) DockerContainerStop(id string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + err = cli.ContainerStop(context.Background(), id, nil) + return err +} + +//启动容器 +func (ds *dockerService) DockerContainerStart(name string) error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + err = cli.ContainerStart(context.Background(), name, types.ContainerStartOptions{}) + return err +} + +//查看日志 +func (ds *dockerService) DockerContainerLog(name string) (string, error) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return "", err + } + defer cli.Close() + body, err := cli.ContainerLogs(context.Background(), name, types.ContainerLogsOptions{ShowStderr: true, ShowStdout: true}) + if err != nil { + return "", err + } + + defer body.Close() + content, err := ioutil.ReadAll(body) + if err != nil { + return "", err + } + return string(content), nil +} + +func DockerContainerStats1() error { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + dss, err := cli.ContainerStats(context.Background(), "dockermysql", false) + if err != nil { + return err + } + defer dss.Body.Close() + sts, err := ioutil.ReadAll(dss.Body) + if err != nil { + return err + } + fmt.Println(string(sts)) + return nil +} + +//获取容器状态 +func (ds *dockerService) DockerContainerStats(name string) (string, error) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return "", err + } + defer cli.Close() + dss, err := cli.ContainerStats(context.Background(), name, false) + if err != nil { + return "", err + } + defer dss.Body.Close() + sts, err := ioutil.ReadAll(dss.Body) + if err != nil { + return "", err + } + return string(sts), nil +} + +//备份容器 +func (ds *dockerService) DockerContainerCommit(name string) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + fmt.Println(err) + } + defer cli.Close() + d, err := cli.ContainerInspect(context.Background(), name) + dss, err := cli.ContainerCommit(context.Background(), name, types.ContainerCommitOptions{Reference: "test", Config: d.Config}) + if err != nil { + fmt.Println(err) + } + fmt.Println(dss) +} + +func (ds *dockerService) DockerListByName(name string) (*types.Container, error) { + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + filter := filters.NewArgs() + filter.Add("name", name) + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{Filters: filter}) + if err != nil { + return &types.Container{}, err + } + return &containers[0], nil +} + +func (ds *dockerService) DockerListByImage(image, version string) (*types.Container, error) { + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + filter := filters.NewArgs() + filter.Add("ancestor", image+":"+version) + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{Filters: filter}) + if err != nil { + return nil, err + } + if len(containers) == 0 { + return nil, nil + } + return &containers[0], nil +} + +//获取容器详情 +func (ds *dockerService) DockerContainerInfo(name string) (*types.ContainerJSON, error) { + + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return &types.ContainerJSON{}, err + } + defer cli.Close() + d, err := cli.ContainerInspect(context.Background(), name) + if err != nil { + return &types.ContainerJSON{}, err + } + return &d, nil +} + +//更新容器 +//param shares cpu优先级 +//param containerDbId 数据库的id +//param port 容器内部主端口 +//param mapPort 容器主端口映射到外部的端口 +//param tcp 容器其他tcp端口 +//param udp 容器其他udp端口 +func (ds *dockerService) DockerContainerUpdate(m model.CustomizationPostData, id string) (err error) { + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + //重启策略 + rp := container.RestartPolicy{ + Name: "", + MaximumRetryCount: 0, + } + if len(m.Restart) > 0 { + rp.Name = m.Restart + } + res := container.Resources{} + + if m.Memory > 0 { + res.Memory = m.Memory * 1024 * 1024 + res.MemorySwap = -1 + } + if m.CpuShares > 0 { + res.CPUShares = m.CpuShares + } + for _, p := range m.Devices { + res.Devices = append(res.Devices, container.DeviceMapping{PathOnHost: p.Path, PathInContainer: p.ContainerPath}) + } + _, err = cli.ContainerUpdate(context.Background(), id, container.UpdateConfig{RestartPolicy: rp, Resources: res}) + if err != nil { + return err + } + + return +} + +//获取网络列表 +func (ds *dockerService) DockerNetworkModelList() []types.NetworkResource { + + cli, _ := client2.NewClientWithOpts(client2.FromEnv) + defer cli.Close() + networks, _ := cli.NetworkList(context.Background(), types.NetworkListOptions{}) + return networks +} +func NewDcokerService(log loger2.OLog) DockerService { + return &dockerService{rootDir: command2.ExecResultStr(`source ./shell/helper.sh ;GetDockerRootDir`), log: log} +} + +// ---------------------------------------test------------------------------------ +//func ServiceCreate() { +// cli, err := client2.NewClientWithOpts(client2.FromEnv) +// r, err := cli.ServiceCreate(context.Background(), swarm.ServiceSpec{}, types.ServiceCreateOptions{}) +// if err != nil { +// fmt.Println("error", err) +// } +// +// +//} + +func Containerd() { + // create a new client connected to the default socket path for containerd + cli, err := containerd.New("/run/containerd/containerd.sock") + if err != nil { + fmt.Println("111") + fmt.Println(err) + } + defer cli.Close() + + // create a new context with an "example" namespace + ctx := namespaces.WithNamespace(context.Background(), "default") + + // pull the redis image from DockerHub + image, err := cli.Pull(ctx, "docker.io/library/busybox:latest", containerd.WithPullUnpack) + if err != nil { + fmt.Println("222") + fmt.Println(err) + } + + // create a container + container, err := cli.NewContainer( + ctx, + "test1", + containerd.WithImage(image), + containerd.WithNewSnapshot("redis-server-snapshot1", image), + containerd.WithNewSpec(oci.WithImageConfig(image)), + ) + + if err != nil { + fmt.Println("333") + fmt.Println(err) + } + defer container.Delete(ctx, containerd.WithSnapshotCleanup) + + // create a task from the container + task, err := container.NewTask(ctx, cio.NewCreator(cio.WithStdio)) + if err != nil { + fmt.Println("444") + fmt.Println(err) + } + defer task.Delete(ctx) + + // make sure we wait before calling start + exitStatusC, err := task.Wait(ctx) + if err != nil { + fmt.Println(err) + } + + // call start on the task to execute the redis server + if err = task.Start(ctx); err != nil { + fmt.Println("555") + fmt.Println(err) + } + + fmt.Println("执行完成等待") + // sleep for a lil bit to see the logs + time.Sleep(3 * time.Second) + + // kill the process and get the exit status + if err = task.Kill(ctx, syscall.SIGTERM); err != nil { + fmt.Println("666") + fmt.Println(err) + } + + // wait for the process to fully exit and print out the exit status + + status := <-exitStatusC + code, _, err := status.Result() + if err != nil { + fmt.Println("777") + fmt.Println(err) + } + fmt.Printf("redis-server exited with status: %d\n", code) + +} diff --git a/service/docker_base/common.go b/service/docker_base/common.go new file mode 100644 index 0000000..453f413 --- /dev/null +++ b/service/docker_base/common.go @@ -0,0 +1,24 @@ +package docker_base + +import "oasis/model" + +//过滤mysql关键字 +func MysqlFilter(c MysqlConfig, envs model.EnvArrey) model.EnvArrey { + for i := 0; i < len(envs); i++ { + switch envs[i].Value { + case "$MYSQL_HOST": + envs[i].Value = c.DataBaseHost + case "$MYSQL_PORT": + envs[i].Value = c.DataBasePort + case "$MYSQL_USERNAME": + envs[i].Value = c.DataBaseUser + case "$MYSQL_PASSWORD": + envs[i].Value = c.DataBasePassword + case "$MYSQL_DBNAME": + envs[i].Value = c.DataBaseDB + case "$MYSQL_HOST_AND_PORT": + envs[i].Value = c.DataBaseHost + ":" + c.DataBasePort + } + } + return envs +} diff --git a/service/docker_base/model.go b/service/docker_base/model.go new file mode 100644 index 0000000..33dceed --- /dev/null +++ b/service/docker_base/model.go @@ -0,0 +1,11 @@ +package docker_base + +type MysqlConfig struct { + DataBaseHost string `json:"database_host"` + DataBasePort string `json:"database_port"` + DataBaseUser string `json:"database_user"` + DataBasePassword string `json:"data_base_password"` + DataBaseDB string `json:"data_base_db"` +} + + diff --git a/service/docker_base/mysql.go b/service/docker_base/mysql.go new file mode 100644 index 0000000..565a18a --- /dev/null +++ b/service/docker_base/mysql.go @@ -0,0 +1,93 @@ +package docker_base + +import ( + "context" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/network" + client2 "github.com/docker/docker/client" + "time" +) + +//创建一个mysql数据库 +func MysqlCreate(mysqlConfig MysqlConfig, dbId string, cpuShares int64, memory int64) (string, error) { + const imageName = "mysql" + const imageVersion = "8" + const imageNet = "oasis" + + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return "", err + } + defer cli.Close() + _, err = cli.ImagePull(context.Background(), imageName+":"+imageVersion, types.ImagePullOptions{}) + + isExist := true + //检查到镜像才继续 + for isExist { + filter := filters.NewArgs() + filter.Add("before", imageName+":"+imageVersion) + list, e := cli.ImageList(context.Background(), types.ImageListOptions{Filters: filter}) + if e == nil && len(list) > 0 { + isExist = false + } + time.Sleep(time.Second) + } + + var envArr = []string{"MYSQL_ROOT_PASSWORD=" + mysqlConfig.DataBasePassword, "MYSQL_DATABASE=" + mysqlConfig.DataBaseDB} + + res := container.Resources{} + if cpuShares > 0 { + res.CPUShares = cpuShares + } + if memory > 0 { + res.Memory = memory << 20 + } + + rp := container.RestartPolicy{} + + rp.Name = "always" + + config := &container.Config{ + Image: imageName, + Labels: map[string]string{"version": imageVersion, "author": "official"}, + Env: envArr, + } + hostConfig := &container.HostConfig{Resources: res, RestartPolicy: rp, NetworkMode: container.NetworkMode(imageNet)} + + containerCreate, err := cli.ContainerCreate(context.Background(), + config, + hostConfig, + &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{imageNet: {NetworkID: ""}}}, + nil, + dbId) + + containerId := containerCreate.ID + + //启动容器 + err = cli.ContainerStart(context.Background(), dbId, types.ContainerStartOptions{}) + if err != nil { + return containerId, err + } + + return containerId, nil + +} + +func MysqlDelete(dbId string) error { + + cli, err := client2.NewClientWithOpts(client2.FromEnv) + if err != nil { + return err + } + defer cli.Close() + err = cli.ContainerStop(context.Background(), dbId, nil) + if err != nil { + return err + } + + err = cli.ContainerRemove(context.Background(), dbId, types.ContainerRemoveOptions{}) + return err + +} diff --git a/service/docker_test.go b/service/docker_test.go new file mode 100644 index 0000000..c0c99a6 --- /dev/null +++ b/service/docker_test.go @@ -0,0 +1,50 @@ +package service + +import ( + "fmt" + "testing" +) + +//func TestDockerImageInfo(t *testing.T) { +// //DockerImageInfo() +// +// address, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:0", "0.0.0.0")) +// if err != nil { +// fmt.Println(0, err) +// } +// +// listener, err := net.ListenTCP("tcp", address) +// if err != nil { +// fmt.Println(0, err) +// } +// +// defer listener.Close() +// fmt.Println(listener.Addr().(*net.TCPAddr).Port, nil) +// +//} + +//func TestDockerNetwork(t *testing.T) { +// DockerNetwork() +//} +// +//func TestDockerPull(t *testing.T) { +// DockerPull() +//} +// +//func TestDockerLog(t *testing.T) { +// DockerLog() +//} +//func TestDockerLogs(t *testing.T) { +// DockerLogs() +//} + +func TestDockerContainerStats(t *testing.T) { + fmt.Println(DockerContainerStats1()) +} + +//func TestDockerImageRemove(t *testing.T) { +// host, domain, tld := gotld.GetSubdomain("aaa.liru-05.top", 1) +// fmt.Println(host) +// fmt.Println(domain) +// fmt.Println(tld) +//} diff --git a/service/github.go b/service/github.go new file mode 100644 index 0000000..0e1255b --- /dev/null +++ b/service/github.go @@ -0,0 +1,35 @@ +package service + +import ( + "context" + "fmt" + "github.com/google/go-github/v36/github" + "github.com/tidwall/gjson" +) + +type GithubService interface { + GetManifestJsonByRepo() (image, tcp, udp string) +} + +type githubService struct { + cl *github.Client +} + +func (g *githubService) GetManifestJsonByRepo() (image, tcp, udp string) { + c, _, _, e := g.cl.Repositories.GetContents(context.Background(), "a624669980", "o_test_json", "/OasisManifest.json", &github.RepositoryContentGetOptions{}) + if e != nil { + fmt.Println(e) + } + str, e := c.GetContent() + if e != nil { + fmt.Println(e) + } + image = gjson.Get(str, "dockerImage").String() + tcp = gjson.Get(str, "tcp_ports").Raw + udp = gjson.Get(str, "udp_ports").Raw + return +} + +func GetNewGithubService(cl *github.Client) GithubService { + return &githubService{cl: cl} +} diff --git a/service/model/o_container.go b/service/model/o_container.go new file mode 100644 index 0000000..89cae73 --- /dev/null +++ b/service/model/o_container.go @@ -0,0 +1,64 @@ +package model + +import ( + "oasis/model" +) + +const CONTAINERTABLENAME = "o_container" + +type AppListDBModel struct { + CustomId string `gorm:"column:custom_id;primary_key" json:"custom_id"` + Title string `json:"title"` + // ScreenshotLink model.Strings `gorm:"type:json" json:"screenshot_link,omitempty"` + ScreenshotLink string `json:"screenshot_link"` + Slogan string `json:"slogan"` + Description string `json:"description"` + //Tags model.Strings `gorm:"type:json" json:"tags"` + Tags string `json:"tags"` + Icon string `json:"icon"` + Version string `json:"version"` + ContainerId string `json:"container_id,omitempty"` + Image string `json:"image,omitempty"` + Index string `json:"index"` + CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"` + UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"` + //Port string `json:"port,omitempty"` + PortMap string `json:"port_map"` + Label string `json:"label"` + EnableUPNP bool `json:"enable_upnp"` + //Envs model.EnvArrey `json:"envs" bson:"envs"` + //Ports model.PortArrey `json:"ports" bson:"ports"` + //Volumes model.PathArrey `json:"volumes" bson:"volumes"` + //Devices model.PathArrey `json:"devices" bson:"devices"` + Envs string `json:"envs"` + Ports string `json:"ports"` + Volumes string `json:"volumes"` + Devices string `json:"devices"` + //Envs []model.Env `json:"envs"` + //Ports []model.PortMap `gorm:"type:json" json:"ports"` + //Volumes []model.PathMap `gorm:"type:json" json:"volumes"` + //Devices []model.PathMap `gorm:"type:json" json:"device"` + Position bool `json:"position"` + NetModel string `json:"net_model"` + CpuShares int64 `json:"cpu_shares"` + Memory int64 `json:"memory"` + Restart string `json:"restart"` + //Rely model.MapStrings `gorm:"type:json" json:"rely"` //[{"mysql":"id"},{"mysql":"id"}] + Origin string `json:"origin"` +} + +func (p *AppListDBModel) TableName() string { + return "o_container" +} + +type MyAppList struct { + Name string `json:"name"` + Icon string `json:"icon"` + State string `json:"state"` + CustomId string `gorm:"column:custom_id;primary_key" json:"custom_id"` + Index string `json:"index"` + Port string `json:"port"` + UpTime string `json:"up_time"` + Slogan string `json:"slogan"` + Rely model.MapStrings `json:"rely"` //[{"mysql":"id"},{"mysql":"id"}] +} diff --git a/service/model/o_ddns.go b/service/model/o_ddns.go new file mode 100644 index 0000000..28b9486 --- /dev/null +++ b/service/model/o_ddns.go @@ -0,0 +1,56 @@ +package model + +import "time" + +func (p *DDNSUpdataDBModel) TableName() string { + return "o_ddns" +} + +type DDNSUpdataDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Ipv4 string `gorm:"-"` + Ipv6 string `gorm:"-"` + Type uint `json:"type" form:"type"` + Domain string `json:"domain" form:"domain"` + Host string `json:"host" form:"host"` + Key string `json:"key" form:"key"` + Secret string `json:"secret" form:"secret"` + UserName string `json:"user_name" form:"user_name"` + Password string `json:"password" form:"password"` + CreatedAt time.Time `gorm:"<-:create" json:"created_at"` + UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` +} + +const DDNSLISTTABLENAME = "o_ddns" + +//返回给前台使用 +type DDNSList struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Name string `json:"name"` + Domain string `json:"domain" form:"domain"` + Host string `json:"host" form:"host"` + IPV4 string `json:"ipv_4" gorm:"-"` + IPV6 string `json:"ipv_6" gorm:"-"` + Message string `json:"message"` + State bool `json:"state"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +//定时任务使用 +type DDNSCoreList struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Domain string `json:"domain" form:"domain"` + Name string `json:"domain" form:"name"` + Type uint `json:"type"` + Key string `json:"key"` + Message string `json:"message"` + State bool `json:"state"` + Secret string `json:"secret" form:"secret"` + UserName string `json:"user_name" form:"user_name"` + Password string `json:"password" form:"password"` + ApiHost string `json:"api_host"` + Host string `json:"host"` + IPV4 string `json:"ipv_4" gorm:"-"` + IPV6 string `json:"ipv_6" gorm:"-"` +} diff --git a/service/model/o_ddns_type.go b/service/model/o_ddns_type.go new file mode 100644 index 0000000..e236a86 --- /dev/null +++ b/service/model/o_ddns_type.go @@ -0,0 +1,11 @@ +package model + +type DDNSTypeDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Name string `json:"name"` + ApiHost string `json:"api_host"` +} + +func (p *DDNSTypeDBModel) TableName() string { + return "o_ddns_type" +} diff --git a/service/model/o_notify.go b/service/model/o_notify.go new file mode 100644 index 0000000..6eac46c --- /dev/null +++ b/service/model/o_notify.go @@ -0,0 +1,17 @@ +package model + +type AppNotify struct { + CustomId string `gorm:"column:custom_id;primary_key" json:"custom_id"` + ContainerId string `json:"container_id,omitempty"` + State int `json:"state"` //0:一直在变动的未读消息 1:未读 2:已读 + Message string `json:"message"` + CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"` + UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"` + Speed int `json:"speed"` + Id string `gorm:"-" json:"id"` + Type int `json:"type"` // 1:显示即为已读 2:必须手动点掉 3:error +} + +func (p *AppNotify) TableName() string { + return "o_notify" +} diff --git a/service/model/o_rely.go b/service/model/o_rely.go new file mode 100644 index 0000000..ed5401b --- /dev/null +++ b/service/model/o_rely.go @@ -0,0 +1,38 @@ +package model + +import ( + "database/sql/driver" + "encoding/json" + "oasis/service/docker_base" + "time" +) + +type RelyDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + CustomId string ` json:"custom_id"` + ContainerCustomId string `json:"container_custom_id"` + Config MysqlConfigs `json:"config"` + ContainerId string `json:"container_id,omitempty"` + Type int `json:"type"` //目前暂未使用 + CreatedAt time.Time `gorm:"<-:create" json:"created_at"` + UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` +} + +/****************使gorm支持[]string结构*******************/ +type MysqlConfigs docker_base.MysqlConfig + +func (c MysqlConfigs) Value() (driver.Value, error) { + b, err := json.Marshal(c) + return string(b), err +} + +func (c *MysqlConfigs) Scan(input interface{}) error { + return json.Unmarshal(input.([]byte), c) +} + +/****************使gorm支持[]string结构*******************/ + + +func (p RelyDBModel) TableName() string { + return "o_rely" +} \ No newline at end of file diff --git a/service/model/o_share_directory.go b/service/model/o_share_directory.go new file mode 100644 index 0000000..ea1dac2 --- /dev/null +++ b/service/model/o_share_directory.go @@ -0,0 +1,20 @@ +package model + +import "time" + +type ShareDirDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Name string `gorm:"size:50" json:"name"` + Comment string `gorm:"size:200" json:"comment"` + Path string `json:"path"` + ReadOnly bool `json:"read_only"` + Writeable bool `json:"writeable"` + Browseable bool `json:"browseable"` + ValidUsers string `gorm:"size:200" json:"valid_users"` //可以访问的用户 多用户用 , 分割 + CreatedAt time.Time `gorm:"<-:create" json:"created_at"` + UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` +} + +func (p *ShareDirDBModel) TableName() string { + return "o_share_directory" +} diff --git a/service/model/o_shortcuts.go b/service/model/o_shortcuts.go new file mode 100644 index 0000000..f0fb444 --- /dev/null +++ b/service/model/o_shortcuts.go @@ -0,0 +1,17 @@ +package model + +import "time" + +type ShortcutsDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Title string `json:"title"` + Url string `json:"url"` + Icon string `json:"icon"` + Sort int `json:"sort"` + CreatedAt time.Time `gorm:"<-:create" json:"created_at"` + UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"` +} + +func (p *ShortcutsDBModel) TableName() string { + return "o_shortcuts" +} diff --git a/service/model/o_task.go b/service/model/o_task.go new file mode 100644 index 0000000..9c42bab --- /dev/null +++ b/service/model/o_task.go @@ -0,0 +1,17 @@ +package model + +type TaskDBModel struct { + Id uint `gorm:"column:id;primary_key" json:"id"` + Title string `gorm:"size:200" json:"title"` + ImageUrl string `json:"image_url"` + Content string `gorm:"size:255" json:"content"` + Url string `json:"url"` + State int `json:"state"` // 0:未阅读,1:已阅读 + Type int `json:"type"` + CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"` + UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"` +} + +func (p *TaskDBModel) TableName() string { + return "o_task" +} diff --git a/service/notify.go b/service/notify.go new file mode 100644 index 0000000..e9e063f --- /dev/null +++ b/service/notify.go @@ -0,0 +1,50 @@ +package service + +import ( + "gorm.io/gorm" + "oasis/service/model" + "oasis/types" +) + +type NotifyServer interface { + GetLog(id string) model.AppNotify + AddLog(log model.AppNotify) + UpdateLog(log model.AppNotify) + DelLog(id string) + GetList() (list []model.AppNotify) + MarkRead(id string, state int) +} + +type notifyServer struct { + db *gorm.DB +} + +func (i notifyServer) GetList() (list []model.AppNotify) { + i.db.Where("state=? or state=?", types.NOTIFY_DYNAMICE, types.NOTIFY_UNREAD).Find(&list) + return +} + +func (i *notifyServer) AddLog(log model.AppNotify) { + i.db.Create(&log) +} + +func (i *notifyServer) UpdateLog(log model.AppNotify) { + i.db.Save(&log) +} + +func (i *notifyServer) GetLog(id string) model.AppNotify { + var log model.AppNotify + i.db.Where("custom_id = ? ", id).First(&log) + return log +} +func (i *notifyServer) MarkRead(id string, state int) { + i.db.Update("state=", state).Where("custom_id = ? ", id) +} +func (i *notifyServer) DelLog(id string) { + var log model.AppNotify + i.db.Where("custom_id = ?", id).Delete(&log) +} + +func NewNotifyService(db *gorm.DB) NotifyServer { + return ¬ifyServer{db: db} +} diff --git a/service/oasis.go b/service/oasis.go new file mode 100644 index 0000000..c971238 --- /dev/null +++ b/service/oasis.go @@ -0,0 +1,89 @@ +package service + +import ( + json2 "encoding/json" + "github.com/tidwall/gjson" + "oasis/model" + "oasis/pkg/config" + httper2 "oasis/pkg/utils/httper" + model2 "oasis/service/model" + "strconv" +) + +type OasisService interface { + GetServerList(index, size, tp, categoryId, key string) ([]model.ServerAppList, int64) + GetServerCategoryList() []model.ServerCategoryList + GetTaskList(size int) []model2.TaskDBModel +} + +type oasisService struct { +} + +func (o *oasisService) GetTaskList(size int) []model2.TaskDBModel { + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + listS := httper2.Get(config.ServerInfo.ServerApi+"/v1/task/list/"+strconv.Itoa(size), head) + + list := []model2.TaskDBModel{} + json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &list) + + return list +} + +func (o *oasisService) GetServerList(index, size, tp, categoryId, key string) ([]model.ServerAppList, int64) { + + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + listS := httper2.Get(config.ServerInfo.ServerApi+"/v1/app/list?index="+index+"&size="+size+"&type="+tp+"&category_id="+categoryId+"&key="+key, head) + + list := []model.ServerAppList{} + + count := gjson.Get(listS, "data.count").Int() + json2.Unmarshal([]byte(gjson.Get(listS, "data.items").String()), &list) + + return list, count +} + +func (o *oasisService) GetServerCategoryList() []model.ServerCategoryList { + + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + listS := httper2.Get(config.ServerInfo.ServerApi+"/v1/app/category", head) + + list := []model.ServerCategoryList{} + + json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &list) + + return list +} + +func NewOasisService() OasisService { + return &oasisService{} +} diff --git a/service/redis.go b/service/redis.go new file mode 100644 index 0000000..004e5e7 --- /dev/null +++ b/service/redis.go @@ -0,0 +1,102 @@ +package service + +import ( + "encoding/json" + "github.com/gomodule/redigo/redis" +) + +type RedisService interface { + Set(key string, data interface{}, time int) error + Exists(key string) bool + Get(key string) ([]byte, error) + PutExpireTime(key string, time int) + Delete(key string) (bool, error) + LikeDeletes(key string) error +} + +type redisService struct { + rp *redis.Pool +} + +// Set a key/value +func (r *redisService) Set(key string, data interface{}, time int) error { + conn := r.rp.Get() + defer conn.Close() + + value, err := json.Marshal(data) + if err != nil { + return err + } + _, err = conn.Do("SET", key, value) + if err != nil { + return err + } + _, err = conn.Do("EXPIRE", key, time) + if err != nil { + return err + } + return nil +} + +//设置过期时间 +func (r *redisService) PutExpireTime(key string, time int) { + conn := r.rp.Get() + defer conn.Close() + conn.Do("EXPIRE", key, time) +} + +// Exists check a key +func (r *redisService) Exists(key string) bool { + conn := r.rp.Get() + defer conn.Close() + exists, err := redis.Bool(conn.Do("EXISTS", key)) + if err != nil { + return false + } + return exists +} + +// Get get a key +func (r *redisService) Get(key string) ([]byte, error) { + conn := r.rp.Get() + defer conn.Close() + + reply, err := redis.Bytes(conn.Do("GET", key)) + if err != nil { + return nil, err + } + + return reply, nil +} + +func NewRedisService(rp *redis.Pool) RedisService { + return &redisService{rp: rp} +} + +// Delete delete a kye +func (r *redisService) Delete(key string) (bool, error) { + conn := r.rp.Get() + defer conn.Close() + + return redis.Bool(conn.Do("DEL", key)) +} + +// LikeDeletes batch delete +func (r *redisService) LikeDeletes(key string) error { + conn := r.rp.Get() + defer conn.Close() + + keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*")) + if err != nil { + return err + } + + for _, key := range keys { + _, err = r.Delete(key) + if err != nil { + return err + } + } + + return nil +} diff --git a/service/rely.go b/service/rely.go new file mode 100644 index 0000000..d2f0c05 --- /dev/null +++ b/service/rely.go @@ -0,0 +1,40 @@ +package service + +import ( + "gorm.io/gorm" + loger2 "oasis/pkg/utils/loger" + model2 "oasis/service/model" +) + +type RelyService interface { + Create(rely model2.RelyDBModel) + Delete(id string) + GetInfo(id string) model2.RelyDBModel +} + +type relyService struct { + db *gorm.DB + log loger2.OLog +} + +func (r *relyService) Create(rely model2.RelyDBModel) { + + r.db.Create(&rely) + +} + +//获取我的应用列表 +func (r *relyService) GetInfo(id string) model2.RelyDBModel { + var m model2.RelyDBModel + r.db.Where("custom_id = ?", id).First(&m) + return m +} + +func (r *relyService) Delete(id string) { + var c model2.RelyDBModel + r.db.Where("custom_id = ?", id).Delete(&c) +} + +func NewRelyService(db *gorm.DB, log loger2.OLog) RelyService { + return &relyService{db: db, log: log} +} diff --git a/service/service.go b/service/service.go new file mode 100644 index 0000000..e889502 --- /dev/null +++ b/service/service.go @@ -0,0 +1,114 @@ +package service + +import ( + "gorm.io/gorm" + loger2 "oasis/pkg/utils/loger" +) + +var MyService Repository + +type Repository interface { + App() AppService + DDNS() DDNSService + User() UserService + Docker() DockerService + //Redis() RedisService + ZeroTier() ZeroTierService + ZiMa() ZiMaService + OAPI() OasisService + Disk() DiskService + Notify() NotifyServer + ShareDirectory() ShareDirService + Task() TaskService + Rely() RelyService + System() SystemService + Shortcuts() ShortcutsService +} + +func NewService(db *gorm.DB, log loger2.OLog) Repository { + return &store{ + app: NewAppService(db, log), + ddns: NewDDNSService(db, log), + user: NewUserService(), + docker: NewDcokerService(log), + //redis: NewRedisService(rp), + zerotier: NewZeroTierService(), + zima: NewZiMaService(), + oapi: NewOasisService(), + disk: NewDiskService(log), + notify: NewNotifyService(db), + shareDirectory: NewShareDirService(db, log), + task: NewTaskService(db, log), + rely: NewRelyService(db, log), + system: NewSystemService(), + shortcuts: NewShortcutsService(db), + } +} + +type store struct { + db *gorm.DB + app AppService + ddns DDNSService + user UserService + docker DockerService + zerotier ZeroTierService + zima ZiMaService + oapi OasisService + disk DiskService + notify NotifyServer + shareDirectory ShareDirService + task TaskService + rely RelyService + system SystemService + shortcuts ShortcutsService +} + +func (c *store) Rely() RelyService { + return c.rely +} +func (c *store) Shortcuts() ShortcutsService { + return c.shortcuts +} +func (c *store) System() SystemService { + return c.system +} +func (c *store) Notify() NotifyServer { + + return c.notify +} + +func (c *store) App() AppService { + return c.app +} + +func (c *store) DDNS() DDNSService { + return c.ddns +} + +func (c *store) User() UserService { + return c.user +} + +func (c *store) Docker() DockerService { + return c.docker +} + +func (c *store) ZeroTier() ZeroTierService { + return c.zerotier +} +func (c *store) ZiMa() ZiMaService { + return c.zima +} +func (c *store) OAPI() OasisService { + return c.oapi +} + +func (c *store) Disk() DiskService { + return c.disk +} +func (c *store) ShareDirectory() ShareDirService { + return c.shareDirectory +} +func (c *store) Task() TaskService { + return c.task +} diff --git a/service/share_directory.go b/service/share_directory.go new file mode 100644 index 0000000..b668ea8 --- /dev/null +++ b/service/share_directory.go @@ -0,0 +1,323 @@ +package service + +import ( + "gorm.io/gorm" + "oasis/pkg/config" + "oasis/pkg/utils/command" + loger2 "oasis/pkg/utils/loger" + "oasis/service/model" + "os" + "strconv" +) + +type ShareDirService interface { + UpConfig() + List(desc bool) []model.ShareDirDBModel + Delete(id string) + Add(m *model.ShareDirDBModel) + Update(m *model.ShareDirDBModel) + Info(id string) model.ShareDirDBModel +} + +type shareDirService struct { + db *gorm.DB + log loger2.OLog +} + +func (s *shareDirService) List(desc bool) []model.ShareDirDBModel { + var list []model.ShareDirDBModel + var orderBy string + if desc { + orderBy = "id" + } else { + orderBy = "id DESC" + } + s.db.Order(orderBy).Find(&list) + return list +} + +func (s *shareDirService) Delete(id string) { + var m model.ShareDirDBModel + s.db.Where("id = ?", id).Delete(&m) +} + +func (s *shareDirService) Add(m *model.ShareDirDBModel) { + s.db.Save(m) +} +func (s *shareDirService) Update(m *model.ShareDirDBModel) { + s.db.Save(m) +} +func (s *shareDirService) UpConfig() { + var list []model.ShareDirDBModel + + s.db.Find(&list) + + str := `# +# Sample configuration file for the Samba suite for Debian GNU/Linux. +# +# +# This is the main Samba configuration file. You should read the +# smb.conf(5) manual page in order to understand the options listed +# here. Samba has a huge number of configurable options most of which +# are not shown in this example +# +# Some options that are often worth tuning have been included as +# commented-out examples in this file. +# - When such options are commented with ";", the proposed setting +# differs from the default Samba behaviour +# - When commented with "#", the proposed setting is the default +# behaviour of Samba but the option is considered important +# enough to be mentioned here +# +# NOTE: Whenever you modify this file you should run the command +# "testparm" to check that you have not made any basic syntactic +# errors. + +#======================= Global Settings ======================= + +[global] + +## Browsing/Identification ### + +# Change this to the workgroup/NT-domain name your Samba server will part of + workgroup = WORKGROUP + +#### Networking #### + +# The specific set of interfaces / networks to bind to +# This can be either the interface name or an IP address/netmask; +# interface names are normally preferred +; interfaces = 127.0.0.0/8 eth0 + +# Only bind to the named interfaces and/or networks; you must use the +# 'interfaces' option above to use this. +# It is recommended that you enable this feature if your Samba machine is +# not protected by a firewall or is a firewall itself. However, this +# option cannot handle dynamic or non-broadcast interfaces correctly. +; bind interfaces only = yes + + + +#### Debugging/Accounting #### + +# This tells Samba to use a separate log file for each machine +# that connects + log file = /var/log/samba/log.%m + +# Cap the size of the individual log files (in KiB). + max log size = 1000 + +# We want Samba to only log to /var/log/samba/log.{smbd,nmbd}. +# Append syslog@1 if you want important messages to be sent to syslog too. + logging = file + +# Do something sensible when Samba crashes: mail the admin a backtrace + panic action = /usr/share/samba/panic-action %d + + +####### Authentication ####### + +# Server role. Defines in which mode Samba will operate. Possible +# values are "standalone server", "member server", "classic primary +# domain controller", "classic backup domain controller", "active +# directory domain controller". +# +# Most people will want "standalone server" or "member server". +# Running as "active directory domain controller" will require first +# running "samba-tool domain provision" to wipe databases and create a +# new domain. + server role = standalone server + + obey pam restrictions = yes + +# This boolean parameter controls whether Samba attempts to sync the Unix +# password with the SMB password when the encrypted SMB password in the +# passdb is changed. + unix password sync = yes + +# For Unix password sync to work on a Debian GNU/Linux system, the following +# parameters must be set (thanks to Ian Kahan < for +# sending the correct chat script for the passwd program in Debian Sarge). + passwd program = /usr/bin/passwd %u + passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . + +# This boolean controls whether PAM will be used for password changes +# when requested by an SMB client instead of the program listed in +# 'passwd program'. The default is 'no'. + pam password change = yes + +# This option controls how unsuccessful authentication attempts are mapped +# to anonymous connections + map to guest = bad user + +########## Domains ########### + +# +# The following settings only takes effect if 'server role = primary +# classic domain controller', 'server role = backup domain controller' +# or 'domain logons' is set +# + +# It specifies the location of the user's +# profile directory from the client point of view) The following +# required a [profiles] share to be setup on the samba server (see +# below) +; logon path = \\%N\profiles\%U +# Another common choice is storing the profile in the user's home directory +# (this is Samba's default) +# logon path = \\%N\%U\profile + +# The following setting only takes effect if 'domain logons' is set +# It specifies the location of a user's home directory (from the client +# point of view) +; logon drive = H: +# logon home = \\%N\%U + +# The following setting only takes effect if 'domain logons' is set +# It specifies the script to run during logon. The script must be stored +# in the [netlogon] share +# NOTE: Must be store in 'DOS' file format convention +; logon script = logon.cmd + +# This allows Unix users to be created on the domain controller via the SAMR +# RPC pipe. The example command creates a user account with a disabled Unix +# password; please adapt to your needs +; add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u + +# This allows machine accounts to be created on the domain controller via the +# SAMR RPC pipe. +# The following assumes a "machines" group exists on the system +; add machine script = /usr/sbin/useradd -g machines -c "%u machine account" -d /var/lib/samba -s /bin/false %u + +# This allows Unix groups to be created on the domain controller via the SAMR +# RPC pipe. +; add group script = /usr/sbin/addgroup --force-badname %g + +############ Misc ############ + +# Using the following line enables you to customise your configuration +# on a per machine basis. The %m gets replaced with the netbios name +# of the machine that is connecting +; include = /home/samba/etc/smb.conf.%m + +# Some defaults for winbind (make sure you're not using the ranges +# for something else.) +; idmap config * : backend = tdb +; idmap config * : range = 3000-7999 +; idmap config YOURDOMAINHERE : backend = tdb +; idmap config YOURDOMAINHERE : range = 100000-999999 +; template shell = /bin/bash + +# Setup usershare options to enable non-root users to share folders +# with the net usershare command. + +# Maximum number of usershare. 0 means that usershare is disabled. +# usershare max shares = 100 + +# Allow users who've been granted usershare privileges to create +# public shares, not just authenticated ones + usershare allow guests = yes + +#======================= Share Definitions ======================= + +[homes] + comment = Home Directories + browseable = no + +# By default, the home directories are exported read-only. Change the +# next parameter to 'no' if you want to be able to write to them. + read only = yes + +# File creation mask is set to 0700 for security reasons. If you want to +# create files with group=rw permissions, set next parameter to 0775. + create mask = 0700 + +# Directory creation mask is set to 0700 for security reasons. If you want to +# create dirs. with group=rw permissions, set next parameter to 0775. + directory mask = 0700 + +# By default, \\server\username shares can be connected to by anyone +# with access to the samba server. +# The following parameter makes sure that only "username" can connect +# to \\server\username +# This might need tweaking when using external authentication schemes + valid users = %S + +# Un-comment the following and create the netlogon directory for Domain Logons +# (you need to configure Samba to act as a domain controller too.) +;[netlogon] +; comment = Network Logon Service +; path = /home/samba/netlogon +; guest ok = yes +; read only = yes + +# Un-comment the following and create the profiles directory to store +# users profiles (see the "logon path" option above) +# (you need to configure Samba to act as a domain controller too.) +# The path below should be writable by all users so that their +# profile directory may be created the first time they log on +;[profiles] +; comment = Users profiles +; path = /home/samba/profiles +; guest ok = no +; browseable = no +; create mask = 0600 +; directory mask = 0700 + +[printers] + comment = All Printers + browseable = no + path = /var/spool/samba + printable = yes + guest ok = no + read only = yes + create mask = 0700 + +# Windows clients look for this share name as a source of downloadable +# printer drivers +[print$] + comment = Printer Drivers + path = /var/lib/samba/printers + browseable = yes + read only = yes + guest ok = no +# Uncomment to allow remote administration of Windows print drivers. +# You may need to replace 'lpadmin' with the name of the group your +# admin users are members of. +# Please note that you also need to set appropriate Unix permissions +# to the drivers directory for these users to have write rights in it +; write list = root, @lpadmin` + + for _, i := range list { + str += "\n[" + i.Name + "]" + str += "\n comment = " + i.Comment + str += "\n path = " + i.Path + str += "\n browseable = " + strconv.FormatBool(i.Browseable) + str += "\n read only = " + strconv.FormatBool(i.ReadOnly) + str += "\n writeable = " + strconv.FormatBool(i.Writeable) + if len(i.ValidUsers) == 0 { + str += "\n guest ok = yes" + } else { + str += "\n valid users = " + i.ValidUsers + } + } + + // /etc/samba/smb.conf + f, err := os.OpenFile("/etc/samba/smb.conf", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + s.log.Error("file create failed. err: " + err.Error()) + } else { + defer f.Close() + f.WriteString(str) + command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;ReloadSamba") + } +} +func (s *shareDirService) Info(id string) model.ShareDirDBModel { + var m model.ShareDirDBModel + s.db.Where("id = ?", id).First(&m) + return m +} + +func NewShareDirService(db *gorm.DB, log loger2.OLog) ShareDirService { + return &shareDirService{db: db, log: log} +} diff --git a/service/shortcuts.go b/service/shortcuts.go new file mode 100644 index 0000000..0428f91 --- /dev/null +++ b/service/shortcuts.go @@ -0,0 +1,34 @@ +package service + +import ( + "gorm.io/gorm" + model2 "oasis/service/model" +) + +type ShortcutsService interface { + DeleteData(id string) + AddData(m model2.ShortcutsDBModel) + EditData(m model2.ShortcutsDBModel) + GetList() (list []model2.ShortcutsDBModel) +} +type shortcutsService struct { + db *gorm.DB +} + +func (s *shortcutsService) AddData(m model2.ShortcutsDBModel) { + s.db.Create(&m) +} +func (s *shortcutsService) EditData(m model2.ShortcutsDBModel) { + s.db.Save(&m) +} +func (s *shortcutsService) DeleteData(id string) { + var m model2.ShortcutsDBModel + s.db.Where("id=?", id).Delete(&m) +} +func (s *shortcutsService) GetList() (list []model2.ShortcutsDBModel) { + s.db.Order("sort desc,id").Find(&list) + return list +} +func NewShortcutsService(db *gorm.DB) ShortcutsService { + return &shortcutsService{db: db} +} diff --git a/service/system.go b/service/system.go new file mode 100644 index 0000000..dcbf447 --- /dev/null +++ b/service/system.go @@ -0,0 +1,63 @@ +package service + +import ( + "fmt" + "oasis/model" + "oasis/pkg/config" + command2 "oasis/pkg/utils/command" + "strconv" +) + +type SystemService interface { + UpSystemConfig(systemConfig model.SystemConfig) + UpdateSystemVersion(version string) + GetSystemConfigDebug() []string +} +type systemService struct { +} + +func (s *systemService) UpdateSystemVersion(version string) { + fmt.Println("source " + config.AppInfo.ProjectPath + "/shell/tools.sh ;update " + version) + command2.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/tools.sh ;update " + version) +} +func (s *systemService) GetSystemConfigDebug() []string { + return command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetSysInfo") +} +func (s *systemService) UpSystemConfig(systemConfig model.SystemConfig) { + if systemConfig.AutoUpdate != config.SystemConfigInfo.AutoUpdate { + config.Cfg.Section("system").Key("AutoUpdate").SetValue(strconv.FormatBool(systemConfig.AutoUpdate)) + config.SystemConfigInfo.AutoUpdate = systemConfig.AutoUpdate + } + if systemConfig.SearchSwitch != config.SystemConfigInfo.SearchSwitch { + config.Cfg.Section("system").Key("SearchSwitch").SetValue(strconv.FormatBool(systemConfig.SearchSwitch)) + config.SystemConfigInfo.SearchSwitch = systemConfig.SearchSwitch + } + if systemConfig.WidgetsSwitch != config.SystemConfigInfo.WidgetsSwitch { + config.Cfg.Section("system").Key("WidgetsSwitch").SetValue(strconv.FormatBool(systemConfig.WidgetsSwitch)) + config.SystemConfigInfo.WidgetsSwitch = systemConfig.WidgetsSwitch + } + if systemConfig.ShortcutsSwitch != config.SystemConfigInfo.ShortcutsSwitch { + config.Cfg.Section("system").Key("ShortcutsSwitch").SetValue(strconv.FormatBool(systemConfig.ShortcutsSwitch)) + config.SystemConfigInfo.ShortcutsSwitch = systemConfig.ShortcutsSwitch + } + if len(systemConfig.SearchEngine) > 0 && systemConfig.SearchEngine != config.SystemConfigInfo.SearchEngine { + config.Cfg.Section("system").Key("SearchEngine").SetValue(systemConfig.SearchEngine) + config.SystemConfigInfo.SearchEngine = systemConfig.SearchEngine + } + // if len(systemConfig.Version) > 0 && systemConfig.Version != config.SystemConfigInfo.Version { + // config.Cfg.Section("system").Key("Version").SetValue(systemConfig.Version) + // config.SystemConfigInfo.Version = systemConfig.Version + //} + if len(systemConfig.Background) > 0 && systemConfig.Background != config.SystemConfigInfo.Background { + config.Cfg.Section("system").Key("Background").SetValue(systemConfig.Background) + config.SystemConfigInfo.Background = systemConfig.Background + } + if len(systemConfig.BackgroundType) > 0 && systemConfig.BackgroundType != config.SystemConfigInfo.BackgroundType { + config.Cfg.Section("system").Key("BackgroundType").SetValue(systemConfig.BackgroundType) + config.SystemConfigInfo.BackgroundType = systemConfig.BackgroundType + } + config.Cfg.SaveTo("conf/conf.ini") +} +func NewSystemService() SystemService { + return &systemService{} +} diff --git a/service/task.go b/service/task.go new file mode 100644 index 0000000..c865b67 --- /dev/null +++ b/service/task.go @@ -0,0 +1,116 @@ +package service + +import ( + json2 "encoding/json" + "github.com/tidwall/gjson" + "gorm.io/gorm" + "oasis/pkg/config" + httper2 "oasis/pkg/utils/httper" + loger2 "oasis/pkg/utils/loger" + "oasis/service/model" + "oasis/types" + "strconv" +) + +type TaskService interface { + List(desc bool) []model.TaskDBModel + Delete(id string) + Add(m *model.TaskDBModel) + Update(m *model.TaskDBModel) + Info(id string) model.TaskDBModel + SyncTaskService() +} + +type taskService struct { + db *gorm.DB + log loger2.OLog +} + +func (s *taskService) List(desc bool) []model.TaskDBModel { + var list []model.TaskDBModel + var orderBy string + if !desc { + orderBy = "id" + } else { + orderBy = "id DESC" + } + s.db.Order(orderBy).Where("state=?", types.TASK_STATE_UNCOMPLETE).Find(&list) + return list +} + +func (s *taskService) Delete(id string) { + var m model.TaskDBModel + s.db.Where("id = ?", id).Delete(&m) +} + +func (s *taskService) Add(m *model.TaskDBModel) { + s.db.Save(m) +} +func (s *taskService) Update(m *model.TaskDBModel) { + s.db.Model(&m).Update("state", m.State) +} +func (s *taskService) taskDirService(id string) model.TaskDBModel { + var m model.TaskDBModel + s.db.Where("id = ?", id).First(&m) + return m +} + +func (s *taskService) Info(id string) model.TaskDBModel { + var m model.TaskDBModel + s.db.Where("id = ?", id).Delete(&m) + return m +} + +func (s *taskService) SyncTaskService() { + var count int64 + s.db.Model(&model.TaskDBModel{}).Count(&count) + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + listS := httper2.Get(config.ServerInfo.ServerApi+"/v1/task/list/"+strconv.Itoa(int(count)), head) + + list := []model.TaskDBModel{} + json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &list) + + go func(list []model.TaskDBModel) { + for _, dbModel := range list { + s.db.Create(&dbModel) + } + }(list) +} +func SyncTask(db *gorm.DB) { + var count int64 + db.Model(&model.TaskDBModel{}).Count(&count) + head := make(map[string]string) + + t := make(chan string) + + go func() { + str := httper2.Get(config.ServerInfo.ServerApi+"/token", nil) + + t <- gjson.Get(str, "data").String() + }() + head["Authorization"] = <-t + + listS := httper2.Get(config.ServerInfo.ServerApi+"/v1/task/list/"+strconv.Itoa(int(count)), head) + + list := []model.TaskDBModel{} + json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &list) + + go func(list []model.TaskDBModel) { + for _, dbModel := range list { + db.Create(&dbModel) + } + }(list) +} +func NewTaskService(db *gorm.DB, log loger2.OLog) TaskService { + return &taskService{db: db, log: log} +} diff --git a/service/user.go b/service/user.go new file mode 100644 index 0000000..6132da4 --- /dev/null +++ b/service/user.go @@ -0,0 +1,55 @@ +package service + +import ( + "io" + "mime/multipart" + "oasis/pkg/config" + "os" +) + +type UserService interface { + SetUser(username, pwd, token, email, desc string) error + UpLoadFile(file multipart.File, name string) error +} + +type user struct { +} + +//设置用户名密码 +func (c *user) SetUser(username, pwd, token, email, desc string) error { + if len(username) > 0 { + config.Cfg.Section("user").Key("UserName").SetValue(username) + config.UserInfo.UserName = username + } + if len(pwd) > 0 { + config.Cfg.Section("user").Key("PWD").SetValue(pwd) + config.UserInfo.PWD = pwd + } + if len(token) > 0 { + config.Cfg.Section("user").Key("Token").SetValue(token) + config.UserInfo.Token = token + } + if len(email) > 0 { + config.Cfg.Section("user").Key("Email").SetValue(email) + config.UserInfo.Email = email + } + if len(desc) > 0 { + config.Cfg.Section("user").Key("Description").SetValue(desc) + config.UserInfo.Description = desc + } + config.Cfg.SaveTo("conf/conf.ini") + return nil +} + +//上传文件 +func (c *user) UpLoadFile(file multipart.File, url string) error { + out, _ := os.OpenFile(url, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + defer out.Close() + io.Copy(out, file) + return nil +} + +//获取用户Service +func NewUserService() UserService { + return &user{} +} diff --git a/service/zerotier.go b/service/zerotier.go new file mode 100644 index 0000000..0cd2844 --- /dev/null +++ b/service/zerotier.go @@ -0,0 +1,343 @@ +package service + +import ( + "bytes" + "errors" + "fmt" + "github.com/PuerkitoBio/goquery" + "github.com/tidwall/gjson" + "io/ioutil" + "math/rand" + "net/http" + "oasis/pkg/config" + command2 "oasis/pkg/utils/command" + httper2 "oasis/pkg/utils/httper" + "oasis/pkg/zerotier" + "strconv" + "strings" + "time" +) + +type ZeroTierService interface { + GetToken(username, pwd string) string + ZeroTierRegister(email, lastName, firstName, password string) string + ZeroTierNetworkList(token string) (interface{}, []string) + ZeroTierJoinNetwork(networkId string) + ZeroTierLeaveNetwork(networkId string) + ZeroTierGetInfo(token, id string) (interface{}, []string) + ZeroTierGetStatus(token string) interface{} + EditNetwork(token string, data string, id string) interface{} + CreateNetwork(token string) interface{} + MemberList(token string, id string) interface{} + EditNetworkMember(token string, data string, id, mId string) interface{} + DeleteMember(token string, id, mId string) interface{} + DeleteNetwork(token, id string) interface{} + GetJoinNetworks() string +} +type zerotierstruct struct { +} + +var client http.Client + +func (c *zerotierstruct) ZeroTierJoinNetwork(networkId string) { + command2.OnlyExec(`zerotier-cli join ` + networkId) +} +func (c *zerotierstruct) ZeroTierLeaveNetwork(networkId string) { + command2.OnlyExec(`zerotier-cli leave ` + networkId) +} + +//登录并获取token +func (c *zerotierstruct) GetToken(username, pwd string) string { + if len(config.ZeroTierInfo.Token) > 0 { + return config.ZeroTierInfo.Token + } else { + return LoginGetToken(username, pwd) + } +} + +func (c *zerotierstruct) ZeroTierRegister(email, lastName, firstName, password string) string { + + url := "https://accounts.zerotier.com/auth/realms/zerotier/protocol/openid-connect/registrations?client_id=zt-central&redirect_uri=https%3A%2F%2Fmy.zerotier.com%2Fapi%2F_auth%2Foidc%2Fcallback&response_type=code&scope=openid+profile+email+offline_access&state=state" + + action, cookies, _ := ZeroTierGet(url, nil, 4) + var buff bytes.Buffer + buff.WriteString("email=") + buff.WriteString(email) + buff.WriteString("&password=") + buff.WriteString(password) + buff.WriteString("&password-confirm=") + buff.WriteString(password) + buff.WriteString("&user.attributes.marketingOptIn=true") + buff.WriteString("&firstName") + buff.WriteString(firstName) + buff.WriteString("&lastName") + buff.WriteString(lastName) + + action, errInfo, _ := ZeroTierPost(buff, action, cookies, false) + if len(errInfo) > 0 { + return errInfo + } + action, _, _ = ZeroTierGet(action, cookies, 5) + return "" +} + +//固定请求head +func GetHead() map[string]string { + var head = make(map[string]string, 4) + head["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" + head["Accept-Language"] = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" + head["Connection"] = "keep-alive" + head["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" + return head +} + +//登录并获取token,会出现账号密码错误,和邮箱未验证情况,目前未出现其他情况 +func LoginGetToken(username, pwd string) string { + //拿到登录的action + var loginUrl = "https://accounts.zerotier.com/auth/realms/zerotier/protocol/openid-connect/auth?client_id=zt-central&redirect_uri=https%3A%2F%2Fmy.zerotier.com%2Fapi%2F_auth%2Foidc%2Fcallback&response_type=code&scope=openid+profile+email+offline_access&state=states" + action, cookies, _ := ZeroTierGet(loginUrl, nil, 1) + if len(action) == 0 { + //没有拿到action,页面结构变了 + return "" + } + //登录 + var str bytes.Buffer + str.WriteString("username=") + str.WriteString(username) + str.WriteString("&password=") + str.WriteString(pwd) + str.WriteString("&credentialId=&login=Log+In") + url, logingErrInfo, _ := ZeroTierPost(str, action, cookies, true) + + action, cookies, isLoginOk := ZeroTierGet(url, cookies, 2) + + if isLoginOk { + //登录成功,可以继续调用api + randomTokenUrl := "https://my.zerotier.com/api/randomToken" + json, _, _ := ZeroTierGet(randomTokenUrl, cookies, 3) + //获取一个随机token + token := gjson.Get(json, "token") + + userInfoUrl := "https://my.zerotier.com/api/status" + json, _, _ = ZeroTierGet(userInfoUrl, cookies, 3) + //拿到用户id + userId := gjson.Get(json, "user.id") + + //设置新token + addTokenUrl := "https://my.zerotier.com/api/user/" + userId.String() + "/token" + data := make(map[string]string) + rand.Seed(time.Now().UnixNano()) + data["tokenName"] = "oasis-token-" + strconv.Itoa(rand.Intn(1000)) + data["token"] = token.String() + head := make(map[string]string) + head["Content-Type"] = "application/json" + _, statusCode := httper2.ZeroTierPost(addTokenUrl, data, head, cookies) + if statusCode == http.StatusOK { + config.Cfg.Section("zerotier").Key("Token").SetValue(token.String()) + config.Cfg.SaveTo("conf/conf.ini") + config.ZeroTierInfo.Token = token.String() + } + } else { + //登录错误信息 + if len(logingErrInfo) > 0 { + return logingErrInfo + } else { + //验证邮箱 + action, _, _ = ZeroTierGet(url, cookies, 5) + return "You need to verify your email address to activate your account." + } + } + return "" +} + +// t 1:获取action,2:登录成功后拿session(可能需要验证有了或登录失败) 3:随机生成token 4:注册页面拿action 5:注册成功后拿验证邮箱的地址 +func ZeroTierGet(url string, cookies []*http.Cookie, t uint8) (action string, c []*http.Cookie, isExistSession bool) { + isExistSession = false + action = "" + c = []*http.Cookie{} + request, _ := http.NewRequest(http.MethodGet, url, nil) + for k, v := range GetHead() { + request.Header.Add(k, v) + } + for _, cookie := range cookies { + request.AddCookie(cookie) + } + resp, err := client.Do(request) + if err != nil { + return + } + defer resp.Body.Close() + c = resp.Cookies() + if t == 1 { + doc, err := goquery.NewDocumentFromReader(resp.Body) + if err != nil { + return + } + action, _ = doc.Find("#kc-form-login").Attr("action") + return + } else if t == 2 { + for _, cookie := range resp.Cookies() { + if cookie.Name == "pgx-session" { + isExistSession = true + break + } + } + //判断是否登录成功,如果需要验证邮箱,则返回验证邮箱的地址。 + if resp.StatusCode == http.StatusFound && len(resp.Header.Get("Location")) > 0 { + action = resp.Header.Get("Location") + } + return + } else if t == 3 { + //返回获取到的字符串 + byteArr, _ := ioutil.ReadAll(resp.Body) + action = string(byteArr) + } else if t == 4 { + doc, err := goquery.NewDocumentFromReader(resp.Body) + if err != nil { + return + } + action, _ = doc.Find("#kc-register-form").Attr("action") + return + + } else if t == 5 { + doc, _ := goquery.NewDocumentFromReader(resp.Body) + fmt.Println(doc.Html()) + action, _ = doc.Find("#kc-info-wrapper a").Attr("href") + return + } + + return +} + +//模拟提交表单 +func ZeroTierPost(str bytes.Buffer, action string, cookes []*http.Cookie, isLogin bool) (url, errInfo string, err error) { + req, err := http.NewRequest(http.MethodPost, action, strings.NewReader(str.String())) + if err != nil { + return "", "", errors.New("newrequest error") + } + for k, v := range GetHead() { + req.Header.Set(k, v) + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + for _, cookie := range cookes { + req.AddCookie(cookie) + } + res, err := client.Do(req) + defer res.Body.Close() + if err != nil { + return "", "", errors.New("request error") + } + if !isLogin { + //注册成功 + if res.StatusCode == http.StatusFound && len(res.Header.Get("Location")) > 0 { + return res.Header.Get("Location"), "", nil + } else { + register, _ := goquery.NewDocumentFromReader(res.Body) + firstErr := strings.TrimSpace(register.Find("#input-error-firstname").Text()) + lastErr := strings.TrimSpace(register.Find("#input-error-lastname").Text()) + emailErr := strings.TrimSpace(register.Find("#input-error-email").Text()) + pwdErr := strings.TrimSpace(register.Find("#input-error-password").Text()) + var errD strings.Builder + if len(firstErr) > 0 { + errD.WriteString(firstErr + ",") + } + if len(lastErr) > 0 { + errD.WriteString(lastErr + ",") + } + if len(emailErr) > 0 { + errD.WriteString(emailErr + ",") + } + if len(pwdErr) > 0 { + errD.WriteString(pwdErr + ",") + } + return "", errD.String(), nil + } + + } else { + if res.StatusCode == http.StatusFound && len(res.Header.Get("Location")) > 0 { + return res.Header.Get("Location"), "", nil + } + doc, err := goquery.NewDocumentFromReader(res.Body) + if err != nil { + return "", "", errors.New("request error") + } + + errDesc := doc.Find("#input-error").Text() + if len(errDesc) > 0 { + return "", strings.TrimSpace(errDesc), nil + } + + } + + return "", "", nil +} + +//获取zerotile网络列表和本地用户已加入的网络 +func (c *zerotierstruct) ZeroTierNetworkList(token string) (interface{}, []string) { + url := "https://my.zerotier.com/api/network" + return zerotier.GetData(url, token), command2.ExecResultStrArray(`zerotier-cli listnetworks | awk 'NR>1 {print $3} {line=$0}'`) +} + +// get network info +func (c *zerotierstruct) ZeroTierGetInfo(token, id string) (interface{}, []string) { + url := "https://my.zerotier.com/api/network/" + id + info := zerotier.GetData(url, token) + return info, command2.ExecResultStrArray(`zerotier-cli listnetworks | awk 'NR>1 {print $3} {line=$0}'`) +} + +//get status +func (c *zerotierstruct) ZeroTierGetStatus(token string) interface{} { + url := "https://my.zerotier.com/api/v1/status" + info := zerotier.GetData(url, token) + return info +} + +func (c *zerotierstruct) EditNetwork(token string, data string, id string) interface{} { + url := "https://my.zerotier.com/api/v1/network/" + id + info := zerotier.PostData(url, token, data) + return info +} + +func (c *zerotierstruct) EditNetworkMember(token string, data string, id, mId string) interface{} { + url := "https://my.zerotier.com/api/v1/network/" + id + "/member/" + mId + info := zerotier.PostData(url, token, data) + return info +} + +func (c *zerotierstruct) MemberList(token string, id string) interface{} { + url := "https://my.zerotier.com/api/v1/network/" + id + "/member" + info := zerotier.GetData(url, token) + return info +} + +func (c *zerotierstruct) DeleteMember(token string, id, mId string) interface{} { + url := "https://my.zerotier.com/api/v1/network/" + id + "/member/" + mId + info := zerotier.DeleteMember(url, token) + return info +} + +func (c *zerotierstruct) DeleteNetwork(token, id string) interface{} { + url := "https://my.zerotier.com/api/v1/network/" + id + info := zerotier.DeleteMember(url, token) + return info +} + +func (c *zerotierstruct) CreateNetwork(token string) interface{} { + url := "https://my.zerotier.com/api/v1/network" + info := zerotier.PostData(url, token, "{}") + return info +} + +func (c *zerotierstruct) GetJoinNetworks() string { + json := command2.ExecResultStr("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetLocalJoinNetworks") + return json +} + +func NewZeroTierService() ZeroTierService { + //初始化client + client = http.Client{Timeout: 30 * time.Second, CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse //禁止重定向 + }, + } + return &zerotierstruct{} +} diff --git a/service/zima_info.go b/service/zima_info.go new file mode 100644 index 0000000..3f9da93 --- /dev/null +++ b/service/zima_info.go @@ -0,0 +1,162 @@ +package service + +import ( + "fmt" + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/disk" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v3/net" + "io/ioutil" + "oasis/model" + "oasis/pkg/config" + command2 "oasis/pkg/utils/command" + "oasis/pkg/utils/oasis_err" + "os" + "runtime" + "strconv" + "strings" +) + +//系统信息 +type ZiMaService interface { + GetCpuPercent() float64 + GetCpuCoreNum() int + GetMemInfo() *mem.VirtualMemoryStat + GetDiskInfo() *disk.UsageStat + GetNetInfo() []net.IOCountersStat + GetNet(physics bool) []string + GetNetState(name string) string + GetSysInfo() host.InfoStat + GetDirPath(path string) []model.Path + MkdirAll(path string) (int, error) + RenameFile(oldF, newF string) (int, error) + GetCpuInfo() []cpu.InfoStat +} + +type zima struct { +} + +//获取cpu占用率 +func (c *zima) GetCpuPercent() float64 { + percent, _ := cpu.Percent(0, false) + value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", percent[0]), 64) + return value +} + +//获取物理核心数 +func (c *zima) GetCpuCoreNum() int { + count, _ := cpu.Counts(false) + return count +} + +//cpu详情 +func (c *zima) GetCpuInfo() []cpu.InfoStat { + info, _ := cpu.Info() + return info +} + +//获取内存详情 +func (c *zima) GetMemInfo() *mem.VirtualMemoryStat { + memInfo, _ := mem.VirtualMemory() + memInfo.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", memInfo.UsedPercent), 64) + return memInfo +} + +//获取硬盘详情 +func (c *zima) GetDiskInfo() *disk.UsageStat { + path := "/" + if runtime.GOOS == "windows" { + path = "C:" + } + diskInfo, _ := disk.Usage(path) + diskInfo.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.UsedPercent), 64) + diskInfo.InodesUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", diskInfo.InodesUsedPercent), 64) + return diskInfo +} + +//获取硬盘目录 +func (c *zima) GetDirPath(path string) []model.Path { + + ls, _ := ioutil.ReadDir(path) + dirs := []model.Path{} + + if strings.Count(path, "/") > 1 { + + for _, l := range ls { + if !strings.HasPrefix(l.Name(), ".") && l.IsDir() { + dirs = append(dirs, model.Path{Name: l.Name(), Path: path + l.Name() + "/"}) + } + } + } else { + dirs = append(dirs, model.Path{Name: "mnt", Path: "/mnt/"}) + dirs = append(dirs, model.Path{Name: "media", Path: "/media/"}) + dirs = append(dirs, model.Path{Name: "home", Path: "/home/"}) + } + return dirs +} + +//获取系统信息 +func (c *zima) GetSysInfo() host.InfoStat { + info, _ := host.Info() + return *info +} + +//shell脚本参数 {1:虚拟网卡 2:物理网卡} +func (c *zima) GetNet(physics bool) []string { + t := "1" + if physics { + t = "2" + } + return command2.ExecResultStrArray("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;GetNetCard " + t) +} + +//shell脚本参数 { 网卡名称 } +func (c *zima) GetNetState(name string) string { + return command2.ExecResultStr("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;CatNetCardState " + name) +} + +//网络信息 +func (c *zima) GetNetInfo() []net.IOCountersStat { + //loger.Error("输出个内容试试") + parts, _ := net.IOCounters(true) + //fmt.Println(net.ConntrackStatsWithContext(true)) + return parts +} + +//mkdir +func (c *zima) MkdirAll(path string) (int, error) { + _, err := os.Stat(path) + if err == nil { + return oasis_err.DIR_ALREADY_EXISTS, nil + } else { + if os.IsNotExist(err) { + os.MkdirAll(path, os.ModePerm) + return oasis_err.SUCCESS, nil + } + } + return oasis_err.ERROR, err +} + +//修改文件 +func (c *zima) RenameFile(oldF, newF string) (int, error) { + + _, err := os.Stat(newF) + if err == nil { + return oasis_err.DIR_ALREADY_EXISTS, nil + } else { + if os.IsNotExist(err) { + err := os.Rename(oldF, newF) + if err != nil { + return oasis_err.ERROR, err + } + return oasis_err.SUCCESS, nil + } + } + return oasis_err.ERROR, err +} + +//获取zima服务 +func NewZiMaService() ZiMaService { + return &zima{} +} diff --git a/shell/11-usb-mount.rules b/shell/11-usb-mount.rules new file mode 100644 index 0000000..9c33b8c --- /dev/null +++ b/shell/11-usb-mount.rules @@ -0,0 +1,6 @@ + +# copy to /etc/udev/rules.d path + +KERNEL=="sd[a-z]*[0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" + +KERNEL=="sd[a-z]*[0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" \ No newline at end of file diff --git a/shell/helper.sh b/shell/helper.sh new file mode 100644 index 0000000..bfc3252 --- /dev/null +++ b/shell/helper.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +# 获取系统信息 +GetSysInfo() { + if [ -s "/etc/redhat-release" ]; then + SYS_VERSION=$(cat /etc/redhat-release) + elif [ -s "/etc/issue" ]; then + SYS_VERSION=$(cat /etc/issue) + fi + SYS_INFO=$(uname -a) + SYS_BIT=$(getconf LONG_BIT) + MEM_TOTAL=$(free -m | grep Mem | awk '{print $2}') + CPU_INFO=$(getconf _NPROCESSORS_ONLN) + + echo -e ${SYS_VERSION} + echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO} + echo -e ${SYS_INFO} +} + +#获取网卡信息 +GetNetCard() { + if [ "$1" == "1" ]; then + if [ -d "/sys/devices/virtual/net" ]; then + ls /sys/devices/virtual/net + fi + else + if [ -d "/sys/devices/virtual/net" ] && [ -d "/sys/class/net" ]; then + ls /sys/class/net/ | grep -v "$(ls /sys/devices/virtual/net/)" + fi + fi +} + +#查看网卡状态 +#param 网卡名称 +CatNetCardState() { + if [ -e "/sys/class/net/$1/operstate" ]; then + cat /sys/class/net/$1/operstate + fi +} + +#获取docker根目录 +GetDockerRootDir() { + if hash docker 2>/dev/null; then + docker info | grep 'Docker Root Dir' | awk -F ':' '{print $2}' + else + echo "" + fi +} + +#删除安装应用文件夹 +#param 需要删除的文件夹路径 +DelAppConfigDir() { + if [ -d $1 ]; then + rm -fr $1 + fi +} + +#zerotier本机已加入的网络 +#result start,end,sectors +GetLocalJoinNetworks() { + zerotier-cli listnetworks -j +} + +#移除挂载点,删除已挂在的文件夹 +UMountPorintAndRemoveDir() { + DEVICE=$1 + MOUNT_POINT=$(mount | grep ${DEVICE} | awk '{ print $3 }') + if [[ -z ${MOUNT_POINT} ]]; then + ${log} "Warning: ${DEVICE} is not mounted" + else + umount -l ${DEVICE} + ${log} "Unmounted ${DEVICE} from ${MOUNT_POINT}" + /bin/rmdir "${MOUNT_POINT}" + sed -i.bak "\@${MOUNT_POINT}@d" /var/log/usb-mount.track + fi +} + +#格式化fat32磁盘 +#param 需要格式化的目录 /dev/sda1 +#param 格式 +FormatDisk() { + if [ "$2" == "fat32" ]; then + mkfs.vfat -F 32 $1 + elif [ "$2" == "ntfs" ]; then + mkfs.ntfs $1 + elif [ "$2" == "ext4" ]; then + mkfs.ext4 -F $1 + elif [ "$2" == "exfat" ]; then + mkfs.exfat $1 + else + mkfs.ext4 -F $1 + fi +} + +#删除分区 +#param 路径 /dev/sdb +#param 删除分区的区号 +DelPartition() { + fdisk $1 <> /Oasis/log/install.log 2>&1 & + if [ $? -eq 0 ] + then + Show 0 "$Update" + else + Show 1 "$Update" + fi + if [ -f "zip.zip" ]; + then + rm zip.zip + else + echo "not exist oasis.zip" + fi + Watchm=StartWatch + nohup sh /Oasis/util/shell/Watchman.sh >> /Oasis/log/install.log 2>&1 & + if [ $? -eq 0 ] + then + Show 0 "$Watchm" + else + Show 1 "$Watchm" + fi + Show 0 "Successful" +} +update + diff --git a/shell/usb-mount.sh b/shell/usb-mount.sh new file mode 100644 index 0000000..d31ee0e --- /dev/null +++ b/shell/usb-mount.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +# copy to /oasis/util/shell path +# chmod 755 + +log="logger -t usb-mount.sh -s " + +${log} "变量:$1 $2" + +ACTION=$1 + +DEVBASE=$2 + +DEVICE="/dev/${DEVBASE}" + +# See if this drive is already mounted, and if so where +MOUNT_POINT=$(mount | grep ${DEVICE} | awk '{ print $3 }') + +do_mount() { + + if [[ -n ${MOUNT_POINT} ]]; then + ${log} "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}" + exit 1 + fib + + # Get info for this drive: $ID_FS_LABEL and $ID_FS_TYPE + eval $(blkid -o udev ${DEVICE} | grep -i -e "ID_FS_LABEL" -e "ID_FS_TYPE") + + #ID_FS_LABEL=新加卷 + #ID_FS_LABEL_ENC=新加卷 + #ID_FS_TYPE=ntfs + + # Figure out a mount point to use + # LABEL=${ID_FS_LABEL} + LABEL=${DEVBASE} + if grep -q " /media/${LABEL} " /etc/mtab; then + # Already in use, make a unique one + LABEL+="-${DEVBASE}" + fi + DEV_LABEL="${LABEL}" + + # Use the device name in case the drive doesn't have label + if [ -z ${DEV_LABEL} ]; then + DEV_LABEL="${DEVBASE}" + fi + + MOUNT_POINT="/media/${DEV_LABEL}" + + ${log} "Mount point: ${MOUNT_POINT}" + + mkdir -p ${MOUNT_POINT} + + # # Global mount options + # OPTS="rw,relatime" + # + # # File system type specific mount options + # if [[ ${ID_FS_TYPE} == "vfat" ]]; then + # OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush" + # fi + + # if ! mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then + # ${log} "Error mounting ${DEVICE} (status = $?)" + # rmdir "${MOUNT_POINT}" + # exit 1 + # else + # # Track the mounted drives + # echo "${MOUNT_POINT}:${DEVBASE}" | cat >>"/var/log/usb-mount.track" + # fi + # + # ${log} "Mounted ${DEVICE} at ${MOUNT_POINT}" + + case ${ID_FS_TYPE} in + vfat) + mount -t vfat -o rw,relatime,users,gid=100,umask=000,shortname=mixed,utf8=1,flush ${DEVICE} ${MOUNT_POINT} + ;; + ext[2-4]) + mount -o noatime ${DEVICE} ${MOUNT_POINT} >/dev/null 2>&1 + ;; + exfat) + mount -t exfat ${DEVICE} ${MOUNT_POINT} >/dev/null 2>&1 + ;; + ntfs) + ntfs-3g ${DEVICE} ${MOUNT_POINT} + ;; + iso9660) + mount -t iso9660 ${DEVICE} ${MOUNT_POINT} + ;; + *) + /bin/rmdir "${MOUNT_POINT}" + exit 0 + ;; + esac +} + +do_umount() { + + if [[ -z ${MOUNT_POINT} ]]; then + ${log} "Warning: ${DEVICE} is not mounted" + else + umount -l ${DEVICE} + ${log} "Unmounted ${DEVICE} from ${MOUNT_POINT}" + /bin/rmdir "${MOUNT_POINT}" + sed -i.bak "\@${MOUNT_POINT}@d" /var/log/usb-mount.track + fi + +} + +case "${ACTION}" in +add) + do_mount + ;; +remove) + do_umount + ;; +*) + exit 1 + ;; +esac diff --git a/shell/usb-mount@.service b/shell/usb-mount@.service new file mode 100644 index 0000000..839790d --- /dev/null +++ b/shell/usb-mount@.service @@ -0,0 +1,8 @@ +# copy to /etc/systemd/system path +[Unit] +Description=Mount USB Drive on %i +[Service] +Type=oneshot +RemainAfterExit=true +ExecStart=/oasis/util/shell/usb-mount.sh add %i +ExecStop=/oasis/util/shell/usb-mount.sh remove %i diff --git a/types/notify.go b/types/notify.go new file mode 100644 index 0000000..3136878 --- /dev/null +++ b/types/notify.go @@ -0,0 +1,13 @@ +package types + +const ( + NOTIFY_DYNAMICE = iota + NOTIFY_UNREAD + NOTIFY_READ +) +const ( + NOTIFY_TYPE_UNIMPORTANT = iota + 1 + NOTIFY_TYPE_NEED_CONFIRM + NOTIFY_TYPE_ERROR + NOTIFY_TYPE_INSTALL_LOG +) diff --git a/types/rely.go b/types/rely.go new file mode 100644 index 0000000..4d81c80 --- /dev/null +++ b/types/rely.go @@ -0,0 +1,3 @@ +package types + +const RELY_TYPE_MYSQL = iota diff --git a/types/system.go b/types/system.go new file mode 100644 index 0000000..2270705 --- /dev/null +++ b/types/system.go @@ -0,0 +1,3 @@ +package types + +const CURRENTVERSION = "0.1.0" diff --git a/types/task.go b/types/task.go new file mode 100644 index 0000000..72a717e --- /dev/null +++ b/types/task.go @@ -0,0 +1,16 @@ +package types + +const ( + TASK_TYPE_USER = iota + TASK_TYPE_APP +) + +const ( + TASK_DATA_TYPE_LINK = iota + TASK_DATA_TYPE_TEXT +) + +const ( + TASK_STATE_UNCOMPLETE = iota + TASK_STATE_COMPLETED +) diff --git a/web/browserconfig.xml b/web/browserconfig.xml new file mode 100644 index 0000000..a02d62e --- /dev/null +++ b/web/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/web/favicon.ico b/web/favicon.ico new file mode 100644 index 0000000..27a87c9 Binary files /dev/null and b/web/favicon.ico differ diff --git a/web/img/ani/icon/android-chrome-192x192.png b/web/img/ani/icon/android-chrome-192x192.png new file mode 100644 index 0000000..c3d1cea Binary files /dev/null and b/web/img/ani/icon/android-chrome-192x192.png differ diff --git a/web/img/ani/icon/apple-touch-icon.png b/web/img/ani/icon/apple-touch-icon.png new file mode 100644 index 0000000..8525617 Binary files /dev/null and b/web/img/ani/icon/apple-touch-icon.png differ diff --git a/web/img/ani/icon/favicon-16x16.png b/web/img/ani/icon/favicon-16x16.png new file mode 100644 index 0000000..37f9217 Binary files /dev/null and b/web/img/ani/icon/favicon-16x16.png differ diff --git a/web/img/ani/icon/favicon-32x32.png b/web/img/ani/icon/favicon-32x32.png new file mode 100644 index 0000000..8474b54 Binary files /dev/null and b/web/img/ani/icon/favicon-32x32.png differ diff --git a/web/img/ani/icon/mstile-150x150.png b/web/img/ani/icon/mstile-150x150.png new file mode 100644 index 0000000..7d4fb0f Binary files /dev/null and b/web/img/ani/icon/mstile-150x150.png differ diff --git a/web/img/ani/icon/safari-pinned-tab.svg b/web/img/ani/icon/safari-pinned-tab.svg new file mode 100644 index 0000000..e750780 --- /dev/null +++ b/web/img/ani/icon/safari-pinned-tab.svg @@ -0,0 +1,25 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/web/img/ani/rocket-launching.json b/web/img/ani/rocket-launching.json new file mode 100644 index 0000000..14fb94e --- /dev/null +++ b/web/img/ani/rocket-launching.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":29.9700012207031,"ip":0,"op":80.0000032584668,"w":1080,"h":1080,"nm":"Rocket","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[539.086,490.913,0],"to":[0,-5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[539.086,460.913,0],"to":[0,0,0],"ti":[0,-5,0]},{"t":39.0000015885026,"s":[539.086,490.913,0]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('pingpong');","l":2},"a":{"a":0,"k":[126.431,256.861,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.005,-0.007],[0.338,-0.47],[-22.705,-2.408],[-5.77,34.451],[0,0]],"o":[[-0.341,0.47],[9.118,11.95],[2.207,-37.822],[0,0],[-0.006,0.007]],"v":[[-30.31,29.889],[-31.313,31.309],[19.347,54.524],[31.313,-54.524],[-30.294,29.867]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.7843137254901961,0.8156862745098039,0.996078431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.66,55.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.348,0.477],[0,0],[0,0],[0.342,-0.478],[-28.149,0],[-10.739,14.073]],"o":[[0,0],[0,0],[-0.348,0.477],[10.737,14.073],[28.149,0],[-0.344,-0.478]],"v":[[62.064,29.843],[-0.001,-55.177],[-62.066,29.843],[-63.084,31.285],[-0.001,55.177],[63.084,31.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.432,55.427],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.961,5.994],[0,0],[12.545,7.242],[0,0],[-4.85,-14.824],[0,0],[0,-5.358],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.267,-16.106],[0,0],[11.349,7.757],[0,0],[1.96,5.995],[0,0],[0,0],[0,0],[0,-5.358]],"v":[[25.358,28.837],[0.879,-45.994],[-28.335,-84.287],[-28.335,-83.804],[-2.087,-47.399],[22.391,27.431],[25.368,44.664],[25.368,79.856],[28.335,84.287],[28.335,46.069]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[212.787,429.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.961,5.994],[0,0],[12.544,7.242]],"o":[[0,0],[0,0],[0,-5.358],[0,0],[-5.269,-16.106],[0,0]],"v":[[-28.335,-0.348],[28.335,84.286],[28.335,46.07],[25.358,28.838],[0.88,-45.994],[-28.335,-84.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.538,429.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[1.961,5.995],[0,0],[12.544,7.242],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-5.357],[0,0],[-5.269,-16.106],[0,0],[0,0]],"v":[[-23.755,-3.161],[23.381,87.1],[32.915,81.474],[32.915,43.256],[29.938,26.024],[5.46,-48.807],[-23.755,-87.1],[-32.915,-81.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[216.493,426.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.961,5.996],[0,0],[-11.879,7.563],[0,0],[5.269,-16.106],[0,0],[0,-5.358],[0,0],[0,0]],"o":[[0,-5.358],[0,0],[5.034,-15.389],[0,0],[-12.544,7.242],[0,0],[-1.96,5.996],[0,0],[0,0],[0,0]],"v":[[-26.669,47.318],[-23.692,30.085],[0.786,-44.745],[28.335,-82.008],[28.335,-84.287],[-0.88,-45.995],[-25.359,28.836],[-28.335,46.069],[-28.335,84.287],[-26.669,81.798]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[40.492,428.978],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.96,5.994],[0,0],[-12.545,7.243]],"o":[[0,0],[0,0],[0,-5.358],[0,0],[5.268,-16.106],[0,0]],"v":[[28.335,-0.348],[-28.335,84.288],[-28.335,46.07],[-25.359,28.838],[-0.88,-45.993],[28.335,-84.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.325,429.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-1.961,5.995],[0,0],[-12.545,7.243],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-5.357],[0,0],[5.269,-16.106],[0,0],[0,0]],"v":[[23.756,-3.161],[-23.381,87.101],[-32.915,81.474],[-32.915,43.256],[-29.938,26.024],[-5.46,-48.807],[23.756,-87.101],[32.915,-81.563]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36.37,426.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[22.059,12.736],[5.067,-2.396],[-8.952,-5.169],[0,-25.313],[7.76,-3.881],[0,15.04]],"o":[[-10.574,-6.104],[6.66,-1.863],[22.059,12.736],[0,13.179],[8.142,-3.011],[0,-25.312]],"v":[[-6.679,-45.741],[-33.262,-49.041],[-8.235,-44.609],[31.706,24.283],[17.941,50.675],[33.262,23.151]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5568627450980392,0.33725490196078434,0.9254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.91,269.366],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.61,3.816],[0,20.554],[-5.082,3.637],[0,-12.969],[-17.913,-10.342],[-5.941,4.252]],"o":[[-17.913,-10.342],[0,-9.475],[-8.767,1.6],[0,20.555],[9.655,5.575],[-5.127,0.936]],"v":[[10.466,33.754],[-21.969,-22.189],[-13.796,-42.159],[-28.348,-19.514],[4.086,36.429],[28.348,37.907]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.972,271.258],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-20.554],[17.913,10.341],[0,20.555],[-17.912,-10.342]],"o":[[0,20.555],[-17.912,-10.342],[0,-20.555],[17.913,10.342]],"v":[[32.434,18.726],[0,37.218],[-32.434,-18.725],[0,-37.217]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.058,270.469],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-25.312],[22.058,12.736],[0,25.312],[-22.06,-12.736]],"o":[[0,25.312],[-22.06,-12.735],[0,-25.313],[22.058,12.736]],"v":[[39.941,23.06],[0.001,45.832],[-39.941,-23.06],[0.001,-45.832]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5058823529411764,0.2980392156862745,0.8823529411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.058,270.47],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-25.312],[6.936,-4.239],[0.213,-0.12],[10.96,6.328],[0,25.312],[-7.087,4.179],[-0.201,0.11],[-10.847,-6.263]],"o":[[0,12.364],[-0.209,0.128],[-7.217,4.035],[-22.059,-12.736],[0,-12.517],[0.198,-0.117],[7.198,-3.898],[22.059,12.736]],"v":[[41.577,21.066],[30.374,46.427],[23.496,50.771],[9.934,39.321],[-30.007,-29.57],[-34.491,-46.367],[-26.245,-50.908],[1.636,-47.825]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.304,267.8],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-11.77,70.276],[0,0],[1.37,-1.986],[-6.824,-57.084],[0,0],[0,0],[0,-0.24],[-47.027,-1.54]],"o":[[-3.159,-78.822],[0,0],[-1.425,1.952],[-32.648,47.319],[0,0],[0,0],[-0.006,0.24],[0,27.771],[0,0]],"v":[[42.816,9.995],[55.833,-219.026],[-5.773,-134.635],[-9.966,-128.727],[-49.009,33.745],[-33.159,166.308],[-33.127,166.308],[-33.159,167.027],[51.189,219.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9333333333333333,0.9254901960784314,0.984313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.139,219.905],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[32.648,47.319],[1.425,1.952],[0,0],[0,0],[1.371,-1.987],[-6.825,-57.083],[0,0],[0,0],[0,-0.24],[-49.403,0],[0,28.77],[0.007,0.241],[0,0]],"o":[[6.824,-57.083],[-1.37,-1.987],[0,0],[0,0],[-1.426,1.952],[-32.648,47.319],[0,0],[0,0],[-0.006,0.241],[0,28.77],[49.403,0],[0,-0.24],[0,0],[0,0]],"v":[[105.302,34.013],[66.258,-128.458],[62.065,-134.366],[0.001,-219.386],[-62.064,-134.366],[-66.258,-128.458],[-105.301,34.013],[-89.451,166.576],[-89.419,166.576],[-89.451,167.295],[0.001,219.386],[89.451,167.295],[89.419,166.576],[89.451,166.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8666666666666667,0.8274509803921568,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,219.636],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,-0.181],[-37.195,0],[0,21.66],[0.003,0.181],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.004,0.181],[0,21.66],[37.196,0],[0,-0.181],[0,0],[0,0]],"v":[[67.349,-39.891],[-67.349,-39.891],[-67.349,0.131],[-67.325,0.131],[-67.349,0.672],[0,39.891],[67.349,0.672],[67.326,0.131],[67.349,0.131]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,418.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,-0.077],[-15.573,0],[0,9.068],[0.001,0.075],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.002,0.075],[0,9.068],[15.574,0],[0,-0.077],[0,0],[0,0]],"v":[[28.198,-12.302],[-28.198,-12.302],[-28.198,-4.346],[-28.188,-4.346],[-28.198,-4.119],[-0.001,12.302],[28.198,-4.119],[28.188,-4.346],[28.198,-4.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.431,461.768],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.049,3.898],[0,0],[-13.109,-7.568]],"o":[[0,0],[0,0],[0,-5.598],[0,0],[5.505,-10.473],[0,0]],"v":[[29.61,26.123],[-29.61,57.672],[-29.61,17.736],[-26.499,3.32],[-0.92,-45.341],[29.61,-50.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[29.859,342.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[2.049,3.898],[0,0],[13.109,-7.568]],"o":[[0,0],[0,0],[0,-5.598],[0,0],[-5.506,-10.473],[0,0]],"v":[[-29.61,26.123],[29.61,57.672],[29.61,17.736],[26.499,3.32],[0.92,-45.341],[-29.61,-50.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4117647058823529,0.21568627450980393,0.7725490196078432,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.002,342.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3 Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[127.071,467.425,0],"ix":2,"l":2},"a":{"a":0,"k":[33.238,6.415,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[81,81,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":39.0000015885026,"s":[81,81,100]}],"ix":6,"x":"var $bm_rt;\n$bm_rt = loopOut('pingpong');","l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-22.978],[0,0],[0,49.712],[-18.22,0]],"o":[[0,49.712],[0,0],[0,-22.978],[18.218,0]],"v":[[32.989,-23.56],[0,65.165],[-32.989,-23.56],[0,-65.165]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9803921568627451,0.6274509803921569,0.8588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.239,65.415],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,543,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":30,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":132.00000537647,"s":[1800]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,543,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":132.00000537647,"s":[1800]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,776,0],"ix":2,"l":2},"a":{"a":0,"k":[0,233,0],"ix":1,"l":2},"s":{"a":0,"k":[142.736,142.736,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":29,"nm":"Gaussian Blur","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Blurriness","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":30,"ix":1}},{"ty":7,"nm":"Blur Dimensions","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Repeat Edge Pixels","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":80.0000032584668,"s":[697.5]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[542,776,0],"ix":2,"l":2},"a":{"a":0,"k":[0,233,0],"ix":1,"l":2},"s":{"a":0,"k":[142.736,142.736,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[261,142],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3411764705882353,0.984313725490196,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":17,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[110.787,110.787],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":78,"ix":1},"e":{"a":0,"k":30,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":80.0000032584668,"s":[697.5]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":1,"nm":"Dark Gray Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1080,"sh":1080,"sc":"#2d2d2d","ip":900.000036657751,"op":900.000036657751,"st":0,"bm":0,"hidden":0}],"markers":[]} \ No newline at end of file diff --git a/web/img/casa.2579f069.svg b/web/img/casa.2579f069.svg new file mode 100644 index 0000000..33a2f35 --- /dev/null +++ b/web/img/casa.2579f069.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/web/img/default.be7833db.png b/web/img/default.be7833db.png new file mode 100644 index 0000000..03ff6c8 Binary files /dev/null and b/web/img/default.be7833db.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..f473065 --- /dev/null +++ b/web/index.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + CasaOS + + + + + +
+ + + + diff --git a/web/js/app.js b/web/js/app.js new file mode 100644 index 0000000..ecbeb85 --- /dev/null +++ b/web/js/app.js @@ -0,0 +1,1297 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ var executeModules = data[2]; +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ // add entry modules from loaded chunk to deferred list +/******/ deferredModules.push.apply(deferredModules, executeModules || []); +/******/ +/******/ // run deferred modules when all chunks ready +/******/ return checkDeferredModules(); +/******/ }; +/******/ function checkDeferredModules() { +/******/ var result; +/******/ for(var i = 0; i < deferredModules.length; i++) { +/******/ var deferredModule = deferredModules[i]; +/******/ var fulfilled = true; +/******/ for(var j = 1; j < deferredModule.length; j++) { +/******/ var depId = deferredModule[j]; +/******/ if(installedChunks[depId] !== 0) fulfilled = false; +/******/ } +/******/ if(fulfilled) { +/******/ deferredModules.splice(i--, 1); +/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); +/******/ } +/******/ } +/******/ +/******/ return result; +/******/ } +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "app": 0 +/******/ }; +/******/ +/******/ var deferredModules = []; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/ui/"; +/******/ +/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // add entry module to deferred list +/******/ deferredModules.push([0,"chunk-vendors"]); +/******/ // run deferred modules when ready +/******/ return checkDeferredModules(); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&": +/*!*************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js& ***! + \*************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _components_Apps_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/Apps.vue */ \"./src/components/Apps.vue\");\n/* harmony import */ var _components_BrandBar_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/BrandBar.vue */ \"./src/components/BrandBar.vue\");\n/* harmony import */ var _components_ContactBar_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/ContactBar.vue */ \"./src/components/ContactBar.vue\");\n/* harmony import */ var _components_SearchBar_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/SearchBar.vue */ \"./src/components/SearchBar.vue\");\n/* harmony import */ var _components_SideBar_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/SideBar.vue */ \"./src/components/SideBar.vue\");\n/* harmony import */ var _components_Suggestion_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/Suggestion.vue */ \"./src/components/Suggestion.vue\");\n/* harmony import */ var _components_TopBar_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/TopBar.vue */ \"./src/components/TopBar.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n //import Shortcuts from './components/Shortcuts.vue'\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n BrandBar: _components_BrandBar_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ContactBar: _components_ContactBar_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n SideBar: _components_SideBar_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n SearchBar: _components_SearchBar_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n Suggestion: _components_Suggestion_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n Apps: _components_Apps_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n TopBar: _components_TopBar_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"] //Shortcuts\n\n },\n created: function created() {\n // Check if not login then login and get token\n if (!localStorage.getItem(\"user_token\")) {\n this.login();\n }\n },\n methods: {\n login: function login() {\n /**\n * @description: Login\n * @return void\n */\n // this.$api.user.login({\n // username: \"admin\",\n // pwd: \"admin\"\n // }).then((res) => {\n // if (res.data.success == 200) {\n // localStorage.setItem(\"user_token\", res.data.data)\n // }\n // })\n }\n }\n});\n\n//# sourceURL=webpack:///./src/App.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/assets/widgets/Clock.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/assets/widgets/Clock.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_0__);\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data: function data() {\n return {\n timer: 0,\n timeText: \"\",\n dateText: \"\"\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.updateClock();\n this.timer = setInterval(function () {\n _this.updateClock();\n }, 1000);\n },\n methods: {\n updateClock: function updateClock() {\n this.timeText = moment__WEBPACK_IMPORTED_MODULE_0___default()().format('LT');\n this.dateText = moment__WEBPACK_IMPORTED_MODULE_0___default()().format('dddd, MMMM Do');\n }\n }\n});\n\n//# sourceURL=webpack:///./src/assets/widgets/Clock.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Apps.vue?vue&type=script&lang=js&": +/*!*************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Apps.vue?vue&type=script&lang=js& ***! + \*************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Apps_AppCard_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Apps/AppCard.vue */ \"./src/components/Apps/AppCard.vue\");\n/* harmony import */ var _Panel_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Panel.vue */ \"./src/components/Panel.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data: function data() {\n return {\n appList: [],\n appConfig: {}\n };\n },\n components: {\n AppCard: _Apps_AppCard_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n created: function created() {\n this.getList();\n },\n methods: {\n /**\n * @description: Fetch the list of installed apps\n * @return {*} void\n */\n getList: function getList() {\n var _this = this;\n\n this.$api.app.myAppList().then(function (res) {\n _this.appList = res.data.data;\n });\n },\n\n /**\n * @description: Show Install Panel Programmatic\n * @return {*} void\n */\n showInstall: function showInstall() {\n var _this2 = this;\n\n this.$api.app.appConfig().then(function (res) {\n if (res.data.success == 200) {\n _this2.$buefy.modal.open({\n parent: _this2,\n component: _Panel_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n hasModalCard: true,\n customClass: '',\n trapFocus: true,\n canCancel: ['escape'],\n scroll: \"keep\",\n animation: \"zoom-out\",\n events: {\n 'updateState': function updateState() {\n _this2.getList();\n }\n },\n props: {\n id: \"0\",\n state: \"install\",\n configData: res.data.data\n }\n });\n }\n });\n },\n\n /**\n * @description: Show Settings Panel Programmatic\n * @return {*} void\n */\n showConfigPanel: function showConfigPanel(id) {\n var _this3 = this;\n\n this.$api.app.getContainerSettingdata(id).then(function (ret) {\n _this3.$api.app.appConfig().then(function (res) {\n if (res.data.success == 200) {\n _this3.$buefy.modal.open({\n parent: _this3,\n component: _Panel_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n hasModalCard: true,\n customClass: '',\n trapFocus: true,\n canCancel: ['escape'],\n scroll: \"keep\",\n animation: \"zoom-out\",\n events: {\n 'updateState': function updateState() {\n _this3.getList();\n }\n },\n props: {\n id: id,\n state: \"update\",\n configData: res.data.data,\n initDatas: ret.data.data\n }\n });\n }\n });\n });\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/Apps.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Apps/AppCard.vue?vue&type=script&lang=js&": +/*!*********************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Apps/AppCard.vue?vue&type=script&lang=js& ***! + \*********************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"app-card\",\n data: function data() {\n return {\n hover: false,\n dropState: false,\n isUninstalling: false,\n isRestarting: false,\n isStarting: false,\n isStoping: false,\n isSaving: false\n };\n },\n props: {\n item: {\n type: Object\n }\n },\n methods: {\n /**\n * @description: Create application access link\n * @param {String} port App access port\n * @param {String} index App access index page\n * @return {String}\n */\n siteUrl: function siteUrl(port, index) {\n return false ? undefined : \"http://\".concat(document.domain, \":\").concat(port).concat(index);\n },\n\n /**\n * @description: Set drop-down menu status\n * @param {Boolean} e\n * @return {*} void\n */\n setDropState: function setDropState(e) {\n this.dropState = e;\n },\n\n /**\n * @description: Restart Application\n * @return {*} void\n */\n restartApp: function restartApp() {\n var _this2 = this;\n\n this.isRestarting = true;\n this.$api.app.startContainer(this.item.custom_id, {\n state: \"restart\"\n }).then(function (res) {\n console.log(res.data);\n\n if (res.data.success == 200) {\n _this2.updateState();\n }\n\n _this2.isRestarting = false;\n });\n },\n\n /**\n * @description: Confirm before uninstall\n * @return {*} void\n */\n uninstallConfirm: function uninstallConfirm() {\n var _this = this;\n\n this.$buefy.dialog.confirm({\n title: 'Attention',\n message: 'Data cannot be recovered after deletion!
Continue on to uninstall this application?',\n type: 'is-dark',\n confirmText: 'Uninstall',\n onConfirm: function onConfirm() {\n _this.isUninstalling = true;\n\n _this.uninstallApp();\n }\n });\n },\n\n /**\n * @description: Uninstall app\n * @return {*} void\n */\n uninstallApp: function uninstallApp() {\n var _this3 = this;\n\n this.isUninstalling = true;\n this.$api.app.uninstall(this.item.custom_id).then(function (res) {\n if (res.data.success == 200) {\n console.log(res.data.data);\n\n _this3.updateState();\n }\n\n _this3.isUninstalling = false;\n });\n },\n\n /**\n * @description: Emit the event that the app has been updated\n * @return {*} void\n */\n updateState: function updateState() {\n this.$emit(\"updateState\");\n },\n\n /**\n * @description: Emit the event that the app has been updated with custom_id\n * @return {*} void\n */\n configApp: function configApp() {\n this.$emit(\"configApp\", this.item.custom_id);\n },\n\n /**\n * @description: Start or Stop a App\n * @param {Object} item the app info object\n * @return {*} void\n */\n toggle: function toggle(item) {\n var _this4 = this;\n\n this.isStarting = true;\n var data = {\n state: item.state == \"running\" ? \"stop\" : \"start\"\n };\n this.$api.app.startContainer(item.custom_id, data).then(function (res) {\n console.log(res.data);\n item.state = res.data.data;\n _this4.isStarting = false;\n\n _this4.updateState();\n });\n }\n },\n watch: {\n hover: function hover(val) {\n if (!val && this.dropState) this.$refs.dro.toggle();\n }\n },\n filters: {\n /**\n * @description: Format Dot Class\n * @param {String} state\n * @return {String}\n */\n dotClass: function dotClass(state) {\n return state == 'running' ? 'start' : 'stop';\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/Apps/AppCard.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/BrandBar.vue?vue&type=script&lang=js&": +/*!*****************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/BrandBar.vue?vue&type=script&lang=js& ***! + \*****************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"brand-bar\"\n});\n\n//# sourceURL=webpack:///./src/components/BrandBar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ContactBar.vue?vue&type=script&lang=js&": +/*!*******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/ContactBar.vue?vue&type=script&lang=js& ***! + \*******************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"contact-bar\"\n});\n\n//# sourceURL=webpack:///./src/components/ContactBar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Panel.vue?vue&type=script&lang=js&": +/*!**************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Panel.vue?vue&type=script&lang=js& ***! + \**************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! regenerator-runtime/runtime.js */ \"./node_modules/regenerator-runtime/runtime.js\");\n/* harmony import */ var regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ \"./node_modules/core-js/modules/es.array.map.js\");\n/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.filter.js */ \"./node_modules/core-js/modules/es.array.filter.js\");\n/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.join.js */ \"./node_modules/core-js/modules/es.array.join.js\");\n/* harmony import */ var core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ \"./node_modules/core-js/modules/es.array.slice.js\");\n/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _forms_InputGroup_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./forms/InputGroup.vue */ \"./src/components/forms/InputGroup.vue\");\n/* harmony import */ var _forms_Ports_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./forms/Ports.vue */ \"./src/components/forms/Ports.vue\");\n/* harmony import */ var _forms_ImportPanel_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./forms/ImportPanel.vue */ \"./src/components/forms/ImportPanel.vue\");\n/* harmony import */ var lottie_vuejs_src_LottieAnimation_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! lottie-vuejs/src/LottieAnimation.vue */ \"./node_modules/lottie-vuejs/src/LottieAnimation.vue\");\n/* harmony import */ var vue_slider_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! vue-slider-component */ \"./node_modules/vue-slider-component/dist/vue-slider-component.umd.min.js\");\n/* harmony import */ var vue_slider_component__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(vue_slider_component__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var vue_slider_component_theme_default_css__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! vue-slider-component/theme/default.css */ \"./node_modules/vue-slider-component/theme/default.css\");\n/* harmony import */ var vue_slider_component_theme_default_css__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(vue_slider_component_theme_default_css__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var vee_validate__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! vee-validate */ \"./node_modules/vee-validate/dist/vee-validate.esm.js\");\n/* harmony import */ var _plugins_vee_validate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/plugins/vee-validate */ \"./src/plugins/vee-validate.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! lodash/debounce */ \"./node_modules/lodash/debounce.js\");\n/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_22__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n Ports: _forms_Ports_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n InputGroup: _forms_InputGroup_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n ValidationObserver: vee_validate__WEBPACK_IMPORTED_MODULE_20__[\"ValidationObserver\"],\n ValidationProvider: vee_validate__WEBPACK_IMPORTED_MODULE_20__[\"ValidationProvider\"],\n LottieAnimation: lottie_vuejs_src_LottieAnimation_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n VueSlider: vue_slider_component__WEBPACK_IMPORTED_MODULE_18___default.a\n },\n data: function data() {\n return {\n timer: 0,\n data: [],\n isLoading: false,\n isFetching: false,\n errorType: 1,\n currentSlide: 1,\n cancelButtonText: \"Cancel\",\n webui: \"\",\n baseUrl: \"\",\n totalMemory: 0,\n networks: [],\n tempNetworks: [],\n networkModes: [],\n installPercent: 0,\n installText: \"\",\n initData: {\n port_map: \"\",\n cpu_shares: 10,\n memory: 300,\n restart: \"always\",\n label: \"\",\n position: true,\n index: \"\",\n icon: \"\",\n network_model: \"\",\n image: \"\",\n description: \"\",\n origin: \"custom\",\n ports: [],\n volumes: [],\n envs: [],\n devices: []\n }\n };\n },\n props: {\n id: String,\n state: String,\n configData: Object,\n initDatas: {\n type: Object\n }\n },\n created: function created() {\n var _this2 = this;\n\n //If it is edit, Init data\n if (this.initDatas != undefined) {\n this.initData = this.initDatas;\n this.webui = this.initDatas.port_map + this.initDatas.index;\n } //Get Max memory info form device\n\n\n this.totalMemory = Math.floor(this.configData.memory.total / 1048576);\n this.initData.memory = this.totalMemory; //Handling network types\n\n this.tempNetworks = this.configData.networks;\n this.networkModes = this.unique(this.tempNetworks.map(function (item) {\n return item.driver;\n }));\n this.networks = this.networkModes.map(function (item) {\n var tempitem = {};\n tempitem.driver = item;\n tempitem.networks = _this2.tempNetworks.filter(function (net) {\n return net.driver == item;\n });\n return tempitem;\n });\n var gg = this.tempNetworks.filter(function (item) {\n if (item.driver == \"bridge\") {\n return item;\n }\n });\n this.initData.network_model = gg[0].id; // Set Front-end base url\n\n this.baseUrl = \"\".concat(window.location.protocol, \"//\").concat(document.domain, \":\");\n },\n computed: {\n showPorts: function showPorts() {\n if (this.initData.network_model.indexOf(\"macvlan\") > -1) {\n return false;\n } else {\n return true;\n }\n },\n showHostPort: function showHostPort() {\n if (this.initData.network_model.indexOf(\"host\") > -1) {\n return false;\n } else {\n return true;\n }\n }\n },\n methods: {\n /**\n * @description: Process the datas before submit\n * @param {*}\n * @return {*} void\n */\n processData: function processData() {\n // GET port map and index\n if (this.webui != \"\") {\n var slashArr = this.webui.split(\"/\");\n this.initData.port_map = slashArr[0];\n this.initData.index = \"/\" + slashArr.slice(1).join(\"/\");\n }\n\n var model = this.initData.network_model.split(\"-\");\n this.initData.network_model = model[0];\n },\n\n /**\n * @description: Array deduplication\n * @param {Array} arr\n * @return {Array}\n */\n unique: function unique(arr) {\n for (var i = 0; i < arr.length; i++) {\n for (var j = i + 1; j < arr.length; j++) {\n if (arr[i] == arr[j]) {\n arr.splice(j, 1);\n j--;\n }\n }\n }\n\n return arr;\n },\n\n /**\n * @description: Back to prev Step\n * @param {*}\n * @return {*} void\n */\n prevStep: function prevStep() {\n this.currentSlide--;\n },\n\n /**\n * @description: Validate form async\n * @param {Object} ref ref of component\n * @return {Boolean} \n */\n checkStep: function checkStep(ref) {\n return Object(_Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var isValid;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return ref.validate();\n\n case 2:\n isValid = _context.sent;\n return _context.abrupt(\"return\", isValid);\n\n case 4:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }))();\n },\n\n /**\n * @description: Submit datas after valid\n * @param {*}\n * @return {*} void\n */\n installApp: function installApp() {\n var _this3 = this;\n\n this.checkStep(this.$refs.ob1).then(function (val) {\n if (val) {\n _this3.processData();\n\n _this3.isLoading = true;\n\n _this3.$api.app.install(_this3.id, _this3.initData).then(function (res) {\n _this3.isLoading = false;\n\n if (res.data.success == 200) {\n _this3.currentSlide = 2;\n _this3.cancelButtonText = \"Continue in background\";\n\n _this3.checkInstallState(res.data.data);\n } else {\n //this.currentSlide = 1;\n _this3.$buefy.toast.open({\n message: res.data.message,\n type: 'is-warning'\n });\n }\n });\n }\n });\n },\n\n /**\n * @description: Check the installation process every 250 milliseconds\n * @param {String} appId\n * @return {*} void\n */\n checkInstallState: function checkInstallState(appId) {\n var _this4 = this;\n\n this.timer = setInterval(function () {\n _this4.updateInstallState(appId);\n }, 250);\n },\n\n /**\n * @description: Update the installation status to the UI\n * @param {String} appId\n * @return {*} void\n */\n updateInstallState: function updateInstallState(appId) {\n var _this5 = this;\n\n this.$api.app.state(appId).then(function (res) {\n var resData = res.data.data;\n _this5.installPercent = resData.speed;\n _this5.errorType = resData.type;\n\n if (_this5.errorType == 4) {\n try {\n var info = JSON.parse(resData.message);\n var id = info.id != undefined ? info.id : \"\";\n var progress = \"\";\n\n if (info.progressDetail != undefined) {\n var progressDetail = info.progressDetail;\n\n if (!isNaN(progressDetail.current / progressDetail.total)) {\n progress = \"
Progress:\" + String(Math.floor(progressDetail.current / progressDetail.total * 100)) + \"%\";\n }\n }\n\n var status = info.status;\n _this5.installText = status + \":\" + id + \" \" + progress;\n } catch (error) {\n console.log(error);\n }\n } else {\n _this5.installText = resData.message;\n }\n\n if (resData.speed == 100 || _this5.errorType == 3) {\n clearInterval(_this5.timer);\n }\n\n var _this = _this5;\n\n if (resData.speed == 100) {\n setTimeout(function () {\n _this.$emit('updateState');\n\n _this.$emit('close');\n }, 1000);\n }\n });\n },\n\n /**\n * @description: Save edit update\n * @return {*} void\n */\n updateApp: function updateApp() {\n var _this6 = this;\n\n this.processData();\n this.isLoading = true;\n this.$api.app.updateContainerSetting(this.id, this.initData).then(function (res) {\n if (res.data.success == 200) {\n _this6.isLoading = false;\n\n _this6.$emit('updateState');\n } else {\n _this6.$buefy.toast.open({\n message: res.data.message,\n type: 'is-warning'\n });\n }\n\n _this6.$emit('close');\n });\n },\n\n /**\n * @description: Show import panel\n * @return {*} void\n */\n showImportPanel: function showImportPanel() {\n var _this7 = this;\n\n this.$buefy.modal.open({\n parent: this,\n component: _forms_ImportPanel_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n hasModalCard: true,\n customClass: '',\n trapFocus: true,\n canCancel: ['escape'],\n scroll: \"keep\",\n animation: \"zoom-out\",\n events: {\n 'update': function update(e) {\n _this7.initData = e;\n\n _this7.$buefy.dialog.alert({\n title: 'Attention',\n message: 'AutoFill only helps you to complete most of the configuration. Some of the configuration information still needs to be confirmed by you.',\n type: 'is-dark'\n });\n }\n },\n props: {\n initData: this.initData,\n netWorks: this.networks\n }\n });\n },\n\n /**\n * @description: Get remote synchronization information\n * @param {*} function\n * @return {*} void\n */\n getAsyncData: lodash_debounce__WEBPACK_IMPORTED_MODULE_22___default()(function (name) {\n var _this8 = this;\n\n if (!name.length) {\n this.data = [];\n return;\n }\n\n this.isFetching = true;\n axios__WEBPACK_IMPORTED_MODULE_13___default.a.get(\"https://hub.docker.com/api/content/v1/products/search?source=community&q=\".concat(name, \"&page=1&page_size=4\")).then(function (_ref) {\n var data = _ref.data;\n _this8.data = [];\n data.summaries.forEach(function (item) {\n return _this8.data.push(item.name);\n });\n }).catch(function (error) {\n _this8.data = [];\n throw error;\n }).finally(function () {\n _this8.isFetching = false;\n });\n }, 500)\n },\n destroyed: function destroyed() {\n clearInterval(this.timer);\n }\n});\n\n//# sourceURL=webpack:///./src/components/Panel.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/SearchBar.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/SearchBar.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"search-bar\",\n data: function data() {\n return {\n isFocus: false,\n keyText: \"\"\n };\n },\n methods: {\n /**\n * @description: Handle Focus event\n * @return {*} void\n */\n onFocus: function onFocus() {\n this.isFocus = true;\n },\n\n /**\n * @description: Handle Blur event\n * @return {*} void\n */\n onBlur: function onBlur() {\n if (this.keyText == \"\") this.isFocus = false;\n },\n\n /**\n * @description: Pop up a new window and jump to google search\n * @return {*} void\n */\n gotoSearch: function gotoSearch() {\n window.open(\"https://www.google.com/search?q=\" + this.keyText, '_blank');\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/SearchBar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/SideBar.vue?vue&type=script&lang=js&": +/*!****************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/SideBar.vue?vue&type=script&lang=js& ***! + \****************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _assets_widgets_Clock_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../assets/widgets/Clock.vue */ \"./src/assets/widgets/Clock.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'side-bar',\n components: {\n Clock: _assets_widgets_Clock_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n }\n});\n\n//# sourceURL=webpack:///./src/components/SideBar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Suggestion.vue?vue&type=script&lang=js&": +/*!*******************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Suggestion.vue?vue&type=script&lang=js& ***! + \*******************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'suggestion',\n data: function data() {\n return {\n list: []\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n this.$api.task.list().then(function (res) {\n if (res.data.success == 200) {\n _this.list = res.data.data;\n }\n });\n }\n});\n\n//# sourceURL=webpack:///./src/components/Suggestion.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/TopBar.vue?vue&type=script&lang=js&": +/*!***************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/TopBar.vue?vue&type=script&lang=js& ***! + \***************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"top-bar\",\n data: function data() {\n return {\n timer: 0,\n barData: {\n auto_update: false,\n background: \"\",\n background_type: \"d\",\n search_engine: \"google\",\n search_switch: false,\n shortcuts_switch: false,\n widgets_switch: false\n },\n updateInfo: {\n current_version: '0',\n is_need: false,\n version: Object\n },\n isUpdating: false,\n latestText: \"Currently the latest version\",\n updateText: \"A new version is available!\"\n };\n },\n created: function created() {\n this.getConfig();\n },\n methods: {\n /**\n * @description: Get CasaOs Configs\n * @return {*} void\n */\n getConfig: function getConfig() {\n var _this = this;\n\n this.$api.info.systemConfig().then(function (res) {\n if (res.data.success == 200) {\n _this.barData = res.data.data;\n }\n });\n },\n\n /**\n * @description: Save CasaOs Configs\n * @return {*} void\n */\n saveData: function saveData() {\n this.$api.info.saveSystemConfig(this.barData).then(function (res) {\n if (res.data.success == 200) {\n console.log(res);\n }\n });\n },\n\n /**\n * @description: Handle Dropmenu state\n * @param {Boolean} isOpen\n * @return {*} void\n */\n onOpen: function onOpen(isOpen) {\n var _this2 = this;\n\n if (isOpen) {\n this.$api.info.checkVersion().then(function (res) {\n if (res.data.success == 200) {\n _this2.updateInfo = res.data.data;\n }\n });\n }\n },\n\n /**\n * @description: Update System Version and check update state\n * @return {*} void\n */\n updateSystem: function updateSystem() {\n this.isUpdating = true;\n this.$api.info.updateSystem().then(function (res) {\n if (res.data.success == 200) {\n console.log(res.data.data);\n }\n });\n this.checkUpdateState();\n },\n\n /**\n * @description: check update state if is_need is false then reload page\n * @return {*} void\n */\n checkUpdateState: function checkUpdateState() {\n var _this3 = this;\n\n this.timer = setInterval(function () {\n _this3.$api.info.checkVersion().then(function (res) {\n if (res.data.success == 200) {\n if (!res.data.data.is_need) {\n clearInterval(_this3.timer);\n location.reload();\n }\n }\n });\n }, 3000);\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/TopBar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/ImportPanel.vue?vue&type=script&lang=js&": +/*!**************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/ImportPanel.vue?vue&type=script&lang=js& ***! + \**************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var core_js_modules_es_string_trim_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.string.trim.js */ \"./node_modules/core-js/modules/es.string.trim.js\");\n/* harmony import */ var core_js_modules_es_string_trim_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ \"./node_modules/core-js/modules/es.array.map.js\");\n/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.filter.js */ \"./node_modules/core-js/modules/es.array.filter.js\");\n/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var yargs_parser__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! yargs-parser */ \"./node_modules/yargs-parser/build/lib/index.js\");\n\n\nvar _excluded = [\"_\"];\n\n\n\n\n\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data: function data() {\n return {\n dockerCliCommands: \"\",\n parseError: false,\n errors: \"\"\n };\n },\n props: {\n initData: Object,\n netWorks: Array\n },\n created: function created() {\n console.log(this.netWorks);\n },\n methods: {\n /**\n * @description: Emit Event to tell parent Update\n * @param {*}\n * @return {*} void\n */\n emitSubmit: function emitSubmit() {\n if (this.parseCli()) {\n this.errors = \"\";\n this.$emit('update', this.initData);\n this.$emit('close');\n } else {\n this.errors = \"Please fill correct command line\";\n this.parseError = true;\n }\n },\n\n /**\n * @description: Parse Import Docker Cli Commands\n * @return {Boolean} \n */\n parseCli: function parseCli() {\n var formattedInput = this.dockerCliCommands.replace(/\\<[^\\>]*\\>/g, 'Custom_data').replace(/[\\r\\n]/g, \"\").replace(/\\\\/g, \"\\\\ \").trim();\n var parsedInput = Object(yargs_parser__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(formattedInput);\n console.log(parsedInput);\n\n var command = parsedInput._,\n params = Object(_Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(parsedInput, _excluded);\n\n if (command[0] !== 'docker' || command[1] !== 'run' && command[1] !== 'create') {\n return false;\n } else {\n //Envs\n this.initData.envs = this.makeArray(parsedInput.e).map(function (item) {\n var ii = item.split(\"=\");\n return {\n container: ii[0],\n host: ii[1]\n };\n }); //Ports\n\n this.initData.ports = this.makeArray(parsedInput.p).map(function (item) {\n var pArray = item.split(\":\");\n var endArray = pArray[1].split(\"/\");\n var protocol = endArray[1] ? endArray[1] : 'tcp';\n return {\n container: endArray[0],\n host: pArray[0],\n protocol: protocol\n };\n }); //Volume\n\n this.initData.volumes = this.makeArray(parsedInput.v).map(function (item) {\n var ii = item.split(\":\");\n return {\n container: ii[1],\n host: ii[0]\n };\n }); // Devices\n\n this.initData.devices = this.makeArray(parsedInput.device).map(function (item) {\n var ii = item.split(\":\");\n return {\n container: ii[1],\n host: ii[0]\n };\n }); //Network\n\n if (parsedInput.network != undefined) {\n var network = parsedInput.network == 'physical' ? 'macvlan' : parsedInput.network;\n var seletNetworks = this.netWorks.filter(function (item) {\n if (item.driver == network) {\n return true;\n }\n });\n\n if (seletNetworks.length > 0) {\n this.initData.network_model = seletNetworks[0].networks[0].id;\n }\n } //Image\n\n\n this.initData.image = Object(_Users_liangjianli_go_CasaOS_UI_node_modules_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(command).pop(); //Label\n\n if (parsedInput.name != undefined) {\n this.initData.label = parsedInput.name.replace(/^\\S/, function (s) {\n return s.toUpperCase();\n });\n } //Restart\n\n\n if (parsedInput.restart != undefined) {\n this.initData.restart = parsedInput.restart;\n }\n\n return true;\n }\n },\n\n /**\n * @description: Make String to Array\n * @param {*}\n * @return {Array}\n */\n makeArray: function makeArray(foo) {\n var newArray = typeof foo == \"string\" ? [foo] : foo;\n return newArray == undefined ? [] : newArray;\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/forms/ImportPanel.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/InputGroup.vue?vue&type=script&lang=js&": +/*!*************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/InputGroup.vue?vue&type=script&lang=js& ***! + \*************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'input-group',\n data: function data() {\n return {\n isLoading: false,\n items: [],\n min: 0\n };\n },\n model: {\n prop: 'vdata',\n event: 'change'\n },\n props: {\n vdata: Array,\n label: String,\n message: String,\n name1: {\n type: String,\n default: \"Container\"\n },\n name2: {\n type: String,\n default: \"Host\"\n }\n },\n created: function created() {//this.items = this.vdata;\n },\n watch: {},\n mounted: function mounted() {//this.addItem()\n },\n methods: {\n addItem: function addItem() {\n var itemObj = {\n container: \"\",\n host: \"\"\n };\n this.vdata.push(itemObj);\n },\n removeItem: function removeItem(index) {\n this.vdata.splice(index, 1);\n this.filterArray();\n },\n handleInput: function handleInput() {\n this.filterArray();\n },\n filterArray: function filterArray() {\n // let newArray = this.items.filter(item => {\n // if (item.container != \"\" && item.host != \"\") {\n // return true\n // } else {\n // return false\n // }\n // })\n this.$emit('change', this.vdata);\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/forms/InputGroup.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/Ports.vue?vue&type=script&lang=js&": +/*!********************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/Ports.vue?vue&type=script&lang=js& ***! + \********************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ \"./node_modules/core-js/modules/es.array.splice.js\");\n/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'ports',\n data: function data() {\n return {\n isLoading: false,\n items: [],\n min: 0\n };\n },\n model: {\n prop: 'vdata',\n event: 'change'\n },\n props: {\n vdata: Array,\n showHostPost: Boolean\n },\n created: function created() {//this.items = this.vdata;\n },\n mounted: function mounted() {\n if (this.vdata.length == 0) {//this.addItem()\n }\n },\n methods: {\n addItem: function addItem() {\n var itemObj = {\n container: \"\",\n host: \"\",\n protocol: \"tcp\"\n };\n this.vdata.push(itemObj);\n },\n removeItem: function removeItem(index) {\n this.vdata.splice(index, 1);\n this.filterArray();\n },\n handleInput: function handleInput() {\n this.filterArray();\n },\n filterArray: function filterArray() {\n // let newArray = this.items.filter(item => {\n // if (item.container != \"\" && item.host != \"\") {\n // return true\n // } else {\n // return false\n // }\n // })\n this.$emit('change', this.vdata);\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/forms/Ports.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&": +/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=template&id=7ba5bd90& ***! + \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"is-flex is-flex-direction-column\",\n style: {\n \"background-image\":\n \"url(https://www.bing.com/th?id=OHR.Aldeyjarfoss_ZH-CN0106567013_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp)\"\n },\n attrs: { id: \"app\" }\n },\n [\n _c(\"top-bar\"),\n _c(\"div\", { staticClass: \"contents pt-55 pb-6\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\n \"div\",\n { staticClass: \"is-flex\" },\n [\n _c(\"side-bar\"),\n _c(\"div\", { staticClass: \"main-content\" }, [\n _c(\"section\", [_c(\"search-bar\")], 1),\n _c(\"section\", [_c(\"suggestion\")], 1),\n _c(\"section\", [_c(\"apps\")], 1)\n ])\n ],\n 1\n )\n ])\n ]),\n _c(\"brand-bar\"),\n _c(\"contact-bar\")\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/App.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/assets/widgets/Clock.vue?vue&type=template&id=6123455b&": +/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/assets/widgets/Clock.vue?vue&type=template&id=6123455b& ***! + \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"widget has-text-white clock\" }, [\n _c(\"div\", { staticClass: \"time\" }, [_vm._v(_vm._s(_vm.timeText))]),\n _c(\"div\", { staticClass: \"data\" }, [_vm._v(_vm._s(_vm.dateText))])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/assets/widgets/Clock.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Apps.vue?vue&type=template&id=1cbdeda2&": +/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Apps.vue?vue&type=template&id=1cbdeda2& ***! + \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"has-text-left mt-6\" }, [\n _c(\"div\", { staticClass: \"title-bar is-flex is-align-items-center\" }, [\n _c(\"h1\", { staticClass: \"title is-4 has-text-white is-flex-shrink-1\" }, [\n _vm._v(\"Apps\")\n ]),\n _c(\n \"div\",\n { staticClass: \"buttons \" },\n [\n _c(\n \"b-button\",\n {\n attrs: {\n \"icon-left\": \"plus\",\n type: \"is-dark\",\n size: \"is-small\",\n rounded: \"\"\n },\n on: { click: _vm.showInstall }\n },\n [_vm._v(\"New App\")]\n )\n ],\n 1\n )\n ]),\n _c(\n \"div\",\n { staticClass: \"columns is-variable is-2 is-multiline \" },\n _vm._l(_vm.appList, function(item, index) {\n return _c(\n \"div\",\n { key: \"app-\" + index, staticClass: \"column is-narrow is-3\" },\n [\n _c(\"app-card\", {\n attrs: { item: item },\n on: { updateState: _vm.getList, configApp: _vm.showConfigPanel }\n })\n ],\n 1\n )\n }),\n 0\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Apps.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Apps/AppCard.vue?vue&type=template&id=0ef4e844&": +/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Apps/AppCard.vue?vue&type=template&id=0ef4e844& ***! + \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass:\n \"wuji-card is-flex is-align-items-center is-justify-content-center p-55 app-card\",\n on: {\n mouseover: function($event) {\n _vm.hover = true\n },\n mouseleave: function($event) {\n _vm.hover = false\n }\n }\n },\n [\n _c(\n \"div\",\n { staticClass: \"action-btn\" },\n [\n _c(\n \"b-dropdown\",\n {\n ref: \"dro\",\n staticClass: \"ii\",\n attrs: { \"aria-role\": \"list\", position: \"is-bottom-left\" },\n on: { \"active-change\": _vm.setDropState },\n scopedSlots: _vm._u([\n {\n key: \"trigger\",\n fn: function() {\n return [\n _c(\n \"p\",\n { attrs: { role: \"button\" } },\n [\n _c(\"b-icon\", {\n attrs: {\n pack: \"fas\",\n icon: \"ellipsis-v\",\n size: \"is-small\"\n }\n })\n ],\n 1\n )\n ]\n },\n proxy: true\n }\n ])\n },\n [\n _c(\n \"b-dropdown-item\",\n {\n attrs: {\n \"aria-role\": \"menu-item\",\n focusable: false,\n custom: \"\",\n paddingless: \"\"\n }\n },\n [\n _c(\n \"b-button\",\n {\n attrs: {\n type: \"is-text\",\n tag: \"a\",\n target:\n _vm.item.state == \"running\" ? \"_blank\" : \"_self\",\n href:\n _vm.item.state == \"running\"\n ? _vm.siteUrl(_vm.item.port, _vm.item.index)\n : \"javascript:void(0)\",\n expanded: \"\"\n }\n },\n [_vm._v(\"Open\")]\n ),\n _c(\n \"b-button\",\n {\n attrs: { type: \"is-text\", expanded: \"\" },\n on: { click: _vm.configApp }\n },\n [_vm._v(\"Setting\")]\n ),\n _c(\n \"b-button\",\n {\n attrs: {\n type: \"is-text\",\n expanded: \"\",\n loading: _vm.isUninstalling\n },\n on: { click: _vm.uninstallConfirm }\n },\n [_vm._v(\"Unistall\")]\n ),\n _c(\"div\", { staticClass: \"columns is-gapless bbor\" }, [\n _c(\n \"div\",\n {\n staticClass:\n \"column is-flex is-justify-content-center is-align-items-center\"\n },\n [\n _c(\"b-button\", {\n attrs: {\n \"icon-pack\": \"fas\",\n \"icon-left\": \"sync\",\n type: \"is-text\",\n expanded: \"\",\n loading: _vm.isRestarting\n },\n on: { click: _vm.restartApp }\n })\n ],\n 1\n ),\n _c(\n \"div\",\n {\n staticClass:\n \"column is-flex is-justify-content-center is-align-items-center\"\n },\n [\n _c(\"b-button\", {\n class: _vm.item.state,\n attrs: {\n \"icon-pack\": \"fas\",\n \"icon-left\": \"power-off\",\n type: \"is-text\",\n expanded: \"\",\n loading: _vm.isStarting\n },\n on: {\n click: function($event) {\n return _vm.toggle(_vm.item)\n }\n }\n })\n ],\n 1\n )\n ])\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"div\",\n {\n staticClass:\n \"has-text-centered is-flex is-justify-content-center is-flex-direction-column pt-3 pb-3\"\n },\n [\n _c(\n \"a\",\n {\n staticClass: \"is-flex is-justify-content-center\",\n attrs: {\n target: _vm.item.state == \"running\" ? \"_blank\" : \"_self\",\n href:\n _vm.item.state == \"running\"\n ? _vm.siteUrl(_vm.item.port, _vm.item.index)\n : \"javascript:void(0)\"\n }\n },\n [\n _c(\"b-image\", {\n staticClass: \"is-72x72\",\n class: _vm._f(\"dotClass\")(_vm.item.state),\n attrs: {\n src: _vm.item.icon,\n \"src-fallback\": __webpack_require__(/*! @/assets/img/default.png */ \"./src/assets/img/default.png\"),\n \"webp-fallback\": \".jpg\"\n }\n })\n ],\n 1\n ),\n _c(\"p\", { staticClass: \"mt-4 one-line\" }, [\n _c(\n \"a\",\n {\n staticClass: \"one-line\",\n attrs: {\n target: _vm.item.state == \"running\" ? \"_blank\" : \"_self\",\n href:\n _vm.item.state == \"running\"\n ? _vm.siteUrl(_vm.item.port, _vm.item.index)\n : \"javascript:void(0)\"\n }\n },\n [_vm._v(\" \" + _vm._s(_vm.item.name) + \" \")]\n )\n ])\n ]\n ),\n _c(\"b-loading\", {\n attrs: { \"is-full-page\": false, \"can-cancel\": false },\n model: {\n value: _vm.isUninstalling,\n callback: function($$v) {\n _vm.isUninstalling = $$v\n },\n expression: \"isUninstalling\"\n }\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Apps/AppCard.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/BrandBar.vue?vue&type=template&id=dfac1d88&": +/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/BrandBar.vue?vue&type=template&id=dfac1d88& ***! + \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"brand-bar is-flex is-align-items-center has-text-white\" },\n [\n _c(\"figure\", { staticClass: \"image is-32x32\" }, [\n _c(\"img\", { attrs: { src: __webpack_require__(/*! @/assets/img/casa.svg */ \"./src/assets/img/casa.svg\") } })\n ]),\n _c(\"span\", { staticClass: \"is-size-4 mr-3 ml-3\" }, [_vm._v(\"CasaOS\")]),\n _c(\"span\", [_vm._v(\"Made by IceWhale with ❤ and you !️\")])\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/BrandBar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/ContactBar.vue?vue&type=template&id=f34e36fa&": +/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/ContactBar.vue?vue&type=template&id=f34e36fa& ***! + \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass:\n \"contact-bar is-flex is-align-items-center has-text-white pl-3 pr-3\"\n },\n [\n _c(\n \"a\",\n { attrs: { href: \"#\" } },\n [_c(\"b-icon\", { attrs: { pack: \"fas\", icon: \"map-signs\", size: \"\" } })],\n 1\n ),\n _c(\n \"a\",\n { attrs: { href: \"https://discord.gg/Gx4BCEtHjx\", target: \"_blank\" } },\n [_c(\"b-icon\", { attrs: { pack: \"fab\", icon: \"discord\", size: \"\" } })],\n 1\n ),\n _c(\n \"a\",\n {\n attrs: {\n href: \"https://github.com/ZimaBoard/CasaOS\",\n target: \"_blank\"\n }\n },\n [_c(\"b-icon\", { attrs: { pack: \"fab\", icon: \"github\", size: \"\" } })],\n 1\n )\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/ContactBar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Panel.vue?vue&type=template&id=d32d57f8&": +/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Panel.vue?vue&type=template&id=d32d57f8& ***! + \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-card\" }, [\n _c(\n \"header\",\n { staticClass: \"modal-card-head\" },\n [\n _vm._m(0),\n _vm.currentSlide == 1 && _vm.state == \"install\"\n ? _c(\n \"b-button\",\n {\n attrs: {\n \"icon-left\": \"file-import\",\n type: \"is-dark\",\n size: \"is-small\",\n rounded: \"\"\n },\n on: { click: _vm.showImportPanel }\n },\n [_vm._v(\"Import\")]\n )\n : _vm._e()\n ],\n 1\n ),\n _c(\"section\", { staticClass: \"modal-card-body\" }, [\n _c(\n \"section\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.currentSlide == 1,\n expression: \"currentSlide == 1\"\n }\n ]\n },\n [\n _c(\n \"ValidationObserver\",\n { ref: \"ob1\" },\n [\n _c(\"ValidationProvider\", {\n attrs: { rules: \"required\", name: \"Image\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n attrs: {\n label: \"Docker Image *\",\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: errors\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n placeholder: \"e.g.,hello-world:latest\",\n readonly: _vm.state == \"update\"\n },\n model: {\n value: _vm.initData.image,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"image\", $$v)\n },\n expression: \"initData.image\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ])\n }),\n _c(\"ValidationProvider\", {\n attrs: { rules: \"required\", name: \"Name\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(ref) {\n var errors = ref.errors\n var valid = ref.valid\n return [\n _c(\n \"b-field\",\n {\n attrs: {\n label: \"App name *\",\n type: {\n \"is-danger\": errors[0],\n \"is-success\": valid\n },\n message: errors\n }\n },\n [\n _c(\"b-input\", {\n attrs: {\n value: \"\",\n placeholder: \"Your custom App Name\"\n },\n model: {\n value: _vm.initData.label,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"label\", $$v)\n },\n expression: \"initData.label\"\n }\n })\n ],\n 1\n )\n ]\n }\n }\n ])\n }),\n _c(\n \"b-field\",\n { attrs: { label: \"Icon URL\" } },\n [\n _c(\"b-input\", {\n attrs: { value: \"\", placeholder: \"Your custom icon URL\" },\n model: {\n value: _vm.initData.icon,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"icon\", $$v)\n },\n expression: \"initData.icon\"\n }\n })\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"Web UI\" } },\n [\n _c(\"p\", { staticClass: \"control\" }, [\n _c(\"span\", { staticClass: \"button is-static\" }, [\n _vm._v(_vm._s(_vm.baseUrl))\n ])\n ]),\n _c(\"b-input\", {\n attrs: { placeholder: \"8080/web/index.html\", expanded: \"\" },\n model: {\n value: _vm.webui,\n callback: function($$v) {\n _vm.webui = $$v\n },\n expression: \"webui\"\n }\n })\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"Network\" } },\n [\n _c(\n \"b-select\",\n {\n attrs: { placeholder: \"Select\", expanded: \"\" },\n model: {\n value: _vm.initData.network_model,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"network_model\", $$v)\n },\n expression: \"initData.network_model\"\n }\n },\n _vm._l(_vm.networks, function(net) {\n return _c(\n \"optgroup\",\n { key: net.driver, attrs: { label: net.driver } },\n _vm._l(net.networks, function(option, index) {\n return _c(\n \"option\",\n {\n key: option.name + index,\n domProps: { value: option.id }\n },\n [_vm._v(\" \" + _vm._s(option.name) + \" \")]\n )\n }),\n 0\n )\n }),\n 0\n )\n ],\n 1\n ),\n _vm.showPorts\n ? _c(\"ports\", {\n attrs: { showHostPost: _vm.showHostPort },\n model: {\n value: _vm.initData.ports,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"ports\", $$v)\n },\n expression: \"initData.ports\"\n }\n })\n : _vm._e(),\n _c(\"input-group\", {\n attrs: {\n label: \"Data Volumes\",\n message: \"No App Data Volumes now, Click “+” to add one.\"\n },\n model: {\n value: _vm.initData.volumes,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"volumes\", $$v)\n },\n expression: \"initData.volumes\"\n }\n }),\n _c(\"input-group\", {\n attrs: {\n label: \"Environment Variables\",\n message:\n \"No environment variables now, Click “+” to add one.\",\n name1: \"Key\",\n name2: \"Value\"\n },\n model: {\n value: _vm.initData.envs,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"envs\", $$v)\n },\n expression: \"initData.envs\"\n }\n }),\n _c(\"input-group\", {\n attrs: {\n label: \"Devices\",\n message: \"No devices now, Click “+” to add one.\"\n },\n model: {\n value: _vm.initData.devices,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"devices\", $$v)\n },\n expression: \"initData.devices\"\n }\n }),\n _c(\n \"b-field\",\n { attrs: { label: \"Memory Limit\" } },\n [\n _c(\"vue-slider\", {\n attrs: { min: 256, max: _vm.totalMemory },\n model: {\n value: _vm.initData.memory,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"memory\", $$v)\n },\n expression: \"initData.memory\"\n }\n })\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"CPU Shares\" } },\n [\n _c(\n \"b-select\",\n {\n attrs: { placeholder: \"Select\", expanded: \"\" },\n model: {\n value: _vm.initData.cpu_shares,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"cpu_shares\", $$v)\n },\n expression: \"initData.cpu_shares\"\n }\n },\n [\n _c(\"option\", { attrs: { value: \"10\" } }, [_vm._v(\"Low\")]),\n _c(\"option\", { attrs: { value: \"50\" } }, [\n _vm._v(\"Medium\")\n ]),\n _c(\"option\", { attrs: { value: \"90\" } }, [_vm._v(\"High\")])\n ]\n )\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"Restart Policy\" } },\n [\n _c(\n \"b-select\",\n {\n attrs: { placeholder: \"Select\", expanded: \"\" },\n model: {\n value: _vm.initData.restart,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"restart\", $$v)\n },\n expression: \"initData.restart\"\n }\n },\n [\n _c(\"option\", { attrs: { value: \"on-failure\" } }, [\n _vm._v(\"on-failure\")\n ]),\n _c(\"option\", { attrs: { value: \"always\" } }, [\n _vm._v(\"always\")\n ]),\n _c(\"option\", { attrs: { value: \"unless-stopped\" } }, [\n _vm._v(\"unless-stopped\")\n ])\n ]\n )\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"App Description\" } },\n [\n _c(\"b-input\", {\n model: {\n value: _vm.initData.description,\n callback: function($$v) {\n _vm.$set(_vm.initData, \"description\", $$v)\n },\n expression: \"initData.description\"\n }\n })\n ],\n 1\n ),\n _c(\"b-loading\", {\n attrs: { \"is-full-page\": false, \"can-cancel\": false },\n model: {\n value: _vm.isLoading,\n callback: function($$v) {\n _vm.isLoading = $$v\n },\n expression: \"isLoading\"\n }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"section\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.currentSlide == 2,\n expression: \"currentSlide == 2\"\n }\n ]\n },\n [\n _c(\n \"div\",\n { staticClass: \"installing-warpper\" },\n [\n _c(\"lottie-animation\", {\n attrs: {\n path: \"./ui/img/ani/rocket-launching.json\",\n autoPlay: true,\n width: 200,\n height: 200\n }\n }),\n _c(\"h3\", {\n staticClass: \"title is-6 has-text-centered\",\n class: {\n \"has-text-danger\": _vm.errorType == 3,\n \"has-text-black\": _vm.errorType != 3\n },\n domProps: { innerHTML: _vm._s(_vm.installText) }\n })\n ],\n 1\n )\n ]\n )\n ]),\n _c(\n \"footer\",\n { staticClass: \"modal-card-foot is-flex is-align-items-center\" },\n [\n _c(\"div\", { staticClass: \"flex1\" }),\n _c(\n \"div\",\n [\n _vm.currentSlide == 1\n ? _c(\"b-button\", {\n attrs: { label: _vm.cancelButtonText, rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.$emit(\"close\")\n }\n }\n })\n : _vm._e(),\n _vm.currentSlide == 2 && _vm.errorType == 3\n ? _c(\"b-button\", {\n attrs: { label: \"Back\", rounded: \"\" },\n on: { click: _vm.prevStep }\n })\n : _vm._e(),\n _vm.currentSlide == 1 && _vm.state == \"install\"\n ? _c(\"b-button\", {\n attrs: { label: \"Install\", type: \"is-dark\", rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.installApp()\n }\n }\n })\n : _vm._e(),\n _vm.currentSlide == 1 && _vm.state == \"update\"\n ? _c(\"b-button\", {\n attrs: { label: \"Update\", type: \"is-dark\", rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.updateApp()\n }\n }\n })\n : _vm._e(),\n _vm.currentSlide == 2\n ? _c(\"b-button\", {\n attrs: {\n label: _vm.cancelButtonText,\n type: \"is-dark\",\n rounded: \"\"\n },\n on: {\n click: function($event) {\n return _vm.$emit(\"close\")\n }\n }\n })\n : _vm._e()\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"flex1\" }, [\n _c(\"h3\", { staticClass: \"title is-4 has-text-weight-normal\" }, [\n _vm._v(\"Create a new App manually\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Panel.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/SearchBar.vue?vue&type=template&id=0eca37cb&": +/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/SearchBar.vue?vue&type=template&id=0eca37cb& ***! + \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"b-field\",\n {\n staticClass: \"search-bar has-text-white\",\n attrs: { position: \"is-centered \" }\n },\n [\n _c(\"b-input\", {\n class: [\"ovh\", _vm.isFocus ? \"fo\" : \"\"],\n attrs: {\n placeholder: \"Google Search...\",\n icon: \"magnify\",\n \"icon-right\": \"magnify\",\n \"icon-right-clickable\": \"\",\n size: \"is-large\",\n expanded: \"\"\n },\n on: {\n \"icon-right-click\": _vm.gotoSearch,\n focus: _vm.onFocus,\n blur: _vm.onBlur\n },\n nativeOn: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.gotoSearch.apply(null, arguments)\n }\n },\n model: {\n value: _vm.keyText,\n callback: function($$v) {\n _vm.keyText = $$v\n },\n expression: \"keyText\"\n }\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/SearchBar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/SideBar.vue?vue&type=template&id=3eca7188&": +/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/SideBar.vue?vue&type=template&id=3eca7188& ***! + \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"side-bar mr-5\" }, [_c(\"clock\")], 1)\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/SideBar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/Suggestion.vue?vue&type=template&id=9c0b7b98&": +/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Suggestion.vue?vue&type=template&id=9c0b7b98& ***! + \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"has-text-left \" }, [\n _c(\"h1\", { staticClass: \"title is-4 mt-6 has-text-white\" }, [\n _vm._v(\"Suggestions\")\n ]),\n _c(\n \"div\",\n { staticClass: \"columns is-variable is-2 is-multiline\" },\n _vm._l(_vm.list, function(item, index) {\n return _c(\n \"div\",\n { key: \"ss\" + index, staticClass: \"column is-one-third\" },\n [\n _c(\"a\", { attrs: { href: item.url, target: \"_blank\" } }, [\n _c(\n \"div\",\n { staticClass: \"wuji-card is-flex is-align-items-center\" },\n [\n _c(\"div\", { staticClass: \"info \" }, [\n _c(\"div\", { staticClass: \"two-line \" }, [\n _vm._v(\" \" + _vm._s(item.title) + \" \")\n ]),\n _c(\"div\", { staticClass: \"des two-line\" }, [\n _vm._v(\" \" + _vm._s(item.content) + \" \")\n ])\n ]),\n _c(\"figure\", { staticClass: \"image is-48x48 simg is-flex\" }, [\n _c(\"img\", { attrs: { src: item.image_url } })\n ])\n ]\n )\n ])\n ]\n )\n }),\n 0\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Suggestion.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/TopBar.vue?vue&type=template&id=ae7504a4&": +/*!***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/TopBar.vue?vue&type=template&id=ae7504a4& ***! + \***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"navbar top-bar is-flex is-align-items-center\" },\n [\n _c(\n \"div\",\n { staticClass: \"navbar-brand ml-3\" },\n [\n _c(\n \"b-dropdown\",\n {\n staticClass: \"navbar-item\",\n attrs: { \"aria-role\": \"list\" },\n on: { \"active-change\": _vm.onOpen },\n scopedSlots: _vm._u([\n {\n key: \"trigger\",\n fn: function() {\n return [\n _c(\n \"p\",\n { attrs: { role: \"button\" } },\n [\n _c(\"b-icon\", {\n attrs: { pack: \"fas\", icon: \"sliders-h\" }\n })\n ],\n 1\n )\n ]\n },\n proxy: true\n }\n ])\n },\n [\n _c(\n \"b-dropdown-item\",\n {\n attrs: {\n \"aria-role\": \"menu-item\",\n focusable: false,\n custom: \"\"\n }\n },\n [\n _c(\"h2\", { staticClass: \"title is-4\" }, [\n _vm._v(\"CasaOS Setting\")\n ]),\n _c(\n \"div\",\n { staticClass: \"is-flex is-align-items-center item\" },\n [\n _c(\n \"div\",\n { staticClass: \"is-flex is-align-items-center flex1\" },\n [\n _c(\"b-icon\", {\n staticClass: \"mr-1\",\n attrs: { pack: \"fas\", icon: \"sync-alt\" }\n }),\n _vm._v(\" \"),\n _c(\"b\", [_vm._v(\"Update\")])\n ],\n 1\n ),\n _c(\"div\", [\n _vm._v(\n \" v\" + _vm._s(_vm.updateInfo.current_version) + \" \"\n )\n ])\n ]\n ),\n !_vm.updateInfo.is_need\n ? _c(\n \"div\",\n { staticClass: \"is-flex is-align-items-center pl-5\" },\n [\n _vm._v(\" \" + _vm._s(_vm.latestText) + \" \"),\n _c(\"b-icon\", {\n staticClass: \"ml-1\",\n attrs: {\n type: \"is-success\",\n pack: \"fas\",\n icon: \"check\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _vm.updateInfo.is_need\n ? _c(\n \"div\",\n {\n staticClass:\n \"is-flex is-align-items-center is-justify-content-end update-container pl-5\"\n },\n [\n _c(\"div\", { staticClass: \"flex1\" }, [\n _vm._v(_vm._s(_vm.updateText))\n ]),\n _c(\n \"b-button\",\n {\n staticClass: \"ml-2\",\n attrs: {\n type: \"is-dark\",\n size: \"is-small\",\n loading: _vm.isUpdating,\n rounded: \"\"\n },\n on: { click: _vm.updateSystem }\n },\n [_vm._v(\"Update\")]\n )\n ],\n 1\n )\n : _vm._e()\n ]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _vm._m(0)\n ]\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"navbar-menu\" }, [\n _c(\"div\", { staticClass: \"navbar-end mr-3\" })\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/TopBar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/ImportPanel.vue?vue&type=template&id=03d0dfff&": +/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/ImportPanel.vue?vue&type=template&id=03d0dfff& ***! + \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-card\" }, [\n _vm._m(0),\n _c(\n \"section\",\n { staticClass: \"modal-card-body\" },\n [\n _c(\n \"b-field\",\n {\n attrs: {\n label: \"Command Line\",\n type: { \"is-danger\": _vm.parseError },\n message: _vm.errors\n }\n },\n [\n _c(\"b-input\", {\n staticClass: \"import-area\",\n attrs: { maxlength: \"800\", type: \"textarea\" },\n model: {\n value: _vm.dockerCliCommands,\n callback: function($$v) {\n _vm.dockerCliCommands = $$v\n },\n expression: \"dockerCliCommands\"\n }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"footer\",\n { staticClass: \"modal-card-foot is-flex is-align-items-center\" },\n [\n _c(\"div\", { staticClass: \"flex1\" }),\n _c(\n \"div\",\n [\n _c(\"b-button\", {\n attrs: { label: \"Cancel\", rounded: \"\" },\n on: {\n click: function($event) {\n return _vm.$emit(\"close\")\n }\n }\n }),\n _c(\"b-button\", {\n attrs: { label: \"Sumbit\", type: \"is-dark\", rounded: \"\" },\n on: { click: _vm.emitSubmit }\n })\n ],\n 1\n )\n ]\n )\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"header\", { staticClass: \"modal-card-head\" }, [\n _c(\"div\", { staticClass: \"flex1\" }, [\n _c(\"h3\", { staticClass: \"title is-4 has-text-weight-normal\" }, [\n _vm._v(\"Import From Docker CLI\")\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/forms/ImportPanel.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/InputGroup.vue?vue&type=template&id=22835c65&": +/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/InputGroup.vue?vue&type=template&id=22835c65& ***! + \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"mb-5\" },\n [\n _c(\n \"div\",\n { staticClass: \"field is-flex is-align-items-center mb-2\" },\n [\n _c(\"label\", { staticClass: \"label mb-0 flex1\" }, [\n _vm._v(_vm._s(_vm.label))\n ]),\n _c(\n \"b-button\",\n {\n attrs: {\n \"icon-left\": \"plus\",\n type: \"is-dark\",\n size: \"is-small\",\n rounded: \"\"\n },\n on: { click: _vm.addItem }\n },\n [_vm._v(\"Add\")]\n )\n ],\n 1\n ),\n _vm.vdata.length == 0\n ? _c(\n \"div\",\n { staticClass: \"is-flex is-align-items-center mb-5 info\" },\n [\n _c(\"b-icon\", {\n staticClass: \"mr-2 \",\n attrs: { pack: \"fas\", icon: \"info-circle\", size: \"is-small\" }\n }),\n _c(\"span\", [_vm._v(\" \" + _vm._s(_vm.message) + \" \")])\n ],\n 1\n )\n : _vm._e(),\n _vm._l(_vm.vdata, function(item, index) {\n return _c(\n \"div\",\n { key: \"port\" + index, staticClass: \"port-item\" },\n [\n _c(\"b-icon\", {\n staticClass: \"is-clickable\",\n attrs: { pack: \"fas\", icon: \"times\", size: \"is-small\" },\n nativeOn: {\n click: function($event) {\n return _vm.removeItem(index)\n }\n }\n }),\n index < 1\n ? [\n _c(\n \"b-field\",\n { attrs: { grouped: \"\" } },\n [\n _c(\n \"b-field\",\n { attrs: { label: _vm.name1, expanded: \"\" } },\n [\n _c(\"b-input\", {\n attrs: { placeholder: _vm.name1, expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.container,\n callback: function($$v) {\n _vm.$set(item, \"container\", $$v)\n },\n expression: \"item.container\"\n }\n })\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: _vm.name2, expanded: \"\" } },\n [\n _c(\"b-input\", {\n attrs: { placeholder: _vm.name2, expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.host,\n callback: function($$v) {\n _vm.$set(item, \"host\", $$v)\n },\n expression: \"item.host\"\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ]\n : [\n _c(\n \"b-field\",\n { attrs: { grouped: \"\" } },\n [\n _c(\"b-input\", {\n attrs: { placeholder: _vm.name1, expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.container,\n callback: function($$v) {\n _vm.$set(item, \"container\", $$v)\n },\n expression: \"item.container\"\n }\n }),\n _c(\"b-input\", {\n attrs: { placeholder: _vm.name2, expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.host,\n callback: function($$v) {\n _vm.$set(item, \"host\", $$v)\n },\n expression: \"item.host\"\n }\n })\n ],\n 1\n )\n ]\n ],\n 2\n )\n })\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/forms/InputGroup.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"0f71303c-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/Ports.vue?vue&type=template&id=431c319c&": +/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"0f71303c-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/Ports.vue?vue&type=template&id=431c319c& ***! + \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"mb-5\" },\n [\n _c(\n \"div\",\n { staticClass: \"field is-flex is-align-items-center mb-2\" },\n [\n _c(\"label\", { staticClass: \"label mb-0 flex1\" }, [_vm._v(\"Ports\")]),\n _c(\n \"b-button\",\n {\n attrs: {\n \"icon-left\": \"plus\",\n type: \"is-dark\",\n size: \"is-small\",\n rounded: \"\"\n },\n on: { click: _vm.addItem }\n },\n [_vm._v(\"Add\")]\n )\n ],\n 1\n ),\n _vm.vdata.length == 0\n ? _c(\n \"div\",\n { staticClass: \"is-flex is-align-items-center mb-5 info\" },\n [\n _c(\"b-icon\", {\n staticClass: \"mr-2 \",\n attrs: { pack: \"fas\", icon: \"info-circle\", size: \"is-small\" }\n }),\n _c(\"span\", [_vm._v(\" No App Ports now, Click “+” to add one. \")])\n ],\n 1\n )\n : _vm._e(),\n _vm._l(_vm.vdata, function(item, index) {\n return _c(\n \"div\",\n { key: \"port\" + index, staticClass: \"port-item\" },\n [\n _c(\"b-icon\", {\n staticClass: \"is-clickable\",\n attrs: { pack: \"fas\", icon: \"times\", size: \"is-small\" },\n nativeOn: {\n click: function($event) {\n return _vm.removeItem(index)\n }\n }\n }),\n index < 1\n ? [\n _c(\n \"b-field\",\n { attrs: { grouped: \"\" } },\n [\n _c(\n \"b-field\",\n { attrs: { label: \"Container\", expanded: \"\" } },\n [\n _c(\"b-input\", {\n attrs: {\n placeholder: \"Container\",\n type: \"number\",\n expanded: \"\"\n },\n on: { input: _vm.handleInput },\n model: {\n value: item.container,\n callback: function($$v) {\n _vm.$set(item, \"container\", $$v)\n },\n expression: \"item.container\"\n }\n })\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"Host\", expanded: \"\" } },\n [\n _vm.showHostPost\n ? _c(\"b-input\", {\n attrs: {\n placeholder: \"Host\",\n type: \"number\",\n expanded: \"\"\n },\n on: { input: _vm.handleInput },\n model: {\n value: item.host,\n callback: function($$v) {\n _vm.$set(item, \"host\", $$v)\n },\n expression: \"item.host\"\n }\n })\n : _vm._e()\n ],\n 1\n ),\n _c(\n \"b-field\",\n { attrs: { label: \"Protocol\", expanded: \"\" } },\n [\n _c(\n \"b-select\",\n {\n attrs: { placeholder: \"Protocol\", expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.protocol,\n callback: function($$v) {\n _vm.$set(item, \"protocol\", $$v)\n },\n expression: \"item.protocol\"\n }\n },\n [\n _c(\"option\", { attrs: { value: \"tcp\" } }, [\n _vm._v(\"TCP\")\n ]),\n _c(\"option\", { attrs: { value: \"udp\" } }, [\n _vm._v(\"UDP\")\n ]),\n _c(\"option\", { attrs: { value: \"both\" } }, [\n _vm._v(\"TCP + UDP\")\n ])\n ]\n )\n ],\n 1\n )\n ],\n 1\n )\n ]\n : [\n _c(\n \"b-field\",\n { attrs: { grouped: \"\" } },\n [\n _c(\"b-input\", {\n attrs: {\n placeholder: \"Container\",\n type: \"number\",\n expanded: \"\"\n },\n on: { input: _vm.handleInput },\n model: {\n value: item.container,\n callback: function($$v) {\n _vm.$set(item, \"container\", $$v)\n },\n expression: \"item.container\"\n }\n }),\n _vm.showHostPost\n ? _c(\"b-input\", {\n attrs: {\n placeholder: \"Host\",\n type: \"number\",\n expanded: \"\"\n },\n on: { input: _vm.handleInput },\n model: {\n value: item.host,\n callback: function($$v) {\n _vm.$set(item, \"host\", $$v)\n },\n expression: \"item.host\"\n }\n })\n : _vm._e(),\n _c(\n \"b-select\",\n {\n attrs: { placeholder: \"Protocol\", expanded: \"\" },\n on: { input: _vm.handleInput },\n model: {\n value: item.protocol,\n callback: function($$v) {\n _vm.$set(item, \"protocol\", $$v)\n },\n expression: \"item.protocol\"\n }\n },\n [\n _c(\"option\", { attrs: { value: \"tcp\" } }, [\n _vm._v(\"TCP\")\n ]),\n _c(\"option\", { attrs: { value: \"udp\" } }, [\n _vm._v(\"UDP\")\n ]),\n _c(\"option\", { attrs: { value: \"both\" } }, [\n _vm._v(\"TCP + UDP\")\n ])\n ]\n )\n ],\n 1\n )\n ]\n ],\n 2\n )\n })\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/forms/Ports.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%220f71303c-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./src/assets/scss/app.scss": +/*!*******************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-3-1!./node_modules/postcss-loader/src??ref--8-oneOf-3-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-3-3!./src/assets/scss/app.scss ***! + \*******************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\nexports.push([module.i, \"@import url(https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;1,100;1,300;1,400;1,500;1,700&display=swap);\"]);\n// Module\nexports.push([module.i, \"/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */\\n/* Bulma Utilities */\\n.button, .input, .textarea, .taginput .taginput-container.is-focusable, .select select, .file-cta,\\n.file-name, .pagination-previous,\\n.pagination-next,\\n.pagination-link,\\n.pagination-ellipsis {\\n -moz-appearance: none;\\n -webkit-appearance: none;\\n align-items: center;\\n border: 1px solid transparent;\\n border-radius: 4px;\\n box-shadow: none;\\n display: inline-flex;\\n font-size: 1rem;\\n height: 2.5em;\\n justify-content: flex-start;\\n line-height: 1.5;\\n padding-bottom: calc(0.5em - 1px);\\n padding-left: calc(0.75em - 1px);\\n padding-right: calc(0.75em - 1px);\\n padding-top: calc(0.5em - 1px);\\n position: relative;\\n vertical-align: top; }\\n .button:focus, .input:focus, .textarea:focus, .taginput .taginput-container.is-focusable:focus, .select select:focus, .file-cta:focus,\\n .file-name:focus, .pagination-previous:focus,\\n .pagination-next:focus,\\n .pagination-link:focus,\\n .pagination-ellipsis:focus, .is-focused.button, .is-focused.input, .is-focused.textarea, .taginput .is-focused.taginput-container.is-focusable, .select select.is-focused, .is-focused.file-cta,\\n .is-focused.file-name, .is-focused.pagination-previous,\\n .is-focused.pagination-next,\\n .is-focused.pagination-link,\\n .is-focused.pagination-ellipsis, .button:active, .input:active, .textarea:active, .taginput .taginput-container.is-focusable:active, .select select:active, .file-cta:active,\\n .file-name:active, .pagination-previous:active,\\n .pagination-next:active,\\n .pagination-link:active,\\n .pagination-ellipsis:active, .is-active.button, .is-active.input, .is-active.textarea, .taginput .is-active.taginput-container.is-focusable, .select select.is-active, .is-active.file-cta,\\n .is-active.file-name, .is-active.pagination-previous,\\n .is-active.pagination-next,\\n .is-active.pagination-link,\\n .is-active.pagination-ellipsis {\\n outline: none; }\\n .button[disabled], .input[disabled], .textarea[disabled], .taginput .taginput-container.is-focusable[disabled], .select select[disabled], .file-cta[disabled],\\n .file-name[disabled], .pagination-previous[disabled],\\n .pagination-next[disabled],\\n .pagination-link[disabled],\\n .pagination-ellipsis[disabled],\\n fieldset[disabled] .button,\\n fieldset[disabled] .input,\\n fieldset[disabled] .textarea,\\n fieldset[disabled] .taginput .taginput-container.is-focusable,\\n .taginput fieldset[disabled] .taginput-container.is-focusable,\\n fieldset[disabled] .select select,\\n .select fieldset[disabled] select,\\n fieldset[disabled] .file-cta,\\n fieldset[disabled] .file-name,\\n fieldset[disabled] .pagination-previous,\\n fieldset[disabled] .pagination-next,\\n fieldset[disabled] .pagination-link,\\n fieldset[disabled] .pagination-ellipsis {\\n cursor: not-allowed; }\\n\\n.button, .file, .breadcrumb, .pagination-previous,\\n.pagination-next,\\n.pagination-link,\\n.pagination-ellipsis, .tabs, .is-unselectable, .carousel, .carousel-list, .b-checkbox.checkbox, .b-radio.radio, .switch {\\n -webkit-touch-callout: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none; }\\n\\n.select:not(.is-multiple):not(.is-loading)::after, .navbar-link:not(.is-arrowless)::after {\\n border: 3px solid transparent;\\n border-radius: 2px;\\n border-right: 0;\\n border-top: 0;\\n content: \\\" \\\";\\n display: block;\\n height: 0.625em;\\n margin-top: -0.4375em;\\n pointer-events: none;\\n position: absolute;\\n top: 50%;\\n transform: rotate(-45deg);\\n transform-origin: center;\\n width: 0.625em; }\\n\\n.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .progress-wrapper.is-not-native:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child),\\n.subtitle:not(:last-child), .block:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .message:not(:last-child), .pagination:not(:last-child), .tabs:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n\\n.delete, .modal-close {\\n -webkit-touch-callout: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n -moz-appearance: none;\\n -webkit-appearance: none;\\n background-color: rgba(10, 10, 10, 0.2);\\n border: none;\\n border-radius: 9999px;\\n cursor: pointer;\\n pointer-events: auto;\\n display: inline-block;\\n flex-grow: 0;\\n flex-shrink: 0;\\n font-size: 0;\\n height: 20px;\\n max-height: 20px;\\n max-width: 20px;\\n min-height: 20px;\\n min-width: 20px;\\n outline: none;\\n position: relative;\\n vertical-align: top;\\n width: 20px; }\\n .delete::before, .modal-close::before, .delete::after, .modal-close::after {\\n background-color: white;\\n content: \\\"\\\";\\n display: block;\\n left: 50%;\\n position: absolute;\\n top: 50%;\\n transform: translateX(-50%) translateY(-50%) rotate(45deg);\\n transform-origin: center center; }\\n .delete::before, .modal-close::before {\\n height: 2px;\\n width: 50%; }\\n .delete::after, .modal-close::after {\\n height: 50%;\\n width: 2px; }\\n .delete:hover, .modal-close:hover, .delete:focus, .modal-close:focus {\\n background-color: rgba(10, 10, 10, 0.3); }\\n .delete:active, .modal-close:active {\\n background-color: rgba(10, 10, 10, 0.4); }\\n .is-small.delete, .is-small.modal-close {\\n height: 16px;\\n max-height: 16px;\\n max-width: 16px;\\n min-height: 16px;\\n min-width: 16px;\\n width: 16px; }\\n .is-medium.delete, .is-medium.modal-close {\\n height: 24px;\\n max-height: 24px;\\n max-width: 24px;\\n min-height: 24px;\\n min-width: 24px;\\n width: 24px; }\\n .is-large.delete, .is-large.modal-close {\\n height: 32px;\\n max-height: 32px;\\n max-width: 32px;\\n min-height: 32px;\\n min-width: 32px;\\n width: 32px; }\\n\\n.button.is-loading::after, .loader, .select.is-loading::after, .control.is-loading::after {\\n -webkit-animation: spinAround 500ms infinite linear;\\n animation: spinAround 500ms infinite linear;\\n border: 2px solid #dbdbdb;\\n border-radius: 9999px;\\n border-right-color: transparent;\\n border-top-color: transparent;\\n content: \\\"\\\";\\n display: block;\\n height: 1em;\\n position: relative;\\n width: 1em; }\\n\\n.image.is-square img,\\n.image.is-square .has-ratio, .image.is-1by1 img,\\n.image.is-1by1 .has-ratio, .image.is-5by4 img,\\n.image.is-5by4 .has-ratio, .image.is-4by3 img,\\n.image.is-4by3 .has-ratio, .image.is-3by2 img,\\n.image.is-3by2 .has-ratio, .image.is-5by3 img,\\n.image.is-5by3 .has-ratio, .image.is-16by9 img,\\n.image.is-16by9 .has-ratio, .image.is-2by1 img,\\n.image.is-2by1 .has-ratio, .image.is-3by1 img,\\n.image.is-3by1 .has-ratio, .image.is-4by5 img,\\n.image.is-4by5 .has-ratio, .image.is-3by4 img,\\n.image.is-3by4 .has-ratio, .image.is-2by3 img,\\n.image.is-2by3 .has-ratio, .image.is-3by5 img,\\n.image.is-3by5 .has-ratio, .image.is-9by16 img,\\n.image.is-9by16 .has-ratio, .image.is-1by2 img,\\n.image.is-1by2 .has-ratio, .image.is-1by3 img,\\n.image.is-1by3 .has-ratio, .modal, .modal-background, .is-overlay, .hero-video, .b-image-wrapper > img.has-ratio, .b-image-wrapper > img.placeholder {\\n bottom: 0;\\n left: 0;\\n position: absolute;\\n right: 0;\\n top: 0; }\\n\\n.navbar-burger {\\n -moz-appearance: none;\\n -webkit-appearance: none;\\n appearance: none;\\n background: none;\\n border: none;\\n color: currentColor;\\n font-family: inherit;\\n font-size: 1em;\\n margin: 0;\\n padding: 0; }\\n\\n/* Bulma Base */\\n/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */\\nhtml,\\nbody,\\np,\\nol,\\nul,\\nli,\\ndl,\\ndt,\\ndd,\\nblockquote,\\nfigure,\\nfieldset,\\nlegend,\\ntextarea,\\npre,\\niframe,\\nhr,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n margin: 0;\\n padding: 0; }\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: 100%;\\n font-weight: normal; }\\n\\nul {\\n list-style: none; }\\n\\nbutton,\\ninput,\\nselect,\\ntextarea {\\n margin: 0; }\\n\\nhtml {\\n box-sizing: border-box; }\\n\\n*, *::before, *::after {\\n box-sizing: inherit; }\\n\\nimg,\\nvideo {\\n height: auto;\\n max-width: 100%; }\\n\\niframe {\\n border: 0; }\\n\\ntable {\\n border-collapse: collapse;\\n border-spacing: 0; }\\n\\ntd,\\nth {\\n padding: 0; }\\n td:not([align]),\\n th:not([align]) {\\n text-align: inherit; }\\n\\nhtml {\\n background-color: white;\\n font-size: 16px;\\n -moz-osx-font-smoothing: grayscale;\\n -webkit-font-smoothing: antialiased;\\n min-width: 300px;\\n overflow-x: hidden;\\n overflow-y: scroll;\\n text-rendering: optimizeLegibility;\\n -webkit-text-size-adjust: 100%;\\n -moz-text-size-adjust: 100%;\\n text-size-adjust: 100%; }\\n\\narticle,\\naside,\\nfigure,\\nfooter,\\nheader,\\nhgroup,\\nsection {\\n display: block; }\\n\\nbody,\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n font-family: BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", \\\"Roboto\\\", \\\"Oxygen\\\", \\\"Ubuntu\\\", \\\"Cantarell\\\", \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", \\\"Helvetica\\\", \\\"Arial\\\", sans-serif; }\\n\\ncode,\\npre {\\n -moz-osx-font-smoothing: auto;\\n -webkit-font-smoothing: auto;\\n font-family: monospace; }\\n\\nbody {\\n color: #4a4a4a;\\n font-size: 1em;\\n font-weight: 400;\\n line-height: 1.5; }\\n\\na {\\n color: #485fc7;\\n cursor: pointer;\\n text-decoration: none; }\\n a strong {\\n color: currentColor; }\\n a:hover {\\n color: #363636; }\\n\\ncode {\\n background-color: whitesmoke;\\n color: #f14668;\\n font-size: 0.875em;\\n font-weight: normal;\\n padding: 0.25em 0.5em 0.25em; }\\n\\nhr {\\n background-color: whitesmoke;\\n border: none;\\n display: block;\\n height: 2px;\\n margin: 1.5rem 0; }\\n\\nimg {\\n height: auto;\\n max-width: 100%; }\\n\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n vertical-align: baseline; }\\n\\nsmall {\\n font-size: 0.875em; }\\n\\nspan {\\n font-style: inherit;\\n font-weight: inherit; }\\n\\nstrong {\\n color: #363636;\\n font-weight: 700; }\\n\\nfieldset {\\n border: none; }\\n\\npre {\\n -webkit-overflow-scrolling: touch;\\n background-color: whitesmoke;\\n color: #4a4a4a;\\n font-size: 0.875em;\\n overflow-x: auto;\\n padding: 1.25rem 1.5rem;\\n white-space: pre;\\n word-wrap: normal; }\\n pre code {\\n background-color: transparent;\\n color: currentColor;\\n font-size: 1em;\\n padding: 0; }\\n\\ntable td,\\ntable th {\\n vertical-align: top; }\\n table td:not([align]),\\n table th:not([align]) {\\n text-align: inherit; }\\n\\ntable th {\\n color: #363636; }\\n\\n@-webkit-keyframes spinAround {\\n from {\\n transform: rotate(0deg); }\\n to {\\n transform: rotate(359deg); } }\\n\\n@keyframes spinAround {\\n from {\\n transform: rotate(0deg); }\\n to {\\n transform: rotate(359deg); } }\\n\\n/* Bulma Elements */\\n.box {\\n background-color: white;\\n border-radius: 6px;\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02);\\n color: #4a4a4a;\\n display: block;\\n padding: 1.25rem; }\\n\\na.box:hover, a.box:focus {\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0 0 1px #485fc7; }\\n\\na.box:active {\\n box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #485fc7; }\\n\\n.button {\\n background-color: white;\\n border-color: #dbdbdb;\\n border-width: 1px;\\n color: #363636;\\n cursor: pointer;\\n justify-content: center;\\n padding-bottom: calc(0.5em - 1px);\\n padding-left: 1em;\\n padding-right: 1em;\\n padding-top: calc(0.5em - 1px);\\n text-align: center;\\n white-space: nowrap; }\\n .button strong {\\n color: inherit; }\\n .button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large {\\n height: 1.5em;\\n width: 1.5em; }\\n .button .icon:first-child:not(:last-child) {\\n margin-left: calc(-0.5em - 1px);\\n margin-right: 0.25em; }\\n .button .icon:last-child:not(:first-child) {\\n margin-left: 0.25em;\\n margin-right: calc(-0.5em - 1px); }\\n .button .icon:first-child:last-child {\\n margin-left: calc(-0.5em - 1px);\\n margin-right: calc(-0.5em - 1px); }\\n .button:hover, .button.is-hovered {\\n border-color: #b5b5b5;\\n color: #363636; }\\n .button:focus, .button.is-focused {\\n border-color: #485fc7;\\n color: #363636; }\\n .button:focus:not(:active), .button.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .button:active, .button.is-active {\\n border-color: #4a4a4a;\\n color: #363636; }\\n .button.is-text {\\n background-color: transparent;\\n border-color: transparent;\\n color: #4a4a4a;\\n text-decoration: underline; }\\n .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused {\\n background-color: whitesmoke;\\n color: #363636; }\\n .button.is-text:active, .button.is-text.is-active {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .button.is-text[disabled],\\n fieldset[disabled] .button.is-text {\\n background-color: transparent;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-ghost {\\n background: none;\\n border-color: transparent;\\n color: #485fc7;\\n text-decoration: none; }\\n .button.is-ghost:hover, .button.is-ghost.is-hovered {\\n color: #485fc7;\\n text-decoration: underline; }\\n .button.is-white {\\n background-color: white;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .button.is-white:hover, .button.is-white.is-hovered {\\n background-color: #f9f9f9;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .button.is-white:focus, .button.is-white.is-focused {\\n border-color: transparent;\\n color: #0a0a0a; }\\n .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }\\n .button.is-white:active, .button.is-white.is-active {\\n background-color: #f2f2f2;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .button.is-white[disabled],\\n fieldset[disabled] .button.is-white {\\n background-color: white;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-white.is-inverted {\\n background-color: #0a0a0a;\\n color: white; }\\n .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered {\\n background-color: black; }\\n .button.is-white.is-inverted[disabled],\\n fieldset[disabled] .button.is-white.is-inverted {\\n background-color: #0a0a0a;\\n border-color: transparent;\\n box-shadow: none;\\n color: white; }\\n .button.is-white.is-loading::after {\\n border-color: transparent transparent #0a0a0a #0a0a0a !important; }\\n .button.is-white.is-outlined {\\n background-color: transparent;\\n border-color: white;\\n color: white; }\\n .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused {\\n background-color: white;\\n border-color: white;\\n color: #0a0a0a; }\\n .button.is-white.is-outlined.is-loading::after {\\n border-color: transparent transparent white white !important; }\\n .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #0a0a0a #0a0a0a !important; }\\n .button.is-white.is-outlined[disabled],\\n fieldset[disabled] .button.is-white.is-outlined {\\n background-color: transparent;\\n border-color: white;\\n box-shadow: none;\\n color: white; }\\n .button.is-white.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #0a0a0a;\\n color: #0a0a0a; }\\n .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused {\\n background-color: #0a0a0a;\\n color: white; }\\n .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent white white !important; }\\n .button.is-white.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-white.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #0a0a0a;\\n box-shadow: none;\\n color: #0a0a0a; }\\n .button.is-black {\\n background-color: #0a0a0a;\\n border-color: transparent;\\n color: white; }\\n .button.is-black:hover, .button.is-black.is-hovered {\\n background-color: #040404;\\n border-color: transparent;\\n color: white; }\\n .button.is-black:focus, .button.is-black.is-focused {\\n border-color: transparent;\\n color: white; }\\n .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }\\n .button.is-black:active, .button.is-black.is-active {\\n background-color: black;\\n border-color: transparent;\\n color: white; }\\n .button.is-black[disabled],\\n fieldset[disabled] .button.is-black {\\n background-color: #0a0a0a;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-black.is-inverted {\\n background-color: white;\\n color: #0a0a0a; }\\n .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-black.is-inverted[disabled],\\n fieldset[disabled] .button.is-black.is-inverted {\\n background-color: white;\\n border-color: transparent;\\n box-shadow: none;\\n color: #0a0a0a; }\\n .button.is-black.is-loading::after {\\n border-color: transparent transparent white white !important; }\\n .button.is-black.is-outlined {\\n background-color: transparent;\\n border-color: #0a0a0a;\\n color: #0a0a0a; }\\n .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused {\\n background-color: #0a0a0a;\\n border-color: #0a0a0a;\\n color: white; }\\n .button.is-black.is-outlined.is-loading::after {\\n border-color: transparent transparent #0a0a0a #0a0a0a !important; }\\n .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent white white !important; }\\n .button.is-black.is-outlined[disabled],\\n fieldset[disabled] .button.is-black.is-outlined {\\n background-color: transparent;\\n border-color: #0a0a0a;\\n box-shadow: none;\\n color: #0a0a0a; }\\n .button.is-black.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: white;\\n color: white; }\\n .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused {\\n background-color: white;\\n color: #0a0a0a; }\\n .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #0a0a0a #0a0a0a !important; }\\n .button.is-black.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-black.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: white;\\n box-shadow: none;\\n color: white; }\\n .button.is-light {\\n background-color: whitesmoke;\\n border-color: transparent;\\n color: #363636; }\\n .button.is-light:hover, .button.is-light.is-hovered {\\n background-color: #eeeeee;\\n border-color: transparent;\\n color: #363636; }\\n .button.is-light:focus, .button.is-light.is-focused {\\n border-color: transparent;\\n color: #363636; }\\n .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }\\n .button.is-light:active, .button.is-light.is-active {\\n background-color: #e8e8e8;\\n border-color: transparent;\\n color: #363636; }\\n .button.is-light[disabled],\\n fieldset[disabled] .button.is-light {\\n background-color: whitesmoke;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-light.is-inverted {\\n background-color: #363636;\\n color: whitesmoke; }\\n .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered {\\n background-color: #292929; }\\n .button.is-light.is-inverted[disabled],\\n fieldset[disabled] .button.is-light.is-inverted {\\n background-color: #363636;\\n border-color: transparent;\\n box-shadow: none;\\n color: whitesmoke; }\\n .button.is-light.is-loading::after {\\n border-color: transparent transparent #363636 #363636 !important; }\\n .button.is-light.is-outlined {\\n background-color: transparent;\\n border-color: whitesmoke;\\n color: whitesmoke; }\\n .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused {\\n background-color: whitesmoke;\\n border-color: whitesmoke;\\n color: #363636; }\\n .button.is-light.is-outlined.is-loading::after {\\n border-color: transparent transparent whitesmoke whitesmoke !important; }\\n .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #363636 #363636 !important; }\\n .button.is-light.is-outlined[disabled],\\n fieldset[disabled] .button.is-light.is-outlined {\\n background-color: transparent;\\n border-color: whitesmoke;\\n box-shadow: none;\\n color: whitesmoke; }\\n .button.is-light.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #363636;\\n color: #363636; }\\n .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused {\\n background-color: #363636;\\n color: whitesmoke; }\\n .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent whitesmoke whitesmoke !important; }\\n .button.is-light.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-light.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #363636;\\n box-shadow: none;\\n color: #363636; }\\n .button.is-dark {\\n background-color: #363636;\\n border-color: transparent;\\n color: whitesmoke; }\\n .button.is-dark:hover, .button.is-dark.is-hovered {\\n background-color: #2f2f2f;\\n border-color: transparent;\\n color: whitesmoke; }\\n .button.is-dark:focus, .button.is-dark.is-focused {\\n border-color: transparent;\\n color: whitesmoke; }\\n .button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }\\n .button.is-dark:active, .button.is-dark.is-active {\\n background-color: #292929;\\n border-color: transparent;\\n color: whitesmoke; }\\n .button.is-dark[disabled],\\n fieldset[disabled] .button.is-dark {\\n background-color: #363636;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-dark.is-inverted {\\n background-color: whitesmoke;\\n color: #363636; }\\n .button.is-dark.is-inverted:hover, .button.is-dark.is-inverted.is-hovered {\\n background-color: #e8e8e8; }\\n .button.is-dark.is-inverted[disabled],\\n fieldset[disabled] .button.is-dark.is-inverted {\\n background-color: whitesmoke;\\n border-color: transparent;\\n box-shadow: none;\\n color: #363636; }\\n .button.is-dark.is-loading::after {\\n border-color: transparent transparent whitesmoke whitesmoke !important; }\\n .button.is-dark.is-outlined {\\n background-color: transparent;\\n border-color: #363636;\\n color: #363636; }\\n .button.is-dark.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .button.is-dark.is-outlined.is-focused {\\n background-color: #363636;\\n border-color: #363636;\\n color: whitesmoke; }\\n .button.is-dark.is-outlined.is-loading::after {\\n border-color: transparent transparent #363636 #363636 !important; }\\n .button.is-dark.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent whitesmoke whitesmoke !important; }\\n .button.is-dark.is-outlined[disabled],\\n fieldset[disabled] .button.is-dark.is-outlined {\\n background-color: transparent;\\n border-color: #363636;\\n box-shadow: none;\\n color: #363636; }\\n .button.is-dark.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: whitesmoke;\\n color: whitesmoke; }\\n .button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused {\\n background-color: whitesmoke;\\n color: #363636; }\\n .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #363636 #363636 !important; }\\n .button.is-dark.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-dark.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: whitesmoke;\\n box-shadow: none;\\n color: whitesmoke; }\\n .button.is-primary {\\n background-color: #00d1b2;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-primary:hover, .button.is-primary.is-hovered {\\n background-color: #00c4a7;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-primary:focus, .button.is-primary.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }\\n .button.is-primary:active, .button.is-primary.is-active {\\n background-color: #00b89c;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-primary[disabled],\\n fieldset[disabled] .button.is-primary {\\n background-color: #00d1b2;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-primary.is-inverted {\\n background-color: #fff;\\n color: #00d1b2; }\\n .button.is-primary.is-inverted:hover, .button.is-primary.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-primary.is-inverted[disabled],\\n fieldset[disabled] .button.is-primary.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #00d1b2; }\\n .button.is-primary.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-primary.is-outlined {\\n background-color: transparent;\\n border-color: #00d1b2;\\n color: #00d1b2; }\\n .button.is-primary.is-outlined:hover, .button.is-primary.is-outlined.is-hovered, .button.is-primary.is-outlined:focus, .button.is-primary.is-outlined.is-focused {\\n background-color: #00d1b2;\\n border-color: #00d1b2;\\n color: #fff; }\\n .button.is-primary.is-outlined.is-loading::after {\\n border-color: transparent transparent #00d1b2 #00d1b2 !important; }\\n .button.is-primary.is-outlined.is-loading:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .button.is-primary.is-outlined.is-loading:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-primary.is-outlined[disabled],\\n fieldset[disabled] .button.is-primary.is-outlined {\\n background-color: transparent;\\n border-color: #00d1b2;\\n box-shadow: none;\\n color: #00d1b2; }\\n .button.is-primary.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .button.is-primary.is-inverted.is-outlined:focus, .button.is-primary.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #00d1b2; }\\n .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #00d1b2 #00d1b2 !important; }\\n .button.is-primary.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-primary.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-primary.is-light {\\n background-color: #ebfffc;\\n color: #00947e; }\\n .button.is-primary.is-light:hover, .button.is-primary.is-light.is-hovered {\\n background-color: #defffa;\\n border-color: transparent;\\n color: #00947e; }\\n .button.is-primary.is-light:active, .button.is-primary.is-light.is-active {\\n background-color: #d1fff8;\\n border-color: transparent;\\n color: #00947e; }\\n .button.is-link {\\n background-color: #485fc7;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-link:hover, .button.is-link.is-hovered {\\n background-color: #3e56c4;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-link:focus, .button.is-link.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .button.is-link:active, .button.is-link.is-active {\\n background-color: #3a51bb;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-link[disabled],\\n fieldset[disabled] .button.is-link {\\n background-color: #485fc7;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-link.is-inverted {\\n background-color: #fff;\\n color: #485fc7; }\\n .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-link.is-inverted[disabled],\\n fieldset[disabled] .button.is-link.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #485fc7; }\\n .button.is-link.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-link.is-outlined {\\n background-color: transparent;\\n border-color: #485fc7;\\n color: #485fc7; }\\n .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused {\\n background-color: #485fc7;\\n border-color: #485fc7;\\n color: #fff; }\\n .button.is-link.is-outlined.is-loading::after {\\n border-color: transparent transparent #485fc7 #485fc7 !important; }\\n .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-link.is-outlined[disabled],\\n fieldset[disabled] .button.is-link.is-outlined {\\n background-color: transparent;\\n border-color: #485fc7;\\n box-shadow: none;\\n color: #485fc7; }\\n .button.is-link.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #485fc7; }\\n .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #485fc7 #485fc7 !important; }\\n .button.is-link.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-link.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-link.is-light {\\n background-color: #eff1fa;\\n color: #3850b7; }\\n .button.is-link.is-light:hover, .button.is-link.is-light.is-hovered {\\n background-color: #e6e9f7;\\n border-color: transparent;\\n color: #3850b7; }\\n .button.is-link.is-light:active, .button.is-link.is-light.is-active {\\n background-color: #dce0f4;\\n border-color: transparent;\\n color: #3850b7; }\\n .button.is-info {\\n background-color: #3e8ed0;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-info:hover, .button.is-info.is-hovered {\\n background-color: #3488ce;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-info:focus, .button.is-info.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(62, 142, 208, 0.25); }\\n .button.is-info:active, .button.is-info.is-active {\\n background-color: #3082c5;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-info[disabled],\\n fieldset[disabled] .button.is-info {\\n background-color: #3e8ed0;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-info.is-inverted {\\n background-color: #fff;\\n color: #3e8ed0; }\\n .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-info.is-inverted[disabled],\\n fieldset[disabled] .button.is-info.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #3e8ed0; }\\n .button.is-info.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-info.is-outlined {\\n background-color: transparent;\\n border-color: #3e8ed0;\\n color: #3e8ed0; }\\n .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused {\\n background-color: #3e8ed0;\\n border-color: #3e8ed0;\\n color: #fff; }\\n .button.is-info.is-outlined.is-loading::after {\\n border-color: transparent transparent #3e8ed0 #3e8ed0 !important; }\\n .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-info.is-outlined[disabled],\\n fieldset[disabled] .button.is-info.is-outlined {\\n background-color: transparent;\\n border-color: #3e8ed0;\\n box-shadow: none;\\n color: #3e8ed0; }\\n .button.is-info.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #3e8ed0; }\\n .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #3e8ed0 #3e8ed0 !important; }\\n .button.is-info.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-info.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-info.is-light {\\n background-color: #eff5fb;\\n color: #296fa8; }\\n .button.is-info.is-light:hover, .button.is-info.is-light.is-hovered {\\n background-color: #e4eff9;\\n border-color: transparent;\\n color: #296fa8; }\\n .button.is-info.is-light:active, .button.is-info.is-light.is-active {\\n background-color: #dae9f6;\\n border-color: transparent;\\n color: #296fa8; }\\n .button.is-success {\\n background-color: #48c78e;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-success:hover, .button.is-success.is-hovered {\\n background-color: #3ec487;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-success:focus, .button.is-success.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(72, 199, 142, 0.25); }\\n .button.is-success:active, .button.is-success.is-active {\\n background-color: #3abb81;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-success[disabled],\\n fieldset[disabled] .button.is-success {\\n background-color: #48c78e;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-success.is-inverted {\\n background-color: #fff;\\n color: #48c78e; }\\n .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-success.is-inverted[disabled],\\n fieldset[disabled] .button.is-success.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #48c78e; }\\n .button.is-success.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-success.is-outlined {\\n background-color: transparent;\\n border-color: #48c78e;\\n color: #48c78e; }\\n .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused {\\n background-color: #48c78e;\\n border-color: #48c78e;\\n color: #fff; }\\n .button.is-success.is-outlined.is-loading::after {\\n border-color: transparent transparent #48c78e #48c78e !important; }\\n .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-success.is-outlined[disabled],\\n fieldset[disabled] .button.is-success.is-outlined {\\n background-color: transparent;\\n border-color: #48c78e;\\n box-shadow: none;\\n color: #48c78e; }\\n .button.is-success.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #48c78e; }\\n .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #48c78e #48c78e !important; }\\n .button.is-success.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-success.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-success.is-light {\\n background-color: #effaf5;\\n color: #257953; }\\n .button.is-success.is-light:hover, .button.is-success.is-light.is-hovered {\\n background-color: #e6f7ef;\\n border-color: transparent;\\n color: #257953; }\\n .button.is-success.is-light:active, .button.is-success.is-light.is-active {\\n background-color: #dcf4e9;\\n border-color: transparent;\\n color: #257953; }\\n .button.is-warning {\\n background-color: #ffe08a;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning:hover, .button.is-warning.is-hovered {\\n background-color: #ffdc7d;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning:focus, .button.is-warning.is-focused {\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(255, 224, 138, 0.25); }\\n .button.is-warning:active, .button.is-warning.is-active {\\n background-color: #ffd970;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning[disabled],\\n fieldset[disabled] .button.is-warning {\\n background-color: #ffe08a;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-warning.is-inverted {\\n background-color: rgba(0, 0, 0, 0.7);\\n color: #ffe08a; }\\n .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered {\\n background-color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning.is-inverted[disabled],\\n fieldset[disabled] .button.is-warning.is-inverted {\\n background-color: rgba(0, 0, 0, 0.7);\\n border-color: transparent;\\n box-shadow: none;\\n color: #ffe08a; }\\n .button.is-warning.is-loading::after {\\n border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; }\\n .button.is-warning.is-outlined {\\n background-color: transparent;\\n border-color: #ffe08a;\\n color: #ffe08a; }\\n .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused {\\n background-color: #ffe08a;\\n border-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning.is-outlined.is-loading::after {\\n border-color: transparent transparent #ffe08a #ffe08a !important; }\\n .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; }\\n .button.is-warning.is-outlined[disabled],\\n fieldset[disabled] .button.is-warning.is-outlined {\\n background-color: transparent;\\n border-color: #ffe08a;\\n box-shadow: none;\\n color: #ffe08a; }\\n .button.is-warning.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: rgba(0, 0, 0, 0.7);\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused {\\n background-color: rgba(0, 0, 0, 0.7);\\n color: #ffe08a; }\\n .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #ffe08a #ffe08a !important; }\\n .button.is-warning.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-warning.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: rgba(0, 0, 0, 0.7);\\n box-shadow: none;\\n color: rgba(0, 0, 0, 0.7); }\\n .button.is-warning.is-light {\\n background-color: #fffaeb;\\n color: #946c00; }\\n .button.is-warning.is-light:hover, .button.is-warning.is-light.is-hovered {\\n background-color: #fff6de;\\n border-color: transparent;\\n color: #946c00; }\\n .button.is-warning.is-light:active, .button.is-warning.is-light.is-active {\\n background-color: #fff3d1;\\n border-color: transparent;\\n color: #946c00; }\\n .button.is-danger {\\n background-color: #f14668;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-danger:hover, .button.is-danger.is-hovered {\\n background-color: #f03a5f;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-danger:focus, .button.is-danger.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); }\\n .button.is-danger:active, .button.is-danger.is-active {\\n background-color: #ef2e55;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-danger[disabled],\\n fieldset[disabled] .button.is-danger {\\n background-color: #f14668;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-danger.is-inverted {\\n background-color: #fff;\\n color: #f14668; }\\n .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-danger.is-inverted[disabled],\\n fieldset[disabled] .button.is-danger.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #f14668; }\\n .button.is-danger.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-danger.is-outlined {\\n background-color: transparent;\\n border-color: #f14668;\\n color: #f14668; }\\n .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused {\\n background-color: #f14668;\\n border-color: #f14668;\\n color: #fff; }\\n .button.is-danger.is-outlined.is-loading::after {\\n border-color: transparent transparent #f14668 #f14668 !important; }\\n .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-danger.is-outlined[disabled],\\n fieldset[disabled] .button.is-danger.is-outlined {\\n background-color: transparent;\\n border-color: #f14668;\\n box-shadow: none;\\n color: #f14668; }\\n .button.is-danger.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #f14668; }\\n .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #f14668 #f14668 !important; }\\n .button.is-danger.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-danger.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-danger.is-light {\\n background-color: #feecf0;\\n color: #cc0f35; }\\n .button.is-danger.is-light:hover, .button.is-danger.is-light.is-hovered {\\n background-color: #fde0e6;\\n border-color: transparent;\\n color: #cc0f35; }\\n .button.is-danger.is-light:active, .button.is-danger.is-light.is-active {\\n background-color: #fcd4dc;\\n border-color: transparent;\\n color: #cc0f35; }\\n .button.is-twitter {\\n background-color: #55acee;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-twitter:hover, .button.is-twitter.is-hovered {\\n background-color: #49a6ed;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-twitter:focus, .button.is-twitter.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-twitter:focus:not(:active), .button.is-twitter.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(85, 172, 238, 0.25); }\\n .button.is-twitter:active, .button.is-twitter.is-active {\\n background-color: #3ea1ec;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-twitter[disabled],\\n fieldset[disabled] .button.is-twitter {\\n background-color: #55acee;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-twitter.is-inverted {\\n background-color: #fff;\\n color: #55acee; }\\n .button.is-twitter.is-inverted:hover, .button.is-twitter.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-twitter.is-inverted[disabled],\\n fieldset[disabled] .button.is-twitter.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #55acee; }\\n .button.is-twitter.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-twitter.is-outlined {\\n background-color: transparent;\\n border-color: #55acee;\\n color: #55acee; }\\n .button.is-twitter.is-outlined:hover, .button.is-twitter.is-outlined.is-hovered, .button.is-twitter.is-outlined:focus, .button.is-twitter.is-outlined.is-focused {\\n background-color: #55acee;\\n border-color: #55acee;\\n color: #fff; }\\n .button.is-twitter.is-outlined.is-loading::after {\\n border-color: transparent transparent #55acee #55acee !important; }\\n .button.is-twitter.is-outlined.is-loading:hover::after, .button.is-twitter.is-outlined.is-loading.is-hovered::after, .button.is-twitter.is-outlined.is-loading:focus::after, .button.is-twitter.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-twitter.is-outlined[disabled],\\n fieldset[disabled] .button.is-twitter.is-outlined {\\n background-color: transparent;\\n border-color: #55acee;\\n box-shadow: none;\\n color: #55acee; }\\n .button.is-twitter.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-twitter.is-inverted.is-outlined:hover, .button.is-twitter.is-inverted.is-outlined.is-hovered, .button.is-twitter.is-inverted.is-outlined:focus, .button.is-twitter.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #55acee; }\\n .button.is-twitter.is-inverted.is-outlined.is-loading:hover::after, .button.is-twitter.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-twitter.is-inverted.is-outlined.is-loading:focus::after, .button.is-twitter.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #55acee #55acee !important; }\\n .button.is-twitter.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-twitter.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-linkedin {\\n background-color: #0077b5;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-linkedin:hover, .button.is-linkedin.is-hovered {\\n background-color: #006fa8;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-linkedin:focus, .button.is-linkedin.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-linkedin:focus:not(:active), .button.is-linkedin.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(0, 119, 181, 0.25); }\\n .button.is-linkedin:active, .button.is-linkedin.is-active {\\n background-color: #00669c;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-linkedin[disabled],\\n fieldset[disabled] .button.is-linkedin {\\n background-color: #0077b5;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-linkedin.is-inverted {\\n background-color: #fff;\\n color: #0077b5; }\\n .button.is-linkedin.is-inverted:hover, .button.is-linkedin.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-linkedin.is-inverted[disabled],\\n fieldset[disabled] .button.is-linkedin.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #0077b5; }\\n .button.is-linkedin.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-linkedin.is-outlined {\\n background-color: transparent;\\n border-color: #0077b5;\\n color: #0077b5; }\\n .button.is-linkedin.is-outlined:hover, .button.is-linkedin.is-outlined.is-hovered, .button.is-linkedin.is-outlined:focus, .button.is-linkedin.is-outlined.is-focused {\\n background-color: #0077b5;\\n border-color: #0077b5;\\n color: #fff; }\\n .button.is-linkedin.is-outlined.is-loading::after {\\n border-color: transparent transparent #0077b5 #0077b5 !important; }\\n .button.is-linkedin.is-outlined.is-loading:hover::after, .button.is-linkedin.is-outlined.is-loading.is-hovered::after, .button.is-linkedin.is-outlined.is-loading:focus::after, .button.is-linkedin.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-linkedin.is-outlined[disabled],\\n fieldset[disabled] .button.is-linkedin.is-outlined {\\n background-color: transparent;\\n border-color: #0077b5;\\n box-shadow: none;\\n color: #0077b5; }\\n .button.is-linkedin.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-linkedin.is-inverted.is-outlined:hover, .button.is-linkedin.is-inverted.is-outlined.is-hovered, .button.is-linkedin.is-inverted.is-outlined:focus, .button.is-linkedin.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #0077b5; }\\n .button.is-linkedin.is-inverted.is-outlined.is-loading:hover::after, .button.is-linkedin.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-linkedin.is-inverted.is-outlined.is-loading:focus::after, .button.is-linkedin.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #0077b5 #0077b5 !important; }\\n .button.is-linkedin.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-linkedin.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-github {\\n background-color: #333;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-github:hover, .button.is-github.is-hovered {\\n background-color: #2d2d2d;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-github:focus, .button.is-github.is-focused {\\n border-color: transparent;\\n color: #fff; }\\n .button.is-github:focus:not(:active), .button.is-github.is-focused:not(:active) {\\n box-shadow: 0 0 0 0.125em rgba(51, 51, 51, 0.25); }\\n .button.is-github:active, .button.is-github.is-active {\\n background-color: #262626;\\n border-color: transparent;\\n color: #fff; }\\n .button.is-github[disabled],\\n fieldset[disabled] .button.is-github {\\n background-color: #333;\\n border-color: transparent;\\n box-shadow: none; }\\n .button.is-github.is-inverted {\\n background-color: #fff;\\n color: #333; }\\n .button.is-github.is-inverted:hover, .button.is-github.is-inverted.is-hovered {\\n background-color: #f2f2f2; }\\n .button.is-github.is-inverted[disabled],\\n fieldset[disabled] .button.is-github.is-inverted {\\n background-color: #fff;\\n border-color: transparent;\\n box-shadow: none;\\n color: #333; }\\n .button.is-github.is-loading::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-github.is-outlined {\\n background-color: transparent;\\n border-color: #333;\\n color: #333; }\\n .button.is-github.is-outlined:hover, .button.is-github.is-outlined.is-hovered, .button.is-github.is-outlined:focus, .button.is-github.is-outlined.is-focused {\\n background-color: #333;\\n border-color: #333;\\n color: #fff; }\\n .button.is-github.is-outlined.is-loading::after {\\n border-color: transparent transparent #333 #333 !important; }\\n .button.is-github.is-outlined.is-loading:hover::after, .button.is-github.is-outlined.is-loading.is-hovered::after, .button.is-github.is-outlined.is-loading:focus::after, .button.is-github.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #fff #fff !important; }\\n .button.is-github.is-outlined[disabled],\\n fieldset[disabled] .button.is-github.is-outlined {\\n background-color: transparent;\\n border-color: #333;\\n box-shadow: none;\\n color: #333; }\\n .button.is-github.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n color: #fff; }\\n .button.is-github.is-inverted.is-outlined:hover, .button.is-github.is-inverted.is-outlined.is-hovered, .button.is-github.is-inverted.is-outlined:focus, .button.is-github.is-inverted.is-outlined.is-focused {\\n background-color: #fff;\\n color: #333; }\\n .button.is-github.is-inverted.is-outlined.is-loading:hover::after, .button.is-github.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-github.is-inverted.is-outlined.is-loading:focus::after, .button.is-github.is-inverted.is-outlined.is-loading.is-focused::after {\\n border-color: transparent transparent #333 #333 !important; }\\n .button.is-github.is-inverted.is-outlined[disabled],\\n fieldset[disabled] .button.is-github.is-inverted.is-outlined {\\n background-color: transparent;\\n border-color: #fff;\\n box-shadow: none;\\n color: #fff; }\\n .button.is-small {\\n font-size: 0.75rem; }\\n .button.is-small:not(.is-rounded) {\\n border-radius: 2px; }\\n .button.is-normal {\\n font-size: 1rem; }\\n .button.is-medium {\\n font-size: 1.25rem; }\\n .button.is-large {\\n font-size: 1.5rem; }\\n .button[disabled],\\n fieldset[disabled] .button {\\n background-color: white;\\n border-color: #dbdbdb;\\n box-shadow: none;\\n opacity: 0.5; }\\n .button.is-fullwidth {\\n display: flex;\\n width: 100%; }\\n .button.is-loading {\\n color: transparent !important;\\n pointer-events: none; }\\n .button.is-loading::after {\\n position: absolute;\\n left: calc(50% - (1em * 0.5));\\n top: calc(50% - (1em * 0.5));\\n position: absolute !important; }\\n .button.is-static {\\n background-color: whitesmoke;\\n border-color: #dbdbdb;\\n color: #7a7a7a;\\n box-shadow: none;\\n pointer-events: none; }\\n .button.is-rounded {\\n border-radius: 9999px;\\n padding-left: calc(1em + 0.25em);\\n padding-right: calc(1em + 0.25em); }\\n\\n.buttons {\\n align-items: center;\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: flex-start; }\\n .buttons .button {\\n margin-bottom: 0.5rem; }\\n .buttons .button:not(:last-child):not(.is-fullwidth) {\\n margin-right: 0.5rem; }\\n .buttons:last-child {\\n margin-bottom: -0.5rem; }\\n .buttons:not(:last-child) {\\n margin-bottom: 1rem; }\\n .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) {\\n font-size: 0.75rem; }\\n .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded) {\\n border-radius: 2px; }\\n .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) {\\n font-size: 1.25rem; }\\n .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) {\\n font-size: 1.5rem; }\\n .buttons.has-addons .button:not(:first-child) {\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n .buttons.has-addons .button:not(:last-child) {\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0;\\n margin-right: -1px; }\\n .buttons.has-addons .button:last-child {\\n margin-right: 0; }\\n .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered {\\n z-index: 2; }\\n .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected {\\n z-index: 3; }\\n .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover {\\n z-index: 4; }\\n .buttons.has-addons .button.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .buttons.is-centered {\\n justify-content: center; }\\n .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) {\\n margin-left: 0.25rem;\\n margin-right: 0.25rem; }\\n .buttons.is-right {\\n justify-content: flex-end; }\\n .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) {\\n margin-left: 0.25rem;\\n margin-right: 0.25rem; }\\n\\n.container {\\n flex-grow: 1;\\n margin: 0 auto;\\n position: relative;\\n width: auto; }\\n .container.is-fluid {\\n max-width: none !important;\\n padding-left: 32px;\\n padding-right: 32px;\\n width: 100%; }\\n @media screen and (min-width: 1024px) {\\n .container {\\n max-width: 960px; } }\\n @media screen and (max-width: 1215px) {\\n .container.is-widescreen:not(.is-max-desktop) {\\n max-width: 1152px; } }\\n @media screen and (max-width: 1407px) {\\n .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen) {\\n max-width: 1344px; } }\\n @media screen and (min-width: 1216px) {\\n .container:not(.is-max-desktop) {\\n max-width: 1152px; } }\\n @media screen and (min-width: 1408px) {\\n .container:not(.is-max-desktop):not(.is-max-widescreen) {\\n max-width: 1344px; } }\\n\\n.content li + li {\\n margin-top: 0.25em; }\\n\\n.content p:not(:last-child),\\n.content dl:not(:last-child),\\n.content ol:not(:last-child),\\n.content ul:not(:last-child),\\n.content blockquote:not(:last-child),\\n.content pre:not(:last-child),\\n.content table:not(:last-child) {\\n margin-bottom: 1em; }\\n\\n.content h1,\\n.content h2,\\n.content h3,\\n.content h4,\\n.content h5,\\n.content h6 {\\n color: #363636;\\n font-weight: 600;\\n line-height: 1.125; }\\n\\n.content h1 {\\n font-size: 2em;\\n margin-bottom: 0.5em; }\\n .content h1:not(:first-child) {\\n margin-top: 1em; }\\n\\n.content h2 {\\n font-size: 1.75em;\\n margin-bottom: 0.5714em; }\\n .content h2:not(:first-child) {\\n margin-top: 1.1428em; }\\n\\n.content h3 {\\n font-size: 1.5em;\\n margin-bottom: 0.6666em; }\\n .content h3:not(:first-child) {\\n margin-top: 1.3333em; }\\n\\n.content h4 {\\n font-size: 1.25em;\\n margin-bottom: 0.8em; }\\n\\n.content h5 {\\n font-size: 1.125em;\\n margin-bottom: 0.8888em; }\\n\\n.content h6 {\\n font-size: 1em;\\n margin-bottom: 1em; }\\n\\n.content blockquote {\\n background-color: whitesmoke;\\n border-left: 5px solid #dbdbdb;\\n padding: 1.25em 1.5em; }\\n\\n.content ol {\\n list-style-position: outside;\\n margin-left: 2em;\\n margin-top: 1em; }\\n .content ol:not([type]) {\\n list-style-type: decimal; }\\n .content ol:not([type]).is-lower-alpha {\\n list-style-type: lower-alpha; }\\n .content ol:not([type]).is-lower-roman {\\n list-style-type: lower-roman; }\\n .content ol:not([type]).is-upper-alpha {\\n list-style-type: upper-alpha; }\\n .content ol:not([type]).is-upper-roman {\\n list-style-type: upper-roman; }\\n\\n.content ul {\\n list-style: disc outside;\\n margin-left: 2em;\\n margin-top: 1em; }\\n .content ul ul {\\n list-style-type: circle;\\n margin-top: 0.5em; }\\n .content ul ul ul {\\n list-style-type: square; }\\n\\n.content dd {\\n margin-left: 2em; }\\n\\n.content figure {\\n margin-left: 2em;\\n margin-right: 2em;\\n text-align: center; }\\n .content figure:not(:first-child) {\\n margin-top: 2em; }\\n .content figure:not(:last-child) {\\n margin-bottom: 2em; }\\n .content figure img {\\n display: inline-block; }\\n .content figure figcaption {\\n font-style: italic; }\\n\\n.content pre {\\n -webkit-overflow-scrolling: touch;\\n overflow-x: auto;\\n padding: 1.25em 1.5em;\\n white-space: pre;\\n word-wrap: normal; }\\n\\n.content sup,\\n.content sub {\\n font-size: 75%; }\\n\\n.content table {\\n width: 100%; }\\n .content table td,\\n .content table th {\\n border: 1px solid #dbdbdb;\\n border-width: 0 0 1px;\\n padding: 0.5em 0.75em;\\n vertical-align: top; }\\n .content table th {\\n color: #363636; }\\n .content table th:not([align]) {\\n text-align: inherit; }\\n .content table thead td,\\n .content table thead th {\\n border-width: 0 0 2px;\\n color: #363636; }\\n .content table tfoot td,\\n .content table tfoot th {\\n border-width: 2px 0 0;\\n color: #363636; }\\n .content table tbody tr:last-child td,\\n .content table tbody tr:last-child th {\\n border-bottom-width: 0; }\\n\\n.content .tabs li + li {\\n margin-top: 0; }\\n\\n.content.is-small {\\n font-size: 0.75rem; }\\n\\n.content.is-normal {\\n font-size: 1rem; }\\n\\n.content.is-medium {\\n font-size: 1.25rem; }\\n\\n.content.is-large {\\n font-size: 1.5rem; }\\n\\n.icon {\\n align-items: center;\\n display: inline-flex;\\n justify-content: center;\\n height: 1.5rem;\\n width: 1.5rem; }\\n .icon.is-small {\\n height: 1rem;\\n width: 1rem; }\\n .icon.is-medium {\\n height: 2rem;\\n width: 2rem; }\\n .icon.is-large {\\n height: 3rem;\\n width: 3rem; }\\n\\n.icon-text {\\n align-items: flex-start;\\n color: inherit;\\n display: inline-flex;\\n flex-wrap: wrap;\\n line-height: 1.5rem;\\n vertical-align: top; }\\n .icon-text .icon {\\n flex-grow: 0;\\n flex-shrink: 0; }\\n .icon-text .icon:not(:last-child) {\\n margin-right: 0.25em; }\\n .icon-text .icon:not(:first-child) {\\n margin-left: 0.25em; }\\n\\ndiv.icon-text {\\n display: flex; }\\n\\n.image {\\n display: block;\\n position: relative; }\\n .image img {\\n display: block;\\n height: auto;\\n width: 100%; }\\n .image img.is-rounded {\\n border-radius: 9999px; }\\n .image.is-fullwidth {\\n width: 100%; }\\n .image.is-square img,\\n .image.is-square .has-ratio, .image.is-1by1 img,\\n .image.is-1by1 .has-ratio, .image.is-5by4 img,\\n .image.is-5by4 .has-ratio, .image.is-4by3 img,\\n .image.is-4by3 .has-ratio, .image.is-3by2 img,\\n .image.is-3by2 .has-ratio, .image.is-5by3 img,\\n .image.is-5by3 .has-ratio, .image.is-16by9 img,\\n .image.is-16by9 .has-ratio, .image.is-2by1 img,\\n .image.is-2by1 .has-ratio, .image.is-3by1 img,\\n .image.is-3by1 .has-ratio, .image.is-4by5 img,\\n .image.is-4by5 .has-ratio, .image.is-3by4 img,\\n .image.is-3by4 .has-ratio, .image.is-2by3 img,\\n .image.is-2by3 .has-ratio, .image.is-3by5 img,\\n .image.is-3by5 .has-ratio, .image.is-9by16 img,\\n .image.is-9by16 .has-ratio, .image.is-1by2 img,\\n .image.is-1by2 .has-ratio, .image.is-1by3 img,\\n .image.is-1by3 .has-ratio {\\n height: 100%;\\n width: 100%; }\\n .image.is-square, .image.is-1by1 {\\n padding-top: 100%; }\\n .image.is-5by4 {\\n padding-top: 80%; }\\n .image.is-4by3 {\\n padding-top: 75%; }\\n .image.is-3by2 {\\n padding-top: 66.6666%; }\\n .image.is-5by3 {\\n padding-top: 60%; }\\n .image.is-16by9 {\\n padding-top: 56.25%; }\\n .image.is-2by1 {\\n padding-top: 50%; }\\n .image.is-3by1 {\\n padding-top: 33.3333%; }\\n .image.is-4by5 {\\n padding-top: 125%; }\\n .image.is-3by4 {\\n padding-top: 133.3333%; }\\n .image.is-2by3 {\\n padding-top: 150%; }\\n .image.is-3by5 {\\n padding-top: 166.6666%; }\\n .image.is-9by16 {\\n padding-top: 177.7777%; }\\n .image.is-1by2 {\\n padding-top: 200%; }\\n .image.is-1by3 {\\n padding-top: 300%; }\\n .image.is-16x16 {\\n height: 16px;\\n width: 16px; }\\n .image.is-24x24 {\\n height: 24px;\\n width: 24px; }\\n .image.is-32x32 {\\n height: 32px;\\n width: 32px; }\\n .image.is-48x48 {\\n height: 48px;\\n width: 48px; }\\n .image.is-64x64 {\\n height: 64px;\\n width: 64px; }\\n .image.is-96x96 {\\n height: 96px;\\n width: 96px; }\\n .image.is-128x128 {\\n height: 128px;\\n width: 128px; }\\n\\n.notification {\\n background-color: whitesmoke;\\n border-radius: 4px;\\n position: relative;\\n padding: 1.25rem 2.5rem 1.25rem 1.5rem; }\\n .notification a:not(.button):not(.dropdown-item) {\\n color: currentColor;\\n text-decoration: underline; }\\n .notification strong {\\n color: currentColor; }\\n .notification code,\\n .notification pre {\\n background: white; }\\n .notification pre code {\\n background: transparent; }\\n .notification > .delete {\\n right: 0.5rem;\\n position: absolute;\\n top: 0.5rem; }\\n .notification .title,\\n .notification .subtitle,\\n .notification .content {\\n color: currentColor; }\\n .notification.is-white {\\n background-color: white;\\n color: #0a0a0a; }\\n .notification.is-black {\\n background-color: #0a0a0a;\\n color: white; }\\n .notification.is-light {\\n background-color: whitesmoke;\\n color: #363636; }\\n .notification.is-dark {\\n background-color: #363636;\\n color: whitesmoke; }\\n .notification.is-primary {\\n background-color: #00d1b2;\\n color: #fff; }\\n .notification.is-primary.is-light {\\n background-color: #ebfffc;\\n color: #00947e; }\\n .notification.is-link {\\n background-color: #485fc7;\\n color: #fff; }\\n .notification.is-link.is-light {\\n background-color: #eff1fa;\\n color: #3850b7; }\\n .notification.is-info {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .notification.is-info.is-light {\\n background-color: #eff5fb;\\n color: #296fa8; }\\n .notification.is-success {\\n background-color: #48c78e;\\n color: #fff; }\\n .notification.is-success.is-light {\\n background-color: #effaf5;\\n color: #257953; }\\n .notification.is-warning {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .notification.is-warning.is-light {\\n background-color: #fffaeb;\\n color: #946c00; }\\n .notification.is-danger {\\n background-color: #f14668;\\n color: #fff; }\\n .notification.is-danger.is-light {\\n background-color: #feecf0;\\n color: #cc0f35; }\\n .notification.is-twitter {\\n background-color: #55acee;\\n color: #fff; }\\n .notification.is-linkedin {\\n background-color: #0077b5;\\n color: #fff; }\\n .notification.is-github {\\n background-color: #333;\\n color: #fff; }\\n\\n.progress, .progress-wrapper.is-not-native {\\n -moz-appearance: none;\\n -webkit-appearance: none;\\n border: none;\\n border-radius: 9999px;\\n display: block;\\n height: 1rem;\\n overflow: hidden;\\n padding: 0;\\n width: 100%; }\\n .progress::-webkit-progress-bar, .progress-wrapper.is-not-native::-webkit-progress-bar {\\n background-color: #ededed; }\\n .progress::-webkit-progress-value, .progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #4a4a4a; }\\n .progress::-moz-progress-bar, .progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #4a4a4a; }\\n .progress::-ms-fill, .progress-wrapper.is-not-native::-ms-fill {\\n background-color: #4a4a4a;\\n border: none; }\\n .progress.is-white::-webkit-progress-value, .is-white.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: white; }\\n .progress.is-white::-moz-progress-bar, .is-white.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: white; }\\n .progress.is-white::-ms-fill, .is-white.progress-wrapper.is-not-native::-ms-fill {\\n background-color: white; }\\n .progress.is-white:indeterminate, .is-white.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, white 30%, #ededed 30%); }\\n .progress.is-black::-webkit-progress-value, .is-black.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #0a0a0a; }\\n .progress.is-black::-moz-progress-bar, .is-black.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #0a0a0a; }\\n .progress.is-black::-ms-fill, .is-black.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #0a0a0a; }\\n .progress.is-black:indeterminate, .is-black.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #0a0a0a 30%, #ededed 30%); }\\n .progress.is-light::-webkit-progress-value, .is-light.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: whitesmoke; }\\n .progress.is-light::-moz-progress-bar, .is-light.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: whitesmoke; }\\n .progress.is-light::-ms-fill, .is-light.progress-wrapper.is-not-native::-ms-fill {\\n background-color: whitesmoke; }\\n .progress.is-light:indeterminate, .is-light.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, whitesmoke 30%, #ededed 30%); }\\n .progress.is-dark::-webkit-progress-value, .is-dark.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #363636; }\\n .progress.is-dark::-moz-progress-bar, .is-dark.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #363636; }\\n .progress.is-dark::-ms-fill, .is-dark.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #363636; }\\n .progress.is-dark:indeterminate, .is-dark.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #363636 30%, #ededed 30%); }\\n .progress.is-primary::-webkit-progress-value, .is-primary.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #00d1b2; }\\n .progress.is-primary::-moz-progress-bar, .is-primary.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #00d1b2; }\\n .progress.is-primary::-ms-fill, .is-primary.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #00d1b2; }\\n .progress.is-primary:indeterminate, .is-primary.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #00d1b2 30%, #ededed 30%); }\\n .progress.is-link::-webkit-progress-value, .is-link.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #485fc7; }\\n .progress.is-link::-moz-progress-bar, .is-link.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #485fc7; }\\n .progress.is-link::-ms-fill, .is-link.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #485fc7; }\\n .progress.is-link:indeterminate, .is-link.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #485fc7 30%, #ededed 30%); }\\n .progress.is-info::-webkit-progress-value, .is-info.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #3e8ed0; }\\n .progress.is-info::-moz-progress-bar, .is-info.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #3e8ed0; }\\n .progress.is-info::-ms-fill, .is-info.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #3e8ed0; }\\n .progress.is-info:indeterminate, .is-info.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #3e8ed0 30%, #ededed 30%); }\\n .progress.is-success::-webkit-progress-value, .is-success.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #48c78e; }\\n .progress.is-success::-moz-progress-bar, .is-success.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #48c78e; }\\n .progress.is-success::-ms-fill, .is-success.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #48c78e; }\\n .progress.is-success:indeterminate, .is-success.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #48c78e 30%, #ededed 30%); }\\n .progress.is-warning::-webkit-progress-value, .is-warning.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #ffe08a; }\\n .progress.is-warning::-moz-progress-bar, .is-warning.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #ffe08a; }\\n .progress.is-warning::-ms-fill, .is-warning.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #ffe08a; }\\n .progress.is-warning:indeterminate, .is-warning.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #ffe08a 30%, #ededed 30%); }\\n .progress.is-danger::-webkit-progress-value, .is-danger.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #f14668; }\\n .progress.is-danger::-moz-progress-bar, .is-danger.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #f14668; }\\n .progress.is-danger::-ms-fill, .is-danger.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #f14668; }\\n .progress.is-danger:indeterminate, .is-danger.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #f14668 30%, #ededed 30%); }\\n .progress.is-twitter::-webkit-progress-value, .is-twitter.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #55acee; }\\n .progress.is-twitter::-moz-progress-bar, .is-twitter.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #55acee; }\\n .progress.is-twitter::-ms-fill, .is-twitter.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #55acee; }\\n .progress.is-twitter:indeterminate, .is-twitter.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #55acee 30%, #ededed 30%); }\\n .progress.is-linkedin::-webkit-progress-value, .is-linkedin.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #0077b5; }\\n .progress.is-linkedin::-moz-progress-bar, .is-linkedin.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #0077b5; }\\n .progress.is-linkedin::-ms-fill, .is-linkedin.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #0077b5; }\\n .progress.is-linkedin:indeterminate, .is-linkedin.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #0077b5 30%, #ededed 30%); }\\n .progress.is-github::-webkit-progress-value, .is-github.progress-wrapper.is-not-native::-webkit-progress-value {\\n background-color: #333; }\\n .progress.is-github::-moz-progress-bar, .is-github.progress-wrapper.is-not-native::-moz-progress-bar {\\n background-color: #333; }\\n .progress.is-github::-ms-fill, .is-github.progress-wrapper.is-not-native::-ms-fill {\\n background-color: #333; }\\n .progress.is-github:indeterminate, .is-github.progress-wrapper.is-not-native:indeterminate {\\n background-image: linear-gradient(to right, #333 30%, #ededed 30%); }\\n .progress:indeterminate, .progress-wrapper.is-not-native:indeterminate {\\n -webkit-animation-duration: 1.5s;\\n animation-duration: 1.5s;\\n -webkit-animation-iteration-count: infinite;\\n animation-iteration-count: infinite;\\n -webkit-animation-name: moveIndeterminate;\\n animation-name: moveIndeterminate;\\n -webkit-animation-timing-function: linear;\\n animation-timing-function: linear;\\n background-color: #ededed;\\n background-image: linear-gradient(to right, #4a4a4a 30%, #ededed 30%);\\n background-position: top left;\\n background-repeat: no-repeat;\\n background-size: 150% 150%; }\\n .progress:indeterminate::-webkit-progress-bar, .progress-wrapper.is-not-native:indeterminate::-webkit-progress-bar {\\n background-color: transparent; }\\n .progress:indeterminate::-moz-progress-bar, .progress-wrapper.is-not-native:indeterminate::-moz-progress-bar {\\n background-color: transparent; }\\n .progress:indeterminate::-ms-fill, .progress-wrapper.is-not-native:indeterminate::-ms-fill {\\n animation-name: none; }\\n .progress.is-small, .is-small.progress-wrapper.is-not-native {\\n height: 0.75rem; }\\n .progress.is-medium, .is-medium.progress-wrapper.is-not-native {\\n height: 1.25rem; }\\n .progress.is-large, .is-large.progress-wrapper.is-not-native {\\n height: 1.5rem; }\\n\\n@-webkit-keyframes moveIndeterminate {\\n from {\\n background-position: 200% 0; }\\n to {\\n background-position: -200% 0; } }\\n\\n@keyframes moveIndeterminate {\\n from {\\n background-position: 200% 0; }\\n to {\\n background-position: -200% 0; } }\\n\\n.table {\\n background-color: white;\\n color: #363636; }\\n .table td,\\n .table th {\\n border: 1px solid #dbdbdb;\\n border-width: 0 0 1px;\\n padding: 0.5em 0.75em;\\n vertical-align: top; }\\n .table td.is-white,\\n .table th.is-white {\\n background-color: white;\\n border-color: white;\\n color: #0a0a0a; }\\n .table td.is-black,\\n .table th.is-black {\\n background-color: #0a0a0a;\\n border-color: #0a0a0a;\\n color: white; }\\n .table td.is-light,\\n .table th.is-light {\\n background-color: whitesmoke;\\n border-color: whitesmoke;\\n color: #363636; }\\n .table td.is-dark,\\n .table th.is-dark {\\n background-color: #363636;\\n border-color: #363636;\\n color: whitesmoke; }\\n .table td.is-primary,\\n .table th.is-primary {\\n background-color: #00d1b2;\\n border-color: #00d1b2;\\n color: #fff; }\\n .table td.is-link,\\n .table th.is-link {\\n background-color: #485fc7;\\n border-color: #485fc7;\\n color: #fff; }\\n .table td.is-info,\\n .table th.is-info {\\n background-color: #3e8ed0;\\n border-color: #3e8ed0;\\n color: #fff; }\\n .table td.is-success,\\n .table th.is-success {\\n background-color: #48c78e;\\n border-color: #48c78e;\\n color: #fff; }\\n .table td.is-warning,\\n .table th.is-warning {\\n background-color: #ffe08a;\\n border-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .table td.is-danger,\\n .table th.is-danger {\\n background-color: #f14668;\\n border-color: #f14668;\\n color: #fff; }\\n .table td.is-twitter,\\n .table th.is-twitter {\\n background-color: #55acee;\\n border-color: #55acee;\\n color: #fff; }\\n .table td.is-linkedin,\\n .table th.is-linkedin {\\n background-color: #0077b5;\\n border-color: #0077b5;\\n color: #fff; }\\n .table td.is-github,\\n .table th.is-github {\\n background-color: #333;\\n border-color: #333;\\n color: #fff; }\\n .table td.is-narrow,\\n .table th.is-narrow {\\n white-space: nowrap;\\n width: 1%; }\\n .table td.is-selected,\\n .table th.is-selected {\\n background-color: #00d1b2;\\n color: #fff; }\\n .table td.is-selected a,\\n .table td.is-selected strong,\\n .table th.is-selected a,\\n .table th.is-selected strong {\\n color: currentColor; }\\n .table td.is-vcentered,\\n .table th.is-vcentered {\\n vertical-align: middle; }\\n .table th {\\n color: #363636; }\\n .table th:not([align]) {\\n text-align: inherit; }\\n .table tr.is-selected {\\n background-color: #00d1b2;\\n color: #fff; }\\n .table tr.is-selected a,\\n .table tr.is-selected strong {\\n color: currentColor; }\\n .table tr.is-selected td,\\n .table tr.is-selected th {\\n border-color: #fff;\\n color: currentColor; }\\n .table thead {\\n background-color: transparent; }\\n .table thead td,\\n .table thead th {\\n border-width: 0 0 2px;\\n color: #363636; }\\n .table tfoot {\\n background-color: transparent; }\\n .table tfoot td,\\n .table tfoot th {\\n border-width: 2px 0 0;\\n color: #363636; }\\n .table tbody {\\n background-color: transparent; }\\n .table tbody tr:last-child td,\\n .table tbody tr:last-child th {\\n border-bottom-width: 0; }\\n .table.is-bordered td,\\n .table.is-bordered th {\\n border-width: 1px; }\\n .table.is-bordered tr:last-child td,\\n .table.is-bordered tr:last-child th {\\n border-bottom-width: 1px; }\\n .table.is-fullwidth {\\n width: 100%; }\\n .table.is-hoverable tbody tr:not(.is-selected):hover {\\n background-color: #fafafa; }\\n .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover {\\n background-color: #fafafa; }\\n .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) {\\n background-color: whitesmoke; }\\n .table.is-narrow td,\\n .table.is-narrow th {\\n padding: 0.25em 0.5em; }\\n .table.is-striped tbody tr:not(.is-selected):nth-child(even) {\\n background-color: #fafafa; }\\n\\n.table-container {\\n -webkit-overflow-scrolling: touch;\\n overflow: auto;\\n overflow-y: hidden;\\n max-width: 100%; }\\n\\n.tags {\\n align-items: center;\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: flex-start; }\\n .tags .tag {\\n margin-bottom: 0.5rem; }\\n .tags .tag:not(:last-child) {\\n margin-right: 0.5rem; }\\n .tags:last-child {\\n margin-bottom: -0.5rem; }\\n .tags:not(:last-child) {\\n margin-bottom: 1rem; }\\n .tags.are-medium .tag:not(.is-normal):not(.is-large) {\\n font-size: 1rem; }\\n .tags.are-large .tag:not(.is-normal):not(.is-medium) {\\n font-size: 1.25rem; }\\n .tags.is-centered {\\n justify-content: center; }\\n .tags.is-centered .tag {\\n margin-right: 0.25rem;\\n margin-left: 0.25rem; }\\n .tags.is-right {\\n justify-content: flex-end; }\\n .tags.is-right .tag:not(:first-child) {\\n margin-left: 0.5rem; }\\n .tags.is-right .tag:not(:last-child) {\\n margin-right: 0; }\\n .tags.has-addons .tag {\\n margin-right: 0; }\\n .tags.has-addons .tag:not(:first-child) {\\n margin-left: 0;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0; }\\n .tags.has-addons .tag:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0; }\\n\\n.tag:not(body) {\\n align-items: center;\\n background-color: whitesmoke;\\n border-radius: 4px;\\n color: #4a4a4a;\\n display: inline-flex;\\n font-size: 0.75rem;\\n height: 2em;\\n justify-content: center;\\n line-height: 1.5;\\n padding-left: 0.75em;\\n padding-right: 0.75em;\\n white-space: nowrap; }\\n .tag:not(body) .delete {\\n margin-left: 0.25rem;\\n margin-right: -0.375rem; }\\n .tag:not(body).is-white {\\n background-color: white;\\n color: #0a0a0a; }\\n .tag:not(body).is-black {\\n background-color: #0a0a0a;\\n color: white; }\\n .tag:not(body).is-light {\\n background-color: whitesmoke;\\n color: #363636; }\\n .tag:not(body).is-dark {\\n background-color: #363636;\\n color: whitesmoke; }\\n .tag:not(body).is-primary {\\n background-color: #00d1b2;\\n color: #fff; }\\n .tag:not(body).is-primary.is-light {\\n background-color: #ebfffc;\\n color: #00947e; }\\n .tag:not(body).is-link {\\n background-color: #485fc7;\\n color: #fff; }\\n .tag:not(body).is-link.is-light {\\n background-color: #eff1fa;\\n color: #3850b7; }\\n .tag:not(body).is-info {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .tag:not(body).is-info.is-light {\\n background-color: #eff5fb;\\n color: #296fa8; }\\n .tag:not(body).is-success {\\n background-color: #48c78e;\\n color: #fff; }\\n .tag:not(body).is-success.is-light {\\n background-color: #effaf5;\\n color: #257953; }\\n .tag:not(body).is-warning {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .tag:not(body).is-warning.is-light {\\n background-color: #fffaeb;\\n color: #946c00; }\\n .tag:not(body).is-danger {\\n background-color: #f14668;\\n color: #fff; }\\n .tag:not(body).is-danger.is-light {\\n background-color: #feecf0;\\n color: #cc0f35; }\\n .tag:not(body).is-twitter {\\n background-color: #55acee;\\n color: #fff; }\\n .tag:not(body).is-linkedin {\\n background-color: #0077b5;\\n color: #fff; }\\n .tag:not(body).is-github {\\n background-color: #333;\\n color: #fff; }\\n .tag:not(body).is-normal {\\n font-size: 0.75rem; }\\n .tag:not(body).is-medium {\\n font-size: 1rem; }\\n .tag:not(body).is-large {\\n font-size: 1.25rem; }\\n .tag:not(body) .icon:first-child:not(:last-child) {\\n margin-left: -0.375em;\\n margin-right: 0.1875em; }\\n .tag:not(body) .icon:last-child:not(:first-child) {\\n margin-left: 0.1875em;\\n margin-right: -0.375em; }\\n .tag:not(body) .icon:first-child:last-child {\\n margin-left: -0.375em;\\n margin-right: -0.375em; }\\n .tag:not(body).is-delete {\\n margin-left: 1px;\\n padding: 0;\\n position: relative;\\n width: 2em; }\\n .tag:not(body).is-delete::before, .tag:not(body).is-delete::after {\\n background-color: currentColor;\\n content: \\\"\\\";\\n display: block;\\n left: 50%;\\n position: absolute;\\n top: 50%;\\n transform: translateX(-50%) translateY(-50%) rotate(45deg);\\n transform-origin: center center; }\\n .tag:not(body).is-delete::before {\\n height: 1px;\\n width: 50%; }\\n .tag:not(body).is-delete::after {\\n height: 50%;\\n width: 1px; }\\n .tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus {\\n background-color: #e8e8e8; }\\n .tag:not(body).is-delete:active {\\n background-color: #dbdbdb; }\\n .tag:not(body).is-rounded {\\n border-radius: 9999px; }\\n\\na.tag:hover {\\n text-decoration: underline; }\\n\\n.title,\\n.subtitle {\\n word-break: break-word; }\\n .title em,\\n .title span,\\n .subtitle em,\\n .subtitle span {\\n font-weight: inherit; }\\n .title sub,\\n .subtitle sub {\\n font-size: 0.75em; }\\n .title sup,\\n .subtitle sup {\\n font-size: 0.75em; }\\n .title .tag,\\n .subtitle .tag {\\n vertical-align: middle; }\\n\\n.title {\\n color: #363636;\\n font-size: 2rem;\\n font-weight: 600;\\n line-height: 1.125; }\\n .title strong {\\n color: inherit;\\n font-weight: inherit; }\\n .title:not(.is-spaced) + .subtitle {\\n margin-top: -1.25rem; }\\n .title.is-1 {\\n font-size: 3rem; }\\n .title.is-2 {\\n font-size: 2.5rem; }\\n .title.is-3 {\\n font-size: 2rem; }\\n .title.is-4 {\\n font-size: 1.5rem; }\\n .title.is-5 {\\n font-size: 1.25rem; }\\n .title.is-6 {\\n font-size: 1rem; }\\n .title.is-7 {\\n font-size: 0.75rem; }\\n\\n.subtitle {\\n color: #4a4a4a;\\n font-size: 1.25rem;\\n font-weight: 400;\\n line-height: 1.25; }\\n .subtitle strong {\\n color: #363636;\\n font-weight: 600; }\\n .subtitle:not(.is-spaced) + .title {\\n margin-top: -1.25rem; }\\n .subtitle.is-1 {\\n font-size: 3rem; }\\n .subtitle.is-2 {\\n font-size: 2.5rem; }\\n .subtitle.is-3 {\\n font-size: 2rem; }\\n .subtitle.is-4 {\\n font-size: 1.5rem; }\\n .subtitle.is-5 {\\n font-size: 1.25rem; }\\n .subtitle.is-6 {\\n font-size: 1rem; }\\n .subtitle.is-7 {\\n font-size: 0.75rem; }\\n\\n.heading {\\n display: block;\\n font-size: 11px;\\n letter-spacing: 1px;\\n margin-bottom: 5px;\\n text-transform: uppercase; }\\n\\n.number {\\n align-items: center;\\n background-color: whitesmoke;\\n border-radius: 9999px;\\n display: inline-flex;\\n font-size: 1.25rem;\\n height: 2em;\\n justify-content: center;\\n margin-right: 1.5rem;\\n min-width: 2.5em;\\n padding: 0.25rem 0.5rem;\\n text-align: center;\\n vertical-align: top; }\\n\\n/* Bulma Form */\\n.input, .textarea, .taginput .taginput-container.is-focusable, .select select {\\n background-color: white;\\n border-color: #dbdbdb;\\n border-radius: 4px;\\n color: #363636; }\\n .input::-moz-placeholder, .textarea::-moz-placeholder, .taginput .taginput-container.is-focusable::-moz-placeholder, .select select::-moz-placeholder {\\n color: rgba(54, 54, 54, 0.3); }\\n .input::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .taginput .taginput-container.is-focusable::-webkit-input-placeholder, .select select::-webkit-input-placeholder {\\n color: rgba(54, 54, 54, 0.3); }\\n .input:-moz-placeholder, .textarea:-moz-placeholder, .taginput .taginput-container.is-focusable:-moz-placeholder, .select select:-moz-placeholder {\\n color: rgba(54, 54, 54, 0.3); }\\n .input:-ms-input-placeholder, .textarea:-ms-input-placeholder, .taginput .taginput-container.is-focusable:-ms-input-placeholder, .select select:-ms-input-placeholder {\\n color: rgba(54, 54, 54, 0.3); }\\n .input:hover, .textarea:hover, .taginput .taginput-container.is-focusable:hover, .select select:hover, .is-hovered.input, .is-hovered.textarea, .taginput .is-hovered.taginput-container.is-focusable, .select select.is-hovered {\\n border-color: #b5b5b5; }\\n .input:focus, .textarea:focus, .taginput .taginput-container.is-focusable:focus, .select select:focus, .is-focused.input, .is-focused.textarea, .taginput .is-focused.taginput-container.is-focusable, .select select.is-focused, .input:active, .textarea:active, .taginput .taginput-container.is-focusable:active, .select select:active, .is-active.input, .is-active.textarea, .taginput .is-active.taginput-container.is-focusable, .select select.is-active {\\n border-color: #485fc7;\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .input[disabled], .textarea[disabled], .taginput .taginput-container.is-focusable[disabled], .select select[disabled],\\n fieldset[disabled] .input,\\n fieldset[disabled] .textarea,\\n fieldset[disabled] .taginput .taginput-container.is-focusable,\\n .taginput fieldset[disabled] .taginput-container.is-focusable,\\n fieldset[disabled] .select select,\\n .select fieldset[disabled] select {\\n background-color: whitesmoke;\\n border-color: whitesmoke;\\n box-shadow: none;\\n color: #7a7a7a; }\\n .input[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .taginput .taginput-container.is-focusable[disabled]::-moz-placeholder, .select select[disabled]::-moz-placeholder,\\n fieldset[disabled] .input::-moz-placeholder,\\n fieldset[disabled] .textarea::-moz-placeholder,\\n fieldset[disabled] .taginput .taginput-container.is-focusable::-moz-placeholder,\\n .taginput fieldset[disabled] .taginput-container.is-focusable::-moz-placeholder,\\n fieldset[disabled] .select select::-moz-placeholder,\\n .select fieldset[disabled] select::-moz-placeholder {\\n color: rgba(122, 122, 122, 0.3); }\\n .input[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .taginput .taginput-container.is-focusable[disabled]::-webkit-input-placeholder, .select select[disabled]::-webkit-input-placeholder,\\n fieldset[disabled] .input::-webkit-input-placeholder,\\n fieldset[disabled] .textarea::-webkit-input-placeholder,\\n fieldset[disabled] .taginput .taginput-container.is-focusable::-webkit-input-placeholder,\\n .taginput fieldset[disabled] .taginput-container.is-focusable::-webkit-input-placeholder,\\n fieldset[disabled] .select select::-webkit-input-placeholder,\\n .select fieldset[disabled] select::-webkit-input-placeholder {\\n color: rgba(122, 122, 122, 0.3); }\\n .input[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .taginput .taginput-container.is-focusable[disabled]:-moz-placeholder, .select select[disabled]:-moz-placeholder,\\n fieldset[disabled] .input:-moz-placeholder,\\n fieldset[disabled] .textarea:-moz-placeholder,\\n fieldset[disabled] .taginput .taginput-container.is-focusable:-moz-placeholder,\\n .taginput fieldset[disabled] .taginput-container.is-focusable:-moz-placeholder,\\n fieldset[disabled] .select select:-moz-placeholder,\\n .select fieldset[disabled] select:-moz-placeholder {\\n color: rgba(122, 122, 122, 0.3); }\\n .input[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .taginput .taginput-container.is-focusable[disabled]:-ms-input-placeholder, .select select[disabled]:-ms-input-placeholder,\\n fieldset[disabled] .input:-ms-input-placeholder,\\n fieldset[disabled] .textarea:-ms-input-placeholder,\\n fieldset[disabled] .taginput .taginput-container.is-focusable:-ms-input-placeholder,\\n .taginput fieldset[disabled] .taginput-container.is-focusable:-ms-input-placeholder,\\n fieldset[disabled] .select select:-ms-input-placeholder,\\n .select fieldset[disabled] select:-ms-input-placeholder {\\n color: rgba(122, 122, 122, 0.3); }\\n\\n.input, .textarea, .taginput .taginput-container.is-focusable {\\n box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05);\\n max-width: 100%;\\n width: 100%; }\\n .input[readonly], .textarea[readonly], .taginput .taginput-container.is-focusable[readonly] {\\n box-shadow: none; }\\n .is-white.input, .is-white.textarea, .taginput .is-white.taginput-container.is-focusable {\\n border-color: white; }\\n .is-white.input:focus, .is-white.textarea:focus, .taginput .is-white.taginput-container.is-focusable:focus, .is-white.is-focused.input, .is-white.is-focused.textarea, .taginput .is-white.is-focused.taginput-container.is-focusable, .is-white.input:active, .is-white.textarea:active, .taginput .is-white.taginput-container.is-focusable:active, .is-white.is-active.input, .is-white.is-active.textarea, .taginput .is-white.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }\\n .is-black.input, .is-black.textarea, .taginput .is-black.taginput-container.is-focusable {\\n border-color: #0a0a0a; }\\n .is-black.input:focus, .is-black.textarea:focus, .taginput .is-black.taginput-container.is-focusable:focus, .is-black.is-focused.input, .is-black.is-focused.textarea, .taginput .is-black.is-focused.taginput-container.is-focusable, .is-black.input:active, .is-black.textarea:active, .taginput .is-black.taginput-container.is-focusable:active, .is-black.is-active.input, .is-black.is-active.textarea, .taginput .is-black.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }\\n .is-light.input, .is-light.textarea, .taginput .is-light.taginput-container.is-focusable {\\n border-color: whitesmoke; }\\n .is-light.input:focus, .is-light.textarea:focus, .taginput .is-light.taginput-container.is-focusable:focus, .is-light.is-focused.input, .is-light.is-focused.textarea, .taginput .is-light.is-focused.taginput-container.is-focusable, .is-light.input:active, .is-light.textarea:active, .taginput .is-light.taginput-container.is-focusable:active, .is-light.is-active.input, .is-light.is-active.textarea, .taginput .is-light.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }\\n .is-dark.input, .is-dark.textarea, .taginput .is-dark.taginput-container.is-focusable {\\n border-color: #363636; }\\n .is-dark.input:focus, .is-dark.textarea:focus, .taginput .is-dark.taginput-container.is-focusable:focus, .is-dark.is-focused.input, .is-dark.is-focused.textarea, .taginput .is-dark.is-focused.taginput-container.is-focusable, .is-dark.input:active, .is-dark.textarea:active, .taginput .is-dark.taginput-container.is-focusable:active, .is-dark.is-active.input, .is-dark.is-active.textarea, .taginput .is-dark.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }\\n .is-primary.input, .is-primary.textarea, .taginput .is-primary.taginput-container.is-focusable {\\n border-color: #00d1b2; }\\n .is-primary.input:focus, .is-primary.textarea:focus, .taginput .is-primary.taginput-container.is-focusable:focus, .is-primary.is-focused.input, .is-primary.is-focused.textarea, .taginput .is-primary.is-focused.taginput-container.is-focusable, .is-primary.input:active, .is-primary.textarea:active, .taginput .is-primary.taginput-container.is-focusable:active, .is-primary.is-active.input, .is-primary.is-active.textarea, .taginput .is-primary.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }\\n .is-link.input, .is-link.textarea, .taginput .is-link.taginput-container.is-focusable {\\n border-color: #485fc7; }\\n .is-link.input:focus, .is-link.textarea:focus, .taginput .is-link.taginput-container.is-focusable:focus, .is-link.is-focused.input, .is-link.is-focused.textarea, .taginput .is-link.is-focused.taginput-container.is-focusable, .is-link.input:active, .is-link.textarea:active, .taginput .is-link.taginput-container.is-focusable:active, .is-link.is-active.input, .is-link.is-active.textarea, .taginput .is-link.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .is-info.input, .is-info.textarea, .taginput .is-info.taginput-container.is-focusable {\\n border-color: #3e8ed0; }\\n .is-info.input:focus, .is-info.textarea:focus, .taginput .is-info.taginput-container.is-focusable:focus, .is-info.is-focused.input, .is-info.is-focused.textarea, .taginput .is-info.is-focused.taginput-container.is-focusable, .is-info.input:active, .is-info.textarea:active, .taginput .is-info.taginput-container.is-focusable:active, .is-info.is-active.input, .is-info.is-active.textarea, .taginput .is-info.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(62, 142, 208, 0.25); }\\n .is-success.input, .is-success.textarea, .taginput .is-success.taginput-container.is-focusable {\\n border-color: #48c78e; }\\n .is-success.input:focus, .is-success.textarea:focus, .taginput .is-success.taginput-container.is-focusable:focus, .is-success.is-focused.input, .is-success.is-focused.textarea, .taginput .is-success.is-focused.taginput-container.is-focusable, .is-success.input:active, .is-success.textarea:active, .taginput .is-success.taginput-container.is-focusable:active, .is-success.is-active.input, .is-success.is-active.textarea, .taginput .is-success.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(72, 199, 142, 0.25); }\\n .is-warning.input, .is-warning.textarea, .taginput .is-warning.taginput-container.is-focusable {\\n border-color: #ffe08a; }\\n .is-warning.input:focus, .is-warning.textarea:focus, .taginput .is-warning.taginput-container.is-focusable:focus, .is-warning.is-focused.input, .is-warning.is-focused.textarea, .taginput .is-warning.is-focused.taginput-container.is-focusable, .is-warning.input:active, .is-warning.textarea:active, .taginput .is-warning.taginput-container.is-focusable:active, .is-warning.is-active.input, .is-warning.is-active.textarea, .taginput .is-warning.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(255, 224, 138, 0.25); }\\n .is-danger.input, .is-danger.textarea, .taginput .is-danger.taginput-container.is-focusable {\\n border-color: #f14668; }\\n .is-danger.input:focus, .is-danger.textarea:focus, .taginput .is-danger.taginput-container.is-focusable:focus, .is-danger.is-focused.input, .is-danger.is-focused.textarea, .taginput .is-danger.is-focused.taginput-container.is-focusable, .is-danger.input:active, .is-danger.textarea:active, .taginput .is-danger.taginput-container.is-focusable:active, .is-danger.is-active.input, .is-danger.is-active.textarea, .taginput .is-danger.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); }\\n .is-twitter.input, .is-twitter.textarea, .taginput .is-twitter.taginput-container.is-focusable {\\n border-color: #55acee; }\\n .is-twitter.input:focus, .is-twitter.textarea:focus, .taginput .is-twitter.taginput-container.is-focusable:focus, .is-twitter.is-focused.input, .is-twitter.is-focused.textarea, .taginput .is-twitter.is-focused.taginput-container.is-focusable, .is-twitter.input:active, .is-twitter.textarea:active, .taginput .is-twitter.taginput-container.is-focusable:active, .is-twitter.is-active.input, .is-twitter.is-active.textarea, .taginput .is-twitter.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(85, 172, 238, 0.25); }\\n .is-linkedin.input, .is-linkedin.textarea, .taginput .is-linkedin.taginput-container.is-focusable {\\n border-color: #0077b5; }\\n .is-linkedin.input:focus, .is-linkedin.textarea:focus, .taginput .is-linkedin.taginput-container.is-focusable:focus, .is-linkedin.is-focused.input, .is-linkedin.is-focused.textarea, .taginput .is-linkedin.is-focused.taginput-container.is-focusable, .is-linkedin.input:active, .is-linkedin.textarea:active, .taginput .is-linkedin.taginput-container.is-focusable:active, .is-linkedin.is-active.input, .is-linkedin.is-active.textarea, .taginput .is-linkedin.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(0, 119, 181, 0.25); }\\n .is-github.input, .is-github.textarea, .taginput .is-github.taginput-container.is-focusable {\\n border-color: #333; }\\n .is-github.input:focus, .is-github.textarea:focus, .taginput .is-github.taginput-container.is-focusable:focus, .is-github.is-focused.input, .is-github.is-focused.textarea, .taginput .is-github.is-focused.taginput-container.is-focusable, .is-github.input:active, .is-github.textarea:active, .taginput .is-github.taginput-container.is-focusable:active, .is-github.is-active.input, .is-github.is-active.textarea, .taginput .is-github.is-active.taginput-container.is-focusable {\\n box-shadow: 0 0 0 0.125em rgba(51, 51, 51, 0.25); }\\n .is-small.input, .is-small.textarea, .taginput .is-small.taginput-container.is-focusable {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .is-medium.input, .is-medium.textarea, .taginput .is-medium.taginput-container.is-focusable {\\n font-size: 1.25rem; }\\n .is-large.input, .is-large.textarea, .taginput .is-large.taginput-container.is-focusable {\\n font-size: 1.5rem; }\\n .is-fullwidth.input, .is-fullwidth.textarea, .taginput .is-fullwidth.taginput-container.is-focusable {\\n display: block;\\n width: 100%; }\\n .is-inline.input, .is-inline.textarea, .taginput .is-inline.taginput-container.is-focusable {\\n display: inline;\\n width: auto; }\\n\\n.input.is-rounded {\\n border-radius: 9999px;\\n padding-left: calc(calc(0.75em - 1px) + 0.375em);\\n padding-right: calc(calc(0.75em - 1px) + 0.375em); }\\n\\n.input.is-static {\\n background-color: transparent;\\n border-color: transparent;\\n box-shadow: none;\\n padding-left: 0;\\n padding-right: 0; }\\n\\n.textarea {\\n display: block;\\n max-width: 100%;\\n min-width: 100%;\\n padding: calc(0.75em - 1px);\\n resize: vertical; }\\n .textarea:not([rows]) {\\n max-height: 40em;\\n min-height: 8em; }\\n .textarea[rows] {\\n height: initial; }\\n .textarea.has-fixed-size {\\n resize: none; }\\n\\n.checkbox, .radio {\\n cursor: pointer;\\n display: inline-block;\\n line-height: 1.25;\\n position: relative; }\\n .checkbox input, .radio input {\\n cursor: pointer; }\\n .checkbox:hover, .radio:hover {\\n color: #363636; }\\n .checkbox[disabled], .radio[disabled],\\n fieldset[disabled] .checkbox,\\n fieldset[disabled] .radio,\\n .checkbox input[disabled],\\n .radio input[disabled] {\\n color: #7a7a7a;\\n cursor: not-allowed; }\\n\\n.radio + .radio {\\n margin-left: 0.5em; }\\n\\n.select {\\n display: inline-block;\\n max-width: 100%;\\n position: relative;\\n vertical-align: top; }\\n .select:not(.is-multiple) {\\n height: 2.5em; }\\n .select:not(.is-multiple):not(.is-loading)::after {\\n border-color: #485fc7;\\n right: 1.125em;\\n z-index: 4; }\\n .select.is-rounded select {\\n border-radius: 9999px;\\n padding-left: 1em; }\\n .select select {\\n cursor: pointer;\\n display: block;\\n font-size: 1em;\\n max-width: 100%;\\n outline: none; }\\n .select select::-ms-expand {\\n display: none; }\\n .select select[disabled]:hover,\\n fieldset[disabled] .select select:hover {\\n border-color: whitesmoke; }\\n .select select:not([multiple]) {\\n padding-right: 2.5em; }\\n .select select[multiple] {\\n height: auto;\\n padding: 0; }\\n .select select[multiple] option {\\n padding: 0.5em 1em; }\\n .select:not(.is-multiple):not(.is-loading):hover::after {\\n border-color: #363636; }\\n .select.is-white:not(:hover)::after {\\n border-color: white; }\\n .select.is-white select {\\n border-color: white; }\\n .select.is-white select:hover, .select.is-white select.is-hovered {\\n border-color: #f2f2f2; }\\n .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }\\n .select.is-black:not(:hover)::after {\\n border-color: #0a0a0a; }\\n .select.is-black select {\\n border-color: #0a0a0a; }\\n .select.is-black select:hover, .select.is-black select.is-hovered {\\n border-color: black; }\\n .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }\\n .select.is-light:not(:hover)::after {\\n border-color: whitesmoke; }\\n .select.is-light select {\\n border-color: whitesmoke; }\\n .select.is-light select:hover, .select.is-light select.is-hovered {\\n border-color: #e8e8e8; }\\n .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }\\n .select.is-dark:not(:hover)::after {\\n border-color: #363636; }\\n .select.is-dark select {\\n border-color: #363636; }\\n .select.is-dark select:hover, .select.is-dark select.is-hovered {\\n border-color: #292929; }\\n .select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }\\n .select.is-primary:not(:hover)::after {\\n border-color: #00d1b2; }\\n .select.is-primary select {\\n border-color: #00d1b2; }\\n .select.is-primary select:hover, .select.is-primary select.is-hovered {\\n border-color: #00b89c; }\\n .select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }\\n .select.is-link:not(:hover)::after {\\n border-color: #485fc7; }\\n .select.is-link select {\\n border-color: #485fc7; }\\n .select.is-link select:hover, .select.is-link select.is-hovered {\\n border-color: #3a51bb; }\\n .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .select.is-info:not(:hover)::after {\\n border-color: #3e8ed0; }\\n .select.is-info select {\\n border-color: #3e8ed0; }\\n .select.is-info select:hover, .select.is-info select.is-hovered {\\n border-color: #3082c5; }\\n .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(62, 142, 208, 0.25); }\\n .select.is-success:not(:hover)::after {\\n border-color: #48c78e; }\\n .select.is-success select {\\n border-color: #48c78e; }\\n .select.is-success select:hover, .select.is-success select.is-hovered {\\n border-color: #3abb81; }\\n .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(72, 199, 142, 0.25); }\\n .select.is-warning:not(:hover)::after {\\n border-color: #ffe08a; }\\n .select.is-warning select {\\n border-color: #ffe08a; }\\n .select.is-warning select:hover, .select.is-warning select.is-hovered {\\n border-color: #ffd970; }\\n .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(255, 224, 138, 0.25); }\\n .select.is-danger:not(:hover)::after {\\n border-color: #f14668; }\\n .select.is-danger select {\\n border-color: #f14668; }\\n .select.is-danger select:hover, .select.is-danger select.is-hovered {\\n border-color: #ef2e55; }\\n .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); }\\n .select.is-twitter:not(:hover)::after {\\n border-color: #55acee; }\\n .select.is-twitter select {\\n border-color: #55acee; }\\n .select.is-twitter select:hover, .select.is-twitter select.is-hovered {\\n border-color: #3ea1ec; }\\n .select.is-twitter select:focus, .select.is-twitter select.is-focused, .select.is-twitter select:active, .select.is-twitter select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(85, 172, 238, 0.25); }\\n .select.is-linkedin:not(:hover)::after {\\n border-color: #0077b5; }\\n .select.is-linkedin select {\\n border-color: #0077b5; }\\n .select.is-linkedin select:hover, .select.is-linkedin select.is-hovered {\\n border-color: #00669c; }\\n .select.is-linkedin select:focus, .select.is-linkedin select.is-focused, .select.is-linkedin select:active, .select.is-linkedin select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(0, 119, 181, 0.25); }\\n .select.is-github:not(:hover)::after {\\n border-color: #333; }\\n .select.is-github select {\\n border-color: #333; }\\n .select.is-github select:hover, .select.is-github select.is-hovered {\\n border-color: #262626; }\\n .select.is-github select:focus, .select.is-github select.is-focused, .select.is-github select:active, .select.is-github select.is-active {\\n box-shadow: 0 0 0 0.125em rgba(51, 51, 51, 0.25); }\\n .select.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .select.is-medium {\\n font-size: 1.25rem; }\\n .select.is-large {\\n font-size: 1.5rem; }\\n .select.is-disabled::after {\\n border-color: #7a7a7a; }\\n .select.is-fullwidth {\\n width: 100%; }\\n .select.is-fullwidth select {\\n width: 100%; }\\n .select.is-loading::after {\\n margin-top: 0;\\n position: absolute;\\n right: 0.625em;\\n top: 0.625em;\\n transform: none; }\\n .select.is-loading.is-small:after {\\n font-size: 0.75rem; }\\n .select.is-loading.is-medium:after {\\n font-size: 1.25rem; }\\n .select.is-loading.is-large:after {\\n font-size: 1.5rem; }\\n\\n.file {\\n align-items: stretch;\\n display: flex;\\n justify-content: flex-start;\\n position: relative; }\\n .file.is-white .file-cta {\\n background-color: white;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta {\\n background-color: #f9f9f9;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25);\\n color: #0a0a0a; }\\n .file.is-white:active .file-cta, .file.is-white.is-active .file-cta {\\n background-color: #f2f2f2;\\n border-color: transparent;\\n color: #0a0a0a; }\\n .file.is-black .file-cta {\\n background-color: #0a0a0a;\\n border-color: transparent;\\n color: white; }\\n .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta {\\n background-color: #040404;\\n border-color: transparent;\\n color: white; }\\n .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25);\\n color: white; }\\n .file.is-black:active .file-cta, .file.is-black.is-active .file-cta {\\n background-color: black;\\n border-color: transparent;\\n color: white; }\\n .file.is-light .file-cta {\\n background-color: whitesmoke;\\n border-color: transparent;\\n color: #363636; }\\n .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta {\\n background-color: #eeeeee;\\n border-color: transparent;\\n color: #363636; }\\n .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25);\\n color: #363636; }\\n .file.is-light:active .file-cta, .file.is-light.is-active .file-cta {\\n background-color: #e8e8e8;\\n border-color: transparent;\\n color: #363636; }\\n .file.is-dark .file-cta {\\n background-color: #363636;\\n border-color: transparent;\\n color: whitesmoke; }\\n .file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta {\\n background-color: #2f2f2f;\\n border-color: transparent;\\n color: whitesmoke; }\\n .file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25);\\n color: whitesmoke; }\\n .file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta {\\n background-color: #292929;\\n border-color: transparent;\\n color: whitesmoke; }\\n .file.is-primary .file-cta {\\n background-color: #00d1b2;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta {\\n background-color: #00c4a7;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25);\\n color: #fff; }\\n .file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta {\\n background-color: #00b89c;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-link .file-cta {\\n background-color: #485fc7;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta {\\n background-color: #3e56c4;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(72, 95, 199, 0.25);\\n color: #fff; }\\n .file.is-link:active .file-cta, .file.is-link.is-active .file-cta {\\n background-color: #3a51bb;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-info .file-cta {\\n background-color: #3e8ed0;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {\\n background-color: #3488ce;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(62, 142, 208, 0.25);\\n color: #fff; }\\n .file.is-info:active .file-cta, .file.is-info.is-active .file-cta {\\n background-color: #3082c5;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-success .file-cta {\\n background-color: #48c78e;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta {\\n background-color: #3ec487;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(72, 199, 142, 0.25);\\n color: #fff; }\\n .file.is-success:active .file-cta, .file.is-success.is-active .file-cta {\\n background-color: #3abb81;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-warning .file-cta {\\n background-color: #ffe08a;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta {\\n background-color: #ffdc7d;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(255, 224, 138, 0.25);\\n color: rgba(0, 0, 0, 0.7); }\\n .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta {\\n background-color: #ffd970;\\n border-color: transparent;\\n color: rgba(0, 0, 0, 0.7); }\\n .file.is-danger .file-cta {\\n background-color: #f14668;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta {\\n background-color: #f03a5f;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.25);\\n color: #fff; }\\n .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta {\\n background-color: #ef2e55;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-twitter .file-cta {\\n background-color: #55acee;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-twitter:hover .file-cta, .file.is-twitter.is-hovered .file-cta {\\n background-color: #49a6ed;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-twitter:focus .file-cta, .file.is-twitter.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(85, 172, 238, 0.25);\\n color: #fff; }\\n .file.is-twitter:active .file-cta, .file.is-twitter.is-active .file-cta {\\n background-color: #3ea1ec;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-linkedin .file-cta {\\n background-color: #0077b5;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-linkedin:hover .file-cta, .file.is-linkedin.is-hovered .file-cta {\\n background-color: #006fa8;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-linkedin:focus .file-cta, .file.is-linkedin.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(0, 119, 181, 0.25);\\n color: #fff; }\\n .file.is-linkedin:active .file-cta, .file.is-linkedin.is-active .file-cta {\\n background-color: #00669c;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-github .file-cta {\\n background-color: #333;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-github:hover .file-cta, .file.is-github.is-hovered .file-cta {\\n background-color: #2d2d2d;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-github:focus .file-cta, .file.is-github.is-focused .file-cta {\\n border-color: transparent;\\n box-shadow: 0 0 0.5em rgba(51, 51, 51, 0.25);\\n color: #fff; }\\n .file.is-github:active .file-cta, .file.is-github.is-active .file-cta {\\n background-color: #262626;\\n border-color: transparent;\\n color: #fff; }\\n .file.is-small {\\n font-size: 0.75rem; }\\n .file.is-normal {\\n font-size: 1rem; }\\n .file.is-medium {\\n font-size: 1.25rem; }\\n .file.is-medium .file-icon .fa {\\n font-size: 21px; }\\n .file.is-large {\\n font-size: 1.5rem; }\\n .file.is-large .file-icon .fa {\\n font-size: 28px; }\\n .file.has-name .file-cta {\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0; }\\n .file.has-name .file-name {\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n .file.has-name.is-empty .file-cta {\\n border-radius: 4px; }\\n .file.has-name.is-empty .file-name {\\n display: none; }\\n .file.is-boxed .file-label {\\n flex-direction: column; }\\n .file.is-boxed .file-cta {\\n flex-direction: column;\\n height: auto;\\n padding: 1em 3em; }\\n .file.is-boxed .file-name {\\n border-width: 0 1px 1px; }\\n .file.is-boxed .file-icon {\\n height: 1.5em;\\n width: 1.5em; }\\n .file.is-boxed .file-icon .fa {\\n font-size: 21px; }\\n .file.is-boxed.is-small .file-icon .fa {\\n font-size: 14px; }\\n .file.is-boxed.is-medium .file-icon .fa {\\n font-size: 28px; }\\n .file.is-boxed.is-large .file-icon .fa {\\n font-size: 35px; }\\n .file.is-boxed.has-name .file-cta {\\n border-radius: 4px 4px 0 0; }\\n .file.is-boxed.has-name .file-name {\\n border-radius: 0 0 4px 4px;\\n border-width: 0 1px 1px; }\\n .file.is-centered {\\n justify-content: center; }\\n .file.is-fullwidth .file-label {\\n width: 100%; }\\n .file.is-fullwidth .file-name {\\n flex-grow: 1;\\n max-width: none; }\\n .file.is-right {\\n justify-content: flex-end; }\\n .file.is-right .file-cta {\\n border-radius: 0 4px 4px 0; }\\n .file.is-right .file-name {\\n border-radius: 4px 0 0 4px;\\n border-width: 1px 0 1px 1px;\\n order: -1; }\\n\\n.file-label {\\n align-items: stretch;\\n display: flex;\\n cursor: pointer;\\n justify-content: flex-start;\\n overflow: hidden;\\n position: relative; }\\n .file-label:hover .file-cta {\\n background-color: #eeeeee;\\n color: #363636; }\\n .file-label:hover .file-name {\\n border-color: #d5d5d5; }\\n .file-label:active .file-cta {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .file-label:active .file-name {\\n border-color: #cfcfcf; }\\n\\n.file-input {\\n height: 100%;\\n left: 0;\\n opacity: 0;\\n outline: none;\\n position: absolute;\\n top: 0;\\n width: 100%; }\\n\\n.file-cta,\\n.file-name {\\n border-color: #dbdbdb;\\n border-radius: 4px;\\n font-size: 1em;\\n padding-left: 1em;\\n padding-right: 1em;\\n white-space: nowrap; }\\n\\n.file-cta {\\n background-color: whitesmoke;\\n color: #4a4a4a; }\\n\\n.file-name {\\n border-color: #dbdbdb;\\n border-style: solid;\\n border-width: 1px 1px 1px 0;\\n display: block;\\n max-width: 16em;\\n overflow: hidden;\\n text-align: inherit;\\n text-overflow: ellipsis; }\\n\\n.file-icon {\\n align-items: center;\\n display: flex;\\n height: 1em;\\n justify-content: center;\\n margin-right: 0.5em;\\n width: 1em; }\\n .file-icon .fa {\\n font-size: 14px; }\\n\\n.label {\\n color: #363636;\\n display: block;\\n font-size: 1rem;\\n font-weight: 700; }\\n .label:not(:last-child) {\\n margin-bottom: 0.5em; }\\n .label.is-small {\\n font-size: 0.75rem; }\\n .label.is-medium {\\n font-size: 1.25rem; }\\n .label.is-large {\\n font-size: 1.5rem; }\\n\\n.help {\\n display: block;\\n font-size: 0.75rem;\\n margin-top: 0.25rem; }\\n .help.is-white {\\n color: white; }\\n .help.is-black {\\n color: #0a0a0a; }\\n .help.is-light {\\n color: whitesmoke; }\\n .help.is-dark {\\n color: #363636; }\\n .help.is-primary {\\n color: #00d1b2; }\\n .help.is-link {\\n color: #485fc7; }\\n .help.is-info {\\n color: #3e8ed0; }\\n .help.is-success {\\n color: #48c78e; }\\n .help.is-warning {\\n color: #ffe08a; }\\n .help.is-danger {\\n color: #f14668; }\\n .help.is-twitter {\\n color: #55acee; }\\n .help.is-linkedin {\\n color: #0077b5; }\\n .help.is-github {\\n color: #333; }\\n\\n.field:not(:last-child) {\\n margin-bottom: 0.75rem; }\\n\\n.field.has-addons {\\n display: flex;\\n justify-content: flex-start; }\\n .field.has-addons .control:not(:last-child) {\\n margin-right: -1px; }\\n .field.has-addons .control:not(:first-child):not(:last-child) .button,\\n .field.has-addons .control:not(:first-child):not(:last-child) .input,\\n .field.has-addons .control:not(:first-child):not(:last-child) .select select {\\n border-radius: 0; }\\n .field.has-addons .control:first-child:not(:only-child) .button,\\n .field.has-addons .control:first-child:not(:only-child) .input,\\n .field.has-addons .control:first-child:not(:only-child) .select select {\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0; }\\n .field.has-addons .control:last-child:not(:only-child) .button,\\n .field.has-addons .control:last-child:not(:only-child) .input,\\n .field.has-addons .control:last-child:not(:only-child) .select select {\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button:not([disabled]).is-hovered,\\n .field.has-addons .control .input:not([disabled]):hover,\\n .field.has-addons .control .input:not([disabled]).is-hovered,\\n .field.has-addons .control .select select:not([disabled]):hover,\\n .field.has-addons .control .select select:not([disabled]).is-hovered {\\n z-index: 2; }\\n .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button:not([disabled]).is-focused, .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button:not([disabled]).is-active,\\n .field.has-addons .control .input:not([disabled]):focus,\\n .field.has-addons .control .input:not([disabled]).is-focused,\\n .field.has-addons .control .input:not([disabled]):active,\\n .field.has-addons .control .input:not([disabled]).is-active,\\n .field.has-addons .control .select select:not([disabled]):focus,\\n .field.has-addons .control .select select:not([disabled]).is-focused,\\n .field.has-addons .control .select select:not([disabled]):active,\\n .field.has-addons .control .select select:not([disabled]).is-active {\\n z-index: 3; }\\n .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button:not([disabled]).is-focused:hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button:not([disabled]).is-active:hover,\\n .field.has-addons .control .input:not([disabled]):focus:hover,\\n .field.has-addons .control .input:not([disabled]).is-focused:hover,\\n .field.has-addons .control .input:not([disabled]):active:hover,\\n .field.has-addons .control .input:not([disabled]).is-active:hover,\\n .field.has-addons .control .select select:not([disabled]):focus:hover,\\n .field.has-addons .control .select select:not([disabled]).is-focused:hover,\\n .field.has-addons .control .select select:not([disabled]):active:hover,\\n .field.has-addons .control .select select:not([disabled]).is-active:hover {\\n z-index: 4; }\\n .field.has-addons .control.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .field.has-addons.has-addons-centered {\\n justify-content: center; }\\n .field.has-addons.has-addons-right {\\n justify-content: flex-end; }\\n .field.has-addons.has-addons-fullwidth .control {\\n flex-grow: 1;\\n flex-shrink: 0; }\\n\\n.field.is-grouped {\\n display: flex;\\n justify-content: flex-start; }\\n .field.is-grouped > .control {\\n flex-shrink: 0; }\\n .field.is-grouped > .control:not(:last-child) {\\n margin-bottom: 0;\\n margin-right: 0.75rem; }\\n .field.is-grouped > .control.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .field.is-grouped.is-grouped-centered {\\n justify-content: center; }\\n .field.is-grouped.is-grouped-right {\\n justify-content: flex-end; }\\n .field.is-grouped.is-grouped-multiline {\\n flex-wrap: wrap; }\\n .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) {\\n margin-bottom: 0.75rem; }\\n .field.is-grouped.is-grouped-multiline:last-child {\\n margin-bottom: -0.75rem; }\\n .field.is-grouped.is-grouped-multiline:not(:last-child) {\\n margin-bottom: 0; }\\n\\n@media screen and (min-width: 769px), print {\\n .field.is-horizontal {\\n display: flex; } }\\n\\n.field-label .label {\\n font-size: inherit; }\\n\\n@media screen and (max-width: 768px) {\\n .field-label {\\n margin-bottom: 0.5rem; } }\\n\\n@media screen and (min-width: 769px), print {\\n .field-label {\\n flex-basis: 0;\\n flex-grow: 1;\\n flex-shrink: 0;\\n margin-right: 1.5rem;\\n text-align: right; }\\n .field-label.is-small {\\n font-size: 0.75rem;\\n padding-top: 0.375em; }\\n .field-label.is-normal {\\n padding-top: 0.375em; }\\n .field-label.is-medium {\\n font-size: 1.25rem;\\n padding-top: 0.375em; }\\n .field-label.is-large {\\n font-size: 1.5rem;\\n padding-top: 0.375em; } }\\n\\n.field-body .field .field {\\n margin-bottom: 0; }\\n\\n@media screen and (min-width: 769px), print {\\n .field-body {\\n display: flex;\\n flex-basis: 0;\\n flex-grow: 5;\\n flex-shrink: 1; }\\n .field-body .field {\\n margin-bottom: 0; }\\n .field-body > .field {\\n flex-shrink: 1; }\\n .field-body > .field:not(.is-narrow) {\\n flex-grow: 1; }\\n .field-body > .field:not(:last-child) {\\n margin-right: 0.75rem; } }\\n\\n.control {\\n box-sizing: border-box;\\n clear: both;\\n font-size: 1rem;\\n position: relative;\\n text-align: inherit; }\\n .control.has-icons-left .input:focus ~ .icon,\\n .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon,\\n .control.has-icons-right .select:focus ~ .icon {\\n color: #4a4a4a; }\\n .control.has-icons-left .input.is-small ~ .icon,\\n .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon,\\n .control.has-icons-right .select.is-small ~ .icon {\\n font-size: 0.75rem; }\\n .control.has-icons-left .input.is-medium ~ .icon,\\n .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon,\\n .control.has-icons-right .select.is-medium ~ .icon {\\n font-size: 1.25rem; }\\n .control.has-icons-left .input.is-large ~ .icon,\\n .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon,\\n .control.has-icons-right .select.is-large ~ .icon {\\n font-size: 1.5rem; }\\n .control.has-icons-left .icon, .control.has-icons-right .icon {\\n color: #dbdbdb;\\n height: 2.5em;\\n pointer-events: none;\\n position: absolute;\\n top: 0;\\n width: 2.5em;\\n z-index: 4; }\\n .control.has-icons-left .input,\\n .control.has-icons-left .select select {\\n padding-left: 2.5em; }\\n .control.has-icons-left .icon.is-left {\\n left: 0; }\\n .control.has-icons-right .input,\\n .control.has-icons-right .select select {\\n padding-right: 2.5em; }\\n .control.has-icons-right .icon.is-right {\\n right: 0; }\\n .control.is-loading::after {\\n position: absolute !important;\\n right: 0.625em;\\n top: 0.625em;\\n z-index: 4; }\\n .control.is-loading.is-small:after {\\n font-size: 0.75rem; }\\n .control.is-loading.is-medium:after {\\n font-size: 1.25rem; }\\n .control.is-loading.is-large:after {\\n font-size: 1.5rem; }\\n\\n/* Bulma Components */\\n.breadcrumb {\\n font-size: 1rem;\\n white-space: nowrap; }\\n .breadcrumb a {\\n align-items: center;\\n color: #485fc7;\\n display: flex;\\n justify-content: center;\\n padding: 0 0.75em; }\\n .breadcrumb a:hover {\\n color: #363636; }\\n .breadcrumb li {\\n align-items: center;\\n display: flex; }\\n .breadcrumb li:first-child a {\\n padding-left: 0; }\\n .breadcrumb li.is-active a {\\n color: #363636;\\n cursor: default;\\n pointer-events: none; }\\n .breadcrumb li + li::before {\\n color: #b5b5b5;\\n content: \\\"\\\\0002f\\\"; }\\n .breadcrumb ul,\\n .breadcrumb ol {\\n align-items: flex-start;\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: flex-start; }\\n .breadcrumb .icon:first-child {\\n margin-right: 0.5em; }\\n .breadcrumb .icon:last-child {\\n margin-left: 0.5em; }\\n .breadcrumb.is-centered ol,\\n .breadcrumb.is-centered ul {\\n justify-content: center; }\\n .breadcrumb.is-right ol,\\n .breadcrumb.is-right ul {\\n justify-content: flex-end; }\\n .breadcrumb.is-small {\\n font-size: 0.75rem; }\\n .breadcrumb.is-medium {\\n font-size: 1.25rem; }\\n .breadcrumb.is-large {\\n font-size: 1.5rem; }\\n .breadcrumb.has-arrow-separator li + li::before {\\n content: \\\"\\\\02192\\\"; }\\n .breadcrumb.has-bullet-separator li + li::before {\\n content: \\\"\\\\02022\\\"; }\\n .breadcrumb.has-dot-separator li + li::before {\\n content: \\\"\\\\000b7\\\"; }\\n .breadcrumb.has-succeeds-separator li + li::before {\\n content: \\\"\\\\0227B\\\"; }\\n\\n.card {\\n background-color: white;\\n border-radius: 0.25rem;\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02);\\n color: #4a4a4a;\\n max-width: 100%;\\n position: relative; }\\n\\n.card-header:first-child, .card-content:first-child, .card-footer:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem; }\\n\\n.card-header:last-child, .card-content:last-child, .card-footer:last-child {\\n border-bottom-left-radius: 0.25rem;\\n border-bottom-right-radius: 0.25rem; }\\n\\n.card-header {\\n background-color: transparent;\\n align-items: stretch;\\n box-shadow: 0 0.125em 0.25em rgba(10, 10, 10, 0.1);\\n display: flex; }\\n\\n.card-header-title {\\n align-items: center;\\n color: #363636;\\n display: flex;\\n flex-grow: 1;\\n font-weight: 700;\\n padding: 0.75rem 1rem; }\\n .card-header-title.is-centered {\\n justify-content: center; }\\n\\n.card-header-icon {\\n -moz-appearance: none;\\n -webkit-appearance: none;\\n appearance: none;\\n background: none;\\n border: none;\\n color: currentColor;\\n font-family: inherit;\\n font-size: 1em;\\n margin: 0;\\n padding: 0;\\n align-items: center;\\n cursor: pointer;\\n display: flex;\\n justify-content: center;\\n padding: 0.75rem 1rem; }\\n\\n.card-image {\\n display: block;\\n position: relative; }\\n .card-image:first-child img {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem; }\\n .card-image:last-child img {\\n border-bottom-left-radius: 0.25rem;\\n border-bottom-right-radius: 0.25rem; }\\n\\n.card-content {\\n background-color: transparent;\\n padding: 1.5rem; }\\n\\n.card-footer {\\n background-color: transparent;\\n border-top: 1px solid #ededed;\\n align-items: stretch;\\n display: flex; }\\n\\n.card-footer-item {\\n align-items: center;\\n display: flex;\\n flex-basis: 0;\\n flex-grow: 1;\\n flex-shrink: 0;\\n justify-content: center;\\n padding: 0.75rem; }\\n .card-footer-item:not(:last-child) {\\n border-right: 1px solid #ededed; }\\n\\n.card .media:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n\\n.dropdown {\\n display: inline-flex;\\n position: relative;\\n vertical-align: top; }\\n .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu {\\n display: block; }\\n .dropdown.is-right .dropdown-menu {\\n left: auto;\\n right: 0; }\\n .dropdown.is-up .dropdown-menu {\\n bottom: 100%;\\n padding-bottom: 4px;\\n padding-top: initial;\\n top: auto; }\\n\\n.dropdown-menu {\\n display: none;\\n left: 0;\\n min-width: 12rem;\\n padding-top: 4px;\\n position: absolute;\\n top: 100%;\\n z-index: 20; }\\n\\n.dropdown-content {\\n background-color: white;\\n border-radius: 4px;\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02);\\n padding-bottom: 0.5rem;\\n padding-top: 0.5rem; }\\n\\n.dropdown-item, .dropdown .dropdown-menu .has-link a {\\n color: #4a4a4a;\\n display: block;\\n font-size: 0.875rem;\\n line-height: 1.5;\\n padding: 0.375rem 1rem;\\n position: relative; }\\n\\na.dropdown-item, .dropdown .dropdown-menu .has-link a,\\nbutton.dropdown-item {\\n padding-right: 3rem;\\n text-align: inherit;\\n white-space: nowrap;\\n width: 100%; }\\n a.dropdown-item:hover, .dropdown .dropdown-menu .has-link a:hover,\\n button.dropdown-item:hover {\\n background-color: whitesmoke;\\n color: #0a0a0a; }\\n a.dropdown-item.is-active, .dropdown .dropdown-menu .has-link a.is-active,\\n button.dropdown-item.is-active {\\n background-color: #485fc7;\\n color: #fff; }\\n\\n.dropdown-divider {\\n background-color: #ededed;\\n border: none;\\n display: block;\\n height: 1px;\\n margin: 0.5rem 0; }\\n\\n.level {\\n align-items: center;\\n justify-content: space-between; }\\n .level code {\\n border-radius: 4px; }\\n .level img {\\n display: inline-block;\\n vertical-align: top; }\\n .level.is-mobile {\\n display: flex; }\\n .level.is-mobile .level-left,\\n .level.is-mobile .level-right {\\n display: flex; }\\n .level.is-mobile .level-left + .level-right {\\n margin-top: 0; }\\n .level.is-mobile .level-item:not(:last-child) {\\n margin-bottom: 0;\\n margin-right: 0.75rem; }\\n .level.is-mobile .level-item:not(.is-narrow) {\\n flex-grow: 1; }\\n @media screen and (min-width: 769px), print {\\n .level {\\n display: flex; }\\n .level > .level-item:not(.is-narrow) {\\n flex-grow: 1; } }\\n\\n.level-item {\\n align-items: center;\\n display: flex;\\n flex-basis: auto;\\n flex-grow: 0;\\n flex-shrink: 0;\\n justify-content: center; }\\n .level-item .title,\\n .level-item .subtitle {\\n margin-bottom: 0; }\\n @media screen and (max-width: 768px) {\\n .level-item:not(:last-child) {\\n margin-bottom: 0.75rem; } }\\n\\n.level-left,\\n.level-right {\\n flex-basis: auto;\\n flex-grow: 0;\\n flex-shrink: 0; }\\n .level-left .level-item.is-flexible,\\n .level-right .level-item.is-flexible {\\n flex-grow: 1; }\\n @media screen and (min-width: 769px), print {\\n .level-left .level-item:not(:last-child),\\n .level-right .level-item:not(:last-child) {\\n margin-right: 0.75rem; } }\\n\\n.level-left {\\n align-items: center;\\n justify-content: flex-start; }\\n @media screen and (max-width: 768px) {\\n .level-left + .level-right {\\n margin-top: 1.5rem; } }\\n @media screen and (min-width: 769px), print {\\n .level-left {\\n display: flex; } }\\n\\n.level-right {\\n align-items: center;\\n justify-content: flex-end; }\\n @media screen and (min-width: 769px), print {\\n .level-right {\\n display: flex; } }\\n\\n.media {\\n align-items: flex-start;\\n display: flex;\\n text-align: inherit; }\\n .media .content:not(:last-child) {\\n margin-bottom: 0.75rem; }\\n .media .media {\\n border-top: 1px solid rgba(219, 219, 219, 0.5);\\n display: flex;\\n padding-top: 0.75rem; }\\n .media .media .content:not(:last-child),\\n .media .media .control:not(:last-child) {\\n margin-bottom: 0.5rem; }\\n .media .media .media {\\n padding-top: 0.5rem; }\\n .media .media .media + .media {\\n margin-top: 0.5rem; }\\n .media + .media {\\n border-top: 1px solid rgba(219, 219, 219, 0.5);\\n margin-top: 1rem;\\n padding-top: 1rem; }\\n .media.is-large + .media {\\n margin-top: 1.5rem;\\n padding-top: 1.5rem; }\\n\\n.media-left,\\n.media-right {\\n flex-basis: auto;\\n flex-grow: 0;\\n flex-shrink: 0; }\\n\\n.media-left {\\n margin-right: 1rem; }\\n\\n.media-right {\\n margin-left: 1rem; }\\n\\n.media-content {\\n flex-basis: auto;\\n flex-grow: 1;\\n flex-shrink: 1;\\n text-align: inherit; }\\n\\n@media screen and (max-width: 768px) {\\n .media-content {\\n overflow-x: auto; } }\\n\\n.menu {\\n font-size: 1rem; }\\n .menu.is-small {\\n font-size: 0.75rem; }\\n .menu.is-medium {\\n font-size: 1.25rem; }\\n .menu.is-large {\\n font-size: 1.5rem; }\\n\\n.menu-list {\\n line-height: 1.25; }\\n .menu-list a {\\n border-radius: 2px;\\n color: #4a4a4a;\\n display: block;\\n padding: 0.5em 0.75em; }\\n .menu-list a:hover {\\n background-color: whitesmoke;\\n color: #363636; }\\n .menu-list a.is-active {\\n background-color: #485fc7;\\n color: #fff; }\\n .menu-list li ul {\\n border-left: 1px solid #dbdbdb;\\n margin: 0.75em;\\n padding-left: 0.75em; }\\n\\n.menu-label {\\n color: #7a7a7a;\\n font-size: 0.75em;\\n letter-spacing: 0.1em;\\n text-transform: uppercase; }\\n .menu-label:not(:first-child) {\\n margin-top: 1em; }\\n .menu-label:not(:last-child) {\\n margin-bottom: 1em; }\\n\\n.message {\\n background-color: whitesmoke;\\n border-radius: 4px;\\n font-size: 1rem; }\\n .message strong {\\n color: currentColor; }\\n .message a:not(.button):not(.tag):not(.dropdown-item) {\\n color: currentColor;\\n text-decoration: underline; }\\n .message.is-small {\\n font-size: 0.75rem; }\\n .message.is-medium {\\n font-size: 1.25rem; }\\n .message.is-large {\\n font-size: 1.5rem; }\\n .message.is-white {\\n background-color: white; }\\n .message.is-white .message-header {\\n background-color: white;\\n color: #0a0a0a; }\\n .message.is-white .message-body {\\n border-color: white; }\\n .message.is-black {\\n background-color: #fafafa; }\\n .message.is-black .message-header {\\n background-color: #0a0a0a;\\n color: white; }\\n .message.is-black .message-body {\\n border-color: #0a0a0a; }\\n .message.is-light {\\n background-color: #fafafa; }\\n .message.is-light .message-header {\\n background-color: whitesmoke;\\n color: #363636; }\\n .message.is-light .message-body {\\n border-color: whitesmoke; }\\n .message.is-dark {\\n background-color: #fafafa; }\\n .message.is-dark .message-header {\\n background-color: #363636;\\n color: whitesmoke; }\\n .message.is-dark .message-body {\\n border-color: #363636; }\\n .message.is-primary {\\n background-color: #ebfffc; }\\n .message.is-primary .message-header {\\n background-color: #00d1b2;\\n color: #fff; }\\n .message.is-primary .message-body {\\n border-color: #00d1b2;\\n color: #00947e; }\\n .message.is-link {\\n background-color: #eff1fa; }\\n .message.is-link .message-header {\\n background-color: #485fc7;\\n color: #fff; }\\n .message.is-link .message-body {\\n border-color: #485fc7;\\n color: #3850b7; }\\n .message.is-info {\\n background-color: #eff5fb; }\\n .message.is-info .message-header {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .message.is-info .message-body {\\n border-color: #3e8ed0;\\n color: #296fa8; }\\n .message.is-success {\\n background-color: #effaf5; }\\n .message.is-success .message-header {\\n background-color: #48c78e;\\n color: #fff; }\\n .message.is-success .message-body {\\n border-color: #48c78e;\\n color: #257953; }\\n .message.is-warning {\\n background-color: #fffaeb; }\\n .message.is-warning .message-header {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .message.is-warning .message-body {\\n border-color: #ffe08a;\\n color: #946c00; }\\n .message.is-danger {\\n background-color: #feecf0; }\\n .message.is-danger .message-header {\\n background-color: #f14668;\\n color: #fff; }\\n .message.is-danger .message-body {\\n border-color: #f14668;\\n color: #cc0f35; }\\n .message.is-twitter {\\n background-color: #f6fafe; }\\n .message.is-twitter .message-header {\\n background-color: #55acee;\\n color: #fff; }\\n .message.is-twitter .message-body {\\n border-color: #55acee; }\\n .message.is-linkedin {\\n background-color: #f5fcff; }\\n .message.is-linkedin .message-header {\\n background-color: #0077b5;\\n color: #fff; }\\n .message.is-linkedin .message-body {\\n border-color: #0077b5; }\\n .message.is-github {\\n background-color: #fafafa; }\\n .message.is-github .message-header {\\n background-color: #333;\\n color: #fff; }\\n .message.is-github .message-body {\\n border-color: #333; }\\n\\n.message-header {\\n align-items: center;\\n background-color: #4a4a4a;\\n border-radius: 4px 4px 0 0;\\n color: #fff;\\n display: flex;\\n font-weight: 700;\\n justify-content: space-between;\\n line-height: 1.25;\\n padding: 0.75em 1em;\\n position: relative; }\\n .message-header .delete {\\n flex-grow: 0;\\n flex-shrink: 0;\\n margin-left: 0.75em; }\\n .message-header + .message-body {\\n border-width: 0;\\n border-top-left-radius: 0;\\n border-top-right-radius: 0; }\\n\\n.message-body {\\n border-color: #dbdbdb;\\n border-radius: 4px;\\n border-style: solid;\\n border-width: 0 0 0 4px;\\n color: #4a4a4a;\\n padding: 1.25em 1.5em; }\\n .message-body code,\\n .message-body pre {\\n background-color: white; }\\n .message-body pre code {\\n background-color: transparent; }\\n\\n.modal {\\n align-items: center;\\n display: none;\\n flex-direction: column;\\n justify-content: center;\\n overflow: hidden;\\n position: fixed;\\n z-index: 40; }\\n .modal.is-active {\\n display: flex; }\\n\\n.modal-background {\\n background-color: rgba(10, 10, 10, 0.86); }\\n\\n.modal-content,\\n.modal-card {\\n margin: 0 20px;\\n max-height: calc(100vh - 160px);\\n overflow: auto;\\n position: relative;\\n width: 100%; }\\n @media screen and (min-width: 769px) {\\n .modal-content,\\n .modal-card {\\n margin: 0 auto;\\n max-height: calc(100vh - 40px);\\n width: 640px; } }\\n\\n.modal-close {\\n background: none;\\n height: 40px;\\n position: fixed;\\n right: 20px;\\n top: 20px;\\n width: 40px; }\\n\\n.modal-card {\\n display: flex;\\n flex-direction: column;\\n max-height: calc(100vh - 40px);\\n overflow: hidden;\\n -ms-overflow-y: visible; }\\n\\n.modal-card-head,\\n.modal-card-foot {\\n align-items: center;\\n background-color: whitesmoke;\\n display: flex;\\n flex-shrink: 0;\\n justify-content: flex-start;\\n padding: 20px;\\n position: relative; }\\n\\n.modal-card-head {\\n border-bottom: 1px solid #dbdbdb;\\n border-top-left-radius: 6px;\\n border-top-right-radius: 6px; }\\n\\n.modal-card-title {\\n color: #363636;\\n flex-grow: 1;\\n flex-shrink: 0;\\n font-size: 1.5rem;\\n line-height: 1; }\\n\\n.modal-card-foot {\\n border-bottom-left-radius: 6px;\\n border-bottom-right-radius: 6px;\\n border-top: 1px solid #dbdbdb; }\\n .modal-card-foot .button:not(:last-child) {\\n margin-right: 0.5em; }\\n\\n.modal-card-body {\\n -webkit-overflow-scrolling: touch;\\n background-color: white;\\n flex-grow: 1;\\n flex-shrink: 1;\\n overflow: auto;\\n padding: 20px; }\\n\\n.navbar {\\n background-color: white;\\n min-height: 3.25rem;\\n position: relative;\\n z-index: 30; }\\n .navbar.is-white {\\n background-color: white;\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-brand > .navbar-item,\\n .navbar.is-white .navbar-brand .navbar-link {\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-white .navbar-brand .navbar-link:focus,\\n .navbar.is-white .navbar-brand .navbar-link:hover,\\n .navbar.is-white .navbar-brand .navbar-link.is-active {\\n background-color: #f2f2f2;\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-brand .navbar-link::after {\\n border-color: #0a0a0a; }\\n .navbar.is-white .navbar-burger {\\n color: #0a0a0a; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-white .navbar-start > .navbar-item,\\n .navbar.is-white .navbar-start .navbar-link,\\n .navbar.is-white .navbar-end > .navbar-item,\\n .navbar.is-white .navbar-end .navbar-link {\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active,\\n .navbar.is-white .navbar-start .navbar-link:focus,\\n .navbar.is-white .navbar-start .navbar-link:hover,\\n .navbar.is-white .navbar-start .navbar-link.is-active,\\n .navbar.is-white .navbar-end > a.navbar-item:focus,\\n .navbar.is-white .navbar-end > a.navbar-item:hover,\\n .navbar.is-white .navbar-end > a.navbar-item.is-active,\\n .navbar.is-white .navbar-end .navbar-link:focus,\\n .navbar.is-white .navbar-end .navbar-link:hover,\\n .navbar.is-white .navbar-end .navbar-link.is-active {\\n background-color: #f2f2f2;\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-start .navbar-link::after,\\n .navbar.is-white .navbar-end .navbar-link::after {\\n border-color: #0a0a0a; }\\n .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #f2f2f2;\\n color: #0a0a0a; }\\n .navbar.is-white .navbar-dropdown a.navbar-item.is-active {\\n background-color: white;\\n color: #0a0a0a; } }\\n .navbar.is-black {\\n background-color: #0a0a0a;\\n color: white; }\\n .navbar.is-black .navbar-brand > .navbar-item,\\n .navbar.is-black .navbar-brand .navbar-link {\\n color: white; }\\n .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-black .navbar-brand .navbar-link:focus,\\n .navbar.is-black .navbar-brand .navbar-link:hover,\\n .navbar.is-black .navbar-brand .navbar-link.is-active {\\n background-color: black;\\n color: white; }\\n .navbar.is-black .navbar-brand .navbar-link::after {\\n border-color: white; }\\n .navbar.is-black .navbar-burger {\\n color: white; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-black .navbar-start > .navbar-item,\\n .navbar.is-black .navbar-start .navbar-link,\\n .navbar.is-black .navbar-end > .navbar-item,\\n .navbar.is-black .navbar-end .navbar-link {\\n color: white; }\\n .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active,\\n .navbar.is-black .navbar-start .navbar-link:focus,\\n .navbar.is-black .navbar-start .navbar-link:hover,\\n .navbar.is-black .navbar-start .navbar-link.is-active,\\n .navbar.is-black .navbar-end > a.navbar-item:focus,\\n .navbar.is-black .navbar-end > a.navbar-item:hover,\\n .navbar.is-black .navbar-end > a.navbar-item.is-active,\\n .navbar.is-black .navbar-end .navbar-link:focus,\\n .navbar.is-black .navbar-end .navbar-link:hover,\\n .navbar.is-black .navbar-end .navbar-link.is-active {\\n background-color: black;\\n color: white; }\\n .navbar.is-black .navbar-start .navbar-link::after,\\n .navbar.is-black .navbar-end .navbar-link::after {\\n border-color: white; }\\n .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: black;\\n color: white; }\\n .navbar.is-black .navbar-dropdown a.navbar-item.is-active {\\n background-color: #0a0a0a;\\n color: white; } }\\n .navbar.is-light {\\n background-color: whitesmoke;\\n color: #363636; }\\n .navbar.is-light .navbar-brand > .navbar-item,\\n .navbar.is-light .navbar-brand .navbar-link {\\n color: #363636; }\\n .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-light .navbar-brand .navbar-link:focus,\\n .navbar.is-light .navbar-brand .navbar-link:hover,\\n .navbar.is-light .navbar-brand .navbar-link.is-active {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .navbar.is-light .navbar-brand .navbar-link::after {\\n border-color: #363636; }\\n .navbar.is-light .navbar-burger {\\n color: #363636; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-light .navbar-start > .navbar-item,\\n .navbar.is-light .navbar-start .navbar-link,\\n .navbar.is-light .navbar-end > .navbar-item,\\n .navbar.is-light .navbar-end .navbar-link {\\n color: #363636; }\\n .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active,\\n .navbar.is-light .navbar-start .navbar-link:focus,\\n .navbar.is-light .navbar-start .navbar-link:hover,\\n .navbar.is-light .navbar-start .navbar-link.is-active,\\n .navbar.is-light .navbar-end > a.navbar-item:focus,\\n .navbar.is-light .navbar-end > a.navbar-item:hover,\\n .navbar.is-light .navbar-end > a.navbar-item.is-active,\\n .navbar.is-light .navbar-end .navbar-link:focus,\\n .navbar.is-light .navbar-end .navbar-link:hover,\\n .navbar.is-light .navbar-end .navbar-link.is-active {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .navbar.is-light .navbar-start .navbar-link::after,\\n .navbar.is-light .navbar-end .navbar-link::after {\\n border-color: #363636; }\\n .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .navbar.is-light .navbar-dropdown a.navbar-item.is-active {\\n background-color: whitesmoke;\\n color: #363636; } }\\n .navbar.is-dark {\\n background-color: #363636;\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-brand > .navbar-item,\\n .navbar.is-dark .navbar-brand .navbar-link {\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-dark .navbar-brand .navbar-link:focus,\\n .navbar.is-dark .navbar-brand .navbar-link:hover,\\n .navbar.is-dark .navbar-brand .navbar-link.is-active {\\n background-color: #292929;\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-brand .navbar-link::after {\\n border-color: whitesmoke; }\\n .navbar.is-dark .navbar-burger {\\n color: whitesmoke; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-dark .navbar-start > .navbar-item,\\n .navbar.is-dark .navbar-start .navbar-link,\\n .navbar.is-dark .navbar-end > .navbar-item,\\n .navbar.is-dark .navbar-end .navbar-link {\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active,\\n .navbar.is-dark .navbar-start .navbar-link:focus,\\n .navbar.is-dark .navbar-start .navbar-link:hover,\\n .navbar.is-dark .navbar-start .navbar-link.is-active,\\n .navbar.is-dark .navbar-end > a.navbar-item:focus,\\n .navbar.is-dark .navbar-end > a.navbar-item:hover,\\n .navbar.is-dark .navbar-end > a.navbar-item.is-active,\\n .navbar.is-dark .navbar-end .navbar-link:focus,\\n .navbar.is-dark .navbar-end .navbar-link:hover,\\n .navbar.is-dark .navbar-end .navbar-link.is-active {\\n background-color: #292929;\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-start .navbar-link::after,\\n .navbar.is-dark .navbar-end .navbar-link::after {\\n border-color: whitesmoke; }\\n .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #292929;\\n color: whitesmoke; }\\n .navbar.is-dark .navbar-dropdown a.navbar-item.is-active {\\n background-color: #363636;\\n color: whitesmoke; } }\\n .navbar.is-primary {\\n background-color: #00d1b2;\\n color: #fff; }\\n .navbar.is-primary .navbar-brand > .navbar-item,\\n .navbar.is-primary .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-primary .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-primary .navbar-brand .navbar-link:focus,\\n .navbar.is-primary .navbar-brand .navbar-link:hover,\\n .navbar.is-primary .navbar-brand .navbar-link.is-active {\\n background-color: #00b89c;\\n color: #fff; }\\n .navbar.is-primary .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-primary .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-primary .navbar-start > .navbar-item,\\n .navbar.is-primary .navbar-start .navbar-link,\\n .navbar.is-primary .navbar-end > .navbar-item,\\n .navbar.is-primary .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-primary .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active,\\n .navbar.is-primary .navbar-start .navbar-link:focus,\\n .navbar.is-primary .navbar-start .navbar-link:hover,\\n .navbar.is-primary .navbar-start .navbar-link.is-active,\\n .navbar.is-primary .navbar-end > a.navbar-item:focus,\\n .navbar.is-primary .navbar-end > a.navbar-item:hover,\\n .navbar.is-primary .navbar-end > a.navbar-item.is-active,\\n .navbar.is-primary .navbar-end .navbar-link:focus,\\n .navbar.is-primary .navbar-end .navbar-link:hover,\\n .navbar.is-primary .navbar-end .navbar-link.is-active {\\n background-color: #00b89c;\\n color: #fff; }\\n .navbar.is-primary .navbar-start .navbar-link::after,\\n .navbar.is-primary .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #00b89c;\\n color: #fff; }\\n .navbar.is-primary .navbar-dropdown a.navbar-item.is-active {\\n background-color: #00d1b2;\\n color: #fff; } }\\n .navbar.is-link {\\n background-color: #485fc7;\\n color: #fff; }\\n .navbar.is-link .navbar-brand > .navbar-item,\\n .navbar.is-link .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-link .navbar-brand .navbar-link:focus,\\n .navbar.is-link .navbar-brand .navbar-link:hover,\\n .navbar.is-link .navbar-brand .navbar-link.is-active {\\n background-color: #3a51bb;\\n color: #fff; }\\n .navbar.is-link .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-link .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-link .navbar-start > .navbar-item,\\n .navbar.is-link .navbar-start .navbar-link,\\n .navbar.is-link .navbar-end > .navbar-item,\\n .navbar.is-link .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active,\\n .navbar.is-link .navbar-start .navbar-link:focus,\\n .navbar.is-link .navbar-start .navbar-link:hover,\\n .navbar.is-link .navbar-start .navbar-link.is-active,\\n .navbar.is-link .navbar-end > a.navbar-item:focus,\\n .navbar.is-link .navbar-end > a.navbar-item:hover,\\n .navbar.is-link .navbar-end > a.navbar-item.is-active,\\n .navbar.is-link .navbar-end .navbar-link:focus,\\n .navbar.is-link .navbar-end .navbar-link:hover,\\n .navbar.is-link .navbar-end .navbar-link.is-active {\\n background-color: #3a51bb;\\n color: #fff; }\\n .navbar.is-link .navbar-start .navbar-link::after,\\n .navbar.is-link .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #3a51bb;\\n color: #fff; }\\n .navbar.is-link .navbar-dropdown a.navbar-item.is-active {\\n background-color: #485fc7;\\n color: #fff; } }\\n .navbar.is-info {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .navbar.is-info .navbar-brand > .navbar-item,\\n .navbar.is-info .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-info .navbar-brand .navbar-link:focus,\\n .navbar.is-info .navbar-brand .navbar-link:hover,\\n .navbar.is-info .navbar-brand .navbar-link.is-active {\\n background-color: #3082c5;\\n color: #fff; }\\n .navbar.is-info .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-info .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-info .navbar-start > .navbar-item,\\n .navbar.is-info .navbar-start .navbar-link,\\n .navbar.is-info .navbar-end > .navbar-item,\\n .navbar.is-info .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active,\\n .navbar.is-info .navbar-start .navbar-link:focus,\\n .navbar.is-info .navbar-start .navbar-link:hover,\\n .navbar.is-info .navbar-start .navbar-link.is-active,\\n .navbar.is-info .navbar-end > a.navbar-item:focus,\\n .navbar.is-info .navbar-end > a.navbar-item:hover,\\n .navbar.is-info .navbar-end > a.navbar-item.is-active,\\n .navbar.is-info .navbar-end .navbar-link:focus,\\n .navbar.is-info .navbar-end .navbar-link:hover,\\n .navbar.is-info .navbar-end .navbar-link.is-active {\\n background-color: #3082c5;\\n color: #fff; }\\n .navbar.is-info .navbar-start .navbar-link::after,\\n .navbar.is-info .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #3082c5;\\n color: #fff; }\\n .navbar.is-info .navbar-dropdown a.navbar-item.is-active {\\n background-color: #3e8ed0;\\n color: #fff; } }\\n .navbar.is-success {\\n background-color: #48c78e;\\n color: #fff; }\\n .navbar.is-success .navbar-brand > .navbar-item,\\n .navbar.is-success .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-success .navbar-brand .navbar-link:focus,\\n .navbar.is-success .navbar-brand .navbar-link:hover,\\n .navbar.is-success .navbar-brand .navbar-link.is-active {\\n background-color: #3abb81;\\n color: #fff; }\\n .navbar.is-success .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-success .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-success .navbar-start > .navbar-item,\\n .navbar.is-success .navbar-start .navbar-link,\\n .navbar.is-success .navbar-end > .navbar-item,\\n .navbar.is-success .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active,\\n .navbar.is-success .navbar-start .navbar-link:focus,\\n .navbar.is-success .navbar-start .navbar-link:hover,\\n .navbar.is-success .navbar-start .navbar-link.is-active,\\n .navbar.is-success .navbar-end > a.navbar-item:focus,\\n .navbar.is-success .navbar-end > a.navbar-item:hover,\\n .navbar.is-success .navbar-end > a.navbar-item.is-active,\\n .navbar.is-success .navbar-end .navbar-link:focus,\\n .navbar.is-success .navbar-end .navbar-link:hover,\\n .navbar.is-success .navbar-end .navbar-link.is-active {\\n background-color: #3abb81;\\n color: #fff; }\\n .navbar.is-success .navbar-start .navbar-link::after,\\n .navbar.is-success .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #3abb81;\\n color: #fff; }\\n .navbar.is-success .navbar-dropdown a.navbar-item.is-active {\\n background-color: #48c78e;\\n color: #fff; } }\\n .navbar.is-warning {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-brand > .navbar-item,\\n .navbar.is-warning .navbar-brand .navbar-link {\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-warning .navbar-brand .navbar-link:focus,\\n .navbar.is-warning .navbar-brand .navbar-link:hover,\\n .navbar.is-warning .navbar-brand .navbar-link.is-active {\\n background-color: #ffd970;\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-brand .navbar-link::after {\\n border-color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-burger {\\n color: rgba(0, 0, 0, 0.7); }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-warning .navbar-start > .navbar-item,\\n .navbar.is-warning .navbar-start .navbar-link,\\n .navbar.is-warning .navbar-end > .navbar-item,\\n .navbar.is-warning .navbar-end .navbar-link {\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active,\\n .navbar.is-warning .navbar-start .navbar-link:focus,\\n .navbar.is-warning .navbar-start .navbar-link:hover,\\n .navbar.is-warning .navbar-start .navbar-link.is-active,\\n .navbar.is-warning .navbar-end > a.navbar-item:focus,\\n .navbar.is-warning .navbar-end > a.navbar-item:hover,\\n .navbar.is-warning .navbar-end > a.navbar-item.is-active,\\n .navbar.is-warning .navbar-end .navbar-link:focus,\\n .navbar.is-warning .navbar-end .navbar-link:hover,\\n .navbar.is-warning .navbar-end .navbar-link.is-active {\\n background-color: #ffd970;\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-start .navbar-link::after,\\n .navbar.is-warning .navbar-end .navbar-link::after {\\n border-color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #ffd970;\\n color: rgba(0, 0, 0, 0.7); }\\n .navbar.is-warning .navbar-dropdown a.navbar-item.is-active {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); } }\\n .navbar.is-danger {\\n background-color: #f14668;\\n color: #fff; }\\n .navbar.is-danger .navbar-brand > .navbar-item,\\n .navbar.is-danger .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-danger .navbar-brand .navbar-link:focus,\\n .navbar.is-danger .navbar-brand .navbar-link:hover,\\n .navbar.is-danger .navbar-brand .navbar-link.is-active {\\n background-color: #ef2e55;\\n color: #fff; }\\n .navbar.is-danger .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-danger .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-danger .navbar-start > .navbar-item,\\n .navbar.is-danger .navbar-start .navbar-link,\\n .navbar.is-danger .navbar-end > .navbar-item,\\n .navbar.is-danger .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active,\\n .navbar.is-danger .navbar-start .navbar-link:focus,\\n .navbar.is-danger .navbar-start .navbar-link:hover,\\n .navbar.is-danger .navbar-start .navbar-link.is-active,\\n .navbar.is-danger .navbar-end > a.navbar-item:focus,\\n .navbar.is-danger .navbar-end > a.navbar-item:hover,\\n .navbar.is-danger .navbar-end > a.navbar-item.is-active,\\n .navbar.is-danger .navbar-end .navbar-link:focus,\\n .navbar.is-danger .navbar-end .navbar-link:hover,\\n .navbar.is-danger .navbar-end .navbar-link.is-active {\\n background-color: #ef2e55;\\n color: #fff; }\\n .navbar.is-danger .navbar-start .navbar-link::after,\\n .navbar.is-danger .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #ef2e55;\\n color: #fff; }\\n .navbar.is-danger .navbar-dropdown a.navbar-item.is-active {\\n background-color: #f14668;\\n color: #fff; } }\\n .navbar.is-twitter {\\n background-color: #55acee;\\n color: #fff; }\\n .navbar.is-twitter .navbar-brand > .navbar-item,\\n .navbar.is-twitter .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-twitter .navbar-brand > a.navbar-item:focus, .navbar.is-twitter .navbar-brand > a.navbar-item:hover, .navbar.is-twitter .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-twitter .navbar-brand .navbar-link:focus,\\n .navbar.is-twitter .navbar-brand .navbar-link:hover,\\n .navbar.is-twitter .navbar-brand .navbar-link.is-active {\\n background-color: #3ea1ec;\\n color: #fff; }\\n .navbar.is-twitter .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-twitter .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-twitter .navbar-start > .navbar-item,\\n .navbar.is-twitter .navbar-start .navbar-link,\\n .navbar.is-twitter .navbar-end > .navbar-item,\\n .navbar.is-twitter .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-twitter .navbar-start > a.navbar-item:focus, .navbar.is-twitter .navbar-start > a.navbar-item:hover, .navbar.is-twitter .navbar-start > a.navbar-item.is-active,\\n .navbar.is-twitter .navbar-start .navbar-link:focus,\\n .navbar.is-twitter .navbar-start .navbar-link:hover,\\n .navbar.is-twitter .navbar-start .navbar-link.is-active,\\n .navbar.is-twitter .navbar-end > a.navbar-item:focus,\\n .navbar.is-twitter .navbar-end > a.navbar-item:hover,\\n .navbar.is-twitter .navbar-end > a.navbar-item.is-active,\\n .navbar.is-twitter .navbar-end .navbar-link:focus,\\n .navbar.is-twitter .navbar-end .navbar-link:hover,\\n .navbar.is-twitter .navbar-end .navbar-link.is-active {\\n background-color: #3ea1ec;\\n color: #fff; }\\n .navbar.is-twitter .navbar-start .navbar-link::after,\\n .navbar.is-twitter .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-twitter .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-twitter .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-twitter .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #3ea1ec;\\n color: #fff; }\\n .navbar.is-twitter .navbar-dropdown a.navbar-item.is-active {\\n background-color: #55acee;\\n color: #fff; } }\\n .navbar.is-linkedin {\\n background-color: #0077b5;\\n color: #fff; }\\n .navbar.is-linkedin .navbar-brand > .navbar-item,\\n .navbar.is-linkedin .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-linkedin .navbar-brand > a.navbar-item:focus, .navbar.is-linkedin .navbar-brand > a.navbar-item:hover, .navbar.is-linkedin .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-linkedin .navbar-brand .navbar-link:focus,\\n .navbar.is-linkedin .navbar-brand .navbar-link:hover,\\n .navbar.is-linkedin .navbar-brand .navbar-link.is-active {\\n background-color: #00669c;\\n color: #fff; }\\n .navbar.is-linkedin .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-linkedin .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-linkedin .navbar-start > .navbar-item,\\n .navbar.is-linkedin .navbar-start .navbar-link,\\n .navbar.is-linkedin .navbar-end > .navbar-item,\\n .navbar.is-linkedin .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-linkedin .navbar-start > a.navbar-item:focus, .navbar.is-linkedin .navbar-start > a.navbar-item:hover, .navbar.is-linkedin .navbar-start > a.navbar-item.is-active,\\n .navbar.is-linkedin .navbar-start .navbar-link:focus,\\n .navbar.is-linkedin .navbar-start .navbar-link:hover,\\n .navbar.is-linkedin .navbar-start .navbar-link.is-active,\\n .navbar.is-linkedin .navbar-end > a.navbar-item:focus,\\n .navbar.is-linkedin .navbar-end > a.navbar-item:hover,\\n .navbar.is-linkedin .navbar-end > a.navbar-item.is-active,\\n .navbar.is-linkedin .navbar-end .navbar-link:focus,\\n .navbar.is-linkedin .navbar-end .navbar-link:hover,\\n .navbar.is-linkedin .navbar-end .navbar-link.is-active {\\n background-color: #00669c;\\n color: #fff; }\\n .navbar.is-linkedin .navbar-start .navbar-link::after,\\n .navbar.is-linkedin .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-linkedin .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-linkedin .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-linkedin .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #00669c;\\n color: #fff; }\\n .navbar.is-linkedin .navbar-dropdown a.navbar-item.is-active {\\n background-color: #0077b5;\\n color: #fff; } }\\n .navbar.is-github {\\n background-color: #333;\\n color: #fff; }\\n .navbar.is-github .navbar-brand > .navbar-item,\\n .navbar.is-github .navbar-brand .navbar-link {\\n color: #fff; }\\n .navbar.is-github .navbar-brand > a.navbar-item:focus, .navbar.is-github .navbar-brand > a.navbar-item:hover, .navbar.is-github .navbar-brand > a.navbar-item.is-active,\\n .navbar.is-github .navbar-brand .navbar-link:focus,\\n .navbar.is-github .navbar-brand .navbar-link:hover,\\n .navbar.is-github .navbar-brand .navbar-link.is-active {\\n background-color: #262626;\\n color: #fff; }\\n .navbar.is-github .navbar-brand .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-github .navbar-burger {\\n color: #fff; }\\n @media screen and (min-width: 1024px) {\\n .navbar.is-github .navbar-start > .navbar-item,\\n .navbar.is-github .navbar-start .navbar-link,\\n .navbar.is-github .navbar-end > .navbar-item,\\n .navbar.is-github .navbar-end .navbar-link {\\n color: #fff; }\\n .navbar.is-github .navbar-start > a.navbar-item:focus, .navbar.is-github .navbar-start > a.navbar-item:hover, .navbar.is-github .navbar-start > a.navbar-item.is-active,\\n .navbar.is-github .navbar-start .navbar-link:focus,\\n .navbar.is-github .navbar-start .navbar-link:hover,\\n .navbar.is-github .navbar-start .navbar-link.is-active,\\n .navbar.is-github .navbar-end > a.navbar-item:focus,\\n .navbar.is-github .navbar-end > a.navbar-item:hover,\\n .navbar.is-github .navbar-end > a.navbar-item.is-active,\\n .navbar.is-github .navbar-end .navbar-link:focus,\\n .navbar.is-github .navbar-end .navbar-link:hover,\\n .navbar.is-github .navbar-end .navbar-link.is-active {\\n background-color: #262626;\\n color: #fff; }\\n .navbar.is-github .navbar-start .navbar-link::after,\\n .navbar.is-github .navbar-end .navbar-link::after {\\n border-color: #fff; }\\n .navbar.is-github .navbar-item.has-dropdown:focus .navbar-link,\\n .navbar.is-github .navbar-item.has-dropdown:hover .navbar-link,\\n .navbar.is-github .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #262626;\\n color: #fff; }\\n .navbar.is-github .navbar-dropdown a.navbar-item.is-active {\\n background-color: #333;\\n color: #fff; } }\\n .navbar > .container {\\n align-items: stretch;\\n display: flex;\\n min-height: 3.25rem;\\n width: 100%; }\\n .navbar.has-shadow {\\n box-shadow: 0 2px 0 0 whitesmoke; }\\n .navbar.is-fixed-bottom, .navbar.is-fixed-top {\\n left: 0;\\n position: fixed;\\n right: 0;\\n z-index: 30; }\\n .navbar.is-fixed-bottom {\\n bottom: 0; }\\n .navbar.is-fixed-bottom.has-shadow {\\n box-shadow: 0 -2px 0 0 whitesmoke; }\\n .navbar.is-fixed-top {\\n top: 0; }\\n\\nhtml.has-navbar-fixed-top,\\nbody.has-navbar-fixed-top {\\n padding-top: 3.25rem; }\\n\\nhtml.has-navbar-fixed-bottom,\\nbody.has-navbar-fixed-bottom {\\n padding-bottom: 3.25rem; }\\n\\n.navbar-brand,\\n.navbar-tabs {\\n align-items: stretch;\\n display: flex;\\n flex-shrink: 0;\\n min-height: 3.25rem; }\\n\\n.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover {\\n background-color: transparent; }\\n\\n.navbar-tabs {\\n -webkit-overflow-scrolling: touch;\\n max-width: 100vw;\\n overflow-x: auto;\\n overflow-y: hidden; }\\n\\n.navbar-burger {\\n color: #4a4a4a;\\n cursor: pointer;\\n display: block;\\n height: 3.25rem;\\n position: relative;\\n width: 3.25rem;\\n margin-left: auto; }\\n .navbar-burger span {\\n background-color: currentColor;\\n display: block;\\n height: 1px;\\n left: calc(50% - 8px);\\n position: absolute;\\n transform-origin: center;\\n transition-duration: 86ms;\\n transition-property: background-color, opacity, transform;\\n transition-timing-function: ease-out;\\n width: 16px; }\\n .navbar-burger span:nth-child(1) {\\n top: calc(50% - 6px); }\\n .navbar-burger span:nth-child(2) {\\n top: calc(50% - 1px); }\\n .navbar-burger span:nth-child(3) {\\n top: calc(50% + 4px); }\\n .navbar-burger:hover {\\n background-color: rgba(0, 0, 0, 0.05); }\\n .navbar-burger.is-active span:nth-child(1) {\\n transform: translateY(5px) rotate(45deg); }\\n .navbar-burger.is-active span:nth-child(2) {\\n opacity: 0; }\\n .navbar-burger.is-active span:nth-child(3) {\\n transform: translateY(-5px) rotate(-45deg); }\\n\\n.navbar-menu {\\n display: none; }\\n\\n.navbar-item,\\n.navbar-link {\\n color: #4a4a4a;\\n display: block;\\n line-height: 1.5;\\n padding: 0.5rem 0.75rem;\\n position: relative; }\\n .navbar-item .icon:only-child,\\n .navbar-link .icon:only-child {\\n margin-left: -0.25rem;\\n margin-right: -0.25rem; }\\n\\na.navbar-item,\\n.navbar-link {\\n cursor: pointer; }\\n a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active,\\n .navbar-link:focus,\\n .navbar-link:focus-within,\\n .navbar-link:hover,\\n .navbar-link.is-active {\\n background-color: #fafafa;\\n color: #485fc7; }\\n\\n.navbar-item {\\n flex-grow: 0;\\n flex-shrink: 0; }\\n .navbar-item img {\\n max-height: 1.75rem; }\\n .navbar-item.has-dropdown {\\n padding: 0; }\\n .navbar-item.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .navbar-item.is-tab {\\n border-bottom: 1px solid transparent;\\n min-height: 3.25rem;\\n padding-bottom: calc(0.5rem - 1px); }\\n .navbar-item.is-tab:focus, .navbar-item.is-tab:hover {\\n background-color: transparent;\\n border-bottom-color: #485fc7; }\\n .navbar-item.is-tab.is-active {\\n background-color: transparent;\\n border-bottom-color: #485fc7;\\n border-bottom-style: solid;\\n border-bottom-width: 3px;\\n color: #485fc7;\\n padding-bottom: calc(0.5rem - 3px); }\\n\\n.navbar-content {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n\\n.navbar-link:not(.is-arrowless) {\\n padding-right: 2.5em; }\\n .navbar-link:not(.is-arrowless)::after {\\n border-color: #485fc7;\\n margin-top: -0.375em;\\n right: 1.125em; }\\n\\n.navbar-dropdown {\\n font-size: 0.875rem;\\n padding-bottom: 0.5rem;\\n padding-top: 0.5rem; }\\n .navbar-dropdown .navbar-item {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem; }\\n\\n.navbar-divider {\\n background-color: whitesmoke;\\n border: none;\\n display: none;\\n height: 2px;\\n margin: 0.5rem 0; }\\n\\n@media screen and (max-width: 1023px) {\\n .navbar > .container {\\n display: block; }\\n .navbar-brand .navbar-item,\\n .navbar-tabs .navbar-item {\\n align-items: center;\\n display: flex; }\\n .navbar-link::after {\\n display: none; }\\n .navbar-menu {\\n background-color: white;\\n box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1);\\n padding: 0.5rem 0; }\\n .navbar-menu.is-active {\\n display: block; }\\n .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch {\\n left: 0;\\n position: fixed;\\n right: 0;\\n z-index: 30; }\\n .navbar.is-fixed-bottom-touch {\\n bottom: 0; }\\n .navbar.is-fixed-bottom-touch.has-shadow {\\n box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); }\\n .navbar.is-fixed-top-touch {\\n top: 0; }\\n .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu {\\n -webkit-overflow-scrolling: touch;\\n max-height: calc(100vh - 3.25rem);\\n overflow: auto; }\\n html.has-navbar-fixed-top-touch,\\n body.has-navbar-fixed-top-touch {\\n padding-top: 3.25rem; }\\n html.has-navbar-fixed-bottom-touch,\\n body.has-navbar-fixed-bottom-touch {\\n padding-bottom: 3.25rem; } }\\n\\n@media screen and (min-width: 1024px) {\\n .navbar,\\n .navbar-menu,\\n .navbar-start,\\n .navbar-end {\\n align-items: stretch;\\n display: flex; }\\n .navbar {\\n min-height: 3.25rem; }\\n .navbar.is-spaced {\\n padding: 1rem 2rem; }\\n .navbar.is-spaced .navbar-start,\\n .navbar.is-spaced .navbar-end {\\n align-items: center; }\\n .navbar.is-spaced a.navbar-item,\\n .navbar.is-spaced .navbar-link {\\n border-radius: 4px; }\\n .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active,\\n .navbar.is-transparent .navbar-link:focus,\\n .navbar.is-transparent .navbar-link:hover,\\n .navbar.is-transparent .navbar-link.is-active {\\n background-color: transparent !important; }\\n .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link {\\n background-color: transparent !important; }\\n .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover {\\n background-color: whitesmoke;\\n color: #0a0a0a; }\\n .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active {\\n background-color: whitesmoke;\\n color: #485fc7; }\\n .navbar-burger {\\n display: none; }\\n .navbar-item,\\n .navbar-link {\\n align-items: center;\\n display: flex; }\\n .navbar-item.has-dropdown {\\n align-items: stretch; }\\n .navbar-item.has-dropdown-up .navbar-link::after {\\n transform: rotate(135deg) translate(0.25em, -0.25em); }\\n .navbar-item.has-dropdown-up .navbar-dropdown {\\n border-bottom: 2px solid #dbdbdb;\\n border-radius: 6px 6px 0 0;\\n border-top: none;\\n bottom: 100%;\\n box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1);\\n top: auto; }\\n .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown {\\n display: block; }\\n .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed {\\n opacity: 1;\\n pointer-events: auto;\\n transform: translateY(0); }\\n .navbar-menu {\\n flex-grow: 1;\\n flex-shrink: 0; }\\n .navbar-start {\\n justify-content: flex-start;\\n margin-right: auto; }\\n .navbar-end {\\n justify-content: flex-end;\\n margin-left: auto; }\\n .navbar-dropdown {\\n background-color: white;\\n border-bottom-left-radius: 6px;\\n border-bottom-right-radius: 6px;\\n border-top: 2px solid #dbdbdb;\\n box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1);\\n display: none;\\n font-size: 0.875rem;\\n left: 0;\\n min-width: 100%;\\n position: absolute;\\n top: 100%;\\n z-index: 20; }\\n .navbar-dropdown .navbar-item {\\n padding: 0.375rem 1rem;\\n white-space: nowrap; }\\n .navbar-dropdown a.navbar-item {\\n padding-right: 3rem; }\\n .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover {\\n background-color: whitesmoke;\\n color: #0a0a0a; }\\n .navbar-dropdown a.navbar-item.is-active {\\n background-color: whitesmoke;\\n color: #485fc7; }\\n .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed {\\n border-radius: 6px;\\n border-top: none;\\n box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);\\n display: block;\\n opacity: 0;\\n pointer-events: none;\\n top: calc(100% + (-4px));\\n transform: translateY(-5px);\\n transition-duration: 86ms;\\n transition-property: opacity, transform; }\\n .navbar-dropdown.is-right {\\n left: auto;\\n right: 0; }\\n .navbar-divider {\\n display: block; }\\n .navbar > .container .navbar-brand,\\n .container > .navbar .navbar-brand {\\n margin-left: -0.75rem; }\\n .navbar > .container .navbar-menu,\\n .container > .navbar .navbar-menu {\\n margin-right: -0.75rem; }\\n .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop {\\n left: 0;\\n position: fixed;\\n right: 0;\\n z-index: 30; }\\n .navbar.is-fixed-bottom-desktop {\\n bottom: 0; }\\n .navbar.is-fixed-bottom-desktop.has-shadow {\\n box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); }\\n .navbar.is-fixed-top-desktop {\\n top: 0; }\\n html.has-navbar-fixed-top-desktop,\\n body.has-navbar-fixed-top-desktop {\\n padding-top: 3.25rem; }\\n html.has-navbar-fixed-bottom-desktop,\\n body.has-navbar-fixed-bottom-desktop {\\n padding-bottom: 3.25rem; }\\n html.has-spaced-navbar-fixed-top,\\n body.has-spaced-navbar-fixed-top {\\n padding-top: 5.25rem; }\\n html.has-spaced-navbar-fixed-bottom,\\n body.has-spaced-navbar-fixed-bottom {\\n padding-bottom: 5.25rem; }\\n a.navbar-item.is-active,\\n .navbar-link.is-active {\\n color: #0a0a0a; }\\n a.navbar-item.is-active:not(:focus):not(:hover),\\n .navbar-link.is-active:not(:focus):not(:hover) {\\n background-color: transparent; }\\n .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link {\\n background-color: #fafafa; } }\\n\\n.hero.is-fullheight-with-navbar {\\n min-height: calc(100vh - 3.25rem); }\\n\\n.pagination {\\n font-size: 1rem;\\n margin: -0.25rem; }\\n .pagination.is-small {\\n font-size: 0.75rem; }\\n .pagination.is-medium {\\n font-size: 1.25rem; }\\n .pagination.is-large {\\n font-size: 1.5rem; }\\n .pagination.is-rounded .pagination-previous,\\n .pagination.is-rounded .pagination-next {\\n padding-left: 1em;\\n padding-right: 1em;\\n border-radius: 9999px; }\\n .pagination.is-rounded .pagination-link {\\n border-radius: 9999px; }\\n\\n.pagination,\\n.pagination-list {\\n align-items: center;\\n display: flex;\\n justify-content: center;\\n text-align: center; }\\n\\n.pagination-previous,\\n.pagination-next,\\n.pagination-link,\\n.pagination-ellipsis {\\n font-size: 1em;\\n justify-content: center;\\n margin: 0.25rem;\\n padding-left: 0.5em;\\n padding-right: 0.5em;\\n text-align: center; }\\n\\n.pagination-previous,\\n.pagination-next,\\n.pagination-link {\\n border-color: #dbdbdb;\\n color: #363636;\\n min-width: 2.5em; }\\n .pagination-previous:hover,\\n .pagination-next:hover,\\n .pagination-link:hover {\\n border-color: #b5b5b5;\\n color: #363636; }\\n .pagination-previous:focus,\\n .pagination-next:focus,\\n .pagination-link:focus {\\n border-color: #485fc7; }\\n .pagination-previous:active,\\n .pagination-next:active,\\n .pagination-link:active {\\n box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); }\\n .pagination-previous[disabled],\\n .pagination-next[disabled],\\n .pagination-link[disabled] {\\n background-color: #dbdbdb;\\n border-color: #dbdbdb;\\n box-shadow: none;\\n color: #7a7a7a;\\n opacity: 0.5; }\\n\\n.pagination-previous,\\n.pagination-next {\\n padding-left: 0.75em;\\n padding-right: 0.75em;\\n white-space: nowrap; }\\n\\n.pagination-link.is-current {\\n background-color: #485fc7;\\n border-color: #485fc7;\\n color: #fff; }\\n\\n.pagination-ellipsis {\\n color: #b5b5b5;\\n pointer-events: none; }\\n\\n.pagination-list {\\n flex-wrap: wrap; }\\n .pagination-list li {\\n list-style: none; }\\n\\n@media screen and (max-width: 768px) {\\n .pagination {\\n flex-wrap: wrap; }\\n .pagination-previous,\\n .pagination-next {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .pagination-list li {\\n flex-grow: 1;\\n flex-shrink: 1; } }\\n\\n@media screen and (min-width: 769px), print {\\n .pagination-list {\\n flex-grow: 1;\\n flex-shrink: 1;\\n justify-content: flex-start;\\n order: 1; }\\n .pagination-previous,\\n .pagination-next,\\n .pagination-link,\\n .pagination-ellipsis {\\n margin-bottom: 0;\\n margin-top: 0; }\\n .pagination-previous {\\n order: 2; }\\n .pagination-next {\\n order: 3; }\\n .pagination {\\n justify-content: space-between;\\n margin-bottom: 0;\\n margin-top: 0; }\\n .pagination.is-centered .pagination-previous {\\n order: 1; }\\n .pagination.is-centered .pagination-list {\\n justify-content: center;\\n order: 2; }\\n .pagination.is-centered .pagination-next {\\n order: 3; }\\n .pagination.is-right .pagination-previous {\\n order: 1; }\\n .pagination.is-right .pagination-next {\\n order: 2; }\\n .pagination.is-right .pagination-list {\\n justify-content: flex-end;\\n order: 3; } }\\n\\n.panel {\\n border-radius: 6px;\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02);\\n font-size: 1rem; }\\n .panel:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n .panel.is-white .panel-heading {\\n background-color: white;\\n color: #0a0a0a; }\\n .panel.is-white .panel-tabs a.is-active {\\n border-bottom-color: white; }\\n .panel.is-white .panel-block.is-active .panel-icon {\\n color: white; }\\n .panel.is-black .panel-heading {\\n background-color: #0a0a0a;\\n color: white; }\\n .panel.is-black .panel-tabs a.is-active {\\n border-bottom-color: #0a0a0a; }\\n .panel.is-black .panel-block.is-active .panel-icon {\\n color: #0a0a0a; }\\n .panel.is-light .panel-heading {\\n background-color: whitesmoke;\\n color: #363636; }\\n .panel.is-light .panel-tabs a.is-active {\\n border-bottom-color: whitesmoke; }\\n .panel.is-light .panel-block.is-active .panel-icon {\\n color: whitesmoke; }\\n .panel.is-dark .panel-heading {\\n background-color: #363636;\\n color: whitesmoke; }\\n .panel.is-dark .panel-tabs a.is-active {\\n border-bottom-color: #363636; }\\n .panel.is-dark .panel-block.is-active .panel-icon {\\n color: #363636; }\\n .panel.is-primary .panel-heading {\\n background-color: #00d1b2;\\n color: #fff; }\\n .panel.is-primary .panel-tabs a.is-active {\\n border-bottom-color: #00d1b2; }\\n .panel.is-primary .panel-block.is-active .panel-icon {\\n color: #00d1b2; }\\n .panel.is-link .panel-heading {\\n background-color: #485fc7;\\n color: #fff; }\\n .panel.is-link .panel-tabs a.is-active {\\n border-bottom-color: #485fc7; }\\n .panel.is-link .panel-block.is-active .panel-icon {\\n color: #485fc7; }\\n .panel.is-info .panel-heading {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .panel.is-info .panel-tabs a.is-active {\\n border-bottom-color: #3e8ed0; }\\n .panel.is-info .panel-block.is-active .panel-icon {\\n color: #3e8ed0; }\\n .panel.is-success .panel-heading {\\n background-color: #48c78e;\\n color: #fff; }\\n .panel.is-success .panel-tabs a.is-active {\\n border-bottom-color: #48c78e; }\\n .panel.is-success .panel-block.is-active .panel-icon {\\n color: #48c78e; }\\n .panel.is-warning .panel-heading {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .panel.is-warning .panel-tabs a.is-active {\\n border-bottom-color: #ffe08a; }\\n .panel.is-warning .panel-block.is-active .panel-icon {\\n color: #ffe08a; }\\n .panel.is-danger .panel-heading {\\n background-color: #f14668;\\n color: #fff; }\\n .panel.is-danger .panel-tabs a.is-active {\\n border-bottom-color: #f14668; }\\n .panel.is-danger .panel-block.is-active .panel-icon {\\n color: #f14668; }\\n .panel.is-twitter .panel-heading {\\n background-color: #55acee;\\n color: #fff; }\\n .panel.is-twitter .panel-tabs a.is-active {\\n border-bottom-color: #55acee; }\\n .panel.is-twitter .panel-block.is-active .panel-icon {\\n color: #55acee; }\\n .panel.is-linkedin .panel-heading {\\n background-color: #0077b5;\\n color: #fff; }\\n .panel.is-linkedin .panel-tabs a.is-active {\\n border-bottom-color: #0077b5; }\\n .panel.is-linkedin .panel-block.is-active .panel-icon {\\n color: #0077b5; }\\n .panel.is-github .panel-heading {\\n background-color: #333;\\n color: #fff; }\\n .panel.is-github .panel-tabs a.is-active {\\n border-bottom-color: #333; }\\n .panel.is-github .panel-block.is-active .panel-icon {\\n color: #333; }\\n\\n.panel-tabs:not(:last-child),\\n.panel-block:not(:last-child) {\\n border-bottom: 1px solid #ededed; }\\n\\n.panel-heading {\\n background-color: #ededed;\\n border-radius: 6px 6px 0 0;\\n color: #363636;\\n font-size: 1.25em;\\n font-weight: 700;\\n line-height: 1.25;\\n padding: 0.75em 1em; }\\n\\n.panel-tabs {\\n align-items: flex-end;\\n display: flex;\\n font-size: 0.875em;\\n justify-content: center; }\\n .panel-tabs a {\\n border-bottom: 1px solid #dbdbdb;\\n margin-bottom: -1px;\\n padding: 0.5em; }\\n .panel-tabs a.is-active {\\n border-bottom-color: #4a4a4a;\\n color: #363636; }\\n\\n.panel-list a {\\n color: #4a4a4a; }\\n .panel-list a:hover {\\n color: #485fc7; }\\n\\n.panel-block {\\n align-items: center;\\n color: #363636;\\n display: flex;\\n justify-content: flex-start;\\n padding: 0.5em 0.75em; }\\n .panel-block input[type=\\\"checkbox\\\"] {\\n margin-right: 0.75em; }\\n .panel-block > .control {\\n flex-grow: 1;\\n flex-shrink: 1;\\n width: 100%; }\\n .panel-block.is-wrapped {\\n flex-wrap: wrap; }\\n .panel-block.is-active {\\n border-left-color: #485fc7;\\n color: #363636; }\\n .panel-block.is-active .panel-icon {\\n color: #485fc7; }\\n .panel-block:last-child {\\n border-bottom-left-radius: 6px;\\n border-bottom-right-radius: 6px; }\\n\\na.panel-block,\\nlabel.panel-block {\\n cursor: pointer; }\\n a.panel-block:hover,\\n label.panel-block:hover {\\n background-color: whitesmoke; }\\n\\n.panel-icon {\\n display: inline-block;\\n font-size: 14px;\\n height: 1em;\\n line-height: 1em;\\n text-align: center;\\n vertical-align: top;\\n width: 1em;\\n color: #7a7a7a;\\n margin-right: 0.75em; }\\n .panel-icon .fa {\\n font-size: inherit;\\n line-height: inherit; }\\n\\n.tabs {\\n -webkit-overflow-scrolling: touch;\\n align-items: stretch;\\n display: flex;\\n font-size: 1rem;\\n justify-content: space-between;\\n overflow: hidden;\\n overflow-x: auto;\\n white-space: nowrap; }\\n .tabs a {\\n align-items: center;\\n border-bottom-color: #dbdbdb;\\n border-bottom-style: solid;\\n border-bottom-width: 1px;\\n color: #4a4a4a;\\n display: flex;\\n justify-content: center;\\n margin-bottom: -1px;\\n padding: 0.5em 1em;\\n vertical-align: top; }\\n .tabs a:hover {\\n border-bottom-color: #363636;\\n color: #363636; }\\n .tabs li {\\n display: block; }\\n .tabs li.is-active a {\\n border-bottom-color: #485fc7;\\n color: #485fc7; }\\n .tabs ul {\\n align-items: center;\\n border-bottom-color: #dbdbdb;\\n border-bottom-style: solid;\\n border-bottom-width: 1px;\\n display: flex;\\n flex-grow: 1;\\n flex-shrink: 0;\\n justify-content: flex-start; }\\n .tabs ul.is-left {\\n padding-right: 0.75em; }\\n .tabs ul.is-center {\\n flex: none;\\n justify-content: center;\\n padding-left: 0.75em;\\n padding-right: 0.75em; }\\n .tabs ul.is-right {\\n justify-content: flex-end;\\n padding-left: 0.75em; }\\n .tabs .icon:first-child {\\n margin-right: 0.5em; }\\n .tabs .icon:last-child {\\n margin-left: 0.5em; }\\n .tabs.is-centered ul {\\n justify-content: center; }\\n .tabs.is-right ul {\\n justify-content: flex-end; }\\n .tabs.is-boxed a {\\n border: 1px solid transparent;\\n border-radius: 4px 4px 0 0; }\\n .tabs.is-boxed a:hover {\\n background-color: whitesmoke;\\n border-bottom-color: #dbdbdb; }\\n .tabs.is-boxed li.is-active a {\\n background-color: white;\\n border-color: #dbdbdb;\\n border-bottom-color: transparent !important; }\\n .tabs.is-fullwidth li {\\n flex-grow: 1;\\n flex-shrink: 0; }\\n .tabs.is-toggle a {\\n border-color: #dbdbdb;\\n border-style: solid;\\n border-width: 1px;\\n margin-bottom: 0;\\n position: relative; }\\n .tabs.is-toggle a:hover {\\n background-color: whitesmoke;\\n border-color: #b5b5b5;\\n z-index: 2; }\\n .tabs.is-toggle li + li {\\n margin-left: -1px; }\\n .tabs.is-toggle li:first-child a {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px; }\\n .tabs.is-toggle li:last-child a {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px; }\\n .tabs.is-toggle li.is-active a {\\n background-color: #485fc7;\\n border-color: #485fc7;\\n color: #fff;\\n z-index: 1; }\\n .tabs.is-toggle ul {\\n border-bottom: none; }\\n .tabs.is-toggle.is-toggle-rounded li:first-child a {\\n border-bottom-left-radius: 9999px;\\n border-top-left-radius: 9999px;\\n padding-left: 1.25em; }\\n .tabs.is-toggle.is-toggle-rounded li:last-child a {\\n border-bottom-right-radius: 9999px;\\n border-top-right-radius: 9999px;\\n padding-right: 1.25em; }\\n .tabs.is-small {\\n font-size: 0.75rem; }\\n .tabs.is-medium {\\n font-size: 1.25rem; }\\n .tabs.is-large {\\n font-size: 1.5rem; }\\n\\n/* Bulma Grid */\\n.column {\\n display: block;\\n flex-basis: 0;\\n flex-grow: 1;\\n flex-shrink: 1;\\n padding: 0.75rem; }\\n .columns.is-mobile > .column.is-narrow {\\n flex: none;\\n width: unset; }\\n .columns.is-mobile > .column.is-full {\\n flex: none;\\n width: 100%; }\\n .columns.is-mobile > .column.is-three-quarters {\\n flex: none;\\n width: 75%; }\\n .columns.is-mobile > .column.is-two-thirds {\\n flex: none;\\n width: 66.6666%; }\\n .columns.is-mobile > .column.is-half {\\n flex: none;\\n width: 50%; }\\n .columns.is-mobile > .column.is-one-third {\\n flex: none;\\n width: 33.3333%; }\\n .columns.is-mobile > .column.is-one-quarter {\\n flex: none;\\n width: 25%; }\\n .columns.is-mobile > .column.is-one-fifth {\\n flex: none;\\n width: 20%; }\\n .columns.is-mobile > .column.is-two-fifths {\\n flex: none;\\n width: 40%; }\\n .columns.is-mobile > .column.is-three-fifths {\\n flex: none;\\n width: 60%; }\\n .columns.is-mobile > .column.is-four-fifths {\\n flex: none;\\n width: 80%; }\\n .columns.is-mobile > .column.is-offset-three-quarters {\\n margin-left: 75%; }\\n .columns.is-mobile > .column.is-offset-two-thirds {\\n margin-left: 66.6666%; }\\n .columns.is-mobile > .column.is-offset-half {\\n margin-left: 50%; }\\n .columns.is-mobile > .column.is-offset-one-third {\\n margin-left: 33.3333%; }\\n .columns.is-mobile > .column.is-offset-one-quarter {\\n margin-left: 25%; }\\n .columns.is-mobile > .column.is-offset-one-fifth {\\n margin-left: 20%; }\\n .columns.is-mobile > .column.is-offset-two-fifths {\\n margin-left: 40%; }\\n .columns.is-mobile > .column.is-offset-three-fifths {\\n margin-left: 60%; }\\n .columns.is-mobile > .column.is-offset-four-fifths {\\n margin-left: 80%; }\\n .columns.is-mobile > .column.is-0 {\\n flex: none;\\n width: 0%; }\\n .columns.is-mobile > .column.is-offset-0 {\\n margin-left: 0%; }\\n .columns.is-mobile > .column.is-1 {\\n flex: none;\\n width: 8.33333%; }\\n .columns.is-mobile > .column.is-offset-1 {\\n margin-left: 8.33333%; }\\n .columns.is-mobile > .column.is-2 {\\n flex: none;\\n width: 16.66667%; }\\n .columns.is-mobile > .column.is-offset-2 {\\n margin-left: 16.66667%; }\\n .columns.is-mobile > .column.is-3 {\\n flex: none;\\n width: 25%; }\\n .columns.is-mobile > .column.is-offset-3 {\\n margin-left: 25%; }\\n .columns.is-mobile > .column.is-4 {\\n flex: none;\\n width: 33.33333%; }\\n .columns.is-mobile > .column.is-offset-4 {\\n margin-left: 33.33333%; }\\n .columns.is-mobile > .column.is-5 {\\n flex: none;\\n width: 41.66667%; }\\n .columns.is-mobile > .column.is-offset-5 {\\n margin-left: 41.66667%; }\\n .columns.is-mobile > .column.is-6 {\\n flex: none;\\n width: 50%; }\\n .columns.is-mobile > .column.is-offset-6 {\\n margin-left: 50%; }\\n .columns.is-mobile > .column.is-7 {\\n flex: none;\\n width: 58.33333%; }\\n .columns.is-mobile > .column.is-offset-7 {\\n margin-left: 58.33333%; }\\n .columns.is-mobile > .column.is-8 {\\n flex: none;\\n width: 66.66667%; }\\n .columns.is-mobile > .column.is-offset-8 {\\n margin-left: 66.66667%; }\\n .columns.is-mobile > .column.is-9 {\\n flex: none;\\n width: 75%; }\\n .columns.is-mobile > .column.is-offset-9 {\\n margin-left: 75%; }\\n .columns.is-mobile > .column.is-10 {\\n flex: none;\\n width: 83.33333%; }\\n .columns.is-mobile > .column.is-offset-10 {\\n margin-left: 83.33333%; }\\n .columns.is-mobile > .column.is-11 {\\n flex: none;\\n width: 91.66667%; }\\n .columns.is-mobile > .column.is-offset-11 {\\n margin-left: 91.66667%; }\\n .columns.is-mobile > .column.is-12 {\\n flex: none;\\n width: 100%; }\\n .columns.is-mobile > .column.is-offset-12 {\\n margin-left: 100%; }\\n @media screen and (max-width: 768px) {\\n .column.is-narrow-mobile {\\n flex: none;\\n width: unset; }\\n .column.is-full-mobile {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters-mobile {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds-mobile {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half-mobile {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third-mobile {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter-mobile {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth-mobile {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths-mobile {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths-mobile {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths-mobile {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters-mobile {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds-mobile {\\n margin-left: 66.6666%; }\\n .column.is-offset-half-mobile {\\n margin-left: 50%; }\\n .column.is-offset-one-third-mobile {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter-mobile {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth-mobile {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths-mobile {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths-mobile {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths-mobile {\\n margin-left: 80%; }\\n .column.is-0-mobile {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0-mobile {\\n margin-left: 0%; }\\n .column.is-1-mobile {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1-mobile {\\n margin-left: 8.33333%; }\\n .column.is-2-mobile {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2-mobile {\\n margin-left: 16.66667%; }\\n .column.is-3-mobile {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3-mobile {\\n margin-left: 25%; }\\n .column.is-4-mobile {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4-mobile {\\n margin-left: 33.33333%; }\\n .column.is-5-mobile {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5-mobile {\\n margin-left: 41.66667%; }\\n .column.is-6-mobile {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6-mobile {\\n margin-left: 50%; }\\n .column.is-7-mobile {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7-mobile {\\n margin-left: 58.33333%; }\\n .column.is-8-mobile {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8-mobile {\\n margin-left: 66.66667%; }\\n .column.is-9-mobile {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9-mobile {\\n margin-left: 75%; }\\n .column.is-10-mobile {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10-mobile {\\n margin-left: 83.33333%; }\\n .column.is-11-mobile {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11-mobile {\\n margin-left: 91.66667%; }\\n .column.is-12-mobile {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12-mobile {\\n margin-left: 100%; } }\\n @media screen and (min-width: 769px), print {\\n .column.is-narrow, .column.is-narrow-tablet {\\n flex: none;\\n width: unset; }\\n .column.is-full, .column.is-full-tablet {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters, .column.is-three-quarters-tablet {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds, .column.is-two-thirds-tablet {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half, .column.is-half-tablet {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third, .column.is-one-third-tablet {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter, .column.is-one-quarter-tablet {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth, .column.is-one-fifth-tablet {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths, .column.is-two-fifths-tablet {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths, .column.is-three-fifths-tablet {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths, .column.is-four-fifths-tablet {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet {\\n margin-left: 66.6666%; }\\n .column.is-offset-half, .column.is-offset-half-tablet {\\n margin-left: 50%; }\\n .column.is-offset-one-third, .column.is-offset-one-third-tablet {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet {\\n margin-left: 80%; }\\n .column.is-0, .column.is-0-tablet {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0, .column.is-offset-0-tablet {\\n margin-left: 0%; }\\n .column.is-1, .column.is-1-tablet {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1, .column.is-offset-1-tablet {\\n margin-left: 8.33333%; }\\n .column.is-2, .column.is-2-tablet {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2, .column.is-offset-2-tablet {\\n margin-left: 16.66667%; }\\n .column.is-3, .column.is-3-tablet {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3, .column.is-offset-3-tablet {\\n margin-left: 25%; }\\n .column.is-4, .column.is-4-tablet {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4, .column.is-offset-4-tablet {\\n margin-left: 33.33333%; }\\n .column.is-5, .column.is-5-tablet {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5, .column.is-offset-5-tablet {\\n margin-left: 41.66667%; }\\n .column.is-6, .column.is-6-tablet {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6, .column.is-offset-6-tablet {\\n margin-left: 50%; }\\n .column.is-7, .column.is-7-tablet {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7, .column.is-offset-7-tablet {\\n margin-left: 58.33333%; }\\n .column.is-8, .column.is-8-tablet {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8, .column.is-offset-8-tablet {\\n margin-left: 66.66667%; }\\n .column.is-9, .column.is-9-tablet {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9, .column.is-offset-9-tablet {\\n margin-left: 75%; }\\n .column.is-10, .column.is-10-tablet {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10, .column.is-offset-10-tablet {\\n margin-left: 83.33333%; }\\n .column.is-11, .column.is-11-tablet {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11, .column.is-offset-11-tablet {\\n margin-left: 91.66667%; }\\n .column.is-12, .column.is-12-tablet {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12, .column.is-offset-12-tablet {\\n margin-left: 100%; } }\\n @media screen and (max-width: 1023px) {\\n .column.is-narrow-touch {\\n flex: none;\\n width: unset; }\\n .column.is-full-touch {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters-touch {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds-touch {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half-touch {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third-touch {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter-touch {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth-touch {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths-touch {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths-touch {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths-touch {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters-touch {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds-touch {\\n margin-left: 66.6666%; }\\n .column.is-offset-half-touch {\\n margin-left: 50%; }\\n .column.is-offset-one-third-touch {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter-touch {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth-touch {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths-touch {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths-touch {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths-touch {\\n margin-left: 80%; }\\n .column.is-0-touch {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0-touch {\\n margin-left: 0%; }\\n .column.is-1-touch {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1-touch {\\n margin-left: 8.33333%; }\\n .column.is-2-touch {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2-touch {\\n margin-left: 16.66667%; }\\n .column.is-3-touch {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3-touch {\\n margin-left: 25%; }\\n .column.is-4-touch {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4-touch {\\n margin-left: 33.33333%; }\\n .column.is-5-touch {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5-touch {\\n margin-left: 41.66667%; }\\n .column.is-6-touch {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6-touch {\\n margin-left: 50%; }\\n .column.is-7-touch {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7-touch {\\n margin-left: 58.33333%; }\\n .column.is-8-touch {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8-touch {\\n margin-left: 66.66667%; }\\n .column.is-9-touch {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9-touch {\\n margin-left: 75%; }\\n .column.is-10-touch {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10-touch {\\n margin-left: 83.33333%; }\\n .column.is-11-touch {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11-touch {\\n margin-left: 91.66667%; }\\n .column.is-12-touch {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12-touch {\\n margin-left: 100%; } }\\n @media screen and (min-width: 1024px) {\\n .column.is-narrow-desktop {\\n flex: none;\\n width: unset; }\\n .column.is-full-desktop {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters-desktop {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds-desktop {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half-desktop {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third-desktop {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter-desktop {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth-desktop {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths-desktop {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths-desktop {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths-desktop {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters-desktop {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds-desktop {\\n margin-left: 66.6666%; }\\n .column.is-offset-half-desktop {\\n margin-left: 50%; }\\n .column.is-offset-one-third-desktop {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter-desktop {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth-desktop {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths-desktop {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths-desktop {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths-desktop {\\n margin-left: 80%; }\\n .column.is-0-desktop {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0-desktop {\\n margin-left: 0%; }\\n .column.is-1-desktop {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1-desktop {\\n margin-left: 8.33333%; }\\n .column.is-2-desktop {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2-desktop {\\n margin-left: 16.66667%; }\\n .column.is-3-desktop {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3-desktop {\\n margin-left: 25%; }\\n .column.is-4-desktop {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4-desktop {\\n margin-left: 33.33333%; }\\n .column.is-5-desktop {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5-desktop {\\n margin-left: 41.66667%; }\\n .column.is-6-desktop {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6-desktop {\\n margin-left: 50%; }\\n .column.is-7-desktop {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7-desktop {\\n margin-left: 58.33333%; }\\n .column.is-8-desktop {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8-desktop {\\n margin-left: 66.66667%; }\\n .column.is-9-desktop {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9-desktop {\\n margin-left: 75%; }\\n .column.is-10-desktop {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10-desktop {\\n margin-left: 83.33333%; }\\n .column.is-11-desktop {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11-desktop {\\n margin-left: 91.66667%; }\\n .column.is-12-desktop {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12-desktop {\\n margin-left: 100%; } }\\n @media screen and (min-width: 1216px) {\\n .column.is-narrow-widescreen {\\n flex: none;\\n width: unset; }\\n .column.is-full-widescreen {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters-widescreen {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds-widescreen {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half-widescreen {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third-widescreen {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter-widescreen {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth-widescreen {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths-widescreen {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths-widescreen {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths-widescreen {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters-widescreen {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds-widescreen {\\n margin-left: 66.6666%; }\\n .column.is-offset-half-widescreen {\\n margin-left: 50%; }\\n .column.is-offset-one-third-widescreen {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter-widescreen {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth-widescreen {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths-widescreen {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths-widescreen {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths-widescreen {\\n margin-left: 80%; }\\n .column.is-0-widescreen {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0-widescreen {\\n margin-left: 0%; }\\n .column.is-1-widescreen {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1-widescreen {\\n margin-left: 8.33333%; }\\n .column.is-2-widescreen {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2-widescreen {\\n margin-left: 16.66667%; }\\n .column.is-3-widescreen {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3-widescreen {\\n margin-left: 25%; }\\n .column.is-4-widescreen {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4-widescreen {\\n margin-left: 33.33333%; }\\n .column.is-5-widescreen {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5-widescreen {\\n margin-left: 41.66667%; }\\n .column.is-6-widescreen {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6-widescreen {\\n margin-left: 50%; }\\n .column.is-7-widescreen {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7-widescreen {\\n margin-left: 58.33333%; }\\n .column.is-8-widescreen {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8-widescreen {\\n margin-left: 66.66667%; }\\n .column.is-9-widescreen {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9-widescreen {\\n margin-left: 75%; }\\n .column.is-10-widescreen {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10-widescreen {\\n margin-left: 83.33333%; }\\n .column.is-11-widescreen {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11-widescreen {\\n margin-left: 91.66667%; }\\n .column.is-12-widescreen {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12-widescreen {\\n margin-left: 100%; } }\\n @media screen and (min-width: 1408px) {\\n .column.is-narrow-fullhd {\\n flex: none;\\n width: unset; }\\n .column.is-full-fullhd {\\n flex: none;\\n width: 100%; }\\n .column.is-three-quarters-fullhd {\\n flex: none;\\n width: 75%; }\\n .column.is-two-thirds-fullhd {\\n flex: none;\\n width: 66.6666%; }\\n .column.is-half-fullhd {\\n flex: none;\\n width: 50%; }\\n .column.is-one-third-fullhd {\\n flex: none;\\n width: 33.3333%; }\\n .column.is-one-quarter-fullhd {\\n flex: none;\\n width: 25%; }\\n .column.is-one-fifth-fullhd {\\n flex: none;\\n width: 20%; }\\n .column.is-two-fifths-fullhd {\\n flex: none;\\n width: 40%; }\\n .column.is-three-fifths-fullhd {\\n flex: none;\\n width: 60%; }\\n .column.is-four-fifths-fullhd {\\n flex: none;\\n width: 80%; }\\n .column.is-offset-three-quarters-fullhd {\\n margin-left: 75%; }\\n .column.is-offset-two-thirds-fullhd {\\n margin-left: 66.6666%; }\\n .column.is-offset-half-fullhd {\\n margin-left: 50%; }\\n .column.is-offset-one-third-fullhd {\\n margin-left: 33.3333%; }\\n .column.is-offset-one-quarter-fullhd {\\n margin-left: 25%; }\\n .column.is-offset-one-fifth-fullhd {\\n margin-left: 20%; }\\n .column.is-offset-two-fifths-fullhd {\\n margin-left: 40%; }\\n .column.is-offset-three-fifths-fullhd {\\n margin-left: 60%; }\\n .column.is-offset-four-fifths-fullhd {\\n margin-left: 80%; }\\n .column.is-0-fullhd {\\n flex: none;\\n width: 0%; }\\n .column.is-offset-0-fullhd {\\n margin-left: 0%; }\\n .column.is-1-fullhd {\\n flex: none;\\n width: 8.33333%; }\\n .column.is-offset-1-fullhd {\\n margin-left: 8.33333%; }\\n .column.is-2-fullhd {\\n flex: none;\\n width: 16.66667%; }\\n .column.is-offset-2-fullhd {\\n margin-left: 16.66667%; }\\n .column.is-3-fullhd {\\n flex: none;\\n width: 25%; }\\n .column.is-offset-3-fullhd {\\n margin-left: 25%; }\\n .column.is-4-fullhd {\\n flex: none;\\n width: 33.33333%; }\\n .column.is-offset-4-fullhd {\\n margin-left: 33.33333%; }\\n .column.is-5-fullhd {\\n flex: none;\\n width: 41.66667%; }\\n .column.is-offset-5-fullhd {\\n margin-left: 41.66667%; }\\n .column.is-6-fullhd {\\n flex: none;\\n width: 50%; }\\n .column.is-offset-6-fullhd {\\n margin-left: 50%; }\\n .column.is-7-fullhd {\\n flex: none;\\n width: 58.33333%; }\\n .column.is-offset-7-fullhd {\\n margin-left: 58.33333%; }\\n .column.is-8-fullhd {\\n flex: none;\\n width: 66.66667%; }\\n .column.is-offset-8-fullhd {\\n margin-left: 66.66667%; }\\n .column.is-9-fullhd {\\n flex: none;\\n width: 75%; }\\n .column.is-offset-9-fullhd {\\n margin-left: 75%; }\\n .column.is-10-fullhd {\\n flex: none;\\n width: 83.33333%; }\\n .column.is-offset-10-fullhd {\\n margin-left: 83.33333%; }\\n .column.is-11-fullhd {\\n flex: none;\\n width: 91.66667%; }\\n .column.is-offset-11-fullhd {\\n margin-left: 91.66667%; }\\n .column.is-12-fullhd {\\n flex: none;\\n width: 100%; }\\n .column.is-offset-12-fullhd {\\n margin-left: 100%; } }\\n\\n.columns {\\n margin-left: -0.75rem;\\n margin-right: -0.75rem;\\n margin-top: -0.75rem; }\\n .columns:last-child {\\n margin-bottom: -0.75rem; }\\n .columns:not(:last-child) {\\n margin-bottom: calc(1.5rem - 0.75rem); }\\n .columns.is-centered {\\n justify-content: center; }\\n .columns.is-gapless {\\n margin-left: 0;\\n margin-right: 0;\\n margin-top: 0; }\\n .columns.is-gapless > .column {\\n margin: 0;\\n padding: 0 !important; }\\n .columns.is-gapless:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n .columns.is-gapless:last-child {\\n margin-bottom: 0; }\\n .columns.is-mobile {\\n display: flex; }\\n .columns.is-multiline {\\n flex-wrap: wrap; }\\n .columns.is-vcentered {\\n align-items: center; }\\n @media screen and (min-width: 769px), print {\\n .columns:not(.is-desktop) {\\n display: flex; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-desktop {\\n display: flex; } }\\n\\n.columns.is-variable {\\n --columnGap: 0.75rem;\\n margin-left: calc(-1 * var(--columnGap));\\n margin-right: calc(-1 * var(--columnGap)); }\\n .columns.is-variable > .column {\\n padding-left: var(--columnGap);\\n padding-right: var(--columnGap); }\\n .columns.is-variable.is-0 {\\n --columnGap: 0rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-0-mobile {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-0-tablet {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-0-tablet-only {\\n --columnGap: 0rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-0-touch {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-0-desktop {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-0-desktop-only {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-0-widescreen {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-0-widescreen-only {\\n --columnGap: 0rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-0-fullhd {\\n --columnGap: 0rem; } }\\n .columns.is-variable.is-1 {\\n --columnGap: 0.25rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-1-mobile {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-1-tablet {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-1-tablet-only {\\n --columnGap: 0.25rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-1-touch {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-1-desktop {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-1-desktop-only {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-1-widescreen {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-1-widescreen-only {\\n --columnGap: 0.25rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-1-fullhd {\\n --columnGap: 0.25rem; } }\\n .columns.is-variable.is-2 {\\n --columnGap: 0.5rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-2-mobile {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-2-tablet {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-2-tablet-only {\\n --columnGap: 0.5rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-2-touch {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-2-desktop {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-2-desktop-only {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-2-widescreen {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-2-widescreen-only {\\n --columnGap: 0.5rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-2-fullhd {\\n --columnGap: 0.5rem; } }\\n .columns.is-variable.is-3 {\\n --columnGap: 0.75rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-3-mobile {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-3-tablet {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-3-tablet-only {\\n --columnGap: 0.75rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-3-touch {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-3-desktop {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-3-desktop-only {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-3-widescreen {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-3-widescreen-only {\\n --columnGap: 0.75rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-3-fullhd {\\n --columnGap: 0.75rem; } }\\n .columns.is-variable.is-4 {\\n --columnGap: 1rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-4-mobile {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-4-tablet {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-4-tablet-only {\\n --columnGap: 1rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-4-touch {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-4-desktop {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-4-desktop-only {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-4-widescreen {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-4-widescreen-only {\\n --columnGap: 1rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-4-fullhd {\\n --columnGap: 1rem; } }\\n .columns.is-variable.is-5 {\\n --columnGap: 1.25rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-5-mobile {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-5-tablet {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-5-tablet-only {\\n --columnGap: 1.25rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-5-touch {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-5-desktop {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-5-desktop-only {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-5-widescreen {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-5-widescreen-only {\\n --columnGap: 1.25rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-5-fullhd {\\n --columnGap: 1.25rem; } }\\n .columns.is-variable.is-6 {\\n --columnGap: 1.5rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-6-mobile {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-6-tablet {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-6-tablet-only {\\n --columnGap: 1.5rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-6-touch {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-6-desktop {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-6-desktop-only {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-6-widescreen {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-6-widescreen-only {\\n --columnGap: 1.5rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-6-fullhd {\\n --columnGap: 1.5rem; } }\\n .columns.is-variable.is-7 {\\n --columnGap: 1.75rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-7-mobile {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-7-tablet {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-7-tablet-only {\\n --columnGap: 1.75rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-7-touch {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-7-desktop {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-7-desktop-only {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-7-widescreen {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-7-widescreen-only {\\n --columnGap: 1.75rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-7-fullhd {\\n --columnGap: 1.75rem; } }\\n .columns.is-variable.is-8 {\\n --columnGap: 2rem; }\\n @media screen and (max-width: 768px) {\\n .columns.is-variable.is-8-mobile {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 769px), print {\\n .columns.is-variable.is-8-tablet {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 769px) and (max-width: 1023px) {\\n .columns.is-variable.is-8-tablet-only {\\n --columnGap: 2rem; } }\\n @media screen and (max-width: 1023px) {\\n .columns.is-variable.is-8-touch {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 1024px) {\\n .columns.is-variable.is-8-desktop {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .columns.is-variable.is-8-desktop-only {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 1216px) {\\n .columns.is-variable.is-8-widescreen {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .columns.is-variable.is-8-widescreen-only {\\n --columnGap: 2rem; } }\\n @media screen and (min-width: 1408px) {\\n .columns.is-variable.is-8-fullhd {\\n --columnGap: 2rem; } }\\n\\n.tile {\\n align-items: stretch;\\n display: block;\\n flex-basis: 0;\\n flex-grow: 1;\\n flex-shrink: 1;\\n min-height: -webkit-min-content;\\n min-height: -moz-min-content;\\n min-height: min-content; }\\n .tile.is-ancestor {\\n margin-left: -0.75rem;\\n margin-right: -0.75rem;\\n margin-top: -0.75rem; }\\n .tile.is-ancestor:last-child {\\n margin-bottom: -0.75rem; }\\n .tile.is-ancestor:not(:last-child) {\\n margin-bottom: 0.75rem; }\\n .tile.is-child {\\n margin: 0 !important; }\\n .tile.is-parent {\\n padding: 0.75rem; }\\n .tile.is-vertical {\\n flex-direction: column; }\\n .tile.is-vertical > .tile.is-child:not(:last-child) {\\n margin-bottom: 1.5rem !important; }\\n @media screen and (min-width: 769px), print {\\n .tile:not(.is-child) {\\n display: flex; }\\n .tile.is-1 {\\n flex: none;\\n width: 8.33333%; }\\n .tile.is-2 {\\n flex: none;\\n width: 16.66667%; }\\n .tile.is-3 {\\n flex: none;\\n width: 25%; }\\n .tile.is-4 {\\n flex: none;\\n width: 33.33333%; }\\n .tile.is-5 {\\n flex: none;\\n width: 41.66667%; }\\n .tile.is-6 {\\n flex: none;\\n width: 50%; }\\n .tile.is-7 {\\n flex: none;\\n width: 58.33333%; }\\n .tile.is-8 {\\n flex: none;\\n width: 66.66667%; }\\n .tile.is-9 {\\n flex: none;\\n width: 75%; }\\n .tile.is-10 {\\n flex: none;\\n width: 83.33333%; }\\n .tile.is-11 {\\n flex: none;\\n width: 91.66667%; }\\n .tile.is-12 {\\n flex: none;\\n width: 100%; } }\\n\\n/* Bulma Helpers */\\n.has-text-white {\\n color: white !important; }\\n\\na.has-text-white:hover, a.has-text-white:focus {\\n color: #e6e6e6 !important; }\\n\\n.has-background-white {\\n background-color: white !important; }\\n\\n.has-text-black {\\n color: #0a0a0a !important; }\\n\\na.has-text-black:hover, a.has-text-black:focus {\\n color: black !important; }\\n\\n.has-background-black {\\n background-color: #0a0a0a !important; }\\n\\n.has-text-light {\\n color: whitesmoke !important; }\\n\\na.has-text-light:hover, a.has-text-light:focus {\\n color: #dbdbdb !important; }\\n\\n.has-background-light {\\n background-color: whitesmoke !important; }\\n\\n.has-text-dark {\\n color: #363636 !important; }\\n\\na.has-text-dark:hover, a.has-text-dark:focus {\\n color: #1c1c1c !important; }\\n\\n.has-background-dark {\\n background-color: #363636 !important; }\\n\\n.has-text-primary {\\n color: #00d1b2 !important; }\\n\\na.has-text-primary:hover, a.has-text-primary:focus {\\n color: #009e86 !important; }\\n\\n.has-background-primary {\\n background-color: #00d1b2 !important; }\\n\\n.has-text-primary-light {\\n color: #ebfffc !important; }\\n\\na.has-text-primary-light:hover, a.has-text-primary-light:focus {\\n color: #b8fff4 !important; }\\n\\n.has-background-primary-light {\\n background-color: #ebfffc !important; }\\n\\n.has-text-primary-dark {\\n color: #00947e !important; }\\n\\na.has-text-primary-dark:hover, a.has-text-primary-dark:focus {\\n color: #00c7a9 !important; }\\n\\n.has-background-primary-dark {\\n background-color: #00947e !important; }\\n\\n.has-text-link {\\n color: #485fc7 !important; }\\n\\na.has-text-link:hover, a.has-text-link:focus {\\n color: #3449a8 !important; }\\n\\n.has-background-link {\\n background-color: #485fc7 !important; }\\n\\n.has-text-link-light {\\n color: #eff1fa !important; }\\n\\na.has-text-link-light:hover, a.has-text-link-light:focus {\\n color: #c8cfee !important; }\\n\\n.has-background-link-light {\\n background-color: #eff1fa !important; }\\n\\n.has-text-link-dark {\\n color: #3850b7 !important; }\\n\\na.has-text-link-dark:hover, a.has-text-link-dark:focus {\\n color: #576dcb !important; }\\n\\n.has-background-link-dark {\\n background-color: #3850b7 !important; }\\n\\n.has-text-info {\\n color: #3e8ed0 !important; }\\n\\na.has-text-info:hover, a.has-text-info:focus {\\n color: #2b74b1 !important; }\\n\\n.has-background-info {\\n background-color: #3e8ed0 !important; }\\n\\n.has-text-info-light {\\n color: #eff5fb !important; }\\n\\na.has-text-info-light:hover, a.has-text-info-light:focus {\\n color: #c6ddf1 !important; }\\n\\n.has-background-info-light {\\n background-color: #eff5fb !important; }\\n\\n.has-text-info-dark {\\n color: #296fa8 !important; }\\n\\na.has-text-info-dark:hover, a.has-text-info-dark:focus {\\n color: #368ace !important; }\\n\\n.has-background-info-dark {\\n background-color: #296fa8 !important; }\\n\\n.has-text-success {\\n color: #48c78e !important; }\\n\\na.has-text-success:hover, a.has-text-success:focus {\\n color: #34a873 !important; }\\n\\n.has-background-success {\\n background-color: #48c78e !important; }\\n\\n.has-text-success-light {\\n color: #effaf5 !important; }\\n\\na.has-text-success-light:hover, a.has-text-success-light:focus {\\n color: #c8eedd !important; }\\n\\n.has-background-success-light {\\n background-color: #effaf5 !important; }\\n\\n.has-text-success-dark {\\n color: #257953 !important; }\\n\\na.has-text-success-dark:hover, a.has-text-success-dark:focus {\\n color: #31a06e !important; }\\n\\n.has-background-success-dark {\\n background-color: #257953 !important; }\\n\\n.has-text-warning {\\n color: #ffe08a !important; }\\n\\na.has-text-warning:hover, a.has-text-warning:focus {\\n color: #ffd257 !important; }\\n\\n.has-background-warning {\\n background-color: #ffe08a !important; }\\n\\n.has-text-warning-light {\\n color: #fffaeb !important; }\\n\\na.has-text-warning-light:hover, a.has-text-warning-light:focus {\\n color: #ffecb8 !important; }\\n\\n.has-background-warning-light {\\n background-color: #fffaeb !important; }\\n\\n.has-text-warning-dark {\\n color: #946c00 !important; }\\n\\na.has-text-warning-dark:hover, a.has-text-warning-dark:focus {\\n color: #c79200 !important; }\\n\\n.has-background-warning-dark {\\n background-color: #946c00 !important; }\\n\\n.has-text-danger {\\n color: #f14668 !important; }\\n\\na.has-text-danger:hover, a.has-text-danger:focus {\\n color: #ee1742 !important; }\\n\\n.has-background-danger {\\n background-color: #f14668 !important; }\\n\\n.has-text-danger-light {\\n color: #feecf0 !important; }\\n\\na.has-text-danger-light:hover, a.has-text-danger-light:focus {\\n color: #fabdc9 !important; }\\n\\n.has-background-danger-light {\\n background-color: #feecf0 !important; }\\n\\n.has-text-danger-dark {\\n color: #cc0f35 !important; }\\n\\na.has-text-danger-dark:hover, a.has-text-danger-dark:focus {\\n color: #ee2049 !important; }\\n\\n.has-background-danger-dark {\\n background-color: #cc0f35 !important; }\\n\\n.has-text-twitter {\\n color: #55acee !important; }\\n\\na.has-text-twitter:hover, a.has-text-twitter:focus {\\n color: #2795e9 !important; }\\n\\n.has-background-twitter {\\n background-color: #55acee !important; }\\n\\n.has-text-linkedin {\\n color: #0077b5 !important; }\\n\\na.has-text-linkedin:hover, a.has-text-linkedin:focus {\\n color: #005582 !important; }\\n\\n.has-background-linkedin {\\n background-color: #0077b5 !important; }\\n\\n.has-text-github {\\n color: #333 !important; }\\n\\na.has-text-github:hover, a.has-text-github:focus {\\n color: #1a1a1a !important; }\\n\\n.has-background-github {\\n background-color: #333 !important; }\\n\\n.has-text-black-bis {\\n color: #121212 !important; }\\n\\n.has-background-black-bis {\\n background-color: #121212 !important; }\\n\\n.has-text-black-ter {\\n color: #242424 !important; }\\n\\n.has-background-black-ter {\\n background-color: #242424 !important; }\\n\\n.has-text-grey-darker {\\n color: #363636 !important; }\\n\\n.has-background-grey-darker {\\n background-color: #363636 !important; }\\n\\n.has-text-grey-dark {\\n color: #4a4a4a !important; }\\n\\n.has-background-grey-dark {\\n background-color: #4a4a4a !important; }\\n\\n.has-text-grey {\\n color: #7a7a7a !important; }\\n\\n.has-background-grey {\\n background-color: #7a7a7a !important; }\\n\\n.has-text-grey-light {\\n color: #b5b5b5 !important; }\\n\\n.has-background-grey-light {\\n background-color: #b5b5b5 !important; }\\n\\n.has-text-grey-lighter {\\n color: #dbdbdb !important; }\\n\\n.has-background-grey-lighter {\\n background-color: #dbdbdb !important; }\\n\\n.has-text-white-ter {\\n color: whitesmoke !important; }\\n\\n.has-background-white-ter {\\n background-color: whitesmoke !important; }\\n\\n.has-text-white-bis {\\n color: #fafafa !important; }\\n\\n.has-background-white-bis {\\n background-color: #fafafa !important; }\\n\\n.is-flex-direction-row {\\n flex-direction: row !important; }\\n\\n.is-flex-direction-row-reverse {\\n flex-direction: row-reverse !important; }\\n\\n.is-flex-direction-column {\\n flex-direction: column !important; }\\n\\n.is-flex-direction-column-reverse {\\n flex-direction: column-reverse !important; }\\n\\n.is-flex-wrap-nowrap {\\n flex-wrap: nowrap !important; }\\n\\n.is-flex-wrap-wrap {\\n flex-wrap: wrap !important; }\\n\\n.is-flex-wrap-wrap-reverse {\\n flex-wrap: wrap-reverse !important; }\\n\\n.is-justify-content-flex-start {\\n justify-content: flex-start !important; }\\n\\n.is-justify-content-flex-end {\\n justify-content: flex-end !important; }\\n\\n.is-justify-content-center {\\n justify-content: center !important; }\\n\\n.is-justify-content-space-between {\\n justify-content: space-between !important; }\\n\\n.is-justify-content-space-around {\\n justify-content: space-around !important; }\\n\\n.is-justify-content-space-evenly {\\n justify-content: space-evenly !important; }\\n\\n.is-justify-content-start {\\n justify-content: start !important; }\\n\\n.is-justify-content-end {\\n justify-content: end !important; }\\n\\n.is-justify-content-left {\\n justify-content: left !important; }\\n\\n.is-justify-content-right {\\n justify-content: right !important; }\\n\\n.is-align-content-flex-start {\\n align-content: flex-start !important; }\\n\\n.is-align-content-flex-end {\\n align-content: flex-end !important; }\\n\\n.is-align-content-center {\\n align-content: center !important; }\\n\\n.is-align-content-space-between {\\n align-content: space-between !important; }\\n\\n.is-align-content-space-around {\\n align-content: space-around !important; }\\n\\n.is-align-content-space-evenly {\\n align-content: space-evenly !important; }\\n\\n.is-align-content-stretch {\\n align-content: stretch !important; }\\n\\n.is-align-content-start {\\n align-content: start !important; }\\n\\n.is-align-content-end {\\n align-content: end !important; }\\n\\n.is-align-content-baseline {\\n align-content: baseline !important; }\\n\\n.is-align-items-stretch {\\n align-items: stretch !important; }\\n\\n.is-align-items-flex-start {\\n align-items: flex-start !important; }\\n\\n.is-align-items-flex-end {\\n align-items: flex-end !important; }\\n\\n.is-align-items-center {\\n align-items: center !important; }\\n\\n.is-align-items-baseline {\\n align-items: baseline !important; }\\n\\n.is-align-items-start {\\n align-items: start !important; }\\n\\n.is-align-items-end {\\n align-items: end !important; }\\n\\n.is-align-items-self-start {\\n align-items: self-start !important; }\\n\\n.is-align-items-self-end {\\n align-items: self-end !important; }\\n\\n.is-align-self-auto {\\n align-self: auto !important; }\\n\\n.is-align-self-flex-start {\\n align-self: flex-start !important; }\\n\\n.is-align-self-flex-end {\\n align-self: flex-end !important; }\\n\\n.is-align-self-center {\\n align-self: center !important; }\\n\\n.is-align-self-baseline {\\n align-self: baseline !important; }\\n\\n.is-align-self-stretch {\\n align-self: stretch !important; }\\n\\n.is-flex-grow-0 {\\n flex-grow: 0 !important; }\\n\\n.is-flex-grow-1 {\\n flex-grow: 1 !important; }\\n\\n.is-flex-grow-2 {\\n flex-grow: 2 !important; }\\n\\n.is-flex-grow-3 {\\n flex-grow: 3 !important; }\\n\\n.is-flex-grow-4 {\\n flex-grow: 4 !important; }\\n\\n.is-flex-grow-5 {\\n flex-grow: 5 !important; }\\n\\n.is-flex-shrink-0 {\\n flex-shrink: 0 !important; }\\n\\n.is-flex-shrink-1 {\\n flex-shrink: 1 !important; }\\n\\n.is-flex-shrink-2 {\\n flex-shrink: 2 !important; }\\n\\n.is-flex-shrink-3 {\\n flex-shrink: 3 !important; }\\n\\n.is-flex-shrink-4 {\\n flex-shrink: 4 !important; }\\n\\n.is-flex-shrink-5 {\\n flex-shrink: 5 !important; }\\n\\n.is-clearfix::after {\\n clear: both;\\n content: \\\" \\\";\\n display: table; }\\n\\n.is-pulled-left {\\n float: left !important; }\\n\\n.is-pulled-right {\\n float: right !important; }\\n\\n.is-radiusless {\\n border-radius: 0 !important; }\\n\\n.is-shadowless {\\n box-shadow: none !important; }\\n\\n.is-clickable {\\n cursor: pointer !important;\\n pointer-events: all !important; }\\n\\n.is-clipped {\\n overflow: hidden !important; }\\n\\n.is-relative {\\n position: relative !important; }\\n\\n.is-marginless {\\n margin: 0 !important; }\\n\\n.is-paddingless {\\n padding: 0 !important; }\\n\\n.m-0 {\\n margin: 0 !important; }\\n\\n.mt-0 {\\n margin-top: 0 !important; }\\n\\n.mr-0 {\\n margin-right: 0 !important; }\\n\\n.mb-0 {\\n margin-bottom: 0 !important; }\\n\\n.ml-0 {\\n margin-left: 0 !important; }\\n\\n.mx-0 {\\n margin-left: 0 !important;\\n margin-right: 0 !important; }\\n\\n.my-0 {\\n margin-top: 0 !important;\\n margin-bottom: 0 !important; }\\n\\n.m-1 {\\n margin: 0.25rem !important; }\\n\\n.mt-1 {\\n margin-top: 0.25rem !important; }\\n\\n.mr-1 {\\n margin-right: 0.25rem !important; }\\n\\n.mb-1 {\\n margin-bottom: 0.25rem !important; }\\n\\n.ml-1 {\\n margin-left: 0.25rem !important; }\\n\\n.mx-1 {\\n margin-left: 0.25rem !important;\\n margin-right: 0.25rem !important; }\\n\\n.my-1 {\\n margin-top: 0.25rem !important;\\n margin-bottom: 0.25rem !important; }\\n\\n.m-2 {\\n margin: 0.5rem !important; }\\n\\n.mt-2 {\\n margin-top: 0.5rem !important; }\\n\\n.mr-2 {\\n margin-right: 0.5rem !important; }\\n\\n.mb-2 {\\n margin-bottom: 0.5rem !important; }\\n\\n.ml-2 {\\n margin-left: 0.5rem !important; }\\n\\n.mx-2 {\\n margin-left: 0.5rem !important;\\n margin-right: 0.5rem !important; }\\n\\n.my-2 {\\n margin-top: 0.5rem !important;\\n margin-bottom: 0.5rem !important; }\\n\\n.m-3 {\\n margin: 0.75rem !important; }\\n\\n.mt-3 {\\n margin-top: 0.75rem !important; }\\n\\n.mr-3 {\\n margin-right: 0.75rem !important; }\\n\\n.mb-3 {\\n margin-bottom: 0.75rem !important; }\\n\\n.ml-3 {\\n margin-left: 0.75rem !important; }\\n\\n.mx-3 {\\n margin-left: 0.75rem !important;\\n margin-right: 0.75rem !important; }\\n\\n.my-3 {\\n margin-top: 0.75rem !important;\\n margin-bottom: 0.75rem !important; }\\n\\n.m-4 {\\n margin: 1rem !important; }\\n\\n.mt-4 {\\n margin-top: 1rem !important; }\\n\\n.mr-4 {\\n margin-right: 1rem !important; }\\n\\n.mb-4 {\\n margin-bottom: 1rem !important; }\\n\\n.ml-4 {\\n margin-left: 1rem !important; }\\n\\n.mx-4 {\\n margin-left: 1rem !important;\\n margin-right: 1rem !important; }\\n\\n.my-4 {\\n margin-top: 1rem !important;\\n margin-bottom: 1rem !important; }\\n\\n.m-5 {\\n margin: 1.5rem !important; }\\n\\n.mt-5 {\\n margin-top: 1.5rem !important; }\\n\\n.mr-5 {\\n margin-right: 1.5rem !important; }\\n\\n.mb-5 {\\n margin-bottom: 1.5rem !important; }\\n\\n.ml-5 {\\n margin-left: 1.5rem !important; }\\n\\n.mx-5 {\\n margin-left: 1.5rem !important;\\n margin-right: 1.5rem !important; }\\n\\n.my-5 {\\n margin-top: 1.5rem !important;\\n margin-bottom: 1.5rem !important; }\\n\\n.m-6 {\\n margin: 3rem !important; }\\n\\n.mt-6 {\\n margin-top: 3rem !important; }\\n\\n.mr-6 {\\n margin-right: 3rem !important; }\\n\\n.mb-6 {\\n margin-bottom: 3rem !important; }\\n\\n.ml-6 {\\n margin-left: 3rem !important; }\\n\\n.mx-6 {\\n margin-left: 3rem !important;\\n margin-right: 3rem !important; }\\n\\n.my-6 {\\n margin-top: 3rem !important;\\n margin-bottom: 3rem !important; }\\n\\n.m-auto {\\n margin: auto !important; }\\n\\n.mt-auto {\\n margin-top: auto !important; }\\n\\n.mr-auto {\\n margin-right: auto !important; }\\n\\n.mb-auto {\\n margin-bottom: auto !important; }\\n\\n.ml-auto {\\n margin-left: auto !important; }\\n\\n.mx-auto {\\n margin-left: auto !important;\\n margin-right: auto !important; }\\n\\n.my-auto {\\n margin-top: auto !important;\\n margin-bottom: auto !important; }\\n\\n.p-0 {\\n padding: 0 !important; }\\n\\n.pt-0 {\\n padding-top: 0 !important; }\\n\\n.pr-0 {\\n padding-right: 0 !important; }\\n\\n.pb-0 {\\n padding-bottom: 0 !important; }\\n\\n.pl-0 {\\n padding-left: 0 !important; }\\n\\n.px-0 {\\n padding-left: 0 !important;\\n padding-right: 0 !important; }\\n\\n.py-0 {\\n padding-top: 0 !important;\\n padding-bottom: 0 !important; }\\n\\n.p-1 {\\n padding: 0.25rem !important; }\\n\\n.pt-1 {\\n padding-top: 0.25rem !important; }\\n\\n.pr-1 {\\n padding-right: 0.25rem !important; }\\n\\n.pb-1 {\\n padding-bottom: 0.25rem !important; }\\n\\n.pl-1 {\\n padding-left: 0.25rem !important; }\\n\\n.px-1 {\\n padding-left: 0.25rem !important;\\n padding-right: 0.25rem !important; }\\n\\n.py-1 {\\n padding-top: 0.25rem !important;\\n padding-bottom: 0.25rem !important; }\\n\\n.p-2 {\\n padding: 0.5rem !important; }\\n\\n.pt-2 {\\n padding-top: 0.5rem !important; }\\n\\n.pr-2 {\\n padding-right: 0.5rem !important; }\\n\\n.pb-2 {\\n padding-bottom: 0.5rem !important; }\\n\\n.pl-2 {\\n padding-left: 0.5rem !important; }\\n\\n.px-2 {\\n padding-left: 0.5rem !important;\\n padding-right: 0.5rem !important; }\\n\\n.py-2 {\\n padding-top: 0.5rem !important;\\n padding-bottom: 0.5rem !important; }\\n\\n.p-3 {\\n padding: 0.75rem !important; }\\n\\n.pt-3 {\\n padding-top: 0.75rem !important; }\\n\\n.pr-3 {\\n padding-right: 0.75rem !important; }\\n\\n.pb-3 {\\n padding-bottom: 0.75rem !important; }\\n\\n.pl-3 {\\n padding-left: 0.75rem !important; }\\n\\n.px-3 {\\n padding-left: 0.75rem !important;\\n padding-right: 0.75rem !important; }\\n\\n.py-3 {\\n padding-top: 0.75rem !important;\\n padding-bottom: 0.75rem !important; }\\n\\n.p-4 {\\n padding: 1rem !important; }\\n\\n.pt-4 {\\n padding-top: 1rem !important; }\\n\\n.pr-4 {\\n padding-right: 1rem !important; }\\n\\n.pb-4 {\\n padding-bottom: 1rem !important; }\\n\\n.pl-4 {\\n padding-left: 1rem !important; }\\n\\n.px-4 {\\n padding-left: 1rem !important;\\n padding-right: 1rem !important; }\\n\\n.py-4 {\\n padding-top: 1rem !important;\\n padding-bottom: 1rem !important; }\\n\\n.p-5 {\\n padding: 1.5rem !important; }\\n\\n.pt-5 {\\n padding-top: 1.5rem !important; }\\n\\n.pr-5 {\\n padding-right: 1.5rem !important; }\\n\\n.pb-5 {\\n padding-bottom: 1.5rem !important; }\\n\\n.pl-5 {\\n padding-left: 1.5rem !important; }\\n\\n.px-5 {\\n padding-left: 1.5rem !important;\\n padding-right: 1.5rem !important; }\\n\\n.py-5 {\\n padding-top: 1.5rem !important;\\n padding-bottom: 1.5rem !important; }\\n\\n.p-6 {\\n padding: 3rem !important; }\\n\\n.pt-6 {\\n padding-top: 3rem !important; }\\n\\n.pr-6 {\\n padding-right: 3rem !important; }\\n\\n.pb-6 {\\n padding-bottom: 3rem !important; }\\n\\n.pl-6 {\\n padding-left: 3rem !important; }\\n\\n.px-6 {\\n padding-left: 3rem !important;\\n padding-right: 3rem !important; }\\n\\n.py-6 {\\n padding-top: 3rem !important;\\n padding-bottom: 3rem !important; }\\n\\n.p-auto {\\n padding: auto !important; }\\n\\n.pt-auto {\\n padding-top: auto !important; }\\n\\n.pr-auto {\\n padding-right: auto !important; }\\n\\n.pb-auto {\\n padding-bottom: auto !important; }\\n\\n.pl-auto {\\n padding-left: auto !important; }\\n\\n.px-auto {\\n padding-left: auto !important;\\n padding-right: auto !important; }\\n\\n.py-auto {\\n padding-top: auto !important;\\n padding-bottom: auto !important; }\\n\\n.is-size-1 {\\n font-size: 3rem !important; }\\n\\n.is-size-2 {\\n font-size: 2.5rem !important; }\\n\\n.is-size-3 {\\n font-size: 2rem !important; }\\n\\n.is-size-4 {\\n font-size: 1.5rem !important; }\\n\\n.is-size-5 {\\n font-size: 1.25rem !important; }\\n\\n.is-size-6 {\\n font-size: 1rem !important; }\\n\\n.is-size-7 {\\n font-size: 0.75rem !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-size-1-mobile {\\n font-size: 3rem !important; }\\n .is-size-2-mobile {\\n font-size: 2.5rem !important; }\\n .is-size-3-mobile {\\n font-size: 2rem !important; }\\n .is-size-4-mobile {\\n font-size: 1.5rem !important; }\\n .is-size-5-mobile {\\n font-size: 1.25rem !important; }\\n .is-size-6-mobile {\\n font-size: 1rem !important; }\\n .is-size-7-mobile {\\n font-size: 0.75rem !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-size-1-tablet {\\n font-size: 3rem !important; }\\n .is-size-2-tablet {\\n font-size: 2.5rem !important; }\\n .is-size-3-tablet {\\n font-size: 2rem !important; }\\n .is-size-4-tablet {\\n font-size: 1.5rem !important; }\\n .is-size-5-tablet {\\n font-size: 1.25rem !important; }\\n .is-size-6-tablet {\\n font-size: 1rem !important; }\\n .is-size-7-tablet {\\n font-size: 0.75rem !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-size-1-touch {\\n font-size: 3rem !important; }\\n .is-size-2-touch {\\n font-size: 2.5rem !important; }\\n .is-size-3-touch {\\n font-size: 2rem !important; }\\n .is-size-4-touch {\\n font-size: 1.5rem !important; }\\n .is-size-5-touch {\\n font-size: 1.25rem !important; }\\n .is-size-6-touch {\\n font-size: 1rem !important; }\\n .is-size-7-touch {\\n font-size: 0.75rem !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-size-1-desktop {\\n font-size: 3rem !important; }\\n .is-size-2-desktop {\\n font-size: 2.5rem !important; }\\n .is-size-3-desktop {\\n font-size: 2rem !important; }\\n .is-size-4-desktop {\\n font-size: 1.5rem !important; }\\n .is-size-5-desktop {\\n font-size: 1.25rem !important; }\\n .is-size-6-desktop {\\n font-size: 1rem !important; }\\n .is-size-7-desktop {\\n font-size: 0.75rem !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-size-1-widescreen {\\n font-size: 3rem !important; }\\n .is-size-2-widescreen {\\n font-size: 2.5rem !important; }\\n .is-size-3-widescreen {\\n font-size: 2rem !important; }\\n .is-size-4-widescreen {\\n font-size: 1.5rem !important; }\\n .is-size-5-widescreen {\\n font-size: 1.25rem !important; }\\n .is-size-6-widescreen {\\n font-size: 1rem !important; }\\n .is-size-7-widescreen {\\n font-size: 0.75rem !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-size-1-fullhd {\\n font-size: 3rem !important; }\\n .is-size-2-fullhd {\\n font-size: 2.5rem !important; }\\n .is-size-3-fullhd {\\n font-size: 2rem !important; }\\n .is-size-4-fullhd {\\n font-size: 1.5rem !important; }\\n .is-size-5-fullhd {\\n font-size: 1.25rem !important; }\\n .is-size-6-fullhd {\\n font-size: 1rem !important; }\\n .is-size-7-fullhd {\\n font-size: 0.75rem !important; } }\\n\\n.has-text-centered {\\n text-align: center !important; }\\n\\n.has-text-justified {\\n text-align: justify !important; }\\n\\n.has-text-left {\\n text-align: left !important; }\\n\\n.has-text-right {\\n text-align: right !important; }\\n\\n@media screen and (max-width: 768px) {\\n .has-text-centered-mobile {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .has-text-centered-tablet {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .has-text-centered-tablet-only {\\n text-align: center !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .has-text-centered-touch {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .has-text-centered-desktop {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .has-text-centered-desktop-only {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .has-text-centered-widescreen {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .has-text-centered-widescreen-only {\\n text-align: center !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .has-text-centered-fullhd {\\n text-align: center !important; } }\\n\\n@media screen and (max-width: 768px) {\\n .has-text-justified-mobile {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .has-text-justified-tablet {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .has-text-justified-tablet-only {\\n text-align: justify !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .has-text-justified-touch {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .has-text-justified-desktop {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .has-text-justified-desktop-only {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .has-text-justified-widescreen {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .has-text-justified-widescreen-only {\\n text-align: justify !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .has-text-justified-fullhd {\\n text-align: justify !important; } }\\n\\n@media screen and (max-width: 768px) {\\n .has-text-left-mobile {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .has-text-left-tablet {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .has-text-left-tablet-only {\\n text-align: left !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .has-text-left-touch {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .has-text-left-desktop {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .has-text-left-desktop-only {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .has-text-left-widescreen {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .has-text-left-widescreen-only {\\n text-align: left !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .has-text-left-fullhd {\\n text-align: left !important; } }\\n\\n@media screen and (max-width: 768px) {\\n .has-text-right-mobile {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .has-text-right-tablet {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .has-text-right-tablet-only {\\n text-align: right !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .has-text-right-touch {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .has-text-right-desktop {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .has-text-right-desktop-only {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .has-text-right-widescreen {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .has-text-right-widescreen-only {\\n text-align: right !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .has-text-right-fullhd {\\n text-align: right !important; } }\\n\\n.is-capitalized {\\n text-transform: capitalize !important; }\\n\\n.is-lowercase {\\n text-transform: lowercase !important; }\\n\\n.is-uppercase {\\n text-transform: uppercase !important; }\\n\\n.is-italic {\\n font-style: italic !important; }\\n\\n.is-underlined {\\n text-decoration: underline !important; }\\n\\n.has-text-weight-light {\\n font-weight: 300 !important; }\\n\\n.has-text-weight-normal {\\n font-weight: 400 !important; }\\n\\n.has-text-weight-medium {\\n font-weight: 500 !important; }\\n\\n.has-text-weight-semibold {\\n font-weight: 600 !important; }\\n\\n.has-text-weight-bold {\\n font-weight: 700 !important; }\\n\\n.is-family-primary {\\n font-family: BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", \\\"Roboto\\\", \\\"Oxygen\\\", \\\"Ubuntu\\\", \\\"Cantarell\\\", \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", \\\"Helvetica\\\", \\\"Arial\\\", sans-serif !important; }\\n\\n.is-family-secondary {\\n font-family: BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", \\\"Roboto\\\", \\\"Oxygen\\\", \\\"Ubuntu\\\", \\\"Cantarell\\\", \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", \\\"Helvetica\\\", \\\"Arial\\\", sans-serif !important; }\\n\\n.is-family-sans-serif {\\n font-family: BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", \\\"Roboto\\\", \\\"Oxygen\\\", \\\"Ubuntu\\\", \\\"Cantarell\\\", \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", \\\"Helvetica\\\", \\\"Arial\\\", sans-serif !important; }\\n\\n.is-family-monospace {\\n font-family: monospace !important; }\\n\\n.is-family-code {\\n font-family: monospace !important; }\\n\\n.is-block {\\n display: block !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-block-mobile {\\n display: block !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-block-tablet {\\n display: block !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-block-tablet-only {\\n display: block !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-block-touch {\\n display: block !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-block-desktop {\\n display: block !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-block-desktop-only {\\n display: block !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-block-widescreen {\\n display: block !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-block-widescreen-only {\\n display: block !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-block-fullhd {\\n display: block !important; } }\\n\\n.is-flex {\\n display: flex !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-flex-mobile {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-flex-tablet {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-flex-tablet-only {\\n display: flex !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-flex-touch {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-flex-desktop {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-flex-desktop-only {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-flex-widescreen {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-flex-widescreen-only {\\n display: flex !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-flex-fullhd {\\n display: flex !important; } }\\n\\n.is-inline {\\n display: inline !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-inline-mobile {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-inline-tablet {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-inline-tablet-only {\\n display: inline !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-inline-touch {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-inline-desktop {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-inline-desktop-only {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-inline-widescreen {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-inline-widescreen-only {\\n display: inline !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-inline-fullhd {\\n display: inline !important; } }\\n\\n.is-inline-block {\\n display: inline-block !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-inline-block-mobile {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-inline-block-tablet {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-inline-block-tablet-only {\\n display: inline-block !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-inline-block-touch {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-inline-block-desktop {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-inline-block-desktop-only {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-inline-block-widescreen {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-inline-block-widescreen-only {\\n display: inline-block !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-inline-block-fullhd {\\n display: inline-block !important; } }\\n\\n.is-inline-flex {\\n display: inline-flex !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-inline-flex-mobile {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-inline-flex-tablet {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-inline-flex-tablet-only {\\n display: inline-flex !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-inline-flex-touch {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-inline-flex-desktop {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-inline-flex-desktop-only {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-inline-flex-widescreen {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-inline-flex-widescreen-only {\\n display: inline-flex !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-inline-flex-fullhd {\\n display: inline-flex !important; } }\\n\\n.is-hidden {\\n display: none !important; }\\n\\n.is-sr-only {\\n border: none !important;\\n clip: rect(0, 0, 0, 0) !important;\\n height: 0.01em !important;\\n overflow: hidden !important;\\n padding: 0 !important;\\n position: absolute !important;\\n white-space: nowrap !important;\\n width: 0.01em !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-hidden-mobile {\\n display: none !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-hidden-tablet {\\n display: none !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-hidden-tablet-only {\\n display: none !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-hidden-touch {\\n display: none !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-hidden-desktop {\\n display: none !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-hidden-desktop-only {\\n display: none !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-hidden-widescreen {\\n display: none !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-hidden-widescreen-only {\\n display: none !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-hidden-fullhd {\\n display: none !important; } }\\n\\n.is-invisible {\\n visibility: hidden !important; }\\n\\n@media screen and (max-width: 768px) {\\n .is-invisible-mobile {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 769px), print {\\n .is-invisible-tablet {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 769px) and (max-width: 1023px) {\\n .is-invisible-tablet-only {\\n visibility: hidden !important; } }\\n\\n@media screen and (max-width: 1023px) {\\n .is-invisible-touch {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 1024px) {\\n .is-invisible-desktop {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 1024px) and (max-width: 1215px) {\\n .is-invisible-desktop-only {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 1216px) {\\n .is-invisible-widescreen {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 1216px) and (max-width: 1407px) {\\n .is-invisible-widescreen-only {\\n visibility: hidden !important; } }\\n\\n@media screen and (min-width: 1408px) {\\n .is-invisible-fullhd {\\n visibility: hidden !important; } }\\n\\n/* Bulma Layout */\\n.hero {\\n align-items: stretch;\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between; }\\n .hero .navbar {\\n background: none; }\\n .hero .tabs ul {\\n border-bottom: none; }\\n .hero.is-white {\\n background-color: white;\\n color: #0a0a0a; }\\n .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-white strong {\\n color: inherit; }\\n .hero.is-white .title {\\n color: #0a0a0a; }\\n .hero.is-white .subtitle {\\n color: rgba(10, 10, 10, 0.9); }\\n .hero.is-white .subtitle a:not(.button),\\n .hero.is-white .subtitle strong {\\n color: #0a0a0a; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-white .navbar-menu {\\n background-color: white; } }\\n .hero.is-white .navbar-item,\\n .hero.is-white .navbar-link {\\n color: rgba(10, 10, 10, 0.7); }\\n .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active,\\n .hero.is-white .navbar-link:hover,\\n .hero.is-white .navbar-link.is-active {\\n background-color: #f2f2f2;\\n color: #0a0a0a; }\\n .hero.is-white .tabs a {\\n color: #0a0a0a;\\n opacity: 0.9; }\\n .hero.is-white .tabs a:hover {\\n opacity: 1; }\\n .hero.is-white .tabs li.is-active a {\\n color: white !important;\\n opacity: 1; }\\n .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a {\\n color: #0a0a0a; }\\n .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover {\\n background-color: #0a0a0a;\\n border-color: #0a0a0a;\\n color: white; }\\n .hero.is-white.is-bold {\\n background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-white.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); } }\\n .hero.is-black {\\n background-color: #0a0a0a;\\n color: white; }\\n .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-black strong {\\n color: inherit; }\\n .hero.is-black .title {\\n color: white; }\\n .hero.is-black .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-black .subtitle a:not(.button),\\n .hero.is-black .subtitle strong {\\n color: white; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-black .navbar-menu {\\n background-color: #0a0a0a; } }\\n .hero.is-black .navbar-item,\\n .hero.is-black .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active,\\n .hero.is-black .navbar-link:hover,\\n .hero.is-black .navbar-link.is-active {\\n background-color: black;\\n color: white; }\\n .hero.is-black .tabs a {\\n color: white;\\n opacity: 0.9; }\\n .hero.is-black .tabs a:hover {\\n opacity: 1; }\\n .hero.is-black .tabs li.is-active a {\\n color: #0a0a0a !important;\\n opacity: 1; }\\n .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a {\\n color: white; }\\n .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover {\\n background-color: white;\\n border-color: white;\\n color: #0a0a0a; }\\n .hero.is-black.is-bold {\\n background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-black.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } }\\n .hero.is-light {\\n background-color: whitesmoke;\\n color: #363636; }\\n .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-light strong {\\n color: inherit; }\\n .hero.is-light .title {\\n color: #363636; }\\n .hero.is-light .subtitle {\\n color: rgba(54, 54, 54, 0.9); }\\n .hero.is-light .subtitle a:not(.button),\\n .hero.is-light .subtitle strong {\\n color: #363636; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-light .navbar-menu {\\n background-color: whitesmoke; } }\\n .hero.is-light .navbar-item,\\n .hero.is-light .navbar-link {\\n color: rgba(54, 54, 54, 0.7); }\\n .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active,\\n .hero.is-light .navbar-link:hover,\\n .hero.is-light .navbar-link.is-active {\\n background-color: #e8e8e8;\\n color: #363636; }\\n .hero.is-light .tabs a {\\n color: #363636;\\n opacity: 0.9; }\\n .hero.is-light .tabs a:hover {\\n opacity: 1; }\\n .hero.is-light .tabs li.is-active a {\\n color: whitesmoke !important;\\n opacity: 1; }\\n .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a {\\n color: #363636; }\\n .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover {\\n background-color: #363636;\\n border-color: #363636;\\n color: whitesmoke; }\\n .hero.is-light.is-bold {\\n background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-light.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } }\\n .hero.is-dark {\\n background-color: #363636;\\n color: whitesmoke; }\\n .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-dark strong {\\n color: inherit; }\\n .hero.is-dark .title {\\n color: whitesmoke; }\\n .hero.is-dark .subtitle {\\n color: rgba(245, 245, 245, 0.9); }\\n .hero.is-dark .subtitle a:not(.button),\\n .hero.is-dark .subtitle strong {\\n color: whitesmoke; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-dark .navbar-menu {\\n background-color: #363636; } }\\n .hero.is-dark .navbar-item,\\n .hero.is-dark .navbar-link {\\n color: rgba(245, 245, 245, 0.7); }\\n .hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active,\\n .hero.is-dark .navbar-link:hover,\\n .hero.is-dark .navbar-link.is-active {\\n background-color: #292929;\\n color: whitesmoke; }\\n .hero.is-dark .tabs a {\\n color: whitesmoke;\\n opacity: 0.9; }\\n .hero.is-dark .tabs a:hover {\\n opacity: 1; }\\n .hero.is-dark .tabs li.is-active a {\\n color: #363636 !important;\\n opacity: 1; }\\n .hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a {\\n color: whitesmoke; }\\n .hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover {\\n background-color: whitesmoke;\\n border-color: whitesmoke;\\n color: #363636; }\\n .hero.is-dark.is-bold {\\n background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-dark.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } }\\n .hero.is-primary {\\n background-color: #00d1b2;\\n color: #fff; }\\n .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-primary strong {\\n color: inherit; }\\n .hero.is-primary .title {\\n color: #fff; }\\n .hero.is-primary .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-primary .subtitle a:not(.button),\\n .hero.is-primary .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-primary .navbar-menu {\\n background-color: #00d1b2; } }\\n .hero.is-primary .navbar-item,\\n .hero.is-primary .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active,\\n .hero.is-primary .navbar-link:hover,\\n .hero.is-primary .navbar-link.is-active {\\n background-color: #00b89c;\\n color: #fff; }\\n .hero.is-primary .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-primary .tabs a:hover {\\n opacity: 1; }\\n .hero.is-primary .tabs li.is-active a {\\n color: #00d1b2 !important;\\n opacity: 1; }\\n .hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #00d1b2; }\\n .hero.is-primary.is-bold {\\n background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-primary.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); } }\\n .hero.is-link {\\n background-color: #485fc7;\\n color: #fff; }\\n .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-link strong {\\n color: inherit; }\\n .hero.is-link .title {\\n color: #fff; }\\n .hero.is-link .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-link .subtitle a:not(.button),\\n .hero.is-link .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-link .navbar-menu {\\n background-color: #485fc7; } }\\n .hero.is-link .navbar-item,\\n .hero.is-link .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active,\\n .hero.is-link .navbar-link:hover,\\n .hero.is-link .navbar-link.is-active {\\n background-color: #3a51bb;\\n color: #fff; }\\n .hero.is-link .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-link .tabs a:hover {\\n opacity: 1; }\\n .hero.is-link .tabs li.is-active a {\\n color: #485fc7 !important;\\n opacity: 1; }\\n .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #485fc7; }\\n .hero.is-link.is-bold {\\n background-image: linear-gradient(141deg, #2959b3 0%, #485fc7 71%, #5658d2 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-link.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #2959b3 0%, #485fc7 71%, #5658d2 100%); } }\\n .hero.is-info {\\n background-color: #3e8ed0;\\n color: #fff; }\\n .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-info strong {\\n color: inherit; }\\n .hero.is-info .title {\\n color: #fff; }\\n .hero.is-info .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-info .subtitle a:not(.button),\\n .hero.is-info .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-info .navbar-menu {\\n background-color: #3e8ed0; } }\\n .hero.is-info .navbar-item,\\n .hero.is-info .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,\\n .hero.is-info .navbar-link:hover,\\n .hero.is-info .navbar-link.is-active {\\n background-color: #3082c5;\\n color: #fff; }\\n .hero.is-info .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-info .tabs a:hover {\\n opacity: 1; }\\n .hero.is-info .tabs li.is-active a {\\n color: #3e8ed0 !important;\\n opacity: 1; }\\n .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #3e8ed0; }\\n .hero.is-info.is-bold {\\n background-image: linear-gradient(141deg, #208fbc 0%, #3e8ed0 71%, #4d83db 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-info.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #208fbc 0%, #3e8ed0 71%, #4d83db 100%); } }\\n .hero.is-success {\\n background-color: #48c78e;\\n color: #fff; }\\n .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-success strong {\\n color: inherit; }\\n .hero.is-success .title {\\n color: #fff; }\\n .hero.is-success .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-success .subtitle a:not(.button),\\n .hero.is-success .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-success .navbar-menu {\\n background-color: #48c78e; } }\\n .hero.is-success .navbar-item,\\n .hero.is-success .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active,\\n .hero.is-success .navbar-link:hover,\\n .hero.is-success .navbar-link.is-active {\\n background-color: #3abb81;\\n color: #fff; }\\n .hero.is-success .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-success .tabs a:hover {\\n opacity: 1; }\\n .hero.is-success .tabs li.is-active a {\\n color: #48c78e !important;\\n opacity: 1; }\\n .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #48c78e; }\\n .hero.is-success.is-bold {\\n background-image: linear-gradient(141deg, #29b35e 0%, #48c78e 71%, #56d2af 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-success.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #29b35e 0%, #48c78e 71%, #56d2af 100%); } }\\n .hero.is-warning {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-warning strong {\\n color: inherit; }\\n .hero.is-warning .title {\\n color: rgba(0, 0, 0, 0.7); }\\n .hero.is-warning .subtitle {\\n color: rgba(0, 0, 0, 0.9); }\\n .hero.is-warning .subtitle a:not(.button),\\n .hero.is-warning .subtitle strong {\\n color: rgba(0, 0, 0, 0.7); }\\n @media screen and (max-width: 1023px) {\\n .hero.is-warning .navbar-menu {\\n background-color: #ffe08a; } }\\n .hero.is-warning .navbar-item,\\n .hero.is-warning .navbar-link {\\n color: rgba(0, 0, 0, 0.7); }\\n .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active,\\n .hero.is-warning .navbar-link:hover,\\n .hero.is-warning .navbar-link.is-active {\\n background-color: #ffd970;\\n color: rgba(0, 0, 0, 0.7); }\\n .hero.is-warning .tabs a {\\n color: rgba(0, 0, 0, 0.7);\\n opacity: 0.9; }\\n .hero.is-warning .tabs a:hover {\\n opacity: 1; }\\n .hero.is-warning .tabs li.is-active a {\\n color: #ffe08a !important;\\n opacity: 1; }\\n .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a {\\n color: rgba(0, 0, 0, 0.7); }\\n .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover {\\n background-color: rgba(0, 0, 0, 0.7);\\n border-color: rgba(0, 0, 0, 0.7);\\n color: #ffe08a; }\\n .hero.is-warning.is-bold {\\n background-image: linear-gradient(141deg, #ffb657 0%, #ffe08a 71%, #fff6a3 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-warning.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #ffb657 0%, #ffe08a 71%, #fff6a3 100%); } }\\n .hero.is-danger {\\n background-color: #f14668;\\n color: #fff; }\\n .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-danger strong {\\n color: inherit; }\\n .hero.is-danger .title {\\n color: #fff; }\\n .hero.is-danger .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-danger .subtitle a:not(.button),\\n .hero.is-danger .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-danger .navbar-menu {\\n background-color: #f14668; } }\\n .hero.is-danger .navbar-item,\\n .hero.is-danger .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active,\\n .hero.is-danger .navbar-link:hover,\\n .hero.is-danger .navbar-link.is-active {\\n background-color: #ef2e55;\\n color: #fff; }\\n .hero.is-danger .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-danger .tabs a:hover {\\n opacity: 1; }\\n .hero.is-danger .tabs li.is-active a {\\n color: #f14668 !important;\\n opacity: 1; }\\n .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #f14668; }\\n .hero.is-danger.is-bold {\\n background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-danger.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); } }\\n .hero.is-twitter {\\n background-color: #55acee;\\n color: #fff; }\\n .hero.is-twitter a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-twitter strong {\\n color: inherit; }\\n .hero.is-twitter .title {\\n color: #fff; }\\n .hero.is-twitter .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-twitter .subtitle a:not(.button),\\n .hero.is-twitter .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-twitter .navbar-menu {\\n background-color: #55acee; } }\\n .hero.is-twitter .navbar-item,\\n .hero.is-twitter .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-twitter a.navbar-item:hover, .hero.is-twitter a.navbar-item.is-active,\\n .hero.is-twitter .navbar-link:hover,\\n .hero.is-twitter .navbar-link.is-active {\\n background-color: #3ea1ec;\\n color: #fff; }\\n .hero.is-twitter .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-twitter .tabs a:hover {\\n opacity: 1; }\\n .hero.is-twitter .tabs li.is-active a {\\n color: #55acee !important;\\n opacity: 1; }\\n .hero.is-twitter .tabs.is-boxed a, .hero.is-twitter .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-twitter .tabs.is-boxed a:hover, .hero.is-twitter .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-twitter .tabs.is-boxed li.is-active a, .hero.is-twitter .tabs.is-boxed li.is-active a:hover, .hero.is-twitter .tabs.is-toggle li.is-active a, .hero.is-twitter .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #55acee; }\\n .hero.is-twitter.is-bold {\\n background-image: linear-gradient(141deg, #1bbbf5 0%, #55acee 71%, #68a1f4 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-twitter.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #1bbbf5 0%, #55acee 71%, #68a1f4 100%); } }\\n .hero.is-linkedin {\\n background-color: #0077b5;\\n color: #fff; }\\n .hero.is-linkedin a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-linkedin strong {\\n color: inherit; }\\n .hero.is-linkedin .title {\\n color: #fff; }\\n .hero.is-linkedin .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-linkedin .subtitle a:not(.button),\\n .hero.is-linkedin .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-linkedin .navbar-menu {\\n background-color: #0077b5; } }\\n .hero.is-linkedin .navbar-item,\\n .hero.is-linkedin .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-linkedin a.navbar-item:hover, .hero.is-linkedin a.navbar-item.is-active,\\n .hero.is-linkedin .navbar-link:hover,\\n .hero.is-linkedin .navbar-link.is-active {\\n background-color: #00669c;\\n color: #fff; }\\n .hero.is-linkedin .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-linkedin .tabs a:hover {\\n opacity: 1; }\\n .hero.is-linkedin .tabs li.is-active a {\\n color: #0077b5 !important;\\n opacity: 1; }\\n .hero.is-linkedin .tabs.is-boxed a, .hero.is-linkedin .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-linkedin .tabs.is-boxed a:hover, .hero.is-linkedin .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-linkedin .tabs.is-boxed li.is-active a, .hero.is-linkedin .tabs.is-boxed li.is-active a:hover, .hero.is-linkedin .tabs.is-toggle li.is-active a, .hero.is-linkedin .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #0077b5; }\\n .hero.is-linkedin.is-bold {\\n background-image: linear-gradient(141deg, #006b82 0%, #0077b5 71%, #0065cf 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-linkedin.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #006b82 0%, #0077b5 71%, #0065cf 100%); } }\\n .hero.is-github {\\n background-color: #333;\\n color: #fff; }\\n .hero.is-github a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),\\n .hero.is-github strong {\\n color: inherit; }\\n .hero.is-github .title {\\n color: #fff; }\\n .hero.is-github .subtitle {\\n color: rgba(255, 255, 255, 0.9); }\\n .hero.is-github .subtitle a:not(.button),\\n .hero.is-github .subtitle strong {\\n color: #fff; }\\n @media screen and (max-width: 1023px) {\\n .hero.is-github .navbar-menu {\\n background-color: #333; } }\\n .hero.is-github .navbar-item,\\n .hero.is-github .navbar-link {\\n color: rgba(255, 255, 255, 0.7); }\\n .hero.is-github a.navbar-item:hover, .hero.is-github a.navbar-item.is-active,\\n .hero.is-github .navbar-link:hover,\\n .hero.is-github .navbar-link.is-active {\\n background-color: #262626;\\n color: #fff; }\\n .hero.is-github .tabs a {\\n color: #fff;\\n opacity: 0.9; }\\n .hero.is-github .tabs a:hover {\\n opacity: 1; }\\n .hero.is-github .tabs li.is-active a {\\n color: #333 !important;\\n opacity: 1; }\\n .hero.is-github .tabs.is-boxed a, .hero.is-github .tabs.is-toggle a {\\n color: #fff; }\\n .hero.is-github .tabs.is-boxed a:hover, .hero.is-github .tabs.is-toggle a:hover {\\n background-color: rgba(10, 10, 10, 0.1); }\\n .hero.is-github .tabs.is-boxed li.is-active a, .hero.is-github .tabs.is-boxed li.is-active a:hover, .hero.is-github .tabs.is-toggle li.is-active a, .hero.is-github .tabs.is-toggle li.is-active a:hover {\\n background-color: #fff;\\n border-color: #fff;\\n color: #333; }\\n .hero.is-github.is-bold {\\n background-image: linear-gradient(141deg, #1c1718 0%, #333 71%, #433e3d 100%); }\\n @media screen and (max-width: 768px) {\\n .hero.is-github.is-bold .navbar-menu {\\n background-image: linear-gradient(141deg, #1c1718 0%, #333 71%, #433e3d 100%); } }\\n .hero.is-small .hero-body {\\n padding: 1.5rem; }\\n @media screen and (min-width: 769px), print {\\n .hero.is-medium .hero-body {\\n padding: 9rem 4.5rem; } }\\n @media screen and (min-width: 769px), print {\\n .hero.is-large .hero-body {\\n padding: 18rem 6rem; } }\\n .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body {\\n align-items: center;\\n display: flex; }\\n .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .hero.is-halfheight {\\n min-height: 50vh; }\\n .hero.is-fullheight {\\n min-height: 100vh; }\\n\\n.hero-video {\\n overflow: hidden; }\\n .hero-video video {\\n left: 50%;\\n min-height: 100%;\\n min-width: 100%;\\n position: absolute;\\n top: 50%;\\n transform: translate3d(-50%, -50%, 0); }\\n .hero-video.is-transparent {\\n opacity: 0.3; }\\n @media screen and (max-width: 768px) {\\n .hero-video {\\n display: none; } }\\n\\n.hero-buttons {\\n margin-top: 1.5rem; }\\n @media screen and (max-width: 768px) {\\n .hero-buttons .button {\\n display: flex; }\\n .hero-buttons .button:not(:last-child) {\\n margin-bottom: 0.75rem; } }\\n @media screen and (min-width: 769px), print {\\n .hero-buttons {\\n display: flex;\\n justify-content: center; }\\n .hero-buttons .button:not(:last-child) {\\n margin-right: 1.5rem; } }\\n\\n.hero-head,\\n.hero-foot {\\n flex-grow: 0;\\n flex-shrink: 0; }\\n\\n.hero-body {\\n flex-grow: 1;\\n flex-shrink: 0;\\n padding: 3rem 1.5rem; }\\n @media screen and (min-width: 769px), print {\\n .hero-body {\\n padding: 3rem 3rem; } }\\n\\n.section {\\n padding: 3rem 1.5rem; }\\n @media screen and (min-width: 1024px) {\\n .section {\\n padding: 3rem 3rem; }\\n .section.is-medium {\\n padding: 9rem 4.5rem; }\\n .section.is-large {\\n padding: 18rem 6rem; } }\\n\\n.footer {\\n background-color: #fafafa;\\n padding: 3rem 1.5rem 6rem; }\\n\\n.is-noscroll {\\n position: fixed;\\n overflow-y: hidden;\\n width: 100%;\\n bottom: 0; }\\n\\n@-webkit-keyframes fadeOut {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0; } }\\n\\n@keyframes fadeOut {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0; } }\\n\\n.fadeOut {\\n -webkit-animation-name: fadeOut;\\n animation-name: fadeOut; }\\n\\n@-webkit-keyframes fadeOutDown {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0;\\n transform: translate3d(0, 100%, 0); } }\\n\\n@keyframes fadeOutDown {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0;\\n transform: translate3d(0, 100%, 0); } }\\n\\n.fadeOutDown {\\n -webkit-animation-name: fadeOutDown;\\n animation-name: fadeOutDown; }\\n\\n@-webkit-keyframes fadeOutUp {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0;\\n transform: translate3d(0, -100%, 0); } }\\n\\n@keyframes fadeOutUp {\\n from {\\n opacity: 1; }\\n to {\\n opacity: 0;\\n transform: translate3d(0, -100%, 0); } }\\n\\n.fadeOutUp {\\n -webkit-animation-name: fadeOutUp;\\n animation-name: fadeOutUp; }\\n\\n@-webkit-keyframes fadeIn {\\n from {\\n opacity: 0; }\\n to {\\n opacity: 1; } }\\n\\n@keyframes fadeIn {\\n from {\\n opacity: 0; }\\n to {\\n opacity: 1; } }\\n\\n.fadeIn {\\n -webkit-animation-name: fadeIn;\\n animation-name: fadeIn; }\\n\\n@-webkit-keyframes fadeInDown {\\n from {\\n opacity: 0;\\n transform: translate3d(0, -100%, 0); }\\n to {\\n opacity: 1;\\n transform: none; } }\\n\\n@keyframes fadeInDown {\\n from {\\n opacity: 0;\\n transform: translate3d(0, -100%, 0); }\\n to {\\n opacity: 1;\\n transform: none; } }\\n\\n.fadeInDown {\\n -webkit-animation-name: fadeInDown;\\n animation-name: fadeInDown; }\\n\\n@-webkit-keyframes fadeInUp {\\n from {\\n opacity: 0;\\n transform: translate3d(0, 100%, 0); }\\n to {\\n opacity: 1;\\n transform: none; } }\\n\\n@keyframes fadeInUp {\\n from {\\n opacity: 0;\\n transform: translate3d(0, 100%, 0); }\\n to {\\n opacity: 1;\\n transform: none; } }\\n\\n.fadeInUp {\\n -webkit-animation-name: fadeInUp;\\n animation-name: fadeInUp; }\\n\\n/**\\r\\n * Vue Transitions\\r\\n */\\n.fade-enter-active,\\n.fade-leave-active {\\n transition: opacity 150ms ease-out; }\\n\\n.fade-enter,\\n.fade-leave-to {\\n opacity: 0; }\\n\\n.zoom-in-enter-active,\\n.zoom-in-leave-active {\\n transition: opacity 150ms ease-out; }\\n .zoom-in-enter-active .animation-content,\\n .zoom-in-enter-active .animation-content,\\n .zoom-in-leave-active .animation-content,\\n .zoom-in-leave-active .animation-content {\\n transition: transform 150ms ease-out; }\\n\\n.zoom-in-enter,\\n.zoom-in-leave-active {\\n opacity: 0; }\\n .zoom-in-enter .animation-content,\\n .zoom-in-enter .animation-content,\\n .zoom-in-leave-active .animation-content,\\n .zoom-in-leave-active .animation-content {\\n transform: scale(0.95); }\\n\\n.zoom-out-enter-active,\\n.zoom-out-leave-active {\\n transition: opacity 150ms ease-out; }\\n .zoom-out-enter-active .animation-content,\\n .zoom-out-enter-active .animation-content,\\n .zoom-out-leave-active .animation-content,\\n .zoom-out-leave-active .animation-content {\\n transition: transform 150ms ease-out; }\\n\\n.zoom-out-enter,\\n.zoom-out-leave-active {\\n opacity: 0; }\\n .zoom-out-enter .animation-content,\\n .zoom-out-enter .animation-content,\\n .zoom-out-leave-active .animation-content,\\n .zoom-out-leave-active .animation-content {\\n transform: scale(1.05); }\\n\\n.slide-next-enter-active,\\n.slide-next-leave-active,\\n.slide-prev-enter-active,\\n.slide-prev-leave-active {\\n transition: transform 250ms cubic-bezier(0.785, 0.135, 0.15, 0.86); }\\n\\n.slide-prev-leave-to, .slide-next-enter {\\n transform: translate3d(-100%, 0, 0);\\n position: absolute;\\n width: 100%; }\\n\\n.slide-prev-enter, .slide-next-leave-to {\\n transform: translate3d(100%, 0, 0);\\n position: absolute;\\n width: 100%; }\\n\\n.slide-down-enter-active,\\n.slide-down-leave-active,\\n.slide-up-enter-active,\\n.slide-up-leave-active {\\n transition: transform 250ms cubic-bezier(0.785, 0.135, 0.15, 0.86); }\\n\\n.slide-up-leave-to, .slide-down-enter {\\n transform: translate3d(0, -100%, 0);\\n position: absolute;\\n height: 100%; }\\n\\n.slide-up-enter, .slide-down-leave-to {\\n transform: translate3d(0, 100%, 0);\\n position: absolute;\\n height: 100%; }\\n\\n.slide-enter-active {\\n transition: 150ms ease-out; }\\n\\n.slide-leave-active {\\n transition: 150ms ease-out;\\n transition-timing-function: cubic-bezier(0, 1, 0.5, 1); }\\n\\n.slide-enter-to, .slide-leave {\\n max-height: 100px;\\n overflow: hidden; }\\n\\n.slide-enter, .slide-leave-to {\\n overflow: hidden;\\n max-height: 0; }\\n\\n.autocomplete {\\n position: relative; }\\n .autocomplete .dropdown-menu {\\n display: block;\\n width: 100%; }\\n .autocomplete .dropdown-menu.is-opened-top {\\n top: auto;\\n bottom: 100%; }\\n .autocomplete .dropdown-content {\\n overflow: auto;\\n max-height: 200px; }\\n .autocomplete .dropdown-item, .autocomplete .dropdown .dropdown-menu .has-link a, .dropdown .dropdown-menu .has-link .autocomplete a {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis; }\\n .autocomplete .dropdown-item.is-hovered, .autocomplete .dropdown .dropdown-menu .has-link a.is-hovered, .dropdown .dropdown-menu .has-link .autocomplete a.is-hovered {\\n background: whitesmoke;\\n color: #0a0a0a; }\\n .autocomplete .dropdown-item.is-disabled, .autocomplete .dropdown .dropdown-menu .has-link a.is-disabled, .dropdown .dropdown-menu .has-link .autocomplete a.is-disabled {\\n opacity: 0.5;\\n cursor: not-allowed; }\\n .autocomplete.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .autocomplete.is-medium {\\n font-size: 1.25rem; }\\n .autocomplete.is-large {\\n font-size: 1.5rem; }\\n\\n.carousel {\\n min-height: 120px;\\n position: relative; }\\n .carousel.is-overlay {\\n background-color: rgba(10, 10, 10, 0.86);\\n align-items: center;\\n flex-direction: column;\\n justify-content: center;\\n display: flex;\\n max-height: 100vh;\\n position: fixed;\\n z-index: 40; }\\n .carousel.is-overlay .carousel-item img {\\n cursor: default; }\\n .carousel.is-overlay .carousel-indicator.has-background {\\n background: transparent; }\\n .carousel .progress, .carousel .progress-wrapper.is-not-native {\\n border-radius: 2px;\\n height: 0.25rem;\\n margin-bottom: 0; }\\n .carousel .carousel-items {\\n position: relative;\\n display: flex;\\n overflow: hidden;\\n width: 100%; }\\n @media screen and (min-width: 769px), print {\\n .carousel .carousel-items:hover .carousel-arrow.is-hovered {\\n opacity: 1; } }\\n .carousel .carousel-items .carousel-item {\\n flex-shrink: 0;\\n width: 100%; }\\n .carousel .carousel-pause {\\n pointer-events: none;\\n position: absolute;\\n top: 0;\\n right: 0.15rem;\\n z-index: 1; }\\n .carousel .carousel-indicator {\\n width: 100%;\\n padding: 0.5rem;\\n display: flex;\\n align-items: center;\\n justify-content: center; }\\n .carousel .carousel-indicator.has-background {\\n background: rgba(10, 10, 10, 0.5); }\\n .carousel .carousel-indicator.has-custom {\\n flex-wrap: nowrap;\\n justify-content: flex-start;\\n -webkit-overflow-scrolling: touch;\\n overflow: hidden;\\n overflow-x: auto; }\\n .carousel .carousel-indicator.has-custom.is-small .indicator-item {\\n flex: 1 0 10%; }\\n .carousel .carousel-indicator.has-custom.is-medium .indicator-item {\\n flex: 1 0 16.66667%; }\\n .carousel .carousel-indicator.is-inside {\\n position: absolute; }\\n .carousel .carousel-indicator.is-inside.is-bottom {\\n bottom: 0; }\\n .carousel .carousel-indicator.is-inside.is-top {\\n top: 0; }\\n .carousel .carousel-indicator .indicator-item:not(:last-child) {\\n margin-right: 0.5rem; }\\n .carousel .carousel-indicator .indicator-item.is-active .indicator-style,\\n .carousel .carousel-indicator .indicator-item .indicator-style:hover {\\n background: #00d1b2;\\n border: 1px solid white; }\\n .carousel .carousel-indicator .indicator-item .indicator-style {\\n display: block;\\n border: 1px solid #00d1b2;\\n background: white;\\n outline: none;\\n transition: 150ms ease-out; }\\n .carousel .carousel-indicator .indicator-item .indicator-style.is-boxes {\\n height: 10px;\\n width: 10px; }\\n .carousel .carousel-indicator .indicator-item .indicator-style.is-dots {\\n border-radius: 9999px;\\n height: 10px;\\n width: 10px; }\\n .carousel .carousel-indicator .indicator-item .indicator-style.is-lines {\\n height: 5px;\\n width: 25px; }\\n\\n.carousel-list {\\n position: relative;\\n overflow: hidden;\\n width: 100%; }\\n .carousel-list.has-shadow {\\n box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.25); }\\n @media screen and (min-width: 769px), print {\\n .carousel-list:hover .carousel-arrow.is-hovered {\\n opacity: 1; } }\\n .carousel-list .carousel-slides {\\n position: relative;\\n display: flex;\\n width: 100%; }\\n .carousel-list .carousel-slides:not(.is-dragging) {\\n transition: all 250ms ease-out 0s; }\\n .carousel-list .carousel-slides.has-grayscale .carousel-slide img {\\n filter: grayscale(100%); }\\n .carousel-list .carousel-slides.has-grayscale .carousel-slide.is-active img {\\n filter: grayscale(0%); }\\n .carousel-list .carousel-slides.has-opacity .carousel-slide img {\\n opacity: 0.25; }\\n .carousel-list .carousel-slides.has-opacity .carousel-slide.is-active img {\\n opacity: 1; }\\n .carousel-list .carousel-slides .carousel-slide {\\n border: 2px solid transparent;\\n flex-shrink: 0; }\\n\\n.carousel-arrow {\\n transition: 150ms ease-out; }\\n .carousel-arrow.is-hovered {\\n opacity: 0; }\\n .carousel-arrow .icon {\\n background: white;\\n color: #00d1b2;\\n cursor: pointer;\\n border: 1px solid white;\\n border-radius: 9999px;\\n outline: 0; }\\n .carousel-arrow .icon:hover {\\n border: 1px solid #00d1b2;\\n opacity: 1; }\\n .carousel-arrow .icon.has-icons-left, .carousel-arrow .icon.has-icons-right {\\n position: absolute;\\n top: 50%;\\n transform: translateY(-50%);\\n z-index: 1; }\\n .carousel-arrow .icon.has-icons-left {\\n left: 1.5rem; }\\n .carousel-arrow .icon.has-icons-right {\\n right: 1.5rem; }\\n\\n.b-checkbox.checkbox {\\n outline: none;\\n display: inline-flex;\\n align-items: center; }\\n .b-checkbox.checkbox:not(.button) {\\n margin-right: 0.5em; }\\n .b-checkbox.checkbox:not(.button) + .checkbox:last-child {\\n margin-right: 0; }\\n .b-checkbox.checkbox input[type=checkbox] {\\n position: absolute;\\n left: 0;\\n opacity: 0;\\n outline: none;\\n z-index: -1; }\\n .b-checkbox.checkbox input[type=checkbox] + .check {\\n width: 1.25em;\\n height: 1.25em;\\n flex-shrink: 0;\\n border-radius: 4px;\\n border: 2px solid #7a7a7a;\\n transition: background 150ms ease-out;\\n background: transparent; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check {\\n background: #00d1b2 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-white {\\n background: white url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%230a0a0a' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: white; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-black {\\n background: #0a0a0a url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:white' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #0a0a0a; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-light {\\n background: whitesmoke url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23363636' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: whitesmoke; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-dark {\\n background: #363636 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:whitesmoke' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #363636; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-primary {\\n background: #00d1b2 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-link {\\n background: #485fc7 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #485fc7; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-info {\\n background: #3e8ed0 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #3e8ed0; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-success {\\n background: #48c78e url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #48c78e; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-warning {\\n background: #ffe08a url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:rgba(0, 0, 0, 0.7)' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #ffe08a; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-danger {\\n background: #f14668 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #f14668; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-twitter {\\n background: #55acee url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #55acee; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-linkedin {\\n background: #0077b5 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #0077b5; }\\n .b-checkbox.checkbox input[type=checkbox]:checked + .check.is-github {\\n background: #333 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #333; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check {\\n background: #00d1b2 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-white {\\n background: white url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%230a0a0a' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: white; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-black {\\n background: #0a0a0a url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:white' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #0a0a0a; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-light {\\n background: whitesmoke url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23363636' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: whitesmoke; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-dark {\\n background: #363636 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:whitesmoke' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #363636; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-primary {\\n background: #00d1b2 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-link {\\n background: #485fc7 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #485fc7; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-info {\\n background: #3e8ed0 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #3e8ed0; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-success {\\n background: #48c78e url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #48c78e; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-warning {\\n background: #ffe08a url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:rgba(0, 0, 0, 0.7)' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #ffe08a; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-danger {\\n background: #f14668 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #f14668; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-twitter {\\n background: #55acee url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #55acee; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-linkedin {\\n background: #0077b5 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #0077b5; }\\n .b-checkbox.checkbox input[type=checkbox]:indeterminate + .check.is-github {\\n background: #333 url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Crect style='fill:%23fff' width='0.7' height='0.2' x='.15' y='.4'%3E%3C/rect%3E%3C/svg%3E\\\") no-repeat center center;\\n border-color: #333; }\\n .b-checkbox.checkbox input[type=checkbox]:focus + .check {\\n box-shadow: 0 0 0.5em rgba(122, 122, 122, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-white {\\n box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-black {\\n box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-light {\\n box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-dark {\\n box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-primary {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-link {\\n box-shadow: 0 0 0.5em rgba(72, 95, 199, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-info {\\n box-shadow: 0 0 0.5em rgba(62, 142, 208, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-success {\\n box-shadow: 0 0 0.5em rgba(72, 199, 142, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-warning {\\n box-shadow: 0 0 0.5em rgba(255, 224, 138, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-danger {\\n box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-twitter {\\n box-shadow: 0 0 0.5em rgba(85, 172, 238, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-linkedin {\\n box-shadow: 0 0 0.5em rgba(0, 119, 181, 0.8); }\\n .b-checkbox.checkbox input[type=checkbox]:focus:checked + .check.is-github {\\n box-shadow: 0 0 0.5em rgba(51, 51, 51, 0.8); }\\n .b-checkbox.checkbox .control-label {\\n padding-left: calc(0.75em - 1px); }\\n .b-checkbox.checkbox.button {\\n display: flex; }\\n .b-checkbox.checkbox[disabled] {\\n opacity: 0.5; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check {\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-white {\\n border-color: white; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-black {\\n border-color: #0a0a0a; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-light {\\n border-color: whitesmoke; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-dark {\\n border-color: #363636; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-primary {\\n border-color: #00d1b2; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-link {\\n border-color: #485fc7; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-info {\\n border-color: #3e8ed0; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-success {\\n border-color: #48c78e; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-warning {\\n border-color: #ffe08a; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-danger {\\n border-color: #f14668; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-twitter {\\n border-color: #55acee; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-linkedin {\\n border-color: #0077b5; }\\n .b-checkbox.checkbox:hover input[type=checkbox]:not(:disabled) + .check.is-github {\\n border-color: #333; }\\n .b-checkbox.checkbox.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .b-checkbox.checkbox.is-medium {\\n font-size: 1.25rem; }\\n .b-checkbox.checkbox.is-large {\\n font-size: 1.5rem; }\\n\\n.b-clockpicker .card-header {\\n background-color: #00d1b2;\\n color: #fff; }\\n\\n.b-clockpicker .b-clockpicker-face:after {\\n background-color: #00d1b2; }\\n\\n.b-clockpicker .b-clockpicker-face-hand {\\n background-color: #00d1b2;\\n border-color: #00d1b2; }\\n\\n.b-clockpicker .b-clockpicker-face-number.active {\\n background-color: #00d1b2;\\n color: #fff; }\\n\\n.b-clockpicker.is-white .card-header {\\n background-color: white;\\n color: #0a0a0a; }\\n\\n.b-clockpicker.is-white .b-clockpicker-face:after {\\n background-color: white; }\\n\\n.b-clockpicker.is-white .b-clockpicker-face-hand {\\n background-color: white;\\n border-color: white; }\\n\\n.b-clockpicker.is-white .b-clockpicker-face-number.active {\\n background-color: white;\\n color: #0a0a0a; }\\n\\n.b-clockpicker.is-black .card-header {\\n background-color: #0a0a0a;\\n color: white; }\\n\\n.b-clockpicker.is-black .b-clockpicker-face:after {\\n background-color: #0a0a0a; }\\n\\n.b-clockpicker.is-black .b-clockpicker-face-hand {\\n background-color: #0a0a0a;\\n border-color: #0a0a0a; }\\n\\n.b-clockpicker.is-black .b-clockpicker-face-number.active {\\n background-color: #0a0a0a;\\n color: white; }\\n\\n.b-clockpicker.is-light .card-header {\\n background-color: whitesmoke;\\n color: #363636; }\\n\\n.b-clockpicker.is-light .b-clockpicker-face:after {\\n background-color: whitesmoke; }\\n\\n.b-clockpicker.is-light .b-clockpicker-face-hand {\\n background-color: whitesmoke;\\n border-color: whitesmoke; }\\n\\n.b-clockpicker.is-light .b-clockpicker-face-number.active {\\n background-color: whitesmoke;\\n color: #363636; }\\n\\n.b-clockpicker.is-dark .card-header {\\n background-color: #363636;\\n color: whitesmoke; }\\n\\n.b-clockpicker.is-dark .b-clockpicker-face:after {\\n background-color: #363636; }\\n\\n.b-clockpicker.is-dark .b-clockpicker-face-hand {\\n background-color: #363636;\\n border-color: #363636; }\\n\\n.b-clockpicker.is-dark .b-clockpicker-face-number.active {\\n background-color: #363636;\\n color: whitesmoke; }\\n\\n.b-clockpicker.is-primary .card-header {\\n background-color: #00d1b2;\\n color: #fff; }\\n\\n.b-clockpicker.is-primary .b-clockpicker-face:after {\\n background-color: #00d1b2; }\\n\\n.b-clockpicker.is-primary .b-clockpicker-face-hand {\\n background-color: #00d1b2;\\n border-color: #00d1b2; }\\n\\n.b-clockpicker.is-primary .b-clockpicker-face-number.active {\\n background-color: #00d1b2;\\n color: #fff; }\\n\\n.b-clockpicker.is-link .card-header {\\n background-color: #485fc7;\\n color: #fff; }\\n\\n.b-clockpicker.is-link .b-clockpicker-face:after {\\n background-color: #485fc7; }\\n\\n.b-clockpicker.is-link .b-clockpicker-face-hand {\\n background-color: #485fc7;\\n border-color: #485fc7; }\\n\\n.b-clockpicker.is-link .b-clockpicker-face-number.active {\\n background-color: #485fc7;\\n color: #fff; }\\n\\n.b-clockpicker.is-info .card-header {\\n background-color: #3e8ed0;\\n color: #fff; }\\n\\n.b-clockpicker.is-info .b-clockpicker-face:after {\\n background-color: #3e8ed0; }\\n\\n.b-clockpicker.is-info .b-clockpicker-face-hand {\\n background-color: #3e8ed0;\\n border-color: #3e8ed0; }\\n\\n.b-clockpicker.is-info .b-clockpicker-face-number.active {\\n background-color: #3e8ed0;\\n color: #fff; }\\n\\n.b-clockpicker.is-success .card-header {\\n background-color: #48c78e;\\n color: #fff; }\\n\\n.b-clockpicker.is-success .b-clockpicker-face:after {\\n background-color: #48c78e; }\\n\\n.b-clockpicker.is-success .b-clockpicker-face-hand {\\n background-color: #48c78e;\\n border-color: #48c78e; }\\n\\n.b-clockpicker.is-success .b-clockpicker-face-number.active {\\n background-color: #48c78e;\\n color: #fff; }\\n\\n.b-clockpicker.is-warning .card-header {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n\\n.b-clockpicker.is-warning .b-clockpicker-face:after {\\n background-color: #ffe08a; }\\n\\n.b-clockpicker.is-warning .b-clockpicker-face-hand {\\n background-color: #ffe08a;\\n border-color: #ffe08a; }\\n\\n.b-clockpicker.is-warning .b-clockpicker-face-number.active {\\n background-color: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n\\n.b-clockpicker.is-danger .card-header {\\n background-color: #f14668;\\n color: #fff; }\\n\\n.b-clockpicker.is-danger .b-clockpicker-face:after {\\n background-color: #f14668; }\\n\\n.b-clockpicker.is-danger .b-clockpicker-face-hand {\\n background-color: #f14668;\\n border-color: #f14668; }\\n\\n.b-clockpicker.is-danger .b-clockpicker-face-number.active {\\n background-color: #f14668;\\n color: #fff; }\\n\\n.b-clockpicker.is-twitter .card-header {\\n background-color: #55acee;\\n color: #fff; }\\n\\n.b-clockpicker.is-twitter .b-clockpicker-face:after {\\n background-color: #55acee; }\\n\\n.b-clockpicker.is-twitter .b-clockpicker-face-hand {\\n background-color: #55acee;\\n border-color: #55acee; }\\n\\n.b-clockpicker.is-twitter .b-clockpicker-face-number.active {\\n background-color: #55acee;\\n color: #fff; }\\n\\n.b-clockpicker.is-linkedin .card-header {\\n background-color: #0077b5;\\n color: #fff; }\\n\\n.b-clockpicker.is-linkedin .b-clockpicker-face:after {\\n background-color: #0077b5; }\\n\\n.b-clockpicker.is-linkedin .b-clockpicker-face-hand {\\n background-color: #0077b5;\\n border-color: #0077b5; }\\n\\n.b-clockpicker.is-linkedin .b-clockpicker-face-number.active {\\n background-color: #0077b5;\\n color: #fff; }\\n\\n.b-clockpicker.is-github .card-header {\\n background-color: #333;\\n color: #fff; }\\n\\n.b-clockpicker.is-github .b-clockpicker-face:after {\\n background-color: #333; }\\n\\n.b-clockpicker.is-github .b-clockpicker-face-hand {\\n background-color: #333;\\n border-color: #333; }\\n\\n.b-clockpicker.is-github .b-clockpicker-face-number.active {\\n background-color: #333;\\n color: #fff; }\\n\\n.b-clockpicker .dropdown-menu {\\n min-width: 0; }\\n\\n.b-clockpicker .dropdown,\\n.b-clockpicker .dropdown-trigger {\\n width: 100%; }\\n .b-clockpicker .dropdown .input[readonly],\\n .b-clockpicker .dropdown-trigger .input[readonly] {\\n cursor: pointer;\\n box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); }\\n .b-clockpicker .dropdown .input[readonly]:focus, .b-clockpicker .dropdown .input[readonly].is-focused, .b-clockpicker .dropdown .input[readonly]:active, .b-clockpicker .dropdown .input[readonly].is-active,\\n .b-clockpicker .dropdown-trigger .input[readonly]:focus,\\n .b-clockpicker .dropdown-trigger .input[readonly].is-focused,\\n .b-clockpicker .dropdown-trigger .input[readonly]:active,\\n .b-clockpicker .dropdown-trigger .input[readonly].is-active {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n\\n.b-clockpicker .dropdown-item, .b-clockpicker .dropdown .dropdown-menu .has-link a, .dropdown .dropdown-menu .has-link .b-clockpicker a {\\n font-size: inherit;\\n padding: 0; }\\n\\n.b-clockpicker .dropdown-content {\\n padding-top: 0;\\n padding-bottom: 0; }\\n\\n.b-clockpicker .card {\\n border-radius: 0.25rem; }\\n\\n.b-clockpicker .card-header {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem; }\\n\\n.b-clockpicker .card-content {\\n padding: 12px; }\\n\\n.b-clockpicker-btn {\\n cursor: pointer;\\n opacity: 0.6; }\\n .b-clockpicker-btn:hover, .b-clockpicker-btn.active {\\n opacity: 1; }\\n\\n.b-clockpicker-period .b-clockpicker-btn {\\n font-size: 16px; }\\n\\n.b-clockpicker-time span {\\n align-items: center;\\n display: inline-flex;\\n justify-content: center; }\\n\\n.b-clockpicker-header {\\n display: flex;\\n line-height: 1;\\n justify-content: flex-end;\\n color: inherit; }\\n .b-clockpicker-header .b-clockpicker-time {\\n white-space: nowrap; }\\n .b-clockpicker-header .b-clockpicker-time span {\\n height: 60px;\\n font-size: 60px; }\\n .b-clockpicker-header .b-clockpicker-period {\\n align-self: flex-end;\\n display: flex;\\n flex-direction: column;\\n margin: 8px 0 6px 8px; }\\n\\n.b-clockpicker-body {\\n transition: 0.9s cubic-bezier(0.25, 0.8, 0.5, 1); }\\n .b-clockpicker-body .b-clockpicker-btn {\\n padding: 0 8px;\\n border-radius: 9999px;\\n margin-bottom: 2px; }\\n .b-clockpicker-body .b-clockpicker-btn:hover, .b-clockpicker-body .b-clockpicker-btn.active {\\n background-color: #00d1b2;\\n color: white; }\\n .b-clockpicker-body .b-clockpicker-period {\\n position: absolute;\\n top: 5px;\\n right: 5px; }\\n .b-clockpicker-body .b-clockpicker-time {\\n position: absolute;\\n top: 5px;\\n left: 5px;\\n font-size: 16px; }\\n .b-clockpicker-body .b-clockpicker-face {\\n border-radius: 50%;\\n position: relative;\\n background-color: #dbdbdb;\\n width: 100%;\\n height: 100%;\\n align-items: center;\\n display: flex;\\n justify-content: center; }\\n .b-clockpicker-body .b-clockpicker-face:after {\\n border-radius: 50%;\\n content: \\\"\\\";\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n transform: translate(-50%, -50%);\\n width: 12px;\\n height: 12px;\\n z-index: 10; }\\n .b-clockpicker-body .b-clockpicker-face-outer-ring {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n height: calc(100% - 50px);\\n width: calc(100% - 50px);\\n position: relative;\\n border-radius: 50%; }\\n .b-clockpicker-body .b-clockpicker-face-number {\\n align-items: center;\\n border-radius: 100%;\\n cursor: default;\\n display: flex;\\n font-size: 18px;\\n text-align: center;\\n justify-content: center;\\n position: absolute;\\n width: 40px;\\n height: 40px;\\n left: calc(50% - 40px * 0.5);\\n top: calc(50% - 40px * 0.5);\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none; }\\n .b-clockpicker-body .b-clockpicker-face-number > span {\\n z-index: 1; }\\n .b-clockpicker-body .b-clockpicker-face-number:before, .b-clockpicker-body .b-clockpicker-face-number:after {\\n content: \\\"\\\";\\n height: 40px;\\n width: 40px;\\n border-radius: 100%;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%); }\\n .b-clockpicker-body .b-clockpicker-face-number.active {\\n cursor: default;\\n z-index: 2; }\\n .b-clockpicker-body .b-clockpicker-face-number.disabled {\\n pointer-events: none;\\n opacity: .25; }\\n .b-clockpicker-body .b-clockpicker-face-hand {\\n height: calc(50% - 6px);\\n width: 2px;\\n bottom: 50%;\\n left: calc(50% - 1px);\\n transform-origin: center bottom;\\n position: absolute;\\n will-change: transform;\\n z-index: 1; }\\n .b-clockpicker-body .b-clockpicker-face-hand:before {\\n background: transparent;\\n border-width: 2px;\\n border-style: solid;\\n border-color: inherit;\\n border-radius: 100%;\\n width: 12px;\\n height: 12px;\\n content: \\\"\\\";\\n position: absolute;\\n top: -6px;\\n left: 50%;\\n transform: translate(-50%, -50%); }\\n\\n.b-clockpicker-footer {\\n display: block;\\n padding: 12px; }\\n\\n.b-clockpicker.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n\\n.b-clockpicker.is-medium {\\n font-size: 1.25rem; }\\n\\n.b-clockpicker.is-large {\\n font-size: 1.5rem; }\\n\\n.collapse .collapse-trigger {\\n display: inline;\\n cursor: pointer; }\\n\\n.collapse .collapse-content {\\n display: inherit; }\\n\\n.datepicker {\\n font-size: 0.875rem; }\\n .datepicker .dropdown,\\n .datepicker .dropdown-trigger {\\n width: 100%; }\\n .datepicker .dropdown .input[readonly],\\n .datepicker .dropdown-trigger .input[readonly] {\\n cursor: pointer;\\n box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); }\\n .datepicker .dropdown .input[readonly]:focus, .datepicker .dropdown .input[readonly].is-focused, .datepicker .dropdown .input[readonly]:active, .datepicker .dropdown .input[readonly].is-active,\\n .datepicker .dropdown-trigger .input[readonly]:focus,\\n .datepicker .dropdown-trigger .input[readonly].is-focused,\\n .datepicker .dropdown-trigger .input[readonly]:active,\\n .datepicker .dropdown-trigger .input[readonly].is-active {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .datepicker .dropdown.is-disabled {\\n opacity: 1; }\\n .datepicker .dropdown-content {\\n background-color: white;\\n border-radius: 4px;\\n box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02); }\\n .datepicker .dropdown-item, .datepicker .dropdown .dropdown-menu .has-link a, .dropdown .dropdown-menu .has-link .datepicker a {\\n font-size: inherit; }\\n .datepicker .datepicker-header {\\n padding-bottom: 0.875rem;\\n margin-bottom: 0.875rem;\\n border-bottom: 1px solid #dbdbdb; }\\n .datepicker .datepicker-footer {\\n margin-top: 0.875rem;\\n padding-top: 0.875rem;\\n border-top: 1px solid #dbdbdb; }\\n .datepicker .datepicker-table {\\n display: table;\\n margin: 0 auto 0 auto; }\\n .datepicker .datepicker-table .datepicker-cell {\\n text-align: center;\\n vertical-align: middle;\\n display: table-cell;\\n border-radius: 4px;\\n padding: 0.5rem 0.75rem; }\\n .datepicker .datepicker-table .datepicker-header {\\n display: table-header-group; }\\n .datepicker .datepicker-table .datepicker-header .datepicker-cell {\\n color: #7a7a7a;\\n font-weight: 600; }\\n .datepicker .datepicker-table .datepicker-body {\\n display: table-row-group; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-row {\\n display: table-row; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-months {\\n display: inline-flex;\\n flex-wrap: wrap;\\n flex-direction: row;\\n width: 17rem; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-months .datepicker-cell {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 33.33%;\\n height: 2.5rem; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-unselectable {\\n color: #b5b5b5; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-today {\\n border: solid 1px rgba(0, 209, 178, 0.5); }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable {\\n color: #4a4a4a; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable:hover:not(.is-selected), .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable:focus:not(.is-selected) {\\n background-color: whitesmoke;\\n color: #0a0a0a;\\n cursor: pointer; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable.is-within-hovered-range.is-first-hovered {\\n background-color: #7a7a7a;\\n color: #dbdbdb;\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable.is-within-hovered-range.is-within-hovered {\\n background-color: whitesmoke;\\n color: #0a0a0a;\\n border-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selectable.is-within-hovered-range.is-last-hovered {\\n background-color: #7a7a7a;\\n color: #dbdbdb;\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selected {\\n background-color: #00d1b2;\\n color: #fff; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selected.is-first-selected {\\n background-color: #00d1b2;\\n color: #fff;\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selected.is-within-selected {\\n background-color: rgba(0, 209, 178, 0.5);\\n border-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-selected.is-last-selected {\\n background-color: #00d1b2;\\n color: #fff;\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-nearby:not(.is-selected) {\\n color: #b5b5b5; }\\n .datepicker .datepicker-table .datepicker-body .datepicker-cell.is-week-number {\\n cursor: default; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell {\\n padding: 0.3rem 0.75rem 0.75rem; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event {\\n position: relative; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events {\\n bottom: .425rem;\\n display: flex;\\n justify-content: center;\\n left: 0;\\n padding: 0 .35rem;\\n position: absolute;\\n width: 100%; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-white {\\n background-color: white; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-black {\\n background-color: #0a0a0a; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-light {\\n background-color: whitesmoke; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-dark {\\n background-color: #363636; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-primary {\\n background-color: #00d1b2; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-link {\\n background-color: #485fc7; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-info {\\n background-color: #3e8ed0; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-success {\\n background-color: #48c78e; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-warning {\\n background-color: #ffe08a; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-danger {\\n background-color: #f14668; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-twitter {\\n background-color: #55acee; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-linkedin {\\n background-color: #0077b5; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event .events .event.is-github {\\n background-color: #333; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event.dots .event {\\n border-radius: 50%;\\n height: .35em;\\n margin: 0 .1em;\\n width: .35em; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.has-event.bars .event {\\n height: .25em;\\n width: 100%; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.is-selected {\\n overflow: hidden; }\\n .datepicker .datepicker-table .datepicker-body.has-events .datepicker-cell.is-selected .events .event.is-primary {\\n background-color: #1fffdd; }\\n .datepicker.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .datepicker.is-medium {\\n font-size: 1.25rem; }\\n .datepicker.is-large {\\n font-size: 1.5rem; }\\n @media screen and (min-width: 1024px) {\\n .datepicker .footer-horizontal-timepicker {\\n border: none;\\n padding-left: 10px;\\n margin-left: 5px;\\n display: flex; }\\n .datepicker .dropdown-horizonal-timepicker {\\n display: flex; }\\n .datepicker .content-horizonal-timepicker {\\n border-right: 1px solid #dbdbdb; } }\\n\\n.dialog .modal-card {\\n max-width: 460px;\\n width: auto; }\\n .dialog .modal-card .modal-card-head {\\n font-size: 1.25rem;\\n font-weight: 600; }\\n .dialog .modal-card .modal-card-body .field {\\n margin-top: 16px; }\\n .dialog .modal-card .modal-card-body.is-titleless {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem; }\\n .dialog .modal-card .modal-card-foot {\\n justify-content: flex-end; }\\n .dialog .modal-card .modal-card-foot .button {\\n display: inline;\\n min-width: 5em;\\n font-weight: 600; }\\n @media screen and (min-width: 769px), print {\\n .dialog .modal-card {\\n min-width: 320px; } }\\n\\n.dialog.is-small .modal-card,\\n.dialog.is-small .input,\\n.dialog.is-small .button {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n\\n.dialog.is-medium .modal-card,\\n.dialog.is-medium .input,\\n.dialog.is-medium .button {\\n font-size: 1.25rem; }\\n\\n.dialog.is-large .modal-card,\\n.dialog.is-large .input,\\n.dialog.is-large .button {\\n font-size: 1.5rem; }\\n\\n.dialog.has-custom-container {\\n position: absolute; }\\n\\n.dropdown + .dropdown {\\n margin-left: 0.5em; }\\n\\n.dropdown .background {\\n bottom: 0;\\n left: 0;\\n position: absolute;\\n right: 0;\\n top: 0;\\n position: fixed;\\n background-color: rgba(10, 10, 10, 0.86);\\n z-index: 40;\\n cursor: pointer; }\\n @media screen and (min-width: 1024px) {\\n .dropdown .background {\\n display: none; } }\\n\\n.dropdown.dropdown-menu-animation .dropdown-menu {\\n display: block; }\\n\\n.dropdown .dropdown-menu .dropdown-item.is-disabled, .dropdown .dropdown-menu .has-link a.is-disabled {\\n cursor: not-allowed; }\\n .dropdown .dropdown-menu .dropdown-item.is-disabled:hover, .dropdown .dropdown-menu .has-link a.is-disabled:hover {\\n background: inherit;\\n color: inherit; }\\n\\n.dropdown .dropdown-menu .has-link a {\\n padding-right: 3rem;\\n white-space: nowrap; }\\n\\n.dropdown.is-hoverable:not(.is-active) .dropdown-menu {\\n display: none; }\\n\\n.dropdown.is-hoverable:hover .dropdown-menu {\\n display: inherit; }\\n\\n.dropdown.is-expanded {\\n width: 100%; }\\n .dropdown.is-expanded .dropdown-trigger {\\n width: 100%; }\\n .dropdown.is-expanded .dropdown-menu {\\n width: 100%; }\\n .dropdown.is-expanded.is-mobile-modal .dropdown-menu {\\n max-width: 100%; }\\n\\n.dropdown:not(.is-disabled) .dropdown-menu .dropdown-item.is-disabled, .dropdown:not(.is-disabled) .dropdown-menu .has-link a.is-disabled {\\n opacity: 0.5; }\\n\\n.dropdown .navbar-item {\\n height: 100%; }\\n\\n.dropdown.is-disabled {\\n opacity: 0.5;\\n cursor: not-allowed; }\\n .dropdown.is-disabled .dropdown-trigger {\\n pointer-events: none; }\\n\\n.dropdown.is-inline .dropdown-menu {\\n position: static;\\n display: inline-block;\\n padding: 0; }\\n\\n.dropdown.is-top-right .dropdown-menu {\\n top: auto;\\n bottom: 100%; }\\n\\n.dropdown.is-top-left .dropdown-menu {\\n top: auto;\\n bottom: 100%;\\n right: 0;\\n left: auto; }\\n\\n.dropdown.is-bottom-left .dropdown-menu {\\n right: 0;\\n left: auto; }\\n\\n@media screen and (max-width: 1023px) {\\n .dropdown.is-mobile-modal > .dropdown-menu {\\n position: fixed !important;\\n width: calc(100vw - 40px);\\n max-width: 460px;\\n max-height: calc(100vh - 120px);\\n top: 25% !important;\\n left: 50% !important;\\n bottom: auto !important;\\n right: auto !important;\\n transform: translate3d(-50%, -25%, 0);\\n white-space: normal;\\n overflow-y: auto;\\n z-index: 50 !important; }\\n .dropdown.is-mobile-modal > .dropdown-menu > .dropdown-content > .dropdown-item, .dropdown .dropdown-menu .has-link .dropdown.is-mobile-modal > .dropdown-menu > .dropdown-content > a, .dropdown.is-mobile-modal > .dropdown-menu > .dropdown-content > .has-link a {\\n padding: 1rem 1.5rem; } }\\n\\n.field.is-grouped .field {\\n flex-shrink: 0; }\\n .field.is-grouped .field:not(:last-child) {\\n margin-right: 0.75rem; }\\n .field.is-grouped .field.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n\\n.field.has-addons .control:first-child .control .button,\\n.field.has-addons .control:first-child .control .input,\\n.field.has-addons .control:first-child .control .select select {\\n border-bottom-left-radius: 4px;\\n border-top-left-radius: 4px; }\\n\\n.field.has-addons .control:last-child .control .button,\\n.field.has-addons .control:last-child .control .input,\\n.field.has-addons .control:last-child .control .select select {\\n border-bottom-right-radius: 4px;\\n border-top-right-radius: 4px; }\\n\\n.field.has-addons .control .control .button,\\n.field.has-addons .control .control .input,\\n.field.has-addons .control .control .select select {\\n border-radius: 0; }\\n\\n.field.has-addons .b-numberinput:not(:first-child) .control:first-child .button,\\n.field.has-addons .b-numberinput:not(:first-child) .control:first-child .input,\\n.field.has-addons .b-numberinput:not(:first-child) .control:first-child .select select {\\n border-bottom-left-radius: 0;\\n border-top-left-radius: 0; }\\n\\n.field.has-addons .b-numberinput:not(:last-child) .control:last-child .button,\\n.field.has-addons .b-numberinput:not(:last-child) .control:last-child .input,\\n.field.has-addons .b-numberinput:not(:last-child) .control:last-child .select select {\\n border-bottom-right-radius: 0;\\n border-top-right-radius: 0; }\\n\\n.field.has-addons.b-numberinput .control {\\n margin-right: unset; }\\n\\n.field.is-floating-label, .field.is-floating-in-label {\\n position: relative; }\\n .field.is-floating-label .label, .field.is-floating-in-label .label {\\n position: absolute;\\n left: 1em;\\n font-size: calc(1rem * 0.75);\\n background-color: transparent;\\n z-index: 5;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n max-width: calc(100% - 2em);\\n overflow: hidden; }\\n .field.is-floating-label .label.is-small, .field.is-floating-in-label .label.is-small {\\n font-size: calc(0.75rem * 0.75); }\\n .field.is-floating-label .label.is-medium, .field.is-floating-in-label .label.is-medium {\\n font-size: calc(1.25rem * 0.75); }\\n .field.is-floating-label .label.is-large, .field.is-floating-in-label .label.is-large {\\n font-size: calc(1.5rem * 0.75); }\\n .field.is-floating-label .taginput .counter, .field.is-floating-in-label .taginput .counter {\\n float: none;\\n text-align: right; }\\n .field.is-floating-label.has-addons > .label + .control .button,\\n .field.is-floating-label.has-addons > .label + .control .input,\\n .field.is-floating-label.has-addons > .label + .control .select select, .field.is-floating-in-label.has-addons > .label + .control .button,\\n .field.is-floating-in-label.has-addons > .label + .control .input,\\n .field.is-floating-in-label.has-addons > .label + .control .select select {\\n border-bottom-left-radius: 4px;\\n border-top-left-radius: 4px; }\\n\\n.field.is-floating-label .label {\\n top: -0.775em;\\n padding-left: 0.125em;\\n padding-right: 0.125em; }\\n .field.is-floating-label .label:before {\\n content: '';\\n display: block;\\n position: absolute;\\n top: 0.775em;\\n left: 0;\\n right: 0;\\n height: 0.375em;\\n background-color: white;\\n z-index: -1; }\\n\\n.field.is-floating-label .input:focus,\\n.field.is-floating-label .textarea:focus,\\n.field.is-floating-label .select select:focus {\\n box-shadow: none; }\\n\\n.field.is-floating-label .taginput .taginput-container {\\n padding-top: 0.475em; }\\n .field.is-floating-label .taginput .taginput-container.is-focused {\\n box-shadow: none; }\\n\\n.field.is-floating-in-label > .label {\\n top: 0.25em; }\\n .field.is-floating-in-label > .label + .control.datepicker .input, .field.is-floating-in-label > .label + .control.timepicker .input {\\n padding-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5);\\n padding-bottom: 1px;\\n height: 3.25em; }\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) .input,\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) .textarea,\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) select {\\n padding-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5);\\n padding-bottom: 1px;\\n height: 3.25em; }\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) .select:not(multiple) {\\n height: 3.25em; }\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) .select:not(multiple).is-loading::after {\\n margin-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5); }\\n .field.is-floating-in-label > .label + .control:not(.datepicker):not(.timepicker):not(.taginput) .select:not(multiple)::after {\\n margin-top: 1px; }\\n .field.is-floating-in-label > .label + .control.taginput .taginput-container {\\n padding-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5 + (0.275em - 1px)); }\\n .field.is-floating-in-label > .label + .control:not(.taginput) .is-left.icon,\\n .field.is-floating-in-label > .label + .control:not(.taginput) .is-right.icon {\\n height: 3.25em; }\\n .field.is-floating-in-label > .label + .control:not(.taginput) .is-left.icon {\\n padding-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5); }\\n .field.is-floating-in-label > .label + .control.is-loading::after {\\n margin-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5); }\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control .input,\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control .textarea,\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control select, .field.is-floating-in-label > .label + .field-body > .has-addons .control .input,\\n .field.is-floating-in-label > .label + .field-body > .has-addons .control .textarea,\\n .field.is-floating-in-label > .label + .field-body > .has-addons .control select {\\n padding-top: calc(3.25em * 0.5 - (1.5rem * 0.75) * 0.5);\\n padding-bottom: 1px; }\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control .input,\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control .textarea,\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control select,\\n .field.is-floating-in-label > .label + .field-body > .is-grouped .control .button, .field.is-floating-in-label > .label + .field-body > .has-addons .control .input,\\n .field.is-floating-in-label > .label + .field-body > .has-addons .control .textarea,\\n .field.is-floating-in-label > .label + .field-body > .has-addons .control select,\\n .field.is-floating-in-label > .label + .field-body > .has-addons .control .button {\\n height: 3.25em; }\\n\\n.field.is-floating-in-label.has-numberinput .b-numberinput .control .input,\\n.field.is-floating-in-label.has-numberinput .b-numberinput .control .button {\\n height: 3.25em; }\\n\\n.field.is-floating-label.has-numberinput .label, .field.is-floating-in-label.has-numberinput .label {\\n margin-left: calc(1rem * 3); }\\n\\n.field.is-floating-label.has-numberinput.has-numberinput-is-small .label, .field.is-floating-in-label.has-numberinput.has-numberinput-is-small .label {\\n margin-left: calc(0.75rem * 3); }\\n\\n.field.is-floating-label.has-numberinput.has-numberinput-is-medium .label, .field.is-floating-in-label.has-numberinput.has-numberinput-is-medium .label {\\n margin-left: calc(1.25rem * 3); }\\n\\n.field.is-floating-label.has-numberinput.has-numberinput-is-large .label, .field.is-floating-in-label.has-numberinput.has-numberinput-is-large .label {\\n margin-left: calc(1.5rem * 3); }\\n\\n.field.is-floating-label.has-numberinput-compact .label, .field.is-floating-in-label.has-numberinput-compact .label {\\n margin-left: calc(1rem * 2.25); }\\n\\n.field.is-floating-label.has-numberinput-compact.has-numberinput-is-small .label, .field.is-floating-in-label.has-numberinput-compact.has-numberinput-is-small .label {\\n margin-left: calc(0.75rem * 2.25); }\\n\\n.field.is-floating-label.has-numberinput-compact.has-numberinput-is-medium .label, .field.is-floating-in-label.has-numberinput-compact.has-numberinput-is-medium .label {\\n margin-left: calc(1.25rem * 2.25); }\\n\\n.field.is-floating-label.has-numberinput-compact.has-numberinput-is-large .label, .field.is-floating-in-label.has-numberinput-compact.has-numberinput-is-large .label {\\n margin-left: calc(1.5rem * 2.25); }\\n\\n.field.is-grouped-right.is-floating-in-label .label, .field.has-addons-right.is-floating-in-label .label {\\n position: relative;\\n left: calc(3.25em + 2em); }\\n\\n.field.is-grouped-right.is-floating-label .label, .field.has-addons-right.is-floating-label .label {\\n position: relative;\\n left: calc(3.25em + 2em); }\\n\\n.control .help.counter {\\n float: right;\\n margin-left: 0.5em; }\\n\\n.control .icon.is-clickable {\\n pointer-events: auto;\\n cursor: pointer; }\\n\\n.control.is-loading::after {\\n top: calc(50% - (1em * 0.5));\\n right: calc((2.5em * 0.5) - .5em); }\\n\\n.icon {\\n -webkit-touch-callout: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: inherit; }\\n .icon svg {\\n background-color: transparent;\\n fill: currentColor;\\n stroke-width: 0;\\n stroke: currentColor;\\n pointer-events: none;\\n width: auto;\\n height: auto; }\\n\\n.b-image-wrapper > img {\\n -o-object-fit: cover;\\n object-fit: cover; }\\n .b-image-wrapper > img.has-ratio, .b-image-wrapper > img.placeholder {\\n height: 100%;\\n width: 100%; }\\n .b-image-wrapper > img.placeholder {\\n filter: blur(10px); }\\n\\n.loading-overlay {\\n bottom: 0;\\n left: 0;\\n position: absolute;\\n right: 0;\\n top: 0;\\n align-items: center;\\n display: none;\\n justify-content: center;\\n overflow: hidden;\\n z-index: 999; }\\n .loading-overlay.is-active {\\n display: flex; }\\n .loading-overlay.is-full-page {\\n position: fixed; }\\n .loading-overlay.is-full-page .loading-icon:after {\\n top: calc(50% - 2.5em);\\n left: calc(50% - 2.5em);\\n width: 5em;\\n height: 5em; }\\n .loading-overlay .loading-background {\\n bottom: 0;\\n left: 0;\\n position: absolute;\\n right: 0;\\n top: 0;\\n background: #7f7f7f;\\n background: rgba(255, 255, 255, 0.5); }\\n .loading-overlay .loading-icon {\\n position: relative; }\\n .loading-overlay .loading-icon:after {\\n -webkit-animation: spinAround 500ms infinite linear;\\n animation: spinAround 500ms infinite linear;\\n border: 2px solid #dbdbdb;\\n border-radius: 9999px;\\n border-right-color: transparent;\\n border-top-color: transparent;\\n content: \\\"\\\";\\n display: block;\\n height: 1em;\\n position: relative;\\n width: 1em;\\n position: absolute;\\n top: calc(50% - 1.5em);\\n left: calc(50% - 1.5em);\\n width: 3em;\\n height: 3em;\\n border-width: 0.25em; }\\n\\n.menu .menu-list li > a.is-disabled {\\n pointer-events: none;\\n cursor: not-allowed;\\n opacity: 0.5; }\\n\\n.message .media,\\n.notification .media {\\n padding-top: 0;\\n border: 0; }\\n\\n.modal.is-full-screen > .animation-content,\\n.modal.is-full-screen > .animation-content > .modal-card {\\n width: 100%;\\n height: 100%;\\n max-height: 100vh;\\n margin: 0;\\n background-color: whitesmoke; }\\n\\n.modal .animation-content {\\n margin: 0 20px; }\\n .modal .animation-content .modal-card {\\n margin: 0; }\\n @media screen and (max-width: 768px) {\\n .modal .animation-content {\\n width: 100%; } }\\n\\n.modal .modal-content {\\n width: 100%; }\\n\\n.navbar.has-navbar-centered .navbar-start {\\n justify-content: center;\\n margin-left: auto; }\\n\\n.navbar.has-navbar-centered .navbar-end {\\n margin-left: 0; }\\n\\n.navbar .navbar-dropdown.is-boxed {\\n visibility: hidden;\\n transition-property: opacity, visibility, transform; }\\n\\n.navbar .navbar-item.has-dropdown.is-active .is-boxed,\\n.navbar .navbar-item.has-dropdown.is-hoverable:hover .is-boxed {\\n visibility: visible; }\\n\\n.notices {\\n position: fixed;\\n display: flex;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n padding: 2em;\\n overflow: hidden;\\n z-index: 1000;\\n pointer-events: none; }\\n .notices .toast {\\n display: inline-flex;\\n -webkit-animation-duration: 150ms;\\n animation-duration: 150ms;\\n margin: 0.5em 0;\\n text-align: center;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);\\n border-radius: 2em;\\n padding: 0.75em 1.5em;\\n pointer-events: auto;\\n opacity: 0.92; }\\n .notices .toast.is-white {\\n color: #0a0a0a;\\n background: white; }\\n .notices .toast.is-black {\\n color: white;\\n background: #0a0a0a; }\\n .notices .toast.is-light {\\n color: #363636;\\n background: whitesmoke; }\\n .notices .toast.is-dark {\\n color: whitesmoke;\\n background: #363636; }\\n .notices .toast.is-primary {\\n color: #fff;\\n background: #00d1b2; }\\n .notices .toast.is-link {\\n color: #fff;\\n background: #485fc7; }\\n .notices .toast.is-info {\\n color: #fff;\\n background: #3e8ed0; }\\n .notices .toast.is-success {\\n color: #fff;\\n background: #48c78e; }\\n .notices .toast.is-warning {\\n color: rgba(0, 0, 0, 0.7);\\n background: #ffe08a; }\\n .notices .toast.is-danger {\\n color: #fff;\\n background: #f14668; }\\n .notices .toast.is-twitter {\\n color: #fff;\\n background: #55acee; }\\n .notices .toast.is-linkedin {\\n color: #fff;\\n background: #0077b5; }\\n .notices .toast.is-github {\\n color: #fff;\\n background: #333; }\\n .notices .snackbar {\\n display: inline-flex;\\n align-items: center;\\n justify-content: space-around;\\n -webkit-animation-duration: 150ms;\\n animation-duration: 150ms;\\n margin: 0.5em 0;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);\\n border-radius: 4px;\\n pointer-events: auto;\\n background: #363636;\\n color: whitesmoke;\\n min-height: 3em; }\\n .notices .snackbar .text {\\n padding: 0.5em 1em; }\\n .notices .snackbar .action {\\n margin-left: auto;\\n padding: 0.5em;\\n padding-left: 0; }\\n .notices .snackbar .action .button {\\n font-weight: 600;\\n text-transform: uppercase;\\n background: #363636;\\n border: transparent; }\\n .notices .snackbar .action .button:hover {\\n background: #292929; }\\n .notices .snackbar .action .button:active {\\n background: #292929; }\\n .notices .snackbar .action.is-white .button {\\n color: white; }\\n .notices .snackbar .action.is-black .button {\\n color: #0a0a0a; }\\n .notices .snackbar .action.is-light .button {\\n color: whitesmoke; }\\n .notices .snackbar .action.is-dark .button {\\n color: #363636; }\\n .notices .snackbar .action.is-primary .button {\\n color: #00d1b2; }\\n .notices .snackbar .action.is-link .button {\\n color: #485fc7; }\\n .notices .snackbar .action.is-info .button {\\n color: #3e8ed0; }\\n .notices .snackbar .action.is-success .button {\\n color: #48c78e; }\\n .notices .snackbar .action.is-warning .button {\\n color: #ffe08a; }\\n .notices .snackbar .action.is-danger .button {\\n color: #f14668; }\\n .notices .snackbar .action.is-twitter .button {\\n color: #55acee; }\\n .notices .snackbar .action.is-linkedin .button {\\n color: #0077b5; }\\n .notices .snackbar .action.is-github .button {\\n color: #333; }\\n .notices .snackbar .action.is-cancel {\\n padding-right: 0; }\\n @media screen and (max-width: 768px) {\\n .notices .snackbar {\\n width: 100%;\\n margin: 0;\\n border-radius: 0; } }\\n @media screen and (min-width: 769px), print {\\n .notices .snackbar {\\n min-width: 350px;\\n max-width: 600px;\\n overflow: hidden; } }\\n .notices .notification {\\n pointer-events: auto;\\n max-width: 600px; }\\n .notices .toast.is-top, .notices .toast.is-bottom,\\n .notices .snackbar.is-top,\\n .notices .snackbar.is-bottom,\\n .notices .notification.is-top,\\n .notices .notification.is-bottom {\\n align-self: center; }\\n .notices .toast.is-top-right, .notices .toast.is-bottom-right,\\n .notices .snackbar.is-top-right,\\n .notices .snackbar.is-bottom-right,\\n .notices .notification.is-top-right,\\n .notices .notification.is-bottom-right {\\n align-self: flex-end; }\\n .notices .toast.is-top-left, .notices .toast.is-bottom-left,\\n .notices .snackbar.is-top-left,\\n .notices .snackbar.is-bottom-left,\\n .notices .notification.is-top-left,\\n .notices .notification.is-bottom-left {\\n align-self: flex-start; }\\n .notices .toast.is-toast,\\n .notices .snackbar.is-toast,\\n .notices .notification.is-toast {\\n opacity: 0.92; }\\n .notices.is-top {\\n flex-direction: column; }\\n .notices.is-bottom {\\n flex-direction: column-reverse; }\\n .notices.is-bottom .notification {\\n margin-bottom: 0; }\\n .notices.is-bottom .notification:not(:first-child) {\\n margin-bottom: 1.5rem; }\\n .notices.has-custom-container {\\n position: absolute; }\\n @media screen and (max-width: 768px) {\\n .notices {\\n padding: 0;\\n position: fixed !important; } }\\n\\n.b-numberinput.field {\\n margin-bottom: 0; }\\n .b-numberinput.field.is-grouped div.control {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n .b-numberinput.field.has-addons.is-expanded {\\n flex-grow: 1;\\n flex-shrink: 1; }\\n\\n.b-numberinput input[type=number]::-webkit-inner-spin-button,\\n.b-numberinput input[type=number]::-webkit-outer-spin-button {\\n -webkit-appearance: none; }\\n\\n.b-numberinput input[type=number] {\\n -moz-appearance: textfield; }\\n\\n.b-numberinput input[type=number] {\\n text-align: center; }\\n\\n.b-numberinput .button.is-rounded {\\n padding-left: 1em;\\n padding-right: 1em; }\\n\\n.pagination .pagination-next,\\n.pagination .pagination-previous {\\n padding-left: 0.75em;\\n padding-right: 0.75em; }\\n .pagination .pagination-next.is-disabled,\\n .pagination .pagination-previous.is-disabled {\\n pointer-events: none;\\n cursor: not-allowed;\\n opacity: 0.5; }\\n\\n.pagination.is-simple {\\n justify-content: normal; }\\n .pagination.is-simple.is-centered {\\n justify-content: center; }\\n .pagination.is-simple.is-right {\\n justify-content: flex-end; }\\n\\n.pagination .is-current {\\n pointer-events: none;\\n cursor: not-allowed; }\\n\\n.progress-wrapper {\\n position: relative;\\n overflow: hidden; }\\n .progress-wrapper:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n .progress-wrapper .progress-value {\\n position: absolute;\\n top: 0;\\n left: 50%;\\n transform: translateX(-50%);\\n font-size: calc(1rem / 1.5);\\n line-height: 1rem;\\n font-weight: 700;\\n color: rgba(0, 0, 0, 0.7);\\n white-space: nowrap; }\\n .progress-wrapper .progress, .progress-wrapper .progress-wrapper.is-not-native, .progress-wrapper .progress-bar {\\n margin-bottom: 0; }\\n .progress-wrapper .progress.is-small + .progress-value, .progress-wrapper .is-small.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress.is-small .progress-value, .progress-wrapper .is-small.progress-wrapper.is-not-native .progress-value, .progress-wrapper .progress-bar.is-small + .progress-value, .progress-wrapper .progress-bar.is-small .progress-value {\\n font-size: calc(0.75rem / 1.5);\\n line-height: 0.75rem; }\\n .progress-wrapper .progress.is-medium + .progress-value, .progress-wrapper .is-medium.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress.is-medium .progress-value, .progress-wrapper .is-medium.progress-wrapper.is-not-native .progress-value, .progress-wrapper .progress-bar.is-medium + .progress-value, .progress-wrapper .progress-bar.is-medium .progress-value {\\n font-size: calc(1.25rem / 1.5);\\n line-height: 1.25rem; }\\n .progress-wrapper .progress.is-large + .progress-value, .progress-wrapper .is-large.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress.is-large .progress-value, .progress-wrapper .is-large.progress-wrapper.is-not-native .progress-value, .progress-wrapper .progress-bar.is-large + .progress-value, .progress-wrapper .progress-bar.is-large .progress-value {\\n font-size: calc(1.5rem / 1.5);\\n line-height: 1.5rem; }\\n .progress-wrapper .progress::-webkit-progress-value, .progress-wrapper .progress-wrapper.is-not-native::-webkit-progress-value, .progress-wrapper .progress-bar::-webkit-progress-value {\\n -webkit-transition: width 0.5s ease;\\n transition: width 0.5s ease; }\\n .progress-wrapper .progress.is-more-than-half + .progress-value, .progress-wrapper .is-more-than-half.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-white + .progress-value, .progress-wrapper .is-more-than-half.is-white.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-white + .progress-value {\\n color: #0a0a0a; }\\n .progress-wrapper .progress.is-more-than-half.is-black + .progress-value, .progress-wrapper .is-more-than-half.is-black.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-black + .progress-value {\\n color: white; }\\n .progress-wrapper .progress.is-more-than-half.is-light + .progress-value, .progress-wrapper .is-more-than-half.is-light.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-light + .progress-value {\\n color: #363636; }\\n .progress-wrapper .progress.is-more-than-half.is-dark + .progress-value, .progress-wrapper .is-more-than-half.is-dark.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-dark + .progress-value {\\n color: whitesmoke; }\\n .progress-wrapper .progress.is-more-than-half.is-primary + .progress-value, .progress-wrapper .is-more-than-half.is-primary.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-primary + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-link + .progress-value, .progress-wrapper .is-more-than-half.is-link.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-link + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-info + .progress-value, .progress-wrapper .is-more-than-half.is-info.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-info + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-success + .progress-value, .progress-wrapper .is-more-than-half.is-success.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-success + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-warning + .progress-value, .progress-wrapper .is-more-than-half.is-warning.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-warning + .progress-value {\\n color: rgba(0, 0, 0, 0.7); }\\n .progress-wrapper .progress.is-more-than-half.is-danger + .progress-value, .progress-wrapper .is-more-than-half.is-danger.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-danger + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-twitter + .progress-value, .progress-wrapper .is-more-than-half.is-twitter.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-twitter + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-linkedin + .progress-value, .progress-wrapper .is-more-than-half.is-linkedin.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-linkedin + .progress-value {\\n color: #fff; }\\n .progress-wrapper .progress.is-more-than-half.is-github + .progress-value, .progress-wrapper .is-more-than-half.is-github.progress-wrapper.is-not-native + .progress-value, .progress-wrapper .progress-bar.is-more-than-half.is-github + .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native {\\n white-space: nowrap;\\n background-color: #ededed;\\n border-radius: 9999px; }\\n .progress-wrapper.is-not-native .progress-bar {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n height: 100%;\\n background-color: #4a4a4a; }\\n .progress-wrapper.is-not-native .progress-bar .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-white {\\n background-color: white; }\\n .progress-wrapper.is-not-native .progress-bar.is-white .progress-value {\\n color: #0a0a0a; }\\n .progress-wrapper.is-not-native .progress-bar.is-black {\\n background-color: #0a0a0a; }\\n .progress-wrapper.is-not-native .progress-bar.is-black .progress-value {\\n color: white; }\\n .progress-wrapper.is-not-native .progress-bar.is-light {\\n background-color: whitesmoke; }\\n .progress-wrapper.is-not-native .progress-bar.is-light .progress-value {\\n color: #363636; }\\n .progress-wrapper.is-not-native .progress-bar.is-dark {\\n background-color: #363636; }\\n .progress-wrapper.is-not-native .progress-bar.is-dark .progress-value {\\n color: whitesmoke; }\\n .progress-wrapper.is-not-native .progress-bar.is-primary {\\n background-color: #00d1b2; }\\n .progress-wrapper.is-not-native .progress-bar.is-primary .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-link {\\n background-color: #485fc7; }\\n .progress-wrapper.is-not-native .progress-bar.is-link .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-info {\\n background-color: #3e8ed0; }\\n .progress-wrapper.is-not-native .progress-bar.is-info .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-success {\\n background-color: #48c78e; }\\n .progress-wrapper.is-not-native .progress-bar.is-success .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-warning {\\n background-color: #ffe08a; }\\n .progress-wrapper.is-not-native .progress-bar.is-warning .progress-value {\\n color: rgba(0, 0, 0, 0.7); }\\n .progress-wrapper.is-not-native .progress-bar.is-danger {\\n background-color: #f14668; }\\n .progress-wrapper.is-not-native .progress-bar.is-danger .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-twitter {\\n background-color: #55acee; }\\n .progress-wrapper.is-not-native .progress-bar.is-twitter .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-linkedin {\\n background-color: #0077b5; }\\n .progress-wrapper.is-not-native .progress-bar.is-linkedin .progress-value {\\n color: #fff; }\\n .progress-wrapper.is-not-native .progress-bar.is-github {\\n background-color: #333; }\\n .progress-wrapper.is-not-native .progress-bar.is-github .progress-value {\\n color: #fff; }\\n\\n.b-radio.radio {\\n outline: none;\\n display: inline-flex;\\n align-items: center; }\\n .b-radio.radio:not(.button) {\\n margin-right: 0.5em; }\\n .b-radio.radio:not(.button) + .radio:last-child {\\n margin-right: 0; }\\n .b-radio.radio + .radio {\\n margin-left: 0; }\\n .b-radio.radio input[type=radio] {\\n position: absolute;\\n left: 0;\\n opacity: 0;\\n outline: none;\\n z-index: -1; }\\n .b-radio.radio input[type=radio] + .check {\\n display: flex;\\n flex-shrink: 0;\\n position: relative;\\n cursor: pointer;\\n width: 1.25em;\\n height: 1.25em;\\n transition: background 150ms ease-out;\\n border-radius: 50%;\\n border: 2px solid #7a7a7a; }\\n .b-radio.radio input[type=radio] + .check:before {\\n content: \\\"\\\";\\n display: flex;\\n position: absolute;\\n left: 50%;\\n margin-left: calc(-1.25em * 0.5);\\n bottom: 50%;\\n margin-bottom: calc(-1.25em * 0.5);\\n width: 1.25em;\\n height: 1.25em;\\n transition: transform 150ms ease-out;\\n border-radius: 50%;\\n transform: scale(0);\\n background-color: #00d1b2; }\\n .b-radio.radio input[type=radio] + .check.is-white:before {\\n background: white; }\\n .b-radio.radio input[type=radio] + .check.is-black:before {\\n background: #0a0a0a; }\\n .b-radio.radio input[type=radio] + .check.is-light:before {\\n background: whitesmoke; }\\n .b-radio.radio input[type=radio] + .check.is-dark:before {\\n background: #363636; }\\n .b-radio.radio input[type=radio] + .check.is-primary:before {\\n background: #00d1b2; }\\n .b-radio.radio input[type=radio] + .check.is-link:before {\\n background: #485fc7; }\\n .b-radio.radio input[type=radio] + .check.is-info:before {\\n background: #3e8ed0; }\\n .b-radio.radio input[type=radio] + .check.is-success:before {\\n background: #48c78e; }\\n .b-radio.radio input[type=radio] + .check.is-warning:before {\\n background: #ffe08a; }\\n .b-radio.radio input[type=radio] + .check.is-danger:before {\\n background: #f14668; }\\n .b-radio.radio input[type=radio] + .check.is-twitter:before {\\n background: #55acee; }\\n .b-radio.radio input[type=radio] + .check.is-linkedin:before {\\n background: #0077b5; }\\n .b-radio.radio input[type=radio] + .check.is-github:before {\\n background: #333; }\\n .b-radio.radio input[type=radio]:checked + .check {\\n border-color: #00d1b2; }\\n .b-radio.radio input[type=radio]:checked + .check.is-white {\\n border-color: white; }\\n .b-radio.radio input[type=radio]:checked + .check.is-black {\\n border-color: #0a0a0a; }\\n .b-radio.radio input[type=radio]:checked + .check.is-light {\\n border-color: whitesmoke; }\\n .b-radio.radio input[type=radio]:checked + .check.is-dark {\\n border-color: #363636; }\\n .b-radio.radio input[type=radio]:checked + .check.is-primary {\\n border-color: #00d1b2; }\\n .b-radio.radio input[type=radio]:checked + .check.is-link {\\n border-color: #485fc7; }\\n .b-radio.radio input[type=radio]:checked + .check.is-info {\\n border-color: #3e8ed0; }\\n .b-radio.radio input[type=radio]:checked + .check.is-success {\\n border-color: #48c78e; }\\n .b-radio.radio input[type=radio]:checked + .check.is-warning {\\n border-color: #ffe08a; }\\n .b-radio.radio input[type=radio]:checked + .check.is-danger {\\n border-color: #f14668; }\\n .b-radio.radio input[type=radio]:checked + .check.is-twitter {\\n border-color: #55acee; }\\n .b-radio.radio input[type=radio]:checked + .check.is-linkedin {\\n border-color: #0077b5; }\\n .b-radio.radio input[type=radio]:checked + .check.is-github {\\n border-color: #333; }\\n .b-radio.radio input[type=radio]:checked + .check:before {\\n transform: scale(0.5); }\\n .b-radio.radio input[type=radio]:focus + .check {\\n box-shadow: 0 0 0.5em rgba(122, 122, 122, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-white {\\n box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-black {\\n box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-light {\\n box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-dark {\\n box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-primary {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-link {\\n box-shadow: 0 0 0.5em rgba(72, 95, 199, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-info {\\n box-shadow: 0 0 0.5em rgba(62, 142, 208, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-success {\\n box-shadow: 0 0 0.5em rgba(72, 199, 142, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-warning {\\n box-shadow: 0 0 0.5em rgba(255, 224, 138, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-danger {\\n box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-twitter {\\n box-shadow: 0 0 0.5em rgba(85, 172, 238, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-linkedin {\\n box-shadow: 0 0 0.5em rgba(0, 119, 181, 0.8); }\\n .b-radio.radio input[type=radio]:focus:checked + .check.is-github {\\n box-shadow: 0 0 0.5em rgba(51, 51, 51, 0.8); }\\n .b-radio.radio .control-label {\\n padding-left: calc(0.75em - 1px); }\\n .b-radio.radio.button {\\n display: flex; }\\n .b-radio.radio.button.is-selected {\\n z-index: 1; }\\n .b-radio.radio[disabled] {\\n opacity: 0.5; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check {\\n border-color: #00d1b2; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-white {\\n border-color: white; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-black {\\n border-color: #0a0a0a; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-light {\\n border-color: whitesmoke; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-dark {\\n border-color: #363636; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-primary {\\n border-color: #00d1b2; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-link {\\n border-color: #485fc7; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-info {\\n border-color: #3e8ed0; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-success {\\n border-color: #48c78e; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-warning {\\n border-color: #ffe08a; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-danger {\\n border-color: #f14668; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-twitter {\\n border-color: #55acee; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-linkedin {\\n border-color: #0077b5; }\\n .b-radio.radio:hover input[type=radio]:not(:disabled) + .check.is-github {\\n border-color: #333; }\\n .b-radio.radio.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .b-radio.radio.is-medium {\\n font-size: 1.25rem; }\\n .b-radio.radio.is-large {\\n font-size: 1.5rem; }\\n\\n.rate {\\n align-items: center;\\n display: flex; }\\n .rate:not(:last-child) {\\n margin-bottom: 0.75rem; }\\n .rate.is-spaced .rate-item:not(:last-child) {\\n margin-right: 0.25rem; }\\n .rate.is-disabled .rate-item {\\n cursor: initial; }\\n .rate.is-disabled .rate-item:hover {\\n transform: none; }\\n .rate.is-rtl .rate-item {\\n order: 1; }\\n .rate.is-rtl .rate-text {\\n margin-left: 0;\\n margin-right: 0.35rem; }\\n .rate .rate-item {\\n cursor: pointer;\\n display: inline-flex;\\n position: relative;\\n transition: all 0.3s; }\\n .rate .rate-item:hover {\\n transform: scale(1.1); }\\n .rate .rate-item.set-on .icon,\\n .rate .rate-item.set-half .is-half {\\n color: #ffd970; }\\n .rate .rate-item.set-half .is-half {\\n position: absolute;\\n left: 0;\\n top: 0;\\n overflow: hidden; }\\n .rate .icon {\\n color: #dbdbdb;\\n line-height: 1;\\n pointer-events: none;\\n width: inherit; }\\n .rate .is-half > i {\\n position: absolute;\\n left: 0; }\\n .rate .rate-text {\\n font-size: calc(1rem / 1.25);\\n margin-left: 0.35rem; }\\n .rate .rate-text.is-small {\\n font-size: calc(0.75rem / 1.25); }\\n .rate .rate-text.is-medium {\\n font-size: calc(1.25rem / 1.25); }\\n .rate .rate-text.is-large {\\n font-size: calc(1.5rem / 1.25); }\\n\\n.select select {\\n text-rendering: auto !important;\\n padding-right: 2.5em; }\\n .select select option {\\n color: #4a4a4a;\\n padding: calc(0.5em - 1px) calc(0.75em - 1px); }\\n .select select option:disabled {\\n cursor: not-allowed;\\n opacity: 0.5; }\\n .select select optgroup {\\n color: #b5b5b5;\\n font-weight: 400;\\n font-style: normal;\\n padding: 0.25em 0; }\\n .select select[disabled] {\\n opacity: 1; }\\n\\n.select.is-empty select {\\n color: rgba(122, 122, 122, 0.7); }\\n\\n.select.is-loading::after {\\n top: calc(50% - (1em * 0.5));\\n right: calc((2.5em * 0.5) - .5em); }\\n\\n.b-skeleton {\\n display: inline-flex;\\n flex-direction: column;\\n vertical-align: middle;\\n width: 100%; }\\n .b-skeleton > .b-skeleton-item {\\n background: linear-gradient(90deg, #dbdbdb 25%, rgba(219, 219, 219, 0.5) 50%, #dbdbdb 75%);\\n background-size: 400% 100%;\\n width: 100%; }\\n .b-skeleton > .b-skeleton-item.is-rounded {\\n border-radius: 4px; }\\n .b-skeleton > .b-skeleton-item::after {\\n content: \\\"\\\\00a0\\\"; }\\n .b-skeleton > .b-skeleton-item + .b-skeleton-item {\\n margin-top: 0.5rem; }\\n .b-skeleton.is-animated > .b-skeleton-item {\\n -webkit-animation: skeleton-loading 1.5s infinite;\\n animation: skeleton-loading 1.5s infinite; }\\n .b-skeleton.is-centered {\\n align-items: center; }\\n .b-skeleton.is-right {\\n align-items: flex-end; }\\n .b-skeleton + .b-skeleton {\\n margin-top: 0.5rem; }\\n .b-skeleton > .b-skeleton-item {\\n line-height: 1rem; }\\n .b-skeleton.is-small > .b-skeleton-item {\\n line-height: 0.75rem; }\\n .b-skeleton.is-medium > .b-skeleton-item {\\n line-height: 1.25rem; }\\n .b-skeleton.is-large > .b-skeleton-item {\\n line-height: 1.5rem; }\\n\\n@-webkit-keyframes skeleton-loading {\\n 0% {\\n background-position: 100% 50%; }\\n 100% {\\n background-position: 0 50%; } }\\n\\n@keyframes skeleton-loading {\\n 0% {\\n background-position: 100% 50%; }\\n 100% {\\n background-position: 0 50%; } }\\n\\n.b-sidebar .sidebar-content {\\n background-color: whitesmoke;\\n box-shadow: 5px 0px 13px 3px rgba(10, 10, 10, 0.1);\\n width: 260px;\\n z-index: 39; }\\n .b-sidebar .sidebar-content.is-white {\\n background-color: white; }\\n .b-sidebar .sidebar-content.is-black {\\n background-color: #0a0a0a; }\\n .b-sidebar .sidebar-content.is-light {\\n background-color: whitesmoke; }\\n .b-sidebar .sidebar-content.is-dark {\\n background-color: #363636; }\\n .b-sidebar .sidebar-content.is-primary {\\n background-color: #00d1b2; }\\n .b-sidebar .sidebar-content.is-link {\\n background-color: #485fc7; }\\n .b-sidebar .sidebar-content.is-info {\\n background-color: #3e8ed0; }\\n .b-sidebar .sidebar-content.is-success {\\n background-color: #48c78e; }\\n .b-sidebar .sidebar-content.is-warning {\\n background-color: #ffe08a; }\\n .b-sidebar .sidebar-content.is-danger {\\n background-color: #f14668; }\\n .b-sidebar .sidebar-content.is-twitter {\\n background-color: #55acee; }\\n .b-sidebar .sidebar-content.is-linkedin {\\n background-color: #0077b5; }\\n .b-sidebar .sidebar-content.is-github {\\n background-color: #333; }\\n .b-sidebar .sidebar-content.is-fixed {\\n position: fixed;\\n left: 0;\\n top: 0; }\\n .b-sidebar .sidebar-content.is-fixed.is-right {\\n left: auto;\\n right: 0; }\\n .b-sidebar .sidebar-content.is-absolute {\\n position: absolute;\\n left: 0;\\n top: 0; }\\n .b-sidebar .sidebar-content.is-absolute.is-right {\\n left: auto;\\n right: 0; }\\n .b-sidebar .sidebar-content.is-mini {\\n width: 80px; }\\n .b-sidebar .sidebar-content.is-mini.is-mini-expand:hover:not(.is-mini-delayed) {\\n transition: width 150ms ease-out; }\\n .b-sidebar .sidebar-content.is-mini.is-mini-expand:hover:not(.is-mini-delayed):not(.is-fullwidth) {\\n width: 260px; }\\n .b-sidebar .sidebar-content.is-mini.is-mini-expand:hover:not(.is-mini-delayed):not(.is-fullwidth).is-mini-expand-fixed {\\n position: fixed; }\\n .b-sidebar .sidebar-content.is-static {\\n position: static; }\\n .b-sidebar .sidebar-content.is-absolute, .b-sidebar .sidebar-content.is-static {\\n transition: width 150ms ease-out; }\\n .b-sidebar .sidebar-content.is-fullwidth {\\n width: 100%;\\n max-width: 100%; }\\n .b-sidebar .sidebar-content.is-fullheight {\\n height: 100%;\\n max-height: 100%;\\n overflow: hidden;\\n overflow-y: auto;\\n display: flex;\\n flex-direction: column;\\n align-content: stretch; }\\n @media screen and (max-width: 768px) {\\n .b-sidebar .sidebar-content.is-mini-mobile {\\n width: 80px; }\\n .b-sidebar .sidebar-content.is-mini-mobile.is-mini-expand:hover:not(.is-fullwidth-mobile) {\\n width: 260px; }\\n .b-sidebar .sidebar-content.is-mini-mobile.is-mini-expand:hover:not(.is-fullwidth-mobile).is-mini-expand-fixed {\\n position: fixed; }\\n .b-sidebar .sidebar-content.is-hidden-mobile {\\n width: 0;\\n height: 0;\\n overflow: hidden; }\\n .b-sidebar .sidebar-content.is-fullwidth-mobile {\\n width: 100%;\\n max-width: 100%; } }\\n\\n.b-sidebar .sidebar-background {\\n bottom: 0;\\n left: 0;\\n position: absolute;\\n right: 0;\\n top: 0;\\n background: rgba(10, 10, 10, 0.86);\\n position: fixed;\\n z-index: 38; }\\n\\n.b-slider {\\n margin: 1em 0;\\n background: transparent;\\n width: 100%; }\\n .b-slider .b-slider-track {\\n display: flex;\\n align-items: center;\\n position: relative;\\n cursor: pointer;\\n background: #dbdbdb;\\n border-radius: 4px; }\\n .b-slider .b-slider-fill {\\n position: absolute;\\n height: 100%;\\n box-shadow: 0px 0px 0px #7a7a7a;\\n background: #dbdbdb;\\n border-radius: 4px;\\n border: 0px solid #7a7a7a;\\n top: 50%;\\n transform: translateY(-50%); }\\n .b-slider .b-slider-thumb-wrapper {\\n display: inline-flex;\\n align-items: center;\\n position: absolute;\\n cursor: -webkit-grab;\\n cursor: grab;\\n transform: translate(-50%, -50%);\\n top: 50%;\\n flex-direction: column; }\\n .b-slider .b-slider-thumb-wrapper .b-slider-thumb {\\n box-shadow: none;\\n border: 1px solid #b5b5b5;\\n border-radius: 4px;\\n background: white; }\\n .b-slider .b-slider-thumb-wrapper .b-slider-thumb:focus {\\n transform: scale(1.25); }\\n .b-slider .b-slider-thumb-wrapper.is-dragging {\\n cursor: -webkit-grabbing;\\n cursor: grabbing; }\\n .b-slider .b-slider-thumb-wrapper.is-dragging .b-slider-thumb {\\n transform: scale(1.25); }\\n .b-slider .b-slider-thumb-wrapper.has-indicator .b-slider-thumb {\\n padding: 16px 10px;\\n display: flex;\\n align-items: center;\\n width: auto; }\\n .b-slider.slider-focus {\\n padding-top: 20px;\\n padding-bottom: 20px;\\n margin-top: -20px;\\n margin-bottom: -20px;\\n cursor: pointer; }\\n .b-slider.is-rounded .b-slider-thumb {\\n border-radius: 9999px; }\\n .b-slider.is-disabled .b-slider-track {\\n cursor: not-allowed;\\n opacity: 0.5; }\\n .b-slider.is-disabled .b-slider-thumb-wrapper {\\n cursor: not-allowed; }\\n .b-slider.is-disabled .b-slider-thumb-wrapper .b-slider-thumb {\\n transform: scale(1); }\\n .b-slider .b-slider-track {\\n height: 0.5rem; }\\n .b-slider .b-slider-thumb {\\n height: 1rem;\\n width: 1rem; }\\n .b-slider .b-slider-tick {\\n height: 0.25rem; }\\n .b-slider .b-slider-tick-label {\\n font-size: 0.75rem;\\n position: absolute;\\n top: calc(0.5rem * 0.5 + 2px);\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-slider.is-small .b-slider-track {\\n height: 0.375rem; }\\n .b-slider.is-small .b-slider-thumb {\\n height: 0.75rem;\\n width: 0.75rem; }\\n .b-slider.is-small .b-slider-tick {\\n height: 0.1875rem; }\\n .b-slider.is-small .b-slider-tick-label {\\n font-size: 0.75rem;\\n position: absolute;\\n top: calc(0.375rem * 0.5 + 2px);\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-slider.is-medium .b-slider-track {\\n height: 0.625rem; }\\n .b-slider.is-medium .b-slider-thumb {\\n height: 1.25rem;\\n width: 1.25rem; }\\n .b-slider.is-medium .b-slider-tick {\\n height: 0.3125rem; }\\n .b-slider.is-medium .b-slider-tick-label {\\n font-size: 0.75rem;\\n position: absolute;\\n top: calc(0.625rem * 0.5 + 2px);\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-slider.is-large .b-slider-track {\\n height: 0.75rem; }\\n .b-slider.is-large .b-slider-thumb {\\n height: 1.5rem;\\n width: 1.5rem; }\\n .b-slider.is-large .b-slider-tick {\\n height: 0.375rem; }\\n .b-slider.is-large .b-slider-tick-label {\\n font-size: 0.75rem;\\n position: absolute;\\n top: calc(0.75rem * 0.5 + 2px);\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-slider.is-white .b-slider-fill {\\n background: white !important; }\\n .b-slider.is-black .b-slider-fill {\\n background: #0a0a0a !important; }\\n .b-slider.is-light .b-slider-fill {\\n background: whitesmoke !important; }\\n .b-slider.is-dark .b-slider-fill {\\n background: #363636 !important; }\\n .b-slider.is-primary .b-slider-fill {\\n background: #00d1b2 !important; }\\n .b-slider.is-link .b-slider-fill {\\n background: #485fc7 !important; }\\n .b-slider.is-info .b-slider-fill {\\n background: #3e8ed0 !important; }\\n .b-slider.is-success .b-slider-fill {\\n background: #48c78e !important; }\\n .b-slider.is-warning .b-slider-fill {\\n background: #ffe08a !important; }\\n .b-slider.is-danger .b-slider-fill {\\n background: #f14668 !important; }\\n .b-slider.is-twitter .b-slider-fill {\\n background: #55acee !important; }\\n .b-slider.is-linkedin .b-slider-fill {\\n background: #0077b5 !important; }\\n .b-slider.is-github .b-slider-fill {\\n background: #333 !important; }\\n .b-slider .b-slider-tick {\\n position: absolute;\\n width: 3px;\\n transform: translate(-50%, -50%);\\n top: 50%;\\n background: #b5b5b5;\\n border-radius: 4px; }\\n .b-slider .b-slider-tick.is-tick-hidden {\\n background: transparent; }\\n\\n/*\\r\\nThis project is based on\\r\\n\\\"bulma-steps\\\" (https://github.com/Wikiki/bulma-steps) by\\r\\nWikiki (https://github.com/Wikiki) licensed under\\r\\nMIT (https://github.com/Wikiki/bulma-steps/blob/master/LICENSE)\\r\\n*/\\n.b-steps .steps .step-items {\\n display: flex;\\n flex-wrap: wrap; }\\n .b-steps .steps .step-items .step-item {\\n margin-top: 0;\\n position: relative;\\n flex-grow: 1;\\n flex-basis: 1em; }\\n .b-steps .steps .step-items .step-item .step-link {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-direction: column;\\n color: #4a4a4a; }\\n .b-steps .steps .step-items .step-item .step-link:not(.is-clickable) {\\n cursor: not-allowed; }\\n .b-steps .steps .step-items .step-item .step-marker {\\n align-items: center;\\n display: flex;\\n border-radius: 4px;\\n font-weight: 700;\\n justify-content: center;\\n background: #b5b5b5;\\n color: white;\\n border: 0.2em solid #fff;\\n z-index: 1;\\n overflow: hidden; }\\n .b-steps .steps .step-items .step-item.is-white::before, .b-steps .steps .step-items .step-item.is-white::after {\\n background: linear-gradient(to left, #dbdbdb 50%, white 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-white.is-active .step-marker {\\n background-color: white;\\n border-color: white;\\n color: white; }\\n .b-steps .steps .step-items .step-item.is-white.is-active::before, .b-steps .steps .step-items .step-item.is-white.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-white.is-previous .step-marker {\\n color: #0a0a0a;\\n background-color: white; }\\n .b-steps .steps .step-items .step-item.is-white.is-previous::before, .b-steps .steps .step-items .step-item.is-white.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-black::before, .b-steps .steps .step-items .step-item.is-black::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #0a0a0a 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-black.is-active .step-marker {\\n background-color: white;\\n border-color: #0a0a0a;\\n color: #0a0a0a; }\\n .b-steps .steps .step-items .step-item.is-black.is-active::before, .b-steps .steps .step-items .step-item.is-black.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-black.is-previous .step-marker {\\n color: white;\\n background-color: #0a0a0a; }\\n .b-steps .steps .step-items .step-item.is-black.is-previous::before, .b-steps .steps .step-items .step-item.is-black.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-light::before, .b-steps .steps .step-items .step-item.is-light::after {\\n background: linear-gradient(to left, #dbdbdb 50%, whitesmoke 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-light.is-active .step-marker {\\n background-color: white;\\n border-color: whitesmoke;\\n color: whitesmoke; }\\n .b-steps .steps .step-items .step-item.is-light.is-active::before, .b-steps .steps .step-items .step-item.is-light.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-light.is-previous .step-marker {\\n color: #363636;\\n background-color: whitesmoke; }\\n .b-steps .steps .step-items .step-item.is-light.is-previous::before, .b-steps .steps .step-items .step-item.is-light.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-dark::before, .b-steps .steps .step-items .step-item.is-dark::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #363636 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-dark.is-active .step-marker {\\n background-color: white;\\n border-color: #363636;\\n color: #363636; }\\n .b-steps .steps .step-items .step-item.is-dark.is-active::before, .b-steps .steps .step-items .step-item.is-dark.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-dark.is-previous .step-marker {\\n color: whitesmoke;\\n background-color: #363636; }\\n .b-steps .steps .step-items .step-item.is-dark.is-previous::before, .b-steps .steps .step-items .step-item.is-dark.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-primary::before, .b-steps .steps .step-items .step-item.is-primary::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #00d1b2 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-primary.is-active .step-marker {\\n background-color: white;\\n border-color: #00d1b2;\\n color: #00d1b2; }\\n .b-steps .steps .step-items .step-item.is-primary.is-active::before, .b-steps .steps .step-items .step-item.is-primary.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-primary.is-previous .step-marker {\\n color: #fff;\\n background-color: #00d1b2; }\\n .b-steps .steps .step-items .step-item.is-primary.is-previous::before, .b-steps .steps .step-items .step-item.is-primary.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-link::before, .b-steps .steps .step-items .step-item.is-link::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #485fc7 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-link.is-active .step-marker {\\n background-color: white;\\n border-color: #485fc7;\\n color: #485fc7; }\\n .b-steps .steps .step-items .step-item.is-link.is-active::before, .b-steps .steps .step-items .step-item.is-link.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-link.is-previous .step-marker {\\n color: #fff;\\n background-color: #485fc7; }\\n .b-steps .steps .step-items .step-item.is-link.is-previous::before, .b-steps .steps .step-items .step-item.is-link.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-info::before, .b-steps .steps .step-items .step-item.is-info::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #3e8ed0 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-info.is-active .step-marker {\\n background-color: white;\\n border-color: #3e8ed0;\\n color: #3e8ed0; }\\n .b-steps .steps .step-items .step-item.is-info.is-active::before, .b-steps .steps .step-items .step-item.is-info.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-info.is-previous .step-marker {\\n color: #fff;\\n background-color: #3e8ed0; }\\n .b-steps .steps .step-items .step-item.is-info.is-previous::before, .b-steps .steps .step-items .step-item.is-info.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-success::before, .b-steps .steps .step-items .step-item.is-success::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #48c78e 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-success.is-active .step-marker {\\n background-color: white;\\n border-color: #48c78e;\\n color: #48c78e; }\\n .b-steps .steps .step-items .step-item.is-success.is-active::before, .b-steps .steps .step-items .step-item.is-success.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-success.is-previous .step-marker {\\n color: #fff;\\n background-color: #48c78e; }\\n .b-steps .steps .step-items .step-item.is-success.is-previous::before, .b-steps .steps .step-items .step-item.is-success.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-warning::before, .b-steps .steps .step-items .step-item.is-warning::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #ffe08a 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-warning.is-active .step-marker {\\n background-color: white;\\n border-color: #ffe08a;\\n color: #ffe08a; }\\n .b-steps .steps .step-items .step-item.is-warning.is-active::before, .b-steps .steps .step-items .step-item.is-warning.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-warning.is-previous .step-marker {\\n color: rgba(0, 0, 0, 0.7);\\n background-color: #ffe08a; }\\n .b-steps .steps .step-items .step-item.is-warning.is-previous::before, .b-steps .steps .step-items .step-item.is-warning.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-danger::before, .b-steps .steps .step-items .step-item.is-danger::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #f14668 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-danger.is-active .step-marker {\\n background-color: white;\\n border-color: #f14668;\\n color: #f14668; }\\n .b-steps .steps .step-items .step-item.is-danger.is-active::before, .b-steps .steps .step-items .step-item.is-danger.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-danger.is-previous .step-marker {\\n color: #fff;\\n background-color: #f14668; }\\n .b-steps .steps .step-items .step-item.is-danger.is-previous::before, .b-steps .steps .step-items .step-item.is-danger.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-twitter::before, .b-steps .steps .step-items .step-item.is-twitter::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #55acee 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-twitter.is-active .step-marker {\\n background-color: white;\\n border-color: #55acee;\\n color: #55acee; }\\n .b-steps .steps .step-items .step-item.is-twitter.is-active::before, .b-steps .steps .step-items .step-item.is-twitter.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-twitter.is-previous .step-marker {\\n color: #fff;\\n background-color: #55acee; }\\n .b-steps .steps .step-items .step-item.is-twitter.is-previous::before, .b-steps .steps .step-items .step-item.is-twitter.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-linkedin::before, .b-steps .steps .step-items .step-item.is-linkedin::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #0077b5 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-linkedin.is-active .step-marker {\\n background-color: white;\\n border-color: #0077b5;\\n color: #0077b5; }\\n .b-steps .steps .step-items .step-item.is-linkedin.is-active::before, .b-steps .steps .step-items .step-item.is-linkedin.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-linkedin.is-previous .step-marker {\\n color: #fff;\\n background-color: #0077b5; }\\n .b-steps .steps .step-items .step-item.is-linkedin.is-previous::before, .b-steps .steps .step-items .step-item.is-linkedin.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-github::before, .b-steps .steps .step-items .step-item.is-github::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #333 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-github.is-active .step-marker {\\n background-color: white;\\n border-color: #333;\\n color: #333; }\\n .b-steps .steps .step-items .step-item.is-github.is-active::before, .b-steps .steps .step-items .step-item.is-github.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-github.is-previous .step-marker {\\n color: #fff;\\n background-color: #333; }\\n .b-steps .steps .step-items .step-item.is-github.is-previous::before, .b-steps .steps .step-items .step-item.is-github.is-previous::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item .step-marker {\\n color: white; }\\n .b-steps .steps .step-items .step-item .step-details {\\n text-align: center;\\n z-index: 1; }\\n .b-steps .steps .step-items .step-item:not(:first-child), .b-steps .steps .step-items .step-item:only-child {\\n flex-shrink: 1; }\\n .b-steps .steps .step-items .step-item:not(:first-child)::before, .b-steps .steps .step-items .step-item:only-child::before {\\n content: \\\" \\\";\\n display: block;\\n position: absolute;\\n width: 100%;\\n bottom: 0;\\n left: -50%; }\\n .b-steps .steps .step-items .step-item:only-child::after {\\n content: \\\" \\\";\\n display: block;\\n position: absolute;\\n height: 0.2em;\\n bottom: 0; }\\n .b-steps .steps .step-items .step-item:only-child::before, .b-steps .steps .step-items .step-item:only-child::after {\\n width: 25%;\\n left: 50%; }\\n .b-steps .steps .step-items .step-item:only-child::before {\\n right: 50%;\\n left: auto; }\\n .b-steps .steps .step-items .step-item::before, .b-steps .steps .step-items .step-item::after {\\n background: linear-gradient(to left, #dbdbdb 50%, #00d1b2 50%);\\n background-size: 200% 100%;\\n background-position: right bottom; }\\n .b-steps .steps .step-items .step-item.is-active .step-link {\\n cursor: default; }\\n .b-steps .steps .step-items .step-item.is-active .step-marker {\\n background-color: white;\\n border-color: #00d1b2;\\n color: #00d1b2; }\\n .b-steps .steps .step-items .step-item.is-active::before, .b-steps .steps .step-items .step-item.is-active::after {\\n background-position: left bottom; }\\n .b-steps .steps .step-items .step-item.is-previous .step-marker {\\n color: white;\\n background-color: #00d1b2; }\\n .b-steps .steps .step-items .step-item.is-previous::before, .b-steps .steps .step-items .step-item.is-previous::after {\\n background-position: left bottom; }\\n\\n.b-steps .steps + .step-content {\\n position: relative;\\n overflow: visible;\\n display: flex;\\n flex-direction: column;\\n padding: 1rem; }\\n .b-steps .steps + .step-content .step-item {\\n flex-shrink: 0;\\n flex-basis: auto; }\\n .b-steps .steps + .step-content .step-item:focus {\\n outline: none; }\\n .b-steps .steps + .step-content.is-transitioning {\\n overflow: hidden; }\\n\\n.b-steps .steps.is-rounded .step-item .step-marker {\\n border-radius: 9999px; }\\n\\n.b-steps .steps.is-animated .step-item:not(:first-child)::before, .b-steps .steps.is-animated .step-item:only-child::before {\\n transition: background 150ms ease-out; }\\n\\n.b-steps .steps.has-label-right .step-items .step-item .step-link, .b-steps .steps.has-label-left .step-items .step-item .step-link {\\n flex-direction: row; }\\n .b-steps .steps.has-label-right .step-items .step-item .step-link > .step-details, .b-steps .steps.has-label-left .step-items .step-item .step-link > .step-details {\\n background-color: white;\\n padding: .2em; }\\n\\n.b-steps .steps.has-label-left .step-items .step-item .step-link {\\n flex-direction: row-reverse; }\\n\\n.b-steps .steps {\\n font-size: 1rem;\\n min-height: 2rem; }\\n .b-steps .steps .step-items .step-item .step-marker {\\n height: 2rem;\\n width: 2rem; }\\n .b-steps .steps .step-items .step-item .step-marker .icon *, .b-steps .steps .step-items .step-item .step-marker .icon *:before {\\n font-size: 1rem; }\\n .b-steps .steps .step-items .step-item .step-details .step-title {\\n font-size: 1.2rem;\\n font-weight: 600;\\n line-height: 1rem; }\\n .b-steps .steps .step-items .step-item:not(:first-child)::before, .b-steps .steps .step-items .step-item:only-child::before {\\n height: 0.2em;\\n top: 1rem; }\\n .b-steps .steps .step-items .step-item:only-child::after {\\n top: 1rem; }\\n @media screen and (max-width: 768px) {\\n .b-steps .steps .step-items .step-item::before, .b-steps .steps .step-items .step-item::after, .b-steps .steps .step-items .step-item:not(:first-child)::before {\\n top: 1rem; } }\\n\\n.b-steps.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-vertical > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-vertical > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1rem - 0.1em); }\\n\\n.b-steps.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-vertical > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-vertical > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1rem - 0.1em); }\\n\\n.b-steps.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1rem - 0.1em); }\\n\\n.b-steps.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1rem - 0.1em); }\\n\\n.b-steps.is-small .steps {\\n font-size: 0.75rem;\\n min-height: 1.5rem; }\\n .b-steps.is-small .steps .step-items .step-item .step-marker {\\n height: 1.5rem;\\n width: 1.5rem; }\\n .b-steps.is-small .steps .step-items .step-item .step-marker .icon *, .b-steps.is-small .steps .step-items .step-item .step-marker .icon *:before {\\n font-size: 0.75rem; }\\n .b-steps.is-small .steps .step-items .step-item .step-details .step-title {\\n font-size: 0.9rem;\\n font-weight: 600;\\n line-height: 0.75rem; }\\n .b-steps.is-small .steps .step-items .step-item:not(:first-child)::before, .b-steps.is-small .steps .step-items .step-item:only-child::before {\\n height: 0.2em;\\n top: 0.75rem; }\\n .b-steps.is-small .steps .step-items .step-item:only-child::after {\\n top: 0.75rem; }\\n @media screen and (max-width: 768px) {\\n .b-steps.is-small .steps .step-items .step-item::before, .b-steps.is-small .steps .step-items .step-item::after, .b-steps.is-small .steps .step-items .step-item:not(:first-child)::before {\\n top: 0.75rem; } }\\n\\n.b-steps.is-small.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-small.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-small.is-vertical > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-small.is-vertical > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(0.75rem - 0.1em); }\\n\\n.b-steps.is-small.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-small.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-small.is-vertical > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-small.is-vertical > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(0.75rem - 0.1em); }\\n\\n.b-steps.is-small.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-small.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-small.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-small.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(0.75rem - 0.1em); }\\n\\n.b-steps.is-small.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-small.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-small.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-small.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(0.75rem - 0.1em); }\\n\\n.b-steps.is-medium .steps {\\n font-size: 1.25rem;\\n min-height: 2.5rem; }\\n .b-steps.is-medium .steps .step-items .step-item .step-marker {\\n height: 2.5rem;\\n width: 2.5rem; }\\n .b-steps.is-medium .steps .step-items .step-item .step-marker .icon *, .b-steps.is-medium .steps .step-items .step-item .step-marker .icon *:before {\\n font-size: 1.25rem; }\\n .b-steps.is-medium .steps .step-items .step-item .step-details .step-title {\\n font-size: 1.5rem;\\n font-weight: 600;\\n line-height: 1.25rem; }\\n .b-steps.is-medium .steps .step-items .step-item:not(:first-child)::before, .b-steps.is-medium .steps .step-items .step-item:only-child::before {\\n height: 0.2em;\\n top: 1.25rem; }\\n .b-steps.is-medium .steps .step-items .step-item:only-child::after {\\n top: 1.25rem; }\\n @media screen and (max-width: 768px) {\\n .b-steps.is-medium .steps .step-items .step-item::before, .b-steps.is-medium .steps .step-items .step-item::after, .b-steps.is-medium .steps .step-items .step-item:not(:first-child)::before {\\n top: 1.25rem; } }\\n\\n.b-steps.is-medium.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-medium.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-medium.is-vertical > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-medium.is-vertical > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1.25rem - 0.1em); }\\n\\n.b-steps.is-medium.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-medium.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-medium.is-vertical > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-medium.is-vertical > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1.25rem - 0.1em); }\\n\\n.b-steps.is-medium.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1.25rem - 0.1em); }\\n\\n.b-steps.is-medium.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-medium.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1.25rem - 0.1em); }\\n\\n.b-steps.is-large .steps {\\n font-size: 1.5rem;\\n min-height: 3rem; }\\n .b-steps.is-large .steps .step-items .step-item .step-marker {\\n height: 3rem;\\n width: 3rem; }\\n .b-steps.is-large .steps .step-items .step-item .step-marker .icon *, .b-steps.is-large .steps .step-items .step-item .step-marker .icon *:before {\\n font-size: 1.5rem; }\\n .b-steps.is-large .steps .step-items .step-item .step-details .step-title {\\n font-size: 1.8rem;\\n font-weight: 600;\\n line-height: 1.5rem; }\\n .b-steps.is-large .steps .step-items .step-item:not(:first-child)::before, .b-steps.is-large .steps .step-items .step-item:only-child::before {\\n height: 0.2em;\\n top: 1.5rem; }\\n .b-steps.is-large .steps .step-items .step-item:only-child::after {\\n top: 1.5rem; }\\n @media screen and (max-width: 768px) {\\n .b-steps.is-large .steps .step-items .step-item::before, .b-steps.is-large .steps .step-items .step-item::after, .b-steps.is-large .steps .step-items .step-item:not(:first-child)::before {\\n top: 1.5rem; } }\\n\\n.b-steps.is-large.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-large.is-vertical > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-large.is-vertical > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-large.is-vertical > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1.5rem - 0.1em); }\\n\\n.b-steps.is-large.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-large.is-vertical > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-large.is-vertical > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-large.is-vertical > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1.5rem - 0.1em); }\\n\\n.b-steps.is-large.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::before, .b-steps.is-large.is-vertical.is-right > .steps.has-label-right .step-items .step-item:not(:first-child)::after, .b-steps.is-large.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::before, .b-steps.is-large.is-vertical.is-right > .steps.has-label-right .step-items .step-item:only-child::after {\\n left: calc(1.5rem - 0.1em); }\\n\\n.b-steps.is-large.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::before, .b-steps.is-large.is-vertical.is-right > .steps.has-label-left .step-items .step-item:not(:first-child)::after, .b-steps.is-large.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::before, .b-steps.is-large.is-vertical.is-right > .steps.has-label-left .step-items .step-item:only-child::after {\\n left: auto;\\n right: calc(1.5rem - 0.1em); }\\n\\n.b-steps.is-vertical {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap; }\\n .b-steps.is-vertical > .steps .step-items {\\n height: 100%;\\n flex-direction: column;\\n border-bottom-color: transparent; }\\n .b-steps.is-vertical > .steps .step-items .step-item {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 1em 0; }\\n .b-steps.is-vertical > .steps .step-items .step-item::before, .b-steps.is-vertical > .steps .step-items .step-item::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #00d1b2 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-white::before, .b-steps.is-vertical > .steps .step-items .step-item.is-white::after {\\n background: linear-gradient(to top, #dbdbdb 50%, white 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-black::before, .b-steps.is-vertical > .steps .step-items .step-item.is-black::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #0a0a0a 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-light::before, .b-steps.is-vertical > .steps .step-items .step-item.is-light::after {\\n background: linear-gradient(to top, #dbdbdb 50%, whitesmoke 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-dark::before, .b-steps.is-vertical > .steps .step-items .step-item.is-dark::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #363636 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-primary::before, .b-steps.is-vertical > .steps .step-items .step-item.is-primary::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #00d1b2 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-link::before, .b-steps.is-vertical > .steps .step-items .step-item.is-link::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #485fc7 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-info::before, .b-steps.is-vertical > .steps .step-items .step-item.is-info::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #3e8ed0 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-success::before, .b-steps.is-vertical > .steps .step-items .step-item.is-success::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #48c78e 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-warning::before, .b-steps.is-vertical > .steps .step-items .step-item.is-warning::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #ffe08a 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-danger::before, .b-steps.is-vertical > .steps .step-items .step-item.is-danger::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #f14668 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-twitter::before, .b-steps.is-vertical > .steps .step-items .step-item.is-twitter::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #55acee 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-linkedin::before, .b-steps.is-vertical > .steps .step-items .step-item.is-linkedin::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #0077b5 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-github::before, .b-steps.is-vertical > .steps .step-items .step-item.is-github::after {\\n background: linear-gradient(to top, #dbdbdb 50%, #333 50%);\\n background-size: 100% 200%;\\n background-position: left bottom; }\\n .b-steps.is-vertical > .steps .step-items .step-item:not(:first-child)::before, .b-steps.is-vertical > .steps .step-items .step-item:only-child::before {\\n height: 100%;\\n width: 0.2em;\\n top: -50%;\\n left: calc(50% - 0.1em); }\\n .b-steps.is-vertical > .steps .step-items .step-item.is-active::before, .b-steps.is-vertical > .steps .step-items .step-item.is-active::after, .b-steps.is-vertical > .steps .step-items .step-item.is-previous::before, .b-steps.is-vertical > .steps .step-items .step-item.is-previous::after {\\n background-position: right top; }\\n .b-steps.is-vertical > .steps .step-items .step-item:only-child::before {\\n top: 50%; }\\n .b-steps.is-vertical > .steps .step-items .step-item:only-child::after {\\n width: 0.2em;\\n top: auto;\\n bottom: 50%; }\\n .b-steps.is-vertical > .steps .step-items .step-item:only-child::before, .b-steps.is-vertical > .steps .step-items .step-item:only-child::after {\\n height: 25%; }\\n .b-steps.is-vertical > .steps.has-label-right .step-items .step-item {\\n justify-content: flex-start; }\\n .b-steps.is-vertical > .steps.has-label-left .step-items .step-item {\\n justify-content: flex-end; }\\n .b-steps.is-vertical > .steps:not(.has-label-right):not(.has-label-left) .step-items .step-item .step-link > .step-details {\\n background-color: white; }\\n .b-steps.is-vertical > .step-content {\\n flex-grow: 1; }\\n .b-steps.is-vertical > .step-navigation {\\n flex-basis: 100%; }\\n .b-steps.is-vertical.is-right {\\n flex-direction: row-reverse; }\\n\\n@media screen and (max-width: 768px) {\\n .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item:not(.is-active) {\\n display: none; }\\n .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item::before, .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item::after, .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item:not(:first-child)::before {\\n content: \\\" \\\";\\n display: block;\\n position: absolute;\\n height: 0.2em;\\n width: 25%;\\n bottom: 0;\\n left: 50%; }\\n .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item::before, .b-steps:not(.is-vertical) .steps.mobile-minimalist .step-items .step-item:not(:first-child)::before {\\n right: 50%;\\n left: auto; }\\n .b-steps:not(.is-vertical) .steps.mobile-compact .step-items .step-item:not(.is-active) .step-details {\\n display: none; } }\\n\\n.switch {\\n cursor: pointer;\\n display: inline-flex;\\n align-items: center;\\n position: relative;\\n margin-right: 0.5em; }\\n .switch + .switch:last-child {\\n margin-right: 0; }\\n .switch input[type=checkbox] {\\n position: absolute;\\n left: 0;\\n opacity: 0;\\n outline: none;\\n z-index: -1; }\\n .switch input[type=checkbox] + .check {\\n display: flex;\\n align-items: center;\\n flex-shrink: 0;\\n width: 2.75em;\\n height: 1.575em;\\n padding: 0.2em;\\n background: #b5b5b5;\\n border-radius: 4px;\\n transition: background 150ms ease-out, box-shadow 150ms ease-out; }\\n .switch input[type=checkbox] + .check.is-white-passive, .switch input[type=checkbox] + .check:hover {\\n background: white; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-black-passive, .switch input[type=checkbox] + .check:hover {\\n background: #0a0a0a; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-light-passive, .switch input[type=checkbox] + .check:hover {\\n background: whitesmoke; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-dark-passive, .switch input[type=checkbox] + .check:hover {\\n background: #363636; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-primary-passive, .switch input[type=checkbox] + .check:hover {\\n background: #00d1b2; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-link-passive, .switch input[type=checkbox] + .check:hover {\\n background: #485fc7; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-info-passive, .switch input[type=checkbox] + .check:hover {\\n background: #3e8ed0; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-success-passive, .switch input[type=checkbox] + .check:hover {\\n background: #48c78e; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-warning-passive, .switch input[type=checkbox] + .check:hover {\\n background: #ffe08a; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-danger-passive, .switch input[type=checkbox] + .check:hover {\\n background: #f14668; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-twitter-passive, .switch input[type=checkbox] + .check:hover {\\n background: #55acee; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-linkedin-passive, .switch input[type=checkbox] + .check:hover {\\n background: #0077b5; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check.is-github-passive, .switch input[type=checkbox] + .check:hover {\\n background: #333; }\\n .switch input[type=checkbox] + .check.input[type=checkbox] + .switch input[type=checkbox] + .check.check {\\n background: 'pink'; }\\n .switch input[type=checkbox] + .check:before {\\n content: \\\"\\\";\\n display: block;\\n border-radius: 4px;\\n width: 1.175em;\\n height: 1.175em;\\n background: whitesmoke;\\n box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);\\n transition: transform 150ms ease-out;\\n will-change: transform;\\n transform-origin: left; }\\n .switch input[type=checkbox] + .check.is-elastic:before {\\n transform: scaleX(1.5);\\n border-radius: 4px; }\\n .switch input[type=checkbox]:checked + .check {\\n background: #00d1b2; }\\n .switch input[type=checkbox]:checked + .check.is-white {\\n background: white; }\\n .switch input[type=checkbox]:checked + .check.is-black {\\n background: #0a0a0a; }\\n .switch input[type=checkbox]:checked + .check.is-light {\\n background: whitesmoke; }\\n .switch input[type=checkbox]:checked + .check.is-dark {\\n background: #363636; }\\n .switch input[type=checkbox]:checked + .check.is-primary {\\n background: #00d1b2; }\\n .switch input[type=checkbox]:checked + .check.is-link {\\n background: #485fc7; }\\n .switch input[type=checkbox]:checked + .check.is-info {\\n background: #3e8ed0; }\\n .switch input[type=checkbox]:checked + .check.is-success {\\n background: #48c78e; }\\n .switch input[type=checkbox]:checked + .check.is-warning {\\n background: #ffe08a; }\\n .switch input[type=checkbox]:checked + .check.is-danger {\\n background: #f14668; }\\n .switch input[type=checkbox]:checked + .check.is-twitter {\\n background: #55acee; }\\n .switch input[type=checkbox]:checked + .check.is-linkedin {\\n background: #0077b5; }\\n .switch input[type=checkbox]:checked + .check.is-github {\\n background: #333; }\\n .switch input[type=checkbox]:checked + .check:before {\\n transform: translate3d(100%, 0, 0); }\\n .switch input[type=checkbox]:checked + .check.is-elastic:before {\\n transform: translate3d(50%, 0, 0) scaleX(1.5); }\\n .switch input[type=checkbox]:focus, .switch input[type=checkbox]:active {\\n outline: none; }\\n .switch input[type=checkbox]:focus + .check, .switch input[type=checkbox]:active + .check {\\n box-shadow: 0 0 0.5em rgba(122, 122, 122, 0.6); }\\n .switch input[type=checkbox]:focus + .check.is-white-passive, .switch input[type=checkbox]:active + .check.is-white-passive {\\n box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-black-passive, .switch input[type=checkbox]:active + .check.is-black-passive {\\n box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-light-passive, .switch input[type=checkbox]:active + .check.is-light-passive {\\n box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-dark-passive, .switch input[type=checkbox]:active + .check.is-dark-passive {\\n box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-primary-passive, .switch input[type=checkbox]:active + .check.is-primary-passive {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-link-passive, .switch input[type=checkbox]:active + .check.is-link-passive {\\n box-shadow: 0 0 0.5em rgba(72, 95, 199, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-info-passive, .switch input[type=checkbox]:active + .check.is-info-passive {\\n box-shadow: 0 0 0.5em rgba(62, 142, 208, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-success-passive, .switch input[type=checkbox]:active + .check.is-success-passive {\\n box-shadow: 0 0 0.5em rgba(72, 199, 142, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-warning-passive, .switch input[type=checkbox]:active + .check.is-warning-passive {\\n box-shadow: 0 0 0.5em rgba(255, 224, 138, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-danger-passive, .switch input[type=checkbox]:active + .check.is-danger-passive {\\n box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-twitter-passive, .switch input[type=checkbox]:active + .check.is-twitter-passive {\\n box-shadow: 0 0 0.5em rgba(85, 172, 238, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-linkedin-passive, .switch input[type=checkbox]:active + .check.is-linkedin-passive {\\n box-shadow: 0 0 0.5em rgba(0, 119, 181, 0.8); }\\n .switch input[type=checkbox]:focus + .check.is-github-passive, .switch input[type=checkbox]:active + .check.is-github-passive {\\n box-shadow: 0 0 0.5em rgba(51, 51, 51, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check, .switch input[type=checkbox]:active:checked + .check {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-white, .switch input[type=checkbox]:active:checked + .check.is-white {\\n box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-black, .switch input[type=checkbox]:active:checked + .check.is-black {\\n box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-light, .switch input[type=checkbox]:active:checked + .check.is-light {\\n box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-dark, .switch input[type=checkbox]:active:checked + .check.is-dark {\\n box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-primary, .switch input[type=checkbox]:active:checked + .check.is-primary {\\n box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-link, .switch input[type=checkbox]:active:checked + .check.is-link {\\n box-shadow: 0 0 0.5em rgba(72, 95, 199, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-info, .switch input[type=checkbox]:active:checked + .check.is-info {\\n box-shadow: 0 0 0.5em rgba(62, 142, 208, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-success, .switch input[type=checkbox]:active:checked + .check.is-success {\\n box-shadow: 0 0 0.5em rgba(72, 199, 142, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-warning, .switch input[type=checkbox]:active:checked + .check.is-warning {\\n box-shadow: 0 0 0.5em rgba(255, 224, 138, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-danger, .switch input[type=checkbox]:active:checked + .check.is-danger {\\n box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-twitter, .switch input[type=checkbox]:active:checked + .check.is-twitter {\\n box-shadow: 0 0 0.5em rgba(85, 172, 238, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-linkedin, .switch input[type=checkbox]:active:checked + .check.is-linkedin {\\n box-shadow: 0 0 0.5em rgba(0, 119, 181, 0.8); }\\n .switch input[type=checkbox]:focus:checked + .check.is-github, .switch input[type=checkbox]:active:checked + .check.is-github {\\n box-shadow: 0 0 0.5em rgba(51, 51, 51, 0.8); }\\n .switch.has-left-label {\\n flex-direction: row-reverse; }\\n .switch.has-left-label .control-label {\\n padding-right: calc(0.75em - 1px); }\\n .switch:not(.has-left-label) .control-label {\\n padding-left: calc(0.75em - 1px); }\\n .switch:hover input[type=checkbox] + .check {\\n background: rgba(181, 181, 181, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-white-passive {\\n background: rgba(255, 255, 255, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-black-passive {\\n background: rgba(10, 10, 10, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-light-passive {\\n background: rgba(245, 245, 245, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-dark-passive {\\n background: rgba(54, 54, 54, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-primary-passive {\\n background: rgba(0, 209, 178, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-link-passive {\\n background: rgba(72, 95, 199, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-info-passive {\\n background: rgba(62, 142, 208, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-success-passive {\\n background: rgba(72, 199, 142, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-warning-passive {\\n background: rgba(255, 224, 138, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-danger-passive {\\n background: rgba(241, 70, 104, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-twitter-passive {\\n background: rgba(85, 172, 238, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-linkedin-passive {\\n background: rgba(0, 119, 181, 0.9); }\\n .switch:hover input[type=checkbox] + .check.is-github-passive {\\n background: rgba(51, 51, 51, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check {\\n background: rgba(0, 209, 178, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-white {\\n background: rgba(255, 255, 255, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-black {\\n background: rgba(10, 10, 10, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-light {\\n background: rgba(245, 245, 245, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-dark {\\n background: rgba(54, 54, 54, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-primary {\\n background: rgba(0, 209, 178, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-link {\\n background: rgba(72, 95, 199, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-info {\\n background: rgba(62, 142, 208, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-success {\\n background: rgba(72, 199, 142, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-warning {\\n background: rgba(255, 224, 138, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-danger {\\n background: rgba(241, 70, 104, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-twitter {\\n background: rgba(85, 172, 238, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-linkedin {\\n background: rgba(0, 119, 181, 0.9); }\\n .switch:hover input[type=checkbox]:checked + .check.is-github {\\n background: rgba(51, 51, 51, 0.9); }\\n .switch.is-rounded input[type=checkbox] + .check {\\n border-radius: 9999px; }\\n .switch.is-rounded input[type=checkbox] + .check:before {\\n border-radius: 9999px; }\\n .switch.is-rounded input[type=checkbox].is-elastic:before {\\n transform: scaleX(1.5);\\n border-radius: 9999px; }\\n .switch.is-outlined input[type=checkbox] + .check {\\n background: transparent;\\n border: 0.1rem solid #b5b5b5; }\\n .switch.is-outlined input[type=checkbox] + .check.is-white-passive {\\n border: 0.1rem solid rgba(255, 255, 255, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-white-passive:before {\\n background: white; }\\n .switch.is-outlined input[type=checkbox] + .check.is-white-passive:hover {\\n border-color: rgba(255, 255, 255, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-black-passive {\\n border: 0.1rem solid rgba(10, 10, 10, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-black-passive:before {\\n background: #0a0a0a; }\\n .switch.is-outlined input[type=checkbox] + .check.is-black-passive:hover {\\n border-color: rgba(10, 10, 10, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-light-passive {\\n border: 0.1rem solid rgba(245, 245, 245, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-light-passive:before {\\n background: whitesmoke; }\\n .switch.is-outlined input[type=checkbox] + .check.is-light-passive:hover {\\n border-color: rgba(245, 245, 245, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-dark-passive {\\n border: 0.1rem solid rgba(54, 54, 54, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-dark-passive:before {\\n background: #363636; }\\n .switch.is-outlined input[type=checkbox] + .check.is-dark-passive:hover {\\n border-color: rgba(54, 54, 54, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-primary-passive {\\n border: 0.1rem solid rgba(0, 209, 178, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-primary-passive:before {\\n background: #00d1b2; }\\n .switch.is-outlined input[type=checkbox] + .check.is-primary-passive:hover {\\n border-color: rgba(0, 209, 178, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-link-passive {\\n border: 0.1rem solid rgba(72, 95, 199, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-link-passive:before {\\n background: #485fc7; }\\n .switch.is-outlined input[type=checkbox] + .check.is-link-passive:hover {\\n border-color: rgba(72, 95, 199, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-info-passive {\\n border: 0.1rem solid rgba(62, 142, 208, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-info-passive:before {\\n background: #3e8ed0; }\\n .switch.is-outlined input[type=checkbox] + .check.is-info-passive:hover {\\n border-color: rgba(62, 142, 208, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-success-passive {\\n border: 0.1rem solid rgba(72, 199, 142, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-success-passive:before {\\n background: #48c78e; }\\n .switch.is-outlined input[type=checkbox] + .check.is-success-passive:hover {\\n border-color: rgba(72, 199, 142, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-warning-passive {\\n border: 0.1rem solid rgba(255, 224, 138, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-warning-passive:before {\\n background: #ffe08a; }\\n .switch.is-outlined input[type=checkbox] + .check.is-warning-passive:hover {\\n border-color: rgba(255, 224, 138, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-danger-passive {\\n border: 0.1rem solid rgba(241, 70, 104, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-danger-passive:before {\\n background: #f14668; }\\n .switch.is-outlined input[type=checkbox] + .check.is-danger-passive:hover {\\n border-color: rgba(241, 70, 104, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-twitter-passive {\\n border: 0.1rem solid rgba(85, 172, 238, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-twitter-passive:before {\\n background: #55acee; }\\n .switch.is-outlined input[type=checkbox] + .check.is-twitter-passive:hover {\\n border-color: rgba(85, 172, 238, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-linkedin-passive {\\n border: 0.1rem solid rgba(0, 119, 181, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-linkedin-passive:before {\\n background: #0077b5; }\\n .switch.is-outlined input[type=checkbox] + .check.is-linkedin-passive:hover {\\n border-color: rgba(0, 119, 181, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-github-passive {\\n border: 0.1rem solid rgba(51, 51, 51, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check.is-github-passive:before {\\n background: #333; }\\n .switch.is-outlined input[type=checkbox] + .check.is-github-passive:hover {\\n border-color: rgba(51, 51, 51, 0.9); }\\n .switch.is-outlined input[type=checkbox] + .check:before {\\n background: #b5b5b5; }\\n .switch.is-outlined input[type=checkbox]:checked + .check {\\n border-color: #00d1b2; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-white {\\n background: transparent;\\n border-color: white; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-white:before {\\n background: white; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-black {\\n background: transparent;\\n border-color: #0a0a0a; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-black:before {\\n background: #0a0a0a; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-light {\\n background: transparent;\\n border-color: whitesmoke; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-light:before {\\n background: whitesmoke; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-dark {\\n background: transparent;\\n border-color: #363636; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-dark:before {\\n background: #363636; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-primary {\\n background: transparent;\\n border-color: #00d1b2; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-primary:before {\\n background: #00d1b2; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-link {\\n background: transparent;\\n border-color: #485fc7; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-link:before {\\n background: #485fc7; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-info {\\n background: transparent;\\n border-color: #3e8ed0; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-info:before {\\n background: #3e8ed0; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-success {\\n background: transparent;\\n border-color: #48c78e; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-success:before {\\n background: #48c78e; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-warning {\\n background: transparent;\\n border-color: #ffe08a; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-warning:before {\\n background: #ffe08a; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-danger {\\n background: transparent;\\n border-color: #f14668; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-danger:before {\\n background: #f14668; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-twitter {\\n background: transparent;\\n border-color: #55acee; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-twitter:before {\\n background: #55acee; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-linkedin {\\n background: transparent;\\n border-color: #0077b5; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-linkedin:before {\\n background: #0077b5; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-github {\\n background: transparent;\\n border-color: #333; }\\n .switch.is-outlined input[type=checkbox]:checked + .check.is-github:before {\\n background: #333; }\\n .switch.is-outlined input[type=checkbox]:checked + .check:before {\\n background: #00d1b2; }\\n .switch.is-outlined:hover input[type=checkbox] + .check {\\n background: transparent;\\n border-color: rgba(181, 181, 181, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check {\\n background: transparent;\\n border-color: rgba(0, 209, 178, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-white {\\n border-color: rgba(255, 255, 255, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-black {\\n border-color: rgba(10, 10, 10, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-light {\\n border-color: rgba(245, 245, 245, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-dark {\\n border-color: rgba(54, 54, 54, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-primary {\\n border-color: rgba(0, 209, 178, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-link {\\n border-color: rgba(72, 95, 199, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-info {\\n border-color: rgba(62, 142, 208, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-success {\\n border-color: rgba(72, 199, 142, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-warning {\\n border-color: rgba(255, 224, 138, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-danger {\\n border-color: rgba(241, 70, 104, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-twitter {\\n border-color: rgba(85, 172, 238, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-linkedin {\\n border-color: rgba(0, 119, 181, 0.9); }\\n .switch.is-outlined:hover input[type=checkbox]:checked + .check.is-github {\\n border-color: rgba(51, 51, 51, 0.9); }\\n .switch.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .switch.is-medium {\\n font-size: 1.25rem; }\\n .switch.is-large {\\n font-size: 1.5rem; }\\n .switch[disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n color: #7a7a7a; }\\n\\n.table-wrapper .table {\\n margin-bottom: 0; }\\n\\n.table-wrapper:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n\\n@media screen and (max-width: 1023px) {\\n .table-wrapper {\\n overflow-x: auto; } }\\n\\n.b-table {\\n transition: opacity 86ms ease-out; }\\n @media screen and (min-width: 769px), print {\\n .b-table .table-mobile-sort {\\n display: none; } }\\n .b-table .icon {\\n transition: transform 150ms ease-out, opacity 86ms ease-out; }\\n .b-table .icon.is-desc {\\n transform: rotate(180deg); }\\n .b-table .icon.is-expanded {\\n transform: rotate(90deg); }\\n .b-table .sort-icon.icon.is-desc {\\n transform: rotate(180deg) translateY(-50%) !important; }\\n .b-table .table {\\n width: 100%;\\n border: 1px solid transparent;\\n border-radius: 4px;\\n border-collapse: separate; }\\n .b-table .table th {\\n font-weight: 600; }\\n .b-table .table th .th-wrap {\\n display: flex;\\n align-items: center; }\\n .b-table .table th .th-wrap .icon {\\n margin-left: 0.5rem;\\n margin-right: 0;\\n font-size: 1rem; }\\n .b-table .table th .th-wrap.is-numeric {\\n flex-direction: row-reverse;\\n text-align: right; }\\n .b-table .table th .th-wrap.is-numeric .icon {\\n margin-left: 0;\\n margin-right: 0.5rem; }\\n .b-table .table th .th-wrap.is-centered {\\n justify-content: center;\\n text-align: center; }\\n .b-table .table th.is-current-sort {\\n border-color: #7a7a7a;\\n font-weight: 700; }\\n .b-table .table th.is-sortable:hover {\\n border-color: #7a7a7a; }\\n .b-table .table th.is-sortable,\\n .b-table .table th.is-sortable .th-wrap {\\n cursor: pointer; }\\n .b-table .table th.is-sortable .is-relative,\\n .b-table .table th.is-sortable .th-wrap .is-relative {\\n position: absolute; }\\n .b-table .table th .sort-icon, .b-table .table th .multi-sort-cancel-icon {\\n position: absolute;\\n bottom: 50%;\\n left: 100%;\\n transform: translateY(50%); }\\n .b-table .table th .multi-sort-cancel-icon {\\n margin-left: 10px; }\\n .b-table .table th.is-sticky {\\n position: sticky;\\n left: 0;\\n z-index: 3 !important;\\n background: transparent; }\\n .b-table .table tr.is-selected .checkbox input:checked + .check {\\n background: #fff url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%2300d1b2' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\\\") no-repeat center center; }\\n .b-table .table tr.is-selected .checkbox input + .check {\\n border-color: #fff; }\\n .b-table .table tr.is-empty:hover {\\n background-color: transparent; }\\n .b-table .table .chevron-cell {\\n vertical-align: middle; }\\n .b-table .table .chevron-cell > a {\\n color: #485fc7 !important; }\\n .b-table .table .checkbox-cell {\\n width: 40px; }\\n .b-table .table .checkbox-cell .checkbox {\\n vertical-align: middle; }\\n .b-table .table .checkbox-cell .checkbox .check {\\n transition: none; }\\n .b-table .table tr.detail {\\n box-shadow: inset 0 1px 3px #dbdbdb;\\n background: #fafafa; }\\n .b-table .table tr.detail .detail-container {\\n padding: 1rem; }\\n .b-table .table:focus {\\n border-color: #485fc7;\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n .b-table .table.is-bordered th.is-current-sort,\\n .b-table .table.is-bordered th.is-sortable:hover {\\n border-color: #dbdbdb;\\n background: whitesmoke; }\\n .b-table .table td.is-sticky {\\n position: sticky;\\n left: 0;\\n z-index: 1;\\n background: white; }\\n .b-table .table.is-striped tbody tr:not(.is-selected):nth-child(even) td.is-sticky {\\n background: #fafafa; }\\n .b-table .level:not(.top) {\\n padding-bottom: 1.5rem; }\\n .b-table .table-wrapper {\\n position: relative; }\\n .b-table .table-wrapper.has-sticky-header {\\n height: 300px;\\n overflow-y: auto; }\\n @media screen and (max-width: 768px) {\\n .b-table .table-wrapper.has-sticky-header.has-mobile-cards {\\n height: initial !important;\\n overflow-y: initial !important; } }\\n .b-table .table-wrapper.has-sticky-header tr:first-child th {\\n position: sticky;\\n top: 0;\\n z-index: 2;\\n background: white; }\\n @media screen and (max-width: 768px) {\\n .b-table .table-wrapper.has-mobile-cards .table {\\n background-color: transparent; }\\n .b-table .table-wrapper.has-mobile-cards thead tr {\\n box-shadow: none;\\n border-width: 0; }\\n .b-table .table-wrapper.has-mobile-cards thead tr th {\\n display: none; }\\n .b-table .table-wrapper.has-mobile-cards thead tr .checkbox-cell {\\n display: block;\\n width: 100%;\\n text-align: right;\\n margin-bottom: 1rem;\\n border: 0; }\\n .b-table .table-wrapper.has-mobile-cards tfoot th {\\n border: 0;\\n display: inherit; }\\n .b-table .table-wrapper.has-mobile-cards tr {\\n box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);\\n max-width: 100%;\\n position: relative;\\n display: block; }\\n .b-table .table-wrapper.has-mobile-cards tr td {\\n border: 0;\\n display: inherit; }\\n .b-table .table-wrapper.has-mobile-cards tr td:last-child {\\n border-bottom: 0; }\\n .b-table .table-wrapper.has-mobile-cards tr:not(:last-child) {\\n margin-bottom: 1rem; }\\n .b-table .table-wrapper.has-mobile-cards tr:not([class*=\\\"is-\\\"]) {\\n background: white; }\\n .b-table .table-wrapper.has-mobile-cards tr:not([class*=\\\"is-\\\"]):hover {\\n background-color: white; }\\n .b-table .table-wrapper.has-mobile-cards tr.detail {\\n margin-top: -1rem; }\\n .b-table .table-wrapper.has-mobile-cards tr:not(.detail):not(.is-empty):not(.table-footer) td {\\n display: flex;\\n width: auto;\\n justify-content: space-between;\\n text-align: right;\\n border-bottom: 1px solid whitesmoke; }\\n .b-table .table-wrapper.has-mobile-cards tr:not(.detail):not(.is-empty):not(.table-footer) td:before {\\n content: attr(data-label);\\n font-weight: 600;\\n padding-right: 0.5em;\\n text-align: left; } }\\n .b-table .table-wrapper.is-card-list .table {\\n background-color: transparent; }\\n .b-table .table-wrapper.is-card-list thead tr {\\n box-shadow: none;\\n border-width: 0; }\\n .b-table .table-wrapper.is-card-list thead tr th {\\n display: none; }\\n .b-table .table-wrapper.is-card-list thead tr .checkbox-cell {\\n display: block;\\n width: 100%;\\n text-align: right;\\n margin-bottom: 1rem;\\n border: 0; }\\n .b-table .table-wrapper.is-card-list tfoot th {\\n border: 0;\\n display: inherit; }\\n .b-table .table-wrapper.is-card-list tr {\\n box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);\\n max-width: 100%;\\n position: relative;\\n display: block; }\\n .b-table .table-wrapper.is-card-list tr td {\\n border: 0;\\n display: inherit; }\\n .b-table .table-wrapper.is-card-list tr td:last-child {\\n border-bottom: 0; }\\n .b-table .table-wrapper.is-card-list tr:not(:last-child) {\\n margin-bottom: 1rem; }\\n .b-table .table-wrapper.is-card-list tr:not([class*=\\\"is-\\\"]) {\\n background: white; }\\n .b-table .table-wrapper.is-card-list tr:not([class*=\\\"is-\\\"]):hover {\\n background-color: white; }\\n .b-table .table-wrapper.is-card-list tr.detail {\\n margin-top: -1rem; }\\n .b-table .table-wrapper.is-card-list tr:not(.detail):not(.is-empty):not(.table-footer) td {\\n display: flex;\\n width: auto;\\n justify-content: space-between;\\n text-align: right;\\n border-bottom: 1px solid whitesmoke; }\\n .b-table .table-wrapper.is-card-list tr:not(.detail):not(.is-empty):not(.table-footer) td:before {\\n content: attr(data-label);\\n font-weight: 600;\\n padding-right: 0.5em;\\n text-align: left; }\\n\\n.b-tabs .tabs {\\n margin-bottom: 0;\\n flex-shrink: 0; }\\n .b-tabs .tabs li a:focus {\\n outline: none;\\n border-bottom-color: #485fc7; }\\n .b-tabs .tabs li:not(.is-active) a:focus {\\n border-bottom-color: #363636; }\\n .b-tabs .tabs li.is-disabled {\\n pointer-events: none;\\n cursor: not-allowed;\\n opacity: 0.5; }\\n .b-tabs .tabs.is-boxed li a:focus {\\n background-color: white;\\n border-bottom-color: transparent; }\\n .b-tabs .tabs.is-boxed li:not(.is-active) a:focus {\\n background-color: whitesmoke;\\n border-bottom-color: #dbdbdb; }\\n .b-tabs .tabs.is-toggle li a:focus {\\n background-color: #485fc7;\\n border-color: #485fc7; }\\n .b-tabs .tabs.is-toggle li:not(.is-active) a:focus {\\n background-color: whitesmoke;\\n border-color: #b5b5b5; }\\n\\n.b-tabs .tab-content {\\n position: relative;\\n overflow: visible;\\n display: flex;\\n flex-direction: column;\\n padding: 1rem; }\\n .b-tabs .tab-content .tab-item {\\n flex-shrink: 0;\\n flex-basis: auto; }\\n .b-tabs .tab-content .tab-item:focus {\\n outline: none; }\\n .b-tabs .tab-content.is-transitioning {\\n overflow: hidden; }\\n\\n.b-tabs:not(:last-child) {\\n margin-bottom: 1.5rem; }\\n\\n.b-tabs.is-fullwidth {\\n width: 100%; }\\n\\n.b-tabs.is-vertical {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap; }\\n .b-tabs.is-vertical > .tabs ul {\\n flex-direction: column;\\n border-bottom-color: transparent; }\\n .b-tabs.is-vertical > .tabs ul li {\\n width: 100%; }\\n .b-tabs.is-vertical > .tabs ul li a {\\n justify-content: left; }\\n .b-tabs.is-vertical > .tabs.is-boxed li a {\\n border-bottom-color: transparent !important;\\n border-right-color: #dbdbdb !important;\\n border-radius: 4px 0 0 4px; }\\n .b-tabs.is-vertical > .tabs.is-boxed li.is-active a {\\n border-bottom-color: #dbdbdb !important;\\n border-right-color: transparent !important; }\\n .b-tabs.is-vertical > .tabs.is-toggle li + li {\\n margin-left: 0; }\\n .b-tabs.is-vertical > .tabs.is-toggle li:first-child a {\\n border-radius: 4px 4px 0 0; }\\n .b-tabs.is-vertical > .tabs.is-toggle li:last-child a {\\n border-radius: 0 0 4px 4px; }\\n .b-tabs.is-vertical > .tabs.is-fullwidth li a {\\n height: 100%; }\\n .b-tabs.is-vertical > .tab-content {\\n flex-grow: 1; }\\n .b-tabs.is-vertical.is-right {\\n flex-direction: row-reverse; }\\n .b-tabs.is-vertical.is-right > .tabs ul a {\\n flex-direction: row-reverse; }\\n .b-tabs.is-vertical.is-right > .tabs ul a .icon:first-child {\\n margin-right: 0;\\n margin-left: 0.5em; }\\n .b-tabs.is-vertical.is-right > .tabs.is-boxed li a {\\n border-bottom-color: transparent !important;\\n border-right-color: transparent !important;\\n border-left-color: #dbdbdb !important;\\n border-radius: 0 4px 4px 0; }\\n .b-tabs.is-vertical.is-right > .tabs.is-boxed li.is-active a {\\n border-bottom-color: #dbdbdb !important;\\n border-right-color: #dbdbdb !important;\\n border-left-color: transparent !important; }\\n\\n.b-tabs.is-multiline > .tabs ul {\\n flex-wrap: wrap;\\n flex-shrink: 1; }\\n\\n.tag .has-ellipsis {\\n max-width: 10em;\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis; }\\n\\n.tag .delete.is-white, .tag.is-delete.is-white, .tag.has-delete-icon.is-white {\\n background: white; }\\n .tag .delete.is-white:hover, .tag.is-delete.is-white:hover, .tag.has-delete-icon.is-white:hover {\\n background-color: #e6e6e6;\\n text-decoration: none; }\\n\\n.tag .delete.is-black, .tag.is-delete.is-black, .tag.has-delete-icon.is-black {\\n background: #0a0a0a; }\\n .tag .delete.is-black:hover, .tag.is-delete.is-black:hover, .tag.has-delete-icon.is-black:hover {\\n background-color: black;\\n text-decoration: none; }\\n\\n.tag .delete.is-light, .tag.is-delete.is-light, .tag.has-delete-icon.is-light {\\n background: whitesmoke; }\\n .tag .delete.is-light:hover, .tag.is-delete.is-light:hover, .tag.has-delete-icon.is-light:hover {\\n background-color: #dbdbdb;\\n text-decoration: none; }\\n\\n.tag .delete.is-dark, .tag.is-delete.is-dark, .tag.has-delete-icon.is-dark {\\n background: #363636; }\\n .tag .delete.is-dark:hover, .tag.is-delete.is-dark:hover, .tag.has-delete-icon.is-dark:hover {\\n background-color: #1c1c1c;\\n text-decoration: none; }\\n\\n.tag .delete.is-primary, .tag.is-delete.is-primary, .tag.has-delete-icon.is-primary {\\n background: #00d1b2; }\\n .tag .delete.is-primary:hover, .tag.is-delete.is-primary:hover, .tag.has-delete-icon.is-primary:hover {\\n background-color: #009e86;\\n text-decoration: none; }\\n\\n.tag .delete.is-link, .tag.is-delete.is-link, .tag.has-delete-icon.is-link {\\n background: #485fc7; }\\n .tag .delete.is-link:hover, .tag.is-delete.is-link:hover, .tag.has-delete-icon.is-link:hover {\\n background-color: #3449a8;\\n text-decoration: none; }\\n\\n.tag .delete.is-info, .tag.is-delete.is-info, .tag.has-delete-icon.is-info {\\n background: #3e8ed0; }\\n .tag .delete.is-info:hover, .tag.is-delete.is-info:hover, .tag.has-delete-icon.is-info:hover {\\n background-color: #2b74b1;\\n text-decoration: none; }\\n\\n.tag .delete.is-success, .tag.is-delete.is-success, .tag.has-delete-icon.is-success {\\n background: #48c78e; }\\n .tag .delete.is-success:hover, .tag.is-delete.is-success:hover, .tag.has-delete-icon.is-success:hover {\\n background-color: #34a873;\\n text-decoration: none; }\\n\\n.tag .delete.is-warning, .tag.is-delete.is-warning, .tag.has-delete-icon.is-warning {\\n background: #ffe08a; }\\n .tag .delete.is-warning:hover, .tag.is-delete.is-warning:hover, .tag.has-delete-icon.is-warning:hover {\\n background-color: #ffd257;\\n text-decoration: none; }\\n\\n.tag .delete.is-danger, .tag.is-delete.is-danger, .tag.has-delete-icon.is-danger {\\n background: #f14668; }\\n .tag .delete.is-danger:hover, .tag.is-delete.is-danger:hover, .tag.has-delete-icon.is-danger:hover {\\n background-color: #ee1742;\\n text-decoration: none; }\\n\\n.tag .delete.is-twitter, .tag.is-delete.is-twitter, .tag.has-delete-icon.is-twitter {\\n background: #55acee; }\\n .tag .delete.is-twitter:hover, .tag.is-delete.is-twitter:hover, .tag.has-delete-icon.is-twitter:hover {\\n background-color: #2795e9;\\n text-decoration: none; }\\n\\n.tag .delete.is-linkedin, .tag.is-delete.is-linkedin, .tag.has-delete-icon.is-linkedin {\\n background: #0077b5; }\\n .tag .delete.is-linkedin:hover, .tag.is-delete.is-linkedin:hover, .tag.has-delete-icon.is-linkedin:hover {\\n background-color: #005582;\\n text-decoration: none; }\\n\\n.tag .delete.is-github, .tag.is-delete.is-github, .tag.has-delete-icon.is-github {\\n background: #333; }\\n .tag .delete.is-github:hover, .tag.is-delete.is-github:hover, .tag.has-delete-icon.is-github:hover {\\n background-color: #1a1a1a;\\n text-decoration: none; }\\n\\n.tag.has-delete-icon {\\n padding: 0px; }\\n .tag.has-delete-icon .icon:first-child:not(:last-child) {\\n margin-right: 0px;\\n margin-left: 0px; }\\n\\n.taginput .taginput-container {\\n display: flex; }\\n .taginput .taginput-container.is-focusable {\\n padding-bottom: 0;\\n padding-top: calc(0.275em - 1px);\\n padding-left: 0;\\n padding-right: 0;\\n align-items: center;\\n flex-wrap: wrap;\\n justify-content: flex-start;\\n height: auto;\\n cursor: text; }\\n .taginput .taginput-container:not(.is-focusable) {\\n align-items: center;\\n flex-wrap: wrap;\\n justify-content: flex-start;\\n height: auto; }\\n .taginput .taginput-container:not(.is-focusable).is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n .taginput .taginput-container:not(.is-focusable).is-medium {\\n font-size: 1.25rem; }\\n .taginput .taginput-container:not(.is-focusable).is-large {\\n font-size: 1.5rem; }\\n .taginput .taginput-container > .tag,\\n .taginput .taginput-container > .tags {\\n margin-left: 0.275rem;\\n margin-bottom: calc(0.275em - 1px);\\n font-size: 0.9em;\\n height: calc(2em - 1px); }\\n .taginput .taginput-container > .tag .tag,\\n .taginput .taginput-container > .tags .tag {\\n margin-bottom: 0;\\n font-size: 0.9em;\\n height: calc(2em - 1px); }\\n .taginput .taginput-container > .tag .tag.is-delete,\\n .taginput .taginput-container > .tags .tag.is-delete {\\n width: calc(2em - 1px); }\\n .taginput .taginput-container .autocomplete {\\n position: static;\\n flex: 1; }\\n .taginput .taginput-container .autocomplete input {\\n height: calc(2em - 1px);\\n margin-bottom: calc(0.275em - 1px);\\n padding-top: 0;\\n padding-bottom: 0;\\n border: none;\\n box-shadow: none;\\n min-width: 8em; }\\n .taginput .taginput-container .autocomplete input:focus {\\n box-shadow: none !important; }\\n .taginput .taginput-container .autocomplete .icon {\\n height: calc(2em - 1px); }\\n .taginput .taginput-container .autocomplete > .control.is-loading::after {\\n top: 0.375em; }\\n\\n.timepicker .dropdown-menu {\\n min-width: 0; }\\n\\n.timepicker .dropdown,\\n.timepicker .dropdown-trigger {\\n width: 100%; }\\n .timepicker .dropdown .input[readonly],\\n .timepicker .dropdown-trigger .input[readonly] {\\n cursor: pointer;\\n box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); }\\n .timepicker .dropdown .input[readonly]:focus, .timepicker .dropdown .input[readonly].is-focused, .timepicker .dropdown .input[readonly]:active, .timepicker .dropdown .input[readonly].is-active,\\n .timepicker .dropdown-trigger .input[readonly]:focus,\\n .timepicker .dropdown-trigger .input[readonly].is-focused,\\n .timepicker .dropdown-trigger .input[readonly]:active,\\n .timepicker .dropdown-trigger .input[readonly].is-active {\\n box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); }\\n\\n.timepicker .dropdown.is-disabled {\\n opacity: 1; }\\n\\n.timepicker .dropdown-item, .timepicker .dropdown .dropdown-menu .has-link a, .dropdown .dropdown-menu .has-link .timepicker a {\\n font-size: inherit;\\n padding: 0; }\\n\\n.timepicker .timepicker-footer {\\n padding: 0 0.5rem 0 0.5rem; }\\n\\n.timepicker .dropdown-content .control {\\n font-size: 1.25em;\\n margin-right: 0 !important; }\\n .timepicker .dropdown-content .control .select {\\n margin: 0 0.125em; }\\n .timepicker .dropdown-content .control .select select {\\n font-weight: 600;\\n padding-right: calc(0.75em - 1px);\\n border: 0; }\\n .timepicker .dropdown-content .control .select select option:disabled {\\n color: rgba(122, 122, 122, 0.7); }\\n .timepicker .dropdown-content .control .select:after {\\n display: none; }\\n .timepicker .dropdown-content .control.is-colon {\\n font-size: 1.7em;\\n line-height: 1.7em; }\\n .timepicker .dropdown-content .control.is-colon:last-child {\\n padding-right: calc(0.75em - 1px); }\\n\\n.timepicker.is-small {\\n border-radius: 2px;\\n font-size: 0.75rem; }\\n\\n.timepicker.is-medium {\\n font-size: 1.25rem; }\\n\\n.timepicker.is-large {\\n font-size: 1.5rem; }\\n\\n.b-tooltip {\\n position: relative;\\n display: inline-flex; }\\n .b-tooltip.is-top .tooltip-content {\\n top: auto;\\n right: auto;\\n bottom: calc(100% + 5px + 2px);\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-tooltip.is-top .tooltip-content::before {\\n top: 100%;\\n right: auto;\\n bottom: auto;\\n left: 50%;\\n transform: translateX(-50%);\\n border-top: 5px solid #00d1b2;\\n border-right: 5px solid transparent;\\n border-left: 5px solid transparent; }\\n .b-tooltip.is-top.is-white .tooltip-content::before {\\n border-top-color: white; }\\n .b-tooltip.is-top.is-black .tooltip-content::before {\\n border-top-color: #0a0a0a; }\\n .b-tooltip.is-top.is-light .tooltip-content::before {\\n border-top-color: whitesmoke; }\\n .b-tooltip.is-top.is-dark .tooltip-content::before {\\n border-top-color: #363636; }\\n .b-tooltip.is-top.is-primary .tooltip-content::before {\\n border-top-color: #00d1b2; }\\n .b-tooltip.is-top.is-primary.is-light .tooltip-content::before {\\n border-top-color: #ebfffc; }\\n .b-tooltip.is-top.is-link .tooltip-content::before {\\n border-top-color: #485fc7; }\\n .b-tooltip.is-top.is-link.is-light .tooltip-content::before {\\n border-top-color: #eff1fa; }\\n .b-tooltip.is-top.is-info .tooltip-content::before {\\n border-top-color: #3e8ed0; }\\n .b-tooltip.is-top.is-info.is-light .tooltip-content::before {\\n border-top-color: #eff5fb; }\\n .b-tooltip.is-top.is-success .tooltip-content::before {\\n border-top-color: #48c78e; }\\n .b-tooltip.is-top.is-success.is-light .tooltip-content::before {\\n border-top-color: #effaf5; }\\n .b-tooltip.is-top.is-warning .tooltip-content::before {\\n border-top-color: #ffe08a; }\\n .b-tooltip.is-top.is-warning.is-light .tooltip-content::before {\\n border-top-color: #fffaeb; }\\n .b-tooltip.is-top.is-danger .tooltip-content::before {\\n border-top-color: #f14668; }\\n .b-tooltip.is-top.is-danger.is-light .tooltip-content::before {\\n border-top-color: #feecf0; }\\n .b-tooltip.is-top.is-twitter .tooltip-content::before {\\n border-top-color: #55acee; }\\n .b-tooltip.is-top.is-linkedin .tooltip-content::before {\\n border-top-color: #0077b5; }\\n .b-tooltip.is-top.is-github .tooltip-content::before {\\n border-top-color: #333; }\\n .b-tooltip.is-right .tooltip-content {\\n top: 50%;\\n right: auto;\\n bottom: auto;\\n left: calc(100% + 5px + 2px);\\n transform: translateY(-50%); }\\n .b-tooltip.is-right .tooltip-content::before {\\n top: 50%;\\n right: 100%;\\n bottom: auto;\\n left: auto;\\n transform: translateY(-50%);\\n border-top: 5px solid transparent;\\n border-right: 5px solid #00d1b2;\\n border-bottom: 5px solid transparent; }\\n .b-tooltip.is-right.is-white .tooltip-content::before {\\n border-right-color: white; }\\n .b-tooltip.is-right.is-black .tooltip-content::before {\\n border-right-color: #0a0a0a; }\\n .b-tooltip.is-right.is-light .tooltip-content::before {\\n border-right-color: whitesmoke; }\\n .b-tooltip.is-right.is-dark .tooltip-content::before {\\n border-right-color: #363636; }\\n .b-tooltip.is-right.is-primary .tooltip-content::before {\\n border-right-color: #00d1b2; }\\n .b-tooltip.is-right.is-primary.is-light .tooltip-content::before {\\n border-right-color: #ebfffc; }\\n .b-tooltip.is-right.is-link .tooltip-content::before {\\n border-right-color: #485fc7; }\\n .b-tooltip.is-right.is-link.is-light .tooltip-content::before {\\n border-right-color: #eff1fa; }\\n .b-tooltip.is-right.is-info .tooltip-content::before {\\n border-right-color: #3e8ed0; }\\n .b-tooltip.is-right.is-info.is-light .tooltip-content::before {\\n border-right-color: #eff5fb; }\\n .b-tooltip.is-right.is-success .tooltip-content::before {\\n border-right-color: #48c78e; }\\n .b-tooltip.is-right.is-success.is-light .tooltip-content::before {\\n border-right-color: #effaf5; }\\n .b-tooltip.is-right.is-warning .tooltip-content::before {\\n border-right-color: #ffe08a; }\\n .b-tooltip.is-right.is-warning.is-light .tooltip-content::before {\\n border-right-color: #fffaeb; }\\n .b-tooltip.is-right.is-danger .tooltip-content::before {\\n border-right-color: #f14668; }\\n .b-tooltip.is-right.is-danger.is-light .tooltip-content::before {\\n border-right-color: #feecf0; }\\n .b-tooltip.is-right.is-twitter .tooltip-content::before {\\n border-right-color: #55acee; }\\n .b-tooltip.is-right.is-linkedin .tooltip-content::before {\\n border-right-color: #0077b5; }\\n .b-tooltip.is-right.is-github .tooltip-content::before {\\n border-right-color: #333; }\\n .b-tooltip.is-bottom .tooltip-content {\\n top: calc(100% + 5px + 2px);\\n right: auto;\\n bottom: auto;\\n left: 50%;\\n transform: translateX(-50%); }\\n .b-tooltip.is-bottom .tooltip-content::before {\\n top: auto;\\n right: auto;\\n bottom: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n border-right: 5px solid transparent;\\n border-bottom: 5px solid #00d1b2;\\n border-left: 5px solid transparent; }\\n .b-tooltip.is-bottom.is-white .tooltip-content::before {\\n border-bottom-color: white; }\\n .b-tooltip.is-bottom.is-black .tooltip-content::before {\\n border-bottom-color: #0a0a0a; }\\n .b-tooltip.is-bottom.is-light .tooltip-content::before {\\n border-bottom-color: whitesmoke; }\\n .b-tooltip.is-bottom.is-dark .tooltip-content::before {\\n border-bottom-color: #363636; }\\n .b-tooltip.is-bottom.is-primary .tooltip-content::before {\\n border-bottom-color: #00d1b2; }\\n .b-tooltip.is-bottom.is-primary.is-light .tooltip-content::before {\\n border-bottom-color: #ebfffc; }\\n .b-tooltip.is-bottom.is-link .tooltip-content::before {\\n border-bottom-color: #485fc7; }\\n .b-tooltip.is-bottom.is-link.is-light .tooltip-content::before {\\n border-bottom-color: #eff1fa; }\\n .b-tooltip.is-bottom.is-info .tooltip-content::before {\\n border-bottom-color: #3e8ed0; }\\n .b-tooltip.is-bottom.is-info.is-light .tooltip-content::before {\\n border-bottom-color: #eff5fb; }\\n .b-tooltip.is-bottom.is-success .tooltip-content::before {\\n border-bottom-color: #48c78e; }\\n .b-tooltip.is-bottom.is-success.is-light .tooltip-content::before {\\n border-bottom-color: #effaf5; }\\n .b-tooltip.is-bottom.is-warning .tooltip-content::before {\\n border-bottom-color: #ffe08a; }\\n .b-tooltip.is-bottom.is-warning.is-light .tooltip-content::before {\\n border-bottom-color: #fffaeb; }\\n .b-tooltip.is-bottom.is-danger .tooltip-content::before {\\n border-bottom-color: #f14668; }\\n .b-tooltip.is-bottom.is-danger.is-light .tooltip-content::before {\\n border-bottom-color: #feecf0; }\\n .b-tooltip.is-bottom.is-twitter .tooltip-content::before {\\n border-bottom-color: #55acee; }\\n .b-tooltip.is-bottom.is-linkedin .tooltip-content::before {\\n border-bottom-color: #0077b5; }\\n .b-tooltip.is-bottom.is-github .tooltip-content::before {\\n border-bottom-color: #333; }\\n .b-tooltip.is-left .tooltip-content {\\n top: 50%;\\n right: calc(100% + 5px + 2px);\\n bottom: auto;\\n left: auto;\\n transform: translateY(-50%); }\\n .b-tooltip.is-left .tooltip-content::before {\\n top: 50%;\\n right: auto;\\n bottom: auto;\\n left: 100%;\\n transform: translateY(-50%);\\n border-top: 5px solid transparent;\\n border-bottom: 5px solid transparent;\\n border-left: 5px solid #00d1b2; }\\n .b-tooltip.is-left.is-white .tooltip-content::before {\\n border-left-color: white; }\\n .b-tooltip.is-left.is-black .tooltip-content::before {\\n border-left-color: #0a0a0a; }\\n .b-tooltip.is-left.is-light .tooltip-content::before {\\n border-left-color: whitesmoke; }\\n .b-tooltip.is-left.is-dark .tooltip-content::before {\\n border-left-color: #363636; }\\n .b-tooltip.is-left.is-primary .tooltip-content::before {\\n border-left-color: #00d1b2; }\\n .b-tooltip.is-left.is-primary.is-light .tooltip-content::before {\\n border-left-color: #ebfffc; }\\n .b-tooltip.is-left.is-link .tooltip-content::before {\\n border-left-color: #485fc7; }\\n .b-tooltip.is-left.is-link.is-light .tooltip-content::before {\\n border-left-color: #eff1fa; }\\n .b-tooltip.is-left.is-info .tooltip-content::before {\\n border-left-color: #3e8ed0; }\\n .b-tooltip.is-left.is-info.is-light .tooltip-content::before {\\n border-left-color: #eff5fb; }\\n .b-tooltip.is-left.is-success .tooltip-content::before {\\n border-left-color: #48c78e; }\\n .b-tooltip.is-left.is-success.is-light .tooltip-content::before {\\n border-left-color: #effaf5; }\\n .b-tooltip.is-left.is-warning .tooltip-content::before {\\n border-left-color: #ffe08a; }\\n .b-tooltip.is-left.is-warning.is-light .tooltip-content::before {\\n border-left-color: #fffaeb; }\\n .b-tooltip.is-left.is-danger .tooltip-content::before {\\n border-left-color: #f14668; }\\n .b-tooltip.is-left.is-danger.is-light .tooltip-content::before {\\n border-left-color: #feecf0; }\\n .b-tooltip.is-left.is-twitter .tooltip-content::before {\\n border-left-color: #55acee; }\\n .b-tooltip.is-left.is-linkedin .tooltip-content::before {\\n border-left-color: #0077b5; }\\n .b-tooltip.is-left.is-github .tooltip-content::before {\\n border-left-color: #333; }\\n .b-tooltip .tooltip-content {\\n width: auto;\\n padding: 0.35rem 0.75rem;\\n border-radius: 6px;\\n font-size: 0.85rem;\\n font-weight: 400;\\n box-shadow: 0px 1px 2px 1px rgba(0, 1, 0, 0.2);\\n z-index: 38;\\n white-space: nowrap;\\n position: absolute; }\\n .b-tooltip .tooltip-content::before {\\n position: absolute;\\n content: \\\"\\\";\\n pointer-events: none;\\n z-index: 38; }\\n .b-tooltip .tooltip-trigger {\\n width: 100%; }\\n .b-tooltip.is-white .tooltip-content {\\n background: white;\\n color: #0a0a0a; }\\n .b-tooltip.is-black .tooltip-content {\\n background: #0a0a0a;\\n color: white; }\\n .b-tooltip.is-light .tooltip-content {\\n background: whitesmoke;\\n color: #363636; }\\n .b-tooltip.is-dark .tooltip-content {\\n background: #363636;\\n color: whitesmoke; }\\n .b-tooltip.is-primary .tooltip-content {\\n background: #00d1b2;\\n color: #fff; }\\n .b-tooltip.is-primary.is-light .tooltip-content {\\n background: #ebfffc;\\n color: #00947e; }\\n .b-tooltip.is-link .tooltip-content {\\n background: #485fc7;\\n color: #fff; }\\n .b-tooltip.is-link.is-light .tooltip-content {\\n background: #eff1fa;\\n color: #3850b7; }\\n .b-tooltip.is-info .tooltip-content {\\n background: #3e8ed0;\\n color: #fff; }\\n .b-tooltip.is-info.is-light .tooltip-content {\\n background: #eff5fb;\\n color: #296fa8; }\\n .b-tooltip.is-success .tooltip-content {\\n background: #48c78e;\\n color: #fff; }\\n .b-tooltip.is-success.is-light .tooltip-content {\\n background: #effaf5;\\n color: #257953; }\\n .b-tooltip.is-warning .tooltip-content {\\n background: #ffe08a;\\n color: rgba(0, 0, 0, 0.7); }\\n .b-tooltip.is-warning.is-light .tooltip-content {\\n background: #fffaeb;\\n color: #946c00; }\\n .b-tooltip.is-danger .tooltip-content {\\n background: #f14668;\\n color: #fff; }\\n .b-tooltip.is-danger.is-light .tooltip-content {\\n background: #feecf0;\\n color: #cc0f35; }\\n .b-tooltip.is-twitter .tooltip-content {\\n background: #55acee;\\n color: #fff; }\\n .b-tooltip.is-linkedin .tooltip-content {\\n background: #0077b5;\\n color: #fff; }\\n .b-tooltip.is-github .tooltip-content {\\n background: #333;\\n color: #fff; }\\n .b-tooltip.is-always .tooltip-content::before,\\n .b-tooltip.is-always .tooltip-content {\\n opacity: 1;\\n visibility: visible; }\\n .b-tooltip.is-multiline .tooltip-content {\\n display: flex-block;\\n text-align: center;\\n white-space: normal; }\\n .b-tooltip.is-multiline.is-small .tooltip-content {\\n width: 180px; }\\n .b-tooltip.is-multiline.is-medium .tooltip-content {\\n width: 240px; }\\n .b-tooltip.is-multiline.is-large .tooltip-content {\\n width: 300px; }\\n .b-tooltip.is-dashed .tooltip-trigger {\\n border-bottom: 1px dashed #b5b5b5;\\n cursor: default; }\\n .b-tooltip.is-square .tooltip-content {\\n border-radius: 0; }\\n\\n.upload {\\n position: relative;\\n display: inline-flex; }\\n .upload input[type=\\\"file\\\"] {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n opacity: 0;\\n outline: none;\\n cursor: pointer;\\n z-index: -1; }\\n .upload .upload-draggable {\\n cursor: pointer;\\n padding: 0.25em;\\n border: 1px dashed #b5b5b5;\\n border-radius: 6px; }\\n .upload .upload-draggable.is-disabled {\\n opacity: 0.5;\\n cursor: not-allowed; }\\n .upload .upload-draggable.is-loading {\\n position: relative;\\n pointer-events: none;\\n opacity: 0.5; }\\n .upload .upload-draggable.is-loading:after {\\n -webkit-animation: spinAround 500ms infinite linear;\\n animation: spinAround 500ms infinite linear;\\n border: 2px solid #dbdbdb;\\n border-radius: 9999px;\\n border-right-color: transparent;\\n border-top-color: transparent;\\n content: \\\"\\\";\\n display: block;\\n height: 1em;\\n position: relative;\\n width: 1em;\\n top: 0;\\n left: calc(50% - 1.5em);\\n width: 3em;\\n height: 3em;\\n border-width: 0.25em; }\\n .upload .upload-draggable:hover.is-white, .upload .upload-draggable.is-hovered.is-white {\\n border-color: white;\\n background: rgba(255, 255, 255, 0.05); }\\n .upload .upload-draggable:hover.is-black, .upload .upload-draggable.is-hovered.is-black {\\n border-color: #0a0a0a;\\n background: rgba(10, 10, 10, 0.05); }\\n .upload .upload-draggable:hover.is-light, .upload .upload-draggable.is-hovered.is-light {\\n border-color: whitesmoke;\\n background: rgba(245, 245, 245, 0.05); }\\n .upload .upload-draggable:hover.is-dark, .upload .upload-draggable.is-hovered.is-dark {\\n border-color: #363636;\\n background: rgba(54, 54, 54, 0.05); }\\n .upload .upload-draggable:hover.is-primary, .upload .upload-draggable.is-hovered.is-primary {\\n border-color: #00d1b2;\\n background: rgba(0, 209, 178, 0.05); }\\n .upload .upload-draggable:hover.is-link, .upload .upload-draggable.is-hovered.is-link {\\n border-color: #485fc7;\\n background: rgba(72, 95, 199, 0.05); }\\n .upload .upload-draggable:hover.is-info, .upload .upload-draggable.is-hovered.is-info {\\n border-color: #3e8ed0;\\n background: rgba(62, 142, 208, 0.05); }\\n .upload .upload-draggable:hover.is-success, .upload .upload-draggable.is-hovered.is-success {\\n border-color: #48c78e;\\n background: rgba(72, 199, 142, 0.05); }\\n .upload .upload-draggable:hover.is-warning, .upload .upload-draggable.is-hovered.is-warning {\\n border-color: #ffe08a;\\n background: rgba(255, 224, 138, 0.05); }\\n .upload .upload-draggable:hover.is-danger, .upload .upload-draggable.is-hovered.is-danger {\\n border-color: #f14668;\\n background: rgba(241, 70, 104, 0.05); }\\n .upload .upload-draggable:hover.is-twitter, .upload .upload-draggable.is-hovered.is-twitter {\\n border-color: #55acee;\\n background: rgba(85, 172, 238, 0.05); }\\n .upload .upload-draggable:hover.is-linkedin, .upload .upload-draggable.is-hovered.is-linkedin {\\n border-color: #0077b5;\\n background: rgba(0, 119, 181, 0.05); }\\n .upload .upload-draggable:hover.is-github, .upload .upload-draggable.is-hovered.is-github {\\n border-color: #333;\\n background: rgba(51, 51, 51, 0.05); }\\n .upload .upload-draggable.is-expanded {\\n width: 100%; }\\n .upload.is-expanded {\\n width: 100%; }\\n .upload.is-rounded {\\n border-radius: 9999px; }\\n .upload.is-rounded .file-name {\\n border-top-right-radius: 9999px;\\n border-bottom-right-radius: 9999px; }\\n\\n@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\\n .upload input[type=\\\"file\\\"] {\\n z-index: auto; }\\n .upload .upload-draggable + input[type=\\\"file\\\"] {\\n z-index: -1; } }\\n\\nbody,\\nhtml {\\n overflow: hidden;\\n font-family: \\\"Roboto\\\", sans-serif; }\\n\\n#app {\\n width: 100vw;\\n height: 100vh;\\n font-family: Avenir, Helvetica, Arial, sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n text-align: center;\\n color: #2c3e50;\\n background-size: cover;\\n background-repeat: no-repeat;\\n background-position: center center; }\\n\\n.top-bar {\\n position: relative;\\n z-index: 10;\\n height: 3rem;\\n background: rgba(255, 255, 255, 0.22);\\n -webkit-backdrop-filter: blur(180.282px);\\n backdrop-filter: blur(180.282px); }\\n .top-bar .navbar-brand .dropdown-menu {\\n margin-top: 0.5rem;\\n min-width: 20rem; }\\n .top-bar .navbar-brand .dropdown-menu .dropdown-content .dropdown-item, .top-bar .navbar-brand .dropdown .dropdown-menu .dropdown-content .has-link a, .dropdown .top-bar .navbar-brand .dropdown-menu .dropdown-content .has-link a, .top-bar .navbar-brand .dropdown .dropdown-menu .has-link .dropdown-content a, .dropdown .top-bar .navbar-brand .dropdown-menu .has-link .dropdown-content a {\\n padding: 1.25rem;\\n text-align: left; }\\n .top-bar .navbar-brand .dropdown-menu .dropdown-content .dropdown-item .item, .top-bar .navbar-brand .dropdown .dropdown-menu .dropdown-content .has-link a .item, .dropdown .top-bar .navbar-brand .dropdown-menu .dropdown-content .has-link a .item, .top-bar .navbar-brand .dropdown .dropdown-menu .has-link .dropdown-content a .item, .dropdown .top-bar .navbar-brand .dropdown-menu .has-link .dropdown-content a .item {\\n height: 2rem; }\\n .top-bar .field {\\n line-height: 1rem; }\\n .top-bar .switch.is-flex-direction-row-reverse .control-label {\\n padding-left: 0;\\n padding-right: calc(0.75em - 1px); }\\n .top-bar .update-container .button.is-rounded {\\n border-radius: 9999px !important;\\n padding-left: calc(1em + 0.25em);\\n padding-right: calc(1em + 0.25em); }\\n .top-bar .button.is-small {\\n height: 2em; }\\n\\n.brand-bar {\\n position: fixed;\\n left: 2rem;\\n bottom: 2rem; }\\n\\n.contact-bar {\\n position: fixed;\\n right: 2rem;\\n bottom: 2rem;\\n height: 3.5rem;\\n background: rgba(0, 0, 0, 0.16);\\n -webkit-backdrop-filter: blur(24px);\\n backdrop-filter: blur(24px);\\n border-radius: 4px;\\n font-size: 1.5rem; }\\n .contact-bar a {\\n color: white;\\n margin: 0.5rem;\\n display: flex;\\n align-items: center; }\\n .contact-bar a:hover {\\n color: #0077b5; }\\n\\n.contents {\\n flex: 1;\\n overflow: auto; }\\n\\n.side-bar {\\n width: 16rem;\\n position: fixed; }\\n\\n.main-content {\\n flex: 1;\\n margin-left: 17.5rem; }\\n\\n.pt-7 {\\n padding-top: 4rem; }\\n\\n.pt-55 {\\n padding-top: 2rem; }\\n\\n.p-55 {\\n padding: 2rem !important; }\\n\\n.button.is-light {\\n background-color: #a6afb9;\\n color: white; }\\n\\n.label {\\n font-size: 0.875rem;\\n margin-bottom: 0.5rem; }\\n\\n.button:focus,\\n.input:focus,\\n.textarea:focus,\\n.taginput .taginput-container.is-focusable:focus,\\n.select select:focus,\\n.file-cta:focus,\\n.file-name:focus,\\n.pagination-previous:focus,\\n.pagination-next:focus,\\n.pagination-link:focus,\\n.pagination-ellipsis:focus {\\n box-shadow: none; }\\n\\n.image.is-72x72 {\\n height: 72px;\\n width: 72px; }\\n\\n.widget {\\n background: rgba(123, 123, 123, 0.16);\\n -webkit-backdrop-filter: blur(1rem);\\n backdrop-filter: blur(1rem);\\n border-radius: 0.5rem;\\n padding: 0.875rem 1.5rem;\\n margin-bottom: 0.75rem; }\\n\\n.wuji-card {\\n background: rgba(123, 123, 123, 0.16);\\n -webkit-backdrop-filter: blur(1rem);\\n backdrop-filter: blur(1rem);\\n border-radius: 0.5rem;\\n padding: 1.5rem;\\n color: white;\\n position: relative; }\\n .wuji-card .info {\\n flex: 1;\\n margin-right: 1rem;\\n color: white; }\\n .wuji-card .simg img {\\n border-radius: 4px; }\\n .wuji-card .icon-img {\\n position: relative; }\\n .wuji-card .icon-img.stop::after {\\n position: absolute;\\n content: \\\"\\\";\\n width: 0.75rem;\\n height: 0.75rem;\\n background-color: #ff1616;\\n border-radius: 50%;\\n right: -0.375rem;\\n top: -0.375rem; }\\n .wuji-card .icon-img img {\\n border-radius: 8px;\\n margin: 0 auto; }\\n .wuji-card .b-image-wrapper {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center; }\\n .wuji-card .b-image-wrapper.stop::after {\\n position: absolute;\\n content: \\\"\\\";\\n width: 0.75rem;\\n height: 0.75rem;\\n background-color: #ff1616;\\n border-radius: 50%;\\n right: -0.375rem;\\n top: -0.375rem; }\\n .wuji-card .b-image-wrapper img {\\n border-radius: 8px;\\n margin: 0 auto; }\\n .wuji-card .action-btn {\\n position: absolute;\\n right: 0.5rem;\\n top: 1rem;\\n visibility: hidden;\\n opacity: 0;\\n transition: all 0.2s; }\\n .wuji-card p {\\n font-weight: 500; }\\n .wuji-card .one-line {\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 1;\\n overflow: hidden; }\\n .wuji-card .two-line {\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 2;\\n overflow: hidden; }\\n .wuji-card:hover .action-btn {\\n visibility: visible;\\n opacity: 1; }\\n .wuji-card a {\\n color: white; }\\n .wuji-card a p {\\n color: white; }\\n\\n.flex1 {\\n flex: 1; }\\n\\n.title-bar {\\n margin-bottom: 1.5rem; }\\n .title-bar .title {\\n flex: 1;\\n margin-bottom: 0; }\\n\\n.ii .dropdown-menu {\\n background: rgba(255, 255, 255, 0.88);\\n -webkit-backdrop-filter: blur(1rem);\\n backdrop-filter: blur(1rem);\\n border-radius: 0.5rem;\\n overflow: hidden;\\n padding-top: 0; }\\n .ii .dropdown-menu .dropdown-content {\\n background: none;\\n padding: 0; }\\n .ii .dropdown-menu .dropdown-content .button {\\n border-radius: 0;\\n padding-left: 1.5rem;\\n padding-right: 1.5rem; }\\n .ii .dropdown-menu .dropdown-content .button.is-text {\\n text-decoration: none;\\n justify-content: flex-start;\\n outline: none;\\n transition: all 0.2s;\\n border: none !important; }\\n .ii .dropdown-menu .dropdown-content .button.is-text.running {\\n color: #779e2a !important; }\\n .ii .dropdown-menu .dropdown-content .button.is-text.exited {\\n color: #ff1616 !important; }\\n .ii .dropdown-menu .dropdown-content .button:active {\\n background: none;\\n outline: none; }\\n .ii .dropdown-menu .dropdown-content .button:focus {\\n background: none;\\n box-shadow: none;\\n outline: none; }\\n .ii .dropdown-menu .dropdown-content .bbor {\\n overflow: hidden;\\n border-top: #2c3e50 1px solid; }\\n .ii .dropdown-menu .dropdown-content .bbor .is-text {\\n text-decoration: none;\\n justify-content: center !important; }\\n .ii .dropdown-menu .dropdown-content .bbor .column:first-child {\\n border-right: #2c3e50 1px solid; }\\n\\n.modal-background {\\n background: rgba(0, 0, 0, 0.8); }\\n\\n.modal-card {\\n background: rgba(255, 255, 255, 0.88);\\n -webkit-backdrop-filter: blur(1rem);\\n backdrop-filter: blur(1rem);\\n border-radius: 0.5rem; }\\n .modal-card .modal-card-head,\\n .modal-card .modal-card-body,\\n .modal-card .modal-card-foot {\\n background-color: transparent;\\n border: none; }\\n .modal-card .modal-card-head {\\n padding: 3rem; }\\n .modal-card .modal-card-body {\\n padding: 0 3rem; }\\n .modal-card .modal-card-body .button.is-static,\\n .modal-card .modal-card-body .input,\\n .modal-card .modal-card-body .textarea,\\n .modal-card .modal-card-body .taginput .taginput-container.is-focusable,\\n .modal-card .modal-card-body .select select,\\n .modal-card .modal-card-body .file-cta,\\n .modal-card .modal-card-body .file-name,\\n .modal-card .modal-card-body .pagination-previous,\\n .modal-card .modal-card-body .pagination-next,\\n .modal-card .modal-card-body .pagination-link,\\n .modal-card .modal-card-body .pagination-ellipsis {\\n font-size: 0.875rem;\\n height: 2.714em;\\n border: 1px solid #cfcfcf !important;\\n border-radius: 4px; }\\n .modal-card .modal-card-body .button.is-static:focus,\\n .modal-card .modal-card-body .input:focus,\\n .modal-card .modal-card-body .textarea:focus,\\n .modal-card .modal-card-body .taginput .taginput-container.is-focusable:focus,\\n .modal-card .modal-card-body .select select:focus,\\n .modal-card .modal-card-body .file-cta:focus,\\n .modal-card .modal-card-body .file-name:focus,\\n .modal-card .modal-card-body .pagination-previous:focus,\\n .modal-card .modal-card-body .pagination-next:focus,\\n .modal-card .modal-card-body .pagination-link:focus,\\n .modal-card .modal-card-body .pagination-ellipsis:focus {\\n box-shadow: none; }\\n .modal-card .modal-card-body .media {\\n padding: 0rem; }\\n .modal-card .modal-card-body .field:last-child {\\n margin-bottom: 0.5rem; }\\n .modal-card .modal-card-body .field-body .field:last-child {\\n margin-bottom: 0rem; }\\n .modal-card .modal-card-body .port-item:not(:last-child) .field {\\n margin-bottom: 0; }\\n .modal-card .modal-card-foot {\\n padding: 1rem 3rem 2rem 3rem; }\\n .modal-card .modal-card-foot .button {\\n border-radius: 9999px;\\n padding-left: calc(1em + 0.25em);\\n padding-right: calc(1em + 0.25em); }\\n\\n.import-area .textarea {\\n max-height: 40em;\\n min-height: 16em; }\\n\\n.app-card .loading-background {\\n background: none !important;\\n border-radius: 0.5rem; }\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/assets/scss/app.scss?./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-3-1!./node_modules/postcss-loader/src??ref--8-oneOf-3-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-3-3"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/assets/widgets/Clock.vue?vue&type=style&index=0&lang=scss&": +/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/assets/widgets/Clock.vue?vue&type=style&index=0&lang=scss& ***! + \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".clock {\\n font-family: Roboto;\\n font-style: normal;\\n font-weight: 300;\\n text-align: left;\\n}\\n.clock .time {\\n font-size: 2.75rem;\\n line-height: 4.25rem;\\n opacity: 0.9;\\n}\\n.clock .data {\\n line-height: 1.5rem;\\n opacity: 0.9;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/assets/widgets/Clock.vue?./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/SearchBar.vue?vue&type=style&index=0&lang=scss&": +/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/SearchBar.vue?vue&type=style&index=0&lang=scss& ***! + \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".search-bar input {\\n transition: all 0.2s;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: rgba(123, 123, 123, 0.16);\\n -webkit-backdrop-filter: blur(0.875rem);\\n backdrop-filter: blur(0.875rem);\\n border-radius: 8px;\\n border: none;\\n outline: none;\\n font-size: 1.5rem;\\n color: white;\\n}\\n.search-bar input:focus {\\n border: none;\\n box-shadow: none;\\n}\\n.search-bar input::-moz-placeholder {\\n color: white;\\n}\\n.search-bar input:-ms-input-placeholder {\\n color: white;\\n}\\n.search-bar input::placeholder {\\n color: white;\\n}\\n.search-bar .ovh {\\n overflow: hidden;\\n}\\n.search-bar .ovh .icon.is-left {\\n transition: all 0.2s;\\n left: 0;\\n}\\n.search-bar .ovh .icon.is-right {\\n transition: all 0.2s;\\n right: -3rem !important;\\n color: white !important;\\n}\\n.search-bar .ovh input {\\n padding-left: 2.5em !important;\\n padding-right: 1em !important;\\n}\\n.search-bar .fo .icon.is-left {\\n left: -3rem !important;\\n}\\n.search-bar .fo .icon.is-right {\\n transition: all 0.2s;\\n right: 0 !important;\\n}\\n.search-bar .fo input {\\n padding-right: 2.5em !important;\\n padding-left: 1em !important;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/SearchBar.vue?./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/forms/Ports.vue?vue&type=style&index=0&lang=scss&": +/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/forms/Ports.vue?vue&type=style&index=0&lang=scss& ***! + \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".info {\\n font-size: 0.875rem;\\n color: #5a5a5a;\\n}\\n.port-item {\\n position: relative;\\n}\\n.port-item .icon {\\n position: absolute;\\n right: -1.5rem;\\n bottom: 0.825rem;\\n}\\n.port-item:not(:last-child) {\\n margin-bottom: 0.5rem;\\n}\\n.port-item .field.is-expanded .label {\\n text-align: center;\\n font-weight: normal;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/forms/Ports.vue?./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/dist/cjs.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/assets/widgets/Clock.vue?vue&type=style&index=0&lang=scss&": +/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-style-loader??ref--8-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/assets/widgets/Clock.vue?vue&type=style&index=0&lang=scss& ***! + \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// style-loader: Adds some css to the DOM by adding a