diff --git a/.dockerignore b/.dockerignore
index c200f675..de2a4c61 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -9,8 +9,10 @@
/AdGuardHome.log
/data
/build
+/build2
/dist
/client/node_modules
+/client2/node_modules
/.gitattributes
/.gitignore
/.goreleaser.yml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b2851e53..bf4e0683 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -2,7 +2,7 @@
'env':
'GO_VERSION': '1.14'
- 'NODE_VERSION': '13'
+ 'NODE_VERSION': '14'
'on':
'push':
diff --git a/.gitignore b/.gitignore
index beba3ce1..6cbf3ecc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,9 +7,11 @@
# Only build, run, and test outputs here. Sorted.
*-packr.go
*.db
+*.log
*.snap
/bin/
/build/
+/build2/
/data/
/dist/
/dnsfilter/tests/dnsfilter.TestLotsOfRules*.pprof
@@ -19,4 +21,5 @@
/snapcraft_login
AdGuardHome*
coverage.txt
+leases.db
node_modules/
diff --git a/Dockerfile b/Dockerfile
index b0c54832..a218f2d4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,6 +18,7 @@ RUN apk --update --no-cache add \
gcc \
git \
npm \
+ yarn \
&& rm -rf /tmp/* /var/cache/apk/*
WORKDIR /app
@@ -26,6 +27,7 @@ COPY . ./
# Prepare the client code
RUN npm --prefix client ci && npm --prefix client run build-prod
+RUN yarn --cwd client2 build
# Download go dependencies
RUN go mod download
diff --git a/Makefile b/Makefile
index 27247fe6..68c7f9dc 100644
--- a/Makefile
+++ b/Makefile
@@ -137,13 +137,16 @@ build:
client:
npm --prefix client run build-prod
+ yarn --cwd client2 build
client_with_deps:
npm --prefix client ci
npm --prefix client run build-prod
+ yarn --cwd client2 build
client-watch:
npm --prefix client run watch
+ yarn --cwd client2 start
docker:
DOCKER_CLI_EXPERIMENTAL=enabled \
@@ -163,6 +166,7 @@ lint: js-lint go-lint
js-lint: dependencies
npm --prefix client run lint
+ yarn --cwd client2 lint
go-install-tools:
env GO=$(GO) sh ./scripts/go-install-tools.sh
@@ -184,6 +188,7 @@ ci: client_with_deps
dependencies:
npm --prefix client ci
+ yarn --cwd client2 install
$(GO) mod download
clean:
diff --git a/client2/.eslintignore b/client2/.eslintignore
new file mode 100644
index 00000000..d30c2950
--- /dev/null
+++ b/client2/.eslintignore
@@ -0,0 +1,6 @@
+scripts
+node_modules
+postcss.config.js
+src/lib/entities
+src/lib/apis
+openApi
\ No newline at end of file
diff --git a/client2/.eslintrc b/client2/.eslintrc
new file mode 100644
index 00000000..86f6ae47
--- /dev/null
+++ b/client2/.eslintrc
@@ -0,0 +1,5 @@
+{
+ "extends": [
+ "./scripts/lint/dev.js"
+ ]
+}
\ No newline at end of file
diff --git a/client2/declaration.d.ts b/client2/declaration.d.ts
new file mode 100644
index 00000000..87c53150
--- /dev/null
+++ b/client2/declaration.d.ts
@@ -0,0 +1,18 @@
+declare module '*.pcss' {
+ const content: {[className: string]: string};
+ export default content;
+}
+declare module '*.css' {
+ const content: {[className: string]: string};
+ export default content;
+}
+declare module '*.png'
+declare module '*.jpg'
+declare let AUTH_TOKEN: string;
+declare let MAIN_TOKEN: string | undefined;
+declare let NO_CAPTCHA: boolean | undefined;
+declare module 'dygraphs';
+declare module '@novnc/novnc/core/rfb';
+// cp - CloudPayments script
+declare let cp: any;
+declare const DEV: any;
diff --git a/client2/package.json b/client2/package.json
new file mode 100644
index 00000000..d48f1ca6
--- /dev/null
+++ b/client2/package.json
@@ -0,0 +1,92 @@
+{
+ "author": "Performix",
+ "private": true,
+ "name": "adguard-home",
+ "version": "0.1.0",
+ "scripts": {
+ "build": "rm -rf ../build2 && yarn install && webpack --config ./scripts/webpack/webpack.config.prod.js",
+ "start": "webpack serve --config ./scripts/webpack/webpack.config.dev.js",
+ "generate": "rm -rf ./src/lib/entities ./src/lib/apis && ts-node --compiler-options '{ \"module\": \"CommonJS\" }' ./scripts/generator/index.ts",
+ "translations:check": "ts-node --compiler-options '{ \"module\": \"CommonJS\" }' ./scripts/plugins/checkTranslations.ts",
+ "lint": "eslint -c ./scripts/lint/prod.js --ext .tsx --ext .ts ./",
+ "go:build": "cd .. && make REBUILD_CLIENT=0 build",
+ "go:run": "sudo ../AdguardHome"
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "yarn lint"
+ }
+ },
+ "license": "ISC",
+ "dependencies": {
+ "@sentry/react": "^5.27.0",
+ "antd": "^4.7.2",
+ "classnames": "^2.2.6",
+ "dayjs": "^1.9.3",
+ "formik": "^2.2.0",
+ "mobx": "^6.0.1",
+ "mobx-react-lite": "^3.0.1",
+ "qs": "^6.9.4",
+ "react": "^17.0.0",
+ "react-dom": "^17.0.0",
+ "react-router-dom": "^5.2.0"
+ },
+ "devDependencies": {
+ "@types/classnames": "^2.2.10",
+ "@types/qs": "^6.9.5",
+ "@types/react": "^16.9.53",
+ "@types/react-dom": "^16.9.8",
+ "@types/react-redux": "^7.1.9",
+ "@types/react-router-dom": "^5.1.6",
+ "@typescript-eslint/eslint-plugin": "^4.5.0",
+ "@typescript-eslint/parser": "^4.5.0",
+ "antd-dayjs-webpack-plugin": "^1.0.1",
+ "autoprefixer": "^10.0.1",
+ "connect-history-api-fallback": "^1.6.0",
+ "copy-webpack-plugin": "^6.2.1",
+ "css-loader": "^5.0.0",
+ "eslint": "^7.11.0",
+ "eslint-config-airbnb-base": "^14.2.0",
+ "eslint-config-airbnb-typescript": "^12.0.0",
+ "eslint-import-resolver-typescript": "^2.3.0",
+ "eslint-loader": "^4.0.2",
+ "eslint-plugin-import": "^2.22.1",
+ "eslint-plugin-react": "^7.21.5",
+ "eslint-plugin-react-hooks": "^4.2.0",
+ "file-loader": "^6.1.1",
+ "html-webpack-plugin": "^4.5.0",
+ "http-proxy-middleware": "^1.0.6",
+ "husky": "^4.3.0",
+ "less": "^3.12.2",
+ "less-loader": "^5.0.0",
+ "mini-css-extract-plugin": "^1.1.1",
+ "optimize-css-assets-webpack-plugin": "^5.0.4",
+ "postcss": "^8.1.2",
+ "postcss-calc": "^7.0.5",
+ "postcss-css-variables": "^0.17.0",
+ "postcss-custom-media": "^7.0.8",
+ "postcss-import": "^13.0.0",
+ "postcss-inline-svg": "^4.1.0",
+ "postcss-loader": "^4.0.4",
+ "postcss-mixins": "^7.0.1",
+ "postcss-modules": "^3.2.2",
+ "postcss-nested": "^5.0.1",
+ "postcss-preset-env": "^6.7.0",
+ "postcss-reporter": "^7.0.1",
+ "postcss-variables": "^1.1.1",
+ "style-loader": "^2.0.0",
+ "stylelint": "^13.7.2",
+ "stylelint-webpack-plugin": "^2.1.1",
+ "terser-webpack-plugin": "^5.0.0",
+ "ts-loader": "^8.0.6",
+ "ts-morph": "^8.1.2",
+ "ts-node": "^9.0.0",
+ "typescript": "^4.0.3",
+ "url-loader": "^4.1.1",
+ "webpack": "^5.10.0",
+ "webpack-cli": "^4.2.0",
+ "webpack-dev-server": "^3.11.0",
+ "webpack-merge": "^5.2.0",
+ "yaml": "^1.10.0"
+ }
+}
diff --git a/client2/postcss.config.js b/client2/postcss.config.js
new file mode 100644
index 00000000..ee95a234
--- /dev/null
+++ b/client2/postcss.config.js
@@ -0,0 +1,17 @@
+module.exports = {
+ plugins: [
+ ['postcss-import', {}],
+ ['postcss-nested', {}],
+ ['postcss-custom-media', {}],
+ ['postcss-variables', {}],
+ ['postcss-calc', {}],
+ ['postcss-mixins', {}],
+ ['postcss-preset-env', { stage: 3, features: { 'nesting-rules': true } }],
+ ['postcss-reporter', { clearMessages: true }],
+ ['postcss-inline-svg', {
+ paths: ['frontend/icons', 'vendor/adguard/utils-bundle/src/Resources/frontend/icons'],
+ svgo: { plugins: [{ cleanupAttrs: true }] }
+ }],
+ ['autoprefixer'],
+ ]
+};
diff --git a/client2/public/assets/apple-touch-icon-180x180.png b/client2/public/assets/apple-touch-icon-180x180.png
new file mode 100644
index 00000000..ebc0be50
Binary files /dev/null and b/client2/public/assets/apple-touch-icon-180x180.png differ
diff --git a/client2/public/assets/favicon.png b/client2/public/assets/favicon.png
new file mode 100644
index 00000000..992631c1
Binary files /dev/null and b/client2/public/assets/favicon.png differ
diff --git a/client2/public/assets/safari-pinned-tab.svg b/client2/public/assets/safari-pinned-tab.svg
new file mode 100644
index 00000000..132b35d0
--- /dev/null
+++ b/client2/public/assets/safari-pinned-tab.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/client2/public/index.html b/client2/public/index.html
new file mode 100644
index 00000000..2e2d1e33
--- /dev/null
+++ b/client2/public/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AdGuard Home
+
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/client2/public/install.html b/client2/public/install.html
new file mode 100644
index 00000000..e0b70d14
--- /dev/null
+++ b/client2/public/install.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Setup AdGuard Home
+
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/client2/public/login.html b/client2/public/login.html
new file mode 100644
index 00000000..38145e15
--- /dev/null
+++ b/client2/public/login.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Login
+
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/client2/scripts/consts.ts b/client2/scripts/consts.ts
new file mode 100644
index 00000000..bbec9361
--- /dev/null
+++ b/client2/scripts/consts.ts
@@ -0,0 +1,12 @@
+export const OPEN_API_PATH = '../openapi/openapi.yaml';
+export const ENT_DIR = './src/lib/entities';
+export const API_DIR = './src/lib/apis';
+export const LOCALE_FOLDER_PATH = './src/lib/intl/__locales';
+export const TRANSLATOR_CLASS_NAME = 'Translator';
+export const USE_INTL_NAME = 'useIntl';
+
+export const trimQuotes = (str: string) => {
+ return str.replace(/\'|\"/g, '');
+};
+
+export const GENERATOR_ENTITY_ALLIAS = 'Entities/';
\ No newline at end of file
diff --git a/client2/scripts/generator/index.ts b/client2/scripts/generator/index.ts
new file mode 100644
index 00000000..19ac2256
--- /dev/null
+++ b/client2/scripts/generator/index.ts
@@ -0,0 +1,18 @@
+import * as fs from 'fs';
+import * as YAML from 'yaml';
+import { OPEN_API_PATH } from '../consts';
+
+import EntitiesGenerator from './src/generateEntities';
+import ApisGenerator from './src/generateApis';
+
+
+const generateApi = (openApi: Record) => {
+ const ent = new EntitiesGenerator(openApi);
+ ent.save();
+
+ const api = new ApisGenerator(openApi);
+ api.save();
+}
+
+const openApiFile = fs.readFileSync(OPEN_API_PATH, 'utf8');
+generateApi(YAML.parse(openApiFile));
diff --git a/client2/scripts/generator/src/generateApis.ts b/client2/scripts/generator/src/generateApis.ts
new file mode 100644
index 00000000..4201da2b
--- /dev/null
+++ b/client2/scripts/generator/src/generateApis.ts
@@ -0,0 +1,317 @@
+/* eslint-disable no-template-curly-in-string */
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+import * as fs from 'fs';
+import * as path from 'path';
+import { stringify } from 'qs';
+// eslint-disable-next-line import/no-extraneous-dependencies
+import * as morph from 'ts-morph';
+
+import {
+ API_DIR as API_DIR_CONST,
+ GENERATOR_ENTITY_ALLIAS,
+} from '../../consts';
+import { toCamel, capitalize, schemaParamParser } from './utils';
+
+
+const API_DIR = path.resolve(API_DIR_CONST);
+if (!fs.existsSync(API_DIR)) {
+ fs.mkdirSync(API_DIR);
+}
+
+const { Project, QuoteKind } = morph;
+
+
+class ApiGenerator {
+ project = new Project({
+ tsConfigFilePath: './tsconfig.json',
+ addFilesFromTsConfig: false,
+ manipulationSettings: {
+ quoteKind: QuoteKind.Single,
+ usePrefixAndSuffixTextForRename: false,
+ useTrailingCommas: true,
+ },
+ });
+
+ openapi: Record;
+
+ serverUrl: string;
+
+ paths: any;
+
+ /* interface Controllers {
+ [controller: string]: {
+ [operationId: string]: { parameters - from opneApi, responses - from opneApi, method }
+ }
+ } */
+ controllers: Record = {};
+
+ apis: morph.SourceFile[] = [];
+
+ constructor(openapi: Record) {
+ this.openapi = openapi;
+ this.paths = openapi.paths;
+ this.serverUrl = openapi.servers[0].url;
+
+ Object.keys(this.paths).forEach((pathKey) => {
+ Object.keys(this.paths[pathKey]).forEach((method) => {
+ const {
+ tags, operationId, parameters, responses, requestBody, security,
+ } = this.paths[pathKey][method];
+ const controller = toCamel((tags ? tags[0] : pathKey.split('/')[1]).replace('-controller', ''));
+
+ if (this.controllers[controller]) {
+ this.controllers[controller][operationId] = {
+ parameters,
+ responses,
+ method,
+ requestBody,
+ security,
+ pathKey: pathKey.replace(/{/g, '${'),
+ };
+ } else {
+ this.controllers[controller] = { [operationId]: {
+ parameters,
+ responses,
+ method,
+ requestBody,
+ security,
+ pathKey: pathKey.replace(/{/g, '${'),
+ } };
+ }
+ });
+ });
+
+ this.generateApiFiles();
+ }
+
+ generateApiFiles = () => {
+ Object.keys(this.controllers).forEach(this.generateApiFile);
+ };
+
+ generateApiFile = (cName: string) => {
+ const apiFile = this.project.createSourceFile(`${API_DIR}/${cName}.ts`);
+ apiFile.addStatements([
+ '// This file was autogenerated. Please do not change.',
+ '// All changes will be overwrited on commit.',
+ '',
+ ]);
+
+ // const schemaProperties = schemas[schemaName].properties;
+ const importEntities: any[] = [];
+
+ // add api class to file
+ const apiClass = apiFile.addClass({
+ name: `${capitalize(cName)}Api`,
+ isDefaultExport: true,
+ });
+
+ // get operations of controller
+ const controllerOperations = this.controllers[cName];
+ const operationList = Object.keys(controllerOperations).sort();
+ // for each operation add fetcher
+ operationList.forEach((operation) => {
+ const {
+ requestBody, responses, parameters, method, pathKey, security,
+ } = controllerOperations[operation];
+
+ const queryParams: any[] = []; // { name, type }
+ const bodyParam: any[] = []; // { name, type }
+
+ let hasResponseBodyType: /* boolean | ReturnType */ false | [string, boolean, boolean, boolean, boolean] = false;
+ let contentType = '';
+ if (parameters) {
+ parameters.forEach((p: any) => {
+ const [
+ pType, isArray, isClass, isImport,
+ ] = schemaParamParser(p.schema, this.openapi);
+
+ if (isImport) {
+ importEntities.push({ type: pType, isClass });
+ }
+ if (p.in === 'query') {
+ queryParams.push({
+ name: p.name, type: `${pType}${isArray ? '[]' : ''}`, hasQuestionToken: !p.required });
+ }
+ });
+ }
+ if (queryParams.length > 0) {
+ const imp = apiFile.getImportDeclaration((i) => {
+ return i.getModuleSpecifierValue() === 'qs';
+ }); if (!imp) {
+ apiFile.addImportDeclaration({
+ moduleSpecifier: 'qs',
+ defaultImport: 'qs',
+ });
+ }
+ }
+ if (requestBody) {
+ let content = requestBody.content;
+ const { $ref }: { $ref: string } = requestBody;
+
+ if (!content && $ref) {
+ const name = $ref.split('/').pop() as string;
+ content = this.openapi.components.requestBodies[name].content;
+ }
+
+ [contentType] = Object.keys(content);
+ const data = content[contentType];
+
+ const [
+ pType, isArray, isClass, isImport,
+ ] = schemaParamParser(data.schema, this.openapi);
+
+ if (isImport) {
+ importEntities.push({ type: pType, isClass });
+ bodyParam.push({ name: pType.toLowerCase(), type: `${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`, isClass, pType });
+ } else {
+ bodyParam.push({ name: 'data', type: `${pType}${isArray ? '[]' : ''}` });
+
+ }
+ }
+ if (responses['200']) {
+ const { content, headers } = responses['200'];
+ if (content && (content['*/*'] || content['application/json'])) {
+ const { schema, examples } = content['*/*'] || content['application/json'];
+
+ if (!schema) {
+ process.exit(0);
+ }
+
+ const propType = schemaParamParser(schema, this.openapi);
+ const [pType, , isClass, isImport] = propType;
+
+ if (isImport) {
+ importEntities.push({ type: pType, isClass });
+ }
+ hasResponseBodyType = propType;
+ }
+ }
+ let returnType = '';
+ if (hasResponseBodyType) {
+ const [pType, isArray, isClass] = hasResponseBodyType as any;
+ let data = `Promise<${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`;
+ returnType = data;
+ } else {
+ returnType = 'Promise b.isClass);
+ if (shouldValidate.length > 0) {
+ returnType += ' | string[]';
+ }
+ // append Error to default type return;
+ returnType += ' | Error>';
+
+ const fetcher = apiClass.addMethod({
+ isAsync: true,
+ isStatic: true,
+ name: operation,
+ returnType,
+ });
+ const params = [...queryParams, ...bodyParam].sort((a, b) => (Number(!!a.hasQuestionToken) - Number(!!b.hasQuestionToken)));
+ fetcher.addParameters(params);
+
+ fetcher.setBodyText((w) => {
+ // Add data to URLSearchParams
+ if (contentType === 'text/plain') {
+ bodyParam.forEach((b) => {
+ w.writeLine(`const params = String(${b.name});`);
+ });
+ } else {
+ if (shouldValidate.length > 0) {
+ w.writeLine(`const haveError: string[] = [];`);
+ shouldValidate.forEach((b) => {
+ w.writeLine(`const ${b.name}Valid = new ${b.pType}(${b.name});`);
+ w.writeLine(`haveError.push(...${b.name}Valid.validate());`);
+ });
+ w.writeLine(`if (haveError.length > 0) {`);
+ w.writeLine(` return Promise.resolve(haveError);`)
+ w.writeLine(`}`);
+ }
+ }
+ // Switch return of fetch in case on queryParams
+ if (queryParams.length > 0) {
+ w.writeLine('const queryParams = {');
+ queryParams.forEach((q) => {
+ w.writeLine(` ${q.name}: ${q.name},`);
+ });
+ w.writeLine('}');
+ w.writeLine(`return await fetch(\`${this.serverUrl}${pathKey}?\${qs.stringify(queryParams, { arrayFormat: 'comma' })}\`, {`);
+ } else {
+ w.writeLine(`return await fetch(\`${this.serverUrl}${pathKey}\`, {`);
+ }
+ // Add method
+ w.writeLine(` method: '${method.toUpperCase()}',`);
+
+ // add Fetch options
+ if (contentType && contentType !== 'multipart/form-data') {
+ w.writeLine(' headers: {');
+ w.writeLine(` 'Content-Type': '${contentType}',`);
+ w.writeLine(' },');
+ }
+ if (contentType) {
+ switch (contentType) {
+ case 'text/plain':
+ w.writeLine(' body: params,');
+ break;
+ default:
+ w.writeLine(` body: JSON.stringify(${bodyParam.map((b) => b.isClass ? `${b.name}Valid.serialize()` : b.name).join(', ')}),`);
+ break;
+ }
+ }
+
+ // Handle response
+ if (hasResponseBodyType) {
+ w.writeLine('}).then(async (res) => {');
+ w.writeLine(' if (res.status === 200) {');
+ w.writeLine(' return res.json();');
+ } else {
+ w.writeLine('}).then(async (res) => {');
+ w.writeLine(' if (res.status === 200) {');
+ w.writeLine(' return res.status;');
+ }
+
+ // Handle Error
+ w.writeLine(' } else {');
+ w.writeLine(' return new Error(String(res.status));');
+ w.writeLine(' }');
+ w.writeLine('})');
+ });
+ });
+
+ const imports: any[] = [];
+ const types: string[] = [];
+ importEntities.forEach((i) => {
+ const { type } = i;
+ if (!types.includes(type)) {
+ imports.push(i);
+ types.push(type);
+ }
+ });
+ imports.sort((a,b) => a.type > b.type ? 1 : -1).forEach((ie) => {
+ const { type: pType, isClass } = ie;
+ if (isClass) {
+ apiFile.addImportDeclaration({
+ moduleSpecifier: `${GENERATOR_ENTITY_ALLIAS}${pType}`,
+ defaultImport: pType,
+ namedImports: [`I${pType}`],
+ });
+ } else {
+ apiFile.addImportDeclaration({
+ moduleSpecifier: `${GENERATOR_ENTITY_ALLIAS}${pType}`,
+ namedImports: [pType],
+ });
+ }
+ });
+
+ this.apis.push(apiFile);
+ };
+
+ save = () => {
+ this.apis.forEach(async (e) => {
+ await e.saveSync();
+ });
+ };
+}
+
+
+export default ApiGenerator;
diff --git a/client2/scripts/generator/src/generateEntities.ts b/client2/scripts/generator/src/generateEntities.ts
new file mode 100644
index 00000000..b12e02a7
--- /dev/null
+++ b/client2/scripts/generator/src/generateEntities.ts
@@ -0,0 +1,519 @@
+import * as fs from 'fs';
+import * as path from 'path';
+// eslint-disable-next-line import/no-extraneous-dependencies
+import * as morph from 'ts-morph';
+
+import { ENT_DIR } from '../../consts';
+import { TYPES, toCamel, schemaParamParser } from './utils';
+
+const { Project, QuoteKind } = morph;
+
+
+const EntDir = path.resolve(ENT_DIR);
+if (!fs.existsSync(EntDir)) {
+ fs.mkdirSync(EntDir);
+}
+
+class EntitiesGenerator {
+ project = new Project({
+ tsConfigFilePath: './tsconfig.json',
+ addFilesFromTsConfig: false,
+ manipulationSettings: {
+ quoteKind: QuoteKind.Single,
+ usePrefixAndSuffixTextForRename: false,
+ useTrailingCommas: true,
+ },
+ });
+
+ openapi: Record;
+
+ schemas: Record;
+
+ schemaNames: string[];
+
+ entities: morph.SourceFile[] = [];
+
+ constructor(openapi: Record) {
+ this.openapi = openapi;
+ this.schemas = openapi.components.schemas;
+ this.schemaNames = Object.keys(this.schemas);
+ this.generateEntities();
+ }
+
+ generateEntities = () => {
+ this.schemaNames.forEach(this.generateEntity);
+ };
+
+ generateEntity = (sName: string) => {
+ const { properties, type, oneOf } = this.schemas[sName];
+ const notAClass = !properties && TYPES[type as keyof typeof TYPES];
+
+ if (oneOf) {
+ this.generateOneOf(sName);
+ return;
+ }
+
+ if (notAClass) {
+ this.generateEnum(sName);
+ } else {
+ this.generateClass(sName);
+ }
+ };
+
+ generateEnum = (sName: string) => {
+ const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
+ entityFile.addStatements([
+ '// This file was autogenerated. Please do not change.',
+ '// All changes will be overwrited on commit.',
+ '',
+ ]);
+
+ const { enum: enumMembers } = this.schemas[sName];
+ entityFile.addEnum({
+ name: sName,
+ members: enumMembers.map((e: string) => ({ name: e.toUpperCase(), value: e })),
+ isExported: true,
+ });
+
+ this.entities.push(entityFile);
+ };
+
+ generateOneOf = (sName: string) => {
+ const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
+ entityFile.addStatements([
+ '// This file was autogenerated. Please do not change.',
+ '// All changes will be overwrited on commit.',
+ '',
+ ]);
+ const importEntities: { type: string, isClass: boolean }[] = [];
+ const entities = this.schemas[sName].oneOf.map((elem: any) => {
+ const [
+ pType, isArray, isClass, isImport,
+ ] = schemaParamParser(elem, this.openapi);
+ importEntities.push({ type: pType, isClass });
+ return { type: pType, isArray };
+ });
+ entityFile.addTypeAlias({
+ name: sName,
+ isExported: true,
+ type: entities.map((e: any) => e.isArray ? `I${e.type}[]` : `I${e.type}`).join(' | '),
+ })
+
+ // add import
+ importEntities.sort((a, b) => a.type > b.type ? 1 : -1).forEach((ie) => {
+ const { type: pType, isClass } = ie;
+ if (isClass) {
+ entityFile.addImportDeclaration({
+ moduleSpecifier: `./${pType}`,
+ namedImports: [`I${pType}`],
+ });
+ } else {
+ entityFile.addImportDeclaration({
+ moduleSpecifier: `./${pType}`,
+ namedImports: [pType],
+ });
+ }
+ });
+ this.entities.push(entityFile);
+ }
+
+ generateClass = (sName: string) => {
+ const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
+ entityFile.addStatements([
+ '// This file was autogenerated. Please do not change.',
+ '// All changes will be overwrited on commit.',
+ '',
+ ]);
+
+ const { properties: sProps, required } = this.schemas[sName];
+
+ const importEntities: { type: string, isClass: boolean }[] = [];
+ const entityInterface = entityFile.addInterface({
+ name: `I${sName}`,
+ isExported: true,
+ });
+ const sortedSProps = Object.keys(sProps || {}).sort();
+ // add server response interface to entityFile
+ sortedSProps.forEach((sPropName) => {
+ const [
+ pType, isArray, isClass, isImport, isAdditional
+ ] = schemaParamParser(sProps[sPropName], this.openapi);
+
+ if (isImport) {
+ importEntities.push({ type: pType, isClass });
+ }
+ const propertyType = isAdditional
+ ? `{ [key: string]: ${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''} }`
+ : `${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`;
+ entityInterface.addProperty({
+ name: sPropName,
+ type: propertyType,
+ hasQuestionToken: !(
+ (required && required.includes(sPropName)) || sProps[sPropName].required
+ ),
+ });
+ });
+
+ // add import
+ const imports: { type: string, isClass: boolean }[] = [];
+ const types: string[] = [];
+ importEntities.forEach((i) => {
+ const { type } = i;
+ if (!types.includes(type)) {
+ imports.push(i);
+ types.push(type);
+ }
+ });
+ imports.sort((a, b) => a.type > b.type ? 1 : -1).forEach((ie) => {
+ const { type: pType, isClass } = ie;
+ if (isClass) {
+ entityFile.addImportDeclaration({
+ defaultImport: pType,
+ moduleSpecifier: `./${pType}`,
+ namedImports: [`I${pType}`],
+ });
+ } else {
+ entityFile.addImportDeclaration({
+ moduleSpecifier: `./${pType}`,
+ namedImports: [pType],
+ });
+ }
+ });
+
+ const entityClass = entityFile.addClass({
+ name: sName,
+ isDefaultExport: true,
+ });
+
+ // addProperties to class;
+ sortedSProps.forEach((sPropName) => {
+ const [pType, isArray, isClass, isImport, isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
+
+ const isRequred = (required && required.includes(sPropName))
+ || sProps[sPropName].required;
+
+ const propertyType = isAdditional
+ ? `{ [key: string]: ${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'} }`
+ : `${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'}`;
+
+ entityClass.addProperty({
+ name: `_${sPropName}`,
+ isReadonly: true,
+ type: propertyType,
+ });
+ const getter = entityClass.addGetAccessor({
+ name: toCamel(sPropName),
+ returnType: propertyType,
+ statements: [`return this._${sPropName};`],
+ });
+ const { description, example, minItems, maxItems, maxLength, minLength, maximum, minimum } = sProps[sPropName];
+ if (description || example) {
+ getter.addJsDoc(`${example ? `Description: ${description}` : ''}${example ? `\nExample: ${example}` : ''}`);
+ }
+ if (minItems) {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MinItems`,
+ statements: [`return ${minItems};`],
+ });
+ }
+ if (maxItems) {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MaxItems`,
+ statements: [`return ${maxItems};`],
+ });
+ }
+ if (typeof minLength === 'number') {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MinLength`,
+ statements: [`return ${minLength};`],
+ });
+ }
+ if (maxLength) {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MaxLength`,
+ statements: [`return ${maxLength};`],
+ });
+ }
+ if (typeof minimum === 'number') {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MinValue`,
+ statements: [`return ${minimum};`],
+ });
+ }
+ if (maximum) {
+ entityClass.addGetAccessor({
+ isStatic: true,
+ name: `${toCamel(sPropName)}MaxValue`,
+ statements: [`return ${maximum};`],
+ });
+ }
+
+ if (!(isArray && isClass) && !isClass) {
+ const isEnum = !isClass && isImport;
+ const isRequired = (required && required.includes(sPropName)) || sProps[sPropName].required;
+ const { maxLength, minLength, maximum, minimum } = sProps[sPropName];
+ const haveValidationFields = maxLength || typeof minLength === 'number' || maximum || typeof minimum === 'number';
+ if (isRequired || haveValidationFields) {
+ const prop = toCamel(sPropName);
+ const validateField = entityClass.addMethod({
+ isStatic: true,
+ name: `${prop}Validate`,
+ returnType: `boolean`,
+ parameters: [{
+ name: prop,
+ type: `${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'}`,
+ }],
+ })
+
+ validateField.setBodyText((w) => {
+ w.write('return ');
+ const nonRequiredCall = isRequired ? prop : `!${prop} ? true : ${prop}`;
+ if (pType === 'string') {
+ if (isArray) {
+ w.write(`${nonRequiredCall}.reduce((result, p) => result && (typeof p === 'string' && !!p.trim()), true)`);
+ } else {
+ if (typeof minLength === 'number' && maxLength) {
+ w.write(`(${nonRequiredCall}.length >${minLength > 0 ? '=' : ''} ${minLength}) && (${nonRequiredCall}.length <= ${maxLength})`);
+ }
+ if (typeof minLength !== 'number' || !maxLength) {
+ w.write(`${isRequired ? `typeof ${prop} === 'string'` : `!${prop} ? true : typeof ${prop} === 'string'`} && !!${nonRequiredCall}.trim()`);
+ }
+ }
+ } else if (pType === 'number') {
+ if (isArray) {
+ w.write(`${nonRequiredCall}.reduce((result, p) => result && typeof p === 'number', true)`);
+ } else {
+ if (typeof minimum === 'number' && maximum) {
+ w.write(`${isRequired ? `${prop} >= ${minimum} && ${prop} <= ${maximum}` : `!${prop} ? true : ((${prop} >= ${minimum}) && (${prop} <= ${maximum}))`}`);
+ }
+ if (typeof minimum !== 'number' || !maximum) {
+ w.write(`${isRequired ? `typeof ${prop} === 'number'` : `!${prop} ? true : typeof ${prop} === 'number'`}`);
+ }
+ }
+ } else if (pType === 'boolean') {
+ w.write(`${isRequired ? `typeof ${prop} === 'boolean'` : `!${prop} ? true : typeof ${prop} === 'boolean'`}`);
+ } else if (isEnum) {
+ if (isArray){
+ w.write(`${nonRequiredCall}.reduce((result, p) => result && Object.keys(${pType}).includes(${prop}), true)`);
+ } else {
+ w.write(`${isRequired ? `Object.keys(${pType}).includes(${prop})` : `!${prop} ? true : typeof ${prop} === 'boolean'`}`);
+ }
+ }
+
+ w.write(';');
+ });
+ }
+ }
+ });
+
+ // add constructor;
+ const ctor = entityClass.addConstructor({
+ parameters: [{
+ name: 'props',
+ type: `I${sName}`,
+ }],
+ });
+ ctor.setBodyText((w) => {
+ sortedSProps.forEach((sPropName) => {
+ const [
+ pType, isArray, isClass, , isAdditional
+ ] = schemaParamParser(sProps[sPropName], this.openapi);
+ const req = (required && required.includes(sPropName))
+ || sProps[sPropName].required;
+ if (!req) {
+ if ((pType === 'boolean' || pType === 'number' || pType ==='string') && !isClass && !isArray) {
+ w.writeLine(`if (typeof props.${sPropName} === '${pType}') {`);
+ } else {
+ w.writeLine(`if (props.${sPropName}) {`);
+ }
+ }
+ if (isAdditional) {
+ if (isArray && isClass) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => {
+ return { ...prev, [key]: new ${pType}(p[key])};
+ },{}))`);
+ } else if (isClass) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
+ return { ...prev, [key]: new ${pType}(props.${sPropName}[key])};
+ },{})`);
+ } else {
+ if (pType === 'string' && !isArray) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
+ return { ...prev, [key]: props.${sPropName}[key].trim()};
+ },{})`);
+ } else {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
+ return { ...prev, [key]: props.${sPropName}[key]};
+ },{})`);
+ }
+ }
+ } else {
+ if (isArray && isClass) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.map((p) => new ${pType}(p));`);
+ } else if (isClass) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = new ${pType}(props.${sPropName});`);
+ } else {
+ if (pType === 'string' && !isArray) {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.trim();`);
+ } else {
+ w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName};`);
+ }
+ }
+ }
+ if (!req) {
+ w.writeLine('}');
+ }
+ });
+ });
+
+ // add serialize method;
+ const serialize = entityClass.addMethod({
+ isStatic: false,
+ name: 'serialize',
+ returnType: `I${sName}`,
+ });
+ serialize.setBodyText((w) => {
+ w.writeLine(`const data: I${sName} = {`);
+ const unReqFields: string[] = [];
+ sortedSProps.forEach((sPropName) => {
+ const req = (required && required.includes(sPropName))
+ || sProps[sPropName].required;
+ const [, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
+ if (!req) {
+ unReqFields.push(sPropName);
+ return;
+ }
+ if (isAdditional) {
+ if (isArray && isClass) {
+ w.writeLine(` ${sPropName}: this._${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => ({ ...prev, [key]: p[key].serialize() }))),`);
+ } else if (isClass) {
+ w.writeLine(` ${sPropName}: Object.keys(this._${sPropName}).reduce>((prev, key) => ({ ...prev, [key]: this._${sPropName}[key].serialize() }), {}),`);
+ } else {
+ w.writeLine(` ${sPropName}: Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key] })),`);
+ }
+ } else {
+ if (isArray && isClass) {
+ w.writeLine(` ${sPropName}: this._${sPropName}.map((p) => p.serialize()),`);
+ } else if (isClass) {
+ w.writeLine(` ${sPropName}: this._${sPropName}.serialize(),`);
+ } else {
+ w.writeLine(` ${sPropName}: this._${sPropName},`);
+ }
+ }
+
+ });
+ w.writeLine('};');
+ unReqFields.forEach((sPropName) => {
+ const [, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
+ w.writeLine(`if (typeof this._${sPropName} !== 'undefined') {`);
+ if (isAdditional) {
+ if (isArray && isClass) {
+ w.writeLine(` data.${sPropName} = this._${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => ({ ...prev, [key]: p[key].serialize() }), {}));`);
+ } else if (isClass) {
+ w.writeLine(` data.${sPropName} = Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key].serialize() }), {});`);
+ } else {
+ w.writeLine(` data.${sPropName} = Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key] }), {});`);
+ }
+ } else {
+ if (isArray && isClass) {
+ w.writeLine(` data.${sPropName} = this._${sPropName}.map((p) => p.serialize());`);
+ } else if (isClass) {
+ w.writeLine(` data.${sPropName} = this._${sPropName}.serialize();`);
+ } else {
+ w.writeLine(` data.${sPropName} = this._${sPropName};`);
+
+ }
+ }
+
+ w.writeLine(`}`);
+ });
+ w.writeLine('return data;');
+ });
+
+ // add validate method
+ const validate = entityClass.addMethod({
+ isStatic: false,
+ name: 'validate',
+ returnType: `string[]`,
+ })
+ validate.setBodyText((w) => {
+ w.writeLine('const validate = {');
+ Object.keys(sProps || {}).forEach((sPropName) => {
+ const [pType, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
+
+ const { maxLength, minLength, maximum, minimum } = sProps[sPropName];
+
+ const isRequired = (required && required.includes(sPropName)) || sProps[sPropName].required;
+ const nonRequiredCall = isRequired ? `this._${sPropName}` : `!this._${sPropName} ? true : this._${sPropName}`;
+
+ if (isArray && isClass) {
+ w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && p.validate().length === 0, true),`);
+ } else if (isClass && !isAdditional) {
+ w.writeLine(` ${sPropName}: ${nonRequiredCall}.validate().length === 0,`);
+ } else {
+ if (pType === 'string') {
+ if (isArray) {
+ w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && typeof p === 'string', true),`);
+ } else {
+ if (typeof minLength === 'number' && maxLength) {
+ w.writeLine(` ${sPropName}: (${nonRequiredCall}.length >${minLength > 0 ? '=' : ''} ${minLength}) && (${nonRequiredCall}.length <= ${maxLength}),`);
+ }
+ if (typeof minLength !== 'number' || !maxLength) {
+ w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'string'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'string'`} && !this._${sPropName} ? true : this._${sPropName},`);
+ }
+ }
+ } else if (pType === 'number') {
+ if (isArray) {
+ w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && typeof p === 'number', true),`);
+ } else {
+ if (typeof minimum === 'number' && maximum) {
+ w.writeLine(` ${sPropName}: ${isRequired ? `this._${sPropName} >= ${minimum} && this._${sPropName} <= ${maximum}` : `!this._${sPropName} ? true : ((this._${sPropName} >= ${minimum}) && (this._${sPropName} <= ${maximum}))`},`);
+ }
+ if (typeof minimum !== 'number' || !maximum) {
+ w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'number'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'number'`},`);
+ }
+ }
+ } else if (pType === 'boolean') {
+ w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'boolean'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'boolean'`},`);
+ }
+ }
+ });
+ w.writeLine('};');
+ w.writeLine('const isError: string[] = [];')
+ w.writeLine('Object.keys(validate).forEach((key) => {');
+ w.writeLine(' if (!(validate as any)[key]) {');
+ w.writeLine(' isError.push(key);');
+ w.writeLine(' }');
+ w.writeLine('});');
+ w.writeLine('return isError;');
+
+ });
+
+ // add update method;
+ const update = entityClass.addMethod({
+ isStatic: false,
+ name: 'update',
+ returnType: `${sName}`,
+ });
+ update.addParameter({
+ name: 'props',
+ type: `Partial`,
+ });
+ update.setBodyText((w) => { w.writeLine(`return new ${sName}({ ...this.serialize(), ...props });`); });
+
+ this.entities.push(entityFile);
+ };
+
+ save = () => {
+ this.entities.forEach(async (e) => {
+ await e.saveSync();
+ });
+ };
+}
+
+export default EntitiesGenerator;
diff --git a/client2/scripts/generator/src/utils.ts b/client2/scripts/generator/src/utils.ts
new file mode 100644
index 00000000..3ab2ef26
--- /dev/null
+++ b/client2/scripts/generator/src/utils.ts
@@ -0,0 +1,74 @@
+const toCamel = (s: string) => {
+ return s.replace(/([-_][a-z])/ig, ($1) => {
+ return $1.toUpperCase()
+ .replace('-', '')
+ .replace('_', '');
+ });
+};
+const capitalize = (s: string) => {
+ return s[0].toUpperCase() + s.slice(1);
+};
+const TYPES = {
+ integer: 'number',
+ float: 'number',
+ number: 'number',
+ string: 'string',
+ boolean: 'boolean',
+};
+
+/**
+ * @param schemaProp: valueof shema.properties[key]
+ * @param openApi: openapi object
+ * @returns [propType - basicType or import one, isArray, isClass, isImport]
+ */
+const schemaParamParser = (schemaProp: any, openApi: any): [string, boolean, boolean, boolean, boolean] => {
+ let type = '';
+ let isImport = false;
+ let isClass = false;
+ let isArray = false;
+ let isAdditional = false;
+
+ if (schemaProp.$ref || schemaProp.additionalProperties?.$ref) {
+ const temp = (schemaProp.$ref || schemaProp.additionalProperties?.$ref).split('/');
+
+ if (schemaProp.additionalProperties) {
+ isAdditional = true;
+ }
+
+ type = `${temp[temp.length - 1]}`;
+
+ const cl = openApi ? openApi.components.schemas[temp[temp.length - 1]] : {};
+
+ if (cl.type === 'string' && cl.enum) {
+ isImport = true;
+ }
+
+ if (cl.type === 'object' && !cl.oneOf) {
+ isClass = true;
+ isImport = true;
+ } else if (cl.type === 'array') {
+ const temp: any = schemaParamParser(cl.items, openApi);
+ type = `${temp[0]}`;
+ isArray = true;
+ isClass = isClass || temp[2];
+ isImport = isImport || temp[3];
+ }
+ } else if (schemaProp.type === 'array') {
+ const temp: any = schemaParamParser(schemaProp.items, openApi);
+ type = `${temp[0]}`;
+ isArray = true;
+ isClass = isClass || temp[2];
+ isImport = isImport || temp[3];
+ } else {
+ type = (TYPES as Record)[schemaProp.type];
+ }
+ if (!type) {
+ // TODO: Fix bug with Error fields.
+ type = 'any';
+ // throw new Error('Failed to find entity type');
+ }
+
+ return [type, isArray, isClass, isImport, isAdditional];
+};
+
+export { TYPES, toCamel, capitalize, schemaParamParser };
diff --git a/client2/scripts/helpers/checkTranslations.ts b/client2/scripts/helpers/checkTranslations.ts
new file mode 100644
index 00000000..6634f65b
--- /dev/null
+++ b/client2/scripts/helpers/checkTranslations.ts
@@ -0,0 +1,226 @@
+import * as fs from 'fs';
+import {
+ Project,
+ VariableStatement,
+ SyntaxKind,
+ Node,
+ Statement,
+ ts,
+ Identifier,
+ SourceFile,
+} from 'ts-morph';
+import {
+ LOCALE_FOLDER_PATH,
+ TRANSLATOR_CLASS_NAME,
+ USE_INTL_NAME,
+ trimQuotes,
+} from '../consts';
+import { checkForms, AvailableLocales } from '../../src/localization/Translator';
+
+const project = new Project({
+ tsConfigFilePath: './tsconfig.json',
+});
+
+let lang = 'ru';
+let option = '';
+
+if (process.argv.length > 2) {
+ lang = process.argv[2];
+ option = process.argv[3];
+}
+
+const usedTranslations: string[] = [];
+const usedPluralTranslations: string[] = [];
+
+const problemFiles: string[] = [];
+const sourceFiles = project.getSourceFiles();
+const sourceFilesWithIntl = sourceFiles.filter((sf) => {
+ return !!sf.getImportDeclarations().find((id) => {
+ return !!id.getNamedImports().find((ni) => ni.getName() === USE_INTL_NAME)
+ })
+});
+const getFileUsedIntl = (statements: Statement[]) => {
+ statements.forEach((s) => {
+ if (s instanceof VariableStatement) {
+ s.forEachDescendant((node) => {
+ let intVariableDeclaration: Identifier = null;
+ switch (node.getKind()) {
+ case SyntaxKind.VariableDeclaration:
+ if (node.getSymbol()) {
+ const name = node.getSymbol().getName();
+ const callExp = node.getChildren().find((n) => n.getKind() === SyntaxKind.CallExpression);
+ if (callExp) {
+ const callExpIden = callExp.getChildren().find(n => n.getKind() === SyntaxKind.Identifier);
+ if (callExpIden && callExpIden.getSymbol().getName() === USE_INTL_NAME) {
+ intVariableDeclaration = node as Identifier;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ if (intVariableDeclaration) {
+ intVariableDeclaration.findReferencesAsNodes().forEach((fr) => {
+ if (fr instanceof Node) {
+ const parent = fr.getParentIfKind(SyntaxKind.PropertyAccessExpression);
+ if (parent && (parent.getName() === 'getMessage' || parent.getName() === 'getPlural')) {
+ const syntaxList = parent.getNextSiblings().find((n) => n.getKind() === SyntaxKind.SyntaxList);
+ if (syntaxList) {
+ const id = syntaxList.getChildren()[0];
+ if (id && id.getKind() !== SyntaxKind.StringLiteral) {
+ problemFiles.push(fr.getSourceFile().getFilePath());
+ }
+ if (id) {
+ usedTranslations.push(trimQuotes(id.getText()));
+ if (parent.getName() === 'getPlural') {
+ usedPluralTranslations.push(trimQuotes(id.getText()));
+ }
+ }
+ }
+ }
+ }
+ })
+ }
+ });
+ }
+ })
+}
+
+const getFileUsedTranslations = (file: SourceFile) => {
+ const namedImport = file.getImportDeclarations().find((id) => !!id.getNamedImports().find((ni) => ni.getName() === TRANSLATOR_CLASS_NAME));
+ if (namedImport) {
+ const identifier = namedImport.getImportClause().getNamedImports().find((iden) => iden.getName() === TRANSLATOR_CLASS_NAME);
+ const translateReferences = identifier.getNodeProperty('name').findReferencesAsNodes();
+ if (translateReferences.length > 0) {
+ translateReferences.forEach((identifierNode) => {
+ if (identifierNode.getParentIfKind(SyntaxKind.TypeReference)) {
+ const translatorVariable = identifierNode.getParent().getPreviousSibling().getPreviousSiblingIfKind(SyntaxKind.Identifier);
+ if (translatorVariable) {
+ translatorVariable.findReferencesAsNodes().forEach((node) => {
+ const parent = node.getParentIfKind(SyntaxKind.PropertyAccessExpression);
+ if (parent && (parent.getName() === 'getMessage' || parent.getName() === 'getPlural')) {
+
+ const syntaxList = parent.getNextSiblings().find((n) => n.getKind() === SyntaxKind.SyntaxList);
+ if (syntaxList) {
+ const id = syntaxList.getChildren()[0];
+ if (id && id.getKind() !== SyntaxKind.StringLiteral) {
+ problemFiles.push(parent.getSourceFile().getFilePath());
+ }
+ if (id) {
+ usedTranslations.push(trimQuotes(id.getText()));
+ if (parent.getName() === 'getPlural') {
+ usedPluralTranslations.push(trimQuotes(id.getText()));
+ }
+ }
+ }
+ }
+ })
+ }
+ }
+ })
+ }
+
+ }
+}
+sourceFilesWithIntl.forEach((file) => {
+ getFileUsedIntl(file.getStatements());
+})
+
+const sourceFilesWithTranslator = project.getSourceFiles().filter((sf) => {
+ return !!sf.getImportDeclarations().find((id) => {
+ return !!id.getNamedImports().find((ni) => ni.getName() === TRANSLATOR_CLASS_NAME)
+ })
+});
+sourceFilesWithTranslator.forEach((file) => {
+ getFileUsedTranslations(file);
+})
+const filteredUsedTranslations = Array.from(new Set(usedTranslations));
+const filteredUsedPluralTranslations = Array.from(new Set(usedPluralTranslations));
+
+if (problemFiles.length) {
+ console.warn(`\n============== Files where translation id provided not as string ==============\n`);
+ console.log(problemFiles.join('\n'));
+ process.exit(255);
+}
+
+const allFiles = fs.readdirSync(LOCALE_FOLDER_PATH);
+// Use ru or needed language
+const translationFile = allFiles.find((file) => file.includes(`${lang}.json`));
+
+if (!translationFile) {
+ console.error('File not found');
+ process.exit(255);
+}
+
+const translationsObject = JSON.parse(fs.readFileSync(`./src/lib/intl/__locales/${translationFile}`, { flag: 'r+' }) as unknown as string);
+const translations = {
+ locale: translationFile,
+ messages: Object.keys(translationsObject),
+};
+
+const someMessagesNotFound: string[] = [];
+const notUsed: string[] = [];
+const notFound: string[] = [];
+const checkLocaleMessages = (locale: string, messages: string[]) => {
+ filteredUsedTranslations.forEach(f => {
+ if (!messages.includes(f)) {
+ notFound.push(f);
+ }
+ });
+ messages.forEach(t => {
+ if (!filteredUsedTranslations.includes(t)) {
+ notUsed.push(t);
+ }
+ });
+ if (notFound.length > 0) {
+ someMessagesNotFound.push(locale);
+ }
+}
+
+const render = (data: string[], title: string) => {
+ console.log(`============ ${title} ============`);
+ console.table(data);
+ console.log(`============ ${title} ============`);
+}
+
+checkLocaleMessages(translations.locale, translations.messages);
+
+const checkPluralForm = () => {
+ const pluralFormWrong: string[] = [];
+ filteredUsedPluralTranslations.forEach((id) => {
+ const message = translationsObject[id];
+ if (!checkForms(message, lang as AvailableLocales, id)) {
+ pluralFormWrong.push(id)
+ }
+ });
+ return pluralFormWrong;
+}
+
+const plural = checkPluralForm();
+if (!option && (someMessagesNotFound.length || plural.length > 0 )) {
+ someMessagesNotFound.forEach(locale => console.error(`\nSome translatins for ${locale} was not found!\n`));
+ plural.forEach(id => console.error(`\nTranslation with id: "${id}" - have wrong number of plural forms!\n`));
+ process.exit(255);
+}
+if (option) {
+ switch (option) {
+ case '--show-missing': {
+ render(notFound, 'NotFound')
+ break;
+ }
+ case '--show-unused': {
+ render(notUsed, 'notUsed')
+ break;
+ }
+ case '--check-plurals': {
+ render(plural, 'Wrong Plural Form')
+ }
+ default: {
+ if (someMessagesNotFound.length) {
+ someMessagesNotFound.forEach(locale => console.error(`\nSome translatins for ${locale} was not found!\n\n`));
+ process.exit(255);
+ }
+ }
+ }
+}
diff --git a/client2/scripts/lint/common.js b/client2/scripts/lint/common.js
new file mode 100644
index 00000000..759fa44f
--- /dev/null
+++ b/client2/scripts/lint/common.js
@@ -0,0 +1,79 @@
+module.exports = {
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ project: './tsconfig.json',
+ ecmaFeatures: {
+ jsx: true
+ },
+ extraFileExtensions: ['mjs', 'tsx', 'ts'],
+ ecmaVersion: 2020,
+ sourceType: 'module'
+ },
+ plugins: ['react', '@typescript-eslint', 'import'],
+ env: {
+ browser: true,
+ commonjs: true,
+ es6: true,
+ es2020: true,
+ jest: true,
+ },
+ settings: {
+ react: {
+ pragma: 'React',
+ version: 'detect',
+ },
+ 'import/resolver': {
+ typescript: {
+ alwaysTryTypes: true
+ }
+ },
+ 'import/parsers': {
+ '@typescript-eslint/parser': ['.ts', '.tsx'],
+ },
+ },
+ rules: {
+ '@typescript-eslint/explicit-module-boundary-types': 0,
+ '@typescript-eslint/explicit-function-return-type': [0, { allowExpressions: true }],
+ '@typescript-eslint/indent': ['error', 4],
+ '@typescript-eslint/interface-name-prefix': [0, { prefixWithI: 'never' }],
+ '@typescript-eslint/no-explicit-any': [0],
+ '@typescript-eslint/naming-convention': [2, {
+ selector: 'enum', format: ['UPPER_CASE', 'PascalCase'],
+ }],
+ '@typescript-eslint/no-non-null-assertion': 0,
+ 'arrow-body-style': 'off',
+ 'consistent-return': 0,
+ curly: [2, 'all'],
+ 'default-case': 0,
+ 'import/no-cycle': 0,
+ 'import/prefer-default-export': 'off',
+ 'import/no-named-as-default': 0,
+ indent: [0, 4],
+ 'no-alert': 2,
+ 'no-console': 2,
+ 'no-debugger': 2,
+ 'no-underscore-dangle': 'off',
+ 'no-useless-escape': 'off',
+ 'object-curly-newline': 'off',
+ 'react-hooks/exhaustive-deps': 0,
+ 'react/display-name': 0,
+ 'react/jsx-indent-props': ['error', 4],
+ 'react/jsx-indent': ['error', 4],
+ 'react/jsx-one-expression-per-line': 'off',
+ 'react/jsx-props-no-spreading': 0,
+ 'react/prop-types': 'off',
+ 'react/state-in-constructor': 'off',
+ },
+ extends: [
+ 'airbnb-base',
+ 'airbnb-typescript/base',
+ 'airbnb/hooks',
+ 'plugin:react/recommended',
+ 'plugin:@typescript-eslint/eslint-recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:import/errors',
+ 'plugin:import/warnings',
+ 'plugin:import/typescript',
+ ],
+ globals: {},
+};
diff --git a/client2/scripts/lint/dev.js b/client2/scripts/lint/dev.js
new file mode 100644
index 00000000..33784298
--- /dev/null
+++ b/client2/scripts/lint/dev.js
@@ -0,0 +1,10 @@
+module.exports = {
+ rules: {
+ 'no-alert': 0,
+ 'no-debugger': 0,
+ 'no-console': 0,
+ },
+ extends: [
+ './common',
+ ],
+};
diff --git a/client2/scripts/lint/prod.js b/client2/scripts/lint/prod.js
new file mode 100644
index 00000000..f31bae1f
--- /dev/null
+++ b/client2/scripts/lint/prod.js
@@ -0,0 +1,5 @@
+module.exports = {
+ extends: [
+ './common.js',
+ ],
+};
diff --git a/client2/scripts/webpack/helpers.js b/client2/scripts/webpack/helpers.js
new file mode 100644
index 00000000..2a72e0b6
--- /dev/null
+++ b/client2/scripts/webpack/helpers.js
@@ -0,0 +1,40 @@
+const yaml = require('yaml');
+const fs = require('fs');
+
+const ZERO_HOST = '0.0.0.0';
+const LOCALHOST = '127.0.0.1';
+const DEFAULT_PORT = 80;
+
+const importConfig = () => {
+ try {
+ const doc = yaml.parse(fs.readFileSync('../AdguardHome.yaml', 'utf8'));
+ const { bind_host, bind_port } = doc;
+ return {
+ bind_host,
+ bind_port,
+ };
+ } catch (e) {
+ return {
+ bind_host: ZERO_HOST,
+ bind_port: DEFAULT_PORT,
+ };
+ }
+};
+
+const getDevServerConfig = () => {
+ const { bind_host: host, bind_port: port } = importConfig();
+ const { DEV_SERVER_PORT } = process.env;
+
+ const devServerHost = host === ZERO_HOST ? LOCALHOST : host;
+ const devServerPort = 3000 || port + 8000;
+
+ return {
+ host: devServerHost,
+ port: devServerPort
+ };
+};
+
+module.exports = {
+ importConfig,
+ getDevServerConfig
+};
diff --git a/client2/scripts/webpack/webpack.config.base.js b/client2/scripts/webpack/webpack.config.base.js
new file mode 100644
index 00000000..babb4f54
--- /dev/null
+++ b/client2/scripts/webpack/webpack.config.base.js
@@ -0,0 +1,74 @@
+const path = require('path');
+const AntdDayjsWebpackPlugin = require('antd-dayjs-webpack-plugin');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const tsconfig = require('../../tsconfig.json');
+
+const RESOURCES_PATH = path.resolve(__dirname, '../../');
+const HTML_PATH = path.resolve(RESOURCES_PATH, 'public/index.html');
+const HTML_INSTALL_PATH = path.resolve(RESOURCES_PATH, 'public/install.html');
+
+module.exports = {
+ entry: {
+ install: './src/Install.tsx',
+ main: './src/App.tsx'
+ },
+ resolve: {
+ extensions: ['.tsx', '.ts', '.js', '.pcss'],
+ alias: Object.keys(tsconfig.compilerOptions.paths).reduce((aliases, key) => {
+ // Reduce to load aliases from ./tsconfig.json in appropriate for webpack form
+ const paths = tsconfig.compilerOptions.paths[key].map(p => p.replace('/*', ''));
+ aliases[key.replace('/*', '')] = path.resolve(
+ __dirname,
+ '../../',
+ tsconfig.compilerOptions.baseUrl,
+ ...paths,
+ );
+ return aliases;
+ }, {}),
+ },
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ use: 'ts-loader',
+ exclude: /node_modules/,
+ },
+ {
+ test: /\.(woff|woff2)$/,
+ use: [{
+ loader: 'file-loader',
+ options:{
+ outputPath:'./',
+ }
+ }],
+ },
+ {
+ test:/\.(png|jpe?g|gif)$/,
+ exclude: /(node_modules)/,
+ use:[{
+ loader:'file-loader',
+ options:{
+ outputPath:'./images',
+ }
+ }]
+ }
+ ],
+ },
+
+ plugins: [
+ // new AntdDayjsWebpackPlugin()
+ new HtmlWebpackPlugin({
+ inject: true,
+ cache: false,
+ chunks: ['main'],
+ template: HTML_PATH,
+ }),
+ new HtmlWebpackPlugin({
+ inject: true,
+ cache: false,
+ chunks: ['install'],
+ filename: 'install.html',
+ template: HTML_INSTALL_PATH,
+ }),
+ ],
+};
diff --git a/client2/scripts/webpack/webpack.config.dev.js b/client2/scripts/webpack/webpack.config.dev.js
new file mode 100644
index 00000000..3a12f12e
--- /dev/null
+++ b/client2/scripts/webpack/webpack.config.dev.js
@@ -0,0 +1,113 @@
+const history = require('connect-history-api-fallback');
+const { merge } = require('webpack-merge');
+const path = require('path');
+const proxy = require('http-proxy-middleware');
+const Webpack = require('webpack');
+
+const { getDevServerConfig } = require('./helpers');
+const baseConfig = require('./webpack.config.base');
+
+const target = getDevServerConfig();
+
+const options = {
+ target: `http://${target.host}:${target.port}`, // target host
+ changeOrigin: true, // needed for virtual hosted sites
+};
+const apiProxy = proxy.createProxyMiddleware(options);
+
+module.exports = merge(baseConfig, {
+ mode: 'development',
+ output: {
+ path: path.resolve(__dirname, '../../build2'),
+ filename: '[name].bundle.js',
+ },
+ optimization: {
+ noEmitOnErrors: true,
+ },
+ devServer: {
+ port: 4000,
+ historyApiFallback: true,
+ before: (app) => {
+ app.use('/control', apiProxy);
+ app.use(history({
+ rewrites: [
+ {
+ from: /\.(png|jpe?g|gif)$/,
+ to: (context) => {
+ const name = context.parsedUrl.pathname.split('/');
+ return `/images/${name[name.length - 1]}`
+ }
+ }, {
+ from: /\.(woff|woff2)$/,
+ to: (context) => {
+ const name = context.parsedUrl.pathname.split('/');
+ return `/${name[name.length - 1]}`
+ }
+ }, {
+ from: /\.(js|css)$/,
+ to: (context) => {
+ const name = context.parsedUrl.pathname.split('/');
+ return `/${name[name.length - 1]}`
+ }
+ }
+ ],
+ }));
+ }
+ },
+ devtool: 'eval-source-map',
+ module: {
+ rules: [
+ {
+ enforce: 'pre',
+ test: /\.tsx?$/,
+ exclude: /node_modules/,
+ loader: 'eslint-loader',
+ options: {
+ configFile: path.resolve(__dirname, '../lint/dev.js'),
+ }
+ },
+ {
+ test: (resource) => {
+ return (
+ resource.indexOf('.pcss')+1
+ || resource.indexOf('.css')+1
+ || resource.indexOf('.less')+1
+ ) && !(resource.indexOf('.module.')+1);
+ },
+ use: ['style-loader', 'css-loader', 'postcss-loader', {
+ loader: 'less-loader',
+ options: {
+ javascriptEnabled: true,
+ },
+ }],
+ },
+ {
+ test: /\.module\.p?css$/,
+ use: [
+ 'style-loader',
+ {
+ loader: 'css-loader',
+ options: {
+ modules: true,
+ sourceMap: true,
+ importLoaders: 1,
+ modules: {
+ localIdentName: "[name]__[local]___[hash:base64:5]",
+ }
+ },
+ },
+ 'postcss-loader',
+ ],
+ exclude: /node_modules/,
+ },
+ ]
+ },
+ plugins: [
+ new Webpack.DefinePlugin({
+ DEV: true,
+ 'process.env.DEV_SERVER_PORT': JSON.stringify(3000),
+ }),
+ new Webpack.HotModuleReplacementPlugin(),
+ new Webpack.ProgressPlugin(),
+ ],
+});
diff --git a/client2/scripts/webpack/webpack.config.prod.js b/client2/scripts/webpack/webpack.config.prod.js
new file mode 100644
index 00000000..958c7e68
--- /dev/null
+++ b/client2/scripts/webpack/webpack.config.prod.js
@@ -0,0 +1,91 @@
+const path = require('path');
+const { merge } = require('webpack-merge');
+const baseConfig = require('./webpack.config.base');
+const MiniCssExtractPlugin = require("mini-css-extract-plugin");
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
+const TerserJSPlugin = require('terser-webpack-plugin');
+const Webpack = require('webpack');
+const CopyPlugin = require('copy-webpack-plugin');
+
+module.exports = merge(baseConfig, {
+ mode: 'production',
+ devtool: 'source-map',
+ output: {
+ path: path.resolve(__dirname, '../../../build2/static'),
+ filename: '[name].bundle.[hash:5].js',
+ publicPath: '/'
+ },
+ optimization: {
+ minimizer: [new TerserJSPlugin({terserOptions: {
+ output: {
+ comments: false,
+ },
+ },
+ extractComments: false,
+ }), new OptimizeCSSAssetsPlugin({})],
+ splitChunks: {
+ cacheGroups: {
+ styles: {
+ name: 'styles',
+ test: /\.css$/,
+ chunks: 'all',
+ enforce: true,
+ },
+ },
+ },
+ },
+ module: {
+ rules: [
+ {
+ test: (resource) => {
+ return (
+ resource.indexOf('.pcss')+1
+ || resource.indexOf('.css')+1
+ || resource.indexOf('.less')+1
+ ) && !(resource.indexOf('.module.')+1);
+ },
+ use: [{
+ loader: MiniCssExtractPlugin.loader,
+ options: {
+ esModules: true,
+ }
+ }, 'css-loader', 'postcss-loader', {
+ loader: 'less-loader',
+ options: {
+ javascriptEnabled: true,
+ },
+ }],
+ exclude: /node_modules/,
+ },
+ {
+ test: /\.module\.p?css$/,
+ use: [
+ {
+ loader: MiniCssExtractPlugin.loader,
+ options: {
+ esModules: true,
+ }
+ },
+ {
+ loader: 'css-loader',
+ options: {
+ modules: true,
+ sourceMap: true,
+ importLoaders: 1,
+ },
+ },
+ 'postcss-loader',
+ ],
+ exclude: /node_modules/,
+ }
+ ]
+ },
+ plugins: [
+ new Webpack.DefinePlugin({
+ DEV: false,
+ }),
+ new MiniCssExtractPlugin({
+ filename: '[name].[hash:5].css',
+ }),
+ ]
+});
diff --git a/client2/src/App.tsx b/client2/src/App.tsx
new file mode 100644
index 00000000..f01e3253
--- /dev/null
+++ b/client2/src/App.tsx
@@ -0,0 +1,18 @@
+import './main.pcss';
+import './lib/ant/ant.less';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import Store, { storeValue } from 'Store';
+import './lib/ant';
+
+import App from './components/App';
+
+const Container = () => {
+ return (
+
+
+
+ );
+};
+
+ReactDOM.render( , document.getElementById('app'));
diff --git a/client2/src/Install.tsx b/client2/src/Install.tsx
new file mode 100644
index 00000000..ccc61315
--- /dev/null
+++ b/client2/src/Install.tsx
@@ -0,0 +1,18 @@
+import './main.pcss';
+import './lib/ant/ant.less';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import Store, { storeValue } from 'Store/installStore';
+import './lib/ant';
+
+import Install from './components/Install';
+
+const Container = () => {
+ return (
+
+
+
+ );
+};
+
+ReactDOM.render( , document.getElementById('app'));
diff --git a/client2/src/assets/img/background_min.png b/client2/src/assets/img/background_min.png
new file mode 100644
index 00000000..528fe2d1
Binary files /dev/null and b/client2/src/assets/img/background_min.png differ
diff --git a/client2/src/components/App.tsx b/client2/src/components/App.tsx
new file mode 100644
index 00000000..f27d5c17
--- /dev/null
+++ b/client2/src/components/App.tsx
@@ -0,0 +1,16 @@
+import { observer } from 'mobx-react-lite';
+import React, { FC, useContext } from 'react';
+import Store from 'Store';
+import Icons from 'Lib/theme/Icons';
+
+const App: FC = observer(() => {
+ const store = useContext(Store);
+ return (
+
+ {store.ui.currentLang}
+
+
+ );
+});
+
+export default App;
diff --git a/client2/src/components/Install/Install.module.pcss b/client2/src/components/Install/Install.module.pcss
new file mode 100644
index 00000000..8beec8bc
--- /dev/null
+++ b/client2/src/components/Install/Install.module.pcss
@@ -0,0 +1,14 @@
+.layout {
+ background-image: url('../../assets/img/background_min.png');
+ background-repeat: no-repeat;
+ min-height: 100vh;
+ background-color: #f1f3f7;
+}
+.container {
+ display: flex;
+ justify-content: center;
+ padding: 40px;
+}
+.content {
+ max-width: 404px;
+}
diff --git a/client2/src/components/Install/Install.tsx b/client2/src/components/Install/Install.tsx
new file mode 100644
index 00000000..ce5dda59
--- /dev/null
+++ b/client2/src/components/Install/Install.tsx
@@ -0,0 +1,122 @@
+import React, { FC } from 'react';
+import { Layout } from 'antd';
+import { Formik, FormikHelpers } from 'formik';
+import { observer } from 'mobx-react-lite';
+
+import { IInitialConfigurationBeta } from 'Entities/InitialConfigurationBeta';
+import Icons from 'Lib/theme/Icons';
+import {
+ DEFAULT_DNS_ADDRESS,
+ DEFAULT_DNS_PORT,
+ DEFAULT_IP_ADDRESS,
+ DEFAULT_IP_PORT,
+} from 'Consts/install';
+import { notifyError } from 'Common/ui';
+import InstallStore from 'Store/stores/Install';
+
+import AdminInterface from './components/AdminInterface';
+import Auth from './components/Auth';
+import DnsServer from './components/DnsServer';
+import Stepper from './components/Stepper';
+import Welcome from './components/Welcome';
+import ConfigureDevices from './components/ConfigureDevices';
+
+import s from './Install.module.pcss';
+
+const { Content } = Layout;
+
+export type FormValues = IInitialConfigurationBeta & { step: number };
+
+const InstallForm: FC = observer(() => {
+ const initialValues: FormValues = {
+ step: 0,
+ web: {
+ ip: [DEFAULT_IP_ADDRESS],
+ port: DEFAULT_IP_PORT,
+ },
+ dns: {
+ ip: [DEFAULT_DNS_ADDRESS],
+ port: DEFAULT_DNS_PORT,
+ },
+ password: '',
+ username: '',
+ };
+
+ const onNext = async (values: FormValues, { setFieldValue }: FormikHelpers) => {
+ const currentStep = values.step;
+ const checker = (condition: boolean, message: string) => {
+ if (condition) {
+ setFieldValue('step', currentStep + 1);
+ } else {
+ notifyError(message);
+ }
+ };
+ switch (currentStep) {
+ case 1: {
+ // web
+ const check = await InstallStore.checkConfig(values);
+ checker(check?.web?.status === '', check?.web?.status || '');
+ break;
+ }
+ case 3: {
+ // dns
+ const check = await InstallStore.checkConfig(values);
+ checker(check?.dns?.status === '', check?.dns?.status || '');
+ break;
+ }
+ case 4: {
+ // configure
+ const config = await InstallStore.configure(values);
+ if (config) {
+ const { web } = values;
+ window.location.href = `http://${web.ip[0]}:${web.port}`;
+ }
+ break;
+ }
+ default:
+ setFieldValue('step', currentStep + 1);
+ break;
+ }
+ };
+
+ return (
+
+ {({ values, handleSubmit, setFieldValue }) => (
+
+ )}
+
+ );
+});
+
+const Install: FC = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default Install;
diff --git a/client2/src/components/Install/components/AdminInterface/AdminInterface.module.pcss b/client2/src/components/Install/components/AdminInterface/AdminInterface.module.pcss
new file mode 100644
index 00000000..815f2470
--- /dev/null
+++ b/client2/src/components/Install/components/AdminInterface/AdminInterface.module.pcss
@@ -0,0 +1,17 @@
+.manualOptions {
+ margin-bottom: 48px;
+}
+
+.name {
+ padding-bottom: 5px;
+ border-bottom: 1px solid var(--gray300);
+ margin-bottom: 16px;
+ margin-top: 20px;
+}
+
+.manualOption {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/AdminInterface/AdminInterface.tsx b/client2/src/components/Install/components/AdminInterface/AdminInterface.tsx
new file mode 100644
index 00000000..711427a9
--- /dev/null
+++ b/client2/src/components/Install/components/AdminInterface/AdminInterface.tsx
@@ -0,0 +1,145 @@
+import React, { FC, useContext } from 'react';
+import cn from 'classnames';
+import { observer } from 'mobx-react-lite';
+import { FormikHelpers } from 'formik';
+
+import { Input, Radio, Switch } from 'Common/controls';
+import { DEFAULT_IP_ADDRESS } from 'Consts/install';
+import { chechNetworkType, NETWORK_TYPE } from 'Helpers/installHelpers';
+import theme from 'Lib/theme';
+import Store from 'Store/installStore';
+
+import s from './AdminInterface.module.pcss';
+import { FormValues } from '../../Install';
+import StepButtons from '../StepButtons';
+
+enum NETWORK_OPTIONS {
+ ALL = 'all',
+ CUSTOM = 'custom',
+}
+
+interface AdminInterfaceProps {
+ values: FormValues;
+ setFieldValue: FormikHelpers['setFieldValue'];
+}
+
+const AdminInterface: FC = observer(({
+ values,
+ setFieldValue,
+}) => {
+ const { ui: { intl }, install: { addresses } } = useContext(Store);
+ const { web: { ip } } = values;
+ const radioValue = ip.length === 1 && ip[0] === DEFAULT_IP_ADDRESS
+ ? NETWORK_OPTIONS.ALL : NETWORK_OPTIONS.CUSTOM;
+
+ const onSelectRadio = (v: string | number) => {
+ const value = v === NETWORK_OPTIONS.ALL
+ ? [DEFAULT_IP_ADDRESS] : [];
+ setFieldValue('web.ip', value);
+ };
+
+ const getManualBlock = () => (
+
+ {addresses?.interfaces.map((a) => {
+ let name = '';
+ const type = chechNetworkType(a.name);
+ switch (type) {
+ case NETWORK_TYPE.ETHERNET:
+ name = `${intl.getMessage('ethernet')} (${a.name}) `;
+ break;
+ case NETWORK_TYPE.LOCAL:
+ name = `${intl.getMessage('localhost')} (${a.name}) `;
+ break;
+ default:
+ name = a.name || '';
+ break;
+ }
+ return (
+
+
+
+ {name}
+
+ {a.ipAddresses?.map((addrIp) => (
+
+
+ http://{addrIp}
+
+
{
+ const temp = new Set(ip);
+ if (temp.has(addrIp)) {
+ temp.delete(addrIp);
+ } else {
+ temp.add(addrIp);
+ }
+ setFieldValue('web.ip', Array.from(temp.values()));
+ }}/>
+
+ ))}
+
+
+ );
+ })}
+
+ );
+
+ return (
+
+
+ {intl.getMessage('install_admin_interface_title')}
+
+
+ {intl.getMessage('install_admin_interface_title_decs')}
+
+
+ {intl.getMessage('install_admin_interface_where_interface')}
+
+
+ {intl.getMessage('install_admin_interface_where_interface_desc')}
+
+
+ { radioValue !== NETWORK_OPTIONS.ALL && getManualBlock()}
+
+ {intl.getMessage('install_admin_interface_port')}
+
+
+ {intl.getMessage('install_admin_interface_port_desc')}
+
+
{
+ const port = v === '' ? '' : parseInt(v, 10);
+ setFieldValue('web.port', port);
+ }}
+ />
+
+
+ );
+});
+
+export default AdminInterface;
diff --git a/client2/src/components/Install/components/AdminInterface/index.ts b/client2/src/components/Install/components/AdminInterface/index.ts
new file mode 100644
index 00000000..e0f7b851
--- /dev/null
+++ b/client2/src/components/Install/components/AdminInterface/index.ts
@@ -0,0 +1 @@
+export { default } from './AdminInterface';
diff --git a/client2/src/components/Install/components/Auth/Auth.tsx b/client2/src/components/Install/components/Auth/Auth.tsx
new file mode 100644
index 00000000..a0f5797f
--- /dev/null
+++ b/client2/src/components/Install/components/Auth/Auth.tsx
@@ -0,0 +1,55 @@
+import React, { FC, useContext } from 'react';
+import cn from 'classnames';
+import { observer } from 'mobx-react-lite';
+import { FormikHelpers } from 'formik';
+
+import { Input } from 'Common/controls';
+import theme from 'Lib/theme';
+import Store from 'Store/installStore';
+
+import StepButtons from '../StepButtons';
+import { FormValues } from '../../Install';
+
+interface AuthProps {
+ values: FormValues;
+ setFieldValue: FormikHelpers['setFieldValue'];
+}
+
+const Auth: FC = observer(({
+ values,
+ setFieldValue,
+}) => {
+ const { ui: { intl } } = useContext(Store);
+
+ return (
+
+
+ {intl.getMessage('install_auth_title')}
+
+
+ {intl.getMessage('install_auth_description')}
+
+
setFieldValue('username', v)}
+ />
+
setFieldValue('password', v)}
+ />
+
+
+ );
+});
+
+export default Auth;
diff --git a/client2/src/components/Install/components/Auth/index.ts b/client2/src/components/Install/components/Auth/index.ts
new file mode 100644
index 00000000..b1dea29b
--- /dev/null
+++ b/client2/src/components/Install/components/Auth/index.ts
@@ -0,0 +1 @@
+export { default } from './Auth';
diff --git a/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.module.pcss b/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.module.pcss
new file mode 100644
index 00000000..a3b2e199
--- /dev/null
+++ b/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.module.pcss
@@ -0,0 +1,4 @@
+.tabs {
+ width: 505px;
+ margin-left: -131px;
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.tsx b/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.tsx
new file mode 100644
index 00000000..57c49cd4
--- /dev/null
+++ b/client2/src/components/Install/components/ConfigureDevices/ConfigureDevices.tsx
@@ -0,0 +1,128 @@
+import React, { FC, useContext } from 'react';
+import { Tabs } from 'antd';
+import cn from 'classnames';
+import { FormikHelpers } from 'formik';
+
+import Store from 'Store/installStore';
+import theme from 'Lib/theme';
+import { danger, p } from 'Common/formating';
+import { DEFAULT_DNS_PORT, DEFAULT_IP_ADDRESS, DEFAULT_IP_PORT } from 'Consts/install';
+
+import { FormValues } from '../../Install';
+import StepButtons from '../StepButtons';
+import s from './ConfigureDevices.module.pcss';
+
+const { TabPane } = Tabs;
+
+interface ConfigureDevicesProps {
+ values: FormValues;
+ setFieldValue: FormikHelpers['setFieldValue'];
+}
+
+const ConfigureDevices: FC = ({
+ values, setFieldValue,
+}) => {
+ const { ui: { intl }, install: { addresses } } = useContext(Store);
+
+ const dhcp = (e: string) => (
+ // TODO: link to dhcp
+ {e}
+ );
+
+ const allIps = addresses?.interfaces.reduce((all, data) => {
+ const { ipAddresses } = data;
+ if (ipAddresses) {
+ all.push(...ipAddresses);
+ }
+ return all;
+ }, [] as string[]);
+
+ const { web: { ip: webIp }, dns: { ip: dnsIp } } = values;
+ const selectedWebIps = webIp.length === 1 && webIp[0] === DEFAULT_IP_ADDRESS
+ ? allIps : webIp;
+ const selectedDnsIps = dnsIp.length === 1 && dnsIp[0] === DEFAULT_IP_ADDRESS
+ ? allIps : dnsIp;
+
+ return (
+
+
+ {intl.getMessage('install_configure_title')}
+
+
+ {intl.getMessage('install_configure_danger_notice', { danger })}
+
+
+ {intl.getMessage('install_configure_how_to_title')}
+
+
+
+
+ {intl.getMessage('install_configure_router', { p })}
+
+
+
+
+ {intl.getMessage('install_configure_windows', { p })}
+
+
+
+
+ {intl.getMessage('install_configure_macos', { p })}
+
+
+
+
+ {/* TODO: add linux setup */}
+ {intl.getMessage('install_configure_router', { p })}
+
+
+
+
+ {intl.getMessage('install_configure_android', { p })}
+
+
+
+
+ {intl.getMessage('install_configure_ios', { p })}
+
+
+
+
+
+ {intl.getMessage('install_configure_adresses')}
+
+
+
+ {intl.getMessage('install_admin_interface_title')}
+
+
+ {selectedWebIps?.map((ip) => (
+
+ {ip}{values.web.port !== DEFAULT_IP_PORT && `:${values.web.port}`}
+
+ ))}
+
+
+ {intl.getMessage('install_dns_server_title')}
+
+
+ {selectedDnsIps?.map((ip) => (
+
+ {ip}{values.dns.port !== DEFAULT_DNS_PORT && `:${values.dns.port}`}
+
+ ))}
+
+
+
+ {intl.getMessage('install_configure_dhcp', { dhcp })}
+
+
+
+ );
+};
+
+export default ConfigureDevices;
diff --git a/client2/src/components/Install/components/ConfigureDevices/index.ts b/client2/src/components/Install/components/ConfigureDevices/index.ts
new file mode 100644
index 00000000..928cdfa0
--- /dev/null
+++ b/client2/src/components/Install/components/ConfigureDevices/index.ts
@@ -0,0 +1 @@
+export { default } from './ConfigureDevices';
diff --git a/client2/src/components/Install/components/DnsServer/DnsServer.module.pcss b/client2/src/components/Install/components/DnsServer/DnsServer.module.pcss
new file mode 100644
index 00000000..5a90e4d5
--- /dev/null
+++ b/client2/src/components/Install/components/DnsServer/DnsServer.module.pcss
@@ -0,0 +1,12 @@
+.manualOptions {
+ margin-bottom: 48px;
+}
+
+.manualOption {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ padding-bottom: 16px;
+ border-bottom: 1px solid var(--gray300);
+ margin-bottom: 16px;
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/DnsServer/DnsServer.tsx b/client2/src/components/Install/components/DnsServer/DnsServer.tsx
new file mode 100644
index 00000000..d3e73494
--- /dev/null
+++ b/client2/src/components/Install/components/DnsServer/DnsServer.tsx
@@ -0,0 +1,145 @@
+import React, { FC, useContext } from 'react';
+import cn from 'classnames';
+import { observer } from 'mobx-react-lite';
+import { FormikHelpers } from 'formik';
+
+import { Input, Radio, Switch } from 'Common/controls';
+import { DEFAULT_IP_ADDRESS } from 'Consts/install';
+import { chechNetworkType, NETWORK_TYPE } from 'Helpers/installHelpers';
+import theme from 'Lib/theme';
+import Store from 'Store/installStore';
+
+import s from './DnsServer.module.pcss';
+import { FormValues } from '../../Install';
+import StepButtons from '../StepButtons';
+
+enum NETWORK_OPTIONS {
+ ALL = 'all',
+ CUSTOM = 'custom',
+}
+
+interface DnsServerProps {
+ values: FormValues;
+ setFieldValue: FormikHelpers['setFieldValue'];
+}
+
+const DnsServer: FC = observer(({
+ values,
+ setFieldValue,
+}) => {
+ const { ui: { intl }, install: { addresses } } = useContext(Store);
+ const { dns: { ip } } = values;
+ const radioValue = ip.length === 1 && ip[0] === DEFAULT_IP_ADDRESS
+ ? NETWORK_OPTIONS.ALL : NETWORK_OPTIONS.CUSTOM;
+
+ const onSelectRadio = (v: string | number) => {
+ const value = v === NETWORK_OPTIONS.ALL
+ ? [DEFAULT_IP_ADDRESS] : [];
+ setFieldValue('dns.ip', value);
+ };
+
+ const getManualBlock = () => (
+
+ {addresses?.interfaces.map((a) => {
+ let name = '';
+ const type = chechNetworkType(a.name);
+ switch (type) {
+ case NETWORK_TYPE.ETHERNET:
+ name = `${intl.getMessage('ethernet')} (${a.name}) `;
+ break;
+ case NETWORK_TYPE.LOCAL:
+ name = `${intl.getMessage('localhost')} (${a.name}) `;
+ break;
+ default:
+ name = a.name || '';
+ break;
+ }
+ return (
+
+
+
+ {name}
+
+ {a.ipAddresses?.map((addrIp) => (
+
+
+ {addrIp}
+
+
{
+ const temp = new Set(ip);
+ if (temp.has(addrIp)) {
+ temp.delete(addrIp);
+ } else {
+ temp.add(addrIp);
+ }
+ setFieldValue('dns.ip', Array.from(temp.values()));
+ }}/>
+
+ ))}
+
+
+ );
+ })}
+
+ );
+
+ return (
+
+
+ {intl.getMessage('install_dns_server_title')}
+
+
+ {intl.getMessage('install_dns_server_desc')}
+
+
+ {intl.getMessage('install_dns_server_network_interfaces')}
+
+
+ {intl.getMessage('install_dns_server_network_interfaces_desc')}
+
+
+ { radioValue !== NETWORK_OPTIONS.ALL && getManualBlock()}
+
+ {intl.getMessage('install_dns_server_port')}
+
+
+ {intl.getMessage('install_dns_server_port_desc')}
+
+
{
+ const port = v === '' ? '' : parseInt(v, 10);
+ setFieldValue('dns.port', port);
+ }}
+ />
+
+
+ );
+});
+
+export default DnsServer;
diff --git a/client2/src/components/Install/components/DnsServer/index.ts b/client2/src/components/Install/components/DnsServer/index.ts
new file mode 100644
index 00000000..95d67c54
--- /dev/null
+++ b/client2/src/components/Install/components/DnsServer/index.ts
@@ -0,0 +1 @@
+export { default } from './DnsServer';
diff --git a/client2/src/components/Install/components/StepButtons/StepButtons.module.pcss b/client2/src/components/Install/components/StepButtons/StepButtons.module.pcss
new file mode 100644
index 00000000..f443fd2b
--- /dev/null
+++ b/client2/src/components/Install/components/StepButtons/StepButtons.module.pcss
@@ -0,0 +1,8 @@
+.button {
+ margin-top: 48px;
+ width: 190px;
+
+ &.inGroup {
+ margin-right: 24px;
+ }
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/StepButtons/StepButtons.tsx b/client2/src/components/Install/components/StepButtons/StepButtons.tsx
new file mode 100644
index 00000000..ada548a6
--- /dev/null
+++ b/client2/src/components/Install/components/StepButtons/StepButtons.tsx
@@ -0,0 +1,45 @@
+import React, { FC, useContext } from 'react';
+import { Button } from 'antd';
+import cn from 'classnames';
+import { observer } from 'mobx-react-lite';
+import { FormikHelpers } from 'formik';
+
+import Store from 'Store/installStore';
+
+import { FormValues } from '../../Install';
+import s from './StepButtons.module.pcss';
+
+interface StepButtonsProps {
+ setFieldValue: FormikHelpers['setFieldValue'];
+ currentStep: number;
+ values: FormValues;
+}
+
+const StepButtons: FC = observer(({
+ setFieldValue,
+ currentStep,
+}) => {
+ const { ui: { intl } } = useContext(Store);
+ return (
+
+ setFieldValue('step', currentStep - 1)}
+ >
+ {intl.getMessage('back')}
+
+
+ {intl.getMessage('next')}
+
+
+ );
+});
+
+export default StepButtons;
diff --git a/client2/src/components/Install/components/StepButtons/index.ts b/client2/src/components/Install/components/StepButtons/index.ts
new file mode 100644
index 00000000..a4875a80
--- /dev/null
+++ b/client2/src/components/Install/components/StepButtons/index.ts
@@ -0,0 +1 @@
+export { default } from './StepButtons';
diff --git a/client2/src/components/Install/components/Stepper/Stepper.module.pcss b/client2/src/components/Install/components/Stepper/Stepper.module.pcss
new file mode 100644
index 00000000..c50ba055
--- /dev/null
+++ b/client2/src/components/Install/components/Stepper/Stepper.module.pcss
@@ -0,0 +1,3 @@
+.stepper {
+ margin-bottom: 48px;
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/Stepper/Stepper.tsx b/client2/src/components/Install/components/Stepper/Stepper.tsx
new file mode 100644
index 00000000..060aa4e3
--- /dev/null
+++ b/client2/src/components/Install/components/Stepper/Stepper.tsx
@@ -0,0 +1,24 @@
+import React, { FC } from 'react';
+import { Steps } from 'antd';
+
+import s from './Stepper.module.pcss';
+
+interface StepperProps {
+ currentStep: number;
+}
+
+const { Step } = Steps;
+
+const Stepper: FC = ({ currentStep }) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default Stepper;
diff --git a/client2/src/components/Install/components/Stepper/index.ts b/client2/src/components/Install/components/Stepper/index.ts
new file mode 100644
index 00000000..2fb2a1bd
--- /dev/null
+++ b/client2/src/components/Install/components/Stepper/index.ts
@@ -0,0 +1 @@
+export { default } from './Stepper';
diff --git a/client2/src/components/Install/components/Welcome/Welcome.module.pcss b/client2/src/components/Install/components/Welcome/Welcome.module.pcss
new file mode 100644
index 00000000..37a5824f
--- /dev/null
+++ b/client2/src/components/Install/components/Welcome/Welcome.module.pcss
@@ -0,0 +1,15 @@
+.iconContainer{
+ margin-bottom: 48px;
+}
+.icon {
+ width: 185px;
+ height: 57px;
+}
+.button {
+ margin-top: 48px;
+ width: 190px;
+
+ &.inGroup {
+ margin-right: 24px;
+ }
+}
\ No newline at end of file
diff --git a/client2/src/components/Install/components/Welcome/Welcome.tsx b/client2/src/components/Install/components/Welcome/Welcome.tsx
new file mode 100644
index 00000000..cd876465
--- /dev/null
+++ b/client2/src/components/Install/components/Welcome/Welcome.tsx
@@ -0,0 +1,40 @@
+import React, { FC, useContext } from 'react';
+import { Button } from 'antd';
+import { observer } from 'mobx-react-lite';
+
+import Store from 'Store/installStore';
+import Icon from 'Common/ui/Icon';
+import theme from 'Lib/theme';
+
+import s from './Welcome.module.pcss';
+
+interface WelcomeProps {
+ onNext: () => void;
+}
+
+const Welcome: FC = observer(({ onNext }) => {
+ const { ui: { intl } } = useContext(Store);
+ return (
+
+
+
+
+
+ {intl.getMessage('install_wellcome_title')}
+
+
+ {intl.getMessage('install_wellcome_desc')}
+
+
+ {intl.getMessage('install_wellcome_button')}
+
+
+ );
+});
+
+export default Welcome;
diff --git a/client2/src/components/Install/components/Welcome/index.ts b/client2/src/components/Install/components/Welcome/index.ts
new file mode 100644
index 00000000..7cc4be19
--- /dev/null
+++ b/client2/src/components/Install/components/Welcome/index.ts
@@ -0,0 +1 @@
+export { default } from './Welcome';
diff --git a/client2/src/components/Install/index.ts b/client2/src/components/Install/index.ts
new file mode 100644
index 00000000..6808555d
--- /dev/null
+++ b/client2/src/components/Install/index.ts
@@ -0,0 +1 @@
+export { default } from './Install';
diff --git a/client2/src/components/common/controls/Input/Input.tsx b/client2/src/components/common/controls/Input/Input.tsx
new file mode 100644
index 00000000..2b7503bb
--- /dev/null
+++ b/client2/src/components/common/controls/Input/Input.tsx
@@ -0,0 +1,146 @@
+import React, { FC, FocusEvent, KeyboardEvent, ClipboardEvent, ChangeEvent, useState } from 'react';
+import { Input as InputControl } from 'antd';
+import { InputProps as InputControlProps } from 'antd/lib/input';
+import cn from 'classnames';
+
+import { Icon } from 'Common/ui';
+import theme from 'Lib/theme';
+
+interface AdminInterfaceProps {
+ autoComplete?: InputControlProps['autoComplete'];
+ autoFocus?: InputControlProps['autoFocus'];
+ className?: string;
+ description?: string;
+ disabled?: boolean;
+ error?: boolean;
+ id?: string;
+ inputMode?: InputControlProps['inputMode'];
+ label?: string;
+ wrapperClassName?: string;
+ name: string;
+ onBlur?: (e: FocusEvent) => void;
+ onChange?: (data: string, e?: ChangeEvent) => void;
+ onFocus?: (e: FocusEvent) => void;
+ onKeyDown?: (e: KeyboardEvent) => void;
+ onPaste?: (e: ClipboardEvent) => void;
+ pattern?: InputControlProps['pattern'];
+ placeholder: string;
+ prefix?: InputControlProps['prefix'];
+ size?: InputControlProps['size'];
+ suffix?: InputControlProps['suffix'];
+ type: InputControlProps['type'];
+ value: string | number;
+}
+
+const InputComponent: FC = ({
+ autoComplete,
+ autoFocus,
+ className,
+ description,
+ disabled,
+ error,
+ id,
+ inputMode,
+ label,
+ wrapperClassName,
+ name,
+ onBlur,
+ onChange,
+ onFocus,
+ onKeyDown,
+ onPaste,
+ pattern,
+ placeholder,
+ prefix,
+ size = 'middle',
+ suffix,
+ type,
+ value,
+}) => {
+ const [inputType, setInputType] = useState(type);
+
+ const inputClass = cn(
+ 'input',
+ { input_big: size === 'large' },
+ { input_medium: size === 'middle' },
+ { input_small: size === 'small' },
+ className,
+ );
+
+ const handleBlur = (e: FocusEvent) => {
+ if (onBlur) {
+ onBlur(e);
+ }
+ };
+
+ const showPassword = () => {
+ if (inputType === 'password') {
+ setInputType('text');
+ } else {
+ setInputType('password');
+ }
+ };
+
+ const showPasswordIcon = () => {
+ const icon = inputType === 'password' ? 'visibility_disable' : 'visibility_enable';
+ return (
+
+ );
+ };
+
+ const validSuffix = (
+ <>
+ {!!suffix && suffix}
+ {(type === 'password') && showPasswordIcon()}
+ >
+ );
+
+ let descriptionView = null;
+ if (description) {
+ descriptionView = (
+
+ {description}
+
+ );
+ }
+
+ return (
+
+ {label && (
+
+ {label}
+
+ )}
+ onChange && onChange(e.target.value ? e.target.value : '', e)}
+ onFocus={onFocus}
+ onKeyDown={onKeyDown}
+ onPaste={onPaste}
+ pattern={pattern}
+ placeholder={placeholder}
+ prefix={prefix}
+ size="large"
+ suffix={validSuffix}
+ type={inputType}
+ value={value}
+ data-error={error}
+ />
+ {descriptionView}
+
+ );
+};
+
+export default InputComponent;
diff --git a/client2/src/components/common/controls/Input/index.ts b/client2/src/components/common/controls/Input/index.ts
new file mode 100644
index 00000000..b4d38647
--- /dev/null
+++ b/client2/src/components/common/controls/Input/index.ts
@@ -0,0 +1 @@
+export { default as Input } from './Input';
diff --git a/client2/src/components/common/controls/Radio/Radio.module.pcss b/client2/src/components/common/controls/Radio/Radio.module.pcss
new file mode 100644
index 00000000..50c4a8a9
--- /dev/null
+++ b/client2/src/components/common/controls/Radio/Radio.module.pcss
@@ -0,0 +1,16 @@
+.group {
+ width: 100%;
+}
+
+.radio {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ padding-bottom: 16px;
+ width: 100%;
+ border-bottom: 1px solid var(--gray300);
+
+ &:last-child {
+ border-bottom: 0;
+ }
+}
\ No newline at end of file
diff --git a/client2/src/components/common/controls/Radio/Radio.tsx b/client2/src/components/common/controls/Radio/Radio.tsx
new file mode 100644
index 00000000..dfb1586b
--- /dev/null
+++ b/client2/src/components/common/controls/Radio/Radio.tsx
@@ -0,0 +1,57 @@
+import React, { FC } from 'react';
+import { Radio } from 'antd';
+import { observer } from 'mobx-react-lite';
+
+import theme from 'Lib/theme';
+
+import s from './Radio.module.pcss';
+
+const { Group } = Radio;
+
+interface AdminInterfaceProps {
+ options: {
+ label: string;
+ desc?: string;
+ value: string | number;
+ }[];
+ onSelect: (value: string | number) => void;
+ value: string | number;
+}
+
+const RadioComponent: FC = observer(({
+ options, onSelect, value,
+}) => {
+ if (options.length === 0) {
+ return null;
+ }
+
+ return (
+ {
+ onSelect(e.target.value);
+ }}
+ className={s.group}
+ >
+ {options.map((o) => (
+
+
+ {o.label}
+
+ {o.desc && (
+
+ {o.desc}
+
+ )}
+
+ ))}
+
+
+ );
+});
+
+export default RadioComponent;
diff --git a/client2/src/components/common/controls/Radio/index.ts b/client2/src/components/common/controls/Radio/index.ts
new file mode 100644
index 00000000..61c95671
--- /dev/null
+++ b/client2/src/components/common/controls/Radio/index.ts
@@ -0,0 +1 @@
+export { default } from './Radio';
diff --git a/client2/src/components/common/controls/Switch/Switch.tsx b/client2/src/components/common/controls/Switch/Switch.tsx
new file mode 100644
index 00000000..bb762eec
--- /dev/null
+++ b/client2/src/components/common/controls/Switch/Switch.tsx
@@ -0,0 +1,3 @@
+import { Switch as SwitchE } from 'antd';
+
+export default SwitchE;
diff --git a/client2/src/components/common/controls/Switch/index.ts b/client2/src/components/common/controls/Switch/index.ts
new file mode 100644
index 00000000..4f1eea55
--- /dev/null
+++ b/client2/src/components/common/controls/Switch/index.ts
@@ -0,0 +1 @@
+export { default as Switch } from './Switch';
diff --git a/client2/src/components/common/controls/index.ts b/client2/src/components/common/controls/index.ts
new file mode 100644
index 00000000..6ff1fe13
--- /dev/null
+++ b/client2/src/components/common/controls/index.ts
@@ -0,0 +1,3 @@
+export { default as Radio } from './Radio';
+export { Input } from './Input';
+export { Switch } from './Switch';
diff --git a/client2/src/components/common/formating/danger.tsx b/client2/src/components/common/formating/danger.tsx
new file mode 100644
index 00000000..60e9cc7e
--- /dev/null
+++ b/client2/src/components/common/formating/danger.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import theme from 'Lib/theme';
+
+const danger = (e: string) => {
+ return (
+
+ {e}
+
+ );
+};
+
+export default danger;
diff --git a/client2/src/components/common/formating/index.ts b/client2/src/components/common/formating/index.ts
new file mode 100644
index 00000000..6bed9429
--- /dev/null
+++ b/client2/src/components/common/formating/index.ts
@@ -0,0 +1,2 @@
+export { default as danger } from './danger';
+export { default as p } from './p';
diff --git a/client2/src/components/common/formating/p.tsx b/client2/src/components/common/formating/p.tsx
new file mode 100644
index 00000000..68b39915
--- /dev/null
+++ b/client2/src/components/common/formating/p.tsx
@@ -0,0 +1,11 @@
+import React from 'react';
+
+const danger = (e: string) => {
+ return (
+
+ {e}
+
+ );
+};
+
+export default danger;
diff --git a/client2/src/components/common/index.ts b/client2/src/components/common/index.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/client2/src/components/common/ui/Icon/Icon.module.pcss b/client2/src/components/common/ui/Icon/Icon.module.pcss
new file mode 100644
index 00000000..a935fe21
--- /dev/null
+++ b/client2/src/components/common/ui/Icon/Icon.module.pcss
@@ -0,0 +1,7 @@
+.icon {
+ display: inline-block;
+ vertical-align: middle;
+ width: 24px;
+ height: 24px;
+ flex-shrink: 0;
+}
diff --git a/client2/src/components/common/ui/Icon/Icon.tsx b/client2/src/components/common/ui/Icon/Icon.tsx
new file mode 100644
index 00000000..55f5b027
--- /dev/null
+++ b/client2/src/components/common/ui/Icon/Icon.tsx
@@ -0,0 +1,25 @@
+import React, { FC } from 'react';
+import cn from 'classnames';
+import { IconType } from 'Lib/theme/Icons';
+
+import s from './Icon.module.pcss';
+
+interface IconProps {
+ icon: IconType;
+ color?: string;
+ className?: string;
+ onClick?: () => void;
+}
+
+const Icon: FC = ({ icon, color, className, onClick }) => {
+ const iconClass = cn(s.icon, color, className);
+
+ return (
+
+
+
+ );
+};
+
+export default Icon;
+export { IconType } from 'Lib/theme/Icons';
diff --git a/client2/src/components/common/ui/Icon/index.ts b/client2/src/components/common/ui/Icon/index.ts
new file mode 100644
index 00000000..c1c8457b
--- /dev/null
+++ b/client2/src/components/common/ui/Icon/index.ts
@@ -0,0 +1 @@
+export { default, IconType } from './Icon';
diff --git a/client2/src/components/common/ui/Notifications/index.ts b/client2/src/components/common/ui/Notifications/index.ts
new file mode 100644
index 00000000..69c284eb
--- /dev/null
+++ b/client2/src/components/common/ui/Notifications/index.ts
@@ -0,0 +1 @@
+export { notifyError, notifySuccess } from './notifications';
diff --git a/client2/src/components/common/ui/Notifications/notifications.tsx b/client2/src/components/common/ui/Notifications/notifications.tsx
new file mode 100644
index 00000000..6a5da09b
--- /dev/null
+++ b/client2/src/components/common/ui/Notifications/notifications.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { notification } from 'antd';
+
+import { DEFAULT_NOTIFICATION_DURATION } from 'Consts/common';
+
+export const notifySuccess = (title: string, code?: string) => {
+ notification.success({
+ message: (
+
+ {title}
+
+ ),
+ placement: 'bottomRight',
+ duration: DEFAULT_NOTIFICATION_DURATION,
+ className: 'notification',
+ });
+};
+
+export const notifyError = (
+ title: string,
+ options?: {
+ btn?: React.ReactNode;
+ duration?: number;
+ onClose?: () => void;
+ },
+) => {
+ const { btn, duration, onClose } = options || {};
+ notification.error({
+ onClose,
+ message: (
+
+ {title}
+
+ ),
+ placement: 'bottomRight',
+ duration: typeof duration === 'number' ? duration : DEFAULT_NOTIFICATION_DURATION,
+ className: 'notification',
+ btn,
+ });
+};
diff --git a/client2/src/components/common/ui/index.ts b/client2/src/components/common/ui/index.ts
new file mode 100644
index 00000000..f725111d
--- /dev/null
+++ b/client2/src/components/common/ui/index.ts
@@ -0,0 +1,2 @@
+export { default as Icon } from './Icon';
+export { notifyError, notifySuccess } from './Notifications';
diff --git a/client2/src/lib/ant/Radio.pcss b/client2/src/lib/ant/Radio.pcss
new file mode 100644
index 00000000..b3937d8d
--- /dev/null
+++ b/client2/src/lib/ant/Radio.pcss
@@ -0,0 +1,15 @@
+.ant-radio {
+ margin-right: 18px;
+}
+
+.ant-radio-inner {
+ width: 20px;
+ height: 20px;
+ background-color: transparent;
+ border-color: var(--gray400);
+
+ &::after {
+ width: 12px;
+ height: 12px;
+ }
+}
\ No newline at end of file
diff --git a/client2/src/lib/ant/Step.pcss b/client2/src/lib/ant/Step.pcss
new file mode 100644
index 00000000..9f6e2044
--- /dev/null
+++ b/client2/src/lib/ant/Step.pcss
@@ -0,0 +1,65 @@
+.ant-steps {
+ display: flex;
+ margin-left: -67px;
+ .ant-steps-item-process {
+ .ant-steps-item-icon {
+ top: -4px;
+ box-sizing: content-box;
+ width: 16px;
+ height: 16px;
+ .ant-steps-icon {
+ background: var(--green400);
+ .ant-steps-icon-dot {
+ background: var(--green400);
+ border: 0;
+ }
+ }
+ }
+ }
+ .ant-steps-item-content {
+ width: 99px;
+ }
+ .ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-tail,
+ .ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-tail,
+ .ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-tail {
+ top: 2px;
+ width: 100%;
+ margin: 0px 0px 0px 70px;
+ padding: 0;
+ &::after {
+ width: calc(100% - 8px);
+ height: 2px;
+ margin-left: 5px;
+ }
+ }
+ .ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-tail::after,
+ .ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-tail::after {
+ background-color: var(--gray400);
+ }
+ .ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-tail::after {
+ background-color: var(--green400);
+ }
+
+ .ant-steps-item-finish {
+ .ant-steps-item-icon {
+ .ant-steps-icon {
+ background: var(--green400);
+ .ant-steps-icon-dot {
+ background: var(--green400);
+ border: 0;
+ }
+ }
+ }
+ }
+ .ant-steps-item-icon {
+ width: 8px;
+ height: 8px;
+ .ant-steps-icon {
+ background: transparent;
+ .ant-steps-icon-dot {
+ background: transparent;
+ border: 2px solid var(--gray400);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/client2/src/lib/ant/ant-overrides.less b/client2/src/lib/ant/ant-overrides.less
new file mode 100644
index 00000000..a07601d9
--- /dev/null
+++ b/client2/src/lib/ant/ant-overrides.less
@@ -0,0 +1,8 @@
+@primary-color: #67b279;
+@success-color: #53d4b1;
+@text-color: #000;
+@link-hover-color: #1332BB;
+@link-active-color: #246FFF;
+
+@font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
+@font-size-base: 14px;
\ No newline at end of file
diff --git a/client2/src/lib/ant/ant.less b/client2/src/lib/ant/ant.less
new file mode 100644
index 00000000..bc24c3bc
--- /dev/null
+++ b/client2/src/lib/ant/ant.less
@@ -0,0 +1,2 @@
+@import '~antd/dist/antd.less';
+@import './ant-overrides.less';
diff --git a/client2/src/lib/ant/index.ts b/client2/src/lib/ant/index.ts
new file mode 100644
index 00000000..9c8a364d
--- /dev/null
+++ b/client2/src/lib/ant/index.ts
@@ -0,0 +1,5 @@
+import './Step.pcss';
+import './Radio.pcss';
+
+const insertStyles = true;
+export default insertStyles;
diff --git a/client2/src/lib/apis/blockedServices.ts b/client2/src/lib/apis/blockedServices.ts
new file mode 100644
index 00000000..381a236d
--- /dev/null
+++ b/client2/src/lib/apis/blockedServices.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class BlockedServicesApi {
+ static async blockedServicesList(): Promise {
+ return await fetch(`/control/blocked_services/list`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async blockedServicesSet(data: string[]): Promise {
+ return await fetch(`/control/blocked_services/set`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(data),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/clients.ts b/client2/src/lib/apis/clients.ts
new file mode 100644
index 00000000..faaf22fb
--- /dev/null
+++ b/client2/src/lib/apis/clients.ts
@@ -0,0 +1,103 @@
+import qs from 'qs';
+import Client, { IClient } from 'Entities/Client';
+import ClientDelete, { IClientDelete } from 'Entities/ClientDelete';
+import ClientUpdate, { IClientUpdate } from 'Entities/ClientUpdate';
+import Clients, { IClients } from 'Entities/Clients';
+import ClientsFindEntry, { IClientsFindEntry } from 'Entities/ClientsFindEntry';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class ClientsApi {
+ static async clientsAdd(client: IClient): Promise {
+ const haveError: string[] = [];
+ const clientValid = new Client(client);
+ haveError.push(...clientValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/clients/add`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(clientValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async clientsDelete(clientdelete: IClientDelete): Promise {
+ const haveError: string[] = [];
+ const clientdeleteValid = new ClientDelete(clientdelete);
+ haveError.push(...clientdeleteValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/clients/delete`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(clientdeleteValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async clientsFind(ip0?: string): Promise {
+ const queryParams = {
+ ip0: ip0,
+ }
+ return await fetch(`/control/clients/find?${qs.stringify(queryParams, { arrayFormat: 'comma' })}`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async clientsStatus(): Promise {
+ return await fetch(`/control/clients`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async clientsUpdate(clientupdate: IClientUpdate): Promise {
+ const haveError: string[] = [];
+ const clientupdateValid = new ClientUpdate(clientupdate);
+ haveError.push(...clientupdateValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/clients/update`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(clientupdateValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/dhcp.ts b/client2/src/lib/apis/dhcp.ts
new file mode 100644
index 00000000..99eef065
--- /dev/null
+++ b/client2/src/lib/apis/dhcp.ts
@@ -0,0 +1,110 @@
+import DhcpConfig, { IDhcpConfig } from 'Entities/DhcpConfig';
+import DhcpSearchResult, { IDhcpSearchResult } from 'Entities/DhcpSearchResult';
+import DhcpStaticLease, { IDhcpStaticLease } from 'Entities/DhcpStaticLease';
+import DhcpStatus, { IDhcpStatus } from 'Entities/DhcpStatus';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class DhcpApi {
+ static async checkActiveDhcp(): Promise {
+ return await fetch(`/control/dhcp/find_active_dhcp`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dhcpAddStaticLease(dhcpstaticlease: IDhcpStaticLease): Promise {
+ const haveError: string[] = [];
+ const dhcpstaticleaseValid = new DhcpStaticLease(dhcpstaticlease);
+ haveError.push(...dhcpstaticleaseValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/dhcp/add_static_lease`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(dhcpstaticleaseValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dhcpRemoveStaticLease(dhcpstaticlease: IDhcpStaticLease): Promise {
+ const haveError: string[] = [];
+ const dhcpstaticleaseValid = new DhcpStaticLease(dhcpstaticlease);
+ haveError.push(...dhcpstaticleaseValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/dhcp/remove_static_lease`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(dhcpstaticleaseValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dhcpReset(): Promise {
+ return await fetch(`/control/dhcp/reset`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dhcpSetConfig(dhcpconfig: IDhcpConfig): Promise {
+ const haveError: string[] = [];
+ const dhcpconfigValid = new DhcpConfig(dhcpconfig);
+ haveError.push(...dhcpconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/dhcp/set_config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(dhcpconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dhcpStatus(): Promise {
+ return await fetch(`/control/dhcp/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/filtering.ts b/client2/src/lib/apis/filtering.ts
new file mode 100644
index 00000000..cdaf1e91
--- /dev/null
+++ b/client2/src/lib/apis/filtering.ts
@@ -0,0 +1,167 @@
+import qs from 'qs';
+import AddUrlRequest, { IAddUrlRequest } from 'Entities/AddUrlRequest';
+import FilterCheckHostResponse, { IFilterCheckHostResponse } from 'Entities/FilterCheckHostResponse';
+import FilterConfig, { IFilterConfig } from 'Entities/FilterConfig';
+import FilterRefreshRequest, { IFilterRefreshRequest } from 'Entities/FilterRefreshRequest';
+import FilterRefreshResponse, { IFilterRefreshResponse } from 'Entities/FilterRefreshResponse';
+import FilterSetUrl, { IFilterSetUrl } from 'Entities/FilterSetUrl';
+import FilterStatus, { IFilterStatus } from 'Entities/FilterStatus';
+import RemoveUrlRequest, { IRemoveUrlRequest } from 'Entities/RemoveUrlRequest';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class FilteringApi {
+ static async filteringAddURL(addurlrequest: IAddUrlRequest): Promise {
+ const haveError: string[] = [];
+ const addurlrequestValid = new AddUrlRequest(addurlrequest);
+ haveError.push(...addurlrequestValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/filtering/add_url`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(addurlrequestValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringCheckHost(name?: string): Promise {
+ const queryParams = {
+ name: name,
+ }
+ return await fetch(`/control/filtering/check_host?${qs.stringify(queryParams, { arrayFormat: 'comma' })}`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringConfig(filterconfig: IFilterConfig): Promise {
+ const haveError: string[] = [];
+ const filterconfigValid = new FilterConfig(filterconfig);
+ haveError.push(...filterconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/filtering/config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(filterconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringRefresh(filterrefreshrequest: IFilterRefreshRequest): Promise {
+ const haveError: string[] = [];
+ const filterrefreshrequestValid = new FilterRefreshRequest(filterrefreshrequest);
+ haveError.push(...filterrefreshrequestValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/filtering/refresh`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(filterrefreshrequestValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringRemoveURL(removeurlrequest: IRemoveUrlRequest): Promise {
+ const haveError: string[] = [];
+ const removeurlrequestValid = new RemoveUrlRequest(removeurlrequest);
+ haveError.push(...removeurlrequestValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/filtering/remove_url`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(removeurlrequestValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringSetRules(data: string): Promise {
+ const params = String(data);
+ return await fetch(`/control/filtering/set_rules`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'text/plain',
+ },
+ body: params,
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringSetURL(filterseturl: IFilterSetUrl): Promise {
+ const haveError: string[] = [];
+ const filterseturlValid = new FilterSetUrl(filterseturl);
+ haveError.push(...filterseturlValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/filtering/set_url`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(filterseturlValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async filteringStatus(): Promise {
+ return await fetch(`/control/filtering/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/global.ts b/client2/src/lib/apis/global.ts
new file mode 100644
index 00000000..d66e7139
--- /dev/null
+++ b/client2/src/lib/apis/global.ts
@@ -0,0 +1,160 @@
+import DNSConfig, { IDNSConfig } from 'Entities/DNSConfig';
+import GetVersionRequest, { IGetVersionRequest } from 'Entities/GetVersionRequest';
+import Login, { ILogin } from 'Entities/Login';
+import ProfileInfo, { IProfileInfo } from 'Entities/ProfileInfo';
+import ServerStatus, { IServerStatus } from 'Entities/ServerStatus';
+import UpstreamsConfig, { IUpstreamsConfig } from 'Entities/UpstreamsConfig';
+import UpstreamsConfigResponse, { IUpstreamsConfigResponse } from 'Entities/UpstreamsConfigResponse';
+import VersionInfo, { IVersionInfo } from 'Entities/VersionInfo';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class GlobalApi {
+ static async beginUpdate(): Promise {
+ return await fetch(`/control/update`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dnsConfig(dnsconfig: IDNSConfig): Promise {
+ const haveError: string[] = [];
+ const dnsconfigValid = new DNSConfig(dnsconfig);
+ haveError.push(...dnsconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/dns_config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(dnsconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async dnsInfo(): Promise {
+ return await fetch(`/control/dns_info`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async getProfile(): Promise {
+ return await fetch(`/control/profile`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async getVersionJson(getversionrequest: IGetVersionRequest): Promise {
+ const haveError: string[] = [];
+ const getversionrequestValid = new GetVersionRequest(getversionrequest);
+ haveError.push(...getversionrequestValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/version.json`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(getversionrequestValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async login(login: ILogin): Promise {
+ const haveError: string[] = [];
+ const loginValid = new Login(login);
+ haveError.push(...loginValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(loginValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async logout(): Promise {
+ return await fetch(`/control/logout`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async status(): Promise {
+ return await fetch(`/control/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async testUpstreamDNS(upstreamsconfig: IUpstreamsConfig): Promise {
+ const haveError: string[] = [];
+ const upstreamsconfigValid = new UpstreamsConfig(upstreamsconfig);
+ haveError.push(...upstreamsconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/test_upstream_dns`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(upstreamsconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/i18n.ts b/client2/src/lib/apis/i18n.ts
new file mode 100644
index 00000000..045ea104
--- /dev/null
+++ b/client2/src/lib/apis/i18n.ts
@@ -0,0 +1,32 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class I18nApi {
+ static async changeLanguage(data: string): Promise {
+ const params = String(data);
+ return await fetch(`/control/i18n/change_language`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'text/plain',
+ },
+ body: params,
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async currentLanguage(): Promise {
+ return await fetch(`/control/i18n/current_language`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/install.ts b/client2/src/lib/apis/install.ts
new file mode 100644
index 00000000..6de0d230
--- /dev/null
+++ b/client2/src/lib/apis/install.ts
@@ -0,0 +1,123 @@
+import AddressesInfo, { IAddressesInfo } from 'Entities/AddressesInfo';
+import AddressesInfoBeta, { IAddressesInfoBeta } from 'Entities/AddressesInfoBeta';
+import CheckConfigRequest, { ICheckConfigRequest } from 'Entities/CheckConfigRequest';
+import CheckConfigRequestBeta, { ICheckConfigRequestBeta } from 'Entities/CheckConfigRequestBeta';
+import CheckConfigResponse, { ICheckConfigResponse } from 'Entities/CheckConfigResponse';
+import InitialConfiguration, { IInitialConfiguration } from 'Entities/InitialConfiguration';
+import InitialConfigurationBeta, { IInitialConfigurationBeta } from 'Entities/InitialConfigurationBeta';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class InstallApi {
+ static async installCheckConfig(checkconfigrequest: ICheckConfigRequest): Promise {
+ const haveError: string[] = [];
+ const checkconfigrequestValid = new CheckConfigRequest(checkconfigrequest);
+ haveError.push(...checkconfigrequestValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/install/check_config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(checkconfigrequestValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async installCheckConfigBeta(checkconfigrequestbeta: ICheckConfigRequestBeta): Promise {
+ const haveError: string[] = [];
+ const checkconfigrequestbetaValid = new CheckConfigRequestBeta(checkconfigrequestbeta);
+ haveError.push(...checkconfigrequestbetaValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/install/check_config_beta`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(checkconfigrequestbetaValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async installConfigure(initialconfiguration: IInitialConfiguration): Promise {
+ const haveError: string[] = [];
+ const initialconfigurationValid = new InitialConfiguration(initialconfiguration);
+ haveError.push(...initialconfigurationValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/install/configure`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(initialconfigurationValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async installConfigureBeta(initialconfigurationbeta: IInitialConfigurationBeta): Promise {
+ const haveError: string[] = [];
+ const initialconfigurationbetaValid = new InitialConfigurationBeta(initialconfigurationbeta);
+ haveError.push(...initialconfigurationbetaValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/install/configure_beta`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(initialconfigurationbetaValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async installGetAddresses(): Promise {
+ return await fetch(`/control/install/get_addresses`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async installGetAddressesBeta(): Promise {
+ return await fetch(`/control/install/get_addresses_beta`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/log.ts b/client2/src/lib/apis/log.ts
new file mode 100644
index 00000000..f0aa37fb
--- /dev/null
+++ b/client2/src/lib/apis/log.ts
@@ -0,0 +1,72 @@
+import qs from 'qs';
+import QueryLog, { IQueryLog } from 'Entities/QueryLog';
+import QueryLogConfig, { IQueryLogConfig } from 'Entities/QueryLogConfig';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class LogApi {
+ static async queryLog(older_than?: string, offset?: number, limit?: number, search?: string, response_status?: string): Promise {
+ const queryParams = {
+ older_than: older_than,
+ offset: offset,
+ limit: limit,
+ search: search,
+ response_status: response_status,
+ }
+ return await fetch(`/control/querylog?${qs.stringify(queryParams, { arrayFormat: 'comma' })}`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async queryLogConfig(querylogconfig: IQueryLogConfig): Promise {
+ const haveError: string[] = [];
+ const querylogconfigValid = new QueryLogConfig(querylogconfig);
+ haveError.push(...querylogconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/querylog_config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(querylogconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async queryLogInfo(): Promise {
+ return await fetch(`/control/querylog_info`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async querylogClear(): Promise {
+ return await fetch(`/control/querylog_clear`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/mobileconfig.ts b/client2/src/lib/apis/mobileconfig.ts
new file mode 100644
index 00000000..0d4603c6
--- /dev/null
+++ b/client2/src/lib/apis/mobileconfig.ts
@@ -0,0 +1,35 @@
+import qs from 'qs';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class MobileconfigApi {
+ static async mobileConfigDoH(host?: string): Promise {
+ const queryParams = {
+ host: host,
+ }
+ return await fetch(`/control/apple/doh.mobileconfig?${qs.stringify(queryParams, { arrayFormat: 'comma' })}`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async mobileConfigDoT(host?: string): Promise {
+ const queryParams = {
+ host: host,
+ }
+ return await fetch(`/control/apple/dot.mobileconfig?${qs.stringify(queryParams, { arrayFormat: 'comma' })}`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/parental.ts b/client2/src/lib/apis/parental.ts
new file mode 100644
index 00000000..61f693f5
--- /dev/null
+++ b/client2/src/lib/apis/parental.ts
@@ -0,0 +1,44 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class ParentalApi {
+ static async parentalDisable(): Promise {
+ return await fetch(`/control/parental/disable`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async parentalEnable(data: string): Promise {
+ const params = String(data);
+ return await fetch(`/control/parental/enable`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'text/plain',
+ },
+ body: params,
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async parentalStatus(): Promise {
+ return await fetch(`/control/parental/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/rewrite.ts b/client2/src/lib/apis/rewrite.ts
new file mode 100644
index 00000000..eded5c97
--- /dev/null
+++ b/client2/src/lib/apis/rewrite.ts
@@ -0,0 +1,61 @@
+import RewriteEntry, { IRewriteEntry } from 'Entities/RewriteEntry';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class RewriteApi {
+ static async rewriteAdd(rewriteentry: IRewriteEntry): Promise {
+ const haveError: string[] = [];
+ const rewriteentryValid = new RewriteEntry(rewriteentry);
+ haveError.push(...rewriteentryValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/rewrite/add`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(rewriteentryValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async rewriteDelete(rewriteentry: IRewriteEntry): Promise {
+ const haveError: string[] = [];
+ const rewriteentryValid = new RewriteEntry(rewriteentry);
+ haveError.push(...rewriteentryValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/rewrite/delete`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(rewriteentryValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async rewriteList(): Promise {
+ return await fetch(`/control/rewrite/list`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/safebrowsing.ts b/client2/src/lib/apis/safebrowsing.ts
new file mode 100644
index 00000000..9d82a5a1
--- /dev/null
+++ b/client2/src/lib/apis/safebrowsing.ts
@@ -0,0 +1,39 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class SafebrowsingApi {
+ static async safebrowsingDisable(): Promise {
+ return await fetch(`/control/safebrowsing/disable`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async safebrowsingEnable(): Promise {
+ return await fetch(`/control/safebrowsing/enable`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async safebrowsingStatus(): Promise {
+ return await fetch(`/control/safebrowsing/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/safesearch.ts b/client2/src/lib/apis/safesearch.ts
new file mode 100644
index 00000000..e36e79f9
--- /dev/null
+++ b/client2/src/lib/apis/safesearch.ts
@@ -0,0 +1,39 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class SafesearchApi {
+ static async safesearchDisable(): Promise {
+ return await fetch(`/control/safesearch/disable`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async safesearchEnable(): Promise {
+ return await fetch(`/control/safesearch/enable`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async safesearchStatus(): Promise {
+ return await fetch(`/control/safesearch/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/stats.ts b/client2/src/lib/apis/stats.ts
new file mode 100644
index 00000000..630f17c0
--- /dev/null
+++ b/client2/src/lib/apis/stats.ts
@@ -0,0 +1,64 @@
+import Stats, { IStats } from 'Entities/Stats';
+import StatsConfig, { IStatsConfig } from 'Entities/StatsConfig';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class StatsApi {
+ static async stats(): Promise {
+ return await fetch(`/control/stats`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async statsConfig(statsconfig: IStatsConfig): Promise {
+ const haveError: string[] = [];
+ const statsconfigValid = new StatsConfig(statsconfig);
+ haveError.push(...statsconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/stats_config`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(statsconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async statsInfo(): Promise {
+ return await fetch(`/control/stats_info`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async statsReset(): Promise {
+ return await fetch(`/control/stats_reset`, {
+ method: 'POST',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.status;
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/apis/tls.ts b/client2/src/lib/apis/tls.ts
new file mode 100644
index 00000000..c9f064d7
--- /dev/null
+++ b/client2/src/lib/apis/tls.ts
@@ -0,0 +1,61 @@
+import TlsConfig, { ITlsConfig } from 'Entities/TlsConfig';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export default class TlsApi {
+ static async tlsConfigure(tlsconfig: ITlsConfig): Promise {
+ const haveError: string[] = [];
+ const tlsconfigValid = new TlsConfig(tlsconfig);
+ haveError.push(...tlsconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/tls/configure`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(tlsconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async tlsStatus(): Promise {
+ return await fetch(`/control/tls/status`, {
+ method: 'GET',
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+
+ static async tlsValidate(tlsconfig: ITlsConfig): Promise {
+ const haveError: string[] = [];
+ const tlsconfigValid = new TlsConfig(tlsconfig);
+ haveError.push(...tlsconfigValid.validate());
+ if (haveError.length > 0) {
+ return Promise.resolve(haveError);
+ }
+ return await fetch(`/control/tls/validate`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(tlsconfigValid.serialize()),
+ }).then(async (res) => {
+ if (res.status === 200) {
+ return res.json();
+ } else {
+ return new Error(String(res.status));
+ }
+ })
+ }
+}
diff --git a/client2/src/lib/consts/common.ts b/client2/src/lib/consts/common.ts
new file mode 100644
index 00000000..77ad1796
--- /dev/null
+++ b/client2/src/lib/consts/common.ts
@@ -0,0 +1 @@
+export const DEFAULT_NOTIFICATION_DURATION = 5;
diff --git a/client2/src/lib/consts/forms.ts b/client2/src/lib/consts/forms.ts
new file mode 100644
index 00000000..85b4220d
--- /dev/null
+++ b/client2/src/lib/consts/forms.ts
@@ -0,0 +1 @@
+export const EMPTY_FIELD_ERROR = 'empty_field';
diff --git a/client2/src/lib/consts/install.ts b/client2/src/lib/consts/install.ts
new file mode 100644
index 00000000..fcc3904f
--- /dev/null
+++ b/client2/src/lib/consts/install.ts
@@ -0,0 +1,7 @@
+export const DEFAULT_IP_ADDRESS = '0.0.0.0';
+
+export const DEFAULT_IP_PORT = 80;
+
+export const DEFAULT_DNS_ADDRESS = '0.0.0.0';
+
+export const DEFAULT_DNS_PORT = 53;
diff --git a/client2/src/lib/entities/AddUrlRequest.ts b/client2/src/lib/entities/AddUrlRequest.ts
new file mode 100644
index 00000000..076dd4d2
--- /dev/null
+++ b/client2/src/lib/entities/AddUrlRequest.ts
@@ -0,0 +1,78 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IAddUrlRequest {
+ name?: string;
+ url?: string;
+ whitelist?: boolean;
+}
+
+export default class AddUrlRequest {
+ readonly _name: string | undefined;
+
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ readonly _url: string | undefined;
+
+ /**
+ * Description: URL or an absolute path to the file containing filtering rules.
+ *
+ * Example: https://filters.adtidy.org/windows/filters/15.txt
+ */
+ get url(): string | undefined {
+ return this._url;
+ }
+
+ readonly _whitelist: boolean | undefined;
+
+ get whitelist(): boolean | undefined {
+ return this._whitelist;
+ }
+
+ constructor(props: IAddUrlRequest) {
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ if (typeof props.url === 'string') {
+ this._url = props.url.trim();
+ }
+ if (typeof props.whitelist === 'boolean') {
+ this._whitelist = props.whitelist;
+ }
+ }
+
+ serialize(): IAddUrlRequest {
+ const data: IAddUrlRequest = {
+ };
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ if (typeof this._url !== 'undefined') {
+ data.url = this._url;
+ }
+ if (typeof this._whitelist !== 'undefined') {
+ data.whitelist = this._whitelist;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ url: !this._url ? true : typeof this._url === 'string' && !this._url ? true : this._url,
+ whitelist: !this._whitelist ? true : typeof this._whitelist === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): AddUrlRequest {
+ return new AddUrlRequest({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/AddressInfo.ts b/client2/src/lib/entities/AddressInfo.ts
new file mode 100644
index 00000000..1afdecb4
--- /dev/null
+++ b/client2/src/lib/entities/AddressInfo.ts
@@ -0,0 +1,67 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IAddressInfo {
+ ip: string;
+ port: number;
+}
+
+export default class AddressInfo {
+ readonly _ip: string;
+
+ /**
+ * Description: undefined
+ * Example: 127.0.0.1
+ */
+ get ip(): string {
+ return this._ip;
+ }
+
+ static ipValidate(ip: string): boolean {
+ return typeof ip === 'string' && !!ip.trim();
+ }
+
+ readonly _port: number;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get port(): number {
+ return this._port;
+ }
+
+ static portValidate(port: number): boolean {
+ return typeof port === 'number';
+ }
+
+ constructor(props: IAddressInfo) {
+ this._ip = props.ip.trim();
+ this._port = props.port;
+ }
+
+ serialize(): IAddressInfo {
+ const data: IAddressInfo = {
+ ip: this._ip,
+ port: this._port,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ port: typeof this._port === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): AddressInfo {
+ return new AddressInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/AddressInfoBeta.ts b/client2/src/lib/entities/AddressInfoBeta.ts
new file mode 100644
index 00000000..8b5073a3
--- /dev/null
+++ b/client2/src/lib/entities/AddressInfoBeta.ts
@@ -0,0 +1,71 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IAddressInfoBeta {
+ ip: string[];
+ port: number;
+}
+
+export default class AddressInfoBeta {
+ readonly _ip: string[];
+
+ /**
+ * Description: undefined
+ * Example: 127.0.0.1
+ */
+ get ip(): string[] {
+ return this._ip;
+ }
+
+ static get ipMinItems() {
+ return 1;
+ }
+
+ static ipValidate(ip: string[]): boolean {
+ return ip.reduce((result, p) => result && (typeof p === 'string' && !!p.trim()), true);
+ }
+
+ readonly _port: number;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get port(): number {
+ return this._port;
+ }
+
+ static portValidate(port: number): boolean {
+ return typeof port === 'number';
+ }
+
+ constructor(props: IAddressInfoBeta) {
+ this._ip = props.ip;
+ this._port = props.port;
+ }
+
+ serialize(): IAddressInfoBeta {
+ const data: IAddressInfoBeta = {
+ ip: this._ip,
+ port: this._port,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: this._ip.reduce((result, p) => result && typeof p === 'string', true),
+ port: typeof this._port === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): AddressInfoBeta {
+ return new AddressInfoBeta({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/AddressesInfo.ts b/client2/src/lib/entities/AddressesInfo.ts
new file mode 100644
index 00000000..dc814eeb
--- /dev/null
+++ b/client2/src/lib/entities/AddressesInfo.ts
@@ -0,0 +1,81 @@
+import NetInterface, { INetInterface } from './NetInterface';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IAddressesInfo {
+ dns_port: number;
+ interfaces: { [key: string]: INetInterface };
+ web_port: number;
+}
+
+export default class AddressesInfo {
+ readonly _dns_port: number;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get dnsPort(): number {
+ return this._dns_port;
+ }
+
+ static dnsPortValidate(dnsPort: number): boolean {
+ return typeof dnsPort === 'number';
+ }
+
+ readonly _interfaces: { [key: string]: NetInterface };
+
+ /** */
+ get interfaces(): { [key: string]: NetInterface } {
+ return this._interfaces;
+ }
+
+ readonly _web_port: number;
+
+ /**
+ * Description: undefined
+ * Example: 80
+ */
+ get webPort(): number {
+ return this._web_port;
+ }
+
+ static webPortValidate(webPort: number): boolean {
+ return typeof webPort === 'number';
+ }
+
+ constructor(props: IAddressesInfo) {
+ this._dns_port = props.dns_port;
+ this._interfaces = Object.keys(props.interfaces).reduce((prev, key) => {
+ return { ...prev, [key]: new NetInterface(props.interfaces[key])};
+ },{})
+ this._web_port = props.web_port;
+ }
+
+ serialize(): IAddressesInfo {
+ const data: IAddressesInfo = {
+ dns_port: this._dns_port,
+ interfaces: Object.keys(this._interfaces).reduce>((prev, key) => ({ ...prev, [key]: this._interfaces[key].serialize() }), {}),
+ web_port: this._web_port,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns_port: typeof this._dns_port === 'number',
+ web_port: typeof this._web_port === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): AddressesInfo {
+ return new AddressesInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/AddressesInfoBeta.ts b/client2/src/lib/entities/AddressesInfoBeta.ts
new file mode 100644
index 00000000..603adafe
--- /dev/null
+++ b/client2/src/lib/entities/AddressesInfoBeta.ts
@@ -0,0 +1,80 @@
+import NetInterface, { INetInterface } from './NetInterface';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IAddressesInfoBeta {
+ dns_port: number;
+ interfaces: INetInterface[];
+ web_port: number;
+}
+
+export default class AddressesInfoBeta {
+ readonly _dns_port: number;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get dnsPort(): number {
+ return this._dns_port;
+ }
+
+ static dnsPortValidate(dnsPort: number): boolean {
+ return typeof dnsPort === 'number';
+ }
+
+ readonly _interfaces: NetInterface[];
+
+ /** */
+ get interfaces(): NetInterface[] {
+ return this._interfaces;
+ }
+
+ readonly _web_port: number;
+
+ /**
+ * Description: undefined
+ * Example: 80
+ */
+ get webPort(): number {
+ return this._web_port;
+ }
+
+ static webPortValidate(webPort: number): boolean {
+ return typeof webPort === 'number';
+ }
+
+ constructor(props: IAddressesInfoBeta) {
+ this._dns_port = props.dns_port;
+ this._interfaces = props.interfaces.map((p) => new NetInterface(p));
+ this._web_port = props.web_port;
+ }
+
+ serialize(): IAddressesInfoBeta {
+ const data: IAddressesInfoBeta = {
+ dns_port: this._dns_port,
+ interfaces: this._interfaces.map((p) => p.serialize()),
+ web_port: this._web_port,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns_port: typeof this._dns_port === 'number',
+ web_port: typeof this._web_port === 'number',
+ interfaces: this._interfaces.reduce((result, p) => result && p.validate().length === 0, true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): AddressesInfoBeta {
+ return new AddressesInfoBeta({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/BlockedServicesArray.ts b/client2/src/lib/entities/BlockedServicesArray.ts
new file mode 100644
index 00000000..6c175abe
--- /dev/null
+++ b/client2/src/lib/entities/BlockedServicesArray.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IBlockedServicesArray {
+}
+
+export default class BlockedServicesArray {
+ constructor(props: IBlockedServicesArray) {
+ }
+
+ serialize(): IBlockedServicesArray {
+ const data: IBlockedServicesArray = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): BlockedServicesArray {
+ return new BlockedServicesArray({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigRequest.ts b/client2/src/lib/entities/CheckConfigRequest.ts
new file mode 100644
index 00000000..dba0f741
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigRequest.ts
@@ -0,0 +1,75 @@
+import CheckConfigRequestInfo, { ICheckConfigRequestInfo } from './CheckConfigRequestInfo';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigRequest {
+ dns?: ICheckConfigRequestInfo;
+ set_static_ip?: boolean;
+ web?: ICheckConfigRequestInfo;
+}
+
+export default class CheckConfigRequest {
+ readonly _dns: CheckConfigRequestInfo | undefined;
+
+ get dns(): CheckConfigRequestInfo | undefined {
+ return this._dns;
+ }
+
+ readonly _set_static_ip: boolean | undefined;
+
+ get setStaticIp(): boolean | undefined {
+ return this._set_static_ip;
+ }
+
+ readonly _web: CheckConfigRequestInfo | undefined;
+
+ get web(): CheckConfigRequestInfo | undefined {
+ return this._web;
+ }
+
+ constructor(props: ICheckConfigRequest) {
+ if (props.dns) {
+ this._dns = new CheckConfigRequestInfo(props.dns);
+ }
+ if (typeof props.set_static_ip === 'boolean') {
+ this._set_static_ip = props.set_static_ip;
+ }
+ if (props.web) {
+ this._web = new CheckConfigRequestInfo(props.web);
+ }
+ }
+
+ serialize(): ICheckConfigRequest {
+ const data: ICheckConfigRequest = {
+ };
+ if (typeof this._dns !== 'undefined') {
+ data.dns = this._dns.serialize();
+ }
+ if (typeof this._set_static_ip !== 'undefined') {
+ data.set_static_ip = this._set_static_ip;
+ }
+ if (typeof this._web !== 'undefined') {
+ data.web = this._web.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns: !this._dns ? true : this._dns.validate().length === 0,
+ web: !this._web ? true : this._web.validate().length === 0,
+ set_static_ip: !this._set_static_ip ? true : typeof this._set_static_ip === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigRequest {
+ return new CheckConfigRequest({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigRequestBeta.ts b/client2/src/lib/entities/CheckConfigRequestBeta.ts
new file mode 100644
index 00000000..b34c855f
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigRequestBeta.ts
@@ -0,0 +1,75 @@
+import CheckConfigRequestInfoBeta, { ICheckConfigRequestInfoBeta } from './CheckConfigRequestInfoBeta';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigRequestBeta {
+ dns?: ICheckConfigRequestInfoBeta;
+ set_static_ip?: boolean;
+ web?: ICheckConfigRequestInfoBeta;
+}
+
+export default class CheckConfigRequestBeta {
+ readonly _dns: CheckConfigRequestInfoBeta | undefined;
+
+ get dns(): CheckConfigRequestInfoBeta | undefined {
+ return this._dns;
+ }
+
+ readonly _set_static_ip: boolean | undefined;
+
+ get setStaticIp(): boolean | undefined {
+ return this._set_static_ip;
+ }
+
+ readonly _web: CheckConfigRequestInfoBeta | undefined;
+
+ get web(): CheckConfigRequestInfoBeta | undefined {
+ return this._web;
+ }
+
+ constructor(props: ICheckConfigRequestBeta) {
+ if (props.dns) {
+ this._dns = new CheckConfigRequestInfoBeta(props.dns);
+ }
+ if (typeof props.set_static_ip === 'boolean') {
+ this._set_static_ip = props.set_static_ip;
+ }
+ if (props.web) {
+ this._web = new CheckConfigRequestInfoBeta(props.web);
+ }
+ }
+
+ serialize(): ICheckConfigRequestBeta {
+ const data: ICheckConfigRequestBeta = {
+ };
+ if (typeof this._dns !== 'undefined') {
+ data.dns = this._dns.serialize();
+ }
+ if (typeof this._set_static_ip !== 'undefined') {
+ data.set_static_ip = this._set_static_ip;
+ }
+ if (typeof this._web !== 'undefined') {
+ data.web = this._web.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns: !this._dns ? true : this._dns.validate().length === 0,
+ web: !this._web ? true : this._web.validate().length === 0,
+ set_static_ip: !this._set_static_ip ? true : typeof this._set_static_ip === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigRequestBeta {
+ return new CheckConfigRequestBeta({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigRequestInfo.ts b/client2/src/lib/entities/CheckConfigRequestInfo.ts
new file mode 100644
index 00000000..c8da0cf3
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigRequestInfo.ts
@@ -0,0 +1,81 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigRequestInfo {
+ autofix?: boolean;
+ ip?: string;
+ port?: number;
+}
+
+export default class CheckConfigRequestInfo {
+ readonly _autofix: boolean | undefined;
+
+ get autofix(): boolean | undefined {
+ return this._autofix;
+ }
+
+ readonly _ip: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 127.0.0.1
+ */
+ get ip(): string | undefined {
+ return this._ip;
+ }
+
+ readonly _port: number | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get port(): number | undefined {
+ return this._port;
+ }
+
+ constructor(props: ICheckConfigRequestInfo) {
+ if (typeof props.autofix === 'boolean') {
+ this._autofix = props.autofix;
+ }
+ if (typeof props.ip === 'string') {
+ this._ip = props.ip.trim();
+ }
+ if (typeof props.port === 'number') {
+ this._port = props.port;
+ }
+ }
+
+ serialize(): ICheckConfigRequestInfo {
+ const data: ICheckConfigRequestInfo = {
+ };
+ if (typeof this._autofix !== 'undefined') {
+ data.autofix = this._autofix;
+ }
+ if (typeof this._ip !== 'undefined') {
+ data.ip = this._ip;
+ }
+ if (typeof this._port !== 'undefined') {
+ data.port = this._port;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: !this._ip ? true : typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ port: !this._port ? true : typeof this._port === 'number',
+ autofix: !this._autofix ? true : typeof this._autofix === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigRequestInfo {
+ return new CheckConfigRequestInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigRequestInfoBeta.ts b/client2/src/lib/entities/CheckConfigRequestInfoBeta.ts
new file mode 100644
index 00000000..d086e771
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigRequestInfoBeta.ts
@@ -0,0 +1,85 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigRequestInfoBeta {
+ autofix?: boolean;
+ ip?: string[];
+ port?: number;
+}
+
+export default class CheckConfigRequestInfoBeta {
+ readonly _autofix: boolean | undefined;
+
+ get autofix(): boolean | undefined {
+ return this._autofix;
+ }
+
+ readonly _ip: string[] | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 127.0.0.1
+ */
+ get ip(): string[] | undefined {
+ return this._ip;
+ }
+
+ static get ipMinItems() {
+ return 1;
+ }
+
+ readonly _port: number | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get port(): number | undefined {
+ return this._port;
+ }
+
+ constructor(props: ICheckConfigRequestInfoBeta) {
+ if (typeof props.autofix === 'boolean') {
+ this._autofix = props.autofix;
+ }
+ if (props.ip) {
+ this._ip = props.ip;
+ }
+ if (typeof props.port === 'number') {
+ this._port = props.port;
+ }
+ }
+
+ serialize(): ICheckConfigRequestInfoBeta {
+ const data: ICheckConfigRequestInfoBeta = {
+ };
+ if (typeof this._autofix !== 'undefined') {
+ data.autofix = this._autofix;
+ }
+ if (typeof this._ip !== 'undefined') {
+ data.ip = this._ip;
+ }
+ if (typeof this._port !== 'undefined') {
+ data.port = this._port;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: !this._ip ? true : this._ip.reduce((result, p) => result && typeof p === 'string', true),
+ port: !this._port ? true : typeof this._port === 'number',
+ autofix: !this._autofix ? true : typeof this._autofix === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigRequestInfoBeta {
+ return new CheckConfigRequestInfoBeta({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigResponse.ts b/client2/src/lib/entities/CheckConfigResponse.ts
new file mode 100644
index 00000000..74d45519
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigResponse.ts
@@ -0,0 +1,64 @@
+import CheckConfigResponseInfo, { ICheckConfigResponseInfo } from './CheckConfigResponseInfo';
+import CheckConfigStaticIpInfo, { ICheckConfigStaticIpInfo } from './CheckConfigStaticIpInfo';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigResponse {
+ dns: ICheckConfigResponseInfo;
+ static_ip: ICheckConfigStaticIpInfo;
+ web: ICheckConfigResponseInfo;
+}
+
+export default class CheckConfigResponse {
+ readonly _dns: CheckConfigResponseInfo;
+
+ get dns(): CheckConfigResponseInfo {
+ return this._dns;
+ }
+
+ readonly _static_ip: CheckConfigStaticIpInfo;
+
+ get staticIp(): CheckConfigStaticIpInfo {
+ return this._static_ip;
+ }
+
+ readonly _web: CheckConfigResponseInfo;
+
+ get web(): CheckConfigResponseInfo {
+ return this._web;
+ }
+
+ constructor(props: ICheckConfigResponse) {
+ this._dns = new CheckConfigResponseInfo(props.dns);
+ this._static_ip = new CheckConfigStaticIpInfo(props.static_ip);
+ this._web = new CheckConfigResponseInfo(props.web);
+ }
+
+ serialize(): ICheckConfigResponse {
+ const data: ICheckConfigResponse = {
+ dns: this._dns.serialize(),
+ static_ip: this._static_ip.serialize(),
+ web: this._web.serialize(),
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns: this._dns.validate().length === 0,
+ web: this._web.validate().length === 0,
+ static_ip: this._static_ip.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigResponse {
+ return new CheckConfigResponse({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigResponseInfo.ts b/client2/src/lib/entities/CheckConfigResponseInfo.ts
new file mode 100644
index 00000000..09d9d2a9
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigResponseInfo.ts
@@ -0,0 +1,59 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigResponseInfo {
+ can_autofix: boolean;
+ status: string;
+}
+
+export default class CheckConfigResponseInfo {
+ readonly _can_autofix: boolean;
+
+ get canAutofix(): boolean {
+ return this._can_autofix;
+ }
+
+ static canAutofixValidate(canAutofix: boolean): boolean {
+ return typeof canAutofix === 'boolean';
+ }
+
+ readonly _status: string;
+
+ get status(): string {
+ return this._status;
+ }
+
+ static statusValidate(status: string): boolean {
+ return typeof status === 'string' && !!status.trim();
+ }
+
+ constructor(props: ICheckConfigResponseInfo) {
+ this._can_autofix = props.can_autofix;
+ this._status = props.status.trim();
+ }
+
+ serialize(): ICheckConfigResponseInfo {
+ const data: ICheckConfigResponseInfo = {
+ can_autofix: this._can_autofix,
+ status: this._status,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ status: typeof this._status === 'string' && !this._status ? true : this._status,
+ can_autofix: typeof this._can_autofix === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigResponseInfo {
+ return new CheckConfigResponseInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigStaticIpInfo.ts b/client2/src/lib/entities/CheckConfigStaticIpInfo.ts
new file mode 100644
index 00000000..b7c7a34c
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigStaticIpInfo.ts
@@ -0,0 +1,79 @@
+import { CheckConfigStaticIpInfoStatic } from './CheckConfigStaticIpInfoStatic';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ICheckConfigStaticIpInfo {
+ error?: string;
+ ip?: string;
+ static?: CheckConfigStaticIpInfoStatic;
+}
+
+export default class CheckConfigStaticIpInfo {
+ readonly _error: string | undefined;
+
+ /** */
+ get error(): string | undefined {
+ return this._error;
+ }
+
+ readonly _ip: string | undefined;
+
+ /**
+ * Description: Current dynamic IP address. Set if static=no
+ * Example: 192.168.1.1
+ */
+ get ip(): string | undefined {
+ return this._ip;
+ }
+
+ readonly _static: CheckConfigStaticIpInfoStatic | undefined;
+
+ get static(): CheckConfigStaticIpInfoStatic | undefined {
+ return this._static;
+ }
+
+ constructor(props: ICheckConfigStaticIpInfo) {
+ if (typeof props.error === 'string') {
+ this._error = props.error.trim();
+ }
+ if (typeof props.ip === 'string') {
+ this._ip = props.ip.trim();
+ }
+ if (props.static) {
+ this._static = props.static;
+ }
+ }
+
+ serialize(): ICheckConfigStaticIpInfo {
+ const data: ICheckConfigStaticIpInfo = {
+ };
+ if (typeof this._error !== 'undefined') {
+ data.error = this._error;
+ }
+ if (typeof this._ip !== 'undefined') {
+ data.ip = this._ip;
+ }
+ if (typeof this._static !== 'undefined') {
+ data.static = this._static;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: !this._ip ? true : typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ error: !this._error ? true : typeof this._error === 'string' && !this._error ? true : this._error,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): CheckConfigStaticIpInfo {
+ return new CheckConfigStaticIpInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/CheckConfigStaticIpInfoStatic.ts b/client2/src/lib/entities/CheckConfigStaticIpInfoStatic.ts
new file mode 100644
index 00000000..9609e1ec
--- /dev/null
+++ b/client2/src/lib/entities/CheckConfigStaticIpInfoStatic.ts
@@ -0,0 +1,7 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export enum CheckConfigStaticIpInfoStatic {
+ YES = 'yes',
+ NO = 'no',
+ ERROR = 'error'
+}
diff --git a/client2/src/lib/entities/Client.ts b/client2/src/lib/entities/Client.ts
new file mode 100644
index 00000000..c86a9d8f
--- /dev/null
+++ b/client2/src/lib/entities/Client.ts
@@ -0,0 +1,176 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClient {
+ blocked_services?: string[];
+ filtering_enabled?: boolean;
+ ids?: string[];
+ name?: string;
+ parental_enabled?: boolean;
+ safebrowsing_enabled?: boolean;
+ safesearch_enabled?: boolean;
+ upstreams?: string[];
+ use_global_blocked_services?: boolean;
+ use_global_settings?: boolean;
+}
+
+export default class Client {
+ readonly _blocked_services: string[] | undefined;
+
+ get blockedServices(): string[] | undefined {
+ return this._blocked_services;
+ }
+
+ readonly _filtering_enabled: boolean | undefined;
+
+ get filteringEnabled(): boolean | undefined {
+ return this._filtering_enabled;
+ }
+
+ readonly _ids: string[] | undefined;
+
+ /** */
+ get ids(): string[] | undefined {
+ return this._ids;
+ }
+
+ readonly _name: string | undefined;
+
+ /**
+ * Description: Name
+ * Example: localhost
+ */
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ readonly _parental_enabled: boolean | undefined;
+
+ get parentalEnabled(): boolean | undefined {
+ return this._parental_enabled;
+ }
+
+ readonly _safebrowsing_enabled: boolean | undefined;
+
+ get safebrowsingEnabled(): boolean | undefined {
+ return this._safebrowsing_enabled;
+ }
+
+ readonly _safesearch_enabled: boolean | undefined;
+
+ get safesearchEnabled(): boolean | undefined {
+ return this._safesearch_enabled;
+ }
+
+ readonly _upstreams: string[] | undefined;
+
+ get upstreams(): string[] | undefined {
+ return this._upstreams;
+ }
+
+ readonly _use_global_blocked_services: boolean | undefined;
+
+ get useGlobalBlockedServices(): boolean | undefined {
+ return this._use_global_blocked_services;
+ }
+
+ readonly _use_global_settings: boolean | undefined;
+
+ get useGlobalSettings(): boolean | undefined {
+ return this._use_global_settings;
+ }
+
+ constructor(props: IClient) {
+ if (props.blocked_services) {
+ this._blocked_services = props.blocked_services;
+ }
+ if (typeof props.filtering_enabled === 'boolean') {
+ this._filtering_enabled = props.filtering_enabled;
+ }
+ if (props.ids) {
+ this._ids = props.ids;
+ }
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ if (typeof props.parental_enabled === 'boolean') {
+ this._parental_enabled = props.parental_enabled;
+ }
+ if (typeof props.safebrowsing_enabled === 'boolean') {
+ this._safebrowsing_enabled = props.safebrowsing_enabled;
+ }
+ if (typeof props.safesearch_enabled === 'boolean') {
+ this._safesearch_enabled = props.safesearch_enabled;
+ }
+ if (props.upstreams) {
+ this._upstreams = props.upstreams;
+ }
+ if (typeof props.use_global_blocked_services === 'boolean') {
+ this._use_global_blocked_services = props.use_global_blocked_services;
+ }
+ if (typeof props.use_global_settings === 'boolean') {
+ this._use_global_settings = props.use_global_settings;
+ }
+ }
+
+ serialize(): IClient {
+ const data: IClient = {
+ };
+ if (typeof this._blocked_services !== 'undefined') {
+ data.blocked_services = this._blocked_services;
+ }
+ if (typeof this._filtering_enabled !== 'undefined') {
+ data.filtering_enabled = this._filtering_enabled;
+ }
+ if (typeof this._ids !== 'undefined') {
+ data.ids = this._ids;
+ }
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ if (typeof this._parental_enabled !== 'undefined') {
+ data.parental_enabled = this._parental_enabled;
+ }
+ if (typeof this._safebrowsing_enabled !== 'undefined') {
+ data.safebrowsing_enabled = this._safebrowsing_enabled;
+ }
+ if (typeof this._safesearch_enabled !== 'undefined') {
+ data.safesearch_enabled = this._safesearch_enabled;
+ }
+ if (typeof this._upstreams !== 'undefined') {
+ data.upstreams = this._upstreams;
+ }
+ if (typeof this._use_global_blocked_services !== 'undefined') {
+ data.use_global_blocked_services = this._use_global_blocked_services;
+ }
+ if (typeof this._use_global_settings !== 'undefined') {
+ data.use_global_settings = this._use_global_settings;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ ids: !this._ids ? true : this._ids.reduce((result, p) => result && typeof p === 'string', true),
+ use_global_settings: !this._use_global_settings ? true : typeof this._use_global_settings === 'boolean',
+ filtering_enabled: !this._filtering_enabled ? true : typeof this._filtering_enabled === 'boolean',
+ parental_enabled: !this._parental_enabled ? true : typeof this._parental_enabled === 'boolean',
+ safebrowsing_enabled: !this._safebrowsing_enabled ? true : typeof this._safebrowsing_enabled === 'boolean',
+ safesearch_enabled: !this._safesearch_enabled ? true : typeof this._safesearch_enabled === 'boolean',
+ use_global_blocked_services: !this._use_global_blocked_services ? true : typeof this._use_global_blocked_services === 'boolean',
+ blocked_services: !this._blocked_services ? true : this._blocked_services.reduce((result, p) => result && typeof p === 'string', true),
+ upstreams: !this._upstreams ? true : this._upstreams.reduce((result, p) => result && typeof p === 'string', true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Client {
+ return new Client({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientAuto.ts b/client2/src/lib/entities/ClientAuto.ts
new file mode 100644
index 00000000..2696a4c2
--- /dev/null
+++ b/client2/src/lib/entities/ClientAuto.ts
@@ -0,0 +1,85 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientAuto {
+ ip?: string;
+ name?: string;
+ source?: string;
+}
+
+export default class ClientAuto {
+ readonly _ip: string | undefined;
+
+ /**
+ * Description: IP address
+ * Example: 127.0.0.1
+ */
+ get ip(): string | undefined {
+ return this._ip;
+ }
+
+ readonly _name: string | undefined;
+
+ /**
+ * Description: Name
+ * Example: localhost
+ */
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ readonly _source: string | undefined;
+
+ /**
+ * Description: The source of this information
+ * Example: etc/hosts
+ */
+ get source(): string | undefined {
+ return this._source;
+ }
+
+ constructor(props: IClientAuto) {
+ if (typeof props.ip === 'string') {
+ this._ip = props.ip.trim();
+ }
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ if (typeof props.source === 'string') {
+ this._source = props.source.trim();
+ }
+ }
+
+ serialize(): IClientAuto {
+ const data: IClientAuto = {
+ };
+ if (typeof this._ip !== 'undefined') {
+ data.ip = this._ip;
+ }
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ if (typeof this._source !== 'undefined') {
+ data.source = this._source;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ip: !this._ip ? true : typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ source: !this._source ? true : typeof this._source === 'string' && !this._source ? true : this._source,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientAuto {
+ return new ClientAuto({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientDelete.ts b/client2/src/lib/entities/ClientDelete.ts
new file mode 100644
index 00000000..6a009c03
--- /dev/null
+++ b/client2/src/lib/entities/ClientDelete.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientDelete {
+ name?: string;
+}
+
+export default class ClientDelete {
+ readonly _name: string | undefined;
+
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ constructor(props: IClientDelete) {
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ }
+
+ serialize(): IClientDelete {
+ const data: IClientDelete = {
+ };
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientDelete {
+ return new ClientDelete({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientFindSubEntry.ts b/client2/src/lib/entities/ClientFindSubEntry.ts
new file mode 100644
index 00000000..670d2da3
--- /dev/null
+++ b/client2/src/lib/entities/ClientFindSubEntry.ts
@@ -0,0 +1,222 @@
+import WhoisInfo, { IWhoisInfo } from './WhoisInfo';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientFindSubEntry {
+ blocked_services?: string[];
+ disallowed?: boolean;
+ disallowed_rule?: string;
+ filtering_enabled?: boolean;
+ ids?: string[];
+ name?: string;
+ parental_enabled?: boolean;
+ safebrowsing_enabled?: boolean;
+ safesearch_enabled?: boolean;
+ upstreams?: string[];
+ use_global_blocked_services?: boolean;
+ use_global_settings?: boolean;
+ whois_info?: IWhoisInfo[];
+}
+
+export default class ClientFindSubEntry {
+ readonly _blocked_services: string[] | undefined;
+
+ get blockedServices(): string[] | undefined {
+ return this._blocked_services;
+ }
+
+ readonly _disallowed: boolean | undefined;
+
+ /** */
+ get disallowed(): boolean | undefined {
+ return this._disallowed;
+ }
+
+ readonly _disallowed_rule: string | undefined;
+
+ /** */
+ get disallowedRule(): string | undefined {
+ return this._disallowed_rule;
+ }
+
+ readonly _filtering_enabled: boolean | undefined;
+
+ get filteringEnabled(): boolean | undefined {
+ return this._filtering_enabled;
+ }
+
+ readonly _ids: string[] | undefined;
+
+ /** */
+ get ids(): string[] | undefined {
+ return this._ids;
+ }
+
+ readonly _name: string | undefined;
+
+ /**
+ * Description: Name
+ * Example: localhost
+ */
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ readonly _parental_enabled: boolean | undefined;
+
+ get parentalEnabled(): boolean | undefined {
+ return this._parental_enabled;
+ }
+
+ readonly _safebrowsing_enabled: boolean | undefined;
+
+ get safebrowsingEnabled(): boolean | undefined {
+ return this._safebrowsing_enabled;
+ }
+
+ readonly _safesearch_enabled: boolean | undefined;
+
+ get safesearchEnabled(): boolean | undefined {
+ return this._safesearch_enabled;
+ }
+
+ readonly _upstreams: string[] | undefined;
+
+ get upstreams(): string[] | undefined {
+ return this._upstreams;
+ }
+
+ readonly _use_global_blocked_services: boolean | undefined;
+
+ get useGlobalBlockedServices(): boolean | undefined {
+ return this._use_global_blocked_services;
+ }
+
+ readonly _use_global_settings: boolean | undefined;
+
+ get useGlobalSettings(): boolean | undefined {
+ return this._use_global_settings;
+ }
+
+ readonly _whois_info: WhoisInfo[] | undefined;
+
+ get whoisInfo(): WhoisInfo[] | undefined {
+ return this._whois_info;
+ }
+
+ constructor(props: IClientFindSubEntry) {
+ if (props.blocked_services) {
+ this._blocked_services = props.blocked_services;
+ }
+ if (typeof props.disallowed === 'boolean') {
+ this._disallowed = props.disallowed;
+ }
+ if (typeof props.disallowed_rule === 'string') {
+ this._disallowed_rule = props.disallowed_rule.trim();
+ }
+ if (typeof props.filtering_enabled === 'boolean') {
+ this._filtering_enabled = props.filtering_enabled;
+ }
+ if (props.ids) {
+ this._ids = props.ids;
+ }
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ if (typeof props.parental_enabled === 'boolean') {
+ this._parental_enabled = props.parental_enabled;
+ }
+ if (typeof props.safebrowsing_enabled === 'boolean') {
+ this._safebrowsing_enabled = props.safebrowsing_enabled;
+ }
+ if (typeof props.safesearch_enabled === 'boolean') {
+ this._safesearch_enabled = props.safesearch_enabled;
+ }
+ if (props.upstreams) {
+ this._upstreams = props.upstreams;
+ }
+ if (typeof props.use_global_blocked_services === 'boolean') {
+ this._use_global_blocked_services = props.use_global_blocked_services;
+ }
+ if (typeof props.use_global_settings === 'boolean') {
+ this._use_global_settings = props.use_global_settings;
+ }
+ if (props.whois_info) {
+ this._whois_info = props.whois_info.map((p) => new WhoisInfo(p));
+ }
+ }
+
+ serialize(): IClientFindSubEntry {
+ const data: IClientFindSubEntry = {
+ };
+ if (typeof this._blocked_services !== 'undefined') {
+ data.blocked_services = this._blocked_services;
+ }
+ if (typeof this._disallowed !== 'undefined') {
+ data.disallowed = this._disallowed;
+ }
+ if (typeof this._disallowed_rule !== 'undefined') {
+ data.disallowed_rule = this._disallowed_rule;
+ }
+ if (typeof this._filtering_enabled !== 'undefined') {
+ data.filtering_enabled = this._filtering_enabled;
+ }
+ if (typeof this._ids !== 'undefined') {
+ data.ids = this._ids;
+ }
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ if (typeof this._parental_enabled !== 'undefined') {
+ data.parental_enabled = this._parental_enabled;
+ }
+ if (typeof this._safebrowsing_enabled !== 'undefined') {
+ data.safebrowsing_enabled = this._safebrowsing_enabled;
+ }
+ if (typeof this._safesearch_enabled !== 'undefined') {
+ data.safesearch_enabled = this._safesearch_enabled;
+ }
+ if (typeof this._upstreams !== 'undefined') {
+ data.upstreams = this._upstreams;
+ }
+ if (typeof this._use_global_blocked_services !== 'undefined') {
+ data.use_global_blocked_services = this._use_global_blocked_services;
+ }
+ if (typeof this._use_global_settings !== 'undefined') {
+ data.use_global_settings = this._use_global_settings;
+ }
+ if (typeof this._whois_info !== 'undefined') {
+ data.whois_info = this._whois_info.map((p) => p.serialize());
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ ids: !this._ids ? true : this._ids.reduce((result, p) => result && typeof p === 'string', true),
+ use_global_settings: !this._use_global_settings ? true : typeof this._use_global_settings === 'boolean',
+ filtering_enabled: !this._filtering_enabled ? true : typeof this._filtering_enabled === 'boolean',
+ parental_enabled: !this._parental_enabled ? true : typeof this._parental_enabled === 'boolean',
+ safebrowsing_enabled: !this._safebrowsing_enabled ? true : typeof this._safebrowsing_enabled === 'boolean',
+ safesearch_enabled: !this._safesearch_enabled ? true : typeof this._safesearch_enabled === 'boolean',
+ use_global_blocked_services: !this._use_global_blocked_services ? true : typeof this._use_global_blocked_services === 'boolean',
+ blocked_services: !this._blocked_services ? true : this._blocked_services.reduce((result, p) => result && typeof p === 'string', true),
+ upstreams: !this._upstreams ? true : this._upstreams.reduce((result, p) => result && typeof p === 'string', true),
+ whois_info: !this._whois_info ? true : this._whois_info.reduce((result, p) => result && p.validate().length === 0, true),
+ disallowed: !this._disallowed ? true : typeof this._disallowed === 'boolean',
+ disallowed_rule: !this._disallowed_rule ? true : typeof this._disallowed_rule === 'string' && !this._disallowed_rule ? true : this._disallowed_rule,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientFindSubEntry {
+ return new ClientFindSubEntry({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientUpdate.ts b/client2/src/lib/entities/ClientUpdate.ts
new file mode 100644
index 00000000..2a817b3a
--- /dev/null
+++ b/client2/src/lib/entities/ClientUpdate.ts
@@ -0,0 +1,61 @@
+import Client, { IClient } from './Client';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientUpdate {
+ data?: IClient;
+ name?: string;
+}
+
+export default class ClientUpdate {
+ readonly _data: Client | undefined;
+
+ get data(): Client | undefined {
+ return this._data;
+ }
+
+ readonly _name: string | undefined;
+
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ constructor(props: IClientUpdate) {
+ if (props.data) {
+ this._data = new Client(props.data);
+ }
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ }
+
+ serialize(): IClientUpdate {
+ const data: IClientUpdate = {
+ };
+ if (typeof this._data !== 'undefined') {
+ data.data = this._data.serialize();
+ }
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ data: !this._data ? true : this._data.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientUpdate {
+ return new ClientUpdate({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/Clients.ts b/client2/src/lib/entities/Clients.ts
new file mode 100644
index 00000000..8ba5a8e8
--- /dev/null
+++ b/client2/src/lib/entities/Clients.ts
@@ -0,0 +1,62 @@
+import Client, { IClient } from './Client';
+import ClientAuto, { IClientAuto } from './ClientAuto';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClients {
+ auto_clients?: IClientAuto[];
+ clients?: IClient[];
+}
+
+export default class Clients {
+ readonly _auto_clients: ClientAuto[] | undefined;
+
+ get autoClients(): ClientAuto[] | undefined {
+ return this._auto_clients;
+ }
+
+ readonly _clients: Client[] | undefined;
+
+ get clients(): Client[] | undefined {
+ return this._clients;
+ }
+
+ constructor(props: IClients) {
+ if (props.auto_clients) {
+ this._auto_clients = props.auto_clients.map((p) => new ClientAuto(p));
+ }
+ if (props.clients) {
+ this._clients = props.clients.map((p) => new Client(p));
+ }
+ }
+
+ serialize(): IClients {
+ const data: IClients = {
+ };
+ if (typeof this._auto_clients !== 'undefined') {
+ data.auto_clients = this._auto_clients.map((p) => p.serialize());
+ }
+ if (typeof this._clients !== 'undefined') {
+ data.clients = this._clients.map((p) => p.serialize());
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ clients: !this._clients ? true : this._clients.reduce((result, p) => result && p.validate().length === 0, true),
+ auto_clients: !this._auto_clients ? true : this._auto_clients.reduce((result, p) => result && p.validate().length === 0, true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Clients {
+ return new Clients({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientsArray.ts b/client2/src/lib/entities/ClientsArray.ts
new file mode 100644
index 00000000..774e162b
--- /dev/null
+++ b/client2/src/lib/entities/ClientsArray.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientsArray {
+}
+
+export default class ClientsArray {
+ constructor(props: IClientsArray) {
+ }
+
+ serialize(): IClientsArray {
+ const data: IClientsArray = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientsArray {
+ return new ClientsArray({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientsAutoArray.ts b/client2/src/lib/entities/ClientsAutoArray.ts
new file mode 100644
index 00000000..855c9e8a
--- /dev/null
+++ b/client2/src/lib/entities/ClientsAutoArray.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientsAutoArray {
+}
+
+export default class ClientsAutoArray {
+ constructor(props: IClientsAutoArray) {
+ }
+
+ serialize(): IClientsAutoArray {
+ const data: IClientsAutoArray = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientsAutoArray {
+ return new ClientsAutoArray({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientsFindEntry.ts b/client2/src/lib/entities/ClientsFindEntry.ts
new file mode 100644
index 00000000..9dd3099c
--- /dev/null
+++ b/client2/src/lib/entities/ClientsFindEntry.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientsFindEntry {
+}
+
+export default class ClientsFindEntry {
+ constructor(props: IClientsFindEntry) {
+ }
+
+ serialize(): IClientsFindEntry {
+ const data: IClientsFindEntry = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientsFindEntry {
+ return new ClientsFindEntry({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ClientsFindResponse.ts b/client2/src/lib/entities/ClientsFindResponse.ts
new file mode 100644
index 00000000..63685be6
--- /dev/null
+++ b/client2/src/lib/entities/ClientsFindResponse.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IClientsFindResponse {
+}
+
+export default class ClientsFindResponse {
+ constructor(props: IClientsFindResponse) {
+ }
+
+ serialize(): IClientsFindResponse {
+ const data: IClientsFindResponse = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ClientsFindResponse {
+ return new ClientsFindResponse({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DNSConfig.ts b/client2/src/lib/entities/DNSConfig.ts
new file mode 100644
index 00000000..d56883e5
--- /dev/null
+++ b/client2/src/lib/entities/DNSConfig.ts
@@ -0,0 +1,250 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDNSConfig {
+ blocking_ipv4?: string;
+ blocking_ipv6?: string;
+ blocking_mode?: string;
+ bootstrap_dns?: string[];
+ cache_size?: number;
+ cache_ttl_max?: number;
+ cache_ttl_min?: number;
+ dhcp_available?: boolean;
+ dnssec_enabled?: boolean;
+ edns_cs_enabled?: boolean;
+ protection_enabled?: boolean;
+ ratelimit?: number;
+ upstream_dns?: string[];
+ upstream_dns_file?: string;
+ upstream_mode?: any;
+}
+
+export default class DNSConfig {
+ readonly _blocking_ipv4: string | undefined;
+
+ get blockingIpv4(): string | undefined {
+ return this._blocking_ipv4;
+ }
+
+ readonly _blocking_ipv6: string | undefined;
+
+ get blockingIpv6(): string | undefined {
+ return this._blocking_ipv6;
+ }
+
+ readonly _blocking_mode: string | undefined;
+
+ get blockingMode(): string | undefined {
+ return this._blocking_mode;
+ }
+
+ readonly _bootstrap_dns: string[] | undefined;
+
+ /**
+ * Description: Bootstrap servers, port is optional after colon. Empty value will reset it to default values.
+ *
+ * Example: 8.8.8.8:53,1.1.1.1:53
+ */
+ get bootstrapDns(): string[] | undefined {
+ return this._bootstrap_dns;
+ }
+
+ readonly _cache_size: number | undefined;
+
+ get cacheSize(): number | undefined {
+ return this._cache_size;
+ }
+
+ readonly _cache_ttl_max: number | undefined;
+
+ get cacheTtlMax(): number | undefined {
+ return this._cache_ttl_max;
+ }
+
+ readonly _cache_ttl_min: number | undefined;
+
+ get cacheTtlMin(): number | undefined {
+ return this._cache_ttl_min;
+ }
+
+ readonly _dhcp_available: boolean | undefined;
+
+ get dhcpAvailable(): boolean | undefined {
+ return this._dhcp_available;
+ }
+
+ readonly _dnssec_enabled: boolean | undefined;
+
+ get dnssecEnabled(): boolean | undefined {
+ return this._dnssec_enabled;
+ }
+
+ readonly _edns_cs_enabled: boolean | undefined;
+
+ get ednsCsEnabled(): boolean | undefined {
+ return this._edns_cs_enabled;
+ }
+
+ readonly _protection_enabled: boolean | undefined;
+
+ get protectionEnabled(): boolean | undefined {
+ return this._protection_enabled;
+ }
+
+ readonly _ratelimit: number | undefined;
+
+ get ratelimit(): number | undefined {
+ return this._ratelimit;
+ }
+
+ readonly _upstream_dns: string[] | undefined;
+
+ /**
+ * Description: Upstream servers, port is optional after colon. Empty value will reset it to default values.
+ *
+ * Example: tls://1.1.1.1,tls://1.0.0.1
+ */
+ get upstreamDns(): string[] | undefined {
+ return this._upstream_dns;
+ }
+
+ readonly _upstream_dns_file: string | undefined;
+
+ get upstreamDnsFile(): string | undefined {
+ return this._upstream_dns_file;
+ }
+
+ readonly _upstream_mode: any | undefined;
+
+ get upstreamMode(): any | undefined {
+ return this._upstream_mode;
+ }
+
+ constructor(props: IDNSConfig) {
+ if (typeof props.blocking_ipv4 === 'string') {
+ this._blocking_ipv4 = props.blocking_ipv4.trim();
+ }
+ if (typeof props.blocking_ipv6 === 'string') {
+ this._blocking_ipv6 = props.blocking_ipv6.trim();
+ }
+ if (typeof props.blocking_mode === 'string') {
+ this._blocking_mode = props.blocking_mode.trim();
+ }
+ if (props.bootstrap_dns) {
+ this._bootstrap_dns = props.bootstrap_dns;
+ }
+ if (typeof props.cache_size === 'number') {
+ this._cache_size = props.cache_size;
+ }
+ if (typeof props.cache_ttl_max === 'number') {
+ this._cache_ttl_max = props.cache_ttl_max;
+ }
+ if (typeof props.cache_ttl_min === 'number') {
+ this._cache_ttl_min = props.cache_ttl_min;
+ }
+ if (typeof props.dhcp_available === 'boolean') {
+ this._dhcp_available = props.dhcp_available;
+ }
+ if (typeof props.dnssec_enabled === 'boolean') {
+ this._dnssec_enabled = props.dnssec_enabled;
+ }
+ if (typeof props.edns_cs_enabled === 'boolean') {
+ this._edns_cs_enabled = props.edns_cs_enabled;
+ }
+ if (typeof props.protection_enabled === 'boolean') {
+ this._protection_enabled = props.protection_enabled;
+ }
+ if (typeof props.ratelimit === 'number') {
+ this._ratelimit = props.ratelimit;
+ }
+ if (props.upstream_dns) {
+ this._upstream_dns = props.upstream_dns;
+ }
+ if (typeof props.upstream_dns_file === 'string') {
+ this._upstream_dns_file = props.upstream_dns_file.trim();
+ }
+ if (props.upstream_mode) {
+ this._upstream_mode = props.upstream_mode;
+ }
+ }
+
+ serialize(): IDNSConfig {
+ const data: IDNSConfig = {
+ };
+ if (typeof this._blocking_ipv4 !== 'undefined') {
+ data.blocking_ipv4 = this._blocking_ipv4;
+ }
+ if (typeof this._blocking_ipv6 !== 'undefined') {
+ data.blocking_ipv6 = this._blocking_ipv6;
+ }
+ if (typeof this._blocking_mode !== 'undefined') {
+ data.blocking_mode = this._blocking_mode;
+ }
+ if (typeof this._bootstrap_dns !== 'undefined') {
+ data.bootstrap_dns = this._bootstrap_dns;
+ }
+ if (typeof this._cache_size !== 'undefined') {
+ data.cache_size = this._cache_size;
+ }
+ if (typeof this._cache_ttl_max !== 'undefined') {
+ data.cache_ttl_max = this._cache_ttl_max;
+ }
+ if (typeof this._cache_ttl_min !== 'undefined') {
+ data.cache_ttl_min = this._cache_ttl_min;
+ }
+ if (typeof this._dhcp_available !== 'undefined') {
+ data.dhcp_available = this._dhcp_available;
+ }
+ if (typeof this._dnssec_enabled !== 'undefined') {
+ data.dnssec_enabled = this._dnssec_enabled;
+ }
+ if (typeof this._edns_cs_enabled !== 'undefined') {
+ data.edns_cs_enabled = this._edns_cs_enabled;
+ }
+ if (typeof this._protection_enabled !== 'undefined') {
+ data.protection_enabled = this._protection_enabled;
+ }
+ if (typeof this._ratelimit !== 'undefined') {
+ data.ratelimit = this._ratelimit;
+ }
+ if (typeof this._upstream_dns !== 'undefined') {
+ data.upstream_dns = this._upstream_dns;
+ }
+ if (typeof this._upstream_dns_file !== 'undefined') {
+ data.upstream_dns_file = this._upstream_dns_file;
+ }
+ if (typeof this._upstream_mode !== 'undefined') {
+ data.upstream_mode = this._upstream_mode;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ bootstrap_dns: !this._bootstrap_dns ? true : this._bootstrap_dns.reduce((result, p) => result && typeof p === 'string', true),
+ upstream_dns: !this._upstream_dns ? true : this._upstream_dns.reduce((result, p) => result && typeof p === 'string', true),
+ upstream_dns_file: !this._upstream_dns_file ? true : typeof this._upstream_dns_file === 'string' && !this._upstream_dns_file ? true : this._upstream_dns_file,
+ protection_enabled: !this._protection_enabled ? true : typeof this._protection_enabled === 'boolean',
+ dhcp_available: !this._dhcp_available ? true : typeof this._dhcp_available === 'boolean',
+ ratelimit: !this._ratelimit ? true : typeof this._ratelimit === 'number',
+ blocking_mode: !this._blocking_mode ? true : typeof this._blocking_mode === 'string' && !this._blocking_mode ? true : this._blocking_mode,
+ blocking_ipv4: !this._blocking_ipv4 ? true : typeof this._blocking_ipv4 === 'string' && !this._blocking_ipv4 ? true : this._blocking_ipv4,
+ blocking_ipv6: !this._blocking_ipv6 ? true : typeof this._blocking_ipv6 === 'string' && !this._blocking_ipv6 ? true : this._blocking_ipv6,
+ edns_cs_enabled: !this._edns_cs_enabled ? true : typeof this._edns_cs_enabled === 'boolean',
+ dnssec_enabled: !this._dnssec_enabled ? true : typeof this._dnssec_enabled === 'boolean',
+ cache_size: !this._cache_size ? true : typeof this._cache_size === 'number',
+ cache_ttl_min: !this._cache_ttl_min ? true : typeof this._cache_ttl_min === 'number',
+ cache_ttl_max: !this._cache_ttl_max ? true : typeof this._cache_ttl_max === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DNSConfig {
+ return new DNSConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpConfig.ts b/client2/src/lib/entities/DhcpConfig.ts
new file mode 100644
index 00000000..61874da0
--- /dev/null
+++ b/client2/src/lib/entities/DhcpConfig.ts
@@ -0,0 +1,90 @@
+import DhcpConfigV4, { IDhcpConfigV4 } from './DhcpConfigV4';
+import DhcpConfigV6, { IDhcpConfigV6 } from './DhcpConfigV6';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpConfig {
+ enabled?: boolean;
+ interface_name?: string;
+ v4?: IDhcpConfigV4;
+ v6?: IDhcpConfigV6;
+}
+
+export default class DhcpConfig {
+ readonly _enabled: boolean | undefined;
+
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _interface_name: string | undefined;
+
+ get interfaceName(): string | undefined {
+ return this._interface_name;
+ }
+
+ readonly _v4: DhcpConfigV4 | undefined;
+
+ get v4(): DhcpConfigV4 | undefined {
+ return this._v4;
+ }
+
+ readonly _v6: DhcpConfigV6 | undefined;
+
+ get v6(): DhcpConfigV6 | undefined {
+ return this._v6;
+ }
+
+ constructor(props: IDhcpConfig) {
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (typeof props.interface_name === 'string') {
+ this._interface_name = props.interface_name.trim();
+ }
+ if (props.v4) {
+ this._v4 = new DhcpConfigV4(props.v4);
+ }
+ if (props.v6) {
+ this._v6 = new DhcpConfigV6(props.v6);
+ }
+ }
+
+ serialize(): IDhcpConfig {
+ const data: IDhcpConfig = {
+ };
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._interface_name !== 'undefined') {
+ data.interface_name = this._interface_name;
+ }
+ if (typeof this._v4 !== 'undefined') {
+ data.v4 = this._v4.serialize();
+ }
+ if (typeof this._v6 !== 'undefined') {
+ data.v6 = this._v6.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ interface_name: !this._interface_name ? true : typeof this._interface_name === 'string' && !this._interface_name ? true : this._interface_name,
+ v4: !this._v4 ? true : this._v4.validate().length === 0,
+ v6: !this._v6 ? true : this._v6.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpConfig {
+ return new DhcpConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpConfigV4.ts b/client2/src/lib/entities/DhcpConfigV4.ts
new file mode 100644
index 00000000..ae4ebdc2
--- /dev/null
+++ b/client2/src/lib/entities/DhcpConfigV4.ts
@@ -0,0 +1,117 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpConfigV4 {
+ gateway_ip?: string;
+ lease_duration?: number;
+ range_end?: string;
+ range_start?: string;
+ subnet_mask?: string;
+}
+
+export default class DhcpConfigV4 {
+ readonly _gateway_ip: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.1.1
+ */
+ get gatewayIp(): string | undefined {
+ return this._gateway_ip;
+ }
+
+ readonly _lease_duration: number | undefined;
+
+ get leaseDuration(): number | undefined {
+ return this._lease_duration;
+ }
+
+ readonly _range_end: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.10.50
+ */
+ get rangeEnd(): string | undefined {
+ return this._range_end;
+ }
+
+ readonly _range_start: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.1.2
+ */
+ get rangeStart(): string | undefined {
+ return this._range_start;
+ }
+
+ readonly _subnet_mask: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 255.255.255.0
+ */
+ get subnetMask(): string | undefined {
+ return this._subnet_mask;
+ }
+
+ constructor(props: IDhcpConfigV4) {
+ if (typeof props.gateway_ip === 'string') {
+ this._gateway_ip = props.gateway_ip.trim();
+ }
+ if (typeof props.lease_duration === 'number') {
+ this._lease_duration = props.lease_duration;
+ }
+ if (typeof props.range_end === 'string') {
+ this._range_end = props.range_end.trim();
+ }
+ if (typeof props.range_start === 'string') {
+ this._range_start = props.range_start.trim();
+ }
+ if (typeof props.subnet_mask === 'string') {
+ this._subnet_mask = props.subnet_mask.trim();
+ }
+ }
+
+ serialize(): IDhcpConfigV4 {
+ const data: IDhcpConfigV4 = {
+ };
+ if (typeof this._gateway_ip !== 'undefined') {
+ data.gateway_ip = this._gateway_ip;
+ }
+ if (typeof this._lease_duration !== 'undefined') {
+ data.lease_duration = this._lease_duration;
+ }
+ if (typeof this._range_end !== 'undefined') {
+ data.range_end = this._range_end;
+ }
+ if (typeof this._range_start !== 'undefined') {
+ data.range_start = this._range_start;
+ }
+ if (typeof this._subnet_mask !== 'undefined') {
+ data.subnet_mask = this._subnet_mask;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ gateway_ip: !this._gateway_ip ? true : typeof this._gateway_ip === 'string' && !this._gateway_ip ? true : this._gateway_ip,
+ subnet_mask: !this._subnet_mask ? true : typeof this._subnet_mask === 'string' && !this._subnet_mask ? true : this._subnet_mask,
+ range_start: !this._range_start ? true : typeof this._range_start === 'string' && !this._range_start ? true : this._range_start,
+ range_end: !this._range_end ? true : typeof this._range_end === 'string' && !this._range_end ? true : this._range_end,
+ lease_duration: !this._lease_duration ? true : typeof this._lease_duration === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpConfigV4 {
+ return new DhcpConfigV4({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpConfigV6.ts b/client2/src/lib/entities/DhcpConfigV6.ts
new file mode 100644
index 00000000..cf7d6763
--- /dev/null
+++ b/client2/src/lib/entities/DhcpConfigV6.ts
@@ -0,0 +1,59 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpConfigV6 {
+ lease_duration?: number;
+ range_start?: string;
+}
+
+export default class DhcpConfigV6 {
+ readonly _lease_duration: number | undefined;
+
+ get leaseDuration(): number | undefined {
+ return this._lease_duration;
+ }
+
+ readonly _range_start: string | undefined;
+
+ get rangeStart(): string | undefined {
+ return this._range_start;
+ }
+
+ constructor(props: IDhcpConfigV6) {
+ if (typeof props.lease_duration === 'number') {
+ this._lease_duration = props.lease_duration;
+ }
+ if (typeof props.range_start === 'string') {
+ this._range_start = props.range_start.trim();
+ }
+ }
+
+ serialize(): IDhcpConfigV6 {
+ const data: IDhcpConfigV6 = {
+ };
+ if (typeof this._lease_duration !== 'undefined') {
+ data.lease_duration = this._lease_duration;
+ }
+ if (typeof this._range_start !== 'undefined') {
+ data.range_start = this._range_start;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ range_start: !this._range_start ? true : typeof this._range_start === 'string' && !this._range_start ? true : this._range_start,
+ lease_duration: !this._lease_duration ? true : typeof this._lease_duration === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpConfigV6 {
+ return new DhcpConfigV6({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpLease.ts b/client2/src/lib/entities/DhcpLease.ts
new file mode 100644
index 00000000..b285496b
--- /dev/null
+++ b/client2/src/lib/entities/DhcpLease.ts
@@ -0,0 +1,103 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpLease {
+ expires: string;
+ hostname: string;
+ ip: string;
+ mac: string;
+}
+
+export default class DhcpLease {
+ readonly _expires: string;
+
+ /**
+ * Description: undefined
+ * Example: 2017-07-21T17:32:28Z
+ */
+ get expires(): string {
+ return this._expires;
+ }
+
+ static expiresValidate(expires: string): boolean {
+ return typeof expires === 'string' && !!expires.trim();
+ }
+
+ readonly _hostname: string;
+
+ /**
+ * Description: undefined
+ * Example: dell
+ */
+ get hostname(): string {
+ return this._hostname;
+ }
+
+ static hostnameValidate(hostname: string): boolean {
+ return typeof hostname === 'string' && !!hostname.trim();
+ }
+
+ readonly _ip: string;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.1.22
+ */
+ get ip(): string {
+ return this._ip;
+ }
+
+ static ipValidate(ip: string): boolean {
+ return typeof ip === 'string' && !!ip.trim();
+ }
+
+ readonly _mac: string;
+
+ /**
+ * Description: undefined
+ * Example: 00:11:09:b3:b3:b8
+ */
+ get mac(): string {
+ return this._mac;
+ }
+
+ static macValidate(mac: string): boolean {
+ return typeof mac === 'string' && !!mac.trim();
+ }
+
+ constructor(props: IDhcpLease) {
+ this._expires = props.expires.trim();
+ this._hostname = props.hostname.trim();
+ this._ip = props.ip.trim();
+ this._mac = props.mac.trim();
+ }
+
+ serialize(): IDhcpLease {
+ const data: IDhcpLease = {
+ expires: this._expires,
+ hostname: this._hostname,
+ ip: this._ip,
+ mac: this._mac,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ mac: typeof this._mac === 'string' && !this._mac ? true : this._mac,
+ ip: typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ hostname: typeof this._hostname === 'string' && !this._hostname ? true : this._hostname,
+ expires: typeof this._expires === 'string' && !this._expires ? true : this._expires,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpLease {
+ return new DhcpLease({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpSearchResult.ts b/client2/src/lib/entities/DhcpSearchResult.ts
new file mode 100644
index 00000000..c168a244
--- /dev/null
+++ b/client2/src/lib/entities/DhcpSearchResult.ts
@@ -0,0 +1,62 @@
+import DhcpSearchV4, { IDhcpSearchV4 } from './DhcpSearchV4';
+import DhcpSearchV6, { IDhcpSearchV6 } from './DhcpSearchV6';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpSearchResult {
+ v4?: IDhcpSearchV4;
+ v6?: IDhcpSearchV6;
+}
+
+export default class DhcpSearchResult {
+ readonly _v4: DhcpSearchV4 | undefined;
+
+ get v4(): DhcpSearchV4 | undefined {
+ return this._v4;
+ }
+
+ readonly _v6: DhcpSearchV6 | undefined;
+
+ get v6(): DhcpSearchV6 | undefined {
+ return this._v6;
+ }
+
+ constructor(props: IDhcpSearchResult) {
+ if (props.v4) {
+ this._v4 = new DhcpSearchV4(props.v4);
+ }
+ if (props.v6) {
+ this._v6 = new DhcpSearchV6(props.v6);
+ }
+ }
+
+ serialize(): IDhcpSearchResult {
+ const data: IDhcpSearchResult = {
+ };
+ if (typeof this._v4 !== 'undefined') {
+ data.v4 = this._v4.serialize();
+ }
+ if (typeof this._v6 !== 'undefined') {
+ data.v6 = this._v6.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ v4: !this._v4 ? true : this._v4.validate().length === 0,
+ v6: !this._v6 ? true : this._v6.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpSearchResult {
+ return new DhcpSearchResult({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpSearchResultOtherServer.ts b/client2/src/lib/entities/DhcpSearchResultOtherServer.ts
new file mode 100644
index 00000000..36f2bc64
--- /dev/null
+++ b/client2/src/lib/entities/DhcpSearchResultOtherServer.ts
@@ -0,0 +1,64 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpSearchResultOtherServer {
+ error?: string;
+ found?: string;
+}
+
+export default class DhcpSearchResultOtherServer {
+ readonly _error: string | undefined;
+
+ /** */
+ get error(): string | undefined {
+ return this._error;
+ }
+
+ readonly _found: string | undefined;
+
+ /**
+ * Description: yes|no|error
+ * Example: no
+ */
+ get found(): string | undefined {
+ return this._found;
+ }
+
+ constructor(props: IDhcpSearchResultOtherServer) {
+ if (typeof props.error === 'string') {
+ this._error = props.error.trim();
+ }
+ if (typeof props.found === 'string') {
+ this._found = props.found.trim();
+ }
+ }
+
+ serialize(): IDhcpSearchResultOtherServer {
+ const data: IDhcpSearchResultOtherServer = {
+ };
+ if (typeof this._error !== 'undefined') {
+ data.error = this._error;
+ }
+ if (typeof this._found !== 'undefined') {
+ data.found = this._found;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ found: !this._found ? true : typeof this._found === 'string' && !this._found ? true : this._found,
+ error: !this._error ? true : typeof this._error === 'string' && !this._error ? true : this._error,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpSearchResultOtherServer {
+ return new DhcpSearchResultOtherServer({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpSearchResultStaticIP.ts b/client2/src/lib/entities/DhcpSearchResultStaticIP.ts
new file mode 100644
index 00000000..7b27411a
--- /dev/null
+++ b/client2/src/lib/entities/DhcpSearchResultStaticIP.ts
@@ -0,0 +1,64 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpSearchResultStaticIP {
+ ip?: string;
+ static?: string;
+}
+
+export default class DhcpSearchResultStaticIP {
+ readonly _ip: string | undefined;
+
+ /** */
+ get ip(): string | undefined {
+ return this._ip;
+ }
+
+ readonly _static: string | undefined;
+
+ /**
+ * Description: yes|no|error
+ * Example: yes
+ */
+ get static(): string | undefined {
+ return this._static;
+ }
+
+ constructor(props: IDhcpSearchResultStaticIP) {
+ if (typeof props.ip === 'string') {
+ this._ip = props.ip.trim();
+ }
+ if (typeof props.static === 'string') {
+ this._static = props.static.trim();
+ }
+ }
+
+ serialize(): IDhcpSearchResultStaticIP {
+ const data: IDhcpSearchResultStaticIP = {
+ };
+ if (typeof this._ip !== 'undefined') {
+ data.ip = this._ip;
+ }
+ if (typeof this._static !== 'undefined') {
+ data.static = this._static;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ static: !this._static ? true : typeof this._static === 'string' && !this._static ? true : this._static,
+ ip: !this._ip ? true : typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpSearchResultStaticIP {
+ return new DhcpSearchResultStaticIP({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpSearchV4.ts b/client2/src/lib/entities/DhcpSearchV4.ts
new file mode 100644
index 00000000..01af4419
--- /dev/null
+++ b/client2/src/lib/entities/DhcpSearchV4.ts
@@ -0,0 +1,62 @@
+import DhcpSearchResultOtherServer, { IDhcpSearchResultOtherServer } from './DhcpSearchResultOtherServer';
+import DhcpSearchResultStaticIP, { IDhcpSearchResultStaticIP } from './DhcpSearchResultStaticIP';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpSearchV4 {
+ other_server?: IDhcpSearchResultOtherServer;
+ static_ip?: IDhcpSearchResultStaticIP;
+}
+
+export default class DhcpSearchV4 {
+ readonly _other_server: DhcpSearchResultOtherServer | undefined;
+
+ get otherServer(): DhcpSearchResultOtherServer | undefined {
+ return this._other_server;
+ }
+
+ readonly _static_ip: DhcpSearchResultStaticIP | undefined;
+
+ get staticIp(): DhcpSearchResultStaticIP | undefined {
+ return this._static_ip;
+ }
+
+ constructor(props: IDhcpSearchV4) {
+ if (props.other_server) {
+ this._other_server = new DhcpSearchResultOtherServer(props.other_server);
+ }
+ if (props.static_ip) {
+ this._static_ip = new DhcpSearchResultStaticIP(props.static_ip);
+ }
+ }
+
+ serialize(): IDhcpSearchV4 {
+ const data: IDhcpSearchV4 = {
+ };
+ if (typeof this._other_server !== 'undefined') {
+ data.other_server = this._other_server.serialize();
+ }
+ if (typeof this._static_ip !== 'undefined') {
+ data.static_ip = this._static_ip.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ other_server: !this._other_server ? true : this._other_server.validate().length === 0,
+ static_ip: !this._static_ip ? true : this._static_ip.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpSearchV4 {
+ return new DhcpSearchV4({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpSearchV6.ts b/client2/src/lib/entities/DhcpSearchV6.ts
new file mode 100644
index 00000000..e02134a5
--- /dev/null
+++ b/client2/src/lib/entities/DhcpSearchV6.ts
@@ -0,0 +1,47 @@
+import DhcpSearchResultOtherServer, { IDhcpSearchResultOtherServer } from './DhcpSearchResultOtherServer';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpSearchV6 {
+ other_server?: IDhcpSearchResultOtherServer;
+}
+
+export default class DhcpSearchV6 {
+ readonly _other_server: DhcpSearchResultOtherServer | undefined;
+
+ get otherServer(): DhcpSearchResultOtherServer | undefined {
+ return this._other_server;
+ }
+
+ constructor(props: IDhcpSearchV6) {
+ if (props.other_server) {
+ this._other_server = new DhcpSearchResultOtherServer(props.other_server);
+ }
+ }
+
+ serialize(): IDhcpSearchV6 {
+ const data: IDhcpSearchV6 = {
+ };
+ if (typeof this._other_server !== 'undefined') {
+ data.other_server = this._other_server.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ other_server: !this._other_server ? true : this._other_server.validate().length === 0,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpSearchV6 {
+ return new DhcpSearchV6({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpStaticLease.ts b/client2/src/lib/entities/DhcpStaticLease.ts
new file mode 100644
index 00000000..a365f3b6
--- /dev/null
+++ b/client2/src/lib/entities/DhcpStaticLease.ts
@@ -0,0 +1,85 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpStaticLease {
+ hostname: string;
+ ip: string;
+ mac: string;
+}
+
+export default class DhcpStaticLease {
+ readonly _hostname: string;
+
+ /**
+ * Description: undefined
+ * Example: dell
+ */
+ get hostname(): string {
+ return this._hostname;
+ }
+
+ static hostnameValidate(hostname: string): boolean {
+ return typeof hostname === 'string' && !!hostname.trim();
+ }
+
+ readonly _ip: string;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.1.22
+ */
+ get ip(): string {
+ return this._ip;
+ }
+
+ static ipValidate(ip: string): boolean {
+ return typeof ip === 'string' && !!ip.trim();
+ }
+
+ readonly _mac: string;
+
+ /**
+ * Description: undefined
+ * Example: 00:11:09:b3:b3:b8
+ */
+ get mac(): string {
+ return this._mac;
+ }
+
+ static macValidate(mac: string): boolean {
+ return typeof mac === 'string' && !!mac.trim();
+ }
+
+ constructor(props: IDhcpStaticLease) {
+ this._hostname = props.hostname.trim();
+ this._ip = props.ip.trim();
+ this._mac = props.mac.trim();
+ }
+
+ serialize(): IDhcpStaticLease {
+ const data: IDhcpStaticLease = {
+ hostname: this._hostname,
+ ip: this._ip,
+ mac: this._mac,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ mac: typeof this._mac === 'string' && !this._mac ? true : this._mac,
+ ip: typeof this._ip === 'string' && !this._ip ? true : this._ip,
+ hostname: typeof this._hostname === 'string' && !this._hostname ? true : this._hostname,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpStaticLease {
+ return new DhcpStaticLease({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DhcpStatus.ts b/client2/src/lib/entities/DhcpStatus.ts
new file mode 100644
index 00000000..604daf95
--- /dev/null
+++ b/client2/src/lib/entities/DhcpStatus.ts
@@ -0,0 +1,116 @@
+import DhcpConfigV4, { IDhcpConfigV4 } from './DhcpConfigV4';
+import DhcpConfigV6, { IDhcpConfigV6 } from './DhcpConfigV6';
+import DhcpLease, { IDhcpLease } from './DhcpLease';
+import DhcpStaticLease, { IDhcpStaticLease } from './DhcpStaticLease';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDhcpStatus {
+ enabled?: boolean;
+ interface_name?: string;
+ leases: IDhcpLease[];
+ static_leases?: IDhcpStaticLease[];
+ v4?: IDhcpConfigV4;
+ v6?: IDhcpConfigV6;
+}
+
+export default class DhcpStatus {
+ readonly _enabled: boolean | undefined;
+
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _interface_name: string | undefined;
+
+ get interfaceName(): string | undefined {
+ return this._interface_name;
+ }
+
+ readonly _leases: DhcpLease[];
+
+ get leases(): DhcpLease[] {
+ return this._leases;
+ }
+
+ readonly _static_leases: DhcpStaticLease[] | undefined;
+
+ get staticLeases(): DhcpStaticLease[] | undefined {
+ return this._static_leases;
+ }
+
+ readonly _v4: DhcpConfigV4 | undefined;
+
+ get v4(): DhcpConfigV4 | undefined {
+ return this._v4;
+ }
+
+ readonly _v6: DhcpConfigV6 | undefined;
+
+ get v6(): DhcpConfigV6 | undefined {
+ return this._v6;
+ }
+
+ constructor(props: IDhcpStatus) {
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (typeof props.interface_name === 'string') {
+ this._interface_name = props.interface_name.trim();
+ }
+ this._leases = props.leases.map((p) => new DhcpLease(p));
+ if (props.static_leases) {
+ this._static_leases = props.static_leases.map((p) => new DhcpStaticLease(p));
+ }
+ if (props.v4) {
+ this._v4 = new DhcpConfigV4(props.v4);
+ }
+ if (props.v6) {
+ this._v6 = new DhcpConfigV6(props.v6);
+ }
+ }
+
+ serialize(): IDhcpStatus {
+ const data: IDhcpStatus = {
+ leases: this._leases.map((p) => p.serialize()),
+ };
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._interface_name !== 'undefined') {
+ data.interface_name = this._interface_name;
+ }
+ if (typeof this._static_leases !== 'undefined') {
+ data.static_leases = this._static_leases.map((p) => p.serialize());
+ }
+ if (typeof this._v4 !== 'undefined') {
+ data.v4 = this._v4.serialize();
+ }
+ if (typeof this._v6 !== 'undefined') {
+ data.v6 = this._v6.serialize();
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ interface_name: !this._interface_name ? true : typeof this._interface_name === 'string' && !this._interface_name ? true : this._interface_name,
+ v4: !this._v4 ? true : this._v4.validate().length === 0,
+ v6: !this._v6 ? true : this._v6.validate().length === 0,
+ leases: this._leases.reduce((result, p) => result && p.validate().length === 0, true),
+ static_leases: !this._static_leases ? true : this._static_leases.reduce((result, p) => result && p.validate().length === 0, true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DhcpStatus {
+ return new DhcpStatus({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DnsAnswer.ts b/client2/src/lib/entities/DnsAnswer.ts
new file mode 100644
index 00000000..d3351be3
--- /dev/null
+++ b/client2/src/lib/entities/DnsAnswer.ts
@@ -0,0 +1,85 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDnsAnswer {
+ ttl?: number;
+ type?: string;
+ value?: string;
+}
+
+export default class DnsAnswer {
+ readonly _ttl: number | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 55
+ */
+ get ttl(): number | undefined {
+ return this._ttl;
+ }
+
+ readonly _type: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: A
+ */
+ get type(): string | undefined {
+ return this._type;
+ }
+
+ readonly _value: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 217.69.139.201
+ */
+ get value(): string | undefined {
+ return this._value;
+ }
+
+ constructor(props: IDnsAnswer) {
+ if (typeof props.ttl === 'number') {
+ this._ttl = props.ttl;
+ }
+ if (typeof props.type === 'string') {
+ this._type = props.type.trim();
+ }
+ if (typeof props.value === 'string') {
+ this._value = props.value.trim();
+ }
+ }
+
+ serialize(): IDnsAnswer {
+ const data: IDnsAnswer = {
+ };
+ if (typeof this._ttl !== 'undefined') {
+ data.ttl = this._ttl;
+ }
+ if (typeof this._type !== 'undefined') {
+ data.type = this._type;
+ }
+ if (typeof this._value !== 'undefined') {
+ data.value = this._value;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ ttl: !this._ttl ? true : typeof this._ttl === 'number',
+ type: !this._type ? true : typeof this._type === 'string' && !this._type ? true : this._type,
+ value: !this._value ? true : typeof this._value === 'string' && !this._value ? true : this._value,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DnsAnswer {
+ return new DnsAnswer({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/DnsQuestion.ts b/client2/src/lib/entities/DnsQuestion.ts
new file mode 100644
index 00000000..42849b17
--- /dev/null
+++ b/client2/src/lib/entities/DnsQuestion.ts
@@ -0,0 +1,85 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IDnsQuestion {
+ class?: string;
+ host?: string;
+ type?: string;
+}
+
+export default class DnsQuestion {
+ readonly _class: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: IN
+ */
+ get class(): string | undefined {
+ return this._class;
+ }
+
+ readonly _host: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: example.org
+ */
+ get host(): string | undefined {
+ return this._host;
+ }
+
+ readonly _type: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: A
+ */
+ get type(): string | undefined {
+ return this._type;
+ }
+
+ constructor(props: IDnsQuestion) {
+ if (typeof props.class === 'string') {
+ this._class = props.class.trim();
+ }
+ if (typeof props.host === 'string') {
+ this._host = props.host.trim();
+ }
+ if (typeof props.type === 'string') {
+ this._type = props.type.trim();
+ }
+ }
+
+ serialize(): IDnsQuestion {
+ const data: IDnsQuestion = {
+ };
+ if (typeof this._class !== 'undefined') {
+ data.class = this._class;
+ }
+ if (typeof this._host !== 'undefined') {
+ data.host = this._host;
+ }
+ if (typeof this._type !== 'undefined') {
+ data.type = this._type;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ class: !this._class ? true : typeof this._class === 'string' && !this._class ? true : this._class,
+ host: !this._host ? true : typeof this._host === 'string' && !this._host ? true : this._host,
+ type: !this._type ? true : typeof this._type === 'string' && !this._type ? true : this._type,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): DnsQuestion {
+ return new DnsQuestion({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/Error.ts b/client2/src/lib/entities/Error.ts
new file mode 100644
index 00000000..79d16b5c
--- /dev/null
+++ b/client2/src/lib/entities/Error.ts
@@ -0,0 +1,46 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IError {
+ message?: string;
+}
+
+export default class Error {
+ readonly _message: string | undefined;
+
+ /** */
+ get message(): string | undefined {
+ return this._message;
+ }
+
+ constructor(props: IError) {
+ if (typeof props.message === 'string') {
+ this._message = props.message.trim();
+ }
+ }
+
+ serialize(): IError {
+ const data: IError = {
+ };
+ if (typeof this._message !== 'undefined') {
+ data.message = this._message;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ message: !this._message ? true : typeof this._message === 'string' && !this._message ? true : this._message,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Error {
+ return new Error({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/Filter.ts b/client2/src/lib/entities/Filter.ts
new file mode 100644
index 00000000..71255c8c
--- /dev/null
+++ b/client2/src/lib/entities/Filter.ts
@@ -0,0 +1,136 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilter {
+ enabled: boolean;
+ id: number;
+ lastUpdated: string;
+ name: string;
+ rulesCount: number;
+ url: string;
+}
+
+export default class Filter {
+ readonly _enabled: boolean;
+
+ get enabled(): boolean {
+ return this._enabled;
+ }
+
+ static enabledValidate(enabled: boolean): boolean {
+ return typeof enabled === 'boolean';
+ }
+
+ readonly _id: number;
+
+ /**
+ * Description: undefined
+ * Example: 1234
+ */
+ get id(): number {
+ return this._id;
+ }
+
+ static idValidate(id: number): boolean {
+ return typeof id === 'number';
+ }
+
+ readonly _lastUpdated: string;
+
+ /**
+ * Description: undefined
+ * Example: 2018-10-30T12:18:57+03:00
+ */
+ get lastUpdated(): string {
+ return this._lastUpdated;
+ }
+
+ static lastUpdatedValidate(lastUpdated: string): boolean {
+ return typeof lastUpdated === 'string' && !!lastUpdated.trim();
+ }
+
+ readonly _name: string;
+
+ /**
+ * Description: undefined
+ * Example: AdGuard Simplified Domain Names filter
+ */
+ get name(): string {
+ return this._name;
+ }
+
+ static nameValidate(name: string): boolean {
+ return typeof name === 'string' && !!name.trim();
+ }
+
+ readonly _rulesCount: number;
+
+ /**
+ * Description: undefined
+ * Example: 5912
+ */
+ get rulesCount(): number {
+ return this._rulesCount;
+ }
+
+ static rulesCountValidate(rulesCount: number): boolean {
+ return typeof rulesCount === 'number';
+ }
+
+ readonly _url: string;
+
+ /**
+ * Description: undefined
+ * Example: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
+ *
+ */
+ get url(): string {
+ return this._url;
+ }
+
+ static urlValidate(url: string): boolean {
+ return typeof url === 'string' && !!url.trim();
+ }
+
+ constructor(props: IFilter) {
+ this._enabled = props.enabled;
+ this._id = props.id;
+ this._lastUpdated = props.lastUpdated.trim();
+ this._name = props.name.trim();
+ this._rulesCount = props.rulesCount;
+ this._url = props.url.trim();
+ }
+
+ serialize(): IFilter {
+ const data: IFilter = {
+ enabled: this._enabled,
+ id: this._id,
+ lastUpdated: this._lastUpdated,
+ name: this._name,
+ rulesCount: this._rulesCount,
+ url: this._url,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: typeof this._enabled === 'boolean',
+ id: typeof this._id === 'number',
+ lastUpdated: typeof this._lastUpdated === 'string' && !this._lastUpdated ? true : this._lastUpdated,
+ name: typeof this._name === 'string' && !this._name ? true : this._name,
+ rulesCount: typeof this._rulesCount === 'number',
+ url: typeof this._url === 'string' && !this._url ? true : this._url,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Filter {
+ return new Filter({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterCheckHostResponse.ts b/client2/src/lib/entities/FilterCheckHostResponse.ts
new file mode 100644
index 00000000..2f0daa9a
--- /dev/null
+++ b/client2/src/lib/entities/FilterCheckHostResponse.ts
@@ -0,0 +1,143 @@
+import ResultRule, { IResultRule } from './ResultRule';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterCheckHostResponse {
+ cname?: string;
+ filter_id?: number;
+ ip_addrs?: string[];
+ reason?: string;
+ rule?: string;
+ rules?: IResultRule[];
+ service_name?: string;
+}
+
+export default class FilterCheckHostResponse {
+ readonly _cname: string | undefined;
+
+ /** */
+ get cname(): string | undefined {
+ return this._cname;
+ }
+
+ readonly _filter_id: number | undefined;
+
+ /** */
+ get filterId(): number | undefined {
+ return this._filter_id;
+ }
+
+ readonly _ip_addrs: string[] | undefined;
+
+ /** */
+ get ipAddrs(): string[] | undefined {
+ return this._ip_addrs;
+ }
+
+ readonly _reason: string | undefined;
+
+ /** */
+ get reason(): string | undefined {
+ return this._reason;
+ }
+
+ readonly _rule: string | undefined;
+
+ /**
+ * Description: Filtering rule applied to the request (if any).
+ * Deprecated: use `rules[*].text` instead.
+ *
+ * Example: ||example.org^
+ */
+ get rule(): string | undefined {
+ return this._rule;
+ }
+
+ readonly _rules: ResultRule[] | undefined;
+
+ /** */
+ get rules(): ResultRule[] | undefined {
+ return this._rules;
+ }
+
+ readonly _service_name: string | undefined;
+
+ /** */
+ get serviceName(): string | undefined {
+ return this._service_name;
+ }
+
+ constructor(props: IFilterCheckHostResponse) {
+ if (typeof props.cname === 'string') {
+ this._cname = props.cname.trim();
+ }
+ if (typeof props.filter_id === 'number') {
+ this._filter_id = props.filter_id;
+ }
+ if (props.ip_addrs) {
+ this._ip_addrs = props.ip_addrs;
+ }
+ if (typeof props.reason === 'string') {
+ this._reason = props.reason.trim();
+ }
+ if (typeof props.rule === 'string') {
+ this._rule = props.rule.trim();
+ }
+ if (props.rules) {
+ this._rules = props.rules.map((p) => new ResultRule(p));
+ }
+ if (typeof props.service_name === 'string') {
+ this._service_name = props.service_name.trim();
+ }
+ }
+
+ serialize(): IFilterCheckHostResponse {
+ const data: IFilterCheckHostResponse = {
+ };
+ if (typeof this._cname !== 'undefined') {
+ data.cname = this._cname;
+ }
+ if (typeof this._filter_id !== 'undefined') {
+ data.filter_id = this._filter_id;
+ }
+ if (typeof this._ip_addrs !== 'undefined') {
+ data.ip_addrs = this._ip_addrs;
+ }
+ if (typeof this._reason !== 'undefined') {
+ data.reason = this._reason;
+ }
+ if (typeof this._rule !== 'undefined') {
+ data.rule = this._rule;
+ }
+ if (typeof this._rules !== 'undefined') {
+ data.rules = this._rules.map((p) => p.serialize());
+ }
+ if (typeof this._service_name !== 'undefined') {
+ data.service_name = this._service_name;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ reason: !this._reason ? true : typeof this._reason === 'string' && !this._reason ? true : this._reason,
+ filter_id: !this._filter_id ? true : typeof this._filter_id === 'number',
+ rule: !this._rule ? true : typeof this._rule === 'string' && !this._rule ? true : this._rule,
+ rules: !this._rules ? true : this._rules.reduce((result, p) => result && p.validate().length === 0, true),
+ service_name: !this._service_name ? true : typeof this._service_name === 'string' && !this._service_name ? true : this._service_name,
+ cname: !this._cname ? true : typeof this._cname === 'string' && !this._cname ? true : this._cname,
+ ip_addrs: !this._ip_addrs ? true : this._ip_addrs.reduce((result, p) => result && typeof p === 'string', true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterCheckHostResponse {
+ return new FilterCheckHostResponse({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterConfig.ts b/client2/src/lib/entities/FilterConfig.ts
new file mode 100644
index 00000000..b1691de1
--- /dev/null
+++ b/client2/src/lib/entities/FilterConfig.ts
@@ -0,0 +1,59 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterConfig {
+ enabled?: boolean;
+ interval?: number;
+}
+
+export default class FilterConfig {
+ readonly _enabled: boolean | undefined;
+
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _interval: number | undefined;
+
+ get interval(): number | undefined {
+ return this._interval;
+ }
+
+ constructor(props: IFilterConfig) {
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (typeof props.interval === 'number') {
+ this._interval = props.interval;
+ }
+ }
+
+ serialize(): IFilterConfig {
+ const data: IFilterConfig = {
+ };
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._interval !== 'undefined') {
+ data.interval = this._interval;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ interval: !this._interval ? true : typeof this._interval === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterConfig {
+ return new FilterConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterRefreshRequest.ts b/client2/src/lib/entities/FilterRefreshRequest.ts
new file mode 100644
index 00000000..3b274ddb
--- /dev/null
+++ b/client2/src/lib/entities/FilterRefreshRequest.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterRefreshRequest {
+ whitelist?: boolean;
+}
+
+export default class FilterRefreshRequest {
+ readonly _whitelist: boolean | undefined;
+
+ get whitelist(): boolean | undefined {
+ return this._whitelist;
+ }
+
+ constructor(props: IFilterRefreshRequest) {
+ if (typeof props.whitelist === 'boolean') {
+ this._whitelist = props.whitelist;
+ }
+ }
+
+ serialize(): IFilterRefreshRequest {
+ const data: IFilterRefreshRequest = {
+ };
+ if (typeof this._whitelist !== 'undefined') {
+ data.whitelist = this._whitelist;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ whitelist: !this._whitelist ? true : typeof this._whitelist === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterRefreshRequest {
+ return new FilterRefreshRequest({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterRefreshResponse.ts b/client2/src/lib/entities/FilterRefreshResponse.ts
new file mode 100644
index 00000000..96d45b09
--- /dev/null
+++ b/client2/src/lib/entities/FilterRefreshResponse.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterRefreshResponse {
+ updated?: number;
+}
+
+export default class FilterRefreshResponse {
+ readonly _updated: number | undefined;
+
+ get updated(): number | undefined {
+ return this._updated;
+ }
+
+ constructor(props: IFilterRefreshResponse) {
+ if (typeof props.updated === 'number') {
+ this._updated = props.updated;
+ }
+ }
+
+ serialize(): IFilterRefreshResponse {
+ const data: IFilterRefreshResponse = {
+ };
+ if (typeof this._updated !== 'undefined') {
+ data.updated = this._updated;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ updated: !this._updated ? true : typeof this._updated === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterRefreshResponse {
+ return new FilterRefreshResponse({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterSetUrl.ts b/client2/src/lib/entities/FilterSetUrl.ts
new file mode 100644
index 00000000..92eccfc7
--- /dev/null
+++ b/client2/src/lib/entities/FilterSetUrl.ts
@@ -0,0 +1,72 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterSetUrl {
+ data?: any;
+ url?: string;
+ whitelist?: boolean;
+}
+
+export default class FilterSetUrl {
+ readonly _data: any | undefined;
+
+ get data(): any | undefined {
+ return this._data;
+ }
+
+ readonly _url: string | undefined;
+
+ get url(): string | undefined {
+ return this._url;
+ }
+
+ readonly _whitelist: boolean | undefined;
+
+ get whitelist(): boolean | undefined {
+ return this._whitelist;
+ }
+
+ constructor(props: IFilterSetUrl) {
+ if (props.data) {
+ this._data = props.data;
+ }
+ if (typeof props.url === 'string') {
+ this._url = props.url.trim();
+ }
+ if (typeof props.whitelist === 'boolean') {
+ this._whitelist = props.whitelist;
+ }
+ }
+
+ serialize(): IFilterSetUrl {
+ const data: IFilterSetUrl = {
+ };
+ if (typeof this._data !== 'undefined') {
+ data.data = this._data;
+ }
+ if (typeof this._url !== 'undefined') {
+ data.url = this._url;
+ }
+ if (typeof this._whitelist !== 'undefined') {
+ data.whitelist = this._whitelist;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ url: !this._url ? true : typeof this._url === 'string' && !this._url ? true : this._url,
+ whitelist: !this._whitelist ? true : typeof this._whitelist === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterSetUrl {
+ return new FilterSetUrl({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/FilterStatus.ts b/client2/src/lib/entities/FilterStatus.ts
new file mode 100644
index 00000000..be63d512
--- /dev/null
+++ b/client2/src/lib/entities/FilterStatus.ts
@@ -0,0 +1,89 @@
+import Filter, { IFilter } from './Filter';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IFilterStatus {
+ enabled?: boolean;
+ filters?: IFilter[];
+ interval?: number;
+ user_rules?: string[];
+}
+
+export default class FilterStatus {
+ readonly _enabled: boolean | undefined;
+
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _filters: Filter[] | undefined;
+
+ get filters(): Filter[] | undefined {
+ return this._filters;
+ }
+
+ readonly _interval: number | undefined;
+
+ get interval(): number | undefined {
+ return this._interval;
+ }
+
+ readonly _user_rules: string[] | undefined;
+
+ get userRules(): string[] | undefined {
+ return this._user_rules;
+ }
+
+ constructor(props: IFilterStatus) {
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (props.filters) {
+ this._filters = props.filters.map((p) => new Filter(p));
+ }
+ if (typeof props.interval === 'number') {
+ this._interval = props.interval;
+ }
+ if (props.user_rules) {
+ this._user_rules = props.user_rules;
+ }
+ }
+
+ serialize(): IFilterStatus {
+ const data: IFilterStatus = {
+ };
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._filters !== 'undefined') {
+ data.filters = this._filters.map((p) => p.serialize());
+ }
+ if (typeof this._interval !== 'undefined') {
+ data.interval = this._interval;
+ }
+ if (typeof this._user_rules !== 'undefined') {
+ data.user_rules = this._user_rules;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ interval: !this._interval ? true : typeof this._interval === 'number',
+ filters: !this._filters ? true : this._filters.reduce((result, p) => result && p.validate().length === 0, true),
+ user_rules: !this._user_rules ? true : this._user_rules.reduce((result, p) => result && typeof p === 'string', true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): FilterStatus {
+ return new FilterStatus({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/GetVersionRequest.ts b/client2/src/lib/entities/GetVersionRequest.ts
new file mode 100644
index 00000000..8677bb11
--- /dev/null
+++ b/client2/src/lib/entities/GetVersionRequest.ts
@@ -0,0 +1,46 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IGetVersionRequest {
+ recheck_now?: boolean;
+}
+
+export default class GetVersionRequest {
+ readonly _recheck_now: boolean | undefined;
+
+ /** */
+ get recheckNow(): boolean | undefined {
+ return this._recheck_now;
+ }
+
+ constructor(props: IGetVersionRequest) {
+ if (typeof props.recheck_now === 'boolean') {
+ this._recheck_now = props.recheck_now;
+ }
+ }
+
+ serialize(): IGetVersionRequest {
+ const data: IGetVersionRequest = {
+ };
+ if (typeof this._recheck_now !== 'undefined') {
+ data.recheck_now = this._recheck_now;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ recheck_now: !this._recheck_now ? true : typeof this._recheck_now === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): GetVersionRequest {
+ return new GetVersionRequest({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/InitialConfiguration.ts b/client2/src/lib/entities/InitialConfiguration.ts
new file mode 100644
index 00000000..1bb32c3c
--- /dev/null
+++ b/client2/src/lib/entities/InitialConfiguration.ts
@@ -0,0 +1,89 @@
+import AddressInfo, { IAddressInfo } from './AddressInfo';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IInitialConfiguration {
+ dns: IAddressInfo;
+ password: string;
+ username: string;
+ web: IAddressInfo;
+}
+
+export default class InitialConfiguration {
+ readonly _dns: AddressInfo;
+
+ get dns(): AddressInfo {
+ return this._dns;
+ }
+
+ readonly _password: string;
+
+ /**
+ * Description: Basic auth password
+ * Example: password
+ */
+ get password(): string {
+ return this._password;
+ }
+
+ static passwordValidate(password: string): boolean {
+ return typeof password === 'string' && !!password.trim();
+ }
+
+ readonly _username: string;
+
+ /**
+ * Description: Basic auth username
+ * Example: admin
+ */
+ get username(): string {
+ return this._username;
+ }
+
+ static usernameValidate(username: string): boolean {
+ return typeof username === 'string' && !!username.trim();
+ }
+
+ readonly _web: AddressInfo;
+
+ get web(): AddressInfo {
+ return this._web;
+ }
+
+ constructor(props: IInitialConfiguration) {
+ this._dns = new AddressInfo(props.dns);
+ this._password = props.password.trim();
+ this._username = props.username.trim();
+ this._web = new AddressInfo(props.web);
+ }
+
+ serialize(): IInitialConfiguration {
+ const data: IInitialConfiguration = {
+ dns: this._dns.serialize(),
+ password: this._password,
+ username: this._username,
+ web: this._web.serialize(),
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns: this._dns.validate().length === 0,
+ web: this._web.validate().length === 0,
+ username: typeof this._username === 'string' && !this._username ? true : this._username,
+ password: typeof this._password === 'string' && !this._password ? true : this._password,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): InitialConfiguration {
+ return new InitialConfiguration({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/InitialConfigurationBeta.ts b/client2/src/lib/entities/InitialConfigurationBeta.ts
new file mode 100644
index 00000000..bbf09595
--- /dev/null
+++ b/client2/src/lib/entities/InitialConfigurationBeta.ts
@@ -0,0 +1,89 @@
+import AddressInfoBeta, { IAddressInfoBeta } from './AddressInfoBeta';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IInitialConfigurationBeta {
+ dns: IAddressInfoBeta;
+ password: string;
+ username: string;
+ web: IAddressInfoBeta;
+}
+
+export default class InitialConfigurationBeta {
+ readonly _dns: AddressInfoBeta;
+
+ get dns(): AddressInfoBeta {
+ return this._dns;
+ }
+
+ readonly _password: string;
+
+ /**
+ * Description: Basic auth password
+ * Example: password
+ */
+ get password(): string {
+ return this._password;
+ }
+
+ static passwordValidate(password: string): boolean {
+ return typeof password === 'string' && !!password.trim();
+ }
+
+ readonly _username: string;
+
+ /**
+ * Description: Basic auth username
+ * Example: admin
+ */
+ get username(): string {
+ return this._username;
+ }
+
+ static usernameValidate(username: string): boolean {
+ return typeof username === 'string' && !!username.trim();
+ }
+
+ readonly _web: AddressInfoBeta;
+
+ get web(): AddressInfoBeta {
+ return this._web;
+ }
+
+ constructor(props: IInitialConfigurationBeta) {
+ this._dns = new AddressInfoBeta(props.dns);
+ this._password = props.password.trim();
+ this._username = props.username.trim();
+ this._web = new AddressInfoBeta(props.web);
+ }
+
+ serialize(): IInitialConfigurationBeta {
+ const data: IInitialConfigurationBeta = {
+ dns: this._dns.serialize(),
+ password: this._password,
+ username: this._username,
+ web: this._web.serialize(),
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns: this._dns.validate().length === 0,
+ web: this._web.validate().length === 0,
+ username: typeof this._username === 'string' && !this._username ? true : this._username,
+ password: typeof this._password === 'string' && !this._password ? true : this._password,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): InitialConfigurationBeta {
+ return new InitialConfigurationBeta({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/Login.ts b/client2/src/lib/entities/Login.ts
new file mode 100644
index 00000000..9b642f45
--- /dev/null
+++ b/client2/src/lib/entities/Login.ts
@@ -0,0 +1,61 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ILogin {
+ password?: string;
+ username?: string;
+}
+
+export default class Login {
+ readonly _password: string | undefined;
+
+ /** */
+ get password(): string | undefined {
+ return this._password;
+ }
+
+ readonly _username: string | undefined;
+
+ /** */
+ get username(): string | undefined {
+ return this._username;
+ }
+
+ constructor(props: ILogin) {
+ if (typeof props.password === 'string') {
+ this._password = props.password.trim();
+ }
+ if (typeof props.username === 'string') {
+ this._username = props.username.trim();
+ }
+ }
+
+ serialize(): ILogin {
+ const data: ILogin = {
+ };
+ if (typeof this._password !== 'undefined') {
+ data.password = this._password;
+ }
+ if (typeof this._username !== 'undefined') {
+ data.username = this._username;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ username: !this._username ? true : typeof this._username === 'string' && !this._username ? true : this._username,
+ password: !this._password ? true : typeof this._password === 'string' && !this._password ? true : this._password,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Login {
+ return new Login({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/NetInterface.ts b/client2/src/lib/entities/NetInterface.ts
new file mode 100644
index 00000000..3f3d6e3e
--- /dev/null
+++ b/client2/src/lib/entities/NetInterface.ts
@@ -0,0 +1,113 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface INetInterface {
+ flags: string;
+ hardware_address: string;
+ ip_addresses?: string[];
+ mtu: number;
+ name: string;
+}
+
+export default class NetInterface {
+ readonly _flags: string;
+
+ /**
+ * Description: undefined
+ * Example: up|broadcast|multicast
+ */
+ get flags(): string {
+ return this._flags;
+ }
+
+ static flagsValidate(flags: string): boolean {
+ return typeof flags === 'string' && !!flags.trim();
+ }
+
+ readonly _hardware_address: string;
+
+ /**
+ * Description: undefined
+ * Example: 52:54:00:11:09:ba
+ */
+ get hardwareAddress(): string {
+ return this._hardware_address;
+ }
+
+ static hardwareAddressValidate(hardwareAddress: string): boolean {
+ return typeof hardwareAddress === 'string' && !!hardwareAddress.trim();
+ }
+
+ readonly _ip_addresses: string[] | undefined;
+
+ get ipAddresses(): string[] | undefined {
+ return this._ip_addresses;
+ }
+
+ readonly _mtu: number;
+
+ get mtu(): number {
+ return this._mtu;
+ }
+
+ static mtuValidate(mtu: number): boolean {
+ return typeof mtu === 'number';
+ }
+
+ readonly _name: string;
+
+ /**
+ * Description: undefined
+ * Example: eth0
+ */
+ get name(): string {
+ return this._name;
+ }
+
+ static nameValidate(name: string): boolean {
+ return typeof name === 'string' && !!name.trim();
+ }
+
+ constructor(props: INetInterface) {
+ this._flags = props.flags.trim();
+ this._hardware_address = props.hardware_address.trim();
+ if (props.ip_addresses) {
+ this._ip_addresses = props.ip_addresses;
+ }
+ this._mtu = props.mtu;
+ this._name = props.name.trim();
+ }
+
+ serialize(): INetInterface {
+ const data: INetInterface = {
+ flags: this._flags,
+ hardware_address: this._hardware_address,
+ mtu: this._mtu,
+ name: this._name,
+ };
+ if (typeof this._ip_addresses !== 'undefined') {
+ data.ip_addresses = this._ip_addresses;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ flags: typeof this._flags === 'string' && !this._flags ? true : this._flags,
+ hardware_address: typeof this._hardware_address === 'string' && !this._hardware_address ? true : this._hardware_address,
+ name: typeof this._name === 'string' && !this._name ? true : this._name,
+ ip_addresses: !this._ip_addresses ? true : this._ip_addresses.reduce((result, p) => result && typeof p === 'string', true),
+ mtu: typeof this._mtu === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): NetInterface {
+ return new NetInterface({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ProfileInfo.ts b/client2/src/lib/entities/ProfileInfo.ts
new file mode 100644
index 00000000..0a8f099c
--- /dev/null
+++ b/client2/src/lib/entities/ProfileInfo.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IProfileInfo {
+ name?: string;
+}
+
+export default class ProfileInfo {
+ readonly _name: string | undefined;
+
+ get name(): string | undefined {
+ return this._name;
+ }
+
+ constructor(props: IProfileInfo) {
+ if (typeof props.name === 'string') {
+ this._name = props.name.trim();
+ }
+ }
+
+ serialize(): IProfileInfo {
+ const data: IProfileInfo = {
+ };
+ if (typeof this._name !== 'undefined') {
+ data.name = this._name;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ProfileInfo {
+ return new ProfileInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/QueryLog.ts b/client2/src/lib/entities/QueryLog.ts
new file mode 100644
index 00000000..da2b7761
--- /dev/null
+++ b/client2/src/lib/entities/QueryLog.ts
@@ -0,0 +1,65 @@
+import QueryLogItem, { IQueryLogItem } from './QueryLogItem';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IQueryLog {
+ data?: IQueryLogItem[];
+ oldest?: string;
+}
+
+export default class QueryLog {
+ readonly _data: QueryLogItem[] | undefined;
+
+ get data(): QueryLogItem[] | undefined {
+ return this._data;
+ }
+
+ readonly _oldest: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 2018-11-26T00:02:41+03:00
+ */
+ get oldest(): string | undefined {
+ return this._oldest;
+ }
+
+ constructor(props: IQueryLog) {
+ if (props.data) {
+ this._data = props.data.map((p) => new QueryLogItem(p));
+ }
+ if (typeof props.oldest === 'string') {
+ this._oldest = props.oldest.trim();
+ }
+ }
+
+ serialize(): IQueryLog {
+ const data: IQueryLog = {
+ };
+ if (typeof this._data !== 'undefined') {
+ data.data = this._data.map((p) => p.serialize());
+ }
+ if (typeof this._oldest !== 'undefined') {
+ data.oldest = this._oldest;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ oldest: !this._oldest ? true : typeof this._oldest === 'string' && !this._oldest ? true : this._oldest,
+ data: !this._data ? true : this._data.reduce((result, p) => result && p.validate().length === 0, true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): QueryLog {
+ return new QueryLog({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/QueryLogConfig.ts b/client2/src/lib/entities/QueryLogConfig.ts
new file mode 100644
index 00000000..e767d72c
--- /dev/null
+++ b/client2/src/lib/entities/QueryLogConfig.ts
@@ -0,0 +1,76 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IQueryLogConfig {
+ anonymize_client_ip?: boolean;
+ enabled?: boolean;
+ interval?: number;
+}
+
+export default class QueryLogConfig {
+ readonly _anonymize_client_ip: boolean | undefined;
+
+ /** */
+ get anonymizeClientIp(): boolean | undefined {
+ return this._anonymize_client_ip;
+ }
+
+ readonly _enabled: boolean | undefined;
+
+ /** */
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _interval: number | undefined;
+
+ /** */
+ get interval(): number | undefined {
+ return this._interval;
+ }
+
+ constructor(props: IQueryLogConfig) {
+ if (typeof props.anonymize_client_ip === 'boolean') {
+ this._anonymize_client_ip = props.anonymize_client_ip;
+ }
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (typeof props.interval === 'number') {
+ this._interval = props.interval;
+ }
+ }
+
+ serialize(): IQueryLogConfig {
+ const data: IQueryLogConfig = {
+ };
+ if (typeof this._anonymize_client_ip !== 'undefined') {
+ data.anonymize_client_ip = this._anonymize_client_ip;
+ }
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._interval !== 'undefined') {
+ data.interval = this._interval;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ interval: !this._interval ? true : typeof this._interval === 'number',
+ anonymize_client_ip: !this._anonymize_client_ip ? true : typeof this._anonymize_client_ip === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): QueryLogConfig {
+ return new QueryLogConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/QueryLogItem.ts b/client2/src/lib/entities/QueryLogItem.ts
new file mode 100644
index 00000000..caf7819c
--- /dev/null
+++ b/client2/src/lib/entities/QueryLogItem.ts
@@ -0,0 +1,277 @@
+import DnsAnswer, { IDnsAnswer } from './DnsAnswer';
+import DnsQuestion, { IDnsQuestion } from './DnsQuestion';
+import ResultRule, { IResultRule } from './ResultRule';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IQueryLogItem {
+ answer?: IDnsAnswer[];
+ answer_dnssec?: boolean;
+ client?: string;
+ client_proto?: any;
+ elapsedMs?: string;
+ filterId?: number;
+ original_answer?: IDnsAnswer[];
+ question?: IDnsQuestion;
+ reason?: string;
+ rule?: string;
+ rules?: IResultRule[];
+ service_name?: string;
+ status?: string;
+ time?: string;
+ upstream?: string;
+}
+
+export default class QueryLogItem {
+ readonly _answer: DnsAnswer[] | undefined;
+
+ get answer(): DnsAnswer[] | undefined {
+ return this._answer;
+ }
+
+ readonly _answer_dnssec: boolean | undefined;
+
+ get answerDnssec(): boolean | undefined {
+ return this._answer_dnssec;
+ }
+
+ readonly _client: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 192.168.0.1
+ */
+ get client(): string | undefined {
+ return this._client;
+ }
+
+ readonly _client_proto: any | undefined;
+
+ get clientProto(): any | undefined {
+ return this._client_proto;
+ }
+
+ readonly _elapsedMs: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: 54.023928
+ */
+ get elapsedMs(): string | undefined {
+ return this._elapsedMs;
+ }
+
+ readonly _filterId: number | undefined;
+
+ /**
+ * Description: In case if there's a rule applied to this DNS request, this is ID of the filter list that the rule belongs to.
+ * Deprecated: use `rules[*].filter_list_id` instead.
+ *
+ * Example: 123123
+ */
+ get filterId(): number | undefined {
+ return this._filterId;
+ }
+
+ readonly _original_answer: DnsAnswer[] | undefined;
+
+ /** */
+ get originalAnswer(): DnsAnswer[] | undefined {
+ return this._original_answer;
+ }
+
+ readonly _question: DnsQuestion | undefined;
+
+ get question(): DnsQuestion | undefined {
+ return this._question;
+ }
+
+ readonly _reason: string | undefined;
+
+ /** */
+ get reason(): string | undefined {
+ return this._reason;
+ }
+
+ readonly _rule: string | undefined;
+
+ /**
+ * Description: Filtering rule applied to the request (if any).
+ * Deprecated: use `rules[*].text` instead.
+ *
+ * Example: ||example.org^
+ */
+ get rule(): string | undefined {
+ return this._rule;
+ }
+
+ readonly _rules: ResultRule[] | undefined;
+
+ /** */
+ get rules(): ResultRule[] | undefined {
+ return this._rules;
+ }
+
+ readonly _service_name: string | undefined;
+
+ /** */
+ get serviceName(): string | undefined {
+ return this._service_name;
+ }
+
+ readonly _status: string | undefined;
+
+ /**
+ * Description: DNS response status
+ * Example: NOERROR
+ */
+ get status(): string | undefined {
+ return this._status;
+ }
+
+ readonly _time: string | undefined;
+
+ /**
+ * Description: DNS request processing start time
+ * Example: 2018-11-26T00:02:41+03:00
+ */
+ get time(): string | undefined {
+ return this._time;
+ }
+
+ readonly _upstream: string | undefined;
+
+ /** */
+ get upstream(): string | undefined {
+ return this._upstream;
+ }
+
+ constructor(props: IQueryLogItem) {
+ if (props.answer) {
+ this._answer = props.answer.map((p) => new DnsAnswer(p));
+ }
+ if (typeof props.answer_dnssec === 'boolean') {
+ this._answer_dnssec = props.answer_dnssec;
+ }
+ if (typeof props.client === 'string') {
+ this._client = props.client.trim();
+ }
+ if (props.client_proto) {
+ this._client_proto = props.client_proto;
+ }
+ if (typeof props.elapsedMs === 'string') {
+ this._elapsedMs = props.elapsedMs.trim();
+ }
+ if (typeof props.filterId === 'number') {
+ this._filterId = props.filterId;
+ }
+ if (props.original_answer) {
+ this._original_answer = props.original_answer.map((p) => new DnsAnswer(p));
+ }
+ if (props.question) {
+ this._question = new DnsQuestion(props.question);
+ }
+ if (typeof props.reason === 'string') {
+ this._reason = props.reason.trim();
+ }
+ if (typeof props.rule === 'string') {
+ this._rule = props.rule.trim();
+ }
+ if (props.rules) {
+ this._rules = props.rules.map((p) => new ResultRule(p));
+ }
+ if (typeof props.service_name === 'string') {
+ this._service_name = props.service_name.trim();
+ }
+ if (typeof props.status === 'string') {
+ this._status = props.status.trim();
+ }
+ if (typeof props.time === 'string') {
+ this._time = props.time.trim();
+ }
+ if (typeof props.upstream === 'string') {
+ this._upstream = props.upstream.trim();
+ }
+ }
+
+ serialize(): IQueryLogItem {
+ const data: IQueryLogItem = {
+ };
+ if (typeof this._answer !== 'undefined') {
+ data.answer = this._answer.map((p) => p.serialize());
+ }
+ if (typeof this._answer_dnssec !== 'undefined') {
+ data.answer_dnssec = this._answer_dnssec;
+ }
+ if (typeof this._client !== 'undefined') {
+ data.client = this._client;
+ }
+ if (typeof this._client_proto !== 'undefined') {
+ data.client_proto = this._client_proto;
+ }
+ if (typeof this._elapsedMs !== 'undefined') {
+ data.elapsedMs = this._elapsedMs;
+ }
+ if (typeof this._filterId !== 'undefined') {
+ data.filterId = this._filterId;
+ }
+ if (typeof this._original_answer !== 'undefined') {
+ data.original_answer = this._original_answer.map((p) => p.serialize());
+ }
+ if (typeof this._question !== 'undefined') {
+ data.question = this._question.serialize();
+ }
+ if (typeof this._reason !== 'undefined') {
+ data.reason = this._reason;
+ }
+ if (typeof this._rule !== 'undefined') {
+ data.rule = this._rule;
+ }
+ if (typeof this._rules !== 'undefined') {
+ data.rules = this._rules.map((p) => p.serialize());
+ }
+ if (typeof this._service_name !== 'undefined') {
+ data.service_name = this._service_name;
+ }
+ if (typeof this._status !== 'undefined') {
+ data.status = this._status;
+ }
+ if (typeof this._time !== 'undefined') {
+ data.time = this._time;
+ }
+ if (typeof this._upstream !== 'undefined') {
+ data.upstream = this._upstream;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ answer: !this._answer ? true : this._answer.reduce((result, p) => result && p.validate().length === 0, true),
+ original_answer: !this._original_answer ? true : this._original_answer.reduce((result, p) => result && p.validate().length === 0, true),
+ upstream: !this._upstream ? true : typeof this._upstream === 'string' && !this._upstream ? true : this._upstream,
+ answer_dnssec: !this._answer_dnssec ? true : typeof this._answer_dnssec === 'boolean',
+ client: !this._client ? true : typeof this._client === 'string' && !this._client ? true : this._client,
+ elapsedMs: !this._elapsedMs ? true : typeof this._elapsedMs === 'string' && !this._elapsedMs ? true : this._elapsedMs,
+ question: !this._question ? true : this._question.validate().length === 0,
+ filterId: !this._filterId ? true : typeof this._filterId === 'number',
+ rule: !this._rule ? true : typeof this._rule === 'string' && !this._rule ? true : this._rule,
+ rules: !this._rules ? true : this._rules.reduce((result, p) => result && p.validate().length === 0, true),
+ reason: !this._reason ? true : typeof this._reason === 'string' && !this._reason ? true : this._reason,
+ service_name: !this._service_name ? true : typeof this._service_name === 'string' && !this._service_name ? true : this._service_name,
+ status: !this._status ? true : typeof this._status === 'string' && !this._status ? true : this._status,
+ time: !this._time ? true : typeof this._time === 'string' && !this._time ? true : this._time,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): QueryLogItem {
+ return new QueryLogItem({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/RemoveUrlRequest.ts b/client2/src/lib/entities/RemoveUrlRequest.ts
new file mode 100644
index 00000000..b45571a0
--- /dev/null
+++ b/client2/src/lib/entities/RemoveUrlRequest.ts
@@ -0,0 +1,49 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IRemoveUrlRequest {
+ url?: string;
+}
+
+export default class RemoveUrlRequest {
+ readonly _url: string | undefined;
+
+ /**
+ * Description: Previously added URL containing filtering rules
+ * Example: https://filters.adtidy.org/windows/filters/15.txt
+ */
+ get url(): string | undefined {
+ return this._url;
+ }
+
+ constructor(props: IRemoveUrlRequest) {
+ if (typeof props.url === 'string') {
+ this._url = props.url.trim();
+ }
+ }
+
+ serialize(): IRemoveUrlRequest {
+ const data: IRemoveUrlRequest = {
+ };
+ if (typeof this._url !== 'undefined') {
+ data.url = this._url;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ url: !this._url ? true : typeof this._url === 'string' && !this._url ? true : this._url,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): RemoveUrlRequest {
+ return new RemoveUrlRequest({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ResultRule.ts b/client2/src/lib/entities/ResultRule.ts
new file mode 100644
index 00000000..d0f03c98
--- /dev/null
+++ b/client2/src/lib/entities/ResultRule.ts
@@ -0,0 +1,69 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IResultRule {
+ filter_list_id?: number;
+ text?: string;
+}
+
+export default class ResultRule {
+ readonly _filter_list_id: number | undefined;
+
+ /**
+ * Description: In case if there's a rule applied to this DNS request, this is ID of the filter list that the rule belongs to.
+ *
+ * Example: 123123
+ */
+ get filterListId(): number | undefined {
+ return this._filter_list_id;
+ }
+
+ readonly _text: string | undefined;
+
+ /**
+ * Description: The text of the filtering rule applied to the request (if any).
+ *
+ * Example: ||example.org^
+ */
+ get text(): string | undefined {
+ return this._text;
+ }
+
+ constructor(props: IResultRule) {
+ if (typeof props.filter_list_id === 'number') {
+ this._filter_list_id = props.filter_list_id;
+ }
+ if (typeof props.text === 'string') {
+ this._text = props.text.trim();
+ }
+ }
+
+ serialize(): IResultRule {
+ const data: IResultRule = {
+ };
+ if (typeof this._filter_list_id !== 'undefined') {
+ data.filter_list_id = this._filter_list_id;
+ }
+ if (typeof this._text !== 'undefined') {
+ data.text = this._text;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ filter_list_id: !this._filter_list_id ? true : typeof this._filter_list_id === 'number',
+ text: !this._text ? true : typeof this._text === 'string' && !this._text ? true : this._text,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ResultRule {
+ return new ResultRule({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/RewriteEntry.ts b/client2/src/lib/entities/RewriteEntry.ts
new file mode 100644
index 00000000..31612b57
--- /dev/null
+++ b/client2/src/lib/entities/RewriteEntry.ts
@@ -0,0 +1,67 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IRewriteEntry {
+ answer?: string;
+ domain?: string;
+}
+
+export default class RewriteEntry {
+ readonly _answer: string | undefined;
+
+ /**
+ * Description: value of A, AAAA or CNAME DNS record
+ * Example: 127.0.0.1
+ */
+ get answer(): string | undefined {
+ return this._answer;
+ }
+
+ readonly _domain: string | undefined;
+
+ /**
+ * Description: Domain name
+ * Example: example.org
+ */
+ get domain(): string | undefined {
+ return this._domain;
+ }
+
+ constructor(props: IRewriteEntry) {
+ if (typeof props.answer === 'string') {
+ this._answer = props.answer.trim();
+ }
+ if (typeof props.domain === 'string') {
+ this._domain = props.domain.trim();
+ }
+ }
+
+ serialize(): IRewriteEntry {
+ const data: IRewriteEntry = {
+ };
+ if (typeof this._answer !== 'undefined') {
+ data.answer = this._answer;
+ }
+ if (typeof this._domain !== 'undefined') {
+ data.domain = this._domain;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ domain: !this._domain ? true : typeof this._domain === 'string' && !this._domain ? true : this._domain,
+ answer: !this._answer ? true : typeof this._answer === 'string' && !this._answer ? true : this._answer,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): RewriteEntry {
+ return new RewriteEntry({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/RewriteList.ts b/client2/src/lib/entities/RewriteList.ts
new file mode 100644
index 00000000..a92ff328
--- /dev/null
+++ b/client2/src/lib/entities/RewriteList.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IRewriteList {
+}
+
+export default class RewriteList {
+ constructor(props: IRewriteList) {
+ }
+
+ serialize(): IRewriteList {
+ const data: IRewriteList = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): RewriteList {
+ return new RewriteList({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/ServerStatus.ts b/client2/src/lib/entities/ServerStatus.ts
new file mode 100644
index 00000000..a17df251
--- /dev/null
+++ b/client2/src/lib/entities/ServerStatus.ts
@@ -0,0 +1,167 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IServerStatus {
+ dhcp_available?: boolean;
+ dns_address: string;
+ dns_port: number;
+ language: string;
+ protection_enabled: boolean;
+ querylog_enabled: boolean;
+ running: boolean;
+ version: string;
+}
+
+export default class ServerStatus {
+ readonly _dhcp_available: boolean | undefined;
+
+ get dhcpAvailable(): boolean | undefined {
+ return this._dhcp_available;
+ }
+
+ readonly _dns_address: string;
+
+ /**
+ * Description: undefined
+ * Example: 127.0.0.1
+ */
+ get dnsAddress(): string {
+ return this._dns_address;
+ }
+
+ static dnsAddressValidate(dnsAddress: string): boolean {
+ return typeof dnsAddress === 'string' && !!dnsAddress.trim();
+ }
+
+ readonly _dns_port: number;
+
+ /**
+ * Description: undefined
+ * Example: 53
+ */
+ get dnsPort(): number {
+ return this._dns_port;
+ }
+
+ static get dnsPortMinValue() {
+ return 1;
+ }
+
+ static get dnsPortMaxValue() {
+ return 65535;
+ }
+
+ static dnsPortValidate(dnsPort: number): boolean {
+ return dnsPort >= 1 && dnsPort <= 65535;
+ }
+
+ readonly _language: string;
+
+ /**
+ * Description: undefined
+ * Example: en
+ */
+ get language(): string {
+ return this._language;
+ }
+
+ static languageValidate(language: string): boolean {
+ return typeof language === 'string' && !!language.trim();
+ }
+
+ readonly _protection_enabled: boolean;
+
+ get protectionEnabled(): boolean {
+ return this._protection_enabled;
+ }
+
+ static protectionEnabledValidate(protectionEnabled: boolean): boolean {
+ return typeof protectionEnabled === 'boolean';
+ }
+
+ readonly _querylog_enabled: boolean;
+
+ get querylogEnabled(): boolean {
+ return this._querylog_enabled;
+ }
+
+ static querylogEnabledValidate(querylogEnabled: boolean): boolean {
+ return typeof querylogEnabled === 'boolean';
+ }
+
+ readonly _running: boolean;
+
+ get running(): boolean {
+ return this._running;
+ }
+
+ static runningValidate(running: boolean): boolean {
+ return typeof running === 'boolean';
+ }
+
+ readonly _version: string;
+
+ /**
+ * Description: undefined
+ * Example: 0.1
+ */
+ get version(): string {
+ return this._version;
+ }
+
+ static versionValidate(version: string): boolean {
+ return typeof version === 'string' && !!version.trim();
+ }
+
+ constructor(props: IServerStatus) {
+ if (typeof props.dhcp_available === 'boolean') {
+ this._dhcp_available = props.dhcp_available;
+ }
+ this._dns_address = props.dns_address.trim();
+ this._dns_port = props.dns_port;
+ this._language = props.language.trim();
+ this._protection_enabled = props.protection_enabled;
+ this._querylog_enabled = props.querylog_enabled;
+ this._running = props.running;
+ this._version = props.version.trim();
+ }
+
+ serialize(): IServerStatus {
+ const data: IServerStatus = {
+ dns_address: this._dns_address,
+ dns_port: this._dns_port,
+ language: this._language,
+ protection_enabled: this._protection_enabled,
+ querylog_enabled: this._querylog_enabled,
+ running: this._running,
+ version: this._version,
+ };
+ if (typeof this._dhcp_available !== 'undefined') {
+ data.dhcp_available = this._dhcp_available;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ dns_address: typeof this._dns_address === 'string' && !this._dns_address ? true : this._dns_address,
+ dns_port: this._dns_port >= 1 && this._dns_port <= 65535,
+ protection_enabled: typeof this._protection_enabled === 'boolean',
+ dhcp_available: !this._dhcp_available ? true : typeof this._dhcp_available === 'boolean',
+ querylog_enabled: typeof this._querylog_enabled === 'boolean',
+ running: typeof this._running === 'boolean',
+ version: typeof this._version === 'string' && !this._version ? true : this._version,
+ language: typeof this._language === 'string' && !this._language ? true : this._language,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): ServerStatus {
+ return new ServerStatus({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/Stats.ts b/client2/src/lib/entities/Stats.ts
new file mode 100644
index 00000000..6f01139d
--- /dev/null
+++ b/client2/src/lib/entities/Stats.ts
@@ -0,0 +1,257 @@
+import TopArrayEntry, { ITopArrayEntry } from './TopArrayEntry';
+
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IStats {
+ avg_processing_time?: number;
+ blocked_filtering?: number[];
+ dns_queries?: number[];
+ num_blocked_filtering?: number;
+ num_dns_queries?: number;
+ num_replaced_parental?: number;
+ num_replaced_safebrowsing?: number;
+ num_replaced_safesearch?: number;
+ replaced_parental?: number[];
+ replaced_safebrowsing?: number[];
+ time_units?: string;
+ top_blocked_domains?: ITopArrayEntry[];
+ top_clients?: ITopArrayEntry[];
+ top_queried_domains?: ITopArrayEntry[];
+}
+
+export default class Stats {
+ readonly _avg_processing_time: number | undefined;
+
+ /**
+ * Description: Average time in milliseconds on processing a DNS
+ * Example: 0.34
+ */
+ get avgProcessingTime(): number | undefined {
+ return this._avg_processing_time;
+ }
+
+ readonly _blocked_filtering: number[] | undefined;
+
+ get blockedFiltering(): number[] | undefined {
+ return this._blocked_filtering;
+ }
+
+ readonly _dns_queries: number[] | undefined;
+
+ get dnsQueries(): number[] | undefined {
+ return this._dns_queries;
+ }
+
+ readonly _num_blocked_filtering: number | undefined;
+
+ /**
+ * Description: Number of requests blocked by filtering rules
+ * Example: 50
+ */
+ get numBlockedFiltering(): number | undefined {
+ return this._num_blocked_filtering;
+ }
+
+ readonly _num_dns_queries: number | undefined;
+
+ /**
+ * Description: Total number of DNS queries
+ * Example: 123
+ */
+ get numDnsQueries(): number | undefined {
+ return this._num_dns_queries;
+ }
+
+ readonly _num_replaced_parental: number | undefined;
+
+ /**
+ * Description: Number of blocked adult websites
+ * Example: 15
+ */
+ get numReplacedParental(): number | undefined {
+ return this._num_replaced_parental;
+ }
+
+ readonly _num_replaced_safebrowsing: number | undefined;
+
+ /**
+ * Description: Number of requests blocked by safebrowsing module
+ * Example: 5
+ */
+ get numReplacedSafebrowsing(): number | undefined {
+ return this._num_replaced_safebrowsing;
+ }
+
+ readonly _num_replaced_safesearch: number | undefined;
+
+ /**
+ * Description: Number of requests blocked by safesearch module
+ * Example: 5
+ */
+ get numReplacedSafesearch(): number | undefined {
+ return this._num_replaced_safesearch;
+ }
+
+ readonly _replaced_parental: number[] | undefined;
+
+ get replacedParental(): number[] | undefined {
+ return this._replaced_parental;
+ }
+
+ readonly _replaced_safebrowsing: number[] | undefined;
+
+ get replacedSafebrowsing(): number[] | undefined {
+ return this._replaced_safebrowsing;
+ }
+
+ readonly _time_units: string | undefined;
+
+ /**
+ * Description: Time units (hours | days)
+ * Example: hours
+ */
+ get timeUnits(): string | undefined {
+ return this._time_units;
+ }
+
+ readonly _top_blocked_domains: TopArrayEntry[] | undefined;
+
+ get topBlockedDomains(): TopArrayEntry[] | undefined {
+ return this._top_blocked_domains;
+ }
+
+ readonly _top_clients: TopArrayEntry[] | undefined;
+
+ get topClients(): TopArrayEntry[] | undefined {
+ return this._top_clients;
+ }
+
+ readonly _top_queried_domains: TopArrayEntry[] | undefined;
+
+ get topQueriedDomains(): TopArrayEntry[] | undefined {
+ return this._top_queried_domains;
+ }
+
+ constructor(props: IStats) {
+ if (typeof props.avg_processing_time === 'number') {
+ this._avg_processing_time = props.avg_processing_time;
+ }
+ if (props.blocked_filtering) {
+ this._blocked_filtering = props.blocked_filtering;
+ }
+ if (props.dns_queries) {
+ this._dns_queries = props.dns_queries;
+ }
+ if (typeof props.num_blocked_filtering === 'number') {
+ this._num_blocked_filtering = props.num_blocked_filtering;
+ }
+ if (typeof props.num_dns_queries === 'number') {
+ this._num_dns_queries = props.num_dns_queries;
+ }
+ if (typeof props.num_replaced_parental === 'number') {
+ this._num_replaced_parental = props.num_replaced_parental;
+ }
+ if (typeof props.num_replaced_safebrowsing === 'number') {
+ this._num_replaced_safebrowsing = props.num_replaced_safebrowsing;
+ }
+ if (typeof props.num_replaced_safesearch === 'number') {
+ this._num_replaced_safesearch = props.num_replaced_safesearch;
+ }
+ if (props.replaced_parental) {
+ this._replaced_parental = props.replaced_parental;
+ }
+ if (props.replaced_safebrowsing) {
+ this._replaced_safebrowsing = props.replaced_safebrowsing;
+ }
+ if (typeof props.time_units === 'string') {
+ this._time_units = props.time_units.trim();
+ }
+ if (props.top_blocked_domains) {
+ this._top_blocked_domains = props.top_blocked_domains.map((p) => new TopArrayEntry(p));
+ }
+ if (props.top_clients) {
+ this._top_clients = props.top_clients.map((p) => new TopArrayEntry(p));
+ }
+ if (props.top_queried_domains) {
+ this._top_queried_domains = props.top_queried_domains.map((p) => new TopArrayEntry(p));
+ }
+ }
+
+ serialize(): IStats {
+ const data: IStats = {
+ };
+ if (typeof this._avg_processing_time !== 'undefined') {
+ data.avg_processing_time = this._avg_processing_time;
+ }
+ if (typeof this._blocked_filtering !== 'undefined') {
+ data.blocked_filtering = this._blocked_filtering;
+ }
+ if (typeof this._dns_queries !== 'undefined') {
+ data.dns_queries = this._dns_queries;
+ }
+ if (typeof this._num_blocked_filtering !== 'undefined') {
+ data.num_blocked_filtering = this._num_blocked_filtering;
+ }
+ if (typeof this._num_dns_queries !== 'undefined') {
+ data.num_dns_queries = this._num_dns_queries;
+ }
+ if (typeof this._num_replaced_parental !== 'undefined') {
+ data.num_replaced_parental = this._num_replaced_parental;
+ }
+ if (typeof this._num_replaced_safebrowsing !== 'undefined') {
+ data.num_replaced_safebrowsing = this._num_replaced_safebrowsing;
+ }
+ if (typeof this._num_replaced_safesearch !== 'undefined') {
+ data.num_replaced_safesearch = this._num_replaced_safesearch;
+ }
+ if (typeof this._replaced_parental !== 'undefined') {
+ data.replaced_parental = this._replaced_parental;
+ }
+ if (typeof this._replaced_safebrowsing !== 'undefined') {
+ data.replaced_safebrowsing = this._replaced_safebrowsing;
+ }
+ if (typeof this._time_units !== 'undefined') {
+ data.time_units = this._time_units;
+ }
+ if (typeof this._top_blocked_domains !== 'undefined') {
+ data.top_blocked_domains = this._top_blocked_domains.map((p) => p.serialize());
+ }
+ if (typeof this._top_clients !== 'undefined') {
+ data.top_clients = this._top_clients.map((p) => p.serialize());
+ }
+ if (typeof this._top_queried_domains !== 'undefined') {
+ data.top_queried_domains = this._top_queried_domains.map((p) => p.serialize());
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ time_units: !this._time_units ? true : typeof this._time_units === 'string' && !this._time_units ? true : this._time_units,
+ num_dns_queries: !this._num_dns_queries ? true : typeof this._num_dns_queries === 'number',
+ num_blocked_filtering: !this._num_blocked_filtering ? true : typeof this._num_blocked_filtering === 'number',
+ num_replaced_safebrowsing: !this._num_replaced_safebrowsing ? true : typeof this._num_replaced_safebrowsing === 'number',
+ num_replaced_safesearch: !this._num_replaced_safesearch ? true : typeof this._num_replaced_safesearch === 'number',
+ num_replaced_parental: !this._num_replaced_parental ? true : typeof this._num_replaced_parental === 'number',
+ avg_processing_time: !this._avg_processing_time ? true : typeof this._avg_processing_time === 'number',
+ top_queried_domains: !this._top_queried_domains ? true : this._top_queried_domains.reduce((result, p) => result && p.validate().length === 0, true),
+ top_clients: !this._top_clients ? true : this._top_clients.reduce((result, p) => result && p.validate().length === 0, true),
+ top_blocked_domains: !this._top_blocked_domains ? true : this._top_blocked_domains.reduce((result, p) => result && p.validate().length === 0, true),
+ dns_queries: !this._dns_queries ? true : this._dns_queries.reduce((result, p) => result && typeof p === 'number', true),
+ blocked_filtering: !this._blocked_filtering ? true : this._blocked_filtering.reduce((result, p) => result && typeof p === 'number', true),
+ replaced_safebrowsing: !this._replaced_safebrowsing ? true : this._replaced_safebrowsing.reduce((result, p) => result && typeof p === 'number', true),
+ replaced_parental: !this._replaced_parental ? true : this._replaced_parental.reduce((result, p) => result && typeof p === 'number', true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): Stats {
+ return new Stats({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/StatsConfig.ts b/client2/src/lib/entities/StatsConfig.ts
new file mode 100644
index 00000000..516105ea
--- /dev/null
+++ b/client2/src/lib/entities/StatsConfig.ts
@@ -0,0 +1,46 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IStatsConfig {
+ interval?: number;
+}
+
+export default class StatsConfig {
+ readonly _interval: number | undefined;
+
+ /** */
+ get interval(): number | undefined {
+ return this._interval;
+ }
+
+ constructor(props: IStatsConfig) {
+ if (typeof props.interval === 'number') {
+ this._interval = props.interval;
+ }
+ }
+
+ serialize(): IStatsConfig {
+ const data: IStatsConfig = {
+ };
+ if (typeof this._interval !== 'undefined') {
+ data.interval = this._interval;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ interval: !this._interval ? true : typeof this._interval === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): StatsConfig {
+ return new StatsConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/TlsConfig.ts b/client2/src/lib/entities/TlsConfig.ts
new file mode 100644
index 00000000..be3ecad1
--- /dev/null
+++ b/client2/src/lib/entities/TlsConfig.ts
@@ -0,0 +1,404 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ITlsConfig {
+ certificate_chain?: string;
+ certificate_path?: string;
+ dns_names?: string[];
+ enabled?: boolean;
+ force_https?: boolean;
+ issuer?: string;
+ key_type?: string;
+ not_after?: string;
+ not_before?: string;
+ port_dns_over_quic?: number;
+ port_dns_over_tls?: number;
+ port_https?: number;
+ private_key?: string;
+ private_key_path?: string;
+ server_name?: string;
+ subject?: string;
+ valid_cert?: boolean;
+ valid_chain?: boolean;
+ valid_key?: boolean;
+ valid_pair?: boolean;
+ warning_validation?: string;
+}
+
+export default class TlsConfig {
+ readonly _certificate_chain: string | undefined;
+
+ /** */
+ get certificateChain(): string | undefined {
+ return this._certificate_chain;
+ }
+
+ readonly _certificate_path: string | undefined;
+
+ /** */
+ get certificatePath(): string | undefined {
+ return this._certificate_path;
+ }
+
+ readonly _dns_names: string[] | undefined;
+
+ /**
+ * Description: The value of SubjectAltNames field of the first certificate in the chain.
+ *
+ * Example: *.example.org
+ */
+ get dnsNames(): string[] | undefined {
+ return this._dns_names;
+ }
+
+ readonly _enabled: boolean | undefined;
+
+ /**
+ * Description: enabled is the encryption (DOT/DOH/HTTPS) status
+ * Example: true
+ */
+ get enabled(): boolean | undefined {
+ return this._enabled;
+ }
+
+ readonly _force_https: boolean | undefined;
+
+ /**
+ * Description: if true, forces HTTP->HTTPS redirect
+ * Example: true
+ */
+ get forceHttps(): boolean | undefined {
+ return this._force_https;
+ }
+
+ readonly _issuer: string | undefined;
+
+ /**
+ * Description: The issuer of the first certificate in the chain.
+ * Example: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
+ */
+ get issuer(): string | undefined {
+ return this._issuer;
+ }
+
+ readonly _key_type: string | undefined;
+
+ /**
+ * Description: Key type.
+ * Example: RSA
+ */
+ get keyType(): string | undefined {
+ return this._key_type;
+ }
+
+ readonly _not_after: string | undefined;
+
+ /**
+ * Description: The NotAfter field of the first certificate in the chain.
+ *
+ * Example: 2019-05-01T10:47:32Z
+ */
+ get notAfter(): string | undefined {
+ return this._not_after;
+ }
+
+ readonly _not_before: string | undefined;
+
+ /**
+ * Description: The NotBefore field of the first certificate in the chain.
+ *
+ * Example: 2019-01-31T10:47:32Z
+ */
+ get notBefore(): string | undefined {
+ return this._not_before;
+ }
+
+ readonly _port_dns_over_quic: number | undefined;
+
+ /**
+ * Description: DNS-over-QUIC port. If 0, DOQ will be disabled.
+ * Example: 784
+ */
+ get portDnsOverQuic(): number | undefined {
+ return this._port_dns_over_quic;
+ }
+
+ readonly _port_dns_over_tls: number | undefined;
+
+ /**
+ * Description: DNS-over-TLS port. If 0, DOT will be disabled.
+ * Example: 853
+ */
+ get portDnsOverTls(): number | undefined {
+ return this._port_dns_over_tls;
+ }
+
+ readonly _port_https: number | undefined;
+
+ /**
+ * Description: HTTPS port. If 0, HTTPS will be disabled.
+ * Example: 443
+ */
+ get portHttps(): number | undefined {
+ return this._port_https;
+ }
+
+ readonly _private_key: string | undefined;
+
+ /** */
+ get privateKey(): string | undefined {
+ return this._private_key;
+ }
+
+ readonly _private_key_path: string | undefined;
+
+ /** */
+ get privateKeyPath(): string | undefined {
+ return this._private_key_path;
+ }
+
+ readonly _server_name: string | undefined;
+
+ /**
+ * Description: server_name is the hostname of your HTTPS/TLS server
+ * Example: example.org
+ */
+ get serverName(): string | undefined {
+ return this._server_name;
+ }
+
+ readonly _subject: string | undefined;
+
+ /**
+ * Description: The subject of the first certificate in the chain.
+ * Example: CN=example.org
+ */
+ get subject(): string | undefined {
+ return this._subject;
+ }
+
+ readonly _valid_cert: boolean | undefined;
+
+ /**
+ * Description: Set to true if the specified certificates chain is a valid chain of X509 certificates.
+ *
+ * Example: true
+ */
+ get validCert(): boolean | undefined {
+ return this._valid_cert;
+ }
+
+ readonly _valid_chain: boolean | undefined;
+
+ /**
+ * Description: Set to true if the specified certificates chain is verified and issued by a known CA.
+ *
+ * Example: true
+ */
+ get validChain(): boolean | undefined {
+ return this._valid_chain;
+ }
+
+ readonly _valid_key: boolean | undefined;
+
+ /**
+ * Description: Set to true if the key is a valid private key.
+ * Example: true
+ */
+ get validKey(): boolean | undefined {
+ return this._valid_key;
+ }
+
+ readonly _valid_pair: boolean | undefined;
+
+ /**
+ * Description: Set to true if both certificate and private key are correct.
+ *
+ * Example: true
+ */
+ get validPair(): boolean | undefined {
+ return this._valid_pair;
+ }
+
+ readonly _warning_validation: string | undefined;
+
+ /**
+ * Description: A validation warning message with the issue description.
+ *
+ * Example: You have specified an empty certificate
+ */
+ get warningValidation(): string | undefined {
+ return this._warning_validation;
+ }
+
+ constructor(props: ITlsConfig) {
+ if (typeof props.certificate_chain === 'string') {
+ this._certificate_chain = props.certificate_chain.trim();
+ }
+ if (typeof props.certificate_path === 'string') {
+ this._certificate_path = props.certificate_path.trim();
+ }
+ if (props.dns_names) {
+ this._dns_names = props.dns_names;
+ }
+ if (typeof props.enabled === 'boolean') {
+ this._enabled = props.enabled;
+ }
+ if (typeof props.force_https === 'boolean') {
+ this._force_https = props.force_https;
+ }
+ if (typeof props.issuer === 'string') {
+ this._issuer = props.issuer.trim();
+ }
+ if (typeof props.key_type === 'string') {
+ this._key_type = props.key_type.trim();
+ }
+ if (typeof props.not_after === 'string') {
+ this._not_after = props.not_after.trim();
+ }
+ if (typeof props.not_before === 'string') {
+ this._not_before = props.not_before.trim();
+ }
+ if (typeof props.port_dns_over_quic === 'number') {
+ this._port_dns_over_quic = props.port_dns_over_quic;
+ }
+ if (typeof props.port_dns_over_tls === 'number') {
+ this._port_dns_over_tls = props.port_dns_over_tls;
+ }
+ if (typeof props.port_https === 'number') {
+ this._port_https = props.port_https;
+ }
+ if (typeof props.private_key === 'string') {
+ this._private_key = props.private_key.trim();
+ }
+ if (typeof props.private_key_path === 'string') {
+ this._private_key_path = props.private_key_path.trim();
+ }
+ if (typeof props.server_name === 'string') {
+ this._server_name = props.server_name.trim();
+ }
+ if (typeof props.subject === 'string') {
+ this._subject = props.subject.trim();
+ }
+ if (typeof props.valid_cert === 'boolean') {
+ this._valid_cert = props.valid_cert;
+ }
+ if (typeof props.valid_chain === 'boolean') {
+ this._valid_chain = props.valid_chain;
+ }
+ if (typeof props.valid_key === 'boolean') {
+ this._valid_key = props.valid_key;
+ }
+ if (typeof props.valid_pair === 'boolean') {
+ this._valid_pair = props.valid_pair;
+ }
+ if (typeof props.warning_validation === 'string') {
+ this._warning_validation = props.warning_validation.trim();
+ }
+ }
+
+ serialize(): ITlsConfig {
+ const data: ITlsConfig = {
+ };
+ if (typeof this._certificate_chain !== 'undefined') {
+ data.certificate_chain = this._certificate_chain;
+ }
+ if (typeof this._certificate_path !== 'undefined') {
+ data.certificate_path = this._certificate_path;
+ }
+ if (typeof this._dns_names !== 'undefined') {
+ data.dns_names = this._dns_names;
+ }
+ if (typeof this._enabled !== 'undefined') {
+ data.enabled = this._enabled;
+ }
+ if (typeof this._force_https !== 'undefined') {
+ data.force_https = this._force_https;
+ }
+ if (typeof this._issuer !== 'undefined') {
+ data.issuer = this._issuer;
+ }
+ if (typeof this._key_type !== 'undefined') {
+ data.key_type = this._key_type;
+ }
+ if (typeof this._not_after !== 'undefined') {
+ data.not_after = this._not_after;
+ }
+ if (typeof this._not_before !== 'undefined') {
+ data.not_before = this._not_before;
+ }
+ if (typeof this._port_dns_over_quic !== 'undefined') {
+ data.port_dns_over_quic = this._port_dns_over_quic;
+ }
+ if (typeof this._port_dns_over_tls !== 'undefined') {
+ data.port_dns_over_tls = this._port_dns_over_tls;
+ }
+ if (typeof this._port_https !== 'undefined') {
+ data.port_https = this._port_https;
+ }
+ if (typeof this._private_key !== 'undefined') {
+ data.private_key = this._private_key;
+ }
+ if (typeof this._private_key_path !== 'undefined') {
+ data.private_key_path = this._private_key_path;
+ }
+ if (typeof this._server_name !== 'undefined') {
+ data.server_name = this._server_name;
+ }
+ if (typeof this._subject !== 'undefined') {
+ data.subject = this._subject;
+ }
+ if (typeof this._valid_cert !== 'undefined') {
+ data.valid_cert = this._valid_cert;
+ }
+ if (typeof this._valid_chain !== 'undefined') {
+ data.valid_chain = this._valid_chain;
+ }
+ if (typeof this._valid_key !== 'undefined') {
+ data.valid_key = this._valid_key;
+ }
+ if (typeof this._valid_pair !== 'undefined') {
+ data.valid_pair = this._valid_pair;
+ }
+ if (typeof this._warning_validation !== 'undefined') {
+ data.warning_validation = this._warning_validation;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ enabled: !this._enabled ? true : typeof this._enabled === 'boolean',
+ server_name: !this._server_name ? true : typeof this._server_name === 'string' && !this._server_name ? true : this._server_name,
+ force_https: !this._force_https ? true : typeof this._force_https === 'boolean',
+ port_https: !this._port_https ? true : typeof this._port_https === 'number',
+ port_dns_over_tls: !this._port_dns_over_tls ? true : typeof this._port_dns_over_tls === 'number',
+ port_dns_over_quic: !this._port_dns_over_quic ? true : typeof this._port_dns_over_quic === 'number',
+ certificate_chain: !this._certificate_chain ? true : typeof this._certificate_chain === 'string' && !this._certificate_chain ? true : this._certificate_chain,
+ private_key: !this._private_key ? true : typeof this._private_key === 'string' && !this._private_key ? true : this._private_key,
+ certificate_path: !this._certificate_path ? true : typeof this._certificate_path === 'string' && !this._certificate_path ? true : this._certificate_path,
+ private_key_path: !this._private_key_path ? true : typeof this._private_key_path === 'string' && !this._private_key_path ? true : this._private_key_path,
+ valid_cert: !this._valid_cert ? true : typeof this._valid_cert === 'boolean',
+ valid_chain: !this._valid_chain ? true : typeof this._valid_chain === 'boolean',
+ subject: !this._subject ? true : typeof this._subject === 'string' && !this._subject ? true : this._subject,
+ issuer: !this._issuer ? true : typeof this._issuer === 'string' && !this._issuer ? true : this._issuer,
+ not_before: !this._not_before ? true : typeof this._not_before === 'string' && !this._not_before ? true : this._not_before,
+ not_after: !this._not_after ? true : typeof this._not_after === 'string' && !this._not_after ? true : this._not_after,
+ dns_names: !this._dns_names ? true : this._dns_names.reduce((result, p) => result && typeof p === 'string', true),
+ valid_key: !this._valid_key ? true : typeof this._valid_key === 'boolean',
+ key_type: !this._key_type ? true : typeof this._key_type === 'string' && !this._key_type ? true : this._key_type,
+ warning_validation: !this._warning_validation ? true : typeof this._warning_validation === 'string' && !this._warning_validation ? true : this._warning_validation,
+ valid_pair: !this._valid_pair ? true : typeof this._valid_pair === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): TlsConfig {
+ return new TlsConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/TopArrayEntry.ts b/client2/src/lib/entities/TopArrayEntry.ts
new file mode 100644
index 00000000..52916fd2
--- /dev/null
+++ b/client2/src/lib/entities/TopArrayEntry.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface ITopArrayEntry {
+ domain_or_ip?: number;
+}
+
+export default class TopArrayEntry {
+ readonly _domain_or_ip: number | undefined;
+
+ get domainOrIp(): number | undefined {
+ return this._domain_or_ip;
+ }
+
+ constructor(props: ITopArrayEntry) {
+ if (typeof props.domain_or_ip === 'number') {
+ this._domain_or_ip = props.domain_or_ip;
+ }
+ }
+
+ serialize(): ITopArrayEntry {
+ const data: ITopArrayEntry = {
+ };
+ if (typeof this._domain_or_ip !== 'undefined') {
+ data.domain_or_ip = this._domain_or_ip;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ domain_or_ip: !this._domain_or_ip ? true : typeof this._domain_or_ip === 'number',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): TopArrayEntry {
+ return new TopArrayEntry({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/UpstreamsConfig.ts b/client2/src/lib/entities/UpstreamsConfig.ts
new file mode 100644
index 00000000..5b9c0a6b
--- /dev/null
+++ b/client2/src/lib/entities/UpstreamsConfig.ts
@@ -0,0 +1,69 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IUpstreamsConfig {
+ bootstrap_dns: string[];
+ upstream_dns: string[];
+}
+
+export default class UpstreamsConfig {
+ readonly _bootstrap_dns: string[];
+
+ /**
+ * Description: Bootstrap servers, port is optional after colon. Empty value will reset it to default values.
+ *
+ * Example: 8.8.8.8:53,1.1.1.1:53
+ */
+ get bootstrapDns(): string[] {
+ return this._bootstrap_dns;
+ }
+
+ static bootstrapDnsValidate(bootstrapDns: string[]): boolean {
+ return bootstrapDns.reduce((result, p) => result && (typeof p === 'string' && !!p.trim()), true);
+ }
+
+ readonly _upstream_dns: string[];
+
+ /**
+ * Description: Upstream servers, port is optional after colon. Empty value will reset it to default values.
+ *
+ * Example: tls://1.1.1.1,tls://1.0.0.1
+ */
+ get upstreamDns(): string[] {
+ return this._upstream_dns;
+ }
+
+ static upstreamDnsValidate(upstreamDns: string[]): boolean {
+ return upstreamDns.reduce((result, p) => result && (typeof p === 'string' && !!p.trim()), true);
+ }
+
+ constructor(props: IUpstreamsConfig) {
+ this._bootstrap_dns = props.bootstrap_dns;
+ this._upstream_dns = props.upstream_dns;
+ }
+
+ serialize(): IUpstreamsConfig {
+ const data: IUpstreamsConfig = {
+ bootstrap_dns: this._bootstrap_dns,
+ upstream_dns: this._upstream_dns,
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ bootstrap_dns: this._bootstrap_dns.reduce((result, p) => result && typeof p === 'string', true),
+ upstream_dns: this._upstream_dns.reduce((result, p) => result && typeof p === 'string', true),
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): UpstreamsConfig {
+ return new UpstreamsConfig({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/UpstreamsConfigResponse.ts b/client2/src/lib/entities/UpstreamsConfigResponse.ts
new file mode 100644
index 00000000..9b342400
--- /dev/null
+++ b/client2/src/lib/entities/UpstreamsConfigResponse.ts
@@ -0,0 +1,31 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IUpstreamsConfigResponse {
+}
+
+export default class UpstreamsConfigResponse {
+ constructor(props: IUpstreamsConfigResponse) {
+ }
+
+ serialize(): IUpstreamsConfigResponse {
+ const data: IUpstreamsConfigResponse = {
+ };
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): UpstreamsConfigResponse {
+ return new UpstreamsConfigResponse({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/VersionInfo.ts b/client2/src/lib/entities/VersionInfo.ts
new file mode 100644
index 00000000..7df508ea
--- /dev/null
+++ b/client2/src/lib/entities/VersionInfo.ts
@@ -0,0 +1,100 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IVersionInfo {
+ announcement?: string;
+ announcement_url?: string;
+ can_autoupdate?: boolean;
+ new_version?: string;
+}
+
+export default class VersionInfo {
+ readonly _announcement: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: AdGuard Home v0.9 is now available!
+ */
+ get announcement(): string | undefined {
+ return this._announcement;
+ }
+
+ readonly _announcement_url: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: https://github.com/AdguardTeam/AdGuardHome/releases/tag/v0.9
+ *
+ */
+ get announcementUrl(): string | undefined {
+ return this._announcement_url;
+ }
+
+ readonly _can_autoupdate: boolean | undefined;
+
+ get canAutoupdate(): boolean | undefined {
+ return this._can_autoupdate;
+ }
+
+ readonly _new_version: string | undefined;
+
+ /**
+ * Description: undefined
+ * Example: v0.9
+ */
+ get newVersion(): string | undefined {
+ return this._new_version;
+ }
+
+ constructor(props: IVersionInfo) {
+ if (typeof props.announcement === 'string') {
+ this._announcement = props.announcement.trim();
+ }
+ if (typeof props.announcement_url === 'string') {
+ this._announcement_url = props.announcement_url.trim();
+ }
+ if (typeof props.can_autoupdate === 'boolean') {
+ this._can_autoupdate = props.can_autoupdate;
+ }
+ if (typeof props.new_version === 'string') {
+ this._new_version = props.new_version.trim();
+ }
+ }
+
+ serialize(): IVersionInfo {
+ const data: IVersionInfo = {
+ };
+ if (typeof this._announcement !== 'undefined') {
+ data.announcement = this._announcement;
+ }
+ if (typeof this._announcement_url !== 'undefined') {
+ data.announcement_url = this._announcement_url;
+ }
+ if (typeof this._can_autoupdate !== 'undefined') {
+ data.can_autoupdate = this._can_autoupdate;
+ }
+ if (typeof this._new_version !== 'undefined') {
+ data.new_version = this._new_version;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ new_version: !this._new_version ? true : typeof this._new_version === 'string' && !this._new_version ? true : this._new_version,
+ announcement: !this._announcement ? true : typeof this._announcement === 'string' && !this._announcement ? true : this._announcement,
+ announcement_url: !this._announcement_url ? true : typeof this._announcement_url === 'string' && !this._announcement_url ? true : this._announcement_url,
+ can_autoupdate: !this._can_autoupdate ? true : typeof this._can_autoupdate === 'boolean',
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): VersionInfo {
+ return new VersionInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/entities/WhoisInfo.ts b/client2/src/lib/entities/WhoisInfo.ts
new file mode 100644
index 00000000..f0f2db74
--- /dev/null
+++ b/client2/src/lib/entities/WhoisInfo.ts
@@ -0,0 +1,45 @@
+// This file was autogenerated. Please do not change.
+// All changes will be overwrited on commit.
+export interface IWhoisInfo {
+ key?: string;
+}
+
+export default class WhoisInfo {
+ readonly _key: string | undefined;
+
+ get key(): string | undefined {
+ return this._key;
+ }
+
+ constructor(props: IWhoisInfo) {
+ if (typeof props.key === 'string') {
+ this._key = props.key.trim();
+ }
+ }
+
+ serialize(): IWhoisInfo {
+ const data: IWhoisInfo = {
+ };
+ if (typeof this._key !== 'undefined') {
+ data.key = this._key;
+ }
+ return data;
+ }
+
+ validate(): string[] {
+ const validate = {
+ key: !this._key ? true : typeof this._key === 'string' && !this._key ? true : this._key,
+ };
+ const isError: string[] = [];
+ Object.keys(validate).forEach((key) => {
+ if (!(validate as any)[key]) {
+ isError.push(key);
+ }
+ });
+ return isError;
+ }
+
+ update(props: Partial): WhoisInfo {
+ return new WhoisInfo({ ...this.serialize(), ...props });
+ }
+}
diff --git a/client2/src/lib/helpers/apiErrors.ts b/client2/src/lib/helpers/apiErrors.ts
new file mode 100644
index 00000000..c1916e1f
--- /dev/null
+++ b/client2/src/lib/helpers/apiErrors.ts
@@ -0,0 +1,14 @@
+interface ErrorCheck {
+ error?: Error;
+ result?: T;
+}
+
+export function errorChecker(response: Error | any): ErrorCheck {
+ if (typeof response !== 'object') {
+ return { result: response };
+ }
+ if (response instanceof Error) {
+ return { error: response };
+ }
+ return { result: response };
+}
diff --git a/client2/src/lib/helpers/installHelpers.ts b/client2/src/lib/helpers/installHelpers.ts
new file mode 100644
index 00000000..a4258402
--- /dev/null
+++ b/client2/src/lib/helpers/installHelpers.ts
@@ -0,0 +1,17 @@
+export enum NETWORK_TYPE {
+ LOCAL = 'LOCAL',
+ ETHERNET = 'ETHERNET',
+ OTHER = 'OTHER',
+}
+
+export const chechNetworkType = (network: string | undefined) => {
+ if (!network) {
+ return NETWORK_TYPE.OTHER;
+ }
+ if (network.includes('en')) {
+ return NETWORK_TYPE.ETHERNET;
+ }
+ if (network.includes('lo')) {
+ return NETWORK_TYPE.LOCAL;
+ }
+};
diff --git a/client2/src/lib/theme/Form.module.pcss b/client2/src/lib/theme/Form.module.pcss
new file mode 100644
index 00000000..f4988df6
--- /dev/null
+++ b/client2/src/lib/theme/Form.module.pcss
@@ -0,0 +1,78 @@
+.group {
+ display: block;
+ margin-bottom: 24px;
+
+ &_last,
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.label {
+ margin-bottom: 4px;
+ font-size: 14px;
+ color: var(--gray700);
+}
+
+.reveal {
+ color: var(--black);
+ transition: color var(--transition);
+ cursor: pointer;
+
+ &:hover,
+ &:focus {
+ color: var(--gray);
+ }
+}
+
+.reveal + .suffix {
+ margin-left: 16px;
+}
+
+.addon {
+ display: flex;
+ height: 48px;
+ padding: 14px 3px 14px 14px;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 1.4;
+ cursor: pointer;
+ overflow: hidden;
+
+ @media (--m-viewport) {
+ padding-right: 6px;
+ font-size: 16px;
+ line-height: 1.3;
+ }
+}
+
+.addonCountry {
+ min-width: 28px;
+ margin-right: 3px;
+
+ @media (--m-viewport) {
+ margin-right: 12px;
+ }
+}
+
+.addonIcon {
+ position: relative;
+ top: -2px;
+ margin-right: 9px;
+ color: var(--concrete);
+}
+
+.addonCode {
+ position: relative;
+ padding-left: 12px;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: -14px;
+ left: 0;
+ width: 1px;
+ height: 48px;
+ background-color: var(--borders-white);
+ }
+}
diff --git a/client2/src/lib/theme/Icons/Icon.pcss b/client2/src/lib/theme/Icons/Icon.pcss
new file mode 100644
index 00000000..a77a74a7
--- /dev/null
+++ b/client2/src/lib/theme/Icons/Icon.pcss
@@ -0,0 +1,3 @@
+.icons {
+ display: none;
+}
diff --git a/client2/src/lib/theme/Icons/index.tsx b/client2/src/lib/theme/Icons/index.tsx
new file mode 100644
index 00000000..23f0a95d
--- /dev/null
+++ b/client2/src/lib/theme/Icons/index.tsx
@@ -0,0 +1,54 @@
+import React, { FC } from 'react';
+import './Icon.pcss';
+
+export type IconType =
+ 'mainLogo' |
+ 'visibility_disable' |
+ 'visibility_enable';
+
+const Icons: FC = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HOME
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export default Icons;
diff --git a/client2/src/lib/theme/Typography.module.pcss b/client2/src/lib/theme/Typography.module.pcss
new file mode 100644
index 00000000..b51e0e56
--- /dev/null
+++ b/client2/src/lib/theme/Typography.module.pcss
@@ -0,0 +1,36 @@
+.title, .subTitle, .text {
+ color: var(--gray900);
+ letter-spacing: 0px;
+}
+
+.title {
+ font-size: 30px;
+ line-height: 36px;
+ margin-bottom: 16px;
+}
+.subTitle {
+ font-size: 20px;
+ line-height: 24px;
+ margin-bottom: 16px;
+}
+.text {
+ font-size: 16px;
+ line-height: 22px;
+
+ &_block {
+ margin-bottom: 48px;
+ }
+
+ &_base {
+ margin-bottom: 32px;
+ }
+}
+.subtext {
+ color: var(--gray400);
+}
+
+.danger {
+ text-transform: capitalize;
+ color: var(--red400);
+ font-weight: bold;
+}
\ No newline at end of file
diff --git a/client2/src/lib/theme/index.ts b/client2/src/lib/theme/index.ts
new file mode 100644
index 00000000..43df8b68
--- /dev/null
+++ b/client2/src/lib/theme/index.ts
@@ -0,0 +1,9 @@
+import typography from './Typography.module.pcss';
+import form from './Form.module.pcss';
+
+const theme = {
+ typography,
+ form,
+};
+
+export default theme;
diff --git a/client2/src/localization/Translator/Translator.ts b/client2/src/localization/Translator/Translator.ts
new file mode 100644
index 00000000..06b50cd1
--- /dev/null
+++ b/client2/src/localization/Translator/Translator.ts
@@ -0,0 +1,82 @@
+import translator from './lib/translator';
+import { AllowedValues } from './lib/formatter';
+import { getForm, GenericLocales, AvailableLocales } from './lib/plural';
+
+type ExternalFormater = (data: any) => any;
+
+class Translator {
+ private _currentLocale: Locale;
+
+ private _formatter: ExternalFormater = (data: string[]) => data.join('');
+
+ get currentLocale() {
+ return this._currentLocale;
+ }
+
+ defaultLocale: Locale;
+
+ updateTranslator = (locale: Locale) => {
+ return new Translator(
+ this.defaultLocale,
+ this.messages,
+ locale,
+ this._formatter,
+ );
+ };
+
+ messages: Record;
+
+ constructor(
+ defaultLocale: Locale,
+ messages: Record,
+ currentLocale?: Locale,
+ formatter?: ExternalFormater,
+ ) {
+ this.defaultLocale = defaultLocale;
+ this._currentLocale = currentLocale ?? defaultLocale;
+ this.messages = messages;
+
+ if (formatter) {
+ this._formatter = formatter;
+ }
+ }
+
+ public getMessage(
+ id: string,
+ params: AllowedValues = {},
+ ): string {
+ const str = this.messages[this._currentLocale][id]
+ || this.messages[this.defaultLocale][id]
+ || id;
+
+ const tranlation = translator(str, params);
+ return this._formatter(tranlation);
+ }
+
+ public getPlural(
+ id: string,
+ number: number,
+ params: AllowedValues = {},
+ ): string {
+ let locale: Locale | null = null;
+ if (this.messages[this._currentLocale][id]) {
+ locale = this._currentLocale;
+ } else if (this.messages[this.defaultLocale][id]) {
+ locale = this.defaultLocale;
+ }
+ const str = this.messages[this._currentLocale][id]
+ || this.messages[this.defaultLocale][id]
+ || id;
+
+ if (!locale) {
+ throw new Error(`No translation for id: ${id}, neither in current locale: ${this._currentLocale} nor defaulkt locale ${this.defaultLocale}`);
+ }
+
+ return this._formatter(translator(
+ getForm(str, number, locale as AvailableLocales, id),
+ { count: number, ...params },
+ ));
+ }
+}
+
+export default Translator;
diff --git a/client2/src/localization/Translator/index.ts b/client2/src/localization/Translator/index.ts
new file mode 100644
index 00000000..87f17fbc
--- /dev/null
+++ b/client2/src/localization/Translator/index.ts
@@ -0,0 +1,2 @@
+export { default } from './Translator';
+export { SupportedLangs, GenericLocales, AvailableLocales, checkFormsExternal as checkForms } from './lib/plural';
diff --git a/client2/src/localization/Translator/lib/formatter.ts b/client2/src/localization/Translator/lib/formatter.ts
new file mode 100644
index 00000000..15735f6a
--- /dev/null
+++ b/client2/src/localization/Translator/lib/formatter.ts
@@ -0,0 +1,100 @@
+import {
+ isTextNode,
+ isTagNode,
+ isPlaceholderNode,
+ isVoidTagNode,
+ NODE,
+} from './nodes';
+
+/**
+ * Checks if target is function
+ * @param target
+ * @returns {boolean}
+ */
+const isFunction = (target: any) => {
+ return typeof target === 'function';
+};
+
+type FormatingFunc = (chunks: string) => T;
+export type AllowedValues = Record>;
+
+/**
+ * This function accepts an AST (abstract syntax tree) which is a result
+ * of the parser function call, and converts tree nodes into array of strings replacing node
+ * values with provided values.
+ * Values is a map with functions or strings, where each key is related to placeholder value
+ * or tag value
+ * e.g.
+ * string "text tag text %placeholder%" is parsed into next AST
+ *
+ * [
+ * { type: 'text', value: 'text ' },
+ * {
+ * type: 'tag',
+ * value: 'tag',
+ * children: [{ type: 'text', value: 'tag text' }],
+ * },
+ * { type: 'text', value: ' ' },
+ * { type: 'placeholder', value: 'placeholder' }
+ * ];
+ *
+ * this AST after format and next values
+ *
+ * {
+ * // here used template strings, but it can be react components as well
+ * tag: (chunks) => `${chunks} `,
+ * placeholder: 'placeholder text'
+ * }
+ *
+ * will return next array
+ *
+ * [ 'text ', 'tag text ', ' ', 'placeholder text' ]
+ *
+ * as you can see, was replaced by , and placeholder was replaced by placeholder text
+ *
+ * @param ast - AST (abstract syntax tree)
+ * @param values
+ * @returns {[]}
+ */
+const format = (ast: NODE[], values: AllowedValues) => {
+ const result: (string | T)[] = [];
+ let i = 0;
+ while (i < ast.length) {
+ const currentNode = ast[i];
+ // if current node is text node, there is nothing to change, append value to the result
+ if (isTextNode(currentNode)) {
+ result.push(currentNode.value);
+ } else if (isTagNode(currentNode)) {
+ const children = [...format(currentNode.children ? currentNode.children : [], values)].join('');
+ const value = values[currentNode.value];
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'function') {
+ if (isFunction(value)) {
+ result.push((value as FormatingFunc)(children));
+ } else {
+ result.push(value.toString());
+ }
+ } else {
+ throw new Error(`Value ${currentNode.value} wasn't provided`);
+ }
+ } else if (isVoidTagNode(currentNode)) {
+ const value = values[currentNode.value];
+ if (typeof value === 'string' || typeof value === 'number') {
+ result.push(value.toString());
+ } else {
+ throw new Error(`Value ${currentNode.value} wasn't provided`);
+ }
+ } else if (isPlaceholderNode(currentNode)) {
+ const value = values[currentNode.value];
+ if (typeof value === 'string' || typeof value === 'number') {
+ result.push(value.toString());
+ } else {
+ throw new Error(`Value ${currentNode.value} wasn't provided`);
+ }
+ }
+ i += 1;
+ }
+
+ return result;
+};
+
+export default format;
diff --git a/client2/src/localization/Translator/lib/nodes.ts b/client2/src/localization/Translator/lib/nodes.ts
new file mode 100644
index 00000000..20f3835a
--- /dev/null
+++ b/client2/src/localization/Translator/lib/nodes.ts
@@ -0,0 +1,50 @@
+export enum NODE_TYPES {
+ PLACEHOLDER = 'placeholder',
+ TEXT = 'text',
+ TAG = 'tag',
+ VOID_TAG = 'void_tag',
+}
+
+export interface NODE {
+ type: NODE_TYPES;
+ value: string | keyof HTMLElementTagNameMap;
+ children?: NODE[];
+}
+
+export const isTextNode = (node: NODE) => {
+ return node?.type === NODE_TYPES.TEXT;
+};
+
+export const isTagNode = (node: NODE) => {
+ return node?.type === NODE_TYPES.TAG;
+};
+
+export const isPlaceholderNode = (node: NODE) => {
+ return node?.type === NODE_TYPES.PLACEHOLDER;
+};
+
+export const isVoidTagNode = (node: NODE) => {
+ return node?.type === NODE_TYPES.VOID_TAG;
+};
+
+export const placeholderNode = (value: string) => {
+ return { type: NODE_TYPES.PLACEHOLDER, value };
+};
+
+export const textNode = (str: string) => {
+ return { type: NODE_TYPES.TEXT, value: str };
+};
+
+export const tagNode = (tagName: keyof HTMLElementTagNameMap, children: NODE[]) => {
+ const value = tagName.trim();
+ return { type: NODE_TYPES.TAG, value, children };
+};
+
+export const voidTagNode = (tagName: keyof HTMLElementTagNameMap) => {
+ const value = tagName.trim();
+ return { type: NODE_TYPES.VOID_TAG, value };
+};
+
+export const isNode = (checked: any) => {
+ return !!checked?.type;
+};
diff --git a/client2/src/localization/Translator/lib/parser.ts b/client2/src/localization/Translator/lib/parser.ts
new file mode 100644
index 00000000..0c2134f0
--- /dev/null
+++ b/client2/src/localization/Translator/lib/parser.ts
@@ -0,0 +1,335 @@
+/* eslint-disable no-param-reassign */
+import {
+ tagNode,
+ textNode,
+ isNode,
+ placeholderNode,
+ voidTagNode,
+ NODE,
+} from './nodes';
+
+enum STATE {
+ /**
+ * parser function switches to the text state when parses simple text,
+ * or content between open and close tags
+ */
+ TEXT = 'text',
+
+ /**
+ * parser function switches to the tag state when meets open tag brace ("<"), and switches back,
+ * when meets closing tag brace (">")
+ */
+ TAG = 'tag',
+
+ /**
+ * Parser function switches to the placeholder state when meets in the text
+ * open placeholders brace ("{") and switches back to the text state,
+ * when meets close placeholder brace ("}")
+ */
+ PLACEHOLDER = 'placeholder',
+}
+
+enum CONTROL_CHARS {
+ TAG_OPEN_BRACE = '<',
+ TAG_CLOSE_BRACE = '>',
+ CLOSING_TAG_MARK = '/',
+ PLACEHOLDER_MARK = '%',
+}
+
+interface Context {
+ /**
+ * Stack is used to keep and search nested tag nodes
+ * @type {*[]}
+ */
+ stack: (NODE | keyof HTMLElementTagNameMap)[];
+ /**
+ * Result is stack where function allocates nodes
+ * @type {*[]}
+ */
+ result: NODE[];
+ /**
+ * Current char index
+ * @type {number}
+ */
+ currIdx: number;
+ /**
+ * Saves index of the last state change from the text state,
+ * used to restore parsed text if we moved into other state wrongly
+ */
+ lastTextStateChangeIdx: number;
+ /**
+ * Accumulated tag value
+ */
+ tag: string;
+ /**
+ * Accumulated text value
+ */
+ text: string;
+ /**
+ * Accumulated placeholder value
+ */
+ placeholder: string;
+ /**
+ * Parsed string
+ */
+ str: string;
+ /**
+ * Currently parsed char
+ */
+ currChar: string;
+}
+
+/**
+ * Checks if text length is enough to create text node
+ * If text node created, then if stack is not empty it is pushed into stack,
+ * otherwise into result
+ * @param context
+ */
+const createTextNodeIfPossible = (context: Context) => {
+ const { text } = context;
+
+ if (text.length > 0) {
+ const node = textNode(text);
+ if (context.stack.length > 0) {
+ context.stack.push(node);
+ } else {
+ context.result.push(node);
+ }
+ }
+
+ context.text = '';
+};
+
+/**
+ * Handles text state
+ * @returns {function}
+ */
+const textStateHandler = (context: Context) => {
+ const { currChar, currIdx } = context;
+
+ // switches to the tag state
+ if (currChar === CONTROL_CHARS.TAG_OPEN_BRACE) {
+ context.lastTextStateChangeIdx = currIdx;
+ return STATE.TAG;
+ }
+
+ // switches to the placeholder state
+ if (currChar === CONTROL_CHARS.PLACEHOLDER_MARK) {
+ context.lastTextStateChangeIdx = currIdx;
+ return STATE.PLACEHOLDER;
+ }
+
+ // remains in the text state
+ context.text += currChar;
+ return STATE.TEXT;
+};
+
+/**
+ * Handles placeholder state
+ * @param context
+ * @returns {string}
+ */
+const placeholderStateHandler = (context: Context) => {
+ const {
+ currChar,
+ currIdx,
+ lastTextStateChangeIdx,
+ placeholder,
+ stack,
+ result,
+ str,
+ } = context;
+
+ if (currChar === CONTROL_CHARS.PLACEHOLDER_MARK) {
+ // if distance between current index and last state change equal to 1,
+ // it means that placeholder mark was escaped by itself e.g. "%%",
+ // so we return to the text state
+ if (currIdx - lastTextStateChangeIdx === 1) {
+ context.text += str.substring(lastTextStateChangeIdx, currIdx);
+ return STATE.TEXT;
+ }
+
+ createTextNodeIfPossible(context);
+ const node = placeholderNode(placeholder);
+
+ // push node to the appropriate stack
+ if (stack.length > 0) {
+ stack.push(node);
+ } else {
+ result.push(node);
+ }
+
+ context.placeholder = '';
+ return STATE.TEXT;
+ }
+
+ context.placeholder += currChar;
+ return STATE.PLACEHOLDER;
+};
+
+/**
+ * Switches current state to the tag state and returns tag state handler
+ * @returns {function}
+ */
+const tagStateHandler = (context: Context) => {
+ const {
+ currChar,
+ text,
+ stack,
+ result,
+ lastTextStateChangeIdx,
+ currIdx,
+ str,
+ } = context;
+
+ let { tag } = context;
+
+ // if found tag end ">"
+ if (currChar === CONTROL_CHARS.TAG_CLOSE_BRACE) {
+ // if the tag is close tag e.g.
+ if (tag.indexOf(CONTROL_CHARS.CLOSING_TAG_MARK) === 0) {
+ // remove slash from tag
+ tag = tag.substring(1);
+
+ let children: NODE[] = [];
+ if (text.length > 0) {
+ children.push(textNode(text));
+ context.text = '';
+ }
+
+ let pairTagFound = false;
+ // looking for the pair to the close tag
+ while (!pairTagFound && stack.length > 0) {
+ const lastFromStack = stack.pop();
+ // if tag from stack equal to close tag
+ if (lastFromStack === tag) {
+ // create tag node
+ const node = tagNode(tag as keyof HTMLElementTagNameMap, children);
+ // and add it to the appropriate stack
+ if (stack.length > 0) {
+ stack.push(node);
+ } else {
+ result.push(node);
+ }
+ children = [];
+ pairTagFound = true;
+ } else if (isNode(lastFromStack)) {
+ // add nodes between close tag and open tag to the children
+ children.unshift(lastFromStack as NODE);
+ } else {
+ throw new Error(`String has unbalanced tags: ${str}`);
+ }
+ if (stack.length === 0 && children.length > 0) {
+ throw new Error(`String has unbalanced tags: ${str}`);
+ }
+ }
+ context.tag = '';
+ return STATE.TEXT;
+ }
+
+ // if the tag is void tag e.g.
+ if (tag.lastIndexOf(CONTROL_CHARS.CLOSING_TAG_MARK) === tag.length - 1) {
+ tag = tag.substring(0, tag.length - 1);
+ createTextNodeIfPossible(context);
+ const node = voidTagNode(tag as keyof HTMLElementTagNameMap);
+ // add node to the appropriate stack
+ if (stack.length > 0) {
+ stack.push(node);
+ } else {
+ result.push(node);
+ }
+ context.tag = '';
+ return STATE.TEXT;
+ }
+
+ createTextNodeIfPossible(context);
+ stack.push(tag as keyof HTMLElementTagNameMap);
+ context.tag = '';
+ return STATE.TEXT;
+ }
+
+ // If we meet open tag "<" it means that we wrongly moved into tag state
+ if (currChar === CONTROL_CHARS.TAG_OPEN_BRACE) {
+ context.text += str.substring(lastTextStateChangeIdx, currIdx);
+ context.lastTextStateChangeIdx = currIdx;
+ context.tag = '';
+ return STATE.TAG;
+ }
+
+ context.tag += currChar;
+ return STATE.TAG;
+};
+
+/**
+ * Parses string into AST (abstract syntax tree) and returns it
+ * e.g.
+ * parse("String to translate ") ->
+ * ```
+ * [
+ * { type: 'text', value: 'String to ' },
+ * { type: 'tag', value: 'a', children: [{ type: 'text', value: 'translate' }] }
+ * ];
+ * ```
+ * Empty string is parsed into empty AST (abstract syntax tree): "[]"
+ * If founds unbalanced tags, it throws error about it
+ *
+ * @param {string} str - message in simplified ICU like syntax without plural support
+ * @returns {[]}
+ */
+const parser = (str = '') => {
+ const context: Context = {
+ str,
+ stack: [],
+ result: [],
+ currIdx: 0,
+ lastTextStateChangeIdx: 0,
+ tag: '',
+ text: '',
+ placeholder: '',
+ currChar: '',
+ };
+
+ const STATE_HANDLERS = {
+ [STATE.TEXT]: textStateHandler,
+ [STATE.PLACEHOLDER]: placeholderStateHandler,
+ [STATE.TAG]: tagStateHandler,
+ };
+
+ // Start from text state
+ let currentState = STATE.TEXT;
+
+ while (context.currIdx < str.length) {
+ context.currChar = str[context.currIdx];
+ const currentStateHandler: (c: Context) => STATE = STATE_HANDLERS[currentState];
+ currentState = currentStateHandler(context);
+ context.currIdx += 1;
+ }
+
+ const {
+ result,
+ text,
+ stack,
+ lastTextStateChangeIdx,
+ } = context;
+
+ // Means that tag or placeholder nodes were not closed, so we consider them as text
+ if (currentState !== STATE.TEXT) {
+ const restText = str.substring(lastTextStateChangeIdx);
+ if ((restText + text).length > 0) {
+ result.push(textNode(text + restText));
+ }
+ } else {
+ // eslint-disable-next-line no-lonely-if
+ if (text.length > 0) {
+ result.push(textNode(text));
+ }
+ }
+
+ if (stack.length > 0) {
+ throw new Error(`String has unbalanced tags ${context.str}`);
+ }
+
+ return result;
+};
+
+export default parser;
diff --git a/client2/src/localization/Translator/lib/plural.ts b/client2/src/localization/Translator/lib/plural.ts
new file mode 100644
index 00000000..a705fcca
--- /dev/null
+++ b/client2/src/localization/Translator/lib/plural.ts
@@ -0,0 +1,394 @@
+/* eslint-disable no-nested-ternary */
+export type SupportedLangs = 'az' | 'bo' | 'dz' | 'id' | 'ja' | 'jv' | 'ka' | 'km' | 'kn' | 'ko' | 'ms' | 'th' | 'tr' | 'vi' | 'zh' | 'af' | 'bn' | 'bg' | 'ca' | 'da' | 'de' | 'el' | 'en' | 'eo' | 'es' | 'et' | 'eu' | 'fa' | 'fi' | 'fo' | 'fur' | 'fy' | 'gl' | 'gu' | 'ha' | 'he' | 'hu' | 'is' | 'it' | 'ku' | 'lb' | 'ml' | 'mn' | 'mr' | 'nah' | 'nb' | 'ne' | 'nl' | 'nn' | 'no' | 'oc' | 'om' | 'or' | 'pa' | 'pap' | 'ps' | 'pt' | 'so' | 'sq' | 'sv' | 'sw' | 'ta' | 'te' | 'tk' | 'ur' | 'zu' | 'am' | 'bh' | 'fil' | 'fr' | 'gun' | 'hi' | 'hy' | 'ln' | 'mg' | 'nso' | 'xbr' | 'ti' | 'wa' | 'be' | 'bs' | 'hr' | 'ru' | 'sr' | 'uk' | 'cs' | 'sk' | 'ga' | 'lt' | 'sl' | 'mk' | 'mt' | 'lv' | 'pl' | 'cy' | 'ro' | 'ar';
+
+export type GenericLocales = {
+ [key in SupportedLangs]: SupportedLangs;
+};
+
+export enum AvailableLocales {
+ az = 'az',
+ bo = 'bo',
+ dz = 'dz',
+ id = 'id',
+ ja = 'ja',
+ jv = 'jv',
+ ka = 'ka',
+ km = 'km',
+ kn = 'kn',
+ ko = 'ko',
+ ms = 'ms',
+ th = 'th',
+ tr = 'tr',
+ vi = 'vi',
+ zh = 'zh',
+ af = 'af',
+ bn = 'bn',
+ bg = 'bg',
+ ca = 'ca',
+ da = 'da',
+ de = 'de',
+ el = 'el',
+ en = 'en',
+ eo = 'eo',
+ es = 'es',
+ et = 'et',
+ eu = 'eu',
+ fa = 'fa',
+ fi = 'fi',
+ fo = 'fo',
+ fur = 'fur',
+ fy = 'fy',
+ gl = 'gl',
+ gu = 'gu',
+ ha = 'ha',
+ he = 'he',
+ hu = 'hu',
+ is = 'is',
+ it = 'it',
+ ku = 'ku',
+ lb = 'lb',
+ ml = 'ml',
+ mn = 'mn',
+ mr = 'mr',
+ nah = 'nah',
+ nb = 'nb',
+ ne = 'ne',
+ nl = 'nl',
+ nn = 'nn',
+ no = 'no',
+ oc = 'oc',
+ om = 'om',
+ or = 'or',
+ pa = 'pa',
+ pap = 'pap',
+ ps = 'ps',
+ pt = 'pt',
+ so = 'so',
+ sq = 'sq',
+ sv = 'sv',
+ sw = 'sw',
+ ta = 'ta',
+ te = 'te',
+ tk = 'tk',
+ ur = 'ur',
+ zu = 'zu',
+ am = 'am',
+ bh = 'bh',
+ fil = 'fil',
+ fr = 'fr',
+ gun = 'gun',
+ hi = 'hi',
+ hy = 'hy',
+ ln = 'ln',
+ mg = 'mg',
+ nso = 'nso',
+ xbr = 'xbr',
+ ti = 'ti',
+ wa = 'wa',
+ be = 'be',
+ bs = 'bs',
+ hr = 'hr',
+ ru = 'ru',
+ sr = 'sr',
+ uk = 'uk',
+ cs = 'cs',
+ sk = 'sk',
+ ga = 'ga',
+ lt = 'lt',
+ sl = 'sl',
+ mk = 'mk',
+ mt = 'mt',
+ lv = 'lv',
+ pl = 'pl',
+ cy = 'cy',
+ ro = 'ro',
+ ar = 'ar',
+}
+export const getPluralFormId = (locale: AvailableLocales, number: number) => {
+ if (number === 0) {
+ return 0;
+ }
+ const slavNum = ((number % 10 === 1) && (number % 100 !== 11))
+ ? 1
+ : (
+ ((number % 10 >= 2) && (number % 10 <= 4) && ((number % 100 < 10)
+ || (number % 100 >= 20))
+ )
+ ? 2
+ : 3);
+ const supportedForms: Record = {
+ [AvailableLocales.az]: 1,
+ [AvailableLocales.bo]: 1,
+ [AvailableLocales.dz]: 1,
+ [AvailableLocales.id]: 1,
+ [AvailableLocales.ja]: 1,
+ [AvailableLocales.jv]: 1,
+ [AvailableLocales.ka]: 1,
+ [AvailableLocales.km]: 1,
+ [AvailableLocales.kn]: 1,
+ [AvailableLocales.ko]: 1,
+ [AvailableLocales.ms]: 1,
+ [AvailableLocales.th]: 1,
+ [AvailableLocales.tr]: 1,
+ [AvailableLocales.vi]: 1,
+ [AvailableLocales.zh]: 1,
+
+ [AvailableLocales.af]: (number === 1) ? 1 : 2,
+ [AvailableLocales.bn]: (number === 1) ? 1 : 2,
+ [AvailableLocales.bg]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ca]: (number === 1) ? 1 : 2,
+ [AvailableLocales.da]: (number === 1) ? 1 : 2,
+ [AvailableLocales.de]: (number === 1) ? 1 : 2,
+ [AvailableLocales.el]: (number === 1) ? 1 : 2,
+ [AvailableLocales.en]: (number === 1) ? 1 : 2,
+ [AvailableLocales.eo]: (number === 1) ? 1 : 2,
+ [AvailableLocales.es]: (number === 1) ? 1 : 2,
+ [AvailableLocales.et]: (number === 1) ? 1 : 2,
+ [AvailableLocales.eu]: (number === 1) ? 1 : 2,
+ [AvailableLocales.fa]: (number === 1) ? 1 : 2,
+ [AvailableLocales.fi]: (number === 1) ? 1 : 2,
+ [AvailableLocales.fo]: (number === 1) ? 1 : 2,
+ [AvailableLocales.fur]: (number === 1) ? 1 : 2,
+ [AvailableLocales.fy]: (number === 1) ? 1 : 2,
+ [AvailableLocales.gl]: (number === 1) ? 1 : 2,
+ [AvailableLocales.gu]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ha]: (number === 1) ? 1 : 2,
+ [AvailableLocales.he]: (number === 1) ? 1 : 2,
+ [AvailableLocales.hu]: (number === 1) ? 1 : 2,
+ [AvailableLocales.is]: (number === 1) ? 1 : 2,
+ [AvailableLocales.it]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ku]: (number === 1) ? 1 : 2,
+ [AvailableLocales.lb]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ml]: (number === 1) ? 1 : 2,
+ [AvailableLocales.mn]: (number === 1) ? 1 : 2,
+ [AvailableLocales.mr]: (number === 1) ? 1 : 2,
+ [AvailableLocales.nah]: (number === 1) ? 1 : 2,
+ [AvailableLocales.nb]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ne]: (number === 1) ? 1 : 2,
+ [AvailableLocales.nl]: (number === 1) ? 1 : 2,
+ [AvailableLocales.nn]: (number === 1) ? 1 : 2,
+ [AvailableLocales.no]: (number === 1) ? 1 : 2,
+ [AvailableLocales.oc]: (number === 1) ? 1 : 2,
+ [AvailableLocales.om]: (number === 1) ? 1 : 2,
+ [AvailableLocales.or]: (number === 1) ? 1 : 2,
+ [AvailableLocales.pa]: (number === 1) ? 1 : 2,
+ [AvailableLocales.pap]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ps]: (number === 1) ? 1 : 2,
+ [AvailableLocales.pt]: (number === 1) ? 1 : 2,
+ [AvailableLocales.so]: (number === 1) ? 1 : 2,
+ [AvailableLocales.sq]: (number === 1) ? 1 : 2,
+ [AvailableLocales.sv]: (number === 1) ? 1 : 2,
+ [AvailableLocales.sw]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ta]: (number === 1) ? 1 : 2,
+ [AvailableLocales.te]: (number === 1) ? 1 : 2,
+ [AvailableLocales.tk]: (number === 1) ? 1 : 2,
+ [AvailableLocales.ur]: (number === 1) ? 1 : 2,
+ [AvailableLocales.zu]: (number === 1) ? 1 : 2,
+
+ // how it works with 0?
+ [AvailableLocales.am]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.bh]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.fil]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.fr]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.gun]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.hi]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.hy]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.ln]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.mg]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.nso]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.xbr]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.ti]: ((number === 0) || (number === 1)) ? 0 : 1,
+ [AvailableLocales.wa]: ((number === 0) || (number === 1)) ? 0 : 1,
+
+ [AvailableLocales.be]: slavNum,
+ [AvailableLocales.bs]: slavNum,
+ [AvailableLocales.hr]: slavNum,
+ [AvailableLocales.ru]: slavNum,
+ [AvailableLocales.sr]: slavNum,
+ [AvailableLocales.uk]: slavNum,
+
+ [AvailableLocales.cs]: (number === 1) ? 1 : (((number >= 2) && (number <= 4)) ? 2 : 3),
+ [AvailableLocales.sk]: (number === 1) ? 1 : (((number >= 2) && (number <= 4)) ? 2 : 3),
+ [AvailableLocales.ga]: (number === 1) ? 1 : ((number === 2) ? 2 : 3),
+ [AvailableLocales.lt]: ((number % 10 === 1) && (number % 100 !== 11))
+ ? 1
+ : (((number % 10 >= 2) && ((number % 100 < 10) || (number % 100 >= 20)))
+ ? 2
+ : 3),
+ [AvailableLocales.sl]: (number % 100 === 1)
+ ? 1
+ : ((number % 100 === 2)
+ ? 2
+ : (((number % 100 === 3) || (number % 100 === 4))
+ ? 3
+ : 4)),
+ [AvailableLocales.mk]: (number % 10 === 1) ? 1 : 2,
+ [AvailableLocales.mt]: (number === 1)
+ ? 1
+ : (((number === 0) || ((number % 100 > 1) && (number % 100 < 11)))
+ ? 2
+ : (((number % 100 > 10) && (number % 100 < 20))
+ ? 3
+ : 4)),
+ [AvailableLocales.lv]: (number === 0)
+ ? 0
+ : (((number % 10 === 1) && (number % 100 !== 11))
+ ? 1
+ : 2),
+ [AvailableLocales.pl]: (number === 1)
+ ? 1
+ : (
+ ((number % 10 >= 2) && (number % 10 <= 4) && ((number % 100 < 12)
+ || (number % 100 > 14))
+ )
+ ? 2
+ : 3),
+ [AvailableLocales.cy]: (number === 1)
+ ? 0
+ : ((number === 2)
+ ? 1
+ : (((number === 8) || (number === 11))
+ ? 2
+ : 3)),
+ [AvailableLocales.ro]: (number === 1)
+ ? 1
+ : (((number === 1) || ((number % 100 > 0) && (number % 100 < 20)))
+ ? 2
+ : 3),
+ [AvailableLocales.ar]: (number === 0)
+ ? 0
+ : ((number === 1)
+ ? 1
+ : ((number === 2)
+ ? 2
+ : (((number % 100 >= 3) && (number % 100 <= 10))
+ ? 3
+ : (((number % 100 >= 11) && (number % 100 <= 99))
+ ? 4
+ : 5)))),
+
+ };
+ return supportedForms[locale];
+};
+export const pluraFormsCount: Record = {
+ [AvailableLocales.az]: 2,
+ [AvailableLocales.bo]: 2,
+ [AvailableLocales.dz]: 2,
+ [AvailableLocales.id]: 2,
+ [AvailableLocales.ja]: 2,
+ [AvailableLocales.jv]: 2,
+ [AvailableLocales.ka]: 2,
+ [AvailableLocales.km]: 2,
+ [AvailableLocales.kn]: 2,
+ [AvailableLocales.ko]: 2,
+ [AvailableLocales.ms]: 2,
+ [AvailableLocales.th]: 2,
+ [AvailableLocales.tr]: 2,
+ [AvailableLocales.vi]: 2,
+ [AvailableLocales.zh]: 2,
+ [AvailableLocales.af]: 3,
+ [AvailableLocales.bn]: 3,
+ [AvailableLocales.bg]: 3,
+ [AvailableLocales.ca]: 3,
+ [AvailableLocales.da]: 3,
+ [AvailableLocales.de]: 3,
+ [AvailableLocales.el]: 3,
+ [AvailableLocales.en]: 3,
+ [AvailableLocales.eo]: 3,
+ [AvailableLocales.es]: 3,
+ [AvailableLocales.et]: 3,
+ [AvailableLocales.eu]: 3,
+ [AvailableLocales.fa]: 3,
+ [AvailableLocales.fi]: 3,
+ [AvailableLocales.fo]: 3,
+ [AvailableLocales.fur]: 3,
+ [AvailableLocales.fy]: 3,
+ [AvailableLocales.gl]: 3,
+ [AvailableLocales.gu]: 3,
+ [AvailableLocales.ha]: 3,
+ [AvailableLocales.he]: 3,
+ [AvailableLocales.hu]: 3,
+ [AvailableLocales.is]: 3,
+ [AvailableLocales.it]: 3,
+ [AvailableLocales.ku]: 3,
+ [AvailableLocales.lb]: 3,
+ [AvailableLocales.ml]: 3,
+ [AvailableLocales.mn]: 3,
+ [AvailableLocales.mr]: 3,
+ [AvailableLocales.nah]: 3,
+ [AvailableLocales.nb]: 3,
+ [AvailableLocales.ne]: 3,
+ [AvailableLocales.nl]: 3,
+ [AvailableLocales.nn]: 3,
+ [AvailableLocales.no]: 3,
+ [AvailableLocales.oc]: 3,
+ [AvailableLocales.om]: 3,
+ [AvailableLocales.or]: 3,
+ [AvailableLocales.pa]: 3,
+ [AvailableLocales.pap]: 3,
+ [AvailableLocales.ps]: 3,
+ [AvailableLocales.pt]: 3,
+ [AvailableLocales.so]: 3,
+ [AvailableLocales.sq]: 3,
+ [AvailableLocales.sv]: 3,
+ [AvailableLocales.sw]: 3,
+ [AvailableLocales.ta]: 3,
+ [AvailableLocales.te]: 3,
+ [AvailableLocales.tk]: 3,
+ [AvailableLocales.ur]: 3,
+ [AvailableLocales.zu]: 3,
+ [AvailableLocales.am]: 2,
+ [AvailableLocales.bh]: 2,
+ [AvailableLocales.fil]: 2,
+ [AvailableLocales.fr]: 2,
+ [AvailableLocales.gun]: 2,
+ [AvailableLocales.hi]: 2,
+ [AvailableLocales.hy]: 2,
+ [AvailableLocales.ln]: 2,
+ [AvailableLocales.mg]: 2,
+ [AvailableLocales.nso]: 2,
+ [AvailableLocales.xbr]: 2,
+ [AvailableLocales.ti]: 2,
+ [AvailableLocales.wa]: 2,
+ [AvailableLocales.be]: 4,
+ [AvailableLocales.bs]: 4,
+ [AvailableLocales.hr]: 4,
+ [AvailableLocales.ru]: 4,
+ [AvailableLocales.sr]: 4,
+ [AvailableLocales.uk]: 4,
+ [AvailableLocales.cs]: 4,
+ [AvailableLocales.sk]: 4,
+ [AvailableLocales.ga]: 4,
+ [AvailableLocales.lt]: 4,
+ [AvailableLocales.sl]: 5,
+ [AvailableLocales.mk]: 3,
+ [AvailableLocales.mt]: 5,
+ [AvailableLocales.lv]: 3,
+ [AvailableLocales.pl]: 4,
+ [AvailableLocales.cy]: 4,
+ [AvailableLocales.ro]: 4,
+ [AvailableLocales.ar]: 6,
+};
+
+const PLURAL_STRING_DELIMITER = '|';
+
+export const checkForms = (str: string, locale: AvailableLocales, id: string) => {
+ const forms = str.split(PLURAL_STRING_DELIMITER);
+ if (forms.length !== pluraFormsCount[locale]) {
+ throw new Error(`Invalid plural string "${id}" for locale ${locale}: ${forms.length} given; need: ${pluraFormsCount[locale]}`);
+ }
+};
+export const checkFormsExternal = (str: string, locale: AvailableLocales, id: string) => {
+ try {
+ checkForms(str, locale, id);
+ return true;
+ } catch (error) {
+ return false;
+ }
+};
+export const getForm = (str: string, number: number, locale: AvailableLocales, id: string) => {
+ checkForms(str, locale, id);
+ const forms = str.split(PLURAL_STRING_DELIMITER);
+ const currentForm = getPluralFormId(locale, number);
+ return forms[currentForm].trim();
+};
diff --git a/client2/src/localization/Translator/lib/translator.ts b/client2/src/localization/Translator/lib/translator.ts
new file mode 100644
index 00000000..e791d065
--- /dev/null
+++ b/client2/src/localization/Translator/lib/translator.ts
@@ -0,0 +1,9 @@
+import parser from './parser';
+import format, { AllowedValues } from './formatter';
+
+const translator = (message: string, values: AllowedValues) => {
+ const astMessage = parser(message);
+ const formatted = format(astMessage, values);
+ return formatted;
+};
+export default translator;
diff --git a/client2/src/localization/Translator/lib/validator.ts b/client2/src/localization/Translator/lib/validator.ts
new file mode 100644
index 00000000..3ad7317d
--- /dev/null
+++ b/client2/src/localization/Translator/lib/validator.ts
@@ -0,0 +1,60 @@
+import parser from './parser';
+import { isTextNode, NODE } from './nodes';
+
+/**
+ * Compares two AST (abstract syntax tree) structures,
+ * view tests for examples
+ * @param baseAst
+ * @param targetAst
+ * @returns {boolean}
+ */
+const areAstStructuresSame = (baseAst: NODE[], targetAst: NODE[]) => {
+ const textNodeFilter = (node: NODE) => {
+ return !isTextNode(node);
+ };
+
+ const filteredBaseAst = baseAst.filter(textNodeFilter);
+
+ const filteredTargetAst = targetAst.filter(textNodeFilter);
+
+ // if AST structures have different lengths, they are not equal
+ if (filteredBaseAst.length !== filteredTargetAst.length) {
+ return false;
+ }
+
+ for (let i = 0; i < filteredBaseAst.length; i += 1) {
+ const baseNode = filteredBaseAst[i];
+
+ const targetNode = filteredTargetAst.find((node) => {
+ return node.type === baseNode.type && node.value === baseNode.value;
+ });
+
+ if (!targetNode) {
+ return false;
+ }
+
+ if (targetNode.children && baseNode.children) {
+ const areChildrenSame = areAstStructuresSame(baseNode.children, targetNode.children);
+ if (!areChildrenSame) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+};
+
+/**
+ * Validates translation against base string by AST (abstract syntax tree) structure
+ * @param baseStr
+ * @param targetStr
+ * @returns {boolean}
+ */
+export const isTargetStrValid = (baseStr: string, targetStr: string) => {
+ const baseAst = parser(baseStr);
+ const targetAst = parser(targetStr);
+
+ const result = areAstStructuresSame(baseAst, targetAst);
+
+ return result;
+};
diff --git a/client2/src/localization/index.ts b/client2/src/localization/index.ts
new file mode 100644
index 00000000..1006227e
--- /dev/null
+++ b/client2/src/localization/index.ts
@@ -0,0 +1,6 @@
+import T from './Translator';
+import { Locale } from './locales';
+
+export { messages, DatePickerLocale, Locale, DEFAULT_LOCALE, LANGUAGES, reactFormater } from './locales';
+export type Translator = T;
+export default T;
diff --git a/client2/src/localization/locales/en.json b/client2/src/localization/locales/en.json
new file mode 100644
index 00000000..99ae88d4
--- /dev/null
+++ b/client2/src/localization/locales/en.json
@@ -0,0 +1,48 @@
+{
+ "back": "Back",
+ "ethernet": "Ethernet",
+ "localhost": "localhost",
+ "login": "Login",
+ "password": "Password",
+ "next": "Next",
+ "port": "Port",
+
+
+ "install_admin_interface_port_desc": "Now it is working at 3000 port, just in case, but we recomended to use 80 port. Using this ports allow to access to Web interface like to common site",
+ "install_admin_interface_port": "Which port will be used",
+ "install_admin_interface_title_decs": "Admin web interface is used to control AdGuard Home. You can open it in your browser and it does not require using a client-side program",
+ "install_admin_interface_title": "Admin interface settings",
+ "install_admin_interface_where_interface_desc": "Set what kind of networks will be able to access to Admin interface. For example: if you choose a local interface only, then Admin inteface will be accessed by this local device only",
+ "install_admin_interface_where_interface": "Where can I open Admin interface",
+
+ "install_all_networks_description": "All available web interfaces",
+ "install_all_networks": "All networks",
+ "install_choose_networks_desc": "For advanced users",
+ "install_choose_networks": "Choose manually",
+
+ "install_wellcome_button": "Let's go",
+ "install_wellcome_desc": "You have installed AdGuard Home on your device. It is a network-wide ad-and-tracker blocking DNS server with Admin Web interface. Let’s set some settings to correct DNS working",
+ "install_wellcome_title": "Welcome to AdGuard Home",
+
+ "install_auth_title": "Login and password",
+ "install_auth_description": "Set login and password for accessing to Web interface",
+
+ "install_dns_server_title": "DNS server settings",
+ "install_dns_server_desc": "AdGuard DNS server works like common DNS server but also blocks ads and tracking domains",
+ "install_dns_server_network_interfaces": "Network interfaces",
+ "install_dns_server_network_interfaces_desc": "You should set for what kind of networks will be use AdGuard Home DNS server. Most often you need to have available all interfaces",
+ "install_dns_server_port": "Which port will be used",
+ "install_dns_server_port_desc": "You have to use port 53 for correct internet working. Change this value only if you have reason",
+ "install_dns_server_non_static_ip": "How to use non-static IP adresses?",
+
+ "install_configure_title": "Configure your devices",
+ "install_configure_danger_notice": "IMPORTANT! To start using AdGuard Home, you need to configure your devices manually",
+ "install_configure_how_to_title": "How to configure Router",
+ "install_configure_router": "This setup will automatically cover all the devices connected to your home router and you will not need to configure each of them manually.
Open the preferences for your router. Usually, you can access it from your browser via a URL (like http://192.168.0.1/ or http://192.168.1.1/). You may be asked to enter the password. If you don't remember it, you can often reset the password by pressing a button on the router itself. Some routers require a specific application, which in that case should be already installed on your computer/phone.
Find the DHCP/DNS settings. Look for the DNS letters next to a field which allows two or three sets of numbers, each broken into four groups of one to three digits.
Enter your AdGuard Home server addresses there.
",
+ "install_configure_windows": "Open Control Panel through Start menu or Windows search.
Go to Network and Internet category and then to Network and Sharing Center.
On the left side of the screen find Change adapter settings and click on it.
Select your active connection, right-click on it and choose Properties.
Find Internet Protocol Version 4 (TCP/IP) in the list, select it and then click on Properties again.
Choose Use the following DNS server addresses and enter your AdGuard Home server addresses.
",
+ "install_configure_macos": "Click on Apple icon and go to System Preferences.
Click on Network.
Select the first connection in your list and click Advanced.
Select the DNS tab and enter your AdGuard Home server addresses.
",
+ "install_configure_android": "From the Android Menu home screen, tap Settings.
Tap Wi-Fi on the menu. The screen listing all of the available networks will be shown (it is impossible to set custom DNS for mobile connection).
Long press the network you're connected to, and tap Modify Network.
On some devices, you may need to check the box for Advanced to see further settings. To adjust your Android DNS settings, you will need to switch the IP settings from DHCP to Static.
Change set DNS 1 and DNS 2 values to your AdGuard Home server addresses.
",
+ "install_configure_ios": "From the home screen, tap Settings.
Choose Wi-Fi in the left menu (it is impossible to configure DNS for mobile networks).
Tap on the name of the currently active network.
In the DNS field enter your AdGuard Home server addresses.
",
+ "install_configure_adresses": "AdGuard Home addresses:",
+ "install_configure_dhcp": "You can't set a custom DNS server on some types of routers. In this case it may help if you set up AdGuard Home as a DHCP server . Otherwise, you should search for the manual on how to customize DNS servers for your particular router model."
+}
\ No newline at end of file
diff --git a/client2/src/localization/locales/index.ts b/client2/src/localization/locales/index.ts
new file mode 100644
index 00000000..ec51ba71
--- /dev/null
+++ b/client2/src/localization/locales/index.ts
@@ -0,0 +1,43 @@
+import React from 'react';
+import 'dayjs/locale/ru';
+
+import { PickerLocale } from 'antd/es/date-picker/generatePicker';
+import ruPicker from 'antd/es/date-picker/locale/ru_RU';
+import enPicker from 'antd/es/date-picker/locale/en_GB';
+
+import ruLang from './ru.json';
+import enLang from './en.json';
+
+export enum Locale {
+ en = 'en',
+ ru = 'ru',
+}
+export const DatePickerLocale: Record = {
+ [Locale.ru]: ruPicker,
+ [Locale.en]: enPicker,
+};
+
+export const messages: Record> = {
+ [Locale.ru]: ruLang,
+ [Locale.en]: enLang,
+};
+
+export const DEFAULT_LOCALE = Locale.en;
+
+export const reactFormater = (data: (JSX.Element | string)[]) => {
+ if (data.every((d) => typeof d === 'string')) {
+ return data.join('');
+ }
+ return React.Children.toArray(data);
+};
+
+export const LANGUAGES: { code: Locale; name: string }[] = [
+ {
+ code: Locale.en,
+ name: 'English',
+ },
+ {
+ code: Locale.ru,
+ name: 'Русский',
+ },
+];
diff --git a/client2/src/localization/locales/ru.json b/client2/src/localization/locales/ru.json
new file mode 100644
index 00000000..af53fc02
--- /dev/null
+++ b/client2/src/localization/locales/ru.json
@@ -0,0 +1,4 @@
+{
+ "install_wellcome_title": "Добро пожаловать в AdGuard Home",
+ "install_wellcome_desc": "Русский текст"
+}
\ No newline at end of file
diff --git a/client2/src/main.pcss b/client2/src/main.pcss
new file mode 100644
index 00000000..5efd7a6b
--- /dev/null
+++ b/client2/src/main.pcss
@@ -0,0 +1,33 @@
+:root {
+ /*GRAYSCALE*/
+ --white: #ffffff;
+ --gray100: #f3f3f3;
+ --gray300: #d8d8d8;
+ --gray400: #a4a4a4;
+ --gray700: #888888;
+ --gray900: #4d4d4d;
+ --black: #131313;
+ /*FEEDBACK*/
+ --red400: #c23814;
+ --orange400: #eb9300;
+ /*BRAND*/
+ --green400: #67b279;
+ --green700: #4d995f;
+ /*ADDITIONAL*/
+ --purple400: #b267a0;
+ --purple700: #994d87;
+ --slateblue400: #677bb2;
+ --slateblue700: #4d6199;
+ /*VPN*/
+ --vpngreen400: #74a352;
+ --vpngreen700: #568040;
+ --vpnslateblue700: #575770;
+ --vpnslateblue800: #464558;
+ --vpnseagreen: #5eb0b7;
+
+}
+
+body {
+ font-size: 14px;
+ color: var(--gray900);
+}
\ No newline at end of file
diff --git a/client2/src/store/index.ts b/client2/src/store/index.ts
new file mode 100644
index 00000000..a1c7b93b
--- /dev/null
+++ b/client2/src/store/index.ts
@@ -0,0 +1 @@
+export { default, Store, storeValue } from './store';
diff --git a/client2/src/store/installStore.ts b/client2/src/store/installStore.ts
new file mode 100644
index 00000000..dfe7bfd7
--- /dev/null
+++ b/client2/src/store/installStore.ts
@@ -0,0 +1,19 @@
+import { createContext } from 'react';
+import Install from './stores/Install';
+import UI from './stores/ui';
+
+export class Store {
+ ui: UI;
+
+ install: Install;
+
+ constructor() {
+ this.ui = new UI(this);
+ this.install = new Install(this);
+ }
+}
+
+export const storeValue = new Store();
+
+const StoreContext = createContext(storeValue);
+export default StoreContext;
diff --git a/client2/src/store/store.ts b/client2/src/store/store.ts
new file mode 100644
index 00000000..24edb778
--- /dev/null
+++ b/client2/src/store/store.ts
@@ -0,0 +1,15 @@
+import { createContext } from 'react';
+import UI from './stores/ui';
+
+export class Store {
+ ui: UI;
+
+ constructor() {
+ this.ui = new UI(this);
+ }
+}
+
+export const storeValue = new Store();
+
+const StoreContext = createContext(storeValue);
+export default StoreContext;
diff --git a/client2/src/store/stores/Install.ts b/client2/src/store/stores/Install.ts
new file mode 100644
index 00000000..bd861ef2
--- /dev/null
+++ b/client2/src/store/stores/Install.ts
@@ -0,0 +1,50 @@
+import InstallApi from 'Apis/install';
+import AddressesInfoBeta, { IAddressesInfoBeta } from 'Entities/AddressesInfoBeta';
+import { ICheckConfigRequestBeta } from 'Entities/CheckConfigRequestBeta';
+import CheckConfigResponse, { ICheckConfigResponse } from 'Entities/CheckConfigResponse';
+import { IInitialConfigurationBeta } from 'Entities/InitialConfigurationBeta';
+import { errorChecker } from 'Helpers/apiErrors';
+import { flow, makeAutoObservable } from 'mobx';
+
+import { Store } from 'Store';
+
+export default class Install {
+ rootStore: Store;
+
+ addresses: AddressesInfoBeta | null;
+
+ constructor(rootStore: Store) {
+ this.rootStore = rootStore;
+ this.addresses = null;
+
+ makeAutoObservable(this, {
+ rootStore: false,
+ getAddresses: flow,
+ });
+ this.getAddresses();
+ }
+
+ * getAddresses() {
+ const response = yield InstallApi.installGetAddressesBeta();
+ const { result } = errorChecker(response);
+ if (result) {
+ this.addresses = new AddressesInfoBeta(result);
+ }
+ }
+
+ static async checkConfig(config: ICheckConfigRequestBeta) {
+ const response = await InstallApi.installCheckConfigBeta(config);
+ const { result } = errorChecker(response);
+ if (result) {
+ return new CheckConfigResponse(result);
+ }
+ }
+
+ static async configure(config: IInitialConfigurationBeta) {
+ const response = await InstallApi.installConfigureBeta(config);
+ const { result } = errorChecker(response);
+ if (result) {
+ return true;
+ }
+ }
+}
diff --git a/client2/src/store/stores/ui.ts b/client2/src/store/stores/ui.ts
new file mode 100644
index 00000000..648127a7
--- /dev/null
+++ b/client2/src/store/stores/ui.ts
@@ -0,0 +1,25 @@
+import { makeAutoObservable, observable } from 'mobx';
+
+import Translator, { DEFAULT_LOCALE, messages, Locale, reactFormater } from 'Localization';
+import { Store } from 'Store';
+
+export default class UI {
+ rootStore: Store;
+
+ currentLang = DEFAULT_LOCALE;
+
+ intl = new Translator(Locale.en, messages, DEFAULT_LOCALE, reactFormater);
+
+ constructor(rootStore: Store) {
+ this.rootStore = rootStore;
+ makeAutoObservable(this, {
+ intl: observable.struct,
+ rootStore: false,
+ });
+ }
+
+ updateLang = (lang: Locale) => {
+ this.currentLang = lang;
+ this.intl = this.intl.updateTranslator(lang);
+ };
+}
diff --git a/client2/tsconfig.json b/client2/tsconfig.json
new file mode 100644
index 00000000..5c70b792
--- /dev/null
+++ b/client2/tsconfig.json
@@ -0,0 +1,39 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "alwaysStrict": true,
+ "target": "es6",
+ "module": "ESNext",
+ "moduleResolution": "node",
+ "noResolve": false,
+ "noImplicitAny": true,
+ "strict": true,
+ "removeComments": true,
+ "sourceMap": true,
+ "jsx": "react",
+ "resolveJsonModule": true,
+ "baseUrl": "src",
+ "paths": {
+ "Apis/*": ["lib/apis/*"],
+ "Common": ["components/common/index"],
+ "Common/*": ["components/common/*"],
+ "Components/*": ["components/*"],
+ "Consts/*": ["lib/consts/*"],
+ "Entities/*": ["lib/entities/*"],
+ "Hooks": ["lib/hooks"],
+ "Helpers/*": ["lib/helpers/*"],
+ "Lib/*": ["lib/*"],
+ "Localization": ["localization/index"],
+ "Routes": ["lib/routes"],
+ "Store": ["store/store"],
+ "Store/*": ["store/*"]
+ },
+ "types": [
+ "react",
+ "react-dom",
+ "node"
+ ]
+ },
+ "include": ["src/**/*", "./declaration.d.ts"],
+ "exclude": ["./node_modules/**/*", "./scripts/generator/**/*"]
+}
diff --git a/client2/yarn.lock b/client2/yarn.lock
new file mode 100644
index 00000000..a0891ba1
--- /dev/null
+++ b/client2/yarn.lock
@@ -0,0 +1,8713 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ant-design/colors@^3.1.0":
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-3.2.2.tgz#5ad43d619e911f3488ebac303d606e66a8423903"
+ integrity sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==
+ dependencies:
+ tinycolor2 "^1.4.1"
+
+"@ant-design/colors@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-4.0.5.tgz#d7d100d7545cca8f624954604a6892fc48ba5aae"
+ integrity sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==
+ dependencies:
+ tinycolor2 "^1.4.1"
+
+"@ant-design/css-animation@^1.7.2":
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.3.tgz#60a1c970014e86b28f940510d69e503e428f1136"
+ integrity sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA==
+
+"@ant-design/icons-svg@^4.0.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c"
+ integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==
+
+"@ant-design/icons@^4.2.1", "@ant-design/icons@^4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.2.2.tgz#6533c5a02aec49238ec4748074845ad7d85a4f5e"
+ integrity sha512-DrVV+wcupnHS7PehJ6KiTcJtAR5c25UMgjGECCc6pUT9rsvw0AuYG+a4HDjfxEQuDqKTHwW+oX/nIvCymyLE8Q==
+ dependencies:
+ "@ant-design/colors" "^3.1.0"
+ "@ant-design/icons-svg" "^4.0.0"
+ "@babel/runtime" "^7.10.4"
+ classnames "^2.2.6"
+ insert-css "^2.0.0"
+ rc-util "^5.0.1"
+
+"@ant-design/react-slick@~0.27.0":
+ version "0.27.11"
+ resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.27.11.tgz#ce788312ed8e64fcba2f7bb4556f47486b407c6e"
+ integrity sha512-KPJ1lleHW11bameFauI77Lb9N7O/4ulT1kplVdRQykWLv3oKVSGKVaekC3DM/Z0MYmKfCXCucpFnfgGMEHNM+w==
+ dependencies:
+ "@babel/runtime" "^7.10.4"
+ classnames "^2.2.5"
+ json2mq "^0.2.0"
+ lodash "^4.17.15"
+ resize-observer-polyfill "^1.5.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+ integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/core@>=7.9.0":
+ version "7.12.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8"
+ integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.12.1"
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helpers" "^7.12.1"
+ "@babel/parser" "^7.12.3"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.1"
+ json5 "^2.1.2"
+ lodash "^4.17.19"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468"
+ integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==
+ dependencies:
+ "@babel/types" "^7.12.1"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-function-name@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
+ integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-get-function-arity@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
+ integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c"
+ integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-module-imports@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c"
+ integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-module-transforms@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c"
+ integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.1"
+ "@babel/helper-replace-supers" "^7.12.1"
+ "@babel/helper-simple-access" "^7.12.1"
+ "@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
+ lodash "^4.17.19"
+
+"@babel/helper-optimise-call-expression@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
+ integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+ dependencies:
+ "@babel/types" "^7.10.4"
+
+"@babel/helper-replace-supers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9"
+ integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.12.1"
+ "@babel/helper-optimise-call-expression" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-simple-access@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136"
+ integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-split-export-declaration@^7.11.0":
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
+ integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
+ dependencies:
+ "@babel/types" "^7.11.0"
+
+"@babel/helper-validator-identifier@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
+ integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
+
+"@babel/helpers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79"
+ integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==
+ dependencies:
+ "@babel/template" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
+
+"@babel/highlight@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
+ integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.4"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3":
+ version "7.12.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd"
+ integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==
+
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740"
+ integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
+ integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/parser" "^7.10.4"
+ "@babel/types" "^7.10.4"
+
+"@babel/traverse@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e"
+ integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.12.1"
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/parser" "^7.12.1"
+ "@babel/types" "^7.12.1"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.19"
+
+"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae"
+ integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.10.4"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
+"@csstools/convert-colors@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
+ integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
+
+"@dsherret/to-absolute-glob@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1f6475dc8bd974cea07a2daf3864b317b1dd332c"
+ integrity sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=
+ dependencies:
+ is-absolute "^1.0.0"
+ is-negated-glob "^1.0.0"
+
+"@eslint/eslintrc@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085"
+ integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.1.1"
+ espree "^7.3.0"
+ globals "^12.1.0"
+ ignore "^4.0.6"
+ import-fresh "^3.2.1"
+ js-yaml "^3.13.1"
+ lodash "^4.17.19"
+ minimatch "^3.0.4"
+ strip-json-comments "^3.1.1"
+
+"@nodelib/fs.scandir@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+ integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.3"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+ integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+ integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.3"
+ fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
+ integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
+ dependencies:
+ mkdirp "^1.0.4"
+
+"@sentry/browser@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.27.0.tgz#35b77f076fb5f08c91eff23f3c067ee15df0ab90"
+ integrity sha512-AByUVSy5YctTxWGA6HaeTkZXDCmHbeurqLkR6U9h4HzEHZq3laxrYQ1HiWcaW1IgFDqZcEmD14kDOVY4GhF3QQ==
+ dependencies:
+ "@sentry/core" "5.27.0"
+ "@sentry/types" "5.27.0"
+ "@sentry/utils" "5.27.0"
+ tslib "^1.9.3"
+
+"@sentry/core@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.0.tgz#661b2fd1beecaa37c013a6c364330fa29c847b3c"
+ integrity sha512-ddvAxVszsHzFzGedii1NxfKU3GxAEGJV5eXNlA2hqS0/OKl+IOjuI6aJjg55LMTEEejqr9djXqDMk6y5av6UKg==
+ dependencies:
+ "@sentry/hub" "5.27.0"
+ "@sentry/minimal" "5.27.0"
+ "@sentry/types" "5.27.0"
+ "@sentry/utils" "5.27.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.0.tgz#dcd7b36d216997f0283bd3334cbce8004d56ef89"
+ integrity sha512-Qe4nndgDEY8n3kKEWJTw5M201dgsoB9ZQ10483cVpGCtOfZZuzXEr4EaLG3BefH8YFvlgUP3YlxD7XFoJioRjg==
+ dependencies:
+ "@sentry/types" "5.27.0"
+ "@sentry/utils" "5.27.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.0.tgz#8c2fdcf9cd1e59d8ff1848a7905bac304f8e206b"
+ integrity sha512-KidWjo2jNd8IwPhEIDC0YddjwuIdVxTEsmpRkZ6afuiR5rMQsiqA0EwsndWiAjs67qxQRj/VD/1Xghxe0nHzXQ==
+ dependencies:
+ "@sentry/hub" "5.27.0"
+ "@sentry/types" "5.27.0"
+ tslib "^1.9.3"
+
+"@sentry/react@^5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.27.0.tgz#ef503b0c28b03088f1de7693f75276ccc96c5e14"
+ integrity sha512-7dYKhQ6tgDgAed1neXjID9mEviX9IzL/OkG+hU8zffUqcUtMziVHtvozf3ePz75ReRR/Bumc6fGnSMlnEcwbKg==
+ dependencies:
+ "@sentry/browser" "5.27.0"
+ "@sentry/minimal" "5.27.0"
+ "@sentry/types" "5.27.0"
+ "@sentry/utils" "5.27.0"
+ hoist-non-react-statics "^3.3.2"
+ tslib "^1.9.3"
+
+"@sentry/types@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.0.tgz#cea288d02c727ef83541768b8738e6a829dfc831"
+ integrity sha512-coB2bMDxmzTwIWcXbzbnE2JtEqDkvmK9+KyZZNI/Mk3wwabFYqL7hOnqXB45/+hx+6l9/siWmB1l5um3tzqdOw==
+
+"@sentry/utils@5.27.0":
+ version "5.27.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.0.tgz#21c15401b43041b1208521465c09c64eafc2e0ff"
+ integrity sha512-XrdoxOsjqF9AVmeCefNgY0r3lvZBj34bzsG3TI8Z1bjQKB3iF/2yAI/bdo+sUqAiJiiPSk5p6SiPkyeTsSdBhg==
+ dependencies:
+ "@sentry/types" "5.27.0"
+ tslib "^1.9.3"
+
+"@stylelint/postcss-css-in-js@^0.37.2":
+ version "0.37.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
+ integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
+ dependencies:
+ "@babel/core" ">=7.9.0"
+
+"@stylelint/postcss-markdown@^0.36.1":
+ version "0.36.1"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8"
+ integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==
+ dependencies:
+ remark "^12.0.0"
+ unist-util-find-all-after "^3.0.1"
+
+"@ts-morph/common@~0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.6.0.tgz#cbd4ee57c5ef971511b9c5778e0bb8eb27de4783"
+ integrity sha512-pI35nZz5bs3tL3btSVX2cWkAE8rc80F+Fn4TwSC6bQvn7fgn9IyLXVcAfpG6X6NBY5wN9TkSWXn/QYUkBvR/Fw==
+ dependencies:
+ "@dsherret/to-absolute-glob" "^2.0.2"
+ fast-glob "^3.2.4"
+ fs-extra "^9.0.1"
+ is-negated-glob "^1.0.0"
+ multimatch "^4.0.0"
+ typescript "~4.0.2"
+
+"@types/anymatch@*":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
+ integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
+
+"@types/classnames@^2.2.10":
+ version "2.2.10"
+ resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999"
+ integrity sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==
+
+"@types/eslint-scope@^3.7.0":
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
+ integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "7.2.6"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c"
+ integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^0.0.45":
+ version "0.0.45"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884"
+ integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==
+
+"@types/glob@^7.1.1":
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+ integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/history@*":
+ version "4.7.8"
+ resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934"
+ integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==
+
+"@types/hoist-non-react-statics@^3.3.0":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
+ integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
+ dependencies:
+ "@types/react" "*"
+ hoist-non-react-statics "^3.3.0"
+
+"@types/html-minifier-terser@^5.0.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50"
+ integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==
+
+"@types/http-proxy@^1.17.4":
+ version "1.17.4"
+ resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b"
+ integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==
+ dependencies:
+ "@types/node" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
+ integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@types/minimatch@*", "@types/minimatch@^3.0.3":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/minimist@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
+ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+
+"@types/node@*":
+ version "14.14.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.0.tgz#f1091b6ad5de18e8e91bdbd43ec63f13de372538"
+ integrity sha512-BfbIHP9IapdupGhq/hc+jT5dyiBVZ2DdeC5WwJWQWDb0GijQlzUFAeIQn/2GtvZcd2HVUU7An8felIICFTC2qg==
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/prop-types@*":
+ version "15.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
+ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
+
+"@types/q@^1.5.1":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
+ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
+
+"@types/qs@^6.9.5":
+ version "6.9.5"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b"
+ integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==
+
+"@types/react-dom@^16.9.8":
+ version "16.9.8"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423"
+ integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-redux@^7.1.9":
+ version "7.1.9"
+ resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.9.tgz#280c13565c9f13ceb727ec21e767abe0e9b4aec3"
+ integrity sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w==
+ dependencies:
+ "@types/hoist-non-react-statics" "^3.3.0"
+ "@types/react" "*"
+ hoist-non-react-statics "^3.3.0"
+ redux "^4.0.0"
+
+"@types/react-router-dom@^5.1.6":
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.6.tgz#07b14e7ab1893a837c8565634960dc398564b1fb"
+ integrity sha512-gjrxYqxz37zWEdMVvQtWPFMFj1dRDb4TGOcgyOfSXTrEXdF92L00WE3C471O3TV/RF1oskcStkXsOU0Ete4s/g==
+ dependencies:
+ "@types/history" "*"
+ "@types/react" "*"
+ "@types/react-router" "*"
+
+"@types/react-router@*":
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa"
+ integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==
+ dependencies:
+ "@types/history" "*"
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^16.9.53":
+ version "16.9.53"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.53.tgz#40cd4f8b8d6b9528aedd1fff8fcffe7a112a3d23"
+ integrity sha512-4nW60Sd4L7+WMXH1D6jCdVftuW7j4Za6zdp6tJ33Rqv0nk1ZAmQKML9ZLD4H0dehA3FZxXR/GM8gXplf82oNGw==
+ dependencies:
+ "@types/prop-types" "*"
+ csstype "^3.0.2"
+
+"@types/source-list-map@*":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
+"@types/tapable@*", "@types/tapable@^1.0.5":
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
+ integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==
+
+"@types/uglify-js@*":
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.0.tgz#2868d405cc45cd9dc3069179052103032c33afbc"
+ integrity sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==
+ dependencies:
+ source-map "^0.6.1"
+
+"@types/unist@^2.0.0", "@types/unist@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+ integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
+
+"@types/webpack-sources@*":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.0.0.tgz#08216ab9be2be2e1499beaebc4d469cec81e82a7"
+ integrity sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==
+ dependencies:
+ "@types/node" "*"
+ "@types/source-list-map" "*"
+ source-map "^0.7.3"
+
+"@types/webpack@^4.41.8":
+ version "4.41.23"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.23.tgz#1925f42a7325be4ae0fce38329f1cc27768fcda7"
+ integrity sha512-ojA4CupZg8RCzVJLugWlvqrHpT59GWhqFxbinlsnvk10MjQCWB+ot7XDACctbWhnhtdhYK7+HOH1JxkVLiZhMg==
+ dependencies:
+ "@types/anymatch" "*"
+ "@types/node" "*"
+ "@types/tapable" "*"
+ "@types/uglify-js" "*"
+ "@types/webpack-sources" "*"
+ source-map "^0.6.0"
+
+"@typescript-eslint/eslint-plugin@^4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz#4ff9c1d8535ae832e239f0ef6d7210592d9b0b07"
+ integrity sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "4.5.0"
+ "@typescript-eslint/scope-manager" "4.5.0"
+ debug "^4.1.1"
+ functional-red-black-tree "^1.0.1"
+ regexpp "^3.0.0"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
+"@typescript-eslint/experimental-utils@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz#547fe1158609143ce60645383aa1d6f83ada28df"
+ integrity sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==
+ dependencies:
+ "@types/json-schema" "^7.0.3"
+ "@typescript-eslint/scope-manager" "4.5.0"
+ "@typescript-eslint/types" "4.5.0"
+ "@typescript-eslint/typescript-estree" "4.5.0"
+ eslint-scope "^5.0.0"
+ eslint-utils "^2.0.0"
+
+"@typescript-eslint/parser@4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.4.1.tgz#25fde9c080611f303f2f33cedb145d2c59915b80"
+ integrity sha512-S0fuX5lDku28Au9REYUsV+hdJpW/rNW0gWlc4SXzF/kdrRaAVX9YCxKpziH7djeWT/HFAjLZcnY7NJD8xTeUEg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "4.4.1"
+ "@typescript-eslint/types" "4.4.1"
+ "@typescript-eslint/typescript-estree" "4.4.1"
+ debug "^4.1.1"
+
+"@typescript-eslint/parser@^4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.5.0.tgz#b2d659f25eec0041c7bc5660b91db1eefe8d7122"
+ integrity sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==
+ dependencies:
+ "@typescript-eslint/scope-manager" "4.5.0"
+ "@typescript-eslint/types" "4.5.0"
+ "@typescript-eslint/typescript-estree" "4.5.0"
+ debug "^4.1.1"
+
+"@typescript-eslint/scope-manager@4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.4.1.tgz#d19447e60db2ce9c425898d62fa03b2cce8ea3f9"
+ integrity sha512-2oD/ZqD4Gj41UdFeWZxegH3cVEEH/Z6Bhr/XvwTtGv66737XkR4C9IqEkebCuqArqBJQSj4AgNHHiN1okzD/wQ==
+ dependencies:
+ "@typescript-eslint/types" "4.4.1"
+ "@typescript-eslint/visitor-keys" "4.4.1"
+
+"@typescript-eslint/scope-manager@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz#8dfd53c3256d4357e7d66c2fc8956835f4d239be"
+ integrity sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==
+ dependencies:
+ "@typescript-eslint/types" "4.5.0"
+ "@typescript-eslint/visitor-keys" "4.5.0"
+
+"@typescript-eslint/types@4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.4.1.tgz#c507b35cf523bc7ba00aae5f75ee9b810cdabbc1"
+ integrity sha512-KNDfH2bCyax5db+KKIZT4rfA8rEk5N0EJ8P0T5AJjo5xrV26UAzaiqoJCxeaibqc0c/IvZxp7v2g3difn2Pn3w==
+
+"@typescript-eslint/types@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.5.0.tgz#98256e07bad1c8d15d0c9627ebec82fd971bb3c3"
+ integrity sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==
+
+"@typescript-eslint/typescript-estree@4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.4.1.tgz#598f6de488106c2587d47ca2462c60f6e2797cb8"
+ integrity sha512-wP/V7ScKzgSdtcY1a0pZYBoCxrCstLrgRQ2O9MmCUZDtmgxCO/TCqOTGRVwpP4/2hVfqMz/Vw1ZYrG8cVxvN3g==
+ dependencies:
+ "@typescript-eslint/types" "4.4.1"
+ "@typescript-eslint/visitor-keys" "4.4.1"
+ debug "^4.1.1"
+ globby "^11.0.1"
+ is-glob "^4.0.1"
+ lodash "^4.17.15"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
+"@typescript-eslint/typescript-estree@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz#d50cf91ae3a89878401111031eb6fb6d03554f64"
+ integrity sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==
+ dependencies:
+ "@typescript-eslint/types" "4.5.0"
+ "@typescript-eslint/visitor-keys" "4.5.0"
+ debug "^4.1.1"
+ globby "^11.0.1"
+ is-glob "^4.0.1"
+ lodash "^4.17.15"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
+"@typescript-eslint/visitor-keys@4.4.1":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.4.1.tgz#1769dc7a9e2d7d2cfd3318b77ed8249187aed5c3"
+ integrity sha512-H2JMWhLaJNeaylSnMSQFEhT/S/FsJbebQALmoJxMPMxLtlVAMy2uJP/Z543n9IizhjRayLSqoInehCeNW9rWcw==
+ dependencies:
+ "@typescript-eslint/types" "4.4.1"
+ eslint-visitor-keys "^2.0.0"
+
+"@typescript-eslint/visitor-keys@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz#b59f26213ac597efe87f6b13cf2aabee70542af0"
+ integrity sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==
+ dependencies:
+ "@typescript-eslint/types" "4.5.0"
+ eslint-visitor-keys "^2.0.0"
+
+"@webassemblyjs/ast@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+ integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+ 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.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+ integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+ integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+ integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+ integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+ integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+ integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+ integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+ integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+ 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.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+ integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+ integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+ integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+ integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+ 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.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+ integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+ 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.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+ integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+ 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.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+ integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+ 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.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+ integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+ 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.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+ integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/info@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.1.0.tgz#c596d5bc48418b39df00c5ed7341bf0f102dbff1"
+ integrity sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==
+ dependencies:
+ envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.1.0.tgz#13ad38f89b6e53d1133bac0006a128217a6ebf92"
+ integrity sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+acorn-jsx@^5.2.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
+ integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+
+acorn@^7.4.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.0.4:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354"
+ integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==
+
+add-dom-event-listener@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310"
+ integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==
+ dependencies:
+ object-assign "4.x"
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ 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.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+ansi-colors@^3.0.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+ integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
+
+ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+ integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+antd-dayjs-webpack-plugin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/antd-dayjs-webpack-plugin/-/antd-dayjs-webpack-plugin-1.0.1.tgz#cc31cc05c9bd69652a4bddab19eb49726bebe0d5"
+ integrity sha512-1UWGAnv856s5r/2bi6KJvWMeevDEHwFFdHaymZElW5kbH06A/xP7JcZ75UdYoxqny3scD22DWErbGg+vQ9RNdg==
+
+antd@^4.7.2:
+ version "4.7.2"
+ resolved "https://registry.yarnpkg.com/antd/-/antd-4.7.2.tgz#6be4c34de141786bbc5425c743d0a3b990042641"
+ integrity sha512-baMyvvNRB0rqhUxi4cSaH4AG9Cd2W7TjAJnOrVTow8y5E45g3JU31+dAVUHWvtht6LTiWh4BLiKfCdZrSYBeEA==
+ dependencies:
+ "@ant-design/colors" "^4.0.5"
+ "@ant-design/css-animation" "^1.7.2"
+ "@ant-design/icons" "^4.2.1"
+ "@ant-design/react-slick" "~0.27.0"
+ "@babel/runtime" "^7.11.2"
+ array-tree-filter "^2.1.0"
+ classnames "^2.2.6"
+ copy-to-clipboard "^3.2.0"
+ lodash "^4.17.20"
+ moment "^2.25.3"
+ omit.js "^2.0.2"
+ raf "^3.4.1"
+ rc-animate "~3.1.0"
+ rc-cascader "~1.4.0"
+ rc-checkbox "~2.3.0"
+ rc-collapse "~2.0.0"
+ rc-dialog "~8.4.0"
+ rc-drawer "~4.1.0"
+ rc-dropdown "~3.2.0"
+ rc-field-form "~1.12.0"
+ rc-image "~3.2.1"
+ rc-input-number "~6.1.0"
+ rc-mentions "~1.5.0"
+ rc-menu "~8.8.2"
+ rc-motion "^2.2.0"
+ rc-notification "~4.5.2"
+ rc-pagination "~3.1.0"
+ rc-picker "~2.3.0"
+ rc-progress "~3.1.0"
+ rc-rate "~2.8.2"
+ rc-resize-observer "^0.2.3"
+ rc-select "~11.4.0"
+ rc-slider "~9.5.2"
+ rc-steps "~4.1.0"
+ rc-switch "~3.2.0"
+ rc-table "~7.10.0"
+ rc-tabs "~11.7.0"
+ rc-textarea "~0.3.0"
+ rc-tooltip "~5.0.0"
+ rc-tree "~3.10.0"
+ rc-tree-select "~4.1.1"
+ rc-trigger "~5.0.3"
+ rc-upload "~3.3.1"
+ rc-util "^5.1.0"
+ scroll-into-view-if-needed "^2.2.25"
+ warning "^4.0.3"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90"
+ integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==
+
+array-differ@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
+ integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-flatten@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+ integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
+
+array-includes@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
+ integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0"
+ is-string "^1.0.5"
+
+array-tree-filter@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
+ integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+array.prototype.flat@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
+ integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+array.prototype.flatmap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443"
+ integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+
+arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+arrify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
+ integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+ integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async-validator@^3.0.3:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.4.0.tgz#871b3e594124bf4c4eb7bcd1a9e78b44f3b09cae"
+ integrity sha512-VrFk4eYiJAWKskEz115iiuCf9O0ftnMMPXrOFMqyzGH2KxO7YwncKyn/FgOOP+0MDHMfXL7gLExagCutaZGigA==
+
+async@^2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.0.1.tgz#e2d9000f84ebd98d77b7bc16f8adb2ff1f7bb946"
+ integrity sha512-aQo2BDIsoOdemXUAOBpFv4ZQa2DrOtEufarYhtFsK1088Ca0TUwu/aQWf0M3mrILXZ3mTIVn1lR3hPW8acacsw==
+ dependencies:
+ browserslist "^4.14.5"
+ caniuse-lite "^1.0.30001137"
+ colorette "^1.2.1"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss-value-parser "^4.1.0"
+
+autoprefixer@^9.6.1, autoprefixer@^9.8.6:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+ 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"
+
+bail@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ 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.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+body-parser@1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ 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.yarnpkg.com/bonjour/-/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.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ 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.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ 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:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.6.4:
+ version "4.14.5"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015"
+ integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==
+ dependencies:
+ caniuse-lite "^1.0.30001135"
+ electron-to-chromium "^1.3.571"
+ escalade "^3.1.0"
+ node-releases "^1.1.61"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-indexof@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+ integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacache@^15.0.5:
+ version "15.0.5"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0"
+ integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==
+ dependencies:
+ "@npmcli/move-file" "^1.0.1"
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ infer-owner "^1.0.4"
+ lru-cache "^6.0.0"
+ minipass "^3.1.1"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^1.0.3"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^8.0.0"
+ tar "^6.0.2"
+ unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ 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"
+
+call-bind@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce"
+ integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.0"
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/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.yarnpkg.com/caller-path/-/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.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
+ integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==
+ dependencies:
+ pascal-case "^3.1.1"
+ tslib "^1.10.0"
+
+camelcase-css@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+ integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+ dependencies:
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.1.0.tgz#27dc176173725fb0adf8a48b647f4d7871944d78"
+ integrity sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ 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.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135, caniuse-lite@^1.0.30001137:
+ version "1.0.30001150"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz#6d0d829da654b0b233576de00335586bc2004df1"
+ integrity sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==
+
+ccount@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17"
+ integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==
+
+chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ 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.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+character-entities-html4@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125"
+ integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+chokidar@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ 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"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+ integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
+ dependencies:
+ tslib "^1.9.0"
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+ integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
+
+clean-css@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
+ integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
+ dependencies:
+ source-map "~0.6.0"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+clone-regexp@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
+ integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==
+ dependencies:
+ is-regexp "^2.0.0"
+
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+code-block-writer@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.0.tgz#54fc410ebef2af836d9c2314ac40af7d7b37eee9"
+ integrity sha512-RG9hpXtWFeUWhuUav1YuP/vGcyncW+t90yJLk9fNZs1De2OuHTHKAKThVCokt29PYq5RoJ0QSZaIZ+rvPO23hA==
+
+collapse-white-space@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
+ integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/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.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6"
+ integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
+ integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.4"
+
+colorette@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
+ integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
+
+command-line-usage@^6.1.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.1.tgz#c908e28686108917758a49f45efb4f02f76bc03f"
+ integrity sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==
+ dependencies:
+ array-back "^4.0.1"
+ chalk "^2.4.2"
+ table-layout "^1.0.1"
+ typical "^5.2.0"
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+commander@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75"
+ integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+compare-versions@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62"
+ integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ 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"
+
+compute-scroll-into-view@^1.0.16:
+ version "1.0.16"
+ resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.16.tgz#5b7bf4f7127ea2c19b750353d7ce6776a90ee088"
+ integrity sha512-a85LHKY81oQnikatZYA90pufpZ6sQx++BoCxOEMsjpZx+ZnaKGQnCyCehTRr/1p9GBIAHTjcU9k71kSYWloLiQ==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+confusing-browser-globals@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
+ integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
+
+connect-history-api-fallback@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+ integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+contains-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
+ integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+copy-to-clipboard@^3.2.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae"
+ integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
+ dependencies:
+ toggle-selection "^1.0.6"
+
+copy-webpack-plugin@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz#8015e4d5c5e637ab7b39c76daa9e03c7a4bf1ae5"
+ integrity sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==
+ dependencies:
+ cacache "^15.0.5"
+ fast-glob "^3.2.4"
+ find-cache-dir "^3.3.1"
+ glob-parent "^5.1.1"
+ globby "^11.0.1"
+ loader-utils "^2.0.0"
+ normalize-path "^3.0.0"
+ p-limit "^3.0.2"
+ schema-utils "^3.0.0"
+ serialize-javascript "^5.0.1"
+ webpack-sources "^1.4.3"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+cosmiconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+ integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+cross-spawn@^6.0.0:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ 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, cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-blank-pseudo@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
+ integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==
+ dependencies:
+ postcss "^7.0.5"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-has-pseudo@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
+ integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^5.0.0-rc.4"
+
+css-loader@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.0.tgz#f0a48dfacc3ab9936a05ee16a09e7f313872e117"
+ integrity sha512-9g35eXRBgjvswyJWoqq/seWp+BOxvUl8IinVNTsUBFFxtwfEYvlmEn6ciyn0liXGbGh5HyJjPGCuobDSfqMIVg==
+ dependencies:
+ camelcase "^6.1.0"
+ cssesc "^3.0.0"
+ icss-utils "^5.0.0"
+ loader-utils "^2.0.0"
+ postcss "^8.1.1"
+ postcss-modules-extract-imports "^3.0.0"
+ postcss-modules-local-by-default "^4.0.0"
+ postcss-modules-scope "^3.0.0"
+ postcss-modules-values "^4.0.0"
+ postcss-value-parser "^4.1.0"
+ schema-utils "^3.0.0"
+ semver "^7.3.2"
+
+css-prefers-color-scheme@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4"
+ integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==
+ dependencies:
+ postcss "^7.0.5"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-select@^2.0.0, css-select@^2.0.2:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+ integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^3.2.1"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-tree@1.0.0-alpha.37:
+ version "1.0.0-alpha.37"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.6.1"
+
+css-tree@1.0.0-alpha.39:
+ version "1.0.0-alpha.39"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
+ integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
+ dependencies:
+ mdn-data "2.0.6"
+ source-map "^0.6.1"
+
+css-what@2.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
+css-what@^3.2.1:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+ integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
+cssdb@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
+ integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==
+
+cssesc@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
+ integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ 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.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/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.yarnpkg.com/cssnano-util-get-match/-/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.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
+ integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
+ dependencies:
+ css-tree "1.0.0-alpha.39"
+
+csstype@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8"
+ integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==
+
+date-fns@^2.15.0:
+ version "2.16.1"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b"
+ integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==
+
+dayjs@^1.8.30, dayjs@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.9.3.tgz#b7f94b22ad2a136a4ca02a01ab68ae893fe1a268"
+ integrity sha512-V+1SyIvkS+HmNbN1G7A9+ERbFTV9KTXu6Oor98v2xHmzzpp52OIJhQuJSTywWuBY5pyAEmlwbCi1Me87n/SLOw==
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.1, debug@^3.2.5:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
+ integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
+ dependencies:
+ ms "2.1.2"
+
+decamelize-keys@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+ integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
+ dependencies:
+ decamelize "^1.1.0"
+ map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-equal@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ 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-extend@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+deepmerge@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
+ integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
+
+default-gateway@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
+ integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
+ dependencies:
+ execa "^1.0.0"
+ ip-regex "^2.1.0"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/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.yarnpkg.com/define-property/-/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.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+del@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
+ integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+ 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"
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-node@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
+ integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+dns-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+ integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
+
+dns-packet@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
+ integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
+ dependencies:
+ ip "^1.1.0"
+ safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+ integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
+ dependencies:
+ buffer-indexof "^1.0.0"
+
+doctrine@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+ integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-align@^1.7.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c"
+ integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==
+
+dom-converter@^0.2:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-serializer@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
+ integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1, domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-case@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa"
+ integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==
+ dependencies:
+ no-case "^3.0.3"
+ tslib "^1.10.0"
+
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.571:
+ version "1.3.582"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz#1adfac5affce84d85b3d7b3dfbc4ade293a6ffc4"
+ integrity sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
+ integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.5.0"
+ tapable "^1.0.0"
+
+enhanced-resolve@^5.3.1:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz#a8bcf23b00affac9455cf71efd80844f4054f4dc"
+ integrity sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.0.0"
+
+enquirer@^2.3.5, enquirer@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
+ integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
+
+envinfo@^7.7.3:
+ version "7.7.3"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc"
+ integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==
+
+errno@^0.1.1, errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
+ version "1.17.7"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c"
+ integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.2"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.1"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1:
+ version "1.18.0-next.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68"
+ integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.2"
+ is-negative-zero "^2.0.0"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.1"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escalade@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+eslint-config-airbnb-base@14.2.0, eslint-config-airbnb-base@^14.2.0:
+ version "14.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4"
+ integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==
+ dependencies:
+ confusing-browser-globals "^1.0.9"
+ object.assign "^4.1.0"
+ object.entries "^1.1.2"
+
+eslint-config-airbnb-typescript@^12.0.0:
+ version "12.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.0.0.tgz#4bb6b4b72b1cfc45ef1fa0607735679ceb9a3814"
+ integrity sha512-TUCVru1Z09eKnVAX5i3XoNzjcCOU3nDQz2/jQGkg1jVYm+25fKClveziSl16celfCq+npU0MBPW/ZnXdGFZ9lw==
+ dependencies:
+ "@typescript-eslint/parser" "4.4.1"
+ eslint-config-airbnb "18.2.0"
+ eslint-config-airbnb-base "14.2.0"
+
+eslint-config-airbnb@18.2.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd"
+ integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==
+ dependencies:
+ eslint-config-airbnb-base "^14.2.0"
+ object.assign "^4.1.0"
+ object.entries "^1.1.2"
+
+eslint-import-resolver-node@^0.3.4:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
+ integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
+ dependencies:
+ debug "^2.6.9"
+ resolve "^1.13.1"
+
+eslint-import-resolver-typescript@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.3.0.tgz#0870988098bc6c6419c87705e6b42bee89425445"
+ integrity sha512-MHSXvmj5e0SGOOBhBbt7C+fWj1bJbtSYFAD85Xeg8nvUtuooTod2HQb8bfhE9f5QyyNxEfgzqOYFCvmdDIcCuw==
+ dependencies:
+ debug "^4.1.1"
+ glob "^7.1.6"
+ is-glob "^4.0.1"
+ resolve "^1.17.0"
+ tsconfig-paths "^3.9.0"
+
+eslint-loader@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.2.tgz#386a1e21bcb613b3cf2d252a3b708023ccfb41ec"
+ integrity sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ fs-extra "^8.1.0"
+ loader-utils "^2.0.0"
+ object-hash "^2.0.3"
+ schema-utils "^2.6.5"
+
+eslint-module-utils@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
+ integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+ dependencies:
+ debug "^2.6.9"
+ pkg-dir "^2.0.0"
+
+eslint-plugin-import@^2.22.1:
+ version "2.22.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
+ integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
+ dependencies:
+ array-includes "^3.1.1"
+ array.prototype.flat "^1.2.3"
+ contains-path "^0.1.0"
+ debug "^2.6.9"
+ doctrine "1.5.0"
+ eslint-import-resolver-node "^0.3.4"
+ eslint-module-utils "^2.6.0"
+ has "^1.0.3"
+ minimatch "^3.0.4"
+ object.values "^1.1.1"
+ read-pkg-up "^2.0.0"
+ resolve "^1.17.0"
+ tsconfig-paths "^3.9.0"
+
+eslint-plugin-react-hooks@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556"
+ integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==
+
+eslint-plugin-react@^7.21.5:
+ version "7.21.5"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3"
+ integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==
+ dependencies:
+ array-includes "^3.1.1"
+ array.prototype.flatmap "^1.2.3"
+ doctrine "^2.1.0"
+ has "^1.0.3"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
+ object.entries "^1.1.2"
+ object.fromentries "^2.0.2"
+ object.values "^1.1.1"
+ prop-types "^15.7.2"
+ resolve "^1.18.1"
+ string.prototype.matchall "^4.0.2"
+
+eslint-scope@^5.0.0, eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-utils@^2.0.0, eslint-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+ integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
+eslint@^7.11.0:
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b"
+ integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@eslint/eslintrc" "^0.1.3"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.0.1"
+ doctrine "^3.0.0"
+ enquirer "^2.3.5"
+ eslint-scope "^5.1.1"
+ eslint-utils "^2.1.0"
+ eslint-visitor-keys "^2.0.0"
+ espree "^7.3.0"
+ esquery "^1.2.0"
+ 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"
+ is-glob "^4.0.0"
+ js-yaml "^3.13.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash "^4.17.19"
+ minimatch "^3.0.4"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ progress "^2.0.0"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
+ table "^5.2.3"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348"
+ integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==
+ dependencies:
+ acorn "^7.4.0"
+ acorn-jsx "^5.2.0"
+ eslint-visitor-keys "^1.3.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eventemitter3@^4.0.0:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+events@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
+ integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
+
+eventsource@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
+ integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
+ dependencies:
+ original "^1.0.0"
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ 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@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+ 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"
+ signal-exit "^3.0.2"
+ strip-final-newline "^2.0.0"
+
+execall@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
+ integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==
+ dependencies:
+ clone-regexp "^2.1.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/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.17.1:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ 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.yarnpkg.com/extend-shallow/-/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.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.0, extend@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ 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"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.1.1, fast-glob@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
+ integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+ integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+ dependencies:
+ reusify "^1.0.4"
+
+faye-websocket@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.1:
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
+ integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+file-entry-cache@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+ integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+ dependencies:
+ flat-cache "^2.0.1"
+
+file-loader@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa"
+ integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/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.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ 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@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-versions@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
+ integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+ dependencies:
+ semver-regex "^2.0.0"
+
+flat-cache@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+ integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+ dependencies:
+ flatted "^2.0.0"
+ rimraf "2.6.3"
+ write "1.0.3"
+
+flatted@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+ integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+
+flatten@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
+ integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
+
+follow-redirects@^1.0.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
+ integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+formik@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.0.tgz#04c067f6b832aa15cae055f6df6f4aa485b5be35"
+ integrity sha512-l47RfvejhfHNh8rTRVaCaPfx8nyeYDSTLaEqRvLX4qkWnrrq9ByGVCWggVR+0TVtzc5Ub1gLUuVu9UKuGwfhjA==
+ dependencies:
+ deepmerge "^2.1.1"
+ hoist-non-react-statics "^3.3.0"
+ lodash "^4.17.14"
+ lodash-es "^4.17.14"
+ react-fast-compare "^2.0.1"
+ scheduler "^0.18.0"
+ tiny-warning "^1.0.2"
+ tslib "^1.10.0"
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/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.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
+ integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^1.0.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+generic-names@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872"
+ integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==
+ dependencies:
+ loader-utils "^1.1.0"
+
+gensync@^1.0.0-beta.1:
+ version "1.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+ integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be"
+ integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stdin@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-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.0, glob-parent@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ 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"
+
+global-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^12.1.0:
+ version "12.4.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
+ integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+ dependencies:
+ type-fest "^0.8.1"
+
+globby@^11.0.1:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+ integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
+globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/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"
+
+globjoin@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
+ integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=
+
+gonzales-pe@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+ integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
+ dependencies:
+ minimist "^1.2.5"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+handle-thing@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
+ integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
+
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/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.yarnpkg.com/has-value/-/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.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/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.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+history@^4.9.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
+ integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+ loose-envify "^1.2.0"
+ resolve-pathname "^3.0.0"
+ tiny-invariant "^1.0.2"
+ tiny-warning "^1.0.0"
+ value-equal "^1.0.1"
+
+hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+hosted-git-info@^2.1.4:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+ integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/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.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+html-entities@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44"
+ integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==
+
+html-minifier-terser@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054"
+ integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==
+ dependencies:
+ camel-case "^4.1.1"
+ clean-css "^4.2.3"
+ commander "^4.1.1"
+ he "^1.2.0"
+ param-case "^3.0.3"
+ relateurl "^0.2.7"
+ terser "^4.6.3"
+
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
+html-webpack-plugin@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c"
+ integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==
+ dependencies:
+ "@types/html-minifier-terser" "^5.0.0"
+ "@types/tapable" "^1.0.5"
+ "@types/webpack" "^4.41.8"
+ html-minifier-terser "^5.0.1"
+ loader-utils "^1.2.3"
+ lodash "^4.17.15"
+ pretty-error "^2.1.1"
+ tapable "^1.1.3"
+ util.promisify "1.0.0"
+
+htmlparser2@^3.10.0, htmlparser2@^3.10.1, htmlparser2@^3.3.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+ integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ 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.yarnpkg.com/http-errors/-/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.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ 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.2"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77"
+ integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==
+
+http-proxy-middleware@0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
+ integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
+ dependencies:
+ http-proxy "^1.17.0"
+ is-glob "^4.0.0"
+ lodash "^4.17.11"
+ micromatch "^3.1.10"
+
+http-proxy-middleware@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.0.6.tgz#0618557722f450375d3796d701a8ac5407b3b94e"
+ integrity sha512-NyL6ZB6cVni7pl+/IT2W0ni5ME00xR0sN27AQZZrpKn1b+qRh+mLbBxIq9Cq1oGfmTc7BUq4HB77mxwCaxAYNg==
+ dependencies:
+ "@types/http-proxy" "^1.17.4"
+ http-proxy "^1.18.1"
+ is-glob "^4.0.1"
+ lodash "^4.17.20"
+ micromatch "^4.0.2"
+
+http-proxy@^1.17.0, http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+husky@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de"
+ integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==
+ dependencies:
+ chalk "^4.0.0"
+ ci-info "^2.0.0"
+ compare-versions "^3.6.0"
+ cosmiconfig "^7.0.0"
+ find-versions "^3.2.0"
+ opencollective-postinstall "^2.0.2"
+ pkg-dir "^4.2.0"
+ please-upgrade-node "^3.2.0"
+ slash "^3.0.0"
+ which-pm-runs "^1.0.0"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+ integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+ integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+ dependencies:
+ postcss "^7.0.14"
+
+icss-utils@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84"
+ integrity sha512-aF2Cf/CkEZrI/vsu5WI/I+akFgdbwQHVE9YRZxATrhH4PVIe6a3BIjwjEcW+z+jP/hNh+YvM3lAAn1wJQ6opSg==
+
+ignore@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.4, ignore@^5.1.8:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+image-size@~0.5.0:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+ integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/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, import-fresh@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+ integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-lazy@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
+ integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
+
+import-local@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+ integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+ dependencies:
+ pkg-dir "^3.0.0"
+ resolve-cwd "^2.0.0"
+
+import-local@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
+ integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+infer-owner@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/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.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+
+insert-css@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4"
+ integrity sha1-610Ql7dUL0x56jBg067gfQU4gPQ=
+
+internal-ip@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
+ integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
+ dependencies:
+ default-gateway "^4.2.0"
+ ipaddr.js "^1.9.0"
+
+internal-slot@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3"
+ integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==
+ dependencies:
+ es-abstract "^1.17.0-next.1"
+ has "^1.0.3"
+ side-channel "^1.0.2"
+
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
+ip-regex@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/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.yarnpkg.com/ip/-/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.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-absolute-url@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+ integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-absolute@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+ integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
+ dependencies:
+ is-relative "^1.0.0"
+ is-windows "^1.0.1"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/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.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumeric@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
+ integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
+ integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
+
+is-callable@^1.1.4, is-callable@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
+ integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/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.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d"
+ integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==
+ dependencies:
+ has "^1.0.3"
+
+is-core-module@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/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.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ 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.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ 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.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/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.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/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:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-negated-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+ integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
+
+is-negative-zero@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
+ integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/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.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-cwd@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
+ integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
+
+is-path-in-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+ integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+ dependencies:
+ is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+ integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+ dependencies:
+ path-is-inside "^1.0.2"
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
+ integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-regexp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
+ integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
+
+is-relative@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+ integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
+ dependencies:
+ is-unc-path "^1.0.0"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+ integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
+is-string@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
+ integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-unc-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+ integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
+ dependencies:
+ unc-path-regex "^0.1.2"
+
+is-whitespace-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
+ integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-word-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
+ integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/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.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+jest-worker@^26.5.0:
+ version "26.5.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30"
+ integrity sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+jest-worker@^26.6.1:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+ integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json2mq@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a"
+ integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=
+ dependencies:
+ string-convert "^0.2.0"
+
+json3@^3.3.2:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
+ integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
+ integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
+ dependencies:
+ universalify "^1.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891"
+ integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==
+ dependencies:
+ array-includes "^3.1.1"
+ object.assign "^4.1.1"
+
+killable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+ integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/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.yarnpkg.com/kind-of/-/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.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klona@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
+ integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
+
+known-css-properties@^0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b"
+ integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==
+
+last-call-webpack-plugin@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
+ integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
+ dependencies:
+ lodash "^4.17.5"
+ webpack-sources "^1.1.0"
+
+less-loader@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466"
+ integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==
+ dependencies:
+ clone "^2.1.1"
+ loader-utils "^1.1.0"
+ pify "^4.0.1"
+
+less@^3.12.2:
+ version "3.12.2"
+ resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4"
+ integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==
+ dependencies:
+ tslib "^1.10.0"
+ optionalDependencies:
+ errno "^0.1.1"
+ graceful-fs "^4.1.2"
+ image-size "~0.5.0"
+ make-dir "^2.1.0"
+ mime "^1.4.1"
+ native-request "^1.0.5"
+ source-map "~0.6.0"
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+line-column@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
+ integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=
+ dependencies:
+ isarray "^1.0.0"
+ isobject "^2.0.0"
+
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.1.0.tgz#f70bc0c29edbabdf2043e7ee73ccc3fe1c96b42d"
+ integrity sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==
+
+loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ 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.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash-es@^4.17.14:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
+ integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
+
+lodash._reinterpolate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+ integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.difference@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
+ integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=
+
+lodash.forown@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-4.4.0.tgz#85115cf04f73ef966eced52511d3893cc46683af"
+ integrity sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=
+
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
+
+lodash.groupby@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1"
+ integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+ integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
+lodash.template@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
+ integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
+ integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+log-symbols@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+loglevel@^1.6.8:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
+ integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
+
+longest-streak@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
+ integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7"
+ integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==
+ dependencies:
+ tslib "^1.10.0"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+ integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+map-obj@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
+ integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown-escapes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
+ integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+
+markdown-table@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
+ integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==
+ dependencies:
+ repeat-string "^1.0.0"
+
+mathml-tag-names@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+ integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
+
+mdast-util-compact@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490"
+ integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+mdn-data@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+ integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+mdn-data@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
+ integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memory-fs@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/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.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+ integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+meow@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306"
+ integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==
+ dependencies:
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "4.1.0"
+ normalize-package-data "^2.5.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.13.1"
+ yargs-parser "^18.1.3"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/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.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ 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.0, micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
+mime-db@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+ integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
+"mime-db@>= 1.43.0 < 2":
+ version "1.45.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
+ integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
+
+mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24:
+ version "2.1.27"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+ integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+ dependencies:
+ mime-db "1.44.0"
+
+mime@1.6.0, mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.4.4:
+ version "2.4.6"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
+ integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+mini-create-react-context@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040"
+ integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ tiny-warning "^1.0.3"
+
+mini-css-extract-plugin@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.1.1.tgz#4ab9948b7be38cf3a730cb4c9a881eb7f62baadb"
+ integrity sha512-pzlnOi/lMkwIkdb7zoRQvbkW18AFCQffouSBpxy+e3pnKTKMC5IuMVHYndexKZmacfsOZS2LXCe8gIgkrC+yqg==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+ webpack-sources "^1.1.0"
+
+mini-store@^3.0.1:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-3.0.6.tgz#44b86be5b2877271224ce0689b3a35a2dffb1ca9"
+ integrity sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==
+ dependencies:
+ hoist-non-react-statics "^3.3.2"
+ shallowequal "^1.0.2"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist-options@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
+ dependencies:
+ arrify "^1.0.1"
+ is-plain-obj "^1.1.0"
+ kind-of "^6.0.3"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+ integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+ integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+ dependencies:
+ yallist "^4.0.0"
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mobx-react-lite@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.0.1.tgz#417f54a819d1e3e00c073077f29373399c95b005"
+ integrity sha512-Ue8uGgT5iOjMyNf5ptoFW7BTvyLIwggzIkoFpwORrqf73TPqu47iLpz/DNvaba3v40kSsEpp050qYroMNuA1xw==
+
+mobx@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.0.1.tgz#ec23520848527bf7834d7b4c0b54b2a8eb6e7c14"
+ integrity sha512-Pk6uJXZ34yqd661yRmS6z/9avm4FOGXpFpVjnEfiYYOsZXnAxv1fpYjxTCEZ9tuwk0Xe1qnUUlgm+rJtGe0YJA==
+
+moment@^2.24.0, moment@^2.25.3:
+ version "2.29.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
+ integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2, ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+multicast-dns-service-types@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+ integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
+
+multicast-dns@^6.0.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+ integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
+ dependencies:
+ dns-packet "^1.3.1"
+ thunky "^1.0.2"
+
+multimatch@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
+ integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
+ dependencies:
+ "@types/minimatch" "^3.0.3"
+ array-differ "^3.0.0"
+ array-union "^2.1.0"
+ arrify "^2.0.1"
+ minimatch "^3.0.4"
+
+nan@^2.12.1:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nanoid@^3.1.12:
+ version "3.1.12"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654"
+ integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ 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"
+
+native-request@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.0.7.tgz#ff742dc555b4c8f2f1c14b548639ba174e573856"
+ integrity sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+no-case@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8"
+ integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==
+ dependencies:
+ lower-case "^2.0.1"
+ tslib "^1.10.0"
+
+node-forge@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
+ integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+
+node-releases@^1.1.61:
+ version "1.1.64"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.64.tgz#71b4ae988e9b1dd7c1ffce58dd9e561752dfebc5"
+ integrity sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ 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@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-selector@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
+ integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/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.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nth-check@^1.0.2, nth-check@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/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@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
+ integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
+
+object-inspect@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+ integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
+
+object-is@^1.0.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068"
+ integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/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.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
+ integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.0"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
+ integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+ has "^1.0.3"
+
+object.fromentries@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
+ integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
+ integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.0, object.values@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+ integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+obuf@^1.0.0, obuf@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+ integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+omit.js@^2.0.0, omit.js@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f"
+ integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/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.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+opencollective-postinstall@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
+ integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
+
+opn@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
+ integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+ dependencies:
+ is-wsl "^1.1.0"
+
+optimize-css-assets-webpack-plugin@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90"
+ integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==
+ dependencies:
+ cssnano "^4.1.10"
+ last-call-webpack-plugin "^3.0.0"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
+original@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+ integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
+ dependencies:
+ url-parse "^1.4.3"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
+ integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+ integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-retry@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
+ integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
+ dependencies:
+ retry "^0.12.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+param-case@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238"
+ integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==
+ dependencies:
+ dot-case "^3.0.3"
+ tslib "^1.10.0"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/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.yarnpkg.com/parse-json/-/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.1.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
+ integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
+ 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"
+
+parseurl@~1.3.2, parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascal-case@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f"
+ integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==
+ dependencies:
+ no-case "^3.0.3"
+ tslib "^1.10.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/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.yarnpkg.com/path-is-inside/-/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.yarnpkg.com/path-key/-/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.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-to-regexp@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
+ integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
+ dependencies:
+ isarray "0.0.1"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
+ dependencies:
+ pify "^2.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.5, picomatch@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-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.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
+ dependencies:
+ find-up "^2.1.0"
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pkg-dir@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
+ integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
+ dependencies:
+ find-up "^5.0.0"
+
+please-upgrade-node@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
+ integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==
+ dependencies:
+ semver-compare "^1.0.0"
+
+portfinder@^1.0.26:
+ version "1.0.28"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
+ integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==
+ 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.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-attribute-case-insensitive@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880"
+ integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^6.0.2"
+
+postcss-calc@^7.0.1, postcss-calc@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e"
+ integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==
+ dependencies:
+ postcss "^7.0.27"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.0.2"
+
+postcss-color-functional-notation@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0"
+ integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-gray@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
+ integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.5"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-hex-alpha@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388"
+ integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==
+ dependencies:
+ postcss "^7.0.14"
+ postcss-values-parser "^2.0.1"
+
+postcss-color-mod-function@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d"
+ integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-color-rebeccapurple@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77"
+ integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ 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.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-css-variables@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/postcss-css-variables/-/postcss-css-variables-0.17.0.tgz#56cba1d9f0360609136cfbfda8bbd2c1ed2e4082"
+ integrity sha512-/ZpFnJgksNOrQA72b3DKhExYh+0e2P5nEc3aPZ62G7JLmdDjWRFv3k/q4LxV7uzXFnmvkhXRbdVIiH5tKgfFNA==
+ dependencies:
+ balanced-match "^1.0.0"
+ escape-string-regexp "^1.0.3"
+ extend "^3.0.1"
+ postcss "^6.0.8"
+
+postcss-custom-media@^7.0.8:
+ version "7.0.8"
+ resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
+ integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-custom-properties@^8.0.11:
+ version "8.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
+ integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
+ dependencies:
+ postcss "^7.0.17"
+ postcss-values-parser "^2.0.1"
+
+postcss-custom-selectors@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba"
+ integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-dir-pseudo-class@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2"
+ integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-double-position-gradients@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
+ integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==
+ dependencies:
+ postcss "^7.0.5"
+ postcss-values-parser "^2.0.0"
+
+postcss-env-function@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7"
+ integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-focus-visible@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e"
+ integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-focus-within@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680"
+ integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-font-variant@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc"
+ integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-gap-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715"
+ integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-html@^0.36.0:
+ version "0.36.0"
+ resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204"
+ integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==
+ dependencies:
+ htmlparser2 "^3.10.0"
+
+postcss-image-set-function@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288"
+ integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-import@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-13.0.0.tgz#d6960cd9e3de5464743b04dd8cd9d870662f8b8c"
+ integrity sha512-LPUbm3ytpYopwQQjqgUH4S3EM/Gb9QsaSPP/5vnoi+oKVy3/mIk2sc0Paqw7RL57GpScm9MdIMUypw2znWiBpg==
+ dependencies:
+ postcss-value-parser "^4.0.0"
+ read-cache "^1.0.0"
+ resolve "^1.1.7"
+
+postcss-initial@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d"
+ integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==
+ dependencies:
+ lodash.template "^4.5.0"
+ postcss "^7.0.2"
+
+postcss-inline-svg@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-inline-svg/-/postcss-inline-svg-4.1.0.tgz#54e9199632242cc181af5b55f0f0691ad1020f95"
+ integrity sha512-0pYBJyoQ9/sJViYRc1cNOOTM7DYh0/rmASB0TBeRmWkG8YFK2tmgdkfjHkbRma1iFtBFKFHZFsHwRTDZTMKzSQ==
+ dependencies:
+ css-select "^2.0.2"
+ dom-serializer "^0.1.1"
+ htmlparser2 "^3.10.1"
+ postcss "^7.0.17"
+ postcss-value-parser "^4.0.0"
+
+postcss-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.1.tgz#e467efdce80ca02e072c60b42e0b35ad2f950a94"
+ integrity sha512-m1DgECmEbOK9JhGkdctaP9ZRVheJuEnkk2eb/d3K+5uN10C3S004Ng6Hat4Aha7PsLt824x0xwrT7rVwGRVLHg==
+ dependencies:
+ camelcase-css "^2.0.1"
+ postcss "^8.1.0"
+
+postcss-lab-function@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
+ integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==
+ dependencies:
+ "@csstools/convert-colors" "^1.4.0"
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-less@^3.1.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
+ integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-loader@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.0.4.tgz#b2d005b52e008a44991cf8123bee207e635eb53e"
+ integrity sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw==
+ dependencies:
+ cosmiconfig "^7.0.0"
+ klona "^2.0.4"
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+ semver "^7.3.2"
+
+postcss-logical@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
+ integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-media-minmax@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
+ integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-media-query-parser@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+ integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ 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.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ 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.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ 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.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ 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.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-mixins@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-mixins/-/postcss-mixins-7.0.1.tgz#f46a18abef1eea727b4f0b6198aada1cae20cafc"
+ integrity sha512-9VLSce+dkPYmeD7/MmPh5HTQch1HEO4avtkrT8x0t8F8TOd+gfUMkJXS82Kx1qV4c2pkMdhq4M5aEnZHYRJWiA==
+ dependencies:
+ globby "^11.0.1"
+ postcss-js "^3.0.1"
+ postcss-simple-vars "^6.0.1"
+ sugarss "^3.0.1"
+
+postcss-modules-extract-imports@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+ integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+ dependencies:
+ postcss "^7.0.5"
+
+postcss-modules-extract-imports@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
+ integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
+
+postcss-modules-local-by-default@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
+ integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
+ dependencies:
+ icss-utils "^4.1.1"
+ postcss "^7.0.32"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-local-by-default@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
+ integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
+ dependencies:
+ icss-utils "^5.0.0"
+ 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.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+ integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^6.0.0"
+
+postcss-modules-scope@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
+ integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
+ dependencies:
+ postcss-selector-parser "^6.0.4"
+
+postcss-modules-values@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+ integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+ dependencies:
+ icss-utils "^4.0.0"
+ postcss "^7.0.6"
+
+postcss-modules-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
+ integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
+ dependencies:
+ icss-utils "^5.0.0"
+
+postcss-modules@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-3.2.2.tgz#ee390de0f9f18e761e1778dfb9be26685c02c51f"
+ integrity sha512-JQ8IAqHELxC0N6tyCg2UF40pACY5oiL6UpiqqcIFRWqgDYO8B0jnxzoQ0EOpPrWXvcpu6BSbQU/3vSiq7w8Nhw==
+ dependencies:
+ generic-names "^2.0.1"
+ icss-replace-symbols "^1.1.0"
+ lodash.camelcase "^4.3.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"
+ string-hash "^1.1.1"
+
+postcss-nested@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.1.tgz#e7a77f7a806a09c8de0f2c163d8e3d09f00f3139"
+ integrity sha512-ZHNSAoHrMtbEzjq+Qs4R0gHijpXc6F1YUv4TGmGaz7rtfMvVJBbu5hMOH+CrhEaljQpEmx5N/P8i1pXTkbVAmg==
+ dependencies:
+ postcss-selector-parser "^6.0.4"
+
+postcss-nesting@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
+ integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ 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.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ 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.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ 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.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ 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.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ 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.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ 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.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ 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.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-overflow-shorthand@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30"
+ integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-page-break@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf"
+ integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-place@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62"
+ integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-values-parser "^2.0.0"
+
+postcss-preset-env@^6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5"
+ integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==
+ dependencies:
+ autoprefixer "^9.6.1"
+ browserslist "^4.6.4"
+ caniuse-lite "^1.0.30000981"
+ css-blank-pseudo "^0.1.4"
+ css-has-pseudo "^0.10.0"
+ css-prefers-color-scheme "^3.1.1"
+ cssdb "^4.4.0"
+ postcss "^7.0.17"
+ postcss-attribute-case-insensitive "^4.0.1"
+ postcss-color-functional-notation "^2.0.1"
+ postcss-color-gray "^5.0.0"
+ postcss-color-hex-alpha "^5.0.3"
+ postcss-color-mod-function "^3.0.3"
+ postcss-color-rebeccapurple "^4.0.1"
+ postcss-custom-media "^7.0.8"
+ postcss-custom-properties "^8.0.11"
+ postcss-custom-selectors "^5.1.2"
+ postcss-dir-pseudo-class "^5.0.0"
+ postcss-double-position-gradients "^1.0.0"
+ postcss-env-function "^2.0.2"
+ postcss-focus-visible "^4.0.0"
+ postcss-focus-within "^3.0.0"
+ postcss-font-variant "^4.0.0"
+ postcss-gap-properties "^2.0.0"
+ postcss-image-set-function "^3.0.1"
+ postcss-initial "^3.0.0"
+ postcss-lab-function "^2.0.1"
+ postcss-logical "^3.0.0"
+ postcss-media-minmax "^4.0.0"
+ postcss-nesting "^7.0.0"
+ postcss-overflow-shorthand "^2.0.0"
+ postcss-page-break "^2.0.0"
+ postcss-place "^4.0.1"
+ postcss-pseudo-class-any-link "^6.0.0"
+ postcss-replace-overflow-wrap "^3.0.0"
+ postcss-selector-matches "^4.0.0"
+ postcss-selector-not "^4.0.0"
+
+postcss-pseudo-class-any-link@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1"
+ integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==
+ dependencies:
+ postcss "^7.0.2"
+ postcss-selector-parser "^5.0.0-rc.3"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ 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.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-replace-overflow-wrap@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
+ integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==
+ dependencies:
+ postcss "^7.0.2"
+
+postcss-reporter@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.0.1.tgz#463780d0d8d64f356403eba901fdeae71d988f2b"
+ integrity sha512-R9AK80KIqqMb+lwGRBcRkXS7r96VCTxrZvvrfibyA/dWjqctwx7leHMCC05A9HbW8PnChwOWwrmISwp5HQu5wg==
+ dependencies:
+ colorette "^1.2.1"
+ lodash.difference "^4.5.0"
+ lodash.forown "^4.4.0"
+ lodash.get "^4.4.2"
+ lodash.groupby "^4.6.0"
+ lodash.sortby "^4.7.0"
+ log-symbols "^4.0.0"
+
+postcss-resolve-nested-selector@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
+ integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
+
+postcss-safe-parser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+ integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
+ dependencies:
+ postcss "^7.0.26"
+
+postcss-sass@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
+ integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
+ dependencies:
+ gonzales-pe "^4.3.0"
+ postcss "^7.0.21"
+
+postcss-scss@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
+ dependencies:
+ postcss "^7.0.6"
+
+postcss-selector-matches@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff"
+ integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==
+ dependencies:
+ balanced-match "^1.0.0"
+ postcss "^7.0.2"
+
+postcss-selector-not@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0"
+ integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==
+ dependencies:
+ balanced-match "^1.0.0"
+ postcss "^7.0.2"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+ integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+ dependencies:
+ dot-prop "^5.2.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
+ integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
+ dependencies:
+ cssesc "^2.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+ util-deprecate "^1.0.2"
+
+postcss-simple-vars@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-6.0.1.tgz#7733415a7b57f5cb9b5a15cdd6b0546c505e7ad6"
+ integrity sha512-P1M+APrquBXOPKtk/LlWptuPBwTCjMgxZxv1lkpjG9RdOx8ewi8USOclPCt75xG7UT7viDUB3p3qy2ffPBefjQ==
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-syntax@^0.36.2:
+ version "0.36.2"
+ resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
+ integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ 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.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
+ integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-variables@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-variables/-/postcss-variables-1.1.1.tgz#f86856acd0583b0c493767f22f7258509d37f9e0"
+ integrity sha512-a9b2ZXoy60xl28m+jedXYvbXLdYSLPXOqvgkLUHhOUbhIRlVoSHRGhGtpMLkcgVc05lu3JUBEypLVcTYNcltMw==
+ dependencies:
+ postcss "^6.0.9"
+
+postcss@^6.0.8, postcss@^6.0.9:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^8.1.0, postcss@^8.1.1, postcss@^8.1.2:
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.2.tgz#9731fcaa4f7b0bef47121821bdae9eeb609a324c"
+ integrity sha512-mToqEVFq8jF9TFhlIK4HhE34zknFJuNTgqtsr60vUvrWn+9TIYugCwiV1JZRxCuOrej2jjstun1bn4Bc7/1HkA==
+ dependencies:
+ colorette "^1.2.1"
+ line-column "^1.0.2"
+ nanoid "^3.1.12"
+ source-map "^0.6.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+pretty-error@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6"
+ integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==
+ dependencies:
+ lodash "^4.17.20"
+ renderkid "^2.0.4"
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2:
+ version "15.7.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
+ integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.8.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+ integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.9.4:
+ version "6.9.4"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
+ integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+
+raf@^3.4.0, raf@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
+ integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
+ dependencies:
+ performance-now "^2.1.0"
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@^1.2.1, range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc-align@^4.0.0:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.8.tgz#276c3f5dfadf0de4bb95392cb81568c9e947a668"
+ integrity sha512-2sRUkmB8z4UEXzaS+lDHzXMoR8HrtKH9nn2yHlHVNyUTnaucjMFbdEoCk+hO1g7cpIgW0MphG8i0EH2scSesfw==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ dom-align "^1.7.0"
+ rc-util "^5.3.0"
+ resize-observer-polyfill "^1.5.1"
+
+rc-animate@3.x, rc-animate@~3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.1.1.tgz#defdd863f56816c222534e4dc68feddecd081386"
+ integrity sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg==
+ dependencies:
+ "@ant-design/css-animation" "^1.7.2"
+ classnames "^2.2.6"
+ raf "^3.4.0"
+ rc-util "^4.15.3"
+
+rc-cascader@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.4.0.tgz#d731ea8e07433558627941036091a2820e895474"
+ integrity sha512-6kgQljDQEKjVAVRkZtvvoi+2qv4u42M6oLuvt4ZDBa16r3X9ZN8TAq3atVyC840ivbGKlHT50OcdVx/iwiHc1w==
+ dependencies:
+ array-tree-filter "^2.1.0"
+ rc-trigger "^5.0.4"
+ rc-util "^5.0.1"
+ warning "^4.0.1"
+
+rc-checkbox@~2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.1.tgz#2a61bc43017c783bd2e9f1a67553bf8efe7aa4d3"
+ integrity sha512-i290/iTqmZ0WtI2UPIryqT9rW6O99+an4KeZIyZDH3r+Jbb6YdddaWNdzq7g5m9zaNhJvgjf//wJtC4fvve2Tg==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+
+rc-collapse@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-2.0.1.tgz#99e7655acd9c237b72369a39dcb5c713451e1e92"
+ integrity sha512-sRNqwQovzQoptTh7dCwj3kfxrdor2oNXrGSBz+QJxSFS7N3Ujgf8X/KlN2ElCkwBKf7nNv36t9dwH0HEku4wJg==
+ dependencies:
+ "@ant-design/css-animation" "^1.7.2"
+ classnames "2.x"
+ rc-animate "3.x"
+ rc-util "^5.2.1"
+ shallowequal "^1.1.0"
+
+rc-dialog@~8.4.0:
+ version "8.4.3"
+ resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.4.3.tgz#de8650ce7d1fcb6c1f7e065b94a6894b9a5a54a4"
+ integrity sha512-LHsWXb+2Cy4vEOeJcPvk9M0WSr80Gi438ov5rXt3E6XB4j+53Z+vMFRr+TagnVuOVQRCLmmzT4qutfm2U1OK6w==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.6"
+ rc-motion "^2.3.0"
+ rc-util "^5.0.1"
+
+rc-drawer@~4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.1.0.tgz#d7bf0bc030300b62d282bc04e053b9acad6b08b4"
+ integrity sha512-kjeQFngPjdzAFahNIV0EvEBoIKMOnvUsAxpkSPELoD/1DuR4nLafom5ryma+TIxGwkFJ92W6yjsMi1U9aiOTeQ==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.6"
+ rc-util "^5.0.1"
+
+rc-dropdown@^3.1.3, rc-dropdown@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.2.0.tgz#da6c2ada403842baee3a9e909a0b1a91ba3e1090"
+ integrity sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.6"
+ rc-trigger "^5.0.4"
+
+rc-field-form@~1.12.0:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.12.1.tgz#e7f5dc5cc5a267420fd50e1e3ae3352e650c1425"
+ integrity sha512-c09NVEoGFtwqpTJH4Tw1D8UUitKrrTCW2UAFcJ57FHTg5zReozzgjrrv3UiKDVjbbFzikDLdYz3CzdWMlqVHXg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+ async-validator "^3.0.3"
+ rc-util "^5.0.0"
+
+rc-image@~3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-3.2.2.tgz#5d2b7d474dd01ea7af2cbc84fe6af3de8905b3fe"
+ integrity sha512-8D1pj4qTdC93IfeTPstGFBwpDRZPC565emm4VevrtyFoD9QHBF6kp9kOtzk0JAmbybLAQuX4GGNcwoc7tbZ9Zw==
+ dependencies:
+ "@ant-design/icons" "^4.2.2"
+ "@babel/runtime" "^7.11.2"
+ classnames "^2.2.6"
+ rc-dialog "~8.4.0"
+ rc-util "^5.0.6"
+
+rc-input-number@~6.1.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-6.1.1.tgz#818c426942d1b4dc4d6d2639d741ca67773a9118"
+ integrity sha512-9t2xf1G0YEism7FAXAvF1huBk7ZNABPBf6NL+3/aDL123WiT/vhhod4cldiDWTM1Yb2EDKR//ZIa546ScdsUaA==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.5"
+ rc-util "^5.0.1"
+
+rc-mentions@~1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.5.2.tgz#94559a369de73e7cc92f343badaf94499fb410a7"
+ integrity sha512-GqV0tOtHY3pLpOsFCxJ2i6Ad8AVfxFmz0NlD/8rb8IG8pMpthJKcdfnXlNZRx3Fa9O4YEgJpdSY1WEbmlx2DWQ==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.6"
+ rc-menu "^8.0.1"
+ rc-textarea "^0.3.0"
+ rc-trigger "^5.0.4"
+ rc-util "^5.0.1"
+
+rc-menu@^8.0.1, rc-menu@^8.6.1, rc-menu@~8.8.2:
+ version "8.8.3"
+ resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.8.3.tgz#feb8ba0371dd342fbf1052d4fcca7b669b0bf66a"
+ integrity sha512-C9sT0SBXmUbVWRUseXASousacRVPnOm5aXdyJR569WIvZwbs2IncpGNmAcft1R5ZuFE3Y+SZZ5FYvtGtbCzkIQ==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ mini-store "^3.0.1"
+ omit.js "^2.0.0"
+ rc-motion "^2.0.1"
+ rc-trigger "^5.0.4"
+ rc-util "^5.0.1"
+ resize-observer-polyfill "^1.5.0"
+ shallowequal "^1.1.0"
+
+rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.3.3.tgz#308fe27f2d2b4d6e951297740294fff32d13c15b"
+ integrity sha512-eOpPDFz6Y+gX1Nd3/AZOhS+Cqv9CiyJ+hrfAinfemJv+fiiVLv/NkFYe2fqw0onNeGiTKJaDF5Ah4Hm006K5yw==
+ dependencies:
+ "@babel/runtime" "^7.11.1"
+ classnames "^2.2.1"
+ rc-util "^5.2.1"
+
+rc-notification@~4.5.2:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.5.2.tgz#7836fc04068e00a764fca944074101faa144d503"
+ integrity sha512-rIgQip4BzUbHpDXDdNc2EFgIh1gxI97UjUbhU8hzdsjytBVstIEHXH36EgHTGllMkOhL9PkQOByg+mgV+I60ZQ==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ rc-motion "^2.2.0"
+ rc-util "^5.0.1"
+
+rc-pagination@~3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.1.tgz#6a3b28f871181b7fad298a15a91f1de6f6e6304a"
+ integrity sha512-8chFRHXRXRhdPO2Tlmm4hnA/1FnO2hYSoop6FaukQ9/IaCugsVVcXo7OqZ03YJY+aWQLtS6tDsb+sAapCCmljw==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+
+rc-picker@~2.3.0:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.3.3.tgz#c58c4270891f92aad02d0404d1699285f9321fd9"
+ integrity sha512-ah4ucCnAs8ss7GgV7sF7MGgRlyfP4753z+OjnF4X7cIrntygklQqiFDBZYS02RX773vhJ+jc6AbyoR7hI4aGng==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+ date-fns "^2.15.0"
+ dayjs "^1.8.30"
+ moment "^2.24.0"
+ rc-trigger "^5.0.4"
+ rc-util "^5.4.0"
+ shallowequal "^1.1.0"
+
+rc-progress@~3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.1.1.tgz#f7ba5eb33cc438862513ab5a71739feaf6b3ef4f"
+ integrity sha512-1ns3pW7ll9bHfdXtlVLF+vngdvlxiCDtiqwXnZFEdurst11JTiPxVdeqnCNbhWx5hP4kCKkAPqG1N0FVfTSUGA==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.6"
+
+rc-rate@~2.8.2:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.8.2.tgz#d82d237d74fd4aef3e0581d2700b646cdd1cd8a2"
+ integrity sha512-f9T/D+ZwWQrWHkpidpQbnXpnVMGMC4eSRAkwuu88a8Qv1C/9LNc4AErazoh8tpnZBFqq19F3j0Glv+sDgkfEig==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.5"
+ rc-util "^5.0.1"
+
+rc-resize-observer@^0.2.0, rc-resize-observer@^0.2.1, rc-resize-observer@^0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.6.tgz#c1b642f6d1293e34c4e3715f47f69443a167b825"
+ integrity sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+ rc-util "^5.0.0"
+ resize-observer-polyfill "^1.5.1"
+
+rc-select@^11.1.1, rc-select@~11.4.0:
+ version "11.4.2"
+ resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.4.2.tgz#5b431ee7b2cc6e439886ca855774fc116e6fe6fb"
+ integrity sha512-DQHYwMcvAajnnlahKkYIW47AVTXgxpGj9CWbe+juXgvxawQRFUdd8T8L2Q05aOkMy02UTG0Qrs7EZfHmn5QHbA==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ rc-motion "^2.0.1"
+ rc-trigger "^5.0.4"
+ rc-util "^5.0.1"
+ rc-virtual-list "^3.2.0"
+ warning "^4.0.3"
+
+rc-slider@~9.5.2:
+ version "9.5.4"
+ resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.5.4.tgz#4bbb1c7810037adad030c82a1e47e1b331405449"
+ integrity sha512-24goJnWhmWi0ojNZMoPSMni2wh73IPqEK0TJh7rWn10hPLLKgG8x3KRR0g4uUdCS9APHyosqxGXUIJKGydJXVg==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.5"
+ rc-tooltip "^5.0.1"
+ rc-util "^5.0.0"
+ shallowequal "^1.1.0"
+
+rc-steps@~4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.3.tgz#208580e22db619e3830ddb7fa41bc886c65d9803"
+ integrity sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==
+ dependencies:
+ "@babel/runtime" "^7.10.2"
+ classnames "^2.2.3"
+ rc-util "^5.0.1"
+
+rc-switch@~3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8"
+ integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+ rc-util "^5.0.1"
+
+rc-table@~7.10.0:
+ version "7.10.3"
+ resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.10.3.tgz#f667e3d7d8a00c490beb83086ed9f3a04df6850f"
+ integrity sha512-iX96RaERJiTsmO8wljxjCHhsPMTge/0BB1dHS4I+5xegr+bud8a2KV4mX3rYcrnVjYueTqmtXH2K6EQYNhpOGw==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.5"
+ rc-resize-observer "^0.2.0"
+ rc-util "^5.4.0"
+ shallowequal "^1.1.0"
+
+rc-tabs@~11.7.0:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.7.0.tgz#e03a03fbf5b8d04a1c9f12f24a621b1d7ff6a093"
+ integrity sha512-nYwQcgML2drM0iau4aa6HI4qyyZSW0WpspCAtO5KGjXwHzUJcvv3qgLVuoQOWQaDDHXkI9Jj8U7Y/Hcrdyj1Kw==
+ dependencies:
+ "@babel/runtime" "^7.11.2"
+ classnames "2.x"
+ raf "^3.4.1"
+ rc-dropdown "^3.1.3"
+ rc-menu "^8.6.1"
+ rc-resize-observer "^0.2.1"
+ rc-util "^5.0.0"
+
+rc-textarea@^0.3.0, rc-textarea@~0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.1.tgz#e81e1ef6f0e29729f9f80bb266cf6769dd7ab69a"
+ integrity sha512-bO5Ol5uD6A++aWI6BJ0Pa/8OZcGeacP9LxIGkUqkCwPyOG3kaLOsWb8ya4xCfrsC2P4vDTsHsJmmmG5wuXGFRg==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.1"
+ omit.js "^2.0.0"
+ rc-resize-observer "^0.2.3"
+
+rc-tooltip@^5.0.1, rc-tooltip@~5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.0.1.tgz#b82c4259604d2cb62ca610ed7932dd37fc6ef61d"
+ integrity sha512-3AnxhUS0j74xAV3khrKw8o6rg+Ima3nw09DJBezMPnX3ImQUAnayWsPSlN1mEnihjA43rcFkGM1emiKE+CXyMQ==
+ dependencies:
+ "@babel/runtime" "^7.11.2"
+ rc-trigger "^5.0.0"
+
+rc-tree-select@~4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.1.2.tgz#bf012c3c32cf2e82fc7ffbdd60cb596163a290a0"
+ integrity sha512-2tRwZ4ChY+BarVKHoPR65kSZtopgwKCig6ngJiiTVgYfRdAhfdQp2j2+L8YW9TkosYGmwgTOhmlphlG3QNy7Pg==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ rc-select "^11.1.1"
+ rc-tree "^3.8.0"
+ rc-util "^5.0.5"
+
+rc-tree@^3.8.0, rc-tree@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.10.0.tgz#897498b3756f6c84f41ad2b244ee9489abf43b7f"
+ integrity sha512-kf7J/f2E2T8Kfta3/1BIg65AzTmXOgOjn0KOpvD3KI/gqkfKMRKUS1ybkxW39JUPpKwdeOHFnYH+nFFMq7tkfg==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "2.x"
+ rc-motion "^2.0.1"
+ rc-util "^5.0.0"
+ rc-virtual-list "^3.0.1"
+
+rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@~5.0.3:
+ version "5.0.7"
+ resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.0.7.tgz#c2f6e988756c76f84b63ff1071e02affc56495ec"
+ integrity sha512-4QzwHL0IaXmSZnMfJV45dR3Cy4XgsQy2m0LySBAFiZYaH5EN3qnq2lOtg5aU4T36g4146fHpfGa7mtJpCgkwhg==
+ dependencies:
+ "@babel/runtime" "^7.11.2"
+ classnames "^2.2.6"
+ rc-align "^4.0.0"
+ rc-motion "^2.0.0"
+ rc-util "^5.3.4"
+
+rc-upload@~3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.3.1.tgz#ad8658b2a796031930b35d2b07ab312b7cd4c9ed"
+ integrity sha512-KWkJbVM9BwU8qi/2jZwmZpAcdRzDkuyfn/yAOLu+nm47dyd6//MtxzQD3XZDFkC6jQ6D5FmlKn6DhmOfV3v43w==
+ dependencies:
+ "@babel/runtime" "^7.10.1"
+ classnames "^2.2.5"
+ rc-util "^5.2.0"
+
+rc-util@^4.15.3:
+ version "4.21.1"
+ resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.21.1.tgz#88602d0c3185020aa1053d9a1e70eac161becb05"
+ integrity sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==
+ dependencies:
+ add-dom-event-listener "^1.1.0"
+ prop-types "^15.5.10"
+ react-is "^16.12.0"
+ react-lifecycles-compat "^3.0.4"
+ shallowequal "^1.1.0"
+
+rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.1.0, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.3.4, rc-util@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.4.0.tgz#688eaeecfdae9dae2bfdf10bedbe884591dba004"
+ integrity sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==
+ dependencies:
+ react-is "^16.12.0"
+ shallowequal "^1.1.0"
+
+rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.2.0.tgz#21e70f42b22f510d38ceb1ba339b89b865686fcd"
+ integrity sha512-NZb+Z4tGkfrCNXprVUlLJxoRVIELwLmlY5nHwiV3pj4eA9Of8thpQwtT+AomwcZjKhC7R/EDtpk2ATMJXX5s3Q==
+ dependencies:
+ classnames "^2.2.6"
+ rc-resize-observer "^0.2.3"
+ rc-util "^5.0.7"
+
+react-dom@^17.0.0:
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.0.tgz#f8266e4d9861584553ccbd186d596a1c7dd8dcb4"
+ integrity sha512-OGnFbxCjI2TMAZYMVxi4hqheJiN8rCEVVrL7XIGzCB6beNc4Am8M47HtkvxODZw9QgjmAPKpLba9FTu4fC1byA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ scheduler "^0.20.0"
+
+react-fast-compare@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
+ integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
+
+react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-lifecycles-compat@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
+ integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
+
+react-router-dom@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662"
+ integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+ history "^4.9.0"
+ loose-envify "^1.3.1"
+ prop-types "^15.6.2"
+ react-router "5.2.0"
+ tiny-invariant "^1.0.2"
+ tiny-warning "^1.0.0"
+
+react-router@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293"
+ integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+ history "^4.9.0"
+ hoist-non-react-statics "^3.1.0"
+ loose-envify "^1.3.1"
+ mini-create-react-context "^0.4.0"
+ path-to-regexp "^1.7.0"
+ prop-types "^15.6.2"
+ react-is "^16.6.0"
+ tiny-invariant "^1.0.2"
+ tiny-warning "^1.0.0"
+
+react@^17.0.0:
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-17.0.0.tgz#ad96d5fa1a33bb9b06d0cc52672f7992d84aa662"
+ integrity sha512-rG9bqS3LMuetoSUKHN8G3fMNuQOePKDThK6+2yXFWtoeTDLVNh/QCaxT+Jr+rNf4lwNXpx+atdn3Aa0oi8/6eQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+read-cache@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
+ integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=
+ dependencies:
+ pify "^2.3.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ 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@^2.0.1, readable-stream@^2.0.2:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ 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.1.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ 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.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+rechoir@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca"
+ integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==
+ dependencies:
+ resolve "^1.9.0"
+
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
+reduce-flatten@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27"
+ integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==
+
+redux@^4.0.0:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
+ integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
+ dependencies:
+ loose-envify "^1.4.0"
+ symbol-observable "^1.2.0"
+
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
+ integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+regexpp@^3.0.0, regexpp@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
+ integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+
+relateurl@^0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remark-parse@^8.0.0:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
+ integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
+ dependencies:
+ ccount "^1.0.0"
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^2.0.0"
+ vfile-location "^3.0.0"
+ xtend "^4.0.1"
+
+remark-stringify@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5"
+ integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==
+ dependencies:
+ ccount "^1.0.0"
+ is-alphanumeric "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ longest-streak "^2.0.1"
+ markdown-escapes "^1.0.0"
+ markdown-table "^2.0.0"
+ mdast-util-compact "^2.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ stringify-entities "^3.0.0"
+ unherit "^1.0.4"
+ xtend "^4.0.1"
+
+remark@^12.0.0:
+ version "12.0.1"
+ resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f"
+ integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==
+ dependencies:
+ remark-parse "^8.0.0"
+ remark-stringify "^8.0.0"
+ unified "^9.0.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+renderkid@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c"
+ integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==
+ dependencies:
+ css-select "^1.1.0"
+ dom-converter "^0.2"
+ htmlparser2 "^3.3.0"
+ lodash "^4.17.20"
+ strip-ansi "^3.0.0"
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+replace-ext@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+ integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+
+resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+ integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-pathname@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
+ integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130"
+ integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==
+ dependencies:
+ is-core-module "^2.0.0"
+ path-parse "^1.0.6"
+
+resolve@^1.9.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
+ dependencies:
+ is-core-module "^2.1.0"
+ path-parse "^1.0.6"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@2.6.3:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+ integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+scheduler@^0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4"
+ integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+scheduler@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.0.tgz#3ff543696b169613afadb09d3fb3fe998d234dd2"
+ integrity sha512-XegIgta1bIaz2LdaL6eg1GEcE42g0BY9qFXCqlZ/+s2MuEKfigFCW6DEGBlZzeVFlwDmVusrWEyFtBo4sbkkdA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
+ integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+ dependencies:
+ "@types/json-schema" "^7.0.6"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+scroll-into-view-if-needed@^2.2.25:
+ version "2.2.26"
+ resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.26.tgz#e4917da0c820135ff65ad6f7e4b7d7af568c4f13"
+ integrity sha512-SQ6AOKfABaSchokAmmaxVnL9IArxEnLEX9j4wAZw+x4iUTb40q7irtHG3z4GtAWz5veVZcCnubXDBRyLVQaohw==
+ dependencies:
+ compute-scroll-into-view "^1.0.16"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+ integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
+
+selfsigned@^1.10.7:
+ version "1.10.8"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30"
+ integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==
+ dependencies:
+ node-forge "^0.10.0"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+
+semver-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
+ integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.2.1, semver@^7.3.2:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ 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@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-index@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/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.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/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.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shallowequal@^1.0.2, shallowequal@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+ integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/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.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3"
+ integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==
+ dependencies:
+ es-abstract "^1.18.0-next.0"
+ object-inspect "^1.8.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+ integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+ dependencies:
+ ansi-styles "^3.2.0"
+ astral-regex "^1.0.0"
+ is-fullwidth-code-point "^2.0.0"
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ 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.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ 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.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
+ integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==
+ dependencies:
+ debug "^3.2.5"
+ eventsource "^1.0.7"
+ faye-websocket "~0.11.1"
+ inherits "^2.0.3"
+ json3 "^3.3.2"
+ url-parse "^1.4.3"
+
+sockjs@0.3.20:
+ version "0.3.20"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855"
+ integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==
+ dependencies:
+ faye-websocket "^0.10.0"
+ uuid "^3.4.0"
+ websocket-driver "0.6.5"
+
+source-list-map@^2.0.0, source-list-map@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ 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.17, source-map-support@~0.5.12, source-map-support@~0.5.19:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@^0.5.0, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/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.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3, source-map@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ 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.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce"
+ integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==
+
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+ 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.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
+ integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
+ 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"
+
+specificity@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
+ integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+ssri@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808"
+ integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==
+ dependencies:
+ minipass "^3.1.1"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+state-toggle@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
+ integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/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.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+string-convert@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
+ integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=
+
+string-hash@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
+ integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.matchall@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
+ integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0"
+ has-symbols "^1.0.1"
+ internal-slot "^1.0.2"
+ regexp.prototype.flags "^1.3.0"
+ side-channel "^1.0.2"
+
+string.prototype.trimend@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46"
+ integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+
+string.prototype.trimstart@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7"
+ integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-entities@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903"
+ integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==
+ dependencies:
+ character-entities-html4 "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ xtend "^4.0.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+style-loader@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c"
+ integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+style-search@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
+ integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+stylelint-webpack-plugin@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/stylelint-webpack-plugin/-/stylelint-webpack-plugin-2.1.1.tgz#1c8ae72a4e5818f7e5925e3fff10502ad34a52a5"
+ integrity sha512-WHdaWCp4NANcTcltuRjZCjM7jVhdaSg7ag/sQLE22Bf84g5nQC4nBBK8FBdHAssJsho0fDRiwyrzGsIPO+b94A==
+ dependencies:
+ arrify "^2.0.1"
+ micromatch "^4.0.2"
+ schema-utils "^3.0.0"
+
+stylelint@^13.7.2:
+ version "13.7.2"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486"
+ integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==
+ dependencies:
+ "@stylelint/postcss-css-in-js" "^0.37.2"
+ "@stylelint/postcss-markdown" "^0.36.1"
+ autoprefixer "^9.8.6"
+ balanced-match "^1.0.0"
+ chalk "^4.1.0"
+ cosmiconfig "^7.0.0"
+ debug "^4.1.1"
+ execall "^2.0.0"
+ fast-glob "^3.2.4"
+ fastest-levenshtein "^1.0.12"
+ file-entry-cache "^5.0.1"
+ get-stdin "^8.0.0"
+ global-modules "^2.0.0"
+ globby "^11.0.1"
+ globjoin "^0.1.4"
+ html-tags "^3.1.0"
+ ignore "^5.1.8"
+ import-lazy "^4.0.0"
+ imurmurhash "^0.1.4"
+ known-css-properties "^0.19.0"
+ lodash "^4.17.20"
+ log-symbols "^4.0.0"
+ mathml-tag-names "^2.1.3"
+ meow "^7.1.1"
+ micromatch "^4.0.2"
+ normalize-selector "^0.2.0"
+ postcss "^7.0.32"
+ postcss-html "^0.36.0"
+ postcss-less "^3.1.4"
+ postcss-media-query-parser "^0.2.3"
+ postcss-resolve-nested-selector "^0.1.1"
+ postcss-safe-parser "^4.0.2"
+ postcss-sass "^0.4.4"
+ postcss-scss "^2.1.1"
+ postcss-selector-parser "^6.0.2"
+ postcss-syntax "^0.36.2"
+ postcss-value-parser "^4.1.0"
+ resolve-from "^5.0.0"
+ slash "^3.0.0"
+ specificity "^0.4.1"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ style-search "^0.1.0"
+ sugarss "^2.0.0"
+ svg-tags "^1.0.0"
+ table "^6.0.1"
+ v8-compile-cache "^2.1.1"
+ write-file-atomic "^3.0.3"
+
+sugarss@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d"
+ integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==
+ dependencies:
+ postcss "^7.0.2"
+
+sugarss@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-3.0.1.tgz#1e4e315b3b321eec477ef9617c8964bcf3833b0c"
+ integrity sha512-xW0tTjuJdd3VSsPH2dLgNDzESka1+Ul3GYVziyhX7GyXQboOARDaeEU++IjhOZPnoKoMENsU0tvtrCKr1sJwlw==
+ dependencies:
+ postcss "^8.1.0"
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
+
+svgo@^1.0.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+ integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+ 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"
+
+symbol-observable@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+ integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
+
+table-layout@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.1.tgz#8411181ee951278ad0638aea2f779a9ce42894f9"
+ integrity sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==
+ dependencies:
+ array-back "^4.0.1"
+ deep-extend "~0.6.0"
+ typical "^5.2.0"
+ wordwrapjs "^4.0.0"
+
+table@^5.2.3:
+ version "5.4.6"
+ resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+ integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+ dependencies:
+ ajv "^6.10.2"
+ lodash "^4.17.14"
+ slice-ansi "^2.1.0"
+ string-width "^3.0.0"
+
+table@^6.0.1:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123"
+ integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==
+ dependencies:
+ ajv "^6.12.4"
+ lodash "^4.17.20"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.0"
+
+tapable@^1.0.0, tapable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tapable@^2.0.0, tapable@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
+ integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
+
+tar@^6.0.2:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
+ integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^3.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+terser-webpack-plugin@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.0.tgz#88f58d27d1c8244965c59540d3ccda1598fc958c"
+ integrity sha512-rf7l5a9xamIVX3enQeTl0MY2MNeZClo5yPX/tVPy22oY0nzu0b45h7JqyFi/bygqKWtzXMnml0u12mArhQPsBQ==
+ dependencies:
+ jest-worker "^26.5.0"
+ p-limit "^3.0.2"
+ schema-utils "^3.0.0"
+ serialize-javascript "^5.0.1"
+ source-map "^0.6.1"
+ terser "^5.3.5"
+
+terser-webpack-plugin@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#ec60542db2421f45735c719d2e17dabfbb2e3e42"
+ integrity sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==
+ dependencies:
+ jest-worker "^26.6.1"
+ p-limit "^3.0.2"
+ schema-utils "^3.0.0"
+ serialize-javascript "^5.0.1"
+ source-map "^0.6.1"
+ terser "^5.3.8"
+
+terser@^4.6.3:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+terser@^5.3.5:
+ version "5.3.7"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.7.tgz#798a4ae2e7ff67050c3e99fcc4e00725827d97e2"
+ integrity sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.19"
+
+terser@^5.3.8:
+ version "5.5.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
+ integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.19"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+thunky@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-invariant@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
+ integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
+
+tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+ integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
+tinycolor2@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
+ integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-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.yarnpkg.com/to-object-path/-/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.yarnpkg.com/to-regex-range/-/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.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+trim-newlines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+ integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
+
+trim-trailing-lines@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94"
+ integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==
+
+trim@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+ integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+
+trough@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+ts-loader@^8.0.6:
+ version "8.0.6"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.6.tgz#8f47d203ef8fc95826a292a09f97a02bf1f57565"
+ integrity sha512-c8XkRbhKxFLbiIwZR7FBGWDq0MIz/QSpx3CGpj0abJxD5YVX8oDhQkJLeGbXUPRIlaX4Ajmr77fOiFVZ3gSU7g==
+ dependencies:
+ chalk "^2.3.0"
+ enhanced-resolve "^4.0.0"
+ loader-utils "^1.0.2"
+ micromatch "^4.0.0"
+ semver "^6.0.0"
+
+ts-morph@^8.1.2:
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-8.1.2.tgz#f0bee6be6fbd8c3174ac5d6c0423a035e36c2bbd"
+ integrity sha512-5w4TzmMzECrBunIku1T6/Y0Y2IJ9sHT6hAlfF59WugXnsq1dv6DSioA+s6LgUiswxjgaJgZndOKgu8BrLcYjKw==
+ dependencies:
+ "@dsherret/to-absolute-glob" "^2.0.2"
+ "@ts-morph/common" "~0.6.0"
+ code-block-writer "^10.1.0"
+
+ts-node@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3"
+ integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==
+ dependencies:
+ arg "^4.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ source-map-support "^0.5.17"
+ yn "3.1.1"
+
+tsconfig-paths@^3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+ integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.0"
+ strip-bom "^3.0.0"
+
+tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.17.1:
+ version "3.17.1"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
+ integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
+ dependencies:
+ tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typescript@^4.0.3, typescript@~4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5"
+ integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==
+
+typical@^5.0.0, typical@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066"
+ integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==
+
+unc-path-regex@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+ integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
+
+unherit@^1.0.4:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
+ integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
+ dependencies:
+ inherits "^2.0.0"
+ xtend "^4.0.0"
+
+unified@^9.0.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
+ integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
+ dependencies:
+ bail "^1.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
+ trough "^1.0.0"
+ vfile "^4.0.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ 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.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unist-util-find-all-after@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a"
+ integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==
+ dependencies:
+ unist-util-is "^4.0.0"
+
+unist-util-is@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de"
+ integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==
+
+unist-util-remove-position@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
+ integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
+ dependencies:
+ "@types/unist" "^2.0.2"
+
+unist-util-visit-parents@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
+ integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+
+unist-util-visit@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
+ integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+ unist-util-visit-parents "^3.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
+ integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/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.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+uri-js@^4.2.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
+ integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
+ integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
+ dependencies:
+ loader-utils "^2.0.0"
+ mime-types "^2.1.27"
+ schema-utils "^3.0.0"
+
+url-parse@^1.4.3:
+ version "1.4.7"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
+ integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/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.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util.promisify@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+ integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.2"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.0"
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+ integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/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.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
+ integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
+
+v8-compile-cache@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
+ integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+value-equal@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
+ integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vendors@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+ integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+vfile-location@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f"
+ integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==
+
+vfile-message@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+vfile@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01"
+ integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ replace-ext "1.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
+
+warning@^4.0.1, warning@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+ integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+ dependencies:
+ loose-envify "^1.0.0"
+
+watchpack@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.1.tgz#2f2192c542c82a3bcde76acd3411470c120426a8"
+ integrity sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+ integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webpack-cli@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.2.0.tgz#10a09030ad2bd4d8b0f78322fba6ea43ec56aaaa"
+ integrity sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==
+ dependencies:
+ "@webpack-cli/info" "^1.1.0"
+ "@webpack-cli/serve" "^1.1.0"
+ colorette "^1.2.1"
+ command-line-usage "^6.1.0"
+ commander "^6.2.0"
+ enquirer "^2.3.6"
+ execa "^4.1.0"
+ import-local "^3.0.2"
+ interpret "^2.2.0"
+ leven "^3.1.0"
+ rechoir "^0.7.0"
+ v8-compile-cache "^2.2.0"
+ webpack-merge "^4.2.2"
+
+webpack-dev-middleware@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3"
+ integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==
+ 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.0"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c"
+ integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==
+ 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.7"
+ semver "^6.3.0"
+ serve-index "^1.9.1"
+ sockjs "0.3.20"
+ sockjs-client "1.4.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.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+ integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
+ dependencies:
+ ansi-colors "^3.0.0"
+ uuid "^3.3.2"
+
+webpack-merge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
+ integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
+ dependencies:
+ lodash "^4.17.15"
+
+webpack-merge@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.2.0.tgz#31cbcc954f8f89cd4b06ca8d97a38549f7f3f0c9"
+ integrity sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==
+ dependencies:
+ clone-deep "^4.0.1"
+ wildcard "^2.0.0"
+
+webpack-sources@^1.1.0, webpack-sources@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-sources@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac"
+ integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==
+ dependencies:
+ source-list-map "^2.0.1"
+ source-map "^0.6.1"
+
+webpack@^5.10.0:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.10.0.tgz#6f77c31522a2c525152d9c344f9765d168b3df08"
+ integrity sha512-P0bHAXmIz0zsNcHNLqFmLY1ZtrT+jtBr7FqpuDtA2o7GiHC+zBsfhgK7SmJ1HG7BAEb3G9JoMdSVi7mEDvG3Zg==
+ dependencies:
+ "@types/eslint-scope" "^3.7.0"
+ "@types/estree" "^0.0.45"
+ "@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 "^8.0.4"
+ browserslist "^4.14.5"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.3.1"
+ eslint-scope "^5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.4"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^4.1.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ pkg-dir "^5.0.0"
+ schema-utils "^3.0.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.0.3"
+ watchpack "^2.0.0"
+ webpack-sources "^2.1.1"
+
+websocket-driver@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36"
+ integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=
+ dependencies:
+ websocket-extensions ">=0.1.1"
+
+websocket-driver@>=0.5.1:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
+ integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+ 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.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+ integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which-pm-runs@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+ integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
+
+which@^1.2.9, which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wildcard@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wordwrapjs@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.0.tgz#9aa9394155993476e831ba8e59fb5795ebde6800"
+ integrity sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==
+ dependencies:
+ reduce-flatten "^2.0.0"
+ typical "^5.0.0"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+write@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+ integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"
+ integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^18.1.3:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ 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"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
diff --git a/internal/home/config.go b/internal/home/config.go
index ed81c56e..92b2326c 100644
--- a/internal/home/config.go
+++ b/internal/home/config.go
@@ -39,13 +39,14 @@ type configuration struct {
// It's reset after config is parsed
fileData []byte
- BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to
- BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server
- Users []User `yaml:"users"` // Users that can access HTTP server
- ProxyURL string `yaml:"http_proxy"` // Proxy address for our HTTP client
- Language string `yaml:"language"` // two-letter ISO 639-1 language code
- RlimitNoFile uint `yaml:"rlimit_nofile"` // Maximum number of opened fd's per process (0: default)
- DebugPProf bool `yaml:"debug_pprof"` // Enable pprof HTTP server on port 6060
+ BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to
+ BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server
+ BetaBindPort int `yaml:"beta_bind_port"` // BetaBindPort is the port for new client
+ Users []User `yaml:"users"` // Users that can access HTTP server
+ ProxyURL string `yaml:"http_proxy"` // Proxy address for our HTTP client
+ Language string `yaml:"language"` // two-letter ISO 639-1 language code
+ RlimitNoFile uint `yaml:"rlimit_nofile"` // Maximum number of opened fd's per process (0: default)
+ DebugPProf bool `yaml:"debug_pprof"` // Enable pprof HTTP server on port 6060
// TTL for a web session (in hours)
// An active session is automatically refreshed once a day.
@@ -117,8 +118,9 @@ type tlsConfigSettings struct {
// initialize to default values, will be changed later when reading config or parsing command line
var config = configuration{
- BindPort: 3000,
- BindHost: "0.0.0.0",
+ BindPort: 3000,
+ BetaBindPort: 0,
+ BindHost: "0.0.0.0",
DNS: dnsConfig{
BindHost: "0.0.0.0",
Port: 53,
@@ -174,6 +176,10 @@ func initConfig() {
config.DHCP.Conf4.LeaseDuration = 86400
config.DHCP.Conf4.ICMPTimeout = 1000
config.DHCP.Conf6.LeaseDuration = 86400
+
+ if updateChannel == "none" || updateChannel == "edge" {
+ config.BetaBindPort = 3001
+ }
}
// getConfigFilename returns path to the current config file
diff --git a/internal/home/control.go b/internal/home/control.go
index 616557a8..0bdd8aab 100644
--- a/internal/home/control.go
+++ b/internal/home/control.go
@@ -219,7 +219,7 @@ func postInstall(handler func(http.ResponseWriter, *http.Request)) func(http.Res
// construct new URL to redirect to
newURL := url.URL{
Scheme: "https",
- Host: net.JoinHostPort(host, strconv.Itoa(Context.web.portHTTPS)),
+ Host: net.JoinHostPort(host, strconv.Itoa(Context.web.conf.PortHTTPS)),
Path: r.URL.Path,
RawQuery: r.URL.RawQuery,
}
diff --git a/internal/home/controlfiltering.go b/internal/home/controlfiltering.go
index 65e023b2..53ca0445 100644
--- a/internal/home/controlfiltering.go
+++ b/internal/home/controlfiltering.go
@@ -369,7 +369,7 @@ type checkHostResp struct {
// for FilteredBlockedService:
SvcName string `json:"service_name"`
- // for Rewritten:
+ // for Rewrite:
CanonName string `json:"cname"` // CNAME value
IPList []net.IP `json:"ip_addrs"` // list of IP addresses
}
diff --git a/internal/home/controlinstall.go b/internal/home/controlinstall.go
index ed3cdd38..3920af3c 100644
--- a/internal/home/controlinstall.go
+++ b/internal/home/controlinstall.go
@@ -12,6 +12,7 @@ import (
"path/filepath"
"runtime"
"strconv"
+ "strings"
"github.com/AdguardTeam/AdGuardHome/internal/util"
@@ -105,7 +106,7 @@ func (web *Web) handleInstallCheckConfig(w http.ResponseWriter, r *http.Request)
return
}
- if reqData.Web.Port != 0 && reqData.Web.Port != config.BindPort {
+ if reqData.Web.Port != 0 && reqData.Web.Port != config.BindPort && reqData.Web.Port != config.BetaBindPort {
err = util.CheckPortAvailable(reqData.Web.IP, reqData.Web.Port)
if err != nil {
respData.Web.Status = fmt.Sprintf("%v", err)
@@ -276,6 +277,7 @@ type applyConfigReq struct {
func copyInstallSettings(dst, src *configuration) {
dst.BindHost = src.BindHost
dst.BindPort = src.BindPort
+ dst.BetaBindPort = src.BetaBindPort
dst.DNS.BindHost = src.DNS.BindHost
dst.DNS.Port = src.DNS.Port
}
@@ -308,6 +310,7 @@ func (web *Web) handleInstallConfigure(w http.ResponseWriter, r *http.Request) {
net.JoinHostPort(newSettings.Web.IP, strconv.Itoa(newSettings.Web.Port)), err)
return
}
+
}
err = util.CheckPacketPortAvailable(newSettings.DNS.IP, newSettings.DNS.Port)
@@ -366,7 +369,10 @@ func (web *Web) handleInstallConfigure(w http.ResponseWriter, r *http.Request) {
// until all requests are finished, and _we_ are inside a request right now, so it will block indefinitely
if restartHTTP {
go func() {
- _ = Context.web.httpServer.Shutdown(context.TODO())
+ _ = web.httpServer.Shutdown(context.TODO())
+ }()
+ go func() {
+ _ = web.httpServerBeta.Shutdown(context.TODO())
}()
}
}
@@ -376,3 +382,196 @@ func (web *Web) registerInstallHandlers() {
Context.mux.HandleFunc("/control/install/check_config", preInstall(ensurePOST(web.handleInstallCheckConfig)))
Context.mux.HandleFunc("/control/install/configure", preInstall(ensurePOST(web.handleInstallConfigure)))
}
+
+// checkConfigReqEntBeta is a struct representing new client's config check
+// request entry. It supports multiple IP values unlike the checkConfigReqEnt.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default checkConfigReqEnt.
+type checkConfigReqEntBeta struct {
+ Port int `json:"port"`
+ IP []string `json:"ip"`
+ Autofix bool `json:"autofix"`
+}
+
+// checkConfigReqBeta is a struct representing new client's config check request
+// body. It uses checkConfigReqEntBeta instead of checkConfigReqEnt.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default checkConfigReq.
+type checkConfigReqBeta struct {
+ Web checkConfigReqEntBeta `json:"web"`
+ DNS checkConfigReqEntBeta `json:"dns"`
+ SetStaticIP bool `json:"set_static_ip"`
+}
+
+// handleInstallCheckConfigBeta is a substitution of /install/check_config
+// handler for new client.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default handleInstallCheckConfig.
+func (web *Web) handleInstallCheckConfigBeta(w http.ResponseWriter, r *http.Request) {
+ reqData := checkConfigReqBeta{}
+ err := json.NewDecoder(r.Body).Decode(&reqData)
+ if err != nil {
+ httpError(w, http.StatusBadRequest, "Failed to parse 'check_config' JSON data: %s", err)
+ return
+ }
+
+ if len(reqData.DNS.IP) == 0 || len(reqData.Web.IP) == 0 {
+ httpError(w, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
+ return
+ }
+
+ nonBetaReqData := checkConfigReq{
+ Web: checkConfigReqEnt{
+ Port: reqData.Web.Port,
+ IP: reqData.Web.IP[0],
+ Autofix: reqData.Web.Autofix,
+ },
+ DNS: checkConfigReqEnt{
+ Port: reqData.DNS.Port,
+ IP: reqData.DNS.IP[0],
+ Autofix: reqData.DNS.Autofix,
+ },
+ SetStaticIP: reqData.SetStaticIP,
+ }
+
+ nonBetaReqBody := &strings.Builder{}
+
+ err = json.NewEncoder(nonBetaReqBody).Encode(nonBetaReqData)
+ if err != nil {
+ httpError(w, http.StatusBadRequest, "Failed to encode 'check_config' JSON data: %s", err)
+ return
+ }
+ body := nonBetaReqBody.String()
+ r.Body = ioutil.NopCloser(strings.NewReader(body))
+ r.ContentLength = int64(len(body))
+
+ web.handleInstallCheckConfig(w, r)
+}
+
+// applyConfigReqEntBeta is a struct representing new client's config setting
+// request entry. It supports multiple IP values unlike the applyConfigReqEnt.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default applyConfigReqEnt.
+type applyConfigReqEntBeta struct {
+ IP []string `json:"ip"`
+ Port int `json:"port"`
+}
+
+// applyConfigReqBeta is a struct representing new client's config setting
+// request body. It uses applyConfigReqEntBeta instead of applyConfigReqEnt.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default applyConfigReq.
+type applyConfigReqBeta struct {
+ Web applyConfigReqEntBeta `json:"web"`
+ DNS applyConfigReqEntBeta `json:"dns"`
+ Username string `json:"username"`
+ Password string `json:"password"`
+}
+
+// handleInstallConfigureBeta is a substitution of /install/configure handler
+// for new client.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default handleInstallConfigure.
+func (web *Web) handleInstallConfigureBeta(w http.ResponseWriter, r *http.Request) {
+ reqData := applyConfigReqBeta{}
+ err := json.NewDecoder(r.Body).Decode(&reqData)
+ if err != nil {
+ httpError(w, http.StatusBadRequest, "Failed to parse 'check_config' JSON data: %s", err)
+ return
+ }
+
+ if len(reqData.DNS.IP) == 0 || len(reqData.Web.IP) == 0 {
+ httpError(w, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
+ return
+ }
+
+ nonBetaReqData := applyConfigReq{
+ Web: applyConfigReqEnt{
+ IP: reqData.Web.IP[0],
+ Port: reqData.Web.Port,
+ },
+ DNS: applyConfigReqEnt{
+ IP: reqData.DNS.IP[0],
+ Port: reqData.DNS.Port,
+ },
+ Username: reqData.Username,
+ Password: reqData.Password,
+ }
+
+ nonBetaReqBody := &strings.Builder{}
+
+ err = json.NewEncoder(nonBetaReqBody).Encode(nonBetaReqData)
+ if err != nil {
+ httpError(w, http.StatusBadRequest, "Failed to encode 'check_config' JSON data: %s", err)
+ return
+ }
+ body := nonBetaReqBody.String()
+ r.Body = ioutil.NopCloser(strings.NewReader(body))
+ r.ContentLength = int64(len(body))
+
+ web.handleInstallConfigure(w, r)
+}
+
+// firstRunDataBeta is a struct representing new client's getting addresses
+// request body. It uses array of structs instead of map.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default firstRunData.
+type firstRunDataBeta struct {
+ WebPort int `json:"web_port"`
+ DNSPort int `json:"dns_port"`
+ Interfaces []netInterfaceJSON `json:"interfaces"`
+}
+
+// handleInstallConfigureBeta is a substitution of /install/get_addresses
+// handler for new client.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default handleInstallGetAddresses.
+func (web *Web) handleInstallGetAddressesBeta(w http.ResponseWriter, r *http.Request) {
+ data := firstRunDataBeta{}
+ data.WebPort = 80
+ data.DNSPort = 53
+
+ ifaces, err := util.GetValidNetInterfacesForWeb()
+ if err != nil {
+ httpError(w, http.StatusInternalServerError, "Couldn't get interfaces: %s", err)
+ return
+ }
+
+ data.Interfaces = make([]netInterfaceJSON, 0, len(ifaces))
+ for _, iface := range ifaces {
+ ifaceJSON := netInterfaceJSON{
+ Name: iface.Name,
+ MTU: iface.MTU,
+ HardwareAddr: iface.HardwareAddr,
+ Addresses: iface.Addresses,
+ Flags: iface.Flags,
+ }
+ data.Interfaces = append(data.Interfaces, ifaceJSON)
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ err = json.NewEncoder(w).Encode(data)
+ if err != nil {
+ httpError(w, http.StatusInternalServerError, "Unable to marshal default addresses to json: %s", err)
+ return
+ }
+}
+
+// registerBetaInstallHandlers registers the install handlers for new client
+// with the structures it supports.
+//
+// TODO(e.burkov): this should removed with the API v1 when the appropriate
+// functionality will appear in default handlers.
+func (web *Web) registerBetaInstallHandlers() {
+ Context.mux.HandleFunc("/control/install/get_addresses_beta", preInstall(ensureGET(web.handleInstallGetAddressesBeta)))
+ Context.mux.HandleFunc("/control/install/check_config_beta", preInstall(ensurePOST(web.handleInstallCheckConfigBeta)))
+ Context.mux.HandleFunc("/control/install/configure_beta", preInstall(ensurePOST(web.handleInstallConfigureBeta)))
+}
diff --git a/internal/home/home.go b/internal/home/home.go
index 58c99ff6..aeb875a4 100644
--- a/internal/home/home.go
+++ b/internal/home/home.go
@@ -316,9 +316,10 @@ func run(args options) {
}
webConf := webConfig{
- firstRun: Context.firstRun,
- BindHost: config.BindHost,
- BindPort: config.BindPort,
+ firstRun: Context.firstRun,
+ BindHost: config.BindHost,
+ BindPort: config.BindPort,
+ BetaBindPort: config.BetaBindPort,
ReadTimeout: ReadTimeout,
ReadHeaderTimeout: ReadHeaderTimeout,
@@ -592,8 +593,6 @@ func loadOptions() options {
// prints IP addresses which user can use to open the admin interface
// proto is either "http" or "https"
func printHTTPAddresses(proto string) {
- var address string
-
tlsConf := tlsConfigSettings{}
if Context.tls != nil {
Context.tls.WriteDiskConfig(&tlsConf)
@@ -615,20 +614,26 @@ func printHTTPAddresses(proto string) {
ifaces, err := util.GetValidNetInterfacesForWeb()
if err != nil {
// That's weird, but we'll ignore it
- address = net.JoinHostPort(config.BindHost, port)
- log.Printf("Go to %s://%s", proto, address)
+ log.Printf("Go to %s://%s", proto, net.JoinHostPort(config.BindHost, port))
+ if config.BetaBindPort != 0 {
+ log.Printf("Go to %s://%s (BETA)", proto, net.JoinHostPort(config.BindHost, strconv.Itoa(config.BetaBindPort)))
+ }
return
}
for _, iface := range ifaces {
for _, addr := range iface.Addresses {
- address = net.JoinHostPort(addr, strconv.Itoa(config.BindPort))
- log.Printf("Go to %s://%s", proto, address)
+ log.Printf("Go to %s://%s", proto, net.JoinHostPort(addr, strconv.Itoa(config.BindPort)))
+ if config.BetaBindPort != 0 {
+ log.Printf("Go to %s://%s (BETA)", proto, net.JoinHostPort(addr, strconv.Itoa(config.BetaBindPort)))
+ }
}
}
} else {
- address = net.JoinHostPort(config.BindHost, port)
- log.Printf("Go to %s://%s", proto, address)
+ log.Printf("Go to %s://%s", proto, net.JoinHostPort(config.BindHost, port))
+ if config.BetaBindPort != 0 {
+ log.Printf("Go to %s://%s (BETA)", proto, net.JoinHostPort(config.BindHost, strconv.Itoa(config.BetaBindPort)))
+ }
}
}
diff --git a/internal/home/middlewares.go b/internal/home/middlewares.go
index a5758985..d530ace8 100644
--- a/internal/home/middlewares.go
+++ b/internal/home/middlewares.go
@@ -40,3 +40,18 @@ func limitRequestBody(h http.Handler) (limited http.Handler) {
h.ServeHTTP(w, r)
})
}
+
+// wrapIndexBeta returns handler that deals with new client.
+func (web *Web) wrapIndexBeta(http.Handler) (wrapped http.Handler) {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ h, pattern := Context.mux.Handler(r)
+ switch pattern {
+ case "/":
+ web.handlerBeta.ServeHTTP(w, r)
+ case "/install.html":
+ web.installerBeta.ServeHTTP(w, r)
+ default:
+ h.ServeHTTP(w, r)
+ }
+ })
+}
diff --git a/internal/home/web.go b/internal/home/web.go
index 97f06979..83fe9db4 100644
--- a/internal/home/web.go
+++ b/internal/home/web.go
@@ -30,10 +30,11 @@ const (
)
type webConfig struct {
- firstRun bool
- BindHost string
- BindPort int
- PortHTTPS int
+ firstRun bool
+ BindHost string
+ BindPort int
+ BetaBindPort int
+ PortHTTPS int
// ReadTimeout is an option to pass to http.Server for setting an
// appropriate field.
@@ -62,9 +63,16 @@ type HTTPSServer struct {
type Web struct {
conf *webConfig
forceHTTPS bool
- portHTTPS int
httpServer *http.Server // HTTP module
httpsServer HTTPSServer // HTTPS module
+
+ // handlerBeta is the handler for new client.
+ handlerBeta http.Handler
+ // installerBeta is the pre-install handler for new client.
+ installerBeta http.Handler
+
+ // httpServerBeta is a server for new client.
+ httpServerBeta *http.Server
}
// CreateWeb - create module
@@ -76,15 +84,20 @@ func CreateWeb(conf *webConfig) *Web {
// Initialize and run the admin Web interface
box := packr.NewBox("../../build/static")
+ boxBeta := packr.NewBox("../../build2/static")
// if not configured, redirect / to /install.html, otherwise redirect /install.html to /
- Context.mux.Handle("/", postInstallHandler(optionalAuthHandler(gziphandler.GzipHandler(http.FileServer(box)))))
+ Context.mux.Handle("/", withMiddlewares(http.FileServer(box), gziphandler.GzipHandler, optionalAuthHandler, postInstallHandler))
+ w.handlerBeta = withMiddlewares(http.FileServer(boxBeta), gziphandler.GzipHandler, optionalAuthHandler, postInstallHandler)
// add handlers for /install paths, we only need them when we're not configured yet
if conf.firstRun {
log.Info("This is the first launch of AdGuard Home, redirecting everything to /install.html ")
Context.mux.Handle("/install.html", preInstallHandler(http.FileServer(box)))
+ w.installerBeta = preInstallHandler(http.FileServer(boxBeta))
w.registerInstallHandlers()
+ // This must be removed in API v1.
+ w.registerBetaInstallHandlers()
} else {
registerControlHandlers()
}
@@ -114,7 +127,6 @@ func (web *Web) TLSConfigChanged(tlsConf tlsConfigSettings) {
log.Debug("Web: applying new TLS configuration")
web.conf.PortHTTPS = tlsConf.PortHTTPS
web.forceHTTPS = (tlsConf.ForceHTTPS && tlsConf.Enabled && tlsConf.PortHTTPS != 0)
- web.portHTTPS = tlsConf.PortHTTPS
enabled := tlsConf.Enabled &&
tlsConf.PortHTTPS != 0 &&
@@ -147,19 +159,36 @@ func (web *Web) Start() {
// this loop is used as an ability to change listening host and/or port
for !web.httpsServer.shutdown {
printHTTPAddresses("http")
+ errs := make(chan error, 2)
// we need to have new instance, because after Shutdown() the Server is not usable
- address := net.JoinHostPort(web.conf.BindHost, strconv.Itoa(web.conf.BindPort))
web.httpServer = &http.Server{
ErrorLog: log.StdLog("web: http", log.DEBUG),
- Addr: address,
+ Addr: net.JoinHostPort(web.conf.BindHost, strconv.Itoa(web.conf.BindPort)),
Handler: withMiddlewares(Context.mux, limitRequestBody),
ReadTimeout: web.conf.ReadTimeout,
ReadHeaderTimeout: web.conf.ReadHeaderTimeout,
WriteTimeout: web.conf.WriteTimeout,
}
+ go func() {
+ errs <- web.httpServer.ListenAndServe()
+ }()
- err := web.httpServer.ListenAndServe()
+ if web.conf.BetaBindPort != 0 {
+ web.httpServerBeta = &http.Server{
+ ErrorLog: log.StdLog("web: http", log.DEBUG),
+ Addr: net.JoinHostPort(web.conf.BindHost, strconv.Itoa(web.conf.BetaBindPort)),
+ Handler: withMiddlewares(Context.mux, limitRequestBody, web.wrapIndexBeta),
+ ReadTimeout: web.conf.ReadTimeout,
+ ReadHeaderTimeout: web.conf.ReadHeaderTimeout,
+ WriteTimeout: web.conf.WriteTimeout,
+ }
+ go func() {
+ errs <- web.httpServerBeta.ListenAndServe()
+ }()
+ }
+
+ err := <-errs
if err != http.ErrServerClosed {
cleanupAlways()
log.Fatal(err)
@@ -180,6 +209,9 @@ func (web *Web) Close() {
if web.httpServer != nil {
_ = web.httpServer.Shutdown(context.TODO())
}
+ if web.httpServerBeta != nil {
+ _ = web.httpServerBeta.Shutdown(context.TODO())
+ }
log.Info("Stopped HTTP server")
}
diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml
index 8b3ef126..ab1eac69 100644
--- a/openapi/openapi.yaml
+++ b/openapi/openapi.yaml
@@ -103,6 +103,8 @@
server works, any other text means an error.
'content':
'application/json':
+ 'schema':
+ '$ref': '#/components/schemas/UpstreamsConfigResponse'
'examples':
'response':
'value':
@@ -604,6 +606,11 @@
'description': 'OK.'
'content':
'application/json':
+ 'schema':
+ 'type': 'object'
+ 'parameters':
+ 'enabled':
+ 'type': 'boolean'
'examples':
'response':
'value':
@@ -655,6 +662,13 @@
'description': 'OK.'
'content':
'application/json':
+ 'schema':
+ 'type': 'object'
+ 'parameters':
+ 'enable':
+ 'type': 'boolean'
+ 'sensitivity':
+ 'type': 'integer'
'examples':
'response':
'value':
@@ -689,6 +703,11 @@
'description': 'OK.'
'content':
'application/json':
+ 'schema':
+ 'type': 'object'
+ 'parameters':
+ 'enabled':
+ 'type': 'boolean'
'examples':
'response':
'value':
@@ -867,6 +886,20 @@
'examples':
'response':
'value': 'en'
+ '/install/get_addresses_beta':
+ 'get':
+ 'tags':
+ - 'install'
+ 'operationId': 'installGetAddressesBeta'
+ 'summary': >
+ 'UNSTABLE!: Gets the network interfaces information.'
+ 'responses':
+ '200':
+ 'description': 'OK.'
+ 'content':
+ 'application/json':
+ 'schema':
+ '$ref': '#/components/schemas/AddressesInfoBeta'
'/install/get_addresses':
'get':
'tags':
@@ -880,6 +913,30 @@
'application/json':
'schema':
'$ref': '#/components/schemas/AddressesInfo'
+ '/install/check_config_beta':
+ 'post':
+ 'tags':
+ - 'install'
+ 'operationId': 'installCheckConfigBeta'
+ 'summary': >
+ 'UNSTABLE!: Checks configuration'
+ 'requestBody':
+ 'content':
+ 'application/json':
+ 'schema':
+ '$ref': '#/components/schemas/CheckConfigRequestBeta'
+ 'description': 'Configuration to be checked'
+ 'required': true
+ 'responses':
+ '200':
+ 'description': 'OK.'
+ 'content':
+ 'application/json':
+ 'schema':
+ '$ref': '#/components/schemas/CheckConfigResponse'
+ '400':
+ 'description': >
+ Failed to parse JSON or cannot listen on the specified address.
'/install/check_config':
'post':
'tags':
@@ -903,6 +960,29 @@
'400':
'description': >
Failed to parse JSON or cannot listen on the specified address.
+ '/install/configure_beta':
+ 'post':
+ 'tags':
+ - 'install'
+ 'operationId': 'installConfigureBeta'
+ 'summary': >
+ 'UNSTABLE!: Applies the initial configuration.'
+ 'requestBody':
+ 'content':
+ 'application/json':
+ 'schema':
+ '$ref': '#/components/schemas/InitialConfigurationBeta'
+ 'description': 'Initial configuration JSON'
+ 'required': true
+ 'responses':
+ '200':
+ 'description': 'OK.'
+ '400':
+ 'description': >
+ Failed to parse initial configuration or cannot listen to the
+ specified addresses.
+ '500':
+ 'description': 'Cannot start the DNS server'
'/install/configure':
'post':
'tags':
@@ -1059,7 +1139,7 @@
'example': '127.0.0.1'
'dns_port':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 53
'minimum': 1
'maximum': 65535
@@ -1163,6 +1243,11 @@
'example':
- 'tls://1.1.1.1'
- 'tls://1.0.0.1'
+ 'UpstreamsConfigResponse':
+ 'type': 'object'
+ 'description': 'Upstreams configuration response'
+ 'additionalProperties':
+ 'type': 'string'
'Filter':
'type': 'object'
'description': 'Filter subscription info'
@@ -1733,17 +1818,17 @@
'description': 'if true, forces HTTP->HTTPS redirect'
'port_https':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 443
'description': 'HTTPS port. If 0, HTTPS will be disabled.'
'port_dns_over_tls':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 853
'description': 'DNS-over-TLS port. If 0, DOT will be disabled.'
'port_dns_over_quic':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 784
'description': 'DNS-over-QUIC port. If 0, DOQ will be disabled.'
'certificate_chain':
@@ -1821,6 +1906,11 @@
'NetInterface':
'type': 'object'
'description': 'Network interface info'
+ 'required':
+ - 'flags'
+ - 'hardware_address'
+ - 'name'
+ - 'mtu'
'properties':
'flags':
'type': 'string'
@@ -1831,38 +1921,59 @@
'name':
'type': 'string'
'example': 'eth0'
- 'ipv4_addresses':
+ 'ip_addresses':
'type': 'array'
'items':
'type': 'string'
- 'ipv6_addresses':
+ 'mtu':
+ 'type': 'integer'
+ 'AddressInfoBeta':
+ 'type': 'object'
+ 'description': 'Port information'
+ 'required':
+ - 'ip'
+ - 'port'
+ 'properties':
+ 'ip':
'type': 'array'
'items':
'type': 'string'
- 'gateway_ip':
- 'type': 'string'
+ 'minItems': 1
+ 'example':
+ - '127.0.0.1'
+ 'port':
+ 'type': 'integer'
+ 'format': 'uint16'
+ 'example': 53
'AddressInfo':
'type': 'object'
'description': 'Port information'
+ 'required':
+ - 'ip'
+ - 'port'
'properties':
'ip':
'type': 'string'
'example': '127.0.0.1'
'port':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 53
'AddressesInfo':
'type': 'object'
'description': 'AdGuard Home addresses configuration'
+ 'required':
+ - 'dns_port'
+ - 'web_port'
+ - 'interfaces'
'properties':
'dns_port':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 53
'web_port':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 80
'interfaces':
'type': 'object'
@@ -1870,6 +1981,28 @@
Network interfaces dictionary, keys are interface names.
'additionalProperties':
'$ref': '#/components/schemas/NetInterface'
+ 'AddressesInfoBeta':
+ 'type': 'object'
+ 'description': 'AdGuard Home addresses configuration'
+ 'required':
+ - 'dns_port'
+ - 'web_port'
+ - 'interfaces'
+ 'properties':
+ 'dns_port':
+ 'type': 'integer'
+ 'format': 'uint16'
+ 'example': 53
+ 'web_port':
+ 'type': 'integer'
+ 'format': 'uint16'
+ 'example': 80
+ 'interfaces':
+ 'type': 'array'
+ 'description': >
+ Network interfaces dictionary, keys are interface names.
+ 'items':
+ '$ref': '#/components/schemas/NetInterface'
'ProfileInfo':
'type': 'object'
'description': 'Information about the current user'
@@ -1946,11 +2079,10 @@
'$ref': '#/components/schemas/ClientsFindEntry'
'ClientsFindEntry':
'type': 'object'
- 'properties':
- '1.2.3.4':
- 'items':
- '$ref': '#/components/schemas/ClientFindSubEntry'
-
+ 'additionalProperties':
+ '$ref': '#/components/schemas/ClientFindSubEntry'
+ 'example':
+ '1.2.3.4': 'test'
'ClientFindSubEntry':
'type': 'object'
'properties':
@@ -2043,6 +2175,17 @@
'type': 'array'
'items':
'type': 'string'
+ 'CheckConfigRequestBeta':
+ 'type': 'object'
+ 'description': 'Configuration to be checked'
+ 'properties':
+ 'dns':
+ '$ref': '#/components/schemas/CheckConfigRequestInfoBeta'
+ 'web':
+ '$ref': '#/components/schemas/CheckConfigRequestInfoBeta'
+ 'set_static_ip':
+ 'type': 'boolean'
+ 'example': false
'CheckConfigRequest':
'type': 'object'
'description': 'Configuration to be checked'
@@ -2054,6 +2197,23 @@
'set_static_ip':
'type': 'boolean'
'example': false
+ 'CheckConfigRequestInfoBeta':
+ 'type': 'object'
+ 'properties':
+ 'ip':
+ 'type': 'array'
+ 'items':
+ 'type': 'string'
+ 'minItems': 1
+ 'example':
+ - '127.0.0.1'
+ 'port':
+ 'type': 'integer'
+ 'format': 'uint16'
+ 'example': 53
+ 'autofix':
+ 'type': 'boolean'
+ 'example': false
'CheckConfigRequestInfo':
'type': 'object'
'properties':
@@ -2062,13 +2222,17 @@
'example': '127.0.0.1'
'port':
'type': 'integer'
- 'format': 'int32'
+ 'format': 'uint16'
'example': 53
'autofix':
'type': 'boolean'
'example': false
'CheckConfigResponse':
'type': 'object'
+ 'required':
+ - 'dns'
+ - 'web'
+ - 'static_ip'
'properties':
'dns':
'$ref': '#/components/schemas/CheckConfigResponseInfo'
@@ -2078,32 +2242,71 @@
'$ref': '#/components/schemas/CheckConfigStaticIpInfo'
'CheckConfigResponseInfo':
'type': 'object'
+ 'required':
+ - 'status'
+ - 'can_autofix'
'properties':
'status':
'type': 'string'
+ 'default': ''
'example': ''
'can_autofix':
'type': 'boolean'
'example': false
+ 'CheckConfigStaticIpInfoStatic':
+ 'type': 'string'
+ 'example': 'no'
+ 'enum':
+ - 'yes'
+ - 'no'
+ - 'error'
+ 'description': 'Can be: yes, no, error'
'CheckConfigStaticIpInfo':
'type': 'object'
'properties':
'static':
- 'type': 'string'
- 'example': 'no'
- 'description': 'Can be: yes, no, error'
+ '$ref': '#/components/schemas/CheckConfigStaticIpInfoStatic'
'ip':
'type': 'string'
+ 'default': ''
'example': '192.168.1.1'
'description': 'Current dynamic IP address. Set if static=no'
'error':
'type': 'string'
+ 'default': ''
'example': ''
'description': 'Error text. Set if static=error'
+ 'InitialConfigurationBeta':
+ 'type': 'object'
+ 'description': >
+ AdGuard Home initial configuration for the first-install wizard.
+ 'required':
+ - 'dns'
+ - 'web'
+ - 'username'
+ - 'password'
+ 'properties':
+ 'dns':
+ '$ref': '#/components/schemas/AddressInfoBeta'
+ 'web':
+ '$ref': '#/components/schemas/AddressInfoBeta'
+ 'username':
+ 'type': 'string'
+ 'description': 'Basic auth username'
+ 'example': 'admin'
+ 'password':
+ 'type': 'string'
+ 'description': 'Basic auth password'
+ 'example': 'password'
'InitialConfiguration':
'type': 'object'
'description': >
AdGuard Home initial configuration for the first-install wizard.
+ 'required':
+ - 'dns'
+ - 'web'
+ - 'username'
+ - 'password'
'properties':
'dns':
'$ref': '#/components/schemas/AddressInfo'